import { getOrgMembers, putUpdateOrgMembers } from '@/web/support/user/team/org/api'; import { Box, Button, Checkbox, 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 type { IconNameType } from '@fastgpt/web/components/common/Icon/type'; 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 type React from 'react'; import { useEffect, useMemo, useState } from 'react'; import { useContextSelector } from 'use-context-selector'; import { TeamContext } from '../context'; import { OrgType } from '@fastgpt/global/support/user/team/org/type'; import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; export type GroupFormType = { members: { tmbId: string; role: `${GroupMemberRole}`; }[]; }; function CheckboxIcon({ name }: { isChecked?: boolean; isIndeterminate?: boolean; name: IconNameType; }) { return ; } function OrgMemberManageModal({ currentOrg, refetchOrgs, onClose }: { currentOrg: OrgType; refetchOrgs: () => void; onClose: () => void; }) { const { t } = useTranslation(); const { members: allMembers, MemberScrollData } = useContextSelector(TeamContext, (v) => v); const { data: orgMembers, ScrollData: OrgMemberScrollData } = useScrollPagination(getOrgMembers, { pageSize: 20, params: { orgId: currentOrg?._id ?? '' } }); const [selectedMembers, setSelectedMembers] = useState( orgMembers.map((item) => item.tmbId) ); useEffect(() => { setSelectedMembers(orgMembers.map((item) => item.tmbId)); }, [orgMembers]); const [searchKey, setSearchKey] = useState(''); const filterMembers = useMemo(() => { if (!searchKey) return allMembers; const regx = new RegExp(searchKey, 'i'); return allMembers.filter((member) => regx.test(member.memberName)); }, [searchKey, allMembers]); const { run: onUpdate, loading: isLoadingUpdate } = useRequest2( () => { return putUpdateOrgMembers({ orgId: currentOrg._id, members: selectedMembers.map((tmbId) => ({ tmbId })) }); }, { successToast: t('common:common.Update Success'), onSuccess() { refetchOrgs(); onClose(); } } ); const isSelected = (memberId: string) => { return selectedMembers.find((tmbId) => tmbId === memberId); }; const handleToggleSelect = (memberId: string) => { if (isSelected(memberId)) { setSelectedMembers((state) => state.filter((tmbId) => tmbId !== memberId)); } else { setSelectedMembers((state) => [...state, memberId]); } }; const isLoading = isLoadingUpdate; return ( { setSearchKey(e.target.value); }} /> {filterMembers.map((member) => { return ( handleToggleSelect(member.tmbId)} > } pointerEvents="none" /> {member.memberName} ); })} {/* */} {`${t('common:chosen')}:${selectedMembers.length}`} {selectedMembers.map((tmbId) => { const member = allMembers.find((item) => item.tmbId === tmbId)!; return ( {member?.memberName} handleToggleSelect(tmbId)} /> ); })} ); } export default OrgMemberManageModal;