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({ 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({ 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({ type: 'chatModel/getDialog', payload: { dialog_id: dialogId, needToBeSaved }, }); } }, [dispatch], ); return fetchDialog; }; export const useRemoveDialog = () => { const dispatch = useDispatch(); const removeDocument = useCallback( (dialogIds: Array) => { 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({ type: 'chatModel/setConversation', payload, }); }, [dispatch], ); return updateConversation; }; export const useSetDialog = () => { const dispatch = useDispatch(); const setDialog = useCallback( (payload: IDialog) => { return dispatch({ type: 'chatModel/setDialog', payload }); }, [dispatch], ); return setDialog; }; export const useRemoveConversation = () => { const dispatch = useDispatch(); const removeConversation = useCallback( (conversationIds: Array, dialogId: string) => { return dispatch({ 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({ type: 'chatModel/completeConversation', payload, }); }, [dispatch], ); return completeConversation; }; // #region API provided for external calls export const useCreateToken = (params: Record) => { const dispatch = useDispatch(); const createToken = useCallback(() => { return dispatch({ 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) => { 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) => { const { data, isFetching: loading, refetch, } = useQuery({ 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([ dayjs(), dayjs().subtract(7, 'day'), ]); const { data, isFetching: loading } = useQuery({ 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({ type: 'chatModel/createExternalConversation', payload: { userId }, }); }, [dispatch], ); return createSharedConversation; }; export const useFetchSharedConversation = () => { const dispatch = useDispatch(); const fetchSharedConversation = useCallback( (conversationId: string) => { return dispatch({ type: 'chatModel/getExternalConversation', payload: conversationId, }); }, [dispatch], ); return fetchSharedConversation; }; //#endregion