@ic-reactor/react 2.0.1 → 3.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.
- package/README.md +105 -79
- 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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suspense Infinite Query Factory - Generic wrapper for React Query suspense-based paginated canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any paginated canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* Uses `useSuspenseInfiniteQuery` which:
|
|
8
|
+
* - Requires wrapping in <Suspense> boundary
|
|
9
|
+
* - Data is always defined (no undefined checks)
|
|
10
|
+
* - Does NOT support `enabled` or `placeholderData` options
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const postsQuery = createSuspenseInfiniteQuery(reactor, {
|
|
14
|
+
* functionName: "get_posts",
|
|
15
|
+
* initialPageParam: 0,
|
|
16
|
+
* getArgs: (cursor) => [{ cursor, limit: 10 }],
|
|
17
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* // In component (wrap in Suspense)
|
|
21
|
+
* const { data, fetchNextPage, hasNextPage } = postsQuery.useSuspenseInfiniteQuery()
|
|
22
|
+
*
|
|
23
|
+
* // Flatten all pages
|
|
24
|
+
* const allPosts = data.pages.flatMap(page => page.posts)
|
|
25
|
+
*/
|
|
26
|
+
import { useSuspenseInfiniteQuery, } from "@tanstack/react-query";
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Internal Implementation
|
|
29
|
+
// ============================================================================
|
|
30
|
+
const createSuspenseInfiniteQueryImpl = (reactor, config) => {
|
|
31
|
+
const { functionName, callConfig, queryKey: customQueryKey, initialPageParam, getArgs, getNextPageParam, getPreviousPageParam, maxPages, staleTime = 5 * 60 * 1000, select, ...rest } = config;
|
|
32
|
+
// Get query key from actor manager
|
|
33
|
+
const getQueryKey = () => {
|
|
34
|
+
return reactor.generateQueryKey({
|
|
35
|
+
functionName,
|
|
36
|
+
queryKey: customQueryKey,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
// Query function - accepts QueryFunctionContext
|
|
40
|
+
const queryFn = async (context) => {
|
|
41
|
+
// pageParam is typed as unknown in QueryFunctionContext, but we know its type
|
|
42
|
+
const pageParam = context.pageParam;
|
|
43
|
+
const args = getArgs(pageParam);
|
|
44
|
+
const result = await reactor.callMethod({
|
|
45
|
+
functionName,
|
|
46
|
+
args,
|
|
47
|
+
callConfig,
|
|
48
|
+
});
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
// Get infinite query options for fetchInfiniteQuery
|
|
52
|
+
const getInfiniteQueryOptions = () => ({
|
|
53
|
+
queryKey: getQueryKey(),
|
|
54
|
+
queryFn,
|
|
55
|
+
initialPageParam,
|
|
56
|
+
getNextPageParam,
|
|
57
|
+
staleTime,
|
|
58
|
+
});
|
|
59
|
+
// Fetch function for loaders (cache-first, fetches first page)
|
|
60
|
+
const fetch = async () => {
|
|
61
|
+
// Use ensureInfiniteQueryData to get cached data or fetch if stale
|
|
62
|
+
const result = await reactor.queryClient.ensureInfiniteQueryData(getInfiniteQueryOptions());
|
|
63
|
+
// Result is already InfiniteData format
|
|
64
|
+
return select ? select(result) : result;
|
|
65
|
+
};
|
|
66
|
+
// Implementation
|
|
67
|
+
const useSuspenseInfiniteQueryHook = (options) => {
|
|
68
|
+
// Chain the selects: raw -> config.select -> options.select
|
|
69
|
+
const chainedSelect = (rawData) => {
|
|
70
|
+
const firstPass = select ? select(rawData) : rawData;
|
|
71
|
+
if (options?.select) {
|
|
72
|
+
return options.select(firstPass);
|
|
73
|
+
}
|
|
74
|
+
return firstPass;
|
|
75
|
+
};
|
|
76
|
+
return useSuspenseInfiniteQuery({
|
|
77
|
+
queryKey: getQueryKey(),
|
|
78
|
+
queryFn,
|
|
79
|
+
initialPageParam,
|
|
80
|
+
getNextPageParam,
|
|
81
|
+
getPreviousPageParam,
|
|
82
|
+
maxPages,
|
|
83
|
+
staleTime,
|
|
84
|
+
...rest,
|
|
85
|
+
...options,
|
|
86
|
+
select: chainedSelect,
|
|
87
|
+
}, reactor.queryClient);
|
|
88
|
+
};
|
|
89
|
+
// Refetch/invalidate function
|
|
90
|
+
const refetch = async () => {
|
|
91
|
+
const queryKey = getQueryKey();
|
|
92
|
+
await reactor.queryClient.refetchQueries({ queryKey });
|
|
93
|
+
};
|
|
94
|
+
// Get data from cache without fetching
|
|
95
|
+
const getCacheData = (selectFn) => {
|
|
96
|
+
const queryKey = getQueryKey();
|
|
97
|
+
const cachedRawData = reactor.queryClient.getQueryData(queryKey);
|
|
98
|
+
if (cachedRawData === undefined) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
// Apply config.select to raw cache data
|
|
102
|
+
const selectedData = (select ? select(cachedRawData) : cachedRawData);
|
|
103
|
+
// Apply optional select parameter
|
|
104
|
+
if (selectFn) {
|
|
105
|
+
return selectFn(selectedData);
|
|
106
|
+
}
|
|
107
|
+
return selectedData;
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
fetch,
|
|
111
|
+
useSuspenseInfiniteQuery: useSuspenseInfiniteQueryHook,
|
|
112
|
+
refetch,
|
|
113
|
+
getQueryKey,
|
|
114
|
+
getCacheData,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Factory Function
|
|
119
|
+
// ============================================================================
|
|
120
|
+
export function createSuspenseInfiniteQuery(reactor, config) {
|
|
121
|
+
return createSuspenseInfiniteQueryImpl(reactor, config);
|
|
122
|
+
}
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// Factory with Dynamic Args
|
|
125
|
+
// ============================================================================
|
|
126
|
+
/**
|
|
127
|
+
* Create a suspense infinite query factory that accepts getArgs at call time.
|
|
128
|
+
* Useful when pagination logic varies by context.
|
|
129
|
+
*
|
|
130
|
+
* @template A - The actor interface type
|
|
131
|
+
* @template M - The method name on the actor
|
|
132
|
+
* @template T - The transformation key (identity, display, etc.)
|
|
133
|
+
* @template TPageParam - The page parameter type
|
|
134
|
+
* @template TSelected - The type returned after select transformation
|
|
135
|
+
*
|
|
136
|
+
* @param reactor - The Reactor instance
|
|
137
|
+
* @param config - Suspense infinite query configuration (without getArgs)
|
|
138
|
+
* @returns A function that accepts getArgs and returns an SuspenseActorInfiniteQueryResult
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* const getPostsQuery = createActorSuspenseInfiniteQueryFactory(reactor, {
|
|
142
|
+
* functionName: "get_posts",
|
|
143
|
+
* initialPageParam: 0,
|
|
144
|
+
* getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
145
|
+
* })
|
|
146
|
+
*
|
|
147
|
+
* // Create query with specific args builder
|
|
148
|
+
* const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
|
|
149
|
+
* const { data, fetchNextPage } = userPostsQuery.useSuspenseInfiniteQuery()
|
|
150
|
+
*/
|
|
151
|
+
export function createSuspenseInfiniteQueryFactory(reactor, config) {
|
|
152
|
+
return (getArgs, options) => {
|
|
153
|
+
return createSuspenseInfiniteQueryImpl(reactor, {
|
|
154
|
+
...config,
|
|
155
|
+
...options,
|
|
156
|
+
getArgs,
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=createSuspenseInfiniteQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSuspenseInfiniteQuery.js","sourceRoot":"","sources":["../src/createSuspenseInfiniteQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suspense Query Factory - Generic wrapper for React Suspense-based canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* Uses `useSuspenseQuery` which:
|
|
8
|
+
* - Requires wrapping in <Suspense> boundary
|
|
9
|
+
* - Data is always defined (no undefined checks)
|
|
10
|
+
* - Does NOT support `enabled` option
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const userQuery = createSuspenseQuery(todoManager, {
|
|
14
|
+
* functionName: "get_user",
|
|
15
|
+
* select: (result) => result.user,
|
|
16
|
+
* })
|
|
17
|
+
*
|
|
18
|
+
* // In component (wrap in Suspense)
|
|
19
|
+
* const { data: user } = userQuery.useSuspenseQuery() // data is never undefined!
|
|
20
|
+
*/
|
|
21
|
+
import type { Reactor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
|
|
22
|
+
import type { QueryFnData, QueryError, SuspenseQueryConfig, SuspenseQueryResult, SuspenseQueryFactoryConfig, NoInfer } from "./types";
|
|
23
|
+
export declare function createSuspenseQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: SuspenseQueryConfig<NoInfer<A>, M, T, TSelected>): SuspenseQueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
|
|
24
|
+
export declare function createSuspenseQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TSelected = QueryFnData<A, M, T>>(reactor: Reactor<A, T>, config: SuspenseQueryFactoryConfig<NoInfer<A>, M, T, TSelected>): (args: ReactorArgs<A, M, T>) => SuspenseQueryResult<QueryFnData<A, M, T>, TSelected, QueryError<A, M, T>>;
|
|
25
|
+
//# sourceMappingURL=createSuspenseQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSuspenseQuery.d.ts","sourceRoot":"","sources":["../src/createSuspenseQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,mBAAmB,EAEnB,mBAAmB,EACnB,0BAA0B,EAC1B,OAAO,EACR,MAAM,SAAS,CAAA;AAqHhB,wBAAgB,mBAAmB,CACjC,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,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GACvD,mBAAmB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAK3E;AAMD,wBAAgB,0BAA0B,CACxC,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,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GAC9D,CACD,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACvB,mBAAmB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAgC7E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suspense Query Factory - Generic wrapper for React Suspense-based canister data
|
|
3
|
+
*
|
|
4
|
+
* Creates unified fetch/hook/refetch functions for any canister method.
|
|
5
|
+
* Works with any Reactor instance.
|
|
6
|
+
*
|
|
7
|
+
* Uses `useSuspenseQuery` which:
|
|
8
|
+
* - Requires wrapping in <Suspense> boundary
|
|
9
|
+
* - Data is always defined (no undefined checks)
|
|
10
|
+
* - Does NOT support `enabled` option
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const userQuery = createSuspenseQuery(todoManager, {
|
|
14
|
+
* functionName: "get_user",
|
|
15
|
+
* select: (result) => result.user,
|
|
16
|
+
* })
|
|
17
|
+
*
|
|
18
|
+
* // In component (wrap in Suspense)
|
|
19
|
+
* const { data: user } = userQuery.useSuspenseQuery() // data is never undefined!
|
|
20
|
+
*/
|
|
21
|
+
import { useSuspenseQuery } from "@tanstack/react-query";
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Internal Implementation
|
|
24
|
+
// ============================================================================
|
|
25
|
+
const createSuspenseQueryImpl = (reactor, config) => {
|
|
26
|
+
const { functionName, args, staleTime = 5 * 60 * 1000, select, queryKey: customQueryKey, ...rest } = config;
|
|
27
|
+
const params = {
|
|
28
|
+
functionName,
|
|
29
|
+
args,
|
|
30
|
+
queryKey: customQueryKey,
|
|
31
|
+
};
|
|
32
|
+
// Get query key from actor manager
|
|
33
|
+
const getQueryKey = () => {
|
|
34
|
+
return reactor.generateQueryKey(params);
|
|
35
|
+
};
|
|
36
|
+
// Fetch function for loaders (cache-first)
|
|
37
|
+
const fetch = async () => {
|
|
38
|
+
const result = await reactor.fetchQuery(params);
|
|
39
|
+
return select ? select(result) : result;
|
|
40
|
+
};
|
|
41
|
+
// Implementation
|
|
42
|
+
const useSuspenseQueryHook = (options) => {
|
|
43
|
+
const baseOptions = reactor.getQueryOptions(params);
|
|
44
|
+
// Chain the selects: raw -> config.select -> options.select
|
|
45
|
+
const chainedSelect = (rawData) => {
|
|
46
|
+
const firstPass = config.select ? config.select(rawData) : rawData;
|
|
47
|
+
if (options?.select) {
|
|
48
|
+
return options.select(firstPass);
|
|
49
|
+
}
|
|
50
|
+
return firstPass;
|
|
51
|
+
};
|
|
52
|
+
return useSuspenseQuery({
|
|
53
|
+
queryKey: baseOptions.queryKey,
|
|
54
|
+
staleTime,
|
|
55
|
+
...rest,
|
|
56
|
+
...options,
|
|
57
|
+
queryFn: baseOptions.queryFn,
|
|
58
|
+
select: chainedSelect,
|
|
59
|
+
}, reactor.queryClient);
|
|
60
|
+
};
|
|
61
|
+
// Refetch/invalidate function
|
|
62
|
+
const refetch = async () => {
|
|
63
|
+
const queryKey = getQueryKey();
|
|
64
|
+
await reactor.queryClient.refetchQueries({ queryKey });
|
|
65
|
+
};
|
|
66
|
+
// Get data from cache without fetching
|
|
67
|
+
const getCacheData = (selectFn) => {
|
|
68
|
+
const cachedRawData = reactor.getQueryData(params);
|
|
69
|
+
if (cachedRawData === undefined) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
// Apply config.select to raw cache data
|
|
73
|
+
const selectedData = (config.select ? config.select(cachedRawData) : cachedRawData);
|
|
74
|
+
// Apply optional select parameter
|
|
75
|
+
if (selectFn) {
|
|
76
|
+
return selectFn(selectedData);
|
|
77
|
+
}
|
|
78
|
+
return selectedData;
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
fetch,
|
|
82
|
+
useSuspenseQuery: useSuspenseQueryHook,
|
|
83
|
+
refetch,
|
|
84
|
+
getQueryKey,
|
|
85
|
+
getCacheData,
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Factory Function
|
|
90
|
+
// ============================================================================
|
|
91
|
+
export function createSuspenseQuery(reactor, config) {
|
|
92
|
+
return createSuspenseQueryImpl(reactor, config);
|
|
93
|
+
}
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// Convenience: Create suspense query with dynamic args
|
|
96
|
+
// ============================================================================
|
|
97
|
+
export function createSuspenseQueryFactory(reactor, config) {
|
|
98
|
+
const cache = new Map();
|
|
99
|
+
return (args) => {
|
|
100
|
+
const key = reactor.generateQueryKey({
|
|
101
|
+
functionName: config.functionName,
|
|
102
|
+
args,
|
|
103
|
+
});
|
|
104
|
+
const cacheKey = JSON.stringify(key);
|
|
105
|
+
if (cache.has(cacheKey)) {
|
|
106
|
+
return cache.get(cacheKey);
|
|
107
|
+
}
|
|
108
|
+
const result = createSuspenseQueryImpl(reactor, {
|
|
109
|
+
...config,
|
|
110
|
+
args,
|
|
111
|
+
});
|
|
112
|
+
cache.set(cacheKey, result);
|
|
113
|
+
return result;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=createSuspenseQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSuspenseQuery.js","sourceRoot":"","sources":["../src/createSuspenseQuery.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { useActorQuery as useReactorQuery } from "./useActorQuery";
|
|
2
|
+
export { useActorMutation as useReactorMutation } from "./useActorMutation";
|
|
3
|
+
export { useActorSuspenseQuery as useReactorSuspenseQuery } from "./useActorSuspenseQuery";
|
|
4
|
+
export { useActorInfiniteQuery as useReactorInfiniteQuery } from "./useActorInfiniteQuery";
|
|
5
|
+
export { useActorSuspenseInfiniteQuery as useReactorSuspenseInfiniteQuery } from "./useActorSuspenseInfiniteQuery";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,gBAAgB,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,qBAAqB,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,qBAAqB,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,6BAA6B,IAAI,+BAA+B,EAAE,MAAM,iCAAiC,CAAA"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./useActor"), exports);
|
|
18
|
-
__exportStar(require("./useActorManager"), exports);
|
|
1
|
+
export { useActorQuery as useReactorQuery } from "./useActorQuery";
|
|
2
|
+
export { useActorMutation as useReactorMutation } from "./useActorMutation";
|
|
3
|
+
export { useActorSuspenseQuery as useReactorSuspenseQuery } from "./useActorSuspenseQuery";
|
|
4
|
+
export { useActorInfiniteQuery as useReactorInfiniteQuery } from "./useActorInfiniteQuery";
|
|
5
|
+
export { useActorSuspenseInfiniteQuery as useReactorSuspenseInfiniteQuery } from "./useActorSuspenseInfiniteQuery";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,gBAAgB,IAAI,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,qBAAqB,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,qBAAqB,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,6BAA6B,IAAI,+BAA+B,EAAE,MAAM,iCAAiC,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { QueryKey, UseInfiniteQueryResult, InfiniteData } from "@tanstack/react-query";
|
|
2
|
+
import { FunctionName, Reactor, TransformKey, ReactorArgs, ReactorReturnOk, ReactorReturnErr } from "@ic-reactor/core";
|
|
3
|
+
import { CallConfig } from "@icp-sdk/core/agent";
|
|
4
|
+
export interface UseActorInfiniteQueryParameters<A, M extends FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown> {
|
|
5
|
+
reactor: Reactor<A, T>;
|
|
6
|
+
functionName: M;
|
|
7
|
+
getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>;
|
|
8
|
+
callConfig?: CallConfig;
|
|
9
|
+
queryKey?: QueryKey;
|
|
10
|
+
initialPageParam: TPageParam;
|
|
11
|
+
getNextPageParam: (lastPage: ReactorReturnOk<A, M, T>, allPages: ReactorReturnOk<A, M, T>[], lastPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
12
|
+
getPreviousPageParam?: (firstPage: ReactorReturnOk<A, M, T>, allPages: ReactorReturnOk<A, M, T>[], firstPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
13
|
+
maxPages?: number;
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
staleTime?: number;
|
|
16
|
+
gcTime?: number;
|
|
17
|
+
refetchOnWindowFocus?: boolean;
|
|
18
|
+
refetchOnMount?: boolean;
|
|
19
|
+
refetchOnReconnect?: boolean;
|
|
20
|
+
select?: (data: InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>) => InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>;
|
|
21
|
+
}
|
|
22
|
+
export type UseActorInfiniteQueryConfig<A, M extends FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown> = Omit<UseActorInfiniteQueryParameters<A, M, T, TPageParam>, "reactor">;
|
|
23
|
+
export type UseActorInfiniteQueryResult<A, M extends FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown> = UseInfiniteQueryResult<InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>, ReactorReturnErr<A, M, T>>;
|
|
24
|
+
/**
|
|
25
|
+
* Hook for executing infinite/paginated query calls on a canister.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const { data, fetchNextPage, hasNextPage } = useActorInfiniteQuery({
|
|
29
|
+
* reactor,
|
|
30
|
+
* functionName: "getItems",
|
|
31
|
+
* getArgs: (pageParam) => [{ offset: pageParam, limit: 10 }],
|
|
32
|
+
* initialPageParam: 0,
|
|
33
|
+
* getNextPageParam: (lastPage) => lastPage.nextOffset,
|
|
34
|
+
* })
|
|
35
|
+
*/
|
|
36
|
+
export declare const useActorInfiniteQuery: <A, M extends FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown>({ reactor, functionName, getArgs, callConfig, queryKey, ...options }: UseActorInfiniteQueryParameters<A, M, T, TPageParam>) => UseActorInfiniteQueryResult<A, M, T, TPageParam>;
|
|
37
|
+
//# sourceMappingURL=useActorInfiniteQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorInfiniteQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorInfiniteQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useMemo, useCallback } from "react";
|
|
2
|
+
import { useInfiniteQuery, } from "@tanstack/react-query";
|
|
3
|
+
/**
|
|
4
|
+
* Hook for executing infinite/paginated query calls on a canister.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const { data, fetchNextPage, hasNextPage } = useActorInfiniteQuery({
|
|
8
|
+
* reactor,
|
|
9
|
+
* functionName: "getItems",
|
|
10
|
+
* getArgs: (pageParam) => [{ offset: pageParam, limit: 10 }],
|
|
11
|
+
* initialPageParam: 0,
|
|
12
|
+
* getNextPageParam: (lastPage) => lastPage.nextOffset,
|
|
13
|
+
* })
|
|
14
|
+
*/
|
|
15
|
+
export const useActorInfiniteQuery = ({ reactor, functionName, getArgs, callConfig, queryKey, ...options }) => {
|
|
16
|
+
// Memoize queryKey to prevent unnecessary re-calculations
|
|
17
|
+
const baseQueryKey = useMemo(() => queryKey ?? reactor.generateQueryKey({ functionName }), [queryKey, reactor, functionName]);
|
|
18
|
+
// Memoize queryFn to prevent recreation on every render
|
|
19
|
+
const queryFn = useCallback(async ({ pageParam }) => {
|
|
20
|
+
const args = getArgs(pageParam);
|
|
21
|
+
return reactor.callMethod({
|
|
22
|
+
functionName,
|
|
23
|
+
args,
|
|
24
|
+
callConfig,
|
|
25
|
+
});
|
|
26
|
+
}, [reactor, functionName, getArgs, callConfig]);
|
|
27
|
+
return useInfiniteQuery({
|
|
28
|
+
queryKey: baseQueryKey,
|
|
29
|
+
queryFn,
|
|
30
|
+
...options,
|
|
31
|
+
}, reactor.queryClient);
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=useActorInfiniteQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorInfiniteQuery.js","sourceRoot":"","sources":["../../src/hooks/useActorInfiniteQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAEL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAA;AAgE9B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAKnC,EACA,OAAO,EACP,YAAY,EACZ,OAAO,EACP,UAAU,EACV,QAAQ,EACR,GAAG,OAAO,EAMX,EAAoD,EAAE;IACrD,0DAA0D;IAC1D,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC,EAC5D,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAClC,CAAA;IAED,wDAAwD;IACxD,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,EAAE,SAAS,EAA6B,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QAC/B,OAAO,OAAO,CAAC,UAAU,CAAC;YACxB,YAAY;YACZ,IAAI;YACJ,UAAU;SACX,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,CAC7C,CAAA;IAED,OAAO,gBAAgB,CACrB;QACE,QAAQ,EAAE,YAAY;QACtB,OAAO;QACP,GAAG,OAAO;KACJ,EACR,OAAO,CAAC,WAAW,CACgC,CAAA;AACvD,CAAC,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UseMutationOptions, UseMutationResult, QueryKey } from "@tanstack/react-query";
|
|
2
|
+
import { Reactor, ReactorArgs, ReactorReturnOk, FunctionName, TransformKey, ReactorReturnErr } from "@ic-reactor/core";
|
|
3
|
+
import { CallConfig } from "@icp-sdk/core/agent";
|
|
4
|
+
export interface UseActorMutationParameters<A, M extends FunctionName<A>, T extends TransformKey = "candid"> extends Omit<UseMutationOptions<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>, ReactorArgs<A, M, T>>, "mutationFn"> {
|
|
5
|
+
reactor: Reactor<A, T>;
|
|
6
|
+
functionName: M;
|
|
7
|
+
callConfig?: CallConfig;
|
|
8
|
+
refetchQueries?: QueryKey[];
|
|
9
|
+
}
|
|
10
|
+
export type UseActorMutationConfig<A, M extends FunctionName<A>, T extends TransformKey = "candid"> = Omit<UseActorMutationParameters<A, M, T>, "reactor">;
|
|
11
|
+
export type UseActorMutationResult<A, M extends FunctionName<A>, T extends TransformKey = "candid"> = UseMutationResult<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>, ReactorArgs<A, M, T>>;
|
|
12
|
+
/**
|
|
13
|
+
* Hook for executing mutation calls on a canister.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const { mutate, isPending } = useActorMutation({
|
|
17
|
+
* reactor,
|
|
18
|
+
* functionName: "transfer",
|
|
19
|
+
* onSuccess: () => console.log("Success!"),
|
|
20
|
+
* })
|
|
21
|
+
*/
|
|
22
|
+
export declare const useActorMutation: <A, M extends FunctionName<A>, T extends TransformKey = "candid">({ reactor, functionName, refetchQueries, onSuccess, callConfig, ...options }: UseActorMutationParameters<A, M, T>) => UseActorMutationResult<A, M, T>;
|
|
23
|
+
//# sourceMappingURL=useActorMutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorMutation.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACT,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,OAAO,EACP,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,WAAW,0BAA0B,CACzC,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,CACjC,SAAQ,IAAI,CACZ,kBAAkB,CAChB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACzB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACrB,EACD,YAAY,CACb;IACC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,YAAY,EAAE,CAAC,CAAA;IACf,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAA;CAC5B;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,IAC/B,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AAExD,MAAM,MAAM,sBAAsB,CAChC,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,IAC/B,iBAAiB,CACnB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACzB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACrB,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAC3B,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,8EAOC,0BAA0B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAmDtE,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useMemo, useCallback } from "react";
|
|
2
|
+
import { useMutation, } from "@tanstack/react-query";
|
|
3
|
+
/**
|
|
4
|
+
* Hook for executing mutation calls on a canister.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const { mutate, isPending } = useActorMutation({
|
|
8
|
+
* reactor,
|
|
9
|
+
* functionName: "transfer",
|
|
10
|
+
* onSuccess: () => console.log("Success!"),
|
|
11
|
+
* })
|
|
12
|
+
*/
|
|
13
|
+
export const useActorMutation = ({ reactor, functionName, refetchQueries, onSuccess, callConfig, ...options }) => {
|
|
14
|
+
// Memoize mutationFn to avoid creating new function on every render
|
|
15
|
+
const mutationFn = useCallback(async (args) => {
|
|
16
|
+
return reactor.callMethod({
|
|
17
|
+
functionName,
|
|
18
|
+
callConfig,
|
|
19
|
+
args,
|
|
20
|
+
});
|
|
21
|
+
}, [reactor, functionName, callConfig]);
|
|
22
|
+
// Memoize onSuccess handler
|
|
23
|
+
const handleSuccess = useCallback(async (...params) => {
|
|
24
|
+
if (refetchQueries) {
|
|
25
|
+
await Promise.all(refetchQueries.map((queryKey) => reactor.queryClient.refetchQueries({ queryKey })));
|
|
26
|
+
}
|
|
27
|
+
if (onSuccess) {
|
|
28
|
+
await onSuccess(...params);
|
|
29
|
+
}
|
|
30
|
+
}, [reactor, refetchQueries, onSuccess]);
|
|
31
|
+
// Memoize mutation options
|
|
32
|
+
const mutationOptions = useMemo(() => ({
|
|
33
|
+
...options,
|
|
34
|
+
mutationFn,
|
|
35
|
+
onSuccess: handleSuccess,
|
|
36
|
+
}), [options, mutationFn, handleSuccess]);
|
|
37
|
+
return useMutation(mutationOptions, reactor.queryClient);
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=useActorMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorMutation.js","sourceRoot":"","sources":["../../src/hooks/useActorMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EACL,WAAW,GAIZ,MAAM,uBAAuB,CAAA;AA6C9B;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAI9B,EACA,OAAO,EACP,YAAY,EACZ,cAAc,EACd,SAAS,EACT,UAAU,EACV,GAAG,OAAO,EAC0B,EAAmC,EAAE;IACzE,oEAAoE;IACpE,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EAAE,IAA0B,EAAE,EAAE;QACnC,OAAO,OAAO,CAAC,UAAU,CAAC;YACxB,YAAY;YACZ,UAAU;YACV,IAAI;SACL,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CACpC,CAAA;IAED,4BAA4B;IAC5B,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EACH,GAAG,MAQF,EACD,EAAE;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC9B,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CACjD,CACF,CAAA;QACH,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CACrC,CAAA;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,OAAO;QACV,UAAU;QACV,SAAS,EAAE,aAAa;KACzB,CAAC,EACF,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CACrC,CAAA;IAED,OAAO,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;AAC1D,CAAC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { QueryKey, QueryObserverOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
|
+
import { FunctionName, Reactor, TransformKey, ReactorArgs, ReactorReturnOk, ReactorReturnErr } from "@ic-reactor/core";
|
|
3
|
+
import { CallConfig } from "@icp-sdk/core/agent";
|
|
4
|
+
export interface UseActorQueryParameters<A, M extends FunctionName<A>, T extends TransformKey = "candid", TSelected = ReactorReturnOk<A, M, T>> extends Omit<QueryObserverOptions<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>, TSelected, ReactorReturnOk<A, M, T>, QueryKey>, "queryKey" | "queryFn"> {
|
|
5
|
+
reactor: Reactor<A, T>;
|
|
6
|
+
functionName: M;
|
|
7
|
+
args?: ReactorArgs<A, M, T>;
|
|
8
|
+
callConfig?: CallConfig;
|
|
9
|
+
queryKey?: QueryKey;
|
|
10
|
+
}
|
|
11
|
+
export type UseActorQueryConfig<A, M extends FunctionName<A>, T extends TransformKey = "candid", TSelected = ReactorReturnOk<A, M, T>> = Omit<UseActorQueryParameters<A, M, T, TSelected>, "reactor">;
|
|
12
|
+
export type UseActorQueryResult<A, M extends FunctionName<A>, T extends TransformKey = "candid", TSelected = ReactorReturnOk<A, M, T>> = UseQueryResult<TSelected, ReactorReturnErr<A, M, T>>;
|
|
13
|
+
/**
|
|
14
|
+
* Hook for executing query calls on a canister.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const { data, isLoading } = useActorQuery({
|
|
18
|
+
* reactor,
|
|
19
|
+
* functionName: "getUser",
|
|
20
|
+
* args: ["user-123"],
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* // With select transformation
|
|
24
|
+
* const { data } = useActorQuery({
|
|
25
|
+
* reactor,
|
|
26
|
+
* functionName: "getUser",
|
|
27
|
+
* args: ["user-123"],
|
|
28
|
+
* select: (user) => user.name,
|
|
29
|
+
* })
|
|
30
|
+
*/
|
|
31
|
+
export declare const useActorQuery: <A, M extends FunctionName<A>, T extends TransformKey = "candid", TSelected = ReactorReturnOk<A, M, T>>({ reactor, functionName, args, callConfig, queryKey: defaultQueryKey, ...options }: UseActorQueryParameters<A, M, T, TSelected>) => UseActorQueryResult<A, M, T, TSelected>;
|
|
32
|
+
//# sourceMappingURL=useActorQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorQuery.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EAER,oBAAoB,EACpB,cAAc,EACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,WAAW,uBAAuB,CACtC,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,SAAS,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACpC,SAAQ,IAAI,CACZ,oBAAoB,CAClB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACzB,SAAS,EACT,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,QAAQ,CACT,EACD,UAAU,GAAG,SAAS,CACvB;IACC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,YAAY,EAAE,CAAC,CAAA;IACf,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,MAAM,MAAM,mBAAmB,CAC7B,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,SAAS,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAClC,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;AAEhE,MAAM,MAAM,mBAAmB,CAC7B,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,SAAS,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAClC,cAAc,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAExD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GACxB,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,SAAS,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpC,oFAOC,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,KAAG,mBAAmB,CAClE,CAAC,EACD,CAAC,EACD,CAAC,EACD,SAAS,CAsBV,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useQuery, } from "@tanstack/react-query";
|
|
3
|
+
/**
|
|
4
|
+
* Hook for executing query calls on a canister.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const { data, isLoading } = useActorQuery({
|
|
8
|
+
* reactor,
|
|
9
|
+
* functionName: "getUser",
|
|
10
|
+
* args: ["user-123"],
|
|
11
|
+
* })
|
|
12
|
+
*
|
|
13
|
+
* // With select transformation
|
|
14
|
+
* const { data } = useActorQuery({
|
|
15
|
+
* reactor,
|
|
16
|
+
* functionName: "getUser",
|
|
17
|
+
* args: ["user-123"],
|
|
18
|
+
* select: (user) => user.name,
|
|
19
|
+
* })
|
|
20
|
+
*/
|
|
21
|
+
export const useActorQuery = ({ reactor, functionName, args, callConfig, queryKey: defaultQueryKey, ...options }) => {
|
|
22
|
+
// Memoize query options to prevent unnecessary re-computations
|
|
23
|
+
const { queryKey, queryFn } = useMemo(() => reactor.getQueryOptions({
|
|
24
|
+
callConfig,
|
|
25
|
+
functionName,
|
|
26
|
+
args,
|
|
27
|
+
queryKey: defaultQueryKey,
|
|
28
|
+
}), [reactor, callConfig, functionName, args, defaultQueryKey]);
|
|
29
|
+
return useQuery({
|
|
30
|
+
queryFn,
|
|
31
|
+
...options,
|
|
32
|
+
queryKey,
|
|
33
|
+
}, reactor.queryClient);
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=useActorQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActorQuery.js","sourceRoot":"","sources":["../../src/hooks/useActorQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAEL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AA+C9B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAK3B,EACA,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,QAAQ,EAAE,eAAe,EACzB,GAAG,OAAO,EACkC,EAK5C,EAAE;IACF,+DAA+D;IAC/D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CACnC,GAAG,EAAE,CACH,OAAO,CAAC,eAAe,CAAI;QACzB,UAAU;QACV,YAAY;QACZ,IAAI;QACJ,QAAQ,EAAE,eAAe;KAC1B,CAAC,EACJ,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,CAAC,CAC3D,CAAA;IAED,OAAO,QAAQ,CACb;QACE,OAAO;QACP,GAAG,OAAO;QACV,QAAQ;KACT,EACD,OAAO,CAAC,WAAW,CACpB,CAAA;AACH,CAAC,CAAA"}
|