import Avatar from '@fastgpt/web/components/common/Avatar'; import { Box, Button, Flex, HStack, Table, TableContainer, Tbody, Td, Th, Thead, Tr, useDisclosure } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { useUserStore } from '@/web/support/user/useUserStore'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { delRemoveMember } from '@/web/support/user/team/api'; import Tag from '@fastgpt/web/components/common/Tag'; import Icon from '@fastgpt/web/components/common/Icon'; import GroupTags from '@/components/support/permission/Group/GroupTags'; import { useContextSelector } from 'use-context-selector'; import { TeamContext } from './context'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyIcon from '@fastgpt/web/components/common/Icon'; import dynamic from 'next/dynamic'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { TeamErrEnum } from '@fastgpt/global/common/error/code/team'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { delLeaveTeam } from '@/web/support/user/team/api'; import { postSyncMembers } from '@/web/support/user/api'; import MyLoading from '@fastgpt/web/components/common/MyLoading'; import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant'; const InviteModal = dynamic(() => import('./InviteModal')); const TeamTagModal = dynamic(() => import('@/components/support/user/team/TeamTagModal')); function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { const { t } = useTranslation(); const { toast } = useToast(); const { userInfo, teamPlanStatus } = useUserStore(); const { feConfigs, setNotSufficientModalType } = useSystemStore(); const { groups, refetchGroups, myTeams, refetchTeams, members, refetchMembers, onSwitchTeam, MemberScrollData } = useContextSelector(TeamContext, (v) => v); const { isOpen: isOpenTeamTagsAsync, onOpen: onOpenTeamTagsAsync, onClose: onCloseTeamTagsAsync } = useDisclosure(); const { isOpen: isOpenInvite, onOpen: onOpenInvite, onClose: onCloseInvite } = useDisclosure(); const { ConfirmModal: ConfirmRemoveMemberModal, openConfirm: openRemoveMember } = useConfirm({ type: 'delete' }); const isSyncMember = feConfigs.register_method?.includes('sync'); const { runAsync: onLeaveTeam } = useRequest2( async () => { const defaultTeam = myTeams.find((item) => item.defaultTeam) || myTeams[0]; // change to personal team onSwitchTeam(defaultTeam.teamId); return delLeaveTeam(); }, { onSuccess() { refetchTeams(); }, errorToast: t('account_team:user_team_leave_team_failed') } ); const { ConfirmModal: ConfirmLeaveTeamModal, openConfirm: openLeaveConfirm } = useConfirm({ content: t('account_team:confirm_leave_team') }); const { runAsync: onSyncMember, loading: isSyncing } = useRequest2(postSyncMembers, { onSuccess() { refetchMembers(); }, successToast: t('account_team:sync_member_success'), errorToast: t('account_team:sync_member_failed') }); return ( <> {isSyncing && } {Tabs} {userInfo?.team.permission.hasManagePer && feConfigs?.show_team_chat && ( )} {userInfo?.team.permission.hasManagePer && isSyncMember && ( )} {userInfo?.team.permission.hasManagePer && !isSyncMember && ( )} {!userInfo?.team.permission.isOwner && ( )} {!isSyncMember && ( )} {members?.map((item) => ( {!isSyncMember && ( )} ))}
{t('account_team:user_name')} {t('account_team:member_group')} {t('common:common.Action')}
{item.memberName} {item.status === 'waiting' && ( {t('account_team:waiting')} )} group.members.map((m) => m.tmbId).includes(item.tmbId) ) .map((g) => g.name)} max={3} /> {userInfo?.team.permission.hasManagePer && item.role !== TeamMemberRoleEnum.owner && item.tmbId !== userInfo?.team.tmbId && ( { openRemoveMember( () => delRemoveMember(item.tmbId).then(() => Promise.all([refetchGroups(), refetchMembers()]) ), undefined, t('account_team:remove_tip', { username: item.memberName }) )(); }} /> )}
{isOpenInvite && userInfo?.team?.teamId && ( )} {isOpenTeamTagsAsync && } ); } export default MemberTable;