import { QueryMeta, UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import { AxiosError } from 'axios'; /** * Extended query meta that includes API-specific options */ export interface ApiQueryMeta extends QueryMeta { /** Whether to handle global errors for this query. Defaults to true. */ handleGlobalError?: boolean; } /** * Represents query parameters for an API call * @template TParams - Type of the request parameters */ interface QueryParams { /** The actual parameters to be passed to the query function */ params: TParams; meta?: ApiQueryMeta; } /** * Helper type to check if all properties in a type are optional */ type AllOptional = T extends Record ? ({} extends Pick ? true : false) : false; /** * Configuration options for creating an API query hook * @template TResponse - Type of the API response * @template TParams - Type of the request parameters (use void for parameterless queries) */ interface CreateApiQueryOptions { /** * Query key generator * - For parameterless queries: provide a static string array * - For parameterized queries: provide a function that generates the key from params */ queryKey: TParams extends void ? string[] : (params: TParams) => string[]; /** * API function to call * - For parameterless queries: provide a function with no parameters * - For parameterized queries: provide a function that takes the params */ queryFn: TParams extends void ? () => Promise : (params: TParams) => Promise; /** * Default query options to be merged with user-provided options * @optional */ defaultOptions?: Omit, 'queryKey' | 'queryFn'>; } /** * Creates a strongly-typed query hook with consistent parameter and options handling * * @example Parameterless query: * ```ts * const useGetProfileQuery = createApiQuery({ * queryKey: ['profile'], * queryFn: () => api.getProfile(), * defaultOptions: { staleTime: 5000 } * }); * * // Usage * const { data } = useGetProfileQuery(); * const { data } = useGetProfileQuery({ enabled: false }); * ``` * * @example Parameterized query: * ```ts * const useGetUserQuery = createApiQuery({ * queryKey: (params) => ['user', params.userId], * queryFn: (params) => api.getUser(params.userId) * }); * * // Usage * const { data } = useGetUserQuery({ * params: { userId: '123' } * }); * ``` */ export declare function createApiQuery({ queryKey, queryFn, defaultOptions, }: CreateApiQueryOptions): { (options?: Omit, "queryKey" | "queryFn"> & { meta?: ApiQueryMeta; }): TParams extends void ? Omit, "data"> & { data: TResponse; } : AllOptional extends true ? Omit, "data"> & { data: TResponse; } : never; (request: QueryParams, options?: Omit, "queryKey" | "queryFn"> & { meta?: ApiQueryMeta; }): Omit, "data"> & { data: TResponse; }; }; export {};