Skip to content

Commit

Permalink
feat: add role based send text message permission control
Browse files Browse the repository at this point in the history
  • Loading branch information
moonrailgun committed Sep 11, 2023
1 parent ad1960e commit 8b89b26
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 4 deletions.
2 changes: 2 additions & 0 deletions client/shared/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
65 changes: 65 additions & 0 deletions client/shared/redux/hooks/useGroupPermission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
* 判断用户是否拥有以下权限
*/
Expand All @@ -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;
}
8 changes: 4 additions & 4 deletions client/web/src/components/Panel/group/TextPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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,
]);

Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 8b89b26

Please sign in to comment.