import { baseApi } from '../base-api'; export type ApiQueryArgs = { url: string; method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; params?: Record; body?: unknown; headers?: Record; cacheKey?: string | unknown[]; }; const queryApi = baseApi.injectEndpoints({ endpoints: (builder) => ({ apiQuery: builder.query({ query: ({ url, params }) => ({ url, params }), }), apiMutation: builder.mutation({ query: ({ url, method = 'POST', body, headers }) => ({ url, method, body, headers, }), }), }), overrideExisting: false, }); export const { useApiQueryQuery, useLazyApiQueryQuery, useApiMutationMutation } = queryApi; export function useApiQuery( args: ApiQueryArgs, options?: Parameters[1], ) { return useApiQueryQuery(args, options) as ReturnType & { data: TData | undefined; }; } /** * Same endpoint as `useApiQuery`, fetched on demand instead of on render — for * the case where the arguments are only known at click time. */ export function useApiLazyQuery(): [ (args: ApiQueryArgs) => { unwrap: () => Promise }, ] { const [trigger] = useLazyApiQueryQuery(); return [trigger as unknown as (args: ApiQueryArgs) => { unwrap: () => Promise }]; } type UseApiMutationResult = { data: TData | undefined; isLoading: boolean; isError: boolean; error: unknown; isSuccess: boolean; status: 'uninitialized' | 'pending' | 'fulfilled' | 'rejected'; reset: () => void; }; export function useApiMutation(): [ (args: ApiQueryArgs) => Promise<{ data: TData }> & { unwrap: () => Promise }, UseApiMutationResult, ] { return useApiMutationMutation() as unknown as [ (args: ApiQueryArgs) => Promise<{ data: TData }> & { unwrap: () => Promise }, UseApiMutationResult, ]; }