diff --git a/client/web/src/components/PermissionList.tsx b/client/web/src/components/PermissionList.tsx new file mode 100644 index 00000000..718e4fa2 --- /dev/null +++ b/client/web/src/components/PermissionList.tsx @@ -0,0 +1,98 @@ +import { Col, Divider, Row, Switch } from 'antd'; +import React from 'react'; +import { getPermissionList, t, useEvent } from 'tailchat-shared'; +import _uniq from 'lodash/uniq'; +import _without from 'lodash/without'; +import { pluginPermission } from '@/plugin/common'; + +interface PermissionListProps { + value: string[]; + onChange: (value: string[]) => void; +} +export const PermissionList: React.FC = React.memo( + (props) => { + const handleSwitchPermission = useEvent( + (permissionKey: string, enabled: boolean) => { + if (enabled) { + props.onChange(_uniq([...props.value, permissionKey])); + } else { + props.onChange(_without(props.value, permissionKey)); + } + } + ); + + return ( +
+ {/* 权限详情 */} + {getPermissionList().map((p) => ( + props.value.includes(r)) + : undefined + } + checked={props.value.includes(p.key)} + onChange={(checked) => handleSwitchPermission(p.key, checked)} + /> + ))} + + {pluginPermission.length > 0 && ( + <> + {t('以下为插件权限')} + + {/* 权限详情 */} + {pluginPermission.map((p) => ( + props.value.includes(r)) + : undefined + } + checked={props.value.includes(p.key)} + onChange={(checked) => handleSwitchPermission(p.key, checked)} + /> + ))} + + )} +
+ ); + } +); +PermissionList.displayName = 'PermissionList'; + +interface PermissionItemProps { + title: string; + desc?: string; + disabled?: boolean; + checked: boolean; + onChange: (checked: boolean) => void; +} + +const PermissionItem: React.FC = React.memo((props) => { + return ( +
+ + + {props.title} + + + + + + + +
{props.desc}
+
+ ); +}); +PermissionItem.displayName = 'PermissionItem'; diff --git a/client/web/src/components/modals/GroupDetail/Role/PermissionItem.tsx b/client/web/src/components/modals/GroupDetail/Role/PermissionItem.tsx deleted file mode 100644 index 32a9e796..00000000 --- a/client/web/src/components/modals/GroupDetail/Role/PermissionItem.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Col, Row, Switch } from 'antd'; -import React from 'react'; - -interface PermissionItemProps { - title: string; - desc?: string; - disabled?: boolean; - checked: boolean; - onChange: (checked: boolean) => void; -} - -export const PermissionItem: React.FC = React.memo( - (props) => { - return ( -
- - - {props.title} - - - - - - - -
{props.desc}
-
- ); - } -); -PermissionItem.displayName = 'PermissionItem'; diff --git a/client/web/src/components/modals/GroupDetail/Role/tabs/permission.tsx b/client/web/src/components/modals/GroupDetail/Role/tabs/permission.tsx index 36a28e68..38096170 100644 --- a/client/web/src/components/modals/GroupDetail/Role/tabs/permission.tsx +++ b/client/web/src/components/modals/GroupDetail/Role/tabs/permission.tsx @@ -1,10 +1,9 @@ import { AllPermission, getPermissionList } from 'tailchat-shared'; -import { Button, Divider } from 'antd'; +import { Button } from 'antd'; import React, { useCallback, useMemo } from 'react'; import { model, t } from 'tailchat-shared'; -import { PermissionItem } from '../PermissionItem'; import { useModifyPermission } from '../useModifyPermission'; -import { pluginPermission } from '@/plugin/common'; +import { PermissionList } from '@/components/PermissionList'; interface RolePermissionProps { roleId: typeof AllPermission | string; @@ -22,12 +21,8 @@ export const RolePermission: React.FC = React.memo( return props.currentRoleInfo?.permissions ?? []; }, [props.roleId, props.fallbackPermissions, props.currentRoleInfo]); - const { - isEditing, - editingPermission, - setEditingPermission, - handleSwitchPermission, - } = useModifyPermission(currentRolePermissions); + const { isEditing, editingPermission, setEditingPermission } = + useModifyPermission(currentRolePermissions); const handleResetPermission = useCallback(() => { setEditingPermission( @@ -51,43 +46,10 @@ export const RolePermission: React.FC = React.memo( - {/* 权限详情 */} - {getPermissionList().map((p) => ( - editingPermission.includes(r)) - : undefined - } - checked={editingPermission.includes(p.key)} - onChange={(checked) => handleSwitchPermission(p.key, checked)} - /> - ))} - - {pluginPermission.length > 0 && ( - <> - {t('以下为插件权限')} - - {/* 权限详情 */} - {pluginPermission.map((p) => ( - editingPermission.includes(r)) - : undefined - } - checked={editingPermission.includes(p.key)} - onChange={(checked) => handleSwitchPermission(p.key, checked)} - /> - ))} - - )} + ); } diff --git a/client/web/src/components/modals/GroupDetail/Role/useModifyPermission.ts b/client/web/src/components/modals/GroupDetail/Role/useModifyPermission.ts index ce30cf4b..d411af2e 100644 --- a/client/web/src/components/modals/GroupDetail/Role/useModifyPermission.ts +++ b/client/web/src/components/modals/GroupDetail/Role/useModifyPermission.ts @@ -1,8 +1,5 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import _isEqual from 'lodash/isEqual'; -import _uniq from 'lodash/uniq'; -import _without from 'lodash/without'; -import { useAsyncFn } from 'tailchat-shared'; /** * 权限编辑 @@ -18,21 +15,9 @@ export function useModifyPermission(originPermission: string[]) { setEditingPermission([...originPermission]); }, [originPermission]); - const handleSwitchPermission = useCallback( - (permissionKey: string, enabled: boolean) => { - if (enabled) { - setEditingPermission(_uniq([...editingPermission, permissionKey])); - } else { - setEditingPermission(_without(editingPermission, permissionKey)); - } - }, - [editingPermission] - ); - return { isEditing, editingPermission, setEditingPermission, - handleSwitchPermission, }; }