import { Flex, Box, ModalBody, Checkbox, ModalFooter, Button, Grid, HStack } from '@chakra-ui/react'; import MyModal from '@fastgpt/web/components/common/MyModal'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useContextSelector } from 'use-context-selector'; import MyAvatar from '@fastgpt/web/components/common/Avatar'; import { useMemo, useState } from 'react'; import PermissionSelect from './PermissionSelect'; import PermissionTags from './PermissionTags'; import { CollaboratorContext } from './context'; import { useUserStore } from '@/web/support/user/useUserStore'; import { ChevronDownIcon } from '@chakra-ui/icons'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import SearchInput from '@fastgpt/web/components/common/Input/SearchInput'; import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; export type AddModalPropsType = { onClose: () => void; mode?: 'member' | 'all'; }; function AddMemberModal({ onClose, mode = 'member' }: AddModalPropsType) { const { t } = useTranslation(); const { userInfo, loadAndGetTeamMembers, loadAndGetGroups, myGroups } = useUserStore(); const { permissionList, collaboratorList, onUpdateCollaborators, getPerLabelList, permission } = useContextSelector(CollaboratorContext, (v) => v); const [searchText, setSearchText] = useState(''); const { data: [members = [], groups = []] = [], loading: loadingMembersAndGroups } = useRequest2( async () => { if (!userInfo?.team?.teamId) return [[], []]; return await Promise.all([loadAndGetTeamMembers(true), loadAndGetGroups(true)]); }, { manual: false, refreshDeps: [userInfo?.team?.teamId] } ); const filterMembers = useMemo(() => { return members.filter((item) => { if (item.tmbId === userInfo?.team?.tmbId) return false; if (!searchText) return true; return item.memberName.includes(searchText); }); }, [members, searchText, userInfo?.team?.tmbId]); const filterGroups = useMemo(() => { if (mode !== 'all') return []; return groups.filter((item) => { if (permission.isOwner) return true; // owner can see all groups if (myGroups.find((i) => String(i._id) === String(item._id))) return false; if (!searchText) return true; return item.name.includes(searchText); }); }, [groups, searchText, myGroups, mode, permission]); const [selectedMemberIdList, setSelectedMembers] = useState([]); const [selectedGroupIdList, setSelectedGroupIdList] = useState([]); const [selectedPermission, setSelectedPermission] = useState(permissionList['read'].value); const perLabel = useMemo(() => { return getPerLabelList(selectedPermission).join('、'); }, [getPerLabelList, selectedPermission]); const { runAsync: onConfirm, loading: isUpdating } = useRequest2( () => onUpdateCollaborators({ members: selectedMemberIdList, groups: selectedGroupIdList, permission: selectedPermission }), { successToast: t('common:common.Add Success'), errorToast: 'Error', onSuccess() { onClose(); } } ); return ( setSearchText(e.target.value)} /> {filterGroups.map((group) => { const onChange = () => { if (selectedGroupIdList.includes(group._id)) { setSelectedGroupIdList(selectedGroupIdList.filter((v) => v !== group._id)); } else { setSelectedGroupIdList([...selectedGroupIdList, group._id]); } }; const collaborator = collaboratorList.find((v) => v.groupId === group._id); return ( } /> {group.name === DefaultGroupName ? userInfo?.team.teamName : group.name} {!!collaborator && ( )} ); })} {filterMembers.map((member) => { const onChange = () => { if (selectedMemberIdList.includes(member.tmbId)) { setSelectedMembers(selectedMemberIdList.filter((v) => v !== member.tmbId)); } else { setSelectedMembers([...selectedMemberIdList, member.tmbId]); } }; const collaborator = collaboratorList.find((v) => v.tmbId === member.tmbId); return ( } /> {member.memberName} {!!collaborator && ( )} ); })} {t('user:has_chosen') + ': '}{' '} {selectedMemberIdList.length + selectedGroupIdList.length} {selectedGroupIdList.map((groupId) => { const onChange = () => { if (selectedGroupIdList.includes(groupId)) { setSelectedGroupIdList(selectedGroupIdList.filter((v) => v !== groupId)); } else { setSelectedGroupIdList([...selectedGroupIdList, groupId]); } }; const group = groups.find((v) => String(v._id) === groupId); return ( {group?.name === DefaultGroupName ? userInfo?.team.teamName : group?.name} ); })} {selectedMemberIdList.map((tmbId) => { const member = filterMembers.find((v) => v.tmbId === tmbId); return member ? ( setSelectedMembers(selectedMemberIdList.filter((v) => v !== tmbId)) } > {member.memberName} ) : null; })} {t(perLabel as any)} } onChange={(v) => setSelectedPermission(v)} /> ); } export default AddMemberModal;