mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-24 05:23:57 +00:00
147 lines
4.1 KiB
TypeScript
147 lines
4.1 KiB
TypeScript
import React, { ReactNode, useCallback, useState } from 'react';
|
|
import { createContext } from 'use-context-selector';
|
|
import type { EditTeamFormDataType } from './EditInfoModal';
|
|
import dynamic from 'next/dynamic';
|
|
import {
|
|
getTeamList,
|
|
getTeamMemberCount,
|
|
getTeamMembers,
|
|
putSwitchTeam
|
|
} from '@/web/support/user/team/api';
|
|
import { TeamMemberStatusEnum } from '@fastgpt/global/support/user/team/constant';
|
|
import { useUserStore } from '@/web/support/user/useUserStore';
|
|
import type { TeamTmbItemType, TeamMemberItemType } from '@fastgpt/global/support/user/team/type';
|
|
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
|
import { useTranslation } from 'next-i18next';
|
|
import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination';
|
|
import { useRouter } from 'next/router';
|
|
|
|
const EditInfoModal = dynamic(() => import('./EditInfoModal'));
|
|
|
|
type TeamModalContextType = {
|
|
myTeams: TeamTmbItemType[];
|
|
members: TeamMemberItemType[];
|
|
isLoading: boolean;
|
|
onSwitchTeam: (teamId: string) => void;
|
|
setEditTeamData: React.Dispatch<React.SetStateAction<EditTeamFormDataType | undefined>>;
|
|
|
|
refetchMembers: () => void;
|
|
refetchTeams: () => void;
|
|
teamSize: number;
|
|
MemberScrollData: ReturnType<typeof useScrollPagination>['ScrollData'];
|
|
};
|
|
|
|
export const TeamContext = createContext<TeamModalContextType>({
|
|
myTeams: [],
|
|
members: [],
|
|
isLoading: false,
|
|
onSwitchTeam: function (_teamId: string): void {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
setEditTeamData: function (_value: React.SetStateAction<EditTeamFormDataType | undefined>): void {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
refetchTeams: function (): void {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
refetchMembers: function (): void {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
teamSize: 0,
|
|
MemberScrollData: () => <></>
|
|
});
|
|
|
|
export const TeamModalContextProvider = ({ children }: { children: ReactNode }) => {
|
|
const { t } = useTranslation();
|
|
const router = useRouter();
|
|
|
|
const [editTeamData, setEditTeamData] = useState<EditTeamFormDataType>();
|
|
const { userInfo, initUserInfo } = useUserStore();
|
|
|
|
const {
|
|
data: myTeams = [],
|
|
loading: isLoadingTeams,
|
|
refresh: refetchTeams
|
|
} = useRequest2(() => getTeamList(TeamMemberStatusEnum.active), {
|
|
manual: false,
|
|
refreshDeps: [userInfo?._id]
|
|
});
|
|
|
|
const { data: teamMemberCountData, refresh: refetchTeamMemberCount } = useRequest2(
|
|
getTeamMemberCount,
|
|
{
|
|
manual: false,
|
|
refreshDeps: [userInfo?.team?.teamId]
|
|
}
|
|
);
|
|
|
|
// member action
|
|
const {
|
|
data: members = [],
|
|
isLoading: loadingMembers,
|
|
refreshList: refetchMemberList,
|
|
ScrollData: MemberScrollData
|
|
} = useScrollPagination(getTeamMembers, {
|
|
pageSize: 20,
|
|
params: {
|
|
withLeaved: true
|
|
}
|
|
});
|
|
|
|
const refetchMembers = useCallback(() => {
|
|
refetchTeamMemberCount();
|
|
refetchMemberList();
|
|
}, [refetchTeamMemberCount, refetchMemberList]);
|
|
|
|
const { runAsync: onSwitchTeam, loading: isSwitchingTeam } = useRequest2(
|
|
async (teamId: string) => {
|
|
await putSwitchTeam(teamId);
|
|
return initUserInfo();
|
|
},
|
|
{
|
|
onSuccess: () => {
|
|
router.reload();
|
|
},
|
|
errorToast: t('common:user.team.Switch Team Failed')
|
|
}
|
|
);
|
|
|
|
const isLoading = isLoadingTeams || isSwitchingTeam || loadingMembers;
|
|
|
|
const contextValue = {
|
|
myTeams,
|
|
refetchTeams,
|
|
isLoading,
|
|
onSwitchTeam,
|
|
|
|
// create | update team
|
|
setEditTeamData,
|
|
members,
|
|
refetchMembers,
|
|
teamSize: teamMemberCountData?.count || 0,
|
|
MemberScrollData
|
|
};
|
|
|
|
return (
|
|
<TeamContext.Provider value={contextValue}>
|
|
{userInfo?.team?.permission && (
|
|
<>
|
|
{children}
|
|
{!!editTeamData && (
|
|
<EditInfoModal
|
|
defaultData={editTeamData}
|
|
onClose={() => setEditTeamData(undefined)}
|
|
onSuccess={() => {
|
|
refetchTeams();
|
|
initUserInfo();
|
|
}}
|
|
/>
|
|
)}
|
|
</>
|
|
)}
|
|
</TeamContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default TeamModalContextProvider;
|