@krymskyimaksym/react-api-client 1.0.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/utils.ts","../src/hooks/use-fetch.ts","../src/hooks/use-mutation.ts","../src/hooks/use-paginate.ts","../src/index.ts"],"names":["error","useState","useCallback","useRef","useMemo","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiClientConfig } from './types';\n\nlet globalConfig: ApiClientConfig | null = null;\n\n/**\n * Configure the API client globally\n * @param config - API client configuration\n *\n * @example\n * import { configureApiClient } from '@krymskyimaksym/react-api-client';\n * import { router } from 'expo-router';\n *\n * configureApiClient({\n * httpClient: myHttpClient,\n * onUnauthorized: () => router.replace('/login')\n * });\n */\nexport function configureApiClient(config: ApiClientConfig): void {\n globalConfig = config;\n}\n\n/**\n * Get the current global configuration\n * @throws Error if configuration is not set\n */\nexport function getConfig(): ApiClientConfig {\n if (!globalConfig) {\n throw new Error(\n 'API client is not configured. Call configureApiClient() first.',\n );\n }\n return globalConfig;\n}\n\n/**\n * Check if the API client is configured\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null;\n}\n","import { getConfig } from './config';\n\nimport type { RequestConfig, ResponseWrapper } from './types';\n\n/**\n * Builds the endpoint URL from a string or function\n */\nexport function buildEndpoint<RequestParamsType>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n params?: RequestParamsType,\n): string {\n if (typeof endpoint === 'function' && typeof params !== 'undefined') {\n return endpoint(params);\n }\n return endpoint as string;\n}\n\n/**\n * Executes an HTTP request with error handling and response wrapping\n */\nexport async function executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n params?: RequestParamsType,\n): Promise<ResponseWrapper<ResponseType, ErrorResponseType>> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n const url = buildEndpoint(endpoint, params);\n const config = getConfig();\n\n try {\n const requestConfig = { ...fetchConfig };\n let response: ResponseType;\n\n if (\n requestConfig.method?.toUpperCase() === 'GET' ||\n !requestConfig.method\n ) {\n response = await config.httpClient.get<ResponseType>(url, {\n params: {\n ...requestConfig.requestParams,\n ...(params as Record<string, string>),\n },\n });\n } else {\n response = await config.httpClient.request<ResponseType>(url, {\n method: requestConfig.method,\n data: {\n ...requestConfig.requestParams,\n ...(params as Record<string, unknown>),\n },\n });\n }\n\n return { ...response, status: true } as RT;\n } catch (e) {\n const error = e as {\n response?: { status: number; data: ErrorResponseType };\n };\n\n if (error.response?.status === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n\n if (error.response?.data) {\n return {\n ...(error.response.data as Record<string, unknown>),\n status: false,\n } as unknown as RT;\n }\n\n return {\n status: false,\n message: error instanceof Error ? error.message : 'Request error',\n } as unknown as RT;\n }\n}\n\n/**\n * Handles response success and error callbacks\n */\nexport function handleResponse<T, E = unknown>(\n result: ResponseWrapper<T, E>,\n onSuccess?: (data: ResponseWrapper<T, E>) => void,\n onError?: (error: Error) => void,\n): void {\n if (result.status && onSuccess) {\n onSuccess(result);\n } else if (!result.status && onError) {\n const err = new Error(result.message ?? 'Request failed');\n onError(err);\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n} from '../types/index';\n\n/**\n * Hook for fetching data (GET requests)\n */\nexport function createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return (\n params?: RequestParamsType,\n options: UseFetchOptions<RT> = {},\n ): UseFetchResult<RT> => {\n const {\n enabled = true,\n refetchOnMount = true,\n onSuccess,\n onError,\n } = options;\n\n const [data, setData] = useState<RT | null>(null);\n const [isLoading, setIsLoading] = useState(enabled && refetchOnMount);\n const [isRefetching, setIsRefetching] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isMountedRef = useRef(true);\n\n // Serialize params to avoid unnecessary re-renders\n const serializedParams = useMemo(\n () => (params ? JSON.stringify(params) : null),\n [params],\n );\n\n const fetchData = useCallback(\n async (isRefetch = false) => {\n if (!enabled) return;\n\n try {\n if (isRefetch) {\n setIsRefetching(true);\n } else {\n setIsLoading(true);\n }\n setError(null);\n\n const parsedParams = serializedParams\n ? JSON.parse(serializedParams)\n : undefined;\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, parsedParams);\n\n if (isMountedRef.current) {\n setData(result);\n handleResponse<ResponseType, ErrorResponseType>(\n result,\n onSuccess,\n onError,\n );\n }\n } catch (err) {\n const error = err as Error;\n if (isMountedRef.current) {\n setError(error);\n if (onError) {\n onError(error);\n }\n }\n } finally {\n if (isMountedRef.current) {\n if (isRefetch) {\n setIsRefetching(false);\n } else {\n setIsLoading(false);\n }\n }\n }\n },\n [enabled, serializedParams, onSuccess, onError],\n );\n\n const refetch = useCallback(async () => {\n await fetchData(true);\n }, [fetchData]);\n\n useEffect(() => {\n isMountedRef.current = true;\n\n if (enabled && refetchOnMount) {\n void fetchData(false);\n }\n\n return () => {\n isMountedRef.current = false;\n };\n }, [enabled, refetchOnMount, fetchData]);\n\n return {\n data,\n isLoading,\n isRefetching,\n error,\n refetch,\n };\n };\n}\n","import { useCallback, useState } from 'react';\n\nimport { executeRequest } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseMutationOptions,\n UseMutationResult,\n} from '../types/index';\n\n/**\n * Hook for mutations (POST/PUT/PATCH/DELETE requests)\n */\nexport function createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return (\n options: UseMutationOptions<RT, RequestParamsType> = {},\n ): UseMutationResult<RT, RequestParamsType> => {\n const { onMutate, onSuccess, onError, onSettled } = options;\n\n const [data, setData] = useState<RT | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setIsLoading(false);\n setIsSuccess(false);\n setIsError(false);\n }, []);\n\n const mutateAsync = useCallback(\n async (variables: RequestParamsType): Promise<RT> => {\n setIsLoading(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n try {\n // onMutate callback\n if (onMutate) {\n await onMutate(variables);\n }\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, variables);\n\n setData(result);\n\n if (result.status) {\n setIsSuccess(true);\n // onSuccess callback\n if (onSuccess) {\n await onSuccess(result, variables);\n }\n } else {\n const err = new Error(result.message ?? 'Mutation failed');\n setIsError(true);\n setError(err);\n // onError callback\n if (onError) {\n await onError(err, variables);\n }\n }\n\n // onSettled callback (always called)\n if (onSettled) {\n await onSettled(result, null, variables);\n }\n\n return result;\n } catch (err) {\n const error = err as Error;\n setError(error);\n setIsError(true);\n setIsSuccess(false);\n\n // onError callback\n if (onError) {\n await onError(error, variables);\n }\n\n // onSettled callback (always called)\n if (onSettled) {\n await onSettled(null, error, variables);\n }\n\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [onMutate, onSuccess, onError, onSettled],\n );\n\n const mutateSync = useCallback(\n (variables: RequestParamsType) => {\n void mutateAsync(variables);\n },\n [mutateAsync],\n );\n\n return {\n data,\n error,\n isLoading,\n isSuccess,\n isError,\n mutate: mutateSync,\n mutateAsync,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UsePaginateOptions,\n UsePaginateResult,\n} from '../types/index';\n\n/**\n * Hook for paginated data fetching\n */\nexport function createUsePaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n) {\n return (\n params?: Omit<RequestParamsType, 'page' | 'limit'>,\n hookOptions: UsePaginateOptions<\n ResponseWrapper<ResponseType, ErrorResponseType>\n > = {},\n ): UsePaginateResult<TData> => {\n const {\n enabled = true,\n initialPage = 1,\n initialLimit = 20,\n onSuccess,\n onError,\n } = hookOptions;\n\n const [data, setData] = useState<TData>([] as unknown as TData);\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [totalPages, setTotalPages] = useState<number | null>(null);\n const [total, setTotal] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(enabled);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const isMountedRef = useRef(true);\n const limit = initialLimit;\n\n const dataExtractor = useMemo(\n () =>\n options?.dataExtractor || ((response: ResponseType) => response.data),\n [],\n );\n\n const totalExtractor = useMemo(\n () =>\n options?.totalExtractor ||\n ((response: ResponseType) => response.total ?? 0),\n [],\n );\n\n const serializedParams = useMemo(\n () => (params ? JSON.stringify(params) : null),\n [params],\n );\n\n const fetchPage = useCallback(\n async (page: number, append = false) => {\n if (!enabled) return;\n\n try {\n if (append) {\n setIsFetchingNextPage(true);\n } else {\n setIsLoading(true);\n }\n setError(null);\n\n const parsedParams = serializedParams\n ? JSON.parse(serializedParams)\n : {};\n const requestParams = {\n ...parsedParams,\n page,\n limit,\n } as RequestParamsType;\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, requestParams);\n\n if (isMountedRef.current) {\n handleResponse<ResponseType, ErrorResponseType>(\n result,\n onSuccess,\n onError,\n );\n\n if (!result.status) {\n const err = new Error(result.message ?? 'Request failed');\n setError(err);\n return;\n }\n\n const newData = dataExtractor(result as ResponseType);\n const totalCount = totalExtractor(result as ResponseType);\n\n if (append) {\n setData(prevData => [...prevData, ...newData] as TData);\n } else {\n setData(newData);\n }\n\n setCurrentPage(page);\n setTotal(totalCount);\n setTotalPages(Math.ceil(totalCount / limit));\n }\n } catch (err) {\n const error = err as Error;\n if (isMountedRef.current) {\n setError(error);\n if (onError) {\n onError(error);\n }\n }\n } finally {\n if (isMountedRef.current) {\n if (append) {\n setIsFetchingNextPage(false);\n } else {\n setIsLoading(false);\n }\n }\n }\n },\n [\n enabled,\n serializedParams,\n limit,\n onSuccess,\n onError,\n dataExtractor,\n totalExtractor,\n ],\n );\n\n const hasNextPage = totalPages !== null && currentPage < totalPages;\n const hasPreviousPage = currentPage > 1;\n\n const fetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n await fetchPage(currentPage + 1, true);\n }, [hasNextPage, currentPage, fetchPage]);\n\n const fetchPreviousPage = useCallback(async () => {\n if (!hasPreviousPage) return;\n await fetchPage(currentPage - 1, false);\n }, [hasPreviousPage, currentPage, fetchPage]);\n\n const refetch = useCallback(async () => {\n await fetchPage(currentPage, false);\n }, [currentPage, fetchPage]);\n\n const reset = useCallback(() => {\n setData([] as unknown as TData);\n setCurrentPage(initialPage);\n setTotalPages(null);\n setTotal(null);\n setError(null);\n void fetchPage(initialPage, false);\n }, [initialPage, fetchPage]);\n\n useEffect(() => {\n isMountedRef.current = true;\n\n if (enabled) {\n void fetchPage(initialPage, false);\n }\n\n return () => {\n isMountedRef.current = false;\n };\n }, [enabled, serializedParams, fetchPage, initialPage]);\n\n return {\n data,\n currentPage,\n totalPages,\n total,\n hasNextPage,\n hasPreviousPage,\n isLoading,\n isFetchingNextPage,\n error,\n fetchNextPage,\n fetchPreviousPage,\n refetch,\n reset,\n };\n };\n}\n","import { executeRequest } from './utils';\n\nimport { createUseFetch, createUseMutation, createUsePaginate } from './hooks';\n\nimport type {\n ApiClientReturn,\n ApiMutationReturn,\n ApiPaginateReturn,\n RequestConfig,\n ResponseWrapper,\n} from './types';\n\n/**\n * Creates an API client for GET requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with fetch method and useFetch hook\n *\n * @example\n * const userApi = apiClient<User, { id: string }>('/api/users/:id')\n * const { data } = userApi.useFetch({ id: '123' })\n */\nfunction apiClient<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiClientReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const fetch = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useFetch = createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { fetch, useFetch };\n}\n\n/**\n * Creates an API client for mutation requests (POST/PUT/PATCH/DELETE)\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with mutate method and useMutation hook\n *\n * @example\n * const createUserApi = apiMutation<User, CreateUserRequest>('/api/users', { method: 'POST' })\n * const { mutate, isLoading } = createUserApi.useMutation()\n */\nfunction apiMutation<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiMutationReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const mutate = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useMutation = createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { mutate, useMutation };\n}\n\n/**\n * Creates an API client for paginated requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @param options - Pagination options (data/total extractors)\n * @returns Object with usePaginate hook\n *\n * @example\n * const usersApi = apiPaginate<UsersResponse, User[], { search?: string }>('/api/users')\n * const { data, fetchNextPage, hasNextPage } = usersApi.usePaginate()\n */\nfunction apiPaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n): ApiPaginateReturn<\n ResponseType,\n RequestParamsType,\n TData,\n ErrorResponseType\n> {\n const usePaginate = createUsePaginate<\n ResponseType,\n TData,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, options);\n\n return { usePaginate };\n}\n\nexport default apiClient;\nexport { apiMutation, apiPaginate };\n\n// Export configuration\nexport { configureApiClient, getConfig, isConfigured } from './config';\n\n// Re-export types for convenience\nexport type {\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n UseMutationOptions,\n UseMutationResult,\n UsePaginateOptions,\n UsePaginateResult,\n ApiClientConfig,\n IHttpClient,\n} from './types';\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/utils.ts","../src/query/focus-manager.ts","../src/query/online-manager.ts","../src/query/key.ts","../src/query/cache.ts","../src/query/client.ts","../src/hooks/use-fetch.ts","../src/hooks/use-mutation.ts","../src/hooks/use-paginate.ts","../src/query/persist.ts","../src/query/devtools.ts","../src/query/provider.tsx","../src/index.ts"],"names":["state","useState","useCallback","error","useMemo","useEffect","useRef"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiClientConfig } from './types';\n\nlet globalConfig: ApiClientConfig | null = null;\n\n/**\n * Configure the API client globally\n * @param config - API client configuration\n *\n * @example\n * import { configureApiClient } from '@krymskyimaksym/react-api-client';\n * import { router } from 'expo-router';\n *\n * configureApiClient({\n * httpClient: myHttpClient,\n * onUnauthorized: () => router.replace('/login')\n * });\n */\nexport function configureApiClient(config: ApiClientConfig): void {\n globalConfig = config;\n}\n\n/**\n * Get the current global configuration\n * @throws Error if configuration is not set\n */\nexport function getConfig(): ApiClientConfig {\n if (!globalConfig) {\n throw new Error(\n 'API client is not configured. Call configureApiClient() first.',\n );\n }\n return globalConfig;\n}\n\n/**\n * Check if the API client is configured\n */\nexport function isConfigured(): boolean {\n return globalConfig !== null;\n}\n","/**\n * Унифицированная ошибка API. Кидается из `executeRequest` (а значит,\n * из `fetch`/`mutate`/хуков) только когда в `configureApiClient` включён\n * `throwOnError: true`. По умолчанию поведение пакета не меняется —\n * ошибки приходят как `{ status: false }` (см. CHANGELOG, Фаза 3.5).\n */\nexport type ApiErrorInit<E = unknown> = {\n message: string;\n status: number;\n code?: string;\n errors?: E;\n isNetworkError?: boolean;\n isUnauthorized?: boolean;\n isValidationError?: boolean;\n raw?: unknown;\n};\n\nexport class ApiError<E = unknown> extends Error {\n readonly status: number;\n readonly code?: string;\n readonly errors?: E;\n readonly isNetworkError: boolean;\n readonly isUnauthorized: boolean;\n readonly isValidationError: boolean;\n readonly raw: unknown;\n\n constructor(init: ApiErrorInit<E>) {\n super(init.message);\n this.name = 'ApiError';\n this.status = init.status;\n this.code = init.code;\n this.errors = init.errors;\n this.isNetworkError = init.isNetworkError ?? false;\n this.isUnauthorized = init.isUnauthorized ?? init.status === 401;\n this.isValidationError =\n init.isValidationError ??\n (init.status === 422 || (init.errors !== undefined && init.errors !== null));\n this.raw = init.raw;\n // корректный prototype chain для instanceof после транспиляции\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/**\n * Конвертация произвольного throw'нутого значения в `ApiError`.\n * Покрывает 4 кейса:\n * - `ApiError` → passthrough\n * - axios-like `{ response: { status, data } }` → ApiError с полями из data\n * - `Error` (сетевая ошибка, таймаут) → ApiError(isNetworkError, status: 0)\n * - неизвестный объект → ApiError(message: 'Unknown error', status: 0)\n */\nexport function toApiError(thrown: unknown): ApiError {\n if (thrown instanceof ApiError) return thrown;\n\n if (isObject(thrown) && 'response' in thrown && isObject(thrown.response)) {\n const r = thrown.response as { status?: number; data?: unknown };\n const status = typeof r.status === 'number' ? r.status : 0;\n const data = isObject(r.data) ? r.data : undefined;\n const message =\n (data && typeof data.message === 'string' ? data.message : undefined) ??\n (thrown instanceof Error ? thrown.message : undefined) ??\n `HTTP ${status}`;\n return new ApiError({\n message,\n status,\n code: data && typeof data.code === 'string' ? data.code : undefined,\n errors: data?.errors as unknown,\n isNetworkError: status === 0,\n isUnauthorized: status === 401,\n isValidationError: status === 422 || data?.errors !== undefined,\n raw: r.data ?? thrown,\n });\n }\n\n if (thrown instanceof Error) {\n return new ApiError({\n message: thrown.message,\n status: 0,\n isNetworkError: true,\n raw: thrown,\n });\n }\n\n return new ApiError({\n message: 'Unknown error',\n status: 0,\n raw: thrown,\n });\n}\n\n/**\n * Для 2xx ответа, в теле которого Laravel-style `{ status: false }`.\n * Возвращает ApiError(status: 200, ...). Вызывается из executeRequest\n * только при `throwOnError: true`.\n */\nexport function businessErrorToApiError(response: unknown): ApiError {\n if (!isObject(response)) {\n return new ApiError({ message: 'Request failed', status: 200, raw: response });\n }\n return new ApiError({\n message:\n typeof response.message === 'string' ? response.message : 'Request failed',\n status: 200,\n code: typeof response.code === 'string' ? response.code : undefined,\n errors: response.errors,\n isValidationError: response.errors !== undefined,\n raw: response,\n });\n}\n","import { getConfig } from './config';\nimport { ApiError, businessErrorToApiError, toApiError } from './errors';\n\nimport type { RequestConfig, ResponseWrapper } from './types';\n\n/**\n * Builds the endpoint URL from a string or function\n */\nexport function buildEndpoint<RequestParamsType>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n params?: RequestParamsType,\n): string {\n if (typeof endpoint === 'function' && typeof params !== 'undefined') {\n return endpoint(params);\n }\n return endpoint as string;\n}\n\ntype AxiosLikeError<E> = {\n response?: { status: number; data: E };\n message?: string;\n};\n\n/**\n * Executes an HTTP request with error handling and response wrapping.\n *\n * Поведение зависит от `throwOnError` в `configureApiClient`:\n * - false (default): возвращает `{ status: true, ... }` либо\n * `{ status: false, message?, errors? }`. Старое поведение.\n * - true: на HTTP >= 400 / сетевой ошибке / теле с `{ status: false }`\n * кидает `ApiError`.\n */\nexport async function executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n params?: RequestParamsType,\n signal?: AbortSignal,\n): Promise<ResponseWrapper<ResponseType, ErrorResponseType>> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n const url = buildEndpoint(endpoint, params);\n const config = getConfig();\n\n try {\n const requestConfig = { ...fetchConfig };\n let response: ResponseType;\n\n if (\n requestConfig.method?.toUpperCase() === 'GET' ||\n !requestConfig.method\n ) {\n response = await config.httpClient.get<ResponseType>(url, {\n params: {\n ...requestConfig.requestParams,\n ...(params as Record<string, string>),\n },\n signal,\n });\n } else {\n response = await config.httpClient.request<ResponseType>(url, {\n method: requestConfig.method,\n data: {\n ...requestConfig.requestParams,\n ...(params as Record<string, unknown>),\n },\n signal,\n });\n }\n\n // Бизнес-ошибка: 2xx, но в теле { status: false } (Laravel-style)\n const hasExplicitStatus =\n response &&\n typeof response === 'object' &&\n 'status' in (response as object) &&\n typeof (response as unknown as { status: unknown }).status === 'boolean';\n if (\n config.throwOnError &&\n hasExplicitStatus &&\n (response as unknown as { status: boolean }).status === false\n ) {\n throw businessErrorToApiError(response);\n }\n\n return { ...response, status: true } as RT;\n } catch (e) {\n // Уже наш ApiError — пробрасываем без модификаций\n if (e instanceof ApiError) {\n if (e.status === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n throw e;\n }\n\n const error = e as AxiosLikeError<ErrorResponseType>;\n const httpStatus = error.response?.status;\n\n if (httpStatus === 401 && config.onUnauthorized) {\n await config.onUnauthorized();\n }\n\n if (config.throwOnError) {\n throw toApiError(e);\n }\n\n if (error.response?.data) {\n return {\n ...(error.response.data as Record<string, unknown>),\n status: false,\n } as unknown as RT;\n }\n\n return {\n status: false,\n message: e instanceof Error ? e.message : 'Request error',\n } as unknown as RT;\n }\n}\n\n/**\n * Handles response success and error callbacks\n */\nexport function handleResponse<T, E = unknown>(\n result: ResponseWrapper<T, E>,\n onSuccess?: (data: ResponseWrapper<T, E>) => void,\n onError?: (error: Error) => void,\n): void {\n if (result.status && onSuccess) {\n onSuccess(result);\n } else if (!result.status && onError) {\n const err = new Error(result.message ?? 'Request failed');\n onError(err);\n }\n}\n","/**\n * Глобальный менеджер «фокуса» приложения.\n * - В вебе автоматически подключается к window focus/visibilitychange.\n * - В React Native интеграцию ставит сам потребитель через\n * `focusManager.setFocused(state === 'active')` из AppState.\n *\n * Подписчики (useFetch с refetchOnFocus / refetchOnAppActive) получают\n * уведомление при переходе в focused == true.\n */\ntype Listener = (focused: boolean) => void;\n\nclass FocusManager {\n private focused = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isFocused(): boolean {\n return this.focused;\n }\n\n setFocused(focused: boolean): void {\n if (this.focused === focused) return;\n this.focused = focused;\n for (const l of this.listeners) l(focused);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n const onFocus = () => this.setFocused(true);\n const onVisibility = () => {\n if (typeof document !== 'undefined') {\n this.setFocused(document.visibilityState !== 'hidden');\n }\n };\n window.addEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', onVisibility);\n }\n this.cleanup = () => {\n window.removeEventListener('focus', onFocus);\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', onVisibility);\n }\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const focusManager = new FocusManager();\nexport type { FocusManager };\n","/**\n * Глобальный менеджер сетевого статуса.\n * - В браузере подключается к window online/offline.\n * - В React Native интеграция — через NetInfo (опционально):\n * `NetInfo.addEventListener(s => onlineManager.setOnline(!!s.isConnected))`.\n * Жёсткой зависимости от NetInfo нет — без него по умолчанию online: true.\n *\n * Подписчики (useFetch с refetchOnReconnect) получают уведомление при\n * переходе offline → online.\n */\ntype Listener = (online: boolean) => void;\n\nclass OnlineManager {\n private online = true;\n private listeners = new Set<Listener>();\n private cleanup: (() => void) | null = null;\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n this.setupBrowserListeners();\n return () => {\n this.listeners.delete(listener);\n if (this.listeners.size === 0) this.teardownBrowserListeners();\n };\n }\n\n isOnline(): boolean {\n return this.online;\n }\n\n setOnline(online: boolean): void {\n if (this.online === online) return;\n this.online = online;\n for (const l of this.listeners) l(online);\n }\n\n private setupBrowserListeners(): void {\n if (this.cleanup) return;\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n ) {\n return;\n }\n // navigator.onLine может врать, но как initial state — ок\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n this.online = navigator.onLine;\n }\n const onOnline = () => this.setOnline(true);\n const onOffline = () => this.setOnline(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.cleanup = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n private teardownBrowserListeners(): void {\n this.cleanup?.();\n this.cleanup = null;\n }\n}\n\nexport const onlineManager = new OnlineManager();\nexport type { OnlineManager };\n","export type QueryKey = readonly unknown[];\n\n/**\n * Стабильная сериализация ключа кэша.\n * - Объекты сериализуются с сортировкой ключей.\n * - Массивы сохраняют порядок.\n * - Функции и symbol — недопустимы (как в TanStack Query), кидаем.\n * - undefined в массиве становится null, в объекте — поле пропускается.\n *\n * Пример: ['orders', { sort: 'date', dir: 'asc' }] и\n * ['orders', { dir: 'asc', sort: 'date' }] дают одинаковый hash.\n */\nexport function hashQueryKey(key: QueryKey): string {\n return JSON.stringify(key, (_, value) => {\n if (typeof value === 'function') {\n throw new Error(\n 'react-api-client: функции запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (typeof value === 'symbol') {\n throw new Error(\n 'react-api-client: symbol запрещены в queryKey — ключ должен быть сериализуем',\n );\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sortedKeys = Object.keys(value).sort();\n const result: Record<string, unknown> = {};\n for (const k of sortedKeys) {\n const v = (value as Record<string, unknown>)[k];\n if (v !== undefined) result[k] = v;\n }\n return result;\n }\n return value;\n });\n}\n\n/**\n * Проверяет, начинается ли `key` с `prefix`.\n * Используется для invalidateQueries по префиксу: ['orders'] матчит\n * и ['orders', 'manager'], и ['orders', 960].\n */\nexport function matchQueryKey(prefix: QueryKey, key: QueryKey): boolean {\n if (prefix.length > key.length) return false;\n for (let i = 0; i < prefix.length; i++) {\n if (hashQueryKey([prefix[i]]) !== hashQueryKey([key[i]])) return false;\n }\n return true;\n}","import { hashQueryKey, matchQueryKey, type QueryKey } from './key';\n\nexport type QueryStatus = 'idle' | 'loading' | 'success' | 'error';\n\nexport type QueryState<T> = {\n data: T | undefined;\n error: Error | null;\n status: QueryStatus;\n updatedAt: number;\n isStale: boolean;\n};\n\ntype Listener = () => void;\n\ntype QueryEntry<T> = {\n key: QueryKey;\n state: QueryState<T>;\n subscribers: Set<Listener>;\n inflight: Promise<T> | null;\n inflightController: AbortController | null;\n gcTimer: ReturnType<typeof setTimeout> | null;\n staleTime: number;\n gcTime: number;\n};\n\nexport type QueryFnContext = { signal: AbortSignal };\n/**\n * queryFn принимает контекст с AbortSignal. Если HTTP-клиент его\n * использует — отмена будет реальной; если игнорирует — поведение\n * деградирует до текущего (запрос идёт до конца, но кэш игнорирует результат).\n *\n * Для обратной совместимости старая сигнатура `() => Promise<T>` тоже\n * принимается — пакет просто не передаст signal внутрь.\n */\nexport type QueryFn<T> = (ctx: QueryFnContext) => Promise<T>;\n\nexport type FetchOptions = {\n staleTime?: number;\n gcTime?: number;\n /** Если true — игнорируем staleTime и форсим запрос */\n force?: boolean;\n};\n\nconst DEFAULT_GC_TIME = 5 * 60 * 1000;\nconst DEFAULT_STALE_TIME = 0;\n\n/**\n * In-memory кэш запросов с подпиской по ключу, dedupe inflight-промисов\n * и сборкой мусора через gcTime.\n */\nexport class QueryCache {\n private entries = new Map<string, QueryEntry<unknown>>();\n private globalListeners = new Set<Listener>();\n\n /**\n * Подписка на любое изменение кэша: setData, invalidate, remove,\n * успешный/ошибочный fetch. Используется persistQueryClient и\n * devtools-подобными адаптерами. Не дублирует `subscribe(key, ...)`.\n */\n subscribeAll(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private notifyGlobal() {\n for (const listener of this.globalListeners) listener();\n }\n\n private ensureEntry<T>(\n key: QueryKey,\n staleTime?: number,\n gcTime?: number,\n ): QueryEntry<T> {\n const hash = hashQueryKey(key);\n let entry = this.entries.get(hash) as QueryEntry<T> | undefined;\n if (!entry) {\n entry = {\n key,\n state: {\n data: undefined,\n error: null,\n status: 'idle',\n updatedAt: 0,\n isStale: true,\n },\n subscribers: new Set(),\n inflight: null,\n inflightController: null,\n gcTimer: null,\n staleTime: staleTime ?? DEFAULT_STALE_TIME,\n gcTime: gcTime ?? DEFAULT_GC_TIME,\n };\n this.entries.set(hash, entry as QueryEntry<unknown>);\n } else {\n // обновим только явно переданные параметры\n if (staleTime !== undefined) entry.staleTime = staleTime;\n if (gcTime !== undefined) entry.gcTime = gcTime;\n }\n return entry;\n }\n\n getState<T>(key: QueryKey): QueryState<T> | undefined {\n const entry = this.entries.get(hashQueryKey(key)) as\n | QueryEntry<T>\n | undefined;\n return entry?.state;\n }\n\n getData<T>(key: QueryKey): T | undefined {\n return this.getState<T>(key)?.data;\n }\n\n setData<T>(key: QueryKey, updater: T | ((prev: T | undefined) => T)): void {\n const entry = this.ensureEntry<T>(key);\n const next =\n typeof updater === 'function'\n ? (updater as (prev: T | undefined) => T)(entry.state.data)\n : updater;\n entry.state = {\n data: next,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n }\n\n /**\n * Подписка на изменения ключа. Возвращает unsubscribe.\n * Подписка останавливает GC таймер; отписка — запускает его обратно.\n */\n subscribe(key: QueryKey, listener: Listener): () => void {\n const entry = this.ensureEntry<unknown>(key);\n entry.subscribers.add(listener);\n if (entry.gcTimer) {\n clearTimeout(entry.gcTimer);\n entry.gcTimer = null;\n }\n return () => {\n entry.subscribers.delete(listener);\n if (entry.subscribers.size === 0) this.scheduleGc(entry);\n };\n }\n\n private notify<T>(entry: QueryEntry<T>) {\n for (const listener of entry.subscribers) listener();\n this.notifyGlobal();\n }\n\n private scheduleGc<T>(entry: QueryEntry<T>) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n if (entry.gcTime <= 0) {\n this.entries.delete(hashQueryKey(entry.key));\n return;\n }\n entry.gcTimer = setTimeout(() => {\n if (entry.subscribers.size === 0 && !entry.inflight) {\n this.entries.delete(hashQueryKey(entry.key));\n }\n }, entry.gcTime);\n }\n\n /**\n * Запускает или присоединяется к inflight-запросу.\n * Если данные свежие (не stale) и не force — отдаёт кэш без запроса.\n */\n async fetch<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options: FetchOptions = {},\n ): Promise<T> {\n const staleTime = options.staleTime ?? DEFAULT_STALE_TIME;\n const gcTime = options.gcTime ?? DEFAULT_GC_TIME;\n const entry = this.ensureEntry<T>(key, staleTime, gcTime);\n\n const isFresh =\n entry.state.status === 'success' &&\n !entry.state.isStale &&\n Date.now() - entry.state.updatedAt < staleTime;\n\n if (!options.force && isFresh && entry.state.data !== undefined) {\n return entry.state.data;\n }\n\n if (entry.inflight) return entry.inflight;\n\n entry.state = { ...entry.state, status: 'loading', error: null };\n this.notify(entry);\n\n const controller = new AbortController();\n const token = Symbol('inflight');\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken = token;\n entry.inflightController = controller;\n\n const isCurrent = () =>\n (entry as QueryEntry<T> & { inflightToken?: symbol }).inflightToken ===\n token;\n\n const myPromise: Promise<T> = (async () => {\n try {\n const data = await queryFn({ signal: controller.signal });\n if (!isCurrent()) return data;\n entry.state = {\n data,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isStale: false,\n };\n this.notify(entry);\n return data;\n } catch (err) {\n if (!isCurrent()) throw err;\n entry.state = {\n ...entry.state,\n status: 'error',\n error: err as Error,\n };\n this.notify(entry);\n throw err;\n } finally {\n if (isCurrent()) {\n entry.inflight = null;\n entry.inflightController = null;\n }\n }\n })();\n\n entry.inflight = myPromise;\n return myPromise;\n }\n\n /**\n * Помечает запись как stale. Сами по себе данные не удаляются.\n * Если есть подписчики — они получат уведомление, чтобы инициировать refetch.\n */\n invalidate(predicate: QueryKey | ((key: QueryKey) => boolean)): string[] {\n const invalidated: string[] = [];\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n\n for (const [hash, entry] of this.entries) {\n if (match(entry.key)) {\n entry.state = { ...entry.state, isStale: true };\n this.notify(entry);\n invalidated.push(hash);\n }\n }\n return invalidated;\n }\n\n /**\n * Отменяет «привязку» inflight-промиса к ключу. Сам HTTP-запрос\n * продолжит исполняться (executeRequest не использует AbortSignal),\n * но его результат больше не попадёт в кэш и не уведомит подписчиков.\n * Полезно при размонтировании / при переключении страниц.\n */\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n for (const entry of this.entries.values()) {\n if (match(entry.key) && entry.inflight) {\n // реальная отмена HTTP: вызываем abort на сохранённом controller\n entry.inflightController?.abort();\n entry.inflightController = null;\n entry.inflight = null;\n (entry as QueryEntry<unknown> & { inflightToken?: symbol })\n .inflightToken = undefined;\n if (entry.state.status === 'loading') {\n entry.state = { ...entry.state, status: 'idle' };\n this.notify(entry);\n }\n }\n }\n }\n\n /**\n * Полностью удаляет записи (даже с активными подписчиками).\n * Используется редко — обычно достаточно invalidate.\n */\n remove(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n const match =\n typeof predicate === 'function'\n ? predicate\n : (k: QueryKey) => matchQueryKey(predicate, k);\n let removed = false;\n for (const [hash, entry] of [...this.entries]) {\n if (match(entry.key)) {\n if (entry.gcTimer) clearTimeout(entry.gcTimer);\n this.entries.delete(hash);\n removed = true;\n }\n }\n if (removed) this.notifyGlobal();\n }\n\n /** Только для тестов / DevTools. */\n _debugEntries(): ReadonlyMap<string, QueryEntry<unknown>> {\n return this.entries;\n }\n\n /**\n * Сериализует записи со статусом success — для persistence.\n * inflight / loading / error не сохраняются, чтобы не гидратировать\n * приложение в полу-загруженном состоянии.\n */\n dehydrate(filter?: (key: QueryKey) => boolean): DehydratedState {\n const queries: DehydratedQuery[] = [];\n for (const entry of this.entries.values()) {\n if (entry.state.status !== 'success') continue;\n if (entry.state.data === undefined) continue;\n if (filter && !filter(entry.key)) continue;\n queries.push({\n key: entry.key as unknown[],\n data: entry.state.data,\n updatedAt: entry.state.updatedAt,\n });\n }\n return { queries };\n }\n\n hydrate(state: DehydratedState): void {\n for (const q of state.queries) {\n const entry = this.ensureEntry<unknown>(q.key);\n // не перетираем более свежие данные\n if (entry.state.updatedAt >= q.updatedAt && entry.state.data !== undefined) {\n continue;\n }\n entry.state = {\n data: q.data,\n error: null,\n status: 'success',\n updatedAt: q.updatedAt,\n isStale: true, // гидратированные данные сразу stale → фоновый refetch\n };\n this.notify(entry);\n }\n }\n}\n\nexport type DehydratedQuery = {\n key: unknown[];\n data: unknown;\n updatedAt: number;\n};\n\nexport type DehydratedState = {\n queries: DehydratedQuery[];\n};","import { QueryCache, type FetchOptions, type QueryFn } from './cache';\nimport type { QueryKey } from './key';\n\n/**\n * Высокоуровневый фасад над QueryCache: единый объект, который удобно\n * прокидывать через Provider и дергать из push-handler'ов / эффектов.\n *\n * Сами queryFn-ы здесь не регистрируются — refetchQueries требует, чтобы\n * либо подписчик сам перезапустил запрос (через subscribe), либо чтобы\n * вызвали fetchQuery с queryFn вручную. Это намеренно: хук React сам\n * знает, как собрать свой queryFn из endpoint/params.\n */\nexport class QueryClient {\n readonly cache: QueryCache;\n\n constructor(cache?: QueryCache) {\n this.cache = cache ?? new QueryCache();\n }\n\n getQueryData<T>(key: QueryKey): T | undefined {\n return this.cache.getData<T>(key);\n }\n\n setQueryData<T>(\n key: QueryKey,\n updater: T | ((prev: T | undefined) => T),\n ): void {\n this.cache.setData(key, updater);\n }\n\n fetchQuery<T>(\n key: QueryKey,\n queryFn: QueryFn<T>,\n options?: FetchOptions,\n ): Promise<T> {\n return this.cache.fetch(key, queryFn, options);\n }\n\n invalidateQueries(\n predicate: QueryKey | ((key: QueryKey) => boolean),\n ): void {\n this.cache.invalidate(predicate);\n }\n\n removeQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.remove(predicate);\n }\n\n cancelQueries(predicate: QueryKey | ((key: QueryKey) => boolean)): void {\n this.cache.cancelQueries(predicate);\n }\n}\n\nlet globalClient: QueryClient | null = null;\n\n/** Singleton-доступ для тех мест, где Provider недоступен (push-handler и т.п.). */\nexport function getQueryClient(): QueryClient {\n if (!globalClient) globalClient = new QueryClient();\n return globalClient;\n}\n\nexport function setQueryClient(client: QueryClient): void {\n globalClient = client;\n}","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { focusManager } from '../query/focus-manager';\nimport { onlineManager } from '../query/online-manager';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { getQueryClient } from '../query/client';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n} from '../types/index';\n\n/**\n * Hook for fetching data (GET requests).\n *\n * Поверх QueryCache: одинаковые queryKey разделяют один результат и один\n * inflight-promise. Поддерживает staleTime, refetchOnFocus,\n * pollingInterval, select.\n *\n * Возвращаемый тип { data, isLoading, isRefetching, error, refetch }\n * сохранён 1-в-1 с предыдущей версией — старые потребители продолжают работать.\n */\nexport function createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TSelected = RT>(\n params?: RequestParamsType,\n options: UseFetchOptions<RT, TSelected> = {},\n ): UseFetchResult<TSelected> => {\n const {\n enabled = true,\n refetchOnMount = true,\n refetchOnFocus = false,\n refetchOnAppActive = false,\n refetchOnReconnect = false,\n staleTime = 0,\n gcTime,\n pollingInterval,\n queryKey: customKey,\n select,\n onSuccess,\n onError,\n } = options;\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const queryKey = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(endpoint, params)\n : endpoint;\n return ['__endpoint__', endpointId, params ?? null];\n // params уже учтён через serializedParams ниже\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const client = getQueryClient();\n const cache = client.cache;\n\n // queryFn — стабилен относительно serializedParams, не пересоздаём\n // на каждый рендер. Принимает signal от QueryCache и пробрасывает\n // его в executeRequest → httpClient.\n const queryFn = useCallback(\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as RequestParamsType)\n : undefined;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, parsedParams, signal);\n },\n [serializedParams],\n );\n\n const initialState = cache.getState<RT>(queryKey);\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n\n // Подписка на изменения ключа — работает даже при enabled: false,\n // чтобы хук выступал read-only слушателем кэша. Полезно для\n // бейджей/счётчиков, которые читают тот же ключ, что пишут другие\n // экраны (см. JSDoc для `enabled`).\n //\n // На unmount: если стали последним подписчиком и запрос ещё inflight —\n // отменяем HTTP, чтобы не держать соединение зря.\n useEffect(() => {\n const unsub = cache.subscribe(queryKey, rerender);\n return () => {\n unsub();\n const state = cache._debugEntries().get(hashQueryKey(queryKey));\n if (state && state.subscribers.size === 0 && state.inflight) {\n cache.cancelQueries(queryKey);\n }\n };\n }, [cache, hashQueryKey(queryKey), rerender]);\n\n // Триггер запроса при mount / смене ключа / stale-инвалидации.\n const lastNotifiedRef = useRef<{\n success?: RT;\n errorHash?: string;\n }>({});\n\n const runFetch = useCallback(\n async (force: boolean) => {\n try {\n const data = await cache.fetch(queryKey, queryFn, {\n staleTime,\n gcTime,\n force,\n });\n // onSuccess / onError — на основе бизнес-статуса\n if (lastNotifiedRef.current.success !== data) {\n lastNotifiedRef.current.success = data;\n handleResponse<ResponseType, ErrorResponseType>(\n data,\n onSuccess,\n onError,\n );\n }\n } catch (err) {\n const e = err as Error;\n const hash = `${e.name}:${e.message}`;\n if (lastNotifiedRef.current.errorHash !== hash) {\n lastNotifiedRef.current.errorHash = hash;\n onError?.(e);\n }\n }\n },\n [cache, hashQueryKey(queryKey), queryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n useEffect(() => {\n if (!enabled || !refetchOnMount) return;\n void runFetch(false);\n }, [enabled, refetchOnMount, runFetch]);\n\n // Реакция на внешний invalidate: подписчик уже получил notify\n // (rerender), здесь смотрим isStale в кэше и догоняем запросом.\n const stateForEffect = cache.getState<RT>(queryKey);\n const isStale = stateForEffect?.isStale ?? false;\n const hasFetchedData = stateForEffect?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetch(true);\n }, [enabled, isStale, hasFetchedData, runFetch]);\n\n // refetchOnFocus / refetchOnAppActive — обе настройки висят на одном\n // focusManager (RN AppState → focusManager.setFocused). Если хоть одна\n // включена — подписываемся.\n useEffect(() => {\n if (!enabled) return;\n if (!refetchOnFocus && !refetchOnAppActive) return;\n const unsub = focusManager.subscribe(focused => {\n if (focused) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnFocus, refetchOnAppActive, runFetch]);\n\n // refetchOnReconnect: подписываемся на onlineManager.\n useEffect(() => {\n if (!enabled || !refetchOnReconnect) return;\n const unsub = onlineManager.subscribe(online => {\n if (online) void runFetch(false);\n });\n return unsub;\n }, [enabled, refetchOnReconnect, runFetch]);\n\n // Поллинг с авто-паузой при !focused.\n useEffect(() => {\n if (!enabled || !pollingInterval || pollingInterval <= 0) return;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const start = () => {\n if (timer) return;\n timer = setInterval(() => {\n if (focusManager.isFocused()) void runFetch(true);\n }, pollingInterval);\n };\n const stop = () => {\n if (timer) clearInterval(timer);\n timer = null;\n };\n\n start();\n const unsub = focusManager.subscribe(focused => {\n if (focused) start();\n else stop();\n });\n return () => {\n stop();\n unsub();\n };\n }, [enabled, pollingInterval, runFetch]);\n\n // Текущее состояние из кэша.\n const state = cache.getState<RT>(queryKey) ?? initialState;\n const rawData = state?.data ?? null;\n\n // select мемоизация: пересчёт только если rawData меняется ссылочно\n // или меняется select.\n const selectedData = useMemo<TSelected | null>(() => {\n if (rawData === null) return null;\n if (!select) return rawData as unknown as TSelected;\n return select(rawData);\n }, [rawData, select]);\n\n const status = state?.status ?? 'idle';\n const hasData = rawData !== null;\n const isLoading = status === 'loading' && !hasData;\n const isRefetching = status === 'loading' && hasData;\n const error = state?.error ?? null;\n\n const refetch = useCallback(async () => {\n await runFetch(true);\n }, [runFetch]);\n\n return {\n data: selectedData,\n isLoading: enabled ? isLoading : false,\n isRefetching,\n error,\n refetch,\n };\n };\n}\n","import { useCallback, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport { matchQueryKey, type QueryKey } from '../query/key';\nimport { executeRequest } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UseMutationOptions,\n UseMutationResult,\n} from '../types/index';\n\n/**\n * Hook for mutations (POST/PUT/PATCH/DELETE requests).\n *\n * Фаза 3:\n * - onMutate теперь может вернуть context — он передаётся в onError/onSettled\n * для rollback.\n * - setQueryData(client, vars, data) — точечный патч кэша после успеха.\n * - invalidateKeys — массив или функция, помечает указанные ключи stale;\n * подписанные useFetch сами догоняют запросом.\n */\nexport function createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return <TContext = unknown>(\n options: UseMutationOptions<RT, RequestParamsType, TContext> = {},\n ): UseMutationResult<RT, RequestParamsType> => {\n const {\n onMutate,\n onSuccess,\n onError,\n onSettled,\n invalidateKeys,\n setQueryData,\n } = options;\n\n const [data, setData] = useState<RT | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setIsLoading(false);\n setIsSuccess(false);\n setIsError(false);\n }, []);\n\n const applyInvalidate = useCallback(\n (vars: RequestParamsType, result: RT) => {\n if (!invalidateKeys) return;\n const client = getQueryClient();\n const keys =\n typeof invalidateKeys === 'function'\n ? invalidateKeys(vars, result)\n : invalidateKeys;\n if (keys.length === 0) return;\n client.invalidateQueries((k: QueryKey) =>\n keys.some(prefix => matchQueryKey(prefix, k)),\n );\n },\n [invalidateKeys],\n );\n\n const mutateAsync = useCallback(\n async (variables: RequestParamsType): Promise<RT> => {\n setIsLoading(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n let context: TContext | undefined;\n\n try {\n if (onMutate) {\n const ctx = await onMutate(variables);\n context = ctx as TContext | undefined;\n }\n\n const result = await executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, variables);\n\n setData(result);\n\n if (result.status) {\n setIsSuccess(true);\n // setQueryData — точечный патч кэша\n if (setQueryData) {\n setQueryData(getQueryClient(), variables, result);\n }\n // invalidateKeys — пометить stale и дать подписчикам догнать\n applyInvalidate(variables, result);\n\n if (onSuccess) {\n await onSuccess(result, variables, context);\n }\n } else {\n const err = new Error(result.message ?? 'Mutation failed');\n setIsError(true);\n setError(err);\n if (onError) {\n await onError(err, variables, context);\n }\n }\n\n if (onSettled) {\n await onSettled(result, null, variables, context);\n }\n\n return result;\n } catch (err) {\n const error = err as Error;\n setError(error);\n setIsError(true);\n setIsSuccess(false);\n\n if (onError) {\n await onError(error, variables, context);\n }\n if (onSettled) {\n await onSettled(null, error, variables, context);\n }\n\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [\n onMutate,\n onSuccess,\n onError,\n onSettled,\n setQueryData,\n applyInvalidate,\n ],\n );\n\n const mutateSync = useCallback(\n (variables: RequestParamsType) => {\n void mutateAsync(variables);\n },\n [mutateAsync],\n );\n\n return {\n data,\n error,\n isLoading,\n isSuccess,\n isError,\n mutate: mutateSync,\n mutateAsync,\n reset,\n };\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { getQueryClient } from '../query/client';\nimport { hashQueryKey, type QueryKey } from '../query/key';\nimport { buildEndpoint, executeRequest, handleResponse } from '../utils';\n\nimport type {\n RequestConfig,\n ResponseWrapper,\n UsePaginateOptions,\n UsePaginateResult,\n} from '../types/index';\n\n/**\n * Hook for paginated data fetching.\n *\n * Фаза 4: страницы кэшируются как отдельные записи под подключами вида\n * `[...prefix, { page, limit }]`. Это даёт:\n * - повторное открытие списка → данные из кэша мгновенно;\n * - keepPreviousData → плавная смена страницы;\n * - prefetchNextPage → префетч в кэш без визуального изменения.\n */\nexport function createUsePaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType,\n ErrorResponseType,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig,\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n) {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n return (\n params?: Omit<RequestParamsType, 'page' | 'limit'>,\n hookOptions: UsePaginateOptions<RT> = {},\n ): UsePaginateResult<TData> => {\n const {\n enabled = true,\n initialPage = 1,\n initialLimit = 20,\n staleTime = 0,\n gcTime,\n keepPreviousData = false,\n queryKey: customKey,\n onSuccess,\n onError,\n } = hookOptions;\n\n const client = getQueryClient();\n const cache = client.cache;\n\n const limit = initialLimit;\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const dataExtractor = useMemo(\n () =>\n options?.dataExtractor || ((response: ResponseType) => response.data),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const totalExtractor = useMemo(\n () =>\n options?.totalExtractor ||\n ((response: ResponseType) => response.total ?? 0),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const serializedParams = useMemo(\n () => (params === undefined ? null : JSON.stringify(params)),\n [params],\n );\n\n const keyPrefix = useMemo<QueryKey>(() => {\n if (customKey) return customKey;\n const endpointId =\n typeof endpoint === 'function'\n ? buildEndpoint<RequestParamsType>(\n endpoint,\n params as RequestParamsType,\n )\n : endpoint;\n return ['__paginate__', endpointId, params ?? null];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [customKey ? hashQueryKey(customKey) : null, serializedParams]);\n\n const pageKey = useCallback(\n (page: number): QueryKey => [...keyPrefix, { page, limit }],\n [keyPrefix, limit],\n );\n\n const pageQueryFn = useCallback(\n (page: number) =>\n ({ signal }: { signal: AbortSignal }) => {\n const parsedParams = serializedParams\n ? (JSON.parse(serializedParams) as Record<string, unknown>)\n : {};\n const requestParams = {\n ...parsedParams,\n page,\n limit,\n } as RequestParamsType;\n return executeRequest<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, requestParams, signal);\n },\n [serializedParams, limit],\n );\n\n // Подписка на ключ текущей страницы для rerender.\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(v => v + 1), []);\n useEffect(() => {\n if (!enabled) return;\n const unsub = cache.subscribe(pageKey(currentPage), rerender);\n return unsub;\n }, [cache, enabled, hashQueryKey(pageKey(currentPage)), rerender]);\n\n const previousPageKeyRef = useRef<QueryKey | null>(null);\n\n const runFetchPage = useCallback(\n async (page: number, isNextPage: boolean) => {\n try {\n if (isNextPage) setIsFetchingNextPage(true);\n setError(null);\n\n const result = await cache.fetch(pageKey(page), pageQueryFn(page), {\n staleTime,\n gcTime,\n });\n\n handleResponse<ResponseType, ErrorResponseType>(\n result,\n onSuccess,\n onError,\n );\n if (!result.status) {\n setError(new Error(result.message ?? 'Request failed'));\n return;\n }\n\n previousPageKeyRef.current = pageKey(page);\n setCurrentPage(page);\n } catch (err) {\n const e = err as Error;\n setError(e);\n onError?.(e);\n } finally {\n if (isNextPage) setIsFetchingNextPage(false);\n }\n },\n [cache, pageKey, pageQueryFn, staleTime, gcTime, onSuccess, onError],\n );\n\n // Первичный mount + смена params.\n useEffect(() => {\n if (!enabled) return;\n void runFetchPage(initialPage, false);\n setCurrentPage(initialPage);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, serializedParams, initialPage]);\n\n // Auto-refetch при isStale (внешний invalidateQueries).\n const currentState = cache.getState<RT>(pageKey(currentPage));\n const isStale = currentState?.isStale ?? false;\n const hasFetchedData = currentState?.data !== undefined;\n useEffect(() => {\n if (!enabled) return;\n if (isStale && hasFetchedData) void runFetchPage(currentPage, false);\n }, [enabled, isStale, hasFetchedData, currentPage, runFetchPage]);\n\n // Источник данных для UI с учётом keepPreviousData.\n const currentResult = currentState?.data;\n const usingPlaceholder =\n keepPreviousData &&\n !currentResult &&\n previousPageKeyRef.current !== null;\n const effectiveResult = usingPlaceholder\n ? cache.getData<RT>(previousPageKeyRef.current as QueryKey)\n : currentResult;\n\n const data: TData =\n effectiveResult && effectiveResult.status\n ? dataExtractor(effectiveResult as ResponseType)\n : ([] as unknown as TData);\n\n const totalCount =\n effectiveResult && effectiveResult.status\n ? totalExtractor(effectiveResult as ResponseType)\n : null;\n const total = totalCount;\n const totalPages = totalCount !== null ? Math.ceil(totalCount / limit) : null;\n const hasNextPage = totalPages !== null && currentPage < totalPages;\n const hasPreviousPage = currentPage > 1;\n\n const status = currentState?.status ?? 'idle';\n const isLoading = status === 'loading' && !hasFetchedData && !usingPlaceholder;\n\n const fetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n await runFetchPage(currentPage + 1, true);\n }, [hasNextPage, currentPage, runFetchPage]);\n\n const fetchPreviousPage = useCallback(async () => {\n if (!hasPreviousPage) return;\n await runFetchPage(currentPage - 1, false);\n }, [hasPreviousPage, currentPage, runFetchPage]);\n\n const prefetchNextPage = useCallback(async () => {\n if (!hasNextPage) return;\n // Просто складываем в кэш — не меняем currentPage, не показываем loading.\n await cache.fetch(\n pageKey(currentPage + 1),\n pageQueryFn(currentPage + 1),\n { staleTime, gcTime },\n );\n }, [hasNextPage, currentPage, cache, pageKey, pageQueryFn, staleTime, gcTime]);\n\n const refetch = useCallback(async () => {\n await cache.fetch(pageKey(currentPage), pageQueryFn(currentPage), {\n staleTime: 0,\n gcTime,\n force: true,\n });\n }, [cache, pageKey, pageQueryFn, currentPage, gcTime]);\n\n const reset = useCallback(() => {\n // Удаляем все страницы текущего префикса.\n cache.remove((k: QueryKey) => {\n if (k.length < keyPrefix.length) return false;\n for (let i = 0; i < keyPrefix.length; i++) {\n if (hashQueryKey([k[i]]) !== hashQueryKey([keyPrefix[i]])) return false;\n }\n return true;\n });\n previousPageKeyRef.current = null;\n setCurrentPage(initialPage);\n void runFetchPage(initialPage, false);\n }, [cache, keyPrefix, initialPage, runFetchPage]);\n\n return {\n data,\n currentPage,\n totalPages,\n total,\n hasNextPage,\n hasPreviousPage,\n isLoading: enabled ? isLoading : false,\n isFetchingNextPage,\n isPlaceholderData: usingPlaceholder,\n error,\n fetchNextPage,\n fetchPreviousPage,\n prefetchNextPage,\n refetch,\n reset,\n };\n };\n}\n","import type { DehydratedState } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\n/**\n * Storage-адаптер. Совместим с AsyncStorage и expo-secure-store:\n * { getItem(key): Promise<string|null>, setItem(key, value): Promise<void>,\n * removeItem(key): Promise<void> }.\n */\nexport interface PersistStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\nexport type PersistOptions = {\n client: QueryClient;\n storage: PersistStorage;\n /** Ключ в storage. По умолчанию 'react-api-client:cache'. */\n storageKey?: string;\n /** Дросселирование записи (ms). По умолчанию 1000. */\n throttleMs?: number;\n /** Фильтр ключей: что вообще сохранять. По умолчанию — всё. */\n allowList?: (key: QueryKey) => boolean;\n /** Максимальный возраст сохранённого снэпшота (ms). Старее — выбрасываем. */\n maxAge?: number;\n /**\n * Версия снэпшота. При несовпадении — снэпшот игнорируется и удаляется.\n * Поднимай при изменении формата данных в кэше.\n */\n version?: string | number;\n};\n\ntype Snapshot = {\n version?: string | number;\n savedAt: number;\n state: DehydratedState;\n};\n\n/**\n * Подключает QueryClient к persistent storage.\n *\n * С версии 2.0.0 — подписан на `cache.subscribeAll`, поэтому\n * автоматически сохраняет состояние через `throttleMs` после любого\n * изменения (setData, успешный fetch, invalidate, remove). Ручной\n * `persist()` остаётся доступным для критичных моментов (logout,\n * shutdown), но в обычном потоке не нужен.\n *\n * Возвращает:\n * - `restore()` — гидратирует кэш из storage. Вызывать на старте.\n * - `persist()` — форс-запись текущего состояния.\n * - `unsubscribe()` — отключить авто-сохранение.\n */\nexport function persistQueryClient(options: PersistOptions): {\n restore: () => Promise<void>;\n persist: () => Promise<void>;\n unsubscribe: () => void;\n} {\n const {\n client,\n storage,\n storageKey = 'react-api-client:cache',\n throttleMs = 1000,\n allowList,\n maxAge,\n version,\n } = options;\n\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let lastSerialized: string | null = null;\n let unsubscribed = false;\n\n const persist = async () => {\n const state = client.cache.dehydrate(allowList);\n if (state.queries.length === 0) return;\n const snap: Snapshot = { version, savedAt: Date.now(), state };\n const serialized = JSON.stringify(snap);\n if (serialized === lastSerialized) return;\n lastSerialized = serialized;\n await storage.setItem(storageKey, serialized);\n };\n\n const scheduleWrite = () => {\n if (unsubscribed) return;\n if (pendingTimer) return; // throttle: один таймер на окно\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void persist();\n }, throttleMs);\n };\n\n const restore = async () => {\n const raw = await storage.getItem(storageKey);\n if (!raw) return;\n try {\n const snap = JSON.parse(raw) as Snapshot;\n if (version !== undefined && snap.version !== version) {\n await storage.removeItem(storageKey);\n return;\n }\n if (maxAge && Date.now() - snap.savedAt > maxAge) {\n await storage.removeItem(storageKey);\n return;\n }\n client.cache.hydrate(snap.state);\n } catch {\n await storage.removeItem(storageKey);\n }\n };\n\n const unsubscribeFromCache = client.cache.subscribeAll(scheduleWrite);\n\n return {\n restore,\n persist,\n unsubscribe: () => {\n unsubscribed = true;\n unsubscribeFromCache();\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n },\n };\n}","import type { QueryCache, QueryStatus } from './cache';\nimport type { QueryClient } from './client';\nimport type { QueryKey } from './key';\n\nexport type CacheEntrySnapshot = {\n key: QueryKey;\n hash: string;\n status: QueryStatus;\n isStale: boolean;\n updatedAt: number;\n hasData: boolean;\n subscribers: number;\n hasInflight: boolean;\n errorMessage: string | null;\n};\n\n/**\n * Снимок состояния всего кэша — без приватных полей и без данных.\n * Удобно выводить в debug-экране или логировать.\n */\nexport function inspectCache(cache: QueryCache): CacheEntrySnapshot[] {\n const entries = cache._debugEntries();\n const snapshot: CacheEntrySnapshot[] = [];\n for (const [hash, entry] of entries) {\n snapshot.push({\n key: entry.key,\n hash,\n status: entry.state.status,\n isStale: entry.state.isStale,\n updatedAt: entry.state.updatedAt,\n hasData: entry.state.data !== undefined,\n subscribers: entry.subscribers.size,\n hasInflight: entry.inflight !== null,\n errorMessage: entry.state.error?.message ?? null,\n });\n }\n return snapshot;\n}\n\n/** «invalidate all» — пометить весь кэш как stale. */\nexport function invalidateAll(client: QueryClient): void {\n client.invalidateQueries(() => true);\n}\n\n/** Краткая сводка для логов: сколько записей, активных подписчиков, inflight. */\nexport function summarizeCache(cache: QueryCache): {\n total: number;\n withSubscribers: number;\n inflight: number;\n stale: number;\n byStatus: Record<QueryStatus, number>;\n} {\n const byStatus: Record<QueryStatus, number> = {\n idle: 0,\n loading: 0,\n success: 0,\n error: 0,\n };\n let withSubscribers = 0;\n let inflight = 0;\n let stale = 0;\n const entries = cache._debugEntries();\n for (const entry of entries.values()) {\n byStatus[entry.state.status]++;\n if (entry.subscribers.size > 0) withSubscribers++;\n if (entry.inflight) inflight++;\n if (entry.state.isStale) stale++;\n }\n return { total: entries.size, withSubscribers, inflight, stale, byStatus };\n}\n","import {\n createContext,\n createElement,\n useContext,\n useMemo,\n type ReactNode,\n} from 'react';\n\nimport { QueryClient, setQueryClient } from './client';\n\nconst QueryClientContext = createContext<QueryClient | null>(null);\n\nexport type ApiClientProviderProps = {\n client?: QueryClient;\n children: ReactNode;\n};\n\n/**\n * Корневой Provider пакета. Создаёт (или принимает) QueryClient и кладёт\n * его в React Context. Хуки достают клиент через useQueryClient().\n *\n * Также синхронизирует переданный client с singleton'ом\n * getQueryClient() — чтобы push-handler'ы вне React-дерева могли дергать\n * `getQueryClient().invalidateQueries(...)`.\n */\nexport function ApiClientProvider({\n client,\n children,\n}: ApiClientProviderProps) {\n const value = useMemo(() => {\n const instance = client ?? new QueryClient();\n setQueryClient(instance);\n return instance;\n }, [client]);\n\n return createElement(\n QueryClientContext.Provider,\n { value },\n children,\n );\n}\n\nexport function useQueryClient(): QueryClient {\n const ctx = useContext(QueryClientContext);\n if (!ctx) {\n throw new Error(\n 'useQueryClient: не найден ApiClientProvider. Оберни корень приложения в <ApiClientProvider>.',\n );\n }\n return ctx;\n}\n","import { executeRequest } from './utils';\n\nimport { createUseFetch, createUseMutation, createUsePaginate } from './hooks';\n\nimport type {\n ApiClientReturn,\n ApiMutationReturn,\n ApiPaginateReturn,\n RequestConfig,\n ResponseWrapper,\n} from './types';\n\n/**\n * Creates an API client for GET requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with fetch method and useFetch hook\n *\n * @example\n * const userApi = apiClient<User, { id: string }>('/api/users/:id')\n * const { data } = userApi.useFetch({ id: '123' })\n */\nfunction apiClient<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiClientReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const fetch = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useFetch = createUseFetch<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { fetch, useFetch };\n}\n\n/**\n * Creates an API client for mutation requests (POST/PUT/PATCH/DELETE)\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @returns Object with mutate method and useMutation hook\n *\n * @example\n * const createUserApi = apiMutation<User, CreateUserRequest>('/api/users', { method: 'POST' })\n * const { mutate, isLoading } = createUserApi.useMutation()\n */\nfunction apiMutation<\n ResponseType = void,\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n): ApiMutationReturn<ResponseType, RequestParamsType, ErrorResponseType> {\n type RT = ResponseWrapper<ResponseType, ErrorResponseType>;\n\n const mutate = async (params?: RequestParamsType): Promise<RT> => {\n return executeRequest<ResponseType, RequestParamsType, ErrorResponseType>(\n endpoint,\n fetchConfig,\n params,\n );\n };\n\n const useMutation = createUseMutation<\n ResponseType,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig);\n\n return { mutate, useMutation };\n}\n\n/**\n * Creates an API client for paginated requests\n * @param endpoint - URL string or function that generates URL from params\n * @param fetchConfig - Request configuration\n * @param options - Pagination options (data/total extractors)\n * @returns Object with usePaginate hook\n *\n * @example\n * const usersApi = apiPaginate<UsersResponse, User[], { search?: string }>('/api/users')\n * const { data, fetchNextPage, hasNextPage } = usersApi.usePaginate()\n */\nfunction apiPaginate<\n ResponseType extends { data: TData; total?: number; page?: number },\n TData extends unknown[],\n RequestParamsType = void,\n ErrorResponseType = unknown,\n>(\n endpoint: string | ((arg0: RequestParamsType) => string),\n fetchConfig: RequestConfig = {},\n options?: {\n dataExtractor?: (response: ResponseType) => TData;\n totalExtractor?: (response: ResponseType) => number;\n },\n): ApiPaginateReturn<\n ResponseType,\n RequestParamsType,\n TData,\n ErrorResponseType\n> {\n const usePaginate = createUsePaginate<\n ResponseType,\n TData,\n RequestParamsType,\n ErrorResponseType\n >(endpoint, fetchConfig, options);\n\n return { usePaginate };\n}\n\nexport default apiClient;\nexport { apiMutation, apiPaginate };\n\n// Export configuration\nexport { configureApiClient, getConfig, isConfigured } from './config';\n\n// Унифицированные ошибки (Фаза 3.5 + 1.2)\nexport { ApiError, toApiError, businessErrorToApiError } from './errors';\nexport type { ApiErrorInit } from './errors';\n\n// Query cache layer (Phase 1 + 2)\nexport {\n QueryCache,\n QueryClient,\n getQueryClient,\n setQueryClient,\n hashQueryKey,\n matchQueryKey,\n focusManager,\n onlineManager,\n ApiClientProvider,\n useQueryClient,\n persistQueryClient,\n inspectCache,\n invalidateAll,\n summarizeCache,\n} from './query';\nexport type {\n FetchOptions,\n QueryFn,\n QueryKey,\n QueryState,\n QueryStatus,\n ApiClientProviderProps,\n DehydratedQuery,\n DehydratedState,\n PersistOptions,\n PersistStorage,\n CacheEntrySnapshot,\n} from './query';\n\n// Re-export types for convenience\nexport type {\n ResponseWrapper,\n UseFetchOptions,\n UseFetchResult,\n UseMutationOptions,\n UseMutationResult,\n UsePaginateOptions,\n UsePaginateResult,\n ApiClientConfig,\n IHttpClient,\n} from './types';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krymskyimaksym/react-api-client",
3
- "version": "1.0.0",
3
+ "version": "2.0.0-beta.1",
4
4
  "description": "A lightweight, type-safe API client for React and React Native with built-in hooks",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -53,6 +53,7 @@
53
53
  "react": ">=16.8.0"
54
54
  },
55
55
  "devDependencies": {
56
+ "@testing-library/react": "^14.3.1",
56
57
  "@types/node": "^20.11.0",
57
58
  "@types/react": "^18.2.48",
58
59
  "@typescript-eslint/eslint-plugin": "^6.19.0",
@@ -61,7 +62,10 @@
61
62
  "eslint-config-prettier": "^9.1.0",
62
63
  "eslint-plugin-prettier": "^5.1.3",
63
64
  "eslint-plugin-react-hooks": "^4.6.0",
65
+ "jsdom": "^24.1.3",
64
66
  "prettier": "^3.2.4",
67
+ "react": "^18.3.1",
68
+ "react-dom": "^18.3.1",
65
69
  "tsup": "^8.0.1",
66
70
  "typescript": "^5.3.3",
67
71
  "vitest": "^1.2.0"
@@ -69,4 +73,4 @@
69
73
  "engines": {
70
74
  "node": ">=16.0.0"
71
75
  }
72
- }
76
+ }