import MemberTag from '@/components/support/user/team/Info/MemberTag'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { getInvitationLinkList, putUpdateInvitationInfo } from '@/web/support/user/team/api'; import { useUserStore } from '@/web/support/user/useUserStore'; import { Box, Button, Divider, Flex, Grid, HStack, ModalBody, ModalFooter, Table, TableContainer, Tbody, Td, Th, Thead, Tr, useDisclosure } from '@chakra-ui/react'; import AvatarGroup from '@fastgpt/web/components/common/Avatar/AvatarGroup'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import Icon from '@fastgpt/web/components/common/Icon'; import MyModal from '@fastgpt/web/components/common/MyModal'; import MyPopover from '@fastgpt/web/components/common/MyPopover'; import Tag from '@fastgpt/web/components/common/Tag'; import { useCopyData } from '@fastgpt/web/hooks/useCopyData'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import format from 'date-fns/format'; import { useTranslation } from 'next-i18next'; import dynamic from 'next/dynamic'; import { useCallback } from 'react'; const CreateInvitationModal = dynamic(() => import('./CreateInvitationModal')); const InviteModal = ({ teamId, onClose, onSuccess }: { teamId: string; onClose: () => void; onSuccess: () => void; }) => { const { t } = useTranslation(); const { data: invitationLinkList, loading: isLoadingLink, runAsync: refetchInvitationLinkList } = useRequest2(() => getInvitationLinkList(), { manual: false }); const { isOpen: isOpenCreate, onOpen: onOpenCreate, onClose: onCloseCreate } = useDisclosure(); const isLoading = isLoadingLink; const { copyData } = useCopyData(); const { userInfo } = useUserStore(); const { feConfigs } = useSystemStore(); const onCopy = useCallback( (linkId: string) => { const url = location.origin + `/account/team?invitelinkid=${linkId}`; const teamName = userInfo?.team.teamName; const systemName = feConfigs.systemTitle; const userName = userInfo?.team.memberName; copyData( t('account_team:invitation_copy_link', { teamName, systemName, userName, url }) ); }, [copyData] ); const { runAsync: onForbid, loading: forbiding } = useRequest2( (linkId: string) => putUpdateInvitationInfo({ linkId, forbidden: true }), { manual: true, onSuccess: refetchInvitationLinkList, successToast: t('account_team:forbid_success') } ); return ( {t('account_team:invitation_link_list')} {!!invitationLinkList?.length && ( {invitationLinkList?.map((item) => { const isForbidden = item.forbidden || new Date(item.expires) < new Date(); return ( ); })} )}
{t('account_team:invitation_link_description')} {t('account_team:expires')} {t('account_team:used_times_limit')} {t('account_team:invited')} {t('common:common.Action')}
{item.description} {isForbidden ? ( {t('account_team:has_forbidden')} ) : ( format(new Date(item.expires), 'yyyy-MM-dd HH:mm') )} {item.usedTimesLimit === -1 ? t('account_team:unlimited') : item.usedTimesLimit} {item.members.length > 0 && ( i.avatar)} /> } trigger="click" closeOnBlur={true} > {() => ( {t('account_team:has_invited')} {item.members.length} {item.members.map((member) => ( ))} )} )} {!isForbidden && ( <> {t('account_team:forbidden')} } closeOnBlur={true} > {({ onClose: onClosePopover }) => ( {t('account_team:forbid_hint')} )} )}
{!invitationLinkList?.length && }
{t('account_team:invitation_link_auto_clean_hint')} {isOpenCreate && ( Promise.all([onCloseCreate(), refetchInvitationLinkList()])} /> )}
); }; export default InviteModal;