|
|
import { |
|
|
UseQueryOptions, |
|
|
useQuery, |
|
|
useMutation, |
|
|
useQueryClient, |
|
|
UseMutationResult, |
|
|
QueryObserverResult, |
|
|
} from '@tanstack/react-query'; |
|
|
import * as t from './types'; |
|
|
import * as s from './schemas'; |
|
|
import * as dataService from './data-service'; |
|
|
|
|
|
export enum QueryKeys { |
|
|
messages = 'messsages', |
|
|
allConversations = 'allConversations', |
|
|
conversation = 'conversation', |
|
|
searchEnabled = 'searchEnabled', |
|
|
user = 'user', |
|
|
name = 'name', |
|
|
models = 'models', |
|
|
balance = 'balance', |
|
|
endpoints = 'endpoints', |
|
|
presets = 'presets', |
|
|
searchResults = 'searchResults', |
|
|
tokenCount = 'tokenCount', |
|
|
availablePlugins = 'availablePlugins', |
|
|
startupConfig = 'startupConfig', |
|
|
} |
|
|
|
|
|
export const useAbortRequestWithMessage = (): UseMutationResult< |
|
|
void, |
|
|
Error, |
|
|
{ endpoint: string; abortKey: string; message: string } |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation( |
|
|
({ endpoint, abortKey, message }) => |
|
|
dataService.abortRequestWithMessage(endpoint, abortKey, message), |
|
|
{ |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.balance]); |
|
|
}, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useGetUserQuery = ( |
|
|
config?: UseQueryOptions<t.TUser>, |
|
|
): QueryObserverResult<t.TUser> => { |
|
|
return useQuery<t.TUser>([QueryKeys.user], () => dataService.getUser(), { |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
retry: false, |
|
|
...config, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetMessagesByConvoId = ( |
|
|
id: string, |
|
|
config?: UseQueryOptions<s.TMessage[]>, |
|
|
): QueryObserverResult<s.TMessage[]> => { |
|
|
return useQuery<s.TMessage[]>( |
|
|
[QueryKeys.messages, id], |
|
|
() => dataService.getMessagesByConvoId(id), |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useGetUserBalance = ( |
|
|
config?: UseQueryOptions<string>, |
|
|
): QueryObserverResult<string> => { |
|
|
return useQuery<string>([QueryKeys.balance], () => dataService.getUserBalance(), { |
|
|
refetchOnWindowFocus: true, |
|
|
refetchOnReconnect: true, |
|
|
refetchOnMount: true, |
|
|
...config, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetConversationByIdQuery = ( |
|
|
id: string, |
|
|
config?: UseQueryOptions<s.TConversation>, |
|
|
): QueryObserverResult<s.TConversation> => { |
|
|
return useQuery<s.TConversation>( |
|
|
[QueryKeys.conversation, id], |
|
|
() => dataService.getConversationById(id), |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
export const useGetConversationByIdMutation = (id: string): UseMutationResult<s.TConversation> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.getConversationById(id), { |
|
|
|
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.conversation, id]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useUpdateConversationMutation = ( |
|
|
id: string, |
|
|
): UseMutationResult< |
|
|
t.TUpdateConversationResponse, |
|
|
unknown, |
|
|
t.TUpdateConversationRequest, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation( |
|
|
(payload: t.TUpdateConversationRequest) => dataService.updateConversation(payload), |
|
|
{ |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.conversation, id]); |
|
|
queryClient.invalidateQueries([QueryKeys.allConversations]); |
|
|
}, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useUpdateMessageMutation = ( |
|
|
id: string, |
|
|
): UseMutationResult<unknown, unknown, t.TUpdateMessageRequest, unknown> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: t.TUpdateMessageRequest) => dataService.updateMessage(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.messages, id]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useUpdateUserKeysMutation = (): UseMutationResult< |
|
|
t.TUser, |
|
|
unknown, |
|
|
t.TUpdateUserKeyRequest, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: t.TUpdateUserKeyRequest) => dataService.updateUserKey(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.name]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useDeleteConversationMutation = ( |
|
|
id?: string, |
|
|
): UseMutationResult< |
|
|
t.TDeleteConversationResponse, |
|
|
unknown, |
|
|
t.TDeleteConversationRequest, |
|
|
unknown |
|
|
> => { |
|
|
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<unknown> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.clearAllConversations(), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.allConversations]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useRevokeUserKeyMutation = (name: string): UseMutationResult<unknown> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.revokeUserKey(name), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.name]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useRevokeAllUserKeysMutation = (): UseMutationResult<unknown> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.revokeAllUserKeys(), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.name]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetConversationsQuery = ( |
|
|
pageNumber: string, |
|
|
config?: UseQueryOptions<t.TGetConversationsResponse>, |
|
|
): QueryObserverResult<t.TGetConversationsResponse> => { |
|
|
return useQuery<t.TGetConversationsResponse>( |
|
|
[QueryKeys.allConversations, pageNumber], |
|
|
() => dataService.getConversations(pageNumber), |
|
|
{ |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
retry: 1, |
|
|
...config, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useGetSearchEnabledQuery = ( |
|
|
config?: UseQueryOptions<boolean>, |
|
|
): QueryObserverResult<boolean> => { |
|
|
return useQuery<boolean>([QueryKeys.searchEnabled], () => dataService.getSearchEnabled(), { |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetEndpointsQuery = (): QueryObserverResult<t.TEndpointsConfig> => { |
|
|
return useQuery([QueryKeys.endpoints], () => dataService.getAIEndpoints(), { |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetModelsQuery = ( |
|
|
config?: UseQueryOptions<t.TModelsConfig>, |
|
|
): QueryObserverResult<t.TModelsConfig> => { |
|
|
return useQuery<t.TModelsConfig>([QueryKeys.models], () => dataService.getModels(), { |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useCreatePresetMutation = (): UseMutationResult< |
|
|
s.TPreset[], |
|
|
unknown, |
|
|
s.TPreset, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: s.TPreset) => dataService.createPreset(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.presets]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useUpdatePresetMutation = (): UseMutationResult< |
|
|
s.TPreset[], |
|
|
unknown, |
|
|
s.TPreset, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: s.TPreset) => dataService.updatePreset(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.presets]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetPresetsQuery = ( |
|
|
config?: UseQueryOptions<s.TPreset[]>, |
|
|
): QueryObserverResult<s.TPreset[], unknown> => { |
|
|
return useQuery<s.TPreset[]>([QueryKeys.presets], () => dataService.getPresets(), { |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useDeletePresetMutation = (): UseMutationResult< |
|
|
s.TPreset[], |
|
|
unknown, |
|
|
s.TPreset | object, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: s.TPreset | object) => dataService.deletePreset(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.presets]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useSearchQuery = ( |
|
|
searchQuery: string, |
|
|
pageNumber: string, |
|
|
config?: UseQueryOptions<t.TSearchResults>, |
|
|
): QueryObserverResult<t.TSearchResults> => { |
|
|
return useQuery<t.TSearchResults>( |
|
|
[QueryKeys.searchResults, pageNumber, searchQuery], |
|
|
() => dataService.searchConversations(searchQuery, pageNumber), |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
...config, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useUpdateTokenCountMutation = (): UseMutationResult< |
|
|
t.TUpdateTokenCountResponse, |
|
|
unknown, |
|
|
{ text: string }, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(({ text }: { text: string }) => dataService.updateTokenCount(text), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.tokenCount]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useLoginUserMutation = (): UseMutationResult< |
|
|
t.TLoginResponse, |
|
|
unknown, |
|
|
t.TLoginUser, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: t.TLoginUser) => dataService.login(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.user]); |
|
|
}, |
|
|
onMutate: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.models]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useRegisterUserMutation = (): UseMutationResult< |
|
|
unknown, |
|
|
unknown, |
|
|
t.TRegisterUser, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: t.TRegisterUser) => dataService.register(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.user]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useLogoutUserMutation = (): UseMutationResult<unknown> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.logout(), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.user]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useRefreshTokenMutation = (): UseMutationResult< |
|
|
t.TRefreshTokenResponse, |
|
|
unknown, |
|
|
unknown, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation(() => dataService.refreshToken(), { |
|
|
onMutate: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.models]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useUserKeyQuery = ( |
|
|
name: string, |
|
|
config?: UseQueryOptions<t.TCheckUserKeyResponse>, |
|
|
): QueryObserverResult<t.TCheckUserKeyResponse> => { |
|
|
return useQuery<t.TCheckUserKeyResponse>( |
|
|
[QueryKeys.name, name], |
|
|
() => { |
|
|
if (!name) { |
|
|
return Promise.resolve({ expiresAt: '' }); |
|
|
} |
|
|
return dataService.userKeyQuery(name); |
|
|
}, |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
retry: false, |
|
|
...config, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useRequestPasswordResetMutation = (): UseMutationResult< |
|
|
t.TRequestPasswordResetResponse, |
|
|
unknown, |
|
|
t.TRequestPasswordReset, |
|
|
unknown |
|
|
> => { |
|
|
return useMutation((payload: t.TRequestPasswordReset) => |
|
|
dataService.requestPasswordReset(payload), |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useResetPasswordMutation = (): UseMutationResult< |
|
|
unknown, |
|
|
unknown, |
|
|
t.TResetPassword, |
|
|
unknown |
|
|
> => { |
|
|
return useMutation((payload: t.TResetPassword) => dataService.resetPassword(payload)); |
|
|
}; |
|
|
|
|
|
export const useAvailablePluginsQuery = (): QueryObserverResult<s.TPlugin[]> => { |
|
|
return useQuery<s.TPlugin[]>( |
|
|
[QueryKeys.availablePlugins], |
|
|
() => dataService.getAvailablePlugins(), |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|
|
|
export const useUpdateUserPluginsMutation = (): UseMutationResult< |
|
|
t.TUser, |
|
|
unknown, |
|
|
t.TUpdateUserPlugins, |
|
|
unknown |
|
|
> => { |
|
|
const queryClient = useQueryClient(); |
|
|
return useMutation((payload: t.TUpdateUserPlugins) => dataService.updateUserPlugins(payload), { |
|
|
onSuccess: () => { |
|
|
queryClient.invalidateQueries([QueryKeys.user]); |
|
|
}, |
|
|
}); |
|
|
}; |
|
|
|
|
|
export const useGetStartupConfig = (): QueryObserverResult<t.TStartupConfig> => { |
|
|
return useQuery<t.TStartupConfig>( |
|
|
[QueryKeys.startupConfig], |
|
|
() => dataService.getStartupConfig(), |
|
|
{ |
|
|
refetchOnWindowFocus: false, |
|
|
refetchOnReconnect: false, |
|
|
refetchOnMount: false, |
|
|
}, |
|
|
); |
|
|
}; |
|
|
|