import { UseQueryOptions, useQuery, useMutation, useQueryClient, UseMutationResult, QueryObserverResult, } from "@tanstack/react-query"; import * as t from "./types"; import * as dataService from "./data-service"; export enum QueryKeys { messages = "messsages", allConversations = "allConversations", conversation = "conversation", models = "models", customGpts = "customGpts", searchEnabled = "searchEnabled", user = "user", } export const useGetUserQuery = (): QueryObserverResult => { return useQuery([QueryKeys.user], () => dataService.getUser(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, }); }; 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, enabled: false, ...config } ); } export const useUpdateConversationMutation = ( id: string ): UseMutationResult< t.TUpdateConversationResponse> => { 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 useUpdateCustomGptMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TUpdateCustomGptRequest) => dataService.updateCustomGpt(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.customGpts]); }, } ); }; export const useGetCustomGptsQuery = (): QueryObserverResult< t.TCustomGpt[], unknown > => { return useQuery([QueryKeys.customGpts], () => dataService.getCustomGpts(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, }); }; export const useDeleteCustomGptMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation( (payload: t.TDeleteCustomGptRequest) => dataService.deleteCustomGpt(payload), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.customGpts]); }, } ); }; export const useGetModelsQuery = (): QueryObserverResult => { return useQuery([QueryKeys.models], () => dataService.getModels(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, }); }; export const useClearConversationsMutation = (): UseMutationResult => { const queryClient = useQueryClient(); return useMutation(() => dataService.clearAllConversations(), { onSuccess: () => { queryClient.invalidateQueries([QueryKeys.allConversations]); }, }); }; export const useGetConversationsQuery = (pageNumber: string): QueryObserverResult => { return useQuery([QueryKeys.allConversations, pageNumber], () => dataService.getConversations(pageNumber), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, } ); } export const useGetSearchEnabledQuery = (config?: UseQueryOptions): QueryObserverResult => { return useQuery([QueryKeys.searchEnabled], () => dataService.getSearchEnabled(), { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, ...config, } ); }