import { putUpdateOrgMembers } from '@/web/support/user/team/org/api'; import { Box, Button, Flex, Grid, HStack, ModalBody, ModalFooter } from '@chakra-ui/react'; import type { GroupMemberRole } from '@fastgpt/global/support/permission/memberGroup/constant'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyIcon from '@fastgpt/web/components/common/Icon'; import SearchInput from '@fastgpt/web/components/common/Input/SearchInput'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import { useEffect, useState } from 'react'; import { OrgListItemType } from '@fastgpt/global/support/user/team/org/type'; import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; import { getTeamMembers } from '@/web/support/user/team/api'; import MemberItemCard from '@/components/support/permission/MemberManager/MemberItemCard'; export type GroupFormType = { members: { tmbId: string; role: `${GroupMemberRole}`; }[]; }; function OrgMemberManageModal({ currentOrg, refetchOrgs, onClose }: { currentOrg: OrgListItemType; refetchOrgs: () => void; onClose: () => void; }) { const { t } = useTranslation(); const [searchKey, setSearchKey] = useState(''); const { data: allMembers, ScrollData: MemberScrollData } = useScrollPagination(getTeamMembers, { pageSize: 20, params: { withOrgs: true, withPermission: false, status: 'active', searchKey }, throttleWait: 500, debounceWait: 200, refreshDeps: [searchKey] }); const { data: orgMembers, ScrollData: OrgMemberScrollData } = useScrollPagination( getTeamMembers, { pageSize: 100000, params: { orgId: currentOrg._id, withOrgs: false, withPermission: false } } ); const [selected, setSelected] = useState<{ name: string; tmbId: string; avatar: string }[]>([]); useEffect(() => { setSelected( orgMembers.map((item) => ({ name: item.memberName, tmbId: item.tmbId, avatar: item.avatar })) ); }, [orgMembers]); const { run: onUpdate, loading: isLoadingUpdate } = useRequest2( () => { return putUpdateOrgMembers({ orgId: currentOrg._id, members: selected.map((member) => ({ tmbId: member.tmbId })) }); }, { successToast: t('common:common.Update Success'), onSuccess() { refetchOrgs(); onClose(); } } ); const isSelected = (tmbId: string) => { return selected.find((tmb) => tmb.tmbId === tmbId); }; const handleToggleSelect = (tmbId: string) => { if (isSelected(tmbId)) { setSelected((state) => state.filter((tmb) => tmb.tmbId !== tmbId)); // setSelectedTmbIds((state) => state.filter((tmbId) => tmbId !== memberId)); } else { // setSelectedTmbIds((state) => [...state, memberId]); const member = allMembers.find((item) => item.tmbId === tmbId)!; setSelected((state) => [ ...state, { name: member.memberName, tmbId, avatar: member.avatar } ]); } }; const isLoading = isLoadingUpdate; return ( { setSearchKey(e.target.value); }} /> {allMembers.map((member) => { return ( handleToggleSelect(member.tmbId)} isChecked={!!isSelected(member.tmbId)} orgs={member.orgs} /> ); })} {`${t('common:chosen')}:${selected.length}`} {selected.map((member) => { return ( {member?.name} handleToggleSelect(member.tmbId)} /> ); })} ); } export default OrgMemberManageModal;