/** * Actor Hooks Factory - Creates a full set of React hooks for a reactor instance. * * This is the primary entry point for using the library in React applications. * It generates type-safe hooks for: * - Queries (useActorQuery) * - Suspense Queries (useActorSuspenseQuery) * - Infinite Queries (useActorInfiniteQuery) * - Suspense Infinite Queries (useActorSuspenseInfiniteQuery) * - Mutations (useActorMutation) * * @example * const { useActorQuery, useActorMutation } = createActorHooks(reactor) * * // In component * const { data } = useActorQuery({ functionName: 'get_user' }) * const { mutate } = useActorMutation({ functionName: 'update_user' }) */ import { Reactor, DisplayReactor, ReactorReturnErr, ReactorReturnOk, BaseActor, FunctionName, TransformKey, } from "@ic-reactor/core" import { UseQueryResult, UseSuspenseQueryResult, UseInfiniteQueryResult, UseSuspenseInfiniteQueryResult, UseMutationResult, InfiniteData, } from "@tanstack/react-query" import { useActorQuery } from "./hooks/useActorQuery" import { useActorSuspenseQuery } from "./hooks/useActorSuspenseQuery" import { useActorInfiniteQuery } from "./hooks/useActorInfiniteQuery" import { useActorSuspenseInfiniteQuery } from "./hooks/useActorSuspenseInfiniteQuery" import { useActorMutation } from "./hooks/useActorMutation" import { useActorMethod, UseActorMethodParameters, } from "./hooks/useActorMethod" import { InfiniteQueryConfig } from "./createInfiniteQuery" import { SuspenseInfiniteQueryConfig } from "./createSuspenseInfiniteQuery" import { QueryConfig, SuspenseQueryConfig, MutationConfig } from "./types" export type ActorHooks = { useActorQuery: { >( config: QueryConfig> ): UseQueryResult, ReactorReturnErr> , TData>( config: QueryConfig ): UseQueryResult> } useActorSuspenseQuery: { >( config: SuspenseQueryConfig> ): UseSuspenseQueryResult< ReactorReturnOk, ReactorReturnErr > , TData>( config: SuspenseQueryConfig ): UseSuspenseQueryResult> } useActorInfiniteQuery: , TPageParam = unknown>( config: InfiniteQueryConfig ) => UseInfiniteQueryResult< InfiniteData, TPageParam>, ReactorReturnErr > useActorSuspenseInfiniteQuery: < M extends FunctionName, TPageParam = unknown, >( config: SuspenseInfiniteQueryConfig ) => UseSuspenseInfiniteQueryResult< InfiniteData, TPageParam>, ReactorReturnErr > useActorMutation: >( config: MutationConfig ) => UseMutationResult, ReactorReturnErr> useActorMethod: >( config: Omit, "reactor"> ) => ReturnType> } export function createActorHooks( reactor: DisplayReactor ): ActorHooks export function createActorHooks< A = BaseActor, T extends TransformKey = "candid", >(reactor: Reactor): ActorHooks export function createActorHooks( reactor: Reactor ): ActorHooks { return { useActorQuery: ((config: any) => useActorQuery({ ...config, reactor })) as ActorHooks< A, T >["useActorQuery"], useActorSuspenseQuery: ((config: any) => useActorSuspenseQuery({ ...config, reactor })) as ActorHooks< A, T >["useActorSuspenseQuery"], useActorInfiniteQuery: ((config: any) => useActorInfiniteQuery({ ...config, reactor })) as ActorHooks< A, T >["useActorInfiniteQuery"], useActorSuspenseInfiniteQuery: ((config: any) => useActorSuspenseInfiniteQuery({ ...config, reactor })) as ActorHooks< A, T >["useActorSuspenseInfiniteQuery"], useActorMutation: ((config: any) => useActorMutation({ ...config, reactor })) as ActorHooks< A, T >["useActorMutation"], useActorMethod: (config) => useActorMethod({ ...config, reactor } as UseActorMethodParameters< A, any, T >), } }