import MemberTag from '@/components/support/user/team/Info/MemberTag'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { getInvitationLinkList, putForbidInvitationLink } 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 = ({ onClose }: { onClose: () => 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, feConfigs?.systemTitle, t, userInfo?.team.memberName, userInfo?.team.teamName] ); const { runAsync: onForbid, loading: forbiding } = useRequest2(putForbidInvitationLink, { 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} {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:has_forbidden')} ) : ( <> {t('account_team:forbidden')} } closeOnBlur={true} > {({ onClose: onClosePopover }) => ( {t('account_team:forbid_hint')} )} )}
{!invitationLinkList?.length && }
{t('account_team:invitation_link_auto_clean_hint')} {isOpenCreate && ( { refetchInvitationLinkList(); onCopy(linkId); }} onClose={onCloseCreate} /> )}
); }; export default InviteModal;