feat: add role based send text message permission control

pull/146/merge
moonrailgun 1 year ago
parent ad1960e2a5
commit 8b89b265c1

@ -211,7 +211,9 @@ export { useGroupAck } from './redux/hooks/useGroupAck';
export { useGroupMemberMute } from './redux/hooks/useGroupMemberMute';
export {
useGroupMemberAllPermissions,
useGroupPanelMemberAllPermissions,
useHasGroupPermission,
useHasGroupPanelPermission,
} from './redux/hooks/useGroupPermission';
export { useUserInfo, useUserId } from './redux/hooks/useUserInfo';
export { useInboxList, useInboxItem } from './redux/hooks/useInbox';

@ -47,6 +47,41 @@ export function useGroupMemberAllPermissions(groupId: string): string[] {
return userPermissions;
}
/**
*
*
*/
export function useGroupPanelMemberAllPermissions(
groupId: string,
panelId: string
): string[] {
const groupInfo = useGroupInfo(groupId);
const userId = useUserId();
if (!groupInfo || !userId) {
return [];
}
const panelInfo = groupInfo.panels.find((p) => p.id === panelId);
if (!panelInfo) {
return [];
}
const fallbackPermissions = panelInfo.fallbackPermissions ?? [];
const permissionMap = panelInfo.permissionMap ?? {};
const specPermissions = permissionMap[userId] ?? [];
const userRoles =
groupInfo.members.find((m) => m.userId === userId)?.roles ?? []; // 当前用户角色
const userPanelPermissions = _uniq([
..._flatten(userRoles.map((roleId) => permissionMap[roleId] ?? [])),
...specPermissions,
...fallbackPermissions,
]);
return userPanelPermissions;
}
/**
*
*/
@ -70,3 +105,33 @@ export function useHasGroupPermission(
return result;
}
/**
*
*
*/
export function useHasGroupPanelPermission(
groupId: string,
panelId: string,
permissions: string[]
) {
const groupPermissions = useGroupMemberAllPermissions(groupId);
const panelPermissions = useGroupPanelMemberAllPermissions(groupId, panelId);
const fullPermissions = _uniq([...groupPermissions, ...panelPermissions]);
const result = useMemo(
() => permissions.map((p) => fullPermissions.includes(p)),
[fullPermissions.join(','), permissions.join(',')]
);
useDebugValue({
groupId,
panelId,
fullPermissions,
checkedPermissions: permissions,
result,
});
return result;
}

@ -14,10 +14,10 @@ import {
t,
humanizeMsDuration,
useInterval,
useHasGroupPermission,
PERMISSION,
useGroupInfo,
GroupPanelType,
useHasGroupPanelPermission,
} from 'tailchat-shared';
import { useFriendNicknameMap } from 'tailchat-shared/redux/hooks/useFriendNickname';
import { MembersPanel } from './MembersPanel';
@ -26,10 +26,10 @@ import { GroupPanelContainer } from './shared/GroupPanelContainer';
/**
*
*/
function useChatInputInfo(groupId: string) {
function useChatInputInfo(groupId: string, panelId: string) {
const userId = useUserId();
const muteUntil = useGroupMemberMute(groupId, userId ?? '');
const [hasPermission] = useHasGroupPermission(groupId, [
const [hasPermission] = useHasGroupPanelPermission(groupId, panelId, [
PERMISSION.core.message,
]);
@ -80,7 +80,7 @@ export const TextPanel: React.FC<TextPanelProps> = React.memo(
const group = useGroupInfo(groupId);
const groupMembers = useGroupMemberInfos(groupId);
const panelInfo = useGroupPanelInfo(groupId, panelId);
const { disabled, placeholder } = useChatInputInfo(groupId);
const { disabled, placeholder } = useChatInputInfo(groupId, panelId);
const friendNicknameMap = useFriendNicknameMap();
if (!group) {

Loading…
Cancel
Save