@ic-reactor/react 2.0.1 → 3.0.0-beta.2
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.
- package/README.md +283 -87
- package/dist/createActorHooks.d.ts +39 -0
- package/dist/createActorHooks.d.ts.map +1 -0
- package/dist/createActorHooks.js +30 -0
- package/dist/createActorHooks.js.map +1 -0
- package/dist/createAuthHooks.d.ts +37 -0
- package/dist/createAuthHooks.d.ts.map +1 -0
- package/dist/createAuthHooks.js +94 -0
- package/dist/createAuthHooks.js.map +1 -0
- package/dist/createInfiniteQuery.d.ts +129 -0
- package/dist/createInfiniteQuery.d.ts.map +1 -0
- package/dist/createInfiniteQuery.js +160 -0
- package/dist/createInfiniteQuery.js.map +1 -0
- package/dist/createMutation.d.ts +19 -0
- package/dist/createMutation.d.ts.map +1 -0
- package/dist/createMutation.js +98 -0
- package/dist/createMutation.js.map +1 -0
- package/dist/createQuery.d.ts +20 -0
- package/dist/createQuery.d.ts.map +1 -0
- package/dist/createQuery.js +111 -0
- package/dist/createQuery.js.map +1 -0
- package/dist/createSuspenseInfiniteQuery.d.ts +122 -0
- package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -0
- package/dist/createSuspenseInfiniteQuery.js +160 -0
- package/dist/createSuspenseInfiniteQuery.js.map +1 -0
- package/dist/createSuspenseQuery.d.ts +25 -0
- package/dist/createSuspenseQuery.d.ts.map +1 -0
- package/dist/createSuspenseQuery.js +116 -0
- package/dist/createSuspenseQuery.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -2
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -18
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useActorInfiniteQuery.d.ts +37 -0
- package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -0
- package/dist/hooks/useActorInfiniteQuery.js +33 -0
- package/dist/hooks/useActorInfiniteQuery.js.map +1 -0
- package/dist/hooks/useActorMutation.d.ts +23 -0
- package/dist/hooks/useActorMutation.d.ts.map +1 -0
- package/dist/hooks/useActorMutation.js +39 -0
- package/dist/hooks/useActorMutation.js.map +1 -0
- package/dist/hooks/useActorQuery.d.ts +32 -0
- package/dist/hooks/useActorQuery.d.ts.map +1 -0
- package/dist/hooks/useActorQuery.js +35 -0
- package/dist/hooks/useActorQuery.js.map +1 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +36 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.js +33 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -0
- package/dist/hooks/useActorSuspenseQuery.d.ts +32 -0
- package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -0
- package/dist/hooks/useActorSuspenseQuery.js +36 -0
- package/dist/hooks/useActorSuspenseQuery.js.map +1 -0
- package/dist/index.d.ts +11 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -49
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +232 -13
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -22
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +131 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +125 -0
- package/dist/validation.js.map +1 -0
- package/package.json +70 -35
- package/LICENSE.md +0 -8
- package/dist/context/actor/create.d.ts +0 -63
- package/dist/context/actor/create.js +0 -119
- package/dist/context/actor/hooks/useActorInterface.d.ts +0 -4
- package/dist/context/actor/hooks/useActorInterface.js +0 -10
- package/dist/context/actor/hooks/useActorState.d.ts +0 -21
- package/dist/context/actor/hooks/useActorState.js +0 -25
- package/dist/context/actor/hooks/useActorStore.d.ts +0 -32
- package/dist/context/actor/hooks/useActorStore.js +0 -36
- package/dist/context/actor/hooks/useInitializeActor.d.ts +0 -6
- package/dist/context/actor/hooks/useInitializeActor.js +0 -10
- package/dist/context/actor/hooks/useMethod.d.ts +0 -29
- package/dist/context/actor/hooks/useMethod.js +0 -34
- package/dist/context/actor/hooks/useMethodAttributes.d.ts +0 -7
- package/dist/context/actor/hooks/useMethodAttributes.js +0 -11
- package/dist/context/actor/hooks/useMethodNames.d.ts +0 -7
- package/dist/context/actor/hooks/useMethodNames.js +0 -11
- package/dist/context/actor/hooks/useQueryCall.d.ts +0 -28
- package/dist/context/actor/hooks/useQueryCall.js +0 -33
- package/dist/context/actor/hooks/useUpdateCall.d.ts +0 -29
- package/dist/context/actor/hooks/useUpdateCall.js +0 -34
- package/dist/context/actor/hooks/useVisitMethod.d.ts +0 -8
- package/dist/context/actor/hooks/useVisitMethod.js +0 -13
- package/dist/context/actor/hooks/useVisitService.d.ts +0 -8
- package/dist/context/actor/hooks/useVisitService.js +0 -13
- package/dist/context/actor/index.d.ts +0 -16
- package/dist/context/actor/index.js +0 -33
- package/dist/context/actor/provider.d.ts +0 -71
- package/dist/context/actor/provider.js +0 -75
- package/dist/context/actor/types.d.ts +0 -35
- package/dist/context/actor/types.js +0 -2
- package/dist/context/adapter/create.d.ts +0 -2
- package/dist/context/adapter/create.js +0 -102
- package/dist/context/adapter/hooks/useCandidAdapter.d.ts +0 -23
- package/dist/context/adapter/hooks/useCandidAdapter.js +0 -27
- package/dist/context/adapter/hooks/useCandidEvaluation.d.ts +0 -5
- package/dist/context/adapter/hooks/useCandidEvaluation.js +0 -9
- package/dist/context/adapter/index.d.ts +0 -6
- package/dist/context/adapter/index.js +0 -24
- package/dist/context/adapter/provider.d.ts +0 -23
- package/dist/context/adapter/provider.js +0 -27
- package/dist/context/adapter/types.d.ts +0 -52
- package/dist/context/adapter/types.js +0 -2
- package/dist/context/agent/create.d.ts +0 -74
- package/dist/context/agent/create.js +0 -104
- package/dist/context/agent/hooks/useAgent.d.ts +0 -14
- package/dist/context/agent/hooks/useAgent.js +0 -18
- package/dist/context/agent/hooks/useAgentManager.d.ts +0 -14
- package/dist/context/agent/hooks/useAgentManager.js +0 -18
- package/dist/context/agent/hooks/useAgentState.d.ts +0 -21
- package/dist/context/agent/hooks/useAgentState.js +0 -25
- package/dist/context/agent/hooks/useAuth.d.ts +0 -57
- package/dist/context/agent/hooks/useAuth.js +0 -61
- package/dist/context/agent/hooks/useAuthState.d.ts +0 -19
- package/dist/context/agent/hooks/useAuthState.js +0 -23
- package/dist/context/agent/hooks/useUserPrincipal.d.ts +0 -17
- package/dist/context/agent/hooks/useUserPrincipal.js +0 -21
- package/dist/context/agent/index.d.ts +0 -12
- package/dist/context/agent/index.js +0 -29
- package/dist/context/agent/provider.d.ts +0 -28
- package/dist/context/agent/provider.js +0 -32
- package/dist/context/agent/types.d.ts +0 -17
- package/dist/context/agent/types.js +0 -2
- package/dist/core.d.ts +0 -1
- package/dist/core.js +0 -9
- package/dist/createReactor.d.ts +0 -49
- package/dist/createReactor.js +0 -69
- package/dist/helpers/actorHooks.d.ts +0 -18
- package/dist/helpers/actorHooks.js +0 -283
- package/dist/helpers/agentHooks.d.ts +0 -3
- package/dist/helpers/agentHooks.js +0 -22
- package/dist/helpers/authHooks.d.ts +0 -2
- package/dist/helpers/authHooks.js +0 -120
- package/dist/helpers/extractActorContext.d.ts +0 -4
- package/dist/helpers/extractActorContext.js +0 -44
- package/dist/helpers/extractAgentContext.d.ts +0 -28
- package/dist/helpers/extractAgentContext.js +0 -59
- package/dist/helpers/index.d.ts +0 -5
- package/dist/helpers/index.js +0 -21
- package/dist/helpers/types.d.ts +0 -222
- package/dist/helpers/types.js +0 -2
- package/dist/hooks/types.d.ts +0 -22
- package/dist/hooks/types.js +0 -2
- package/dist/hooks/useActor.d.ts +0 -67
- package/dist/hooks/useActor.js +0 -197
- package/dist/hooks/useActorManager.d.ts +0 -68
- package/dist/hooks/useActorManager.js +0 -75
- package/dist/utils.d.ts +0 -1
- package/dist/utils.js +0 -17
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infinite Query Factory - Generic wrapper for React Query paginated canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any paginated canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const postsQuery = createInfiniteQuery(reactor, {
|
|
9
|
+
* functionName: "get_posts",
|
|
10
|
+
* initialPageParam: 0,
|
|
11
|
+
* getArgs: (cursor) => [{ cursor, limit: 10 }],
|
|
12
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* // In component
|
|
16
|
+
* const { data, fetchNextPage, hasNextPage } = postsQuery.useInfiniteQuery()
|
|
17
|
+
*
|
|
18
|
+
* // Flatten all pages
|
|
19
|
+
* const allPosts = data?.pages.flatMap(page => page.posts)
|
|
20
|
+
*
|
|
21
|
+
* // Invalidate cache
|
|
22
|
+
* postsQuery.refetch()
|
|
23
|
+
*/
|
|
24
|
+
import type { Reactor, FunctionName, ReactorArgs, BaseActor, TransformKey, ReactorReturnOk, ReactorReturnErr } from "@ic-reactor/core";
|
|
25
|
+
import { QueryKey, InfiniteData, UseInfiniteQueryResult, UseInfiniteQueryOptions } from "@tanstack/react-query";
|
|
26
|
+
import { CallConfig } from "@icp-sdk/core/agent";
|
|
27
|
+
import { NoInfer } from "./types";
|
|
28
|
+
/** The raw page data type returned by the query function */
|
|
29
|
+
export type InfiniteQueryPageData<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnOk<A, M, T>;
|
|
30
|
+
/** The error type for infinite queries */
|
|
31
|
+
export type InfiniteQueryError<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnErr<A, M, T>;
|
|
32
|
+
/**
|
|
33
|
+
* Configuration for createActorInfiniteQuery.
|
|
34
|
+
*
|
|
35
|
+
* @template A - The actor interface type
|
|
36
|
+
* @template M - The method name on the actor
|
|
37
|
+
* @template T - The transformation key (identity, display, etc.)
|
|
38
|
+
* @template TPageParam - The type of the page parameter
|
|
39
|
+
* @template TSelected - The type returned after select transformation
|
|
40
|
+
*/
|
|
41
|
+
export interface InfiniteQueryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>> {
|
|
42
|
+
/** The method to call on the canister */
|
|
43
|
+
functionName: M;
|
|
44
|
+
/** Call configuration for the actor method */
|
|
45
|
+
callConfig?: CallConfig;
|
|
46
|
+
/** Custom query key (optional, auto-generated if not provided) */
|
|
47
|
+
queryKey?: QueryKey;
|
|
48
|
+
/** Initial page parameter */
|
|
49
|
+
initialPageParam: TPageParam;
|
|
50
|
+
/** Function to get args from page parameter */
|
|
51
|
+
getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>;
|
|
52
|
+
/** Function to determine next page parameter */
|
|
53
|
+
getNextPageParam: (lastPage: InfiniteQueryPageData<A, M, T>, allPages: InfiniteQueryPageData<A, M, T>[], lastPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
54
|
+
/** Function to determine previous page parameter (for bi-directional) */
|
|
55
|
+
getPreviousPageParam?: (firstPage: InfiniteQueryPageData<A, M, T>, allPages: InfiniteQueryPageData<A, M, T>[], firstPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
56
|
+
/** Maximum number of pages to keep in cache */
|
|
57
|
+
maxPages?: number;
|
|
58
|
+
/** How long data stays fresh before refetching (default: 5 min) */
|
|
59
|
+
staleTime?: number;
|
|
60
|
+
/** Transform the raw InfiniteData result before returning */
|
|
61
|
+
select?: (data: InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>) => TSelected;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Configuration for createActorInfiniteQueryFactory (without initialPageParam, getArgs determined at call time).
|
|
65
|
+
*/
|
|
66
|
+
export type InfiniteQueryFactoryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>> = Omit<InfiniteQueryConfig<A, M, T, TPageParam, TSelected>, "getArgs">;
|
|
67
|
+
/**
|
|
68
|
+
* useInfiniteQuery hook with chained select support.
|
|
69
|
+
*/
|
|
70
|
+
export interface UseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
|
|
71
|
+
(options?: Omit<UseInfiniteQueryOptions<TPageData, TError, TSelected, QueryKey, TPageParam>, "select" | "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam">): UseInfiniteQueryResult<TSelected, TError>;
|
|
72
|
+
<TFinal = TSelected>(options: Omit<UseInfiniteQueryOptions<TPageData, TError, TFinal, QueryKey, TPageParam>, "queryKey" | "queryFn" | "select" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam"> & {
|
|
73
|
+
select: (data: TSelected) => TFinal;
|
|
74
|
+
}): UseInfiniteQueryResult<TFinal, TError>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Result from createActorInfiniteQuery
|
|
78
|
+
*
|
|
79
|
+
* @template TPageData - The raw page data type
|
|
80
|
+
* @template TPageParam - The page parameter type
|
|
81
|
+
* @template TSelected - The type after select transformation
|
|
82
|
+
* @template TError - The error type
|
|
83
|
+
*/
|
|
84
|
+
export interface InfiniteQueryResult<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
|
|
85
|
+
/** Fetch first page in loader (uses ensureQueryData for cache-first) */
|
|
86
|
+
fetch: () => Promise<TSelected>;
|
|
87
|
+
/** React hook for components - supports pagination */
|
|
88
|
+
useInfiniteQuery: UseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected, TError>;
|
|
89
|
+
/** Invalidate and refetch cache */
|
|
90
|
+
refetch: () => Promise<void>;
|
|
91
|
+
/** Get query key (for advanced React Query usage) */
|
|
92
|
+
getQueryKey: () => QueryKey;
|
|
93
|
+
/**
|
|
94
|
+
* Read data directly from cache without fetching.
|
|
95
|
+
* Returns undefined if data is not in cache.
|
|
96
|
+
*/
|
|
97
|
+
getCacheData: {
|
|
98
|
+
(): TSelected | undefined;
|
|
99
|
+
<TFinal>(select: (data: TSelected) => TFinal): TFinal | undefined;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export declare function createInfiniteQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: InfiniteQueryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): InfiniteQueryResult<InfiniteQueryPageData<A, M, T>, TPageParam, TSelected, InfiniteQueryError<A, M, T>>;
|
|
103
|
+
/**
|
|
104
|
+
* Create an infinite query factory that accepts getArgs at call time.
|
|
105
|
+
* Useful when pagination logic varies by context.
|
|
106
|
+
*
|
|
107
|
+
* @template A - The actor interface type
|
|
108
|
+
* @template M - The method name on the actor
|
|
109
|
+
* @template T - The transformation key (identity, display, etc.)
|
|
110
|
+
* @template TPageParam - The page parameter type
|
|
111
|
+
* @template TSelected - The type returned after select transformation
|
|
112
|
+
*
|
|
113
|
+
* @param reactor - The Reactor instance
|
|
114
|
+
* @param config - Infinite query configuration (without getArgs)
|
|
115
|
+
* @returns A function that accepts getArgs and returns an ActorInfiniteQueryResult
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* const getPostsQuery = createActorInfiniteQueryFactory(reactor, {
|
|
119
|
+
* functionName: "get_posts",
|
|
120
|
+
* initialPageParam: 0,
|
|
121
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
122
|
+
* })
|
|
123
|
+
*
|
|
124
|
+
* // Create query with specific args builder
|
|
125
|
+
* const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
|
|
126
|
+
* const { data, fetchNextPage } = userPostsQuery.useInfiniteQuery()
|
|
127
|
+
*/
|
|
128
|
+
export declare function createInfiniteQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: InfiniteQueryFactoryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): (getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>) => InfiniteQueryResult<InfiniteQueryPageData<A, M, T>, TPageParam, TSelected, InfiniteQueryError<A, M, T>>;
|
|
129
|
+
//# sourceMappingURL=createInfiniteQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInfiniteQuery.d.ts","sourceRoot":"","sources":["../src/createInfiniteQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infinite Query Factory - Generic wrapper for React Query paginated canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any paginated canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const postsQuery = createInfiniteQuery(reactor, {
|
|
9
|
+
* functionName: "get_posts",
|
|
10
|
+
* initialPageParam: 0,
|
|
11
|
+
* getArgs: (cursor) => [{ cursor, limit: 10 }],
|
|
12
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* // In component
|
|
16
|
+
* const { data, fetchNextPage, hasNextPage } = postsQuery.useInfiniteQuery()
|
|
17
|
+
*
|
|
18
|
+
* // Flatten all pages
|
|
19
|
+
* const allPosts = data?.pages.flatMap(page => page.posts)
|
|
20
|
+
*
|
|
21
|
+
* // Invalidate cache
|
|
22
|
+
* postsQuery.refetch()
|
|
23
|
+
*/
|
|
24
|
+
import { useInfiniteQuery, } from "@tanstack/react-query";
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Internal Implementation
|
|
27
|
+
// ============================================================================
|
|
28
|
+
const createInfiniteQueryImpl = (reactor, config) => {
|
|
29
|
+
const { functionName, callConfig, queryKey: customQueryKey, initialPageParam, getArgs, getNextPageParam, getPreviousPageParam, maxPages, staleTime = 5 * 60 * 1000, select, } = config;
|
|
30
|
+
// Get query key from actor manager
|
|
31
|
+
const getQueryKey = () => {
|
|
32
|
+
return reactor.generateQueryKey({
|
|
33
|
+
functionName,
|
|
34
|
+
queryKey: customQueryKey,
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
// Query function - accepts QueryFunctionContext
|
|
38
|
+
const queryFn = async (context) => {
|
|
39
|
+
// pageParam is typed as unknown in QueryFunctionContext, but we know its type
|
|
40
|
+
const pageParam = context.pageParam;
|
|
41
|
+
const args = getArgs(pageParam);
|
|
42
|
+
const result = await reactor.callMethod({
|
|
43
|
+
functionName,
|
|
44
|
+
args,
|
|
45
|
+
callConfig,
|
|
46
|
+
});
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
// Get infinite query options for fetchInfiniteQuery
|
|
50
|
+
const getInfiniteQueryOptions = () => ({
|
|
51
|
+
queryKey: getQueryKey(),
|
|
52
|
+
queryFn,
|
|
53
|
+
initialPageParam,
|
|
54
|
+
getNextPageParam,
|
|
55
|
+
});
|
|
56
|
+
// Fetch function for loaders (cache-first, fetches first page)
|
|
57
|
+
const fetch = async () => {
|
|
58
|
+
// Check cache first
|
|
59
|
+
const cachedData = reactor.queryClient.getQueryData(getQueryKey());
|
|
60
|
+
if (cachedData !== undefined) {
|
|
61
|
+
return select ? select(cachedData) : cachedData;
|
|
62
|
+
}
|
|
63
|
+
// Fetch if not in cache
|
|
64
|
+
const result = await reactor.queryClient.fetchInfiniteQuery(getInfiniteQueryOptions());
|
|
65
|
+
// Result is already InfiniteData format
|
|
66
|
+
return select ? select(result) : result;
|
|
67
|
+
};
|
|
68
|
+
// Implementation
|
|
69
|
+
const useInfiniteQueryHook = (options) => {
|
|
70
|
+
// Chain the selects: raw -> config.select -> options.select
|
|
71
|
+
const chainedSelect = (rawData) => {
|
|
72
|
+
const firstPass = select ? select(rawData) : rawData;
|
|
73
|
+
if (options?.select) {
|
|
74
|
+
return options.select(firstPass);
|
|
75
|
+
}
|
|
76
|
+
return firstPass;
|
|
77
|
+
};
|
|
78
|
+
return useInfiniteQuery({
|
|
79
|
+
queryKey: getQueryKey(),
|
|
80
|
+
queryFn,
|
|
81
|
+
initialPageParam,
|
|
82
|
+
getNextPageParam,
|
|
83
|
+
getPreviousPageParam,
|
|
84
|
+
maxPages,
|
|
85
|
+
staleTime,
|
|
86
|
+
...options,
|
|
87
|
+
select: chainedSelect,
|
|
88
|
+
}, reactor.queryClient);
|
|
89
|
+
};
|
|
90
|
+
// Refetch/invalidate function
|
|
91
|
+
const refetch = async () => {
|
|
92
|
+
const queryKey = getQueryKey();
|
|
93
|
+
await reactor.queryClient.refetchQueries({ queryKey });
|
|
94
|
+
};
|
|
95
|
+
// Get data from cache without fetching
|
|
96
|
+
const getCacheData = (selectFn) => {
|
|
97
|
+
const queryKey = getQueryKey();
|
|
98
|
+
const cachedRawData = reactor.queryClient.getQueryData(queryKey);
|
|
99
|
+
if (cachedRawData === undefined) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
// Apply config.select to raw cache data
|
|
103
|
+
const selectedData = (select ? select(cachedRawData) : cachedRawData);
|
|
104
|
+
// Apply optional select parameter
|
|
105
|
+
if (selectFn) {
|
|
106
|
+
return selectFn(selectedData);
|
|
107
|
+
}
|
|
108
|
+
return selectedData;
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
fetch,
|
|
112
|
+
useInfiniteQuery: useInfiniteQueryHook,
|
|
113
|
+
refetch,
|
|
114
|
+
getQueryKey,
|
|
115
|
+
getCacheData,
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Factory Function
|
|
120
|
+
// ============================================================================
|
|
121
|
+
export function createInfiniteQuery(reactor, config) {
|
|
122
|
+
return createInfiniteQueryImpl(reactor, config);
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Factory with Dynamic Args
|
|
126
|
+
// ============================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Create an infinite query factory that accepts getArgs at call time.
|
|
129
|
+
* Useful when pagination logic varies by context.
|
|
130
|
+
*
|
|
131
|
+
* @template A - The actor interface type
|
|
132
|
+
* @template M - The method name on the actor
|
|
133
|
+
* @template T - The transformation key (identity, display, etc.)
|
|
134
|
+
* @template TPageParam - The page parameter type
|
|
135
|
+
* @template TSelected - The type returned after select transformation
|
|
136
|
+
*
|
|
137
|
+
* @param reactor - The Reactor instance
|
|
138
|
+
* @param config - Infinite query configuration (without getArgs)
|
|
139
|
+
* @returns A function that accepts getArgs and returns an ActorInfiniteQueryResult
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* const getPostsQuery = createActorInfiniteQueryFactory(reactor, {
|
|
143
|
+
* functionName: "get_posts",
|
|
144
|
+
* initialPageParam: 0,
|
|
145
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
146
|
+
* })
|
|
147
|
+
*
|
|
148
|
+
* // Create query with specific args builder
|
|
149
|
+
* const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
|
|
150
|
+
* const { data, fetchNextPage } = userPostsQuery.useInfiniteQuery()
|
|
151
|
+
*/
|
|
152
|
+
export function createInfiniteQueryFactory(reactor, config) {
|
|
153
|
+
return (getArgs) => {
|
|
154
|
+
return createInfiniteQueryImpl(reactor, {
|
|
155
|
+
...config,
|
|
156
|
+
getArgs,
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=createInfiniteQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInfiniteQuery.js","sourceRoot":"","sources":["../src/createInfiniteQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Factory - Generic wrapper for mutating canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified mutation hooks for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const transferMutation = createMutation(reactor, {
|
|
9
|
+
* functionName: "transfer",
|
|
10
|
+
* onSuccess: () => console.log("Success!"),
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* // In component
|
|
14
|
+
* const { mutate, isPending } = transferMutation.useMutation()
|
|
15
|
+
*/
|
|
16
|
+
import type { Reactor, FunctionName, TransformKey } from "@ic-reactor/core";
|
|
17
|
+
import type { MutationConfig, MutationResult, NoInfer } from "./types";
|
|
18
|
+
export declare function createMutation<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>>(reactor: Reactor<A, T>, config: MutationConfig<NoInfer<A>, M, T>): MutationResult<A, M, T>;
|
|
19
|
+
//# sourceMappingURL=createMutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMutation.d.ts","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAEZ,YAAY,EAEb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,OAAO,EACR,MAAM,SAAS,CAAA;AAuHhB,wBAAgB,cAAc,CAC5B,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAE3C,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACvC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAEzB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Factory - Generic wrapper for mutating canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified mutation hooks for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const transferMutation = createMutation(reactor, {
|
|
9
|
+
* functionName: "transfer",
|
|
10
|
+
* onSuccess: () => console.log("Success!"),
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* // In component
|
|
14
|
+
* const { mutate, isPending } = transferMutation.useMutation()
|
|
15
|
+
*/
|
|
16
|
+
import { useMutation } from "@tanstack/react-query";
|
|
17
|
+
import { isCanisterError } from "@ic-reactor/core";
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Internal Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
const createMutationImpl = (reactor, config) => {
|
|
22
|
+
const { functionName, callConfig, refetchQueries: factoryRefetchQueries, onSuccess: factoryOnSuccess, onCanisterError: factoryOnCanisterError, onError: factoryOnError, ...factoryOptions } = config;
|
|
23
|
+
// Direct execution function
|
|
24
|
+
const execute = async (args) => {
|
|
25
|
+
return reactor.callMethod({
|
|
26
|
+
functionName,
|
|
27
|
+
args,
|
|
28
|
+
callConfig,
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
// Hook implementation
|
|
32
|
+
const useMutationHook = (options) => {
|
|
33
|
+
// Extract our custom options
|
|
34
|
+
const { refetchQueries: hookRefetchQueries, onCanisterError: hookOnCanisterError, ...restOptions } = options || {};
|
|
35
|
+
return useMutation({
|
|
36
|
+
...factoryOptions,
|
|
37
|
+
...restOptions,
|
|
38
|
+
mutationFn: execute,
|
|
39
|
+
onSuccess: async (...args) => {
|
|
40
|
+
// 1. Handle factory-level refetchQueries
|
|
41
|
+
if (factoryRefetchQueries) {
|
|
42
|
+
await Promise.all(factoryRefetchQueries.map((queryKey) => {
|
|
43
|
+
return reactor.queryClient.refetchQueries({ queryKey });
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
// 2. Handle hook-level refetchQueries
|
|
47
|
+
if (hookRefetchQueries) {
|
|
48
|
+
await Promise.all(hookRefetchQueries.map((queryKey) => {
|
|
49
|
+
if (queryKey) {
|
|
50
|
+
return reactor.queryClient.refetchQueries({ queryKey });
|
|
51
|
+
}
|
|
52
|
+
return Promise.resolve();
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
// 3. Call factory onSuccess
|
|
56
|
+
if (factoryOnSuccess) {
|
|
57
|
+
await factoryOnSuccess(...args);
|
|
58
|
+
}
|
|
59
|
+
// 4. Call hook-local onSuccess
|
|
60
|
+
if (restOptions?.onSuccess) {
|
|
61
|
+
await restOptions.onSuccess(...args);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
onError: (error, variables, context, mutation) => {
|
|
65
|
+
// Check if this is a CanisterError (from Result { Err: E })
|
|
66
|
+
if (isCanisterError(error)) {
|
|
67
|
+
// 1. Call factory-level onCanisterError
|
|
68
|
+
if (factoryOnCanisterError) {
|
|
69
|
+
factoryOnCanisterError(error, variables);
|
|
70
|
+
}
|
|
71
|
+
// 2. Call hook-level onCanisterError
|
|
72
|
+
if (hookOnCanisterError) {
|
|
73
|
+
hookOnCanisterError(error, variables);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 3. Call factory-level onError (for all errors)
|
|
77
|
+
if (factoryOnError) {
|
|
78
|
+
factoryOnError(error, variables, context, mutation);
|
|
79
|
+
}
|
|
80
|
+
// 4. Call hook-level onError (for all errors)
|
|
81
|
+
if (restOptions?.onError) {
|
|
82
|
+
restOptions.onError(error, variables, context, mutation);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
}, reactor.queryClient);
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
useMutation: useMutationHook,
|
|
89
|
+
execute,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Factory Function
|
|
94
|
+
// ============================================================================
|
|
95
|
+
export function createMutation(reactor, config) {
|
|
96
|
+
return createMutationImpl(reactor, config);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=createMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Factory - Generic wrapper for React Query-based canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const userQuery = createQuery(todoManager, {
|
|
9
|
+
* functionName: "get_user",
|
|
10
|
+
* select: (result) => result.user,
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* // In component
|
|
14
|
+
* const { data: user } = userQuery.useQuery()
|
|
15
|
+
*/
|
|
16
|
+
import type { Reactor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
|
|
17
|
+
import type { QueryFnData, QueryError, QueryConfig, QueryResult, QueryFactoryConfig, NoInfer } from "./types";
|
|
18
|
+
export declare function createQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: QueryConfig<NoInfer<A>, M, T, TSelected>): QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
|
|
19
|
+
export declare function createQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: QueryFactoryConfig<NoInfer<A>, M, T, TSelected>): (args: ReactorArgs<A, M, T>) => QueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
|
|
20
|
+
//# sourceMappingURL=createQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createQuery.d.ts","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EAEX,WAAW,EACX,kBAAkB,EAClB,OAAO,EACR,MAAM,SAAS,CAAA;AA+GhB,wBAAgB,WAAW,CACzB,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAEhC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GAC/C,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAEnE;AAMD,wBAAgB,kBAAkB,CAChC,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAEhC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GACtD,CACD,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACvB,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CA4BrE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Factory - Generic wrapper for React Query-based canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const userQuery = createQuery(todoManager, {
|
|
9
|
+
* functionName: "get_user",
|
|
10
|
+
* select: (result) => result.user,
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* // In component
|
|
14
|
+
* const { data: user } = userQuery.useQuery()
|
|
15
|
+
*/
|
|
16
|
+
import { useQuery } from "@tanstack/react-query";
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Internal Implementation
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const createQueryImpl = (reactor, config) => {
|
|
21
|
+
const { functionName, args, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
|
|
22
|
+
const params = {
|
|
23
|
+
functionName,
|
|
24
|
+
args,
|
|
25
|
+
queryKey: customQueryKey,
|
|
26
|
+
};
|
|
27
|
+
// Get query key from actor manager
|
|
28
|
+
const getQueryKey = () => {
|
|
29
|
+
return reactor.generateQueryKey(params);
|
|
30
|
+
};
|
|
31
|
+
// Fetch function for loaders (cache-first)
|
|
32
|
+
const fetch = async () => {
|
|
33
|
+
const result = await reactor.fetchQuery(params);
|
|
34
|
+
return select ? select(result) : result;
|
|
35
|
+
};
|
|
36
|
+
// Implementation
|
|
37
|
+
const useQueryHook = (options) => {
|
|
38
|
+
const baseOptions = reactor.getQueryOptions(params);
|
|
39
|
+
// Chain the selects: raw -> config.select -> options.select
|
|
40
|
+
const chainedSelect = (rawData) => {
|
|
41
|
+
const firstPass = config.select ? config.select(rawData) : rawData;
|
|
42
|
+
if (options?.select) {
|
|
43
|
+
return options.select(firstPass);
|
|
44
|
+
}
|
|
45
|
+
return firstPass;
|
|
46
|
+
};
|
|
47
|
+
return useQuery({
|
|
48
|
+
queryKey: baseOptions.queryKey,
|
|
49
|
+
staleTime,
|
|
50
|
+
...rest,
|
|
51
|
+
...options,
|
|
52
|
+
queryFn: baseOptions.queryFn,
|
|
53
|
+
select: chainedSelect,
|
|
54
|
+
}, reactor.queryClient);
|
|
55
|
+
};
|
|
56
|
+
// Refetch/invalidate function
|
|
57
|
+
const refetch = async () => {
|
|
58
|
+
const queryKey = getQueryKey();
|
|
59
|
+
await reactor.queryClient.refetchQueries({ queryKey });
|
|
60
|
+
};
|
|
61
|
+
// Get data from cache without fetching
|
|
62
|
+
const getCacheData = (selectFn) => {
|
|
63
|
+
const cachedRawData = reactor.getQueryData(params);
|
|
64
|
+
if (cachedRawData === undefined) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
// Apply config.select to raw cache data
|
|
68
|
+
const selectedData = (config.select ? config.select(cachedRawData) : cachedRawData);
|
|
69
|
+
// Apply optional select parameter
|
|
70
|
+
if (selectFn) {
|
|
71
|
+
return selectFn(selectedData);
|
|
72
|
+
}
|
|
73
|
+
return selectedData;
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
fetch,
|
|
77
|
+
useQuery: useQueryHook,
|
|
78
|
+
refetch,
|
|
79
|
+
getQueryKey,
|
|
80
|
+
getCacheData,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Factory Function
|
|
85
|
+
// ============================================================================
|
|
86
|
+
export function createQuery(reactor, config) {
|
|
87
|
+
return createQueryImpl(reactor, config);
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Convenience: Create query with dynamic args
|
|
91
|
+
// ============================================================================
|
|
92
|
+
export function createQueryFactory(reactor, config) {
|
|
93
|
+
const cache = new Map();
|
|
94
|
+
return (args) => {
|
|
95
|
+
const key = reactor.generateQueryKey({
|
|
96
|
+
functionName: config.functionName,
|
|
97
|
+
args,
|
|
98
|
+
});
|
|
99
|
+
const cacheKey = JSON.stringify(key);
|
|
100
|
+
if (cache.has(cacheKey)) {
|
|
101
|
+
return cache.get(cacheKey);
|
|
102
|
+
}
|
|
103
|
+
const result = createQueryImpl(reactor, {
|
|
104
|
+
...config,
|
|
105
|
+
args,
|
|
106
|
+
});
|
|
107
|
+
cache.set(cacheKey, result);
|
|
108
|
+
return result;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=createQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createQuery.js","sourceRoot":"","sources":["../src/createQuery.ts"],"names":[],"mappings":"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"}
|