Spaces:
Paused
Paused
| import { | |
| IConversation, | |
| IDialog, | |
| IStats, | |
| IToken, | |
| } from '@/interfaces/database/chat'; | |
| import chatService from '@/services/chat-service'; | |
| import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; | |
| import dayjs, { Dayjs } from 'dayjs'; | |
| import { useCallback, useState } from 'react'; | |
| import { useDispatch, useSelector } from 'umi'; | |
| export const useFetchDialogList = () => { | |
| const dispatch = useDispatch(); | |
| const fetchDialogList = useCallback(() => { | |
| return dispatch<any>({ type: 'chatModel/listDialog' }); | |
| }, [dispatch]); | |
| return fetchDialogList; | |
| }; | |
| export const useSelectDialogList = () => { | |
| const dialogList: IDialog[] = useSelector( | |
| (state: any) => state.chatModel.dialogList, | |
| ); | |
| return dialogList; | |
| }; | |
| export const useFetchConversationList = () => { | |
| const dispatch = useDispatch(); | |
| const fetchConversationList = useCallback( | |
| async (dialogId: string) => { | |
| if (dialogId) { | |
| dispatch({ | |
| type: 'chatModel/listConversation', | |
| payload: { dialog_id: dialogId }, | |
| }); | |
| } | |
| }, | |
| [dispatch], | |
| ); | |
| return fetchConversationList; | |
| }; | |
| export const useSelectConversationList = () => { | |
| const conversationList: IConversation[] = useSelector( | |
| (state: any) => state.chatModel.conversationList, | |
| ); | |
| return conversationList; | |
| }; | |
| export const useFetchConversation = () => { | |
| const dispatch = useDispatch(); | |
| const fetchConversation = useCallback( | |
| (conversationId: string, needToBeSaved = true) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/getConversation', | |
| payload: { | |
| needToBeSaved, | |
| conversation_id: conversationId, | |
| }, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return fetchConversation; | |
| }; | |
| export const useFetchDialog = () => { | |
| const dispatch = useDispatch(); | |
| const fetchDialog = useCallback( | |
| (dialogId: string, needToBeSaved = true) => { | |
| if (dialogId) { | |
| return dispatch<any>({ | |
| type: 'chatModel/getDialog', | |
| payload: { dialog_id: dialogId, needToBeSaved }, | |
| }); | |
| } | |
| }, | |
| [dispatch], | |
| ); | |
| return fetchDialog; | |
| }; | |
| export const useRemoveDialog = () => { | |
| const dispatch = useDispatch(); | |
| const removeDocument = useCallback( | |
| (dialogIds: Array<string>) => { | |
| return dispatch({ | |
| type: 'chatModel/removeDialog', | |
| payload: { | |
| dialog_ids: dialogIds, | |
| }, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return removeDocument; | |
| }; | |
| export const useUpdateConversation = () => { | |
| const dispatch = useDispatch(); | |
| const updateConversation = useCallback( | |
| (payload: any) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/setConversation', | |
| payload, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return updateConversation; | |
| }; | |
| export const useSetDialog = () => { | |
| const dispatch = useDispatch(); | |
| const setDialog = useCallback( | |
| (payload: IDialog) => { | |
| return dispatch<any>({ type: 'chatModel/setDialog', payload }); | |
| }, | |
| [dispatch], | |
| ); | |
| return setDialog; | |
| }; | |
| export const useRemoveConversation = () => { | |
| const dispatch = useDispatch(); | |
| const removeConversation = useCallback( | |
| (conversationIds: Array<string>, dialogId: string) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/removeConversation', | |
| payload: { | |
| dialog_id: dialogId, | |
| conversation_ids: conversationIds, | |
| }, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return removeConversation; | |
| }; | |
| /* | |
| @deprecated | |
| */ | |
| export const useCompleteConversation = () => { | |
| const dispatch = useDispatch(); | |
| const completeConversation = useCallback( | |
| (payload: any) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/completeConversation', | |
| payload, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return completeConversation; | |
| }; | |
| // #region API provided for external calls | |
| export const useCreateToken = (params: Record<string, any>) => { | |
| const dispatch = useDispatch(); | |
| const createToken = useCallback(() => { | |
| return dispatch<any>({ | |
| type: 'chatModel/createToken', | |
| payload: params, | |
| }); | |
| }, [dispatch, params]); | |
| return createToken; | |
| }; | |
| export const useCreateNextToken = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['createToken'], | |
| mutationFn: async (params: Record<string, any>) => { | |
| const { data } = await chatService.createToken(params); | |
| if (data.retcode === 0) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchTokenList'] }); | |
| } | |
| return data?.data ?? []; | |
| }, | |
| }); | |
| return { data, loading, createToken: mutateAsync }; | |
| }; | |
| export const useFetchTokenList = (params: Record<string, any>) => { | |
| const { | |
| data, | |
| isFetching: loading, | |
| refetch, | |
| } = useQuery<IToken[]>({ | |
| queryKey: ['fetchTokenList', params], | |
| initialData: [], | |
| gcTime: 0, | |
| queryFn: async () => { | |
| const { data } = await chatService.listToken(params); | |
| return data?.data ?? []; | |
| }, | |
| }); | |
| return { data, loading, refetch }; | |
| }; | |
| export const useRemoveNextToken = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['removeToken'], | |
| mutationFn: async (params: { | |
| tenantId: string; | |
| dialogId: string; | |
| tokens: string[]; | |
| }) => { | |
| const { data } = await chatService.removeToken(params); | |
| if (data.retcode === 0) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchTokenList'] }); | |
| } | |
| return data?.data ?? []; | |
| }, | |
| }); | |
| return { data, loading, removeToken: mutateAsync }; | |
| }; | |
| type RangeValue = [Dayjs | null, Dayjs | null] | null; | |
| const getDay = (date?: Dayjs) => date?.format('YYYY-MM-DD'); | |
| export const useFetchNextStats = () => { | |
| const [pickerValue, setPickerValue] = useState<RangeValue>([ | |
| dayjs(), | |
| dayjs().subtract(7, 'day'), | |
| ]); | |
| const { data, isFetching: loading } = useQuery<IStats>({ | |
| queryKey: ['fetchStats', pickerValue], | |
| initialData: {} as IStats, | |
| gcTime: 0, | |
| queryFn: async () => { | |
| if (Array.isArray(pickerValue) && pickerValue[0]) { | |
| const { data } = await chatService.getStats({ | |
| fromDate: getDay(pickerValue[0]), | |
| toDate: getDay(pickerValue[1] ?? dayjs()), | |
| }); | |
| return data?.data ?? {}; | |
| } | |
| return {}; | |
| }, | |
| }); | |
| return { data, loading, pickerValue, setPickerValue }; | |
| }; | |
| //#endregion | |
| //#region shared chat | |
| export const useCreateSharedConversation = () => { | |
| const dispatch = useDispatch(); | |
| const createSharedConversation = useCallback( | |
| (userId?: string) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/createExternalConversation', | |
| payload: { userId }, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return createSharedConversation; | |
| }; | |
| export const useFetchSharedConversation = () => { | |
| const dispatch = useDispatch(); | |
| const fetchSharedConversation = useCallback( | |
| (conversationId: string) => { | |
| return dispatch<any>({ | |
| type: 'chatModel/getExternalConversation', | |
| payload: conversationId, | |
| }); | |
| }, | |
| [dispatch], | |
| ); | |
| return fetchSharedConversation; | |
| }; | |
| //#endregion | |