@openapi-qraft/react
Version:
OpenAPI client for React, providing type-safe requests and dynamic TanStack Query React Hooks via a modular, Proxy-based architecture.
59 lines (51 loc) • 1.95 kB
text/typescript
'use client';
import type { ServiceOperationQueryKey } from '@openapi-qraft/tanstack-query-react-types';
import type { QueryClient, UseQueryOptions } from '@tanstack/react-query';
import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
import type { OperationSchema } from './requestFn.js';
import { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';
import { composeQueryKey } from './composeQueryKey.js';
import { prepareRequestFnParameters } from './prepareRequestFnParameters.js';
import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
import { requestFnResponseResolver } from './requestFnResponseResolver.js';
/**
* Composes the options for useQuery, useInfiniteQuery, useSuspenseQuery, and useSuspenseQueries.
* @internal
*/
export function useComposeUseQueryOptions(
qraftOptions: CreateAPIQueryClientOptions,
schema: OperationSchema,
args: UseQueryOptionsArgs,
infinite: boolean
): never {
const [parameters, options] = args;
const queryFn =
options?.queryFn ??
function ({ queryKey: [, queryParams], signal, meta, pageParam }) {
const { parameters, body } = prepareRequestFnParameters(
queryParams,
pageParam,
infinite
);
return qraftOptions
.requestFn(schema, {
parameters: parameters as never,
baseUrl: qraftOptions.baseUrl,
body,
signal,
meta,
})
.then(requestFnResponseResolver, requestFnResponseRejecter);
};
const queryKey = Array.isArray(parameters)
? (parameters as ServiceOperationQueryKey<OperationSchema, unknown>)
: infinite
? composeInfiniteQueryKey(schema, parameters)
: composeQueryKey(schema, parameters);
return [{ ...options, queryFn, queryKey }, qraftOptions.queryClient] as never;
}
type UseQueryOptionsArgs = [
parameters: unknown,
options?: UseQueryOptions,
queryClient?: QueryClient,
];