import { QueryKey, UseQueryResult } from '@tanstack/react-query'; import { ApiError, RequestConfig, QueryParams, UseApiRequestOptions } from '../types'; /** * API request configuration */ export interface ApiRequestConfig { /** Request URL (relative to base URL) */ url: string; /** Query key for caching */ queryKey: QueryKey; /** Path parameters for URL substitution */ pathParams?: Record; /** Query parameters */ params?: QueryParams; /** Additional request options */ requestOptions?: Partial; /** Transform response data */ select?: (data: TResponse) => TResponse; } /** * Combined options for useApiRequest */ export type ApiRequestOptions = ApiRequestConfig & UseApiRequestOptions; /** * Return type for useApiRequest */ export interface UseApiRequestResult extends Omit, 'data'> { /** Response data (undefined while loading) */ data: TData | undefined; /** Whether data exists */ hasData: boolean; /** Invalidate and refetch */ invalidate: () => Promise; /** Update data in cache */ setData: (updater: TData | ((old: TData | undefined) => TData)) => void; /** Get current cached data */ getCachedData: () => TData | undefined; } /** * Hook for making typed API GET requests with caching * * @typeParam TResponse - Expected response data type * @param options - Request and query configuration * @returns Query result with additional utilities * * @example * ```typescript * // Basic usage * const { data, isLoading } = useApiRequest({ * url: '/users/123', * queryKey: ['users', '123'], * }); * * // With options * const { data, refetch } = useApiRequest({ * url: '/users', * queryKey: ['users', 'list', filters], * params: { page: 1, limit: 20 }, * staleTime: 60000, * enabled: isAuthenticated, * onSuccess: (users) => console.log('Loaded users:', users.length), * }); * * // With path params * const { data } = useApiRequest({ * url: '/users/:userId/posts', * queryKey: ['users', userId, 'posts'], * pathParams: { userId }, * }); * ``` */ export declare function useApiRequest(options: ApiRequestOptions): UseApiRequestResult; /** * Simpler hook for basic GET requests * * @example * ```typescript * const { data, isLoading } = useGet('/users/123', ['users', '123']); * ``` */ export declare function useGet(url: string, queryKey: QueryKey, options?: Omit, 'url' | 'queryKey'>): UseApiRequestResult; /** * Hook for fetching a resource by ID * * @example * ```typescript * const { data, isLoading } = useGetById('/users', '123'); * ``` */ export declare function useGetById(baseUrl: string, id: string | undefined, options?: Omit, 'url' | 'queryKey'>): UseApiRequestResult; /** * Hook for fetching a list with pagination * * @example * ```typescript * const { data, isLoading } = useGetList('/users', { * page: 1, * pageSize: 20, * filters: { status: 'active' }, * }); * ``` */ export declare function useGetList(url: string, params?: { page?: number; pageSize?: number; filters?: Record; sort?: string; order?: 'asc' | 'desc'; }, options?: Omit, 'url' | 'queryKey' | 'params'>): UseApiRequestResult; /** * Result type for parallel requests */ export interface ParallelRequestResult { /** Response data (undefined while loading) */ data: TData | undefined; /** Whether data exists */ hasData: boolean; /** Is loading */ isLoading: boolean; /** Is fetching */ isFetching: boolean; /** Error if any */ error: ApiError | null; /** Is error state */ isError: boolean; /** Is success state */ isSuccess: boolean; } /** * Hook for making multiple parallel requests * * Uses useQueries from TanStack Query to properly execute parallel requests * without violating Rules of Hooks. * * @example * ```typescript * const results = useParallelRequests([ * { url: '/users', queryKey: ['users'] }, * { url: '/posts', queryKey: ['posts'] }, * ]); * * const [usersResult, postsResult] = results; * if (usersResult.isLoading || postsResult.isLoading) { * return ; * } * ``` */ export declare function useParallelRequests(requests: { [K in keyof TResponses]: ApiRequestOptions; }): { [K in keyof TResponses]: ParallelRequestResult; }; /** * Hook for making dependent sequential requests * * @example * ```typescript * const { data: posts } = useDependentRequest( * { url: '/users/123', queryKey: ['users', '123'] }, * (user) => ({ * url: `/users/${user.id}/posts`, * queryKey: ['users', user.id, 'posts'], * }) * ); * ``` */ export declare function useDependentRequest(firstRequest: ApiRequestOptions, secondRequestFn: (data: TFirst) => ApiRequestOptions): { first: UseApiRequestResult; second: UseApiRequestResult; isLoading: boolean; error: ApiError | null; }; /** * Hook for polling an endpoint at regular intervals * * @example * ```typescript * const { data, stopPolling, startPolling } = usePolling({ * url: `/jobs/${jobId}/status`, * queryKey: ['jobs', jobId, 'status'], * interval: 5000, * stopCondition: (data) => data.status === 'completed', * }); * ``` */ export declare function usePolling(options: ApiRequestOptions & { interval: number; stopCondition?: (data: TResponse) => boolean; }): UseApiRequestResult & { isPolling: boolean; startPolling: () => void; stopPolling: () => void; }; /** * Hook for prefetching data * * @example * ```typescript * const prefetch = usePrefetch(); * * // On hover * prefetch('/users/123', ['users', '123'])}> * User Profile * * ``` */ export declare function usePrefetch(): (url: string, queryKey: QueryKey, options?: Partial>) => Promise; /** * Hook for lazy/manual queries (not executed automatically) * * @example * ```typescript * const { execute, data, isLoading } = useLazyQuery({ * url: '/users/:id', * queryKey: ['users'], * }); * * // Execute manually * const handleClick = async (userId: string) => { * const user = await execute({ pathParams: { id: userId } }); * console.log(user); * }; * ``` */ export declare function useLazyQuery(options: Omit, 'enabled'>): UseApiRequestResult & { execute: (overrides?: Partial>) => Promise; };