import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query' import apiGeneral from '@utils/api/general' import apiInstance from '@utils/api/instance' import { featureCheck } from '@utils/helpers/featureCheck' import { setAccountStorage } from '@utils/storage/actions' import { AxiosError } from 'axios' export type QueryKeyInstance = ['Instance'] | ['Instance', { domain?: string }] const queryFunction = async ({ queryKey }: QueryFunctionContext) => { const domain = queryKey[1]?.domain if (domain) { return await apiGeneral>({ method: 'get', domain, url: 'api/v2/instance' }) .then(res => res.body) .catch( async () => await apiGeneral>({ method: 'get', domain, url: 'api/v1/instance' }).then(res => res.body) ) } else { const hasInstanceNewPath = featureCheck('instance_new_path') return hasInstanceNewPath ? await apiInstance>({ method: 'get', version: 'v2', url: 'instance' }) .then(res => res.body) .catch( async () => await apiInstance>({ method: 'get', version: 'v1', url: 'instance' }).then(res => res.body) ) : await apiInstance>({ method: 'get', version: 'v1', url: 'instance' }).then(res => res.body) } } const useInstanceQuery = ( params?: QueryKeyInstance[1] & { options?: UseQueryOptions, AxiosError> } ) => { const queryKey: QueryKeyInstance = params?.domain ? ['Instance', { domain: params.domain }] : ['Instance'] return useQuery(queryKey, queryFunction, { ...params?.options, staleTime: Infinity, cacheTime: Infinity, ...(!params?.domain && { onSuccess: data => setAccountStorage([{ key: 'version', value: data.version }]) }) }) } export { useInstanceQuery }