import { PermissionList } from '@/components/PermissionList'; import { Button } from 'antd'; import clsx from 'clsx'; import React, { PropsWithChildren, useMemo, useState } from 'react'; import { ALL_PERMISSION, getDefaultPermissionList, GroupPanelType, t, useAppSelector, useEvent, useLazyValue, } from 'tailchat-shared'; import { LoadingSpinner } from '@/components/LoadingSpinner'; interface AdvanceGroupPanelPermissionProps { height?: number; groupId: string; panelId: string; onChange: ( permissionMap: Record | undefined ) => void; } export const AdvanceGroupPanelPermission: React.FC = React.memo((props) => { const [selectedRoleId, setSelectedRoleId] = useState< typeof ALL_PERMISSION | string >(ALL_PERMISSION); const roles = useAppSelector((state) => { const groupInfo = state.group.groups[props.groupId]; return groupInfo.roles; }); const panelInfo = useAppSelector((state) => { const groupInfo = state.group.groups[props.groupId]; const panelInfo = groupInfo.panels.find((p) => p.id === props.panelId); return panelInfo; }); const permissionMap: Record = useMemo(() => { if (!panelInfo) { return { [ALL_PERMISSION]: getDefaultPermissionList() }; } else { return { [ALL_PERMISSION]: panelInfo.fallbackPermissions ?? getDefaultPermissionList(), ...panelInfo.permissionMap, }; } }, [panelInfo]); const [editPermissionMap, setEditPermissionMap] = useLazyValue( permissionMap, props.onChange ); const handleUpdatePermissionMap = useEvent((permissions: string[]) => { const newMap = { ...editPermissionMap, [selectedRoleId]: permissions }; setEditPermissionMap(newMap); }); const handleSyncWithGroup = useEvent(() => { setEditPermissionMap({ [ALL_PERMISSION]: getDefaultPermissionList(), }); props.onChange(undefined); }); if (!panelInfo) { return ; } return (
setSelectedRoleId(ALL_PERMISSION)} > {t('所有人')} {roles.map((r) => ( setSelectedRoleId(r._id)} > {r.name} ))}
); }); AdvanceGroupPanelPermission.displayName = 'AdvanceGroupPanelPermission'; const RoleItem: React.FC< PropsWithChildren<{ active: boolean; onClick?: () => void; }> > = React.memo((props) => { return (
{props.children}
); }); RoleItem.displayName = 'RoleItem';