import { putUpdateGroup } from '@/web/support/user/team/group/api'; import { Box, Flex, HStack, Input, ModalBody, ModalFooter, Button, useDisclosure, Checkbox } from '@chakra-ui/react'; import { TeamMemberItemType } from '@fastgpt/global/support/user/team/type'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import React, { useMemo, useState } from 'react'; import { TeamContext } from '../context'; import { useContextSelector } from 'use-context-selector'; export type ChangeOwnerModalProps = { groupId: string; }; export function ChangeOwnerModal({ onClose, groupId }: ChangeOwnerModalProps & { onClose: () => void }) { const { t } = useTranslation(); const [inputValue, setInputValue] = React.useState(''); const { members: allMembers, groups, refetchGroups } = useContextSelector(TeamContext, (v) => v); const group = useMemo(() => { return groups.find((item) => item._id === groupId); }, [groupId, groups]); const memberList = allMembers.filter((item) => { return item.memberName.toLowerCase().includes(inputValue.toLowerCase()); }); const OldOwnerId = useMemo(() => { return group?.members.find((item) => item.role === 'owner')?.tmbId; }, [group]); const [keepAdmin, setKeepAdmin] = useState(true); const { isOpen: isOpenMemberListMenu, onClose: onCloseMemberListMenu, onOpen: onOpenMemberListMenu } = useDisclosure(); const [selectedMember, setSelectedMember] = useState(null); const onChangeOwner = async (tmbId: string) => { if (!group) { return; } const newMemberList = group.members .map((item) => { if (item.tmbId === OldOwnerId) { if (keepAdmin) { return { tmbId: OldOwnerId, role: 'admin' }; } return { tmbId: OldOwnerId, role: 'member' }; } return item; }) .filter((item) => item.tmbId !== tmbId) as any; newMemberList.push({ tmbId, role: 'owner' }); return putUpdateGroup({ groupId, memberList: newMemberList }); }; const { runAsync, loading } = useRequest2(onChangeOwner, { onSuccess: () => Promise.all([onClose(), refetchGroups()]), successToast: t('common:permission.change_owner_success'), errorToast: t('common:permission.change_owner_failed') }); const onConfirm = async () => { if (!selectedMember) { return; } await runAsync(selectedMember.tmbId); }; return ( {group?.name} {t('common:permission.change_owner_to')} {selectedMember && ( )} { setInputValue(e.target.value); setSelectedMember(null); }} onFocus={() => { onOpenMemberListMenu(); setSelectedMember(null); }} {...(selectedMember && { pl: '10' })} /> {isOpenMemberListMenu && memberList.length > 0 && ( {memberList.map((item) => ( { setInputValue(item.memberName); setSelectedMember(item); onCloseMemberListMenu(); }} > {item.memberName} ))} )} { setKeepAdmin(e.target.checked); }} > {t('account_team:retain_admin_permissions')} ); } export default ChangeOwnerModal;