import { UseQueryOptions, useQuery, useMutation, useQueryClient, UseMutationResult, QueryObserverResult, } from "@tanstack/react-query"; import * as t from "./types"; import * as dataService from "./data-service"; import axios from 'axios'; export enum QueryKeys { messages = "messsages", allConversations = "allConversations", conversation = "conversation", searchEnabled = "searchEnabled", user = "user", endpoints = "endpoints", presets = "presets", searchResults = "searchResults", tokenCount = "tokenCount", } export const useAbortRequestWithMessage = (): UseMutationResult => { return useMutation(({ endpoint, abortKey, message }) => dataService.abortRequestWithMessage(endpoint, abortKey, message)); }; export const useGetUserQuery = (config?: UseQueryOptions): QueryObserverResult => { return useQuery([QueryKeys.user], () => dataService.getUser(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, ...config, }); }; export const useGetMessagesByConvoId = ( id: string, config?: UseQueryOptions ): QueryObserverResult => { return useQuery([QueryKeys.messages, id], () => dataService.getMessagesByConvoId(id), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config, } ); }; export const useGetConversationByIdQuery = ( id: string, config?: UseQueryOptions ): QueryObserverResult => { return useQuery([QueryKeys.conversation, id], () => dataService.getConversationById(id), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config } ); } //This isn't ideal because its just a query and we're using mutation, but it was the only way //to make it work with how the Chat component is structured export const useGetConversationByIdMutation = ( id: string, ): UseMutationResult => { const queryClient = useQueryClient(); return useMutation(() => dataService.getConversationById(id), { onSuccess: (res: t.TConversation) => { queryClient.invalidateQueries([QueryKeys.conversation, id]); }, } ); }; export const useUpdateConversationMutation = ( id: string ): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TUpdateConversationRequest) => dataService.updateConversation(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.conversation, id]); queryClient.invalidateQueries([QueryKeys.allConversations]); }, } ); }; export const useDeleteConversationMutation = ( id?: string ): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TDeleteConversationRequest) => dataService.deleteConversation(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.conversation, id]); queryClient.invalidateQueries([QueryKeys.allConversations]); }, } ); }; export const useClearConversationsMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation(() => dataService.clearAllConversations(), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.allConversations]); }, }); }; export const useGetConversationsQuery = (pageNumber: string, config?: UseQueryOptions): QueryObserverResult => { return useQuery([QueryKeys.allConversations, pageNumber], () => dataService.getConversations(pageNumber), { refetchOnReconnect: false, refetchOnMount: false, retry: 1, ...config, } ); } export const useGetSearchEnabledQuery = (config?: UseQueryOptions): QueryObserverResult => { return useQuery([QueryKeys.searchEnabled], () => dataService.getSearchEnabled(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config, } ); } export const useGetEndpointsQuery = (): QueryObserverResult => { return useQuery([QueryKeys.endpoints], () => dataService.getAIEndpoints(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, } ); } export const useCreatePresetMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TPreset) => dataService.createPreset(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.presets]); }, } ); }; export const useUpdatePresetMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TPreset) => dataService.updatePreset(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.presets]); }, } ); }; export const useGetPresetsQuery = (config?: UseQueryOptions): QueryObserverResult => { return useQuery([QueryKeys.presets], () => dataService.getPresets(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config, }); }; export const useDeletePresetMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TPreset | {}) => dataService.deletePreset(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.presets]); }, } ); } export const useSearchQuery = ( searchQuery: string, pageNumber: string, config?: UseQueryOptions ): QueryObserverResult => { return useQuery([QueryKeys.searchResults, pageNumber, searchQuery], () => dataService.searchConversations(searchQuery, pageNumber), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config } ); } export const useUpdateTokenCountMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (text: string) => dataService.updateTokenCount(text), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.tokenCount]); }, } ); } export const useLoginUserMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TLoginUserRequest) => dataService.login(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.user]); }, } ); } export const useRegisterUserMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TRegisterUser) => dataService.register(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.user]); }, } ); } export const useLogoutUserMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation(() => dataService.logout(), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.user]); }, }); } export const useRefreshTokenMutation = (): UseMutationResult => { return useMutation(() => dataService.refreshToken(), { }); } export const useRequestPasswordResetMutation = (): UseMutationResult => { return useMutation((payload: t.TRequestPasswordReset) => dataService.requestPasswordReset(payload)); } export const useResetPasswordMutation = (): UseMutationResult => { return useMutation((payload: t.TResetPassword) => dataService.resetPassword(payload)); }