import React from 'react'; import { Box, Checkbox, HStack, Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { useContextSelector } from 'use-context-selector'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { getTeamClbs, updateMemberPermission } from '@/web/support/user/team/api'; import { useUserStore } from '@/web/support/user/useUserStore'; import { TeamContext } from '../context'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MemberTag from '../../../../../components/support/user/team/Info/MemberTag'; import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; import { TeamManagePermissionVal, TeamWritePermissionVal } from '@fastgpt/global/support/permission/user/constant'; import { TeamPermission } from '@fastgpt/global/support/permission/user/controller'; import { useCreation } from 'ahooks'; function PermissionManage() { const { t } = useTranslation(); const { userInfo } = useUserStore(); const { groups, refetchMembers, refetchGroups, members, searchKey } = useContextSelector( TeamContext, (v) => v ); const { runAsync: refetchClbs, data: clbs = [] } = useRequest2(getTeamClbs, { manual: false, refreshDeps: [userInfo?.team?.teamId] }); const filteredGroups = useCreation( () => groups?.filter((group) => group.name.toLowerCase().includes(searchKey.toLowerCase())), [groups, searchKey] ); const filteredMembers = useCreation( () => members ?.filter((member) => member.memberName.toLowerCase().includes(searchKey.toLowerCase())) .map((member) => { const clb = clbs?.find((clb) => String(clb.tmbId) === String(member.tmbId)); const permission = member.role === 'owner' ? new TeamPermission({ isOwner: true }) : new TeamPermission({ per: clb?.permission }); return { ...member, permission }; }), [clbs, members, searchKey] ); const { runAsync: onUpdateMemberPermission } = useRequest2(updateMemberPermission, { onSuccess: () => { refetchGroups(); refetchMembers(); refetchClbs(); } }); const { runAsync: onAddPermission, loading: addLoading } = useRequest2( async ({ groupId, memberId, per }: { groupId?: string; memberId?: string; per: 'write' | 'manage'; }) => { if (groupId) { const group = groups?.find((group) => group._id === groupId); if (group) { const permission = new TeamPermission({ per: group.permission.value }); switch (per) { case 'write': permission.addPer(TeamWritePermissionVal); return onUpdateMemberPermission({ groupId: group._id, permission: permission.value }); case 'manage': permission.addPer(TeamManagePermissionVal); return onUpdateMemberPermission({ groupId: group._id, permission: permission.value }); } } } if (memberId) { const member = filteredMembers?.find((member) => String(member.tmbId) === memberId); if (member) { const permission = new TeamPermission({ per: member.permission.value }); switch (per) { case 'write': permission.addPer(TeamWritePermissionVal); return onUpdateMemberPermission({ memberId: String(member.tmbId), permission: permission.value }); case 'manage': permission.addPer(TeamManagePermissionVal); return onUpdateMemberPermission({ memberId: String(member.tmbId), permission: permission.value }); } } } } ); const { runAsync: onRemovePermission, loading: removeLoading } = useRequest2( async ({ groupId, memberId, per }: { groupId?: string; memberId?: string; per: 'write' | 'manage'; }) => { if (groupId) { const group = groups?.find((group) => group._id === groupId); if (group) { const permission = new TeamPermission({ per: group.permission.value }); switch (per) { case 'write': permission.removePer(TeamWritePermissionVal); return onUpdateMemberPermission({ groupId: group._id, permission: permission.value }); case 'manage': permission.removePer(TeamManagePermissionVal); return onUpdateMemberPermission({ groupId: group._id, permission: permission.value }); } } } if (memberId) { const member = members?.find((member) => String(member.tmbId) === memberId); if (member) { const permission = new TeamPermission({ per: member.permission.value }); // Hint: member.permission is read-only switch (per) { case 'write': permission.removePer(TeamWritePermissionVal); return onUpdateMemberPermission({ memberId: String(member.tmbId), permission: permission.value }); case 'manage': permission.removePer(TeamManagePermissionVal); return onUpdateMemberPermission({ memberId: String(member.tmbId), permission: permission.value }); } } } } ); const userManage = userInfo?.permission.hasManagePer; return ( {filteredGroups?.map((group) => ( ))} {filteredGroups?.length > 0 && filteredMembers?.length > 0 && ( )} {filteredMembers?.map((member) => ( ))}
{t('user:team.group.group')} / {t('user:team.group.members')} {t('user:team.group.permission.write')} {t('user:team.group.permission.manage')}
e.target.checked ? onAddPermission({ groupId: group._id, per: 'write' }) : onRemovePermission({ groupId: group._id, per: 'write' }) } /> e.target.checked ? onAddPermission({ groupId: group._id, per: 'manage' }) : onRemovePermission({ groupId: group._id, per: 'manage' }) } />
{member.memberName} e.target.checked ? onAddPermission({ memberId: String(member.tmbId), per: 'write' }) : onRemovePermission({ memberId: String(member.tmbId), per: 'write' }) } /> e.target.checked ? onAddPermission({ memberId: String(member.tmbId), per: 'manage' }) : onRemovePermission({ memberId: String(member.tmbId), per: 'manage' }) } />
); } export default PermissionManage;