diff --git a/shared/model/group.ts b/shared/model/group.ts index 192c4f05..8d15708c 100644 --- a/shared/model/group.ts +++ b/shared/model/group.ts @@ -41,6 +41,7 @@ export interface GroupInfo { members: GroupMember[]; panels: GroupPanel[]; roles: GroupRole[]; + fallbackPermissions: string[]; pinnedPanelId?: string; // 被钉选的面板Id } @@ -99,7 +100,12 @@ export async function getGroupBasicInfo( * @param fieldName 要修改的群组属性 * @param fieldValue 要修改的属性的值 */ -type AllowedModifyField = 'name' | 'avatar' | 'panels' | 'roles'; +type AllowedModifyField = + | 'name' + | 'avatar' + | 'panels' + | 'roles' + | 'fallbackPermissions'; export async function modifyGroupField( groupId: string, fieldName: AllowedModifyField, diff --git a/web/src/components/modals/CreateGroup.tsx b/web/src/components/modals/CreateGroup.tsx index fa840acb..81c379fe 100644 --- a/web/src/components/modals/CreateGroup.tsx +++ b/web/src/components/modals/CreateGroup.tsx @@ -12,7 +12,8 @@ import type { GroupPanel } from 'tailchat-shared'; import { Avatar } from '../Avatar'; import { closeModal, ModalWrapper } from '../Modal'; import { Slides, SlidesRef } from '../Slides'; -import { useHistory, useLocation } from 'react-router'; +import { useHistory } from 'react-router'; +import { applyDefaultFallbackGroupPermission } from '@/utils/role-helper'; const panelTemplate: { key: string; @@ -92,8 +93,12 @@ export const ModalCreateGroup: React.FC = React.memo(() => { const data = await createGroup(name, panels); dispatch(groupActions.appendGroups([data])); + history.push(`/main/group/${data._id}`); // 创建完成后跳转到新建的群组 + // 应用默认权限 + await applyDefaultFallbackGroupPermission(String(data._id)); + closeModal(); }, [name, panels, location]); diff --git a/web/src/components/modals/GroupDetail/Role/const.ts b/web/src/components/modals/GroupDetail/Role/const.ts deleted file mode 100644 index 8e41b2bf..00000000 --- a/web/src/components/modals/GroupDetail/Role/const.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { t } from 'tailchat-shared'; - -export const permissionList = [ - { - key: 'core.message', - title: t('发送消息'), - desc: t('允许成员在文字频道发送消息'), - default: true, - }, -]; diff --git a/web/src/components/modals/GroupDetail/Role/index.tsx b/web/src/components/modals/GroupDetail/Role/index.tsx index 99723edd..4c0578d6 100644 --- a/web/src/components/modals/GroupDetail/Role/index.tsx +++ b/web/src/components/modals/GroupDetail/Role/index.tsx @@ -6,11 +6,11 @@ import { IconBtn } from '@/components/IconBtn'; import { Loading } from '@/components/Loading'; import { PillTabPane, PillTabs } from '@/components/PillTabs'; import { UserListItem } from '@/components/UserListItem'; +import { AllPermission, permissionList } from '@/utils/role-helper'; import { Button, Input } from 'antd'; import React, { useCallback, useMemo, useState } from 'react'; import { Icon } from 'tailchat-design'; import { t, useGroupInfo, useSearch, useUserInfoList } from 'tailchat-shared'; -import { permissionList } from './const'; import { PermissionItem } from './PermissionItem'; import { RoleItem } from './RoleItem'; import { useModifyPermission } from './useModifyPermission'; @@ -21,7 +21,9 @@ interface GroupPermissionProps { } export const GroupRole: React.FC = React.memo((props) => { const { groupId } = props; - const [roleId, setRoleId] = useState(''); + const [roleId, setRoleId] = useState( + AllPermission + ); const groupInfo = useGroupInfo(groupId); const roles = groupInfo?.roles ?? []; const members = (groupInfo?.members ?? []).filter((m) => m.role === roleId); @@ -39,10 +41,13 @@ export const GroupRole: React.FC = React.memo((props) => { () => roles.find((r) => r._id === roleId), [roles, roleId] ); - const currentRolePermissions = useMemo( - () => currentRoleInfo?.permissions ?? [], - [currentRoleInfo] - ); + const currentRolePermissions: string[] = useMemo(() => { + if (roleId === AllPermission) { + return groupInfo?.fallbackPermissions ?? []; + } + + return currentRoleInfo?.permissions ?? []; + }, [roleId, currentRoleInfo, groupInfo]); const { loading, @@ -71,7 +76,10 @@ export const GroupRole: React.FC = React.memo((props) => {
{/* 角色列表 */} - setRoleId('')}> + setRoleId(AllPermission)} + > {t('所有人')} @@ -92,7 +100,11 @@ export const GroupRole: React.FC = React.memo((props) => {
- + {/* 权限概述 */} {currentRoleInfo && (
@@ -131,7 +143,11 @@ export const GroupRole: React.FC = React.memo((props) => { /> ))} - + {/* 管理成员 */}
{ await model.group.createGroupRole( groupId, t('新身份组'), - permissionList.filter((p) => p.default).map((p) => p.key) + getDefaultPermissionList() ); }, [groupId]); const [{ loading: loading2 }, handleSavePermission] = useAsyncRequest( async (permissions: string[]) => { - await model.group.updateGroupRolePermission(groupId, roleId, permissions); + if (roleId === AllPermission) { + // 所有人权限 + await model.group.modifyGroupField( + groupId, + 'fallbackPermissions', + permissions + ); + } else { + // 身份组权限 + await model.group.updateGroupRolePermission( + groupId, + roleId, + permissions + ); + } }, [groupId, roleId] ); const [{ loading: loading3 }, handleChangeRoleName] = useAsyncRequest( async (newRoleName: string) => { + if (roleId === AllPermission) { + throw new Error(t('无法修改所有人权限组的显示名称')); + } await model.group.updateGroupRoleName(groupId, roleId, newRoleName); }, [groupId, roleId] diff --git a/web/src/utils/role-helper.ts b/web/src/utils/role-helper.ts new file mode 100644 index 00000000..5aca4e2b --- /dev/null +++ b/web/src/utils/role-helper.ts @@ -0,0 +1,31 @@ +import { model, t } from 'tailchat-shared'; + +/** + * 所有人权限 + * 群组最低权限标识 + */ +export const AllPermission = Symbol('AllPermission'); + +export const permissionList = [ + { + key: 'core.message', + title: t('发送消息'), + desc: t('允许成员在文字频道发送消息'), + default: true, + }, +]; + +export function getDefaultPermissionList(): string[] { + return permissionList.filter((p) => p.default).map((p) => p.key); +} + +/** + * 初始化默认所有人身份组权限 + */ +export async function applyDefaultFallbackGroupPermission(groupId: string) { + await model.group.modifyGroupField( + groupId, + 'fallbackPermissions', + getDefaultPermissionList() + ); +}