@ic-reactor/react 3.12.5 → 3.13.0

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.
Files changed (152) hide show
  1. package/README.md +410 -44
  2. package/dist/auth/auth-client-compat.d.ts +122 -0
  3. package/dist/auth/auth-client-compat.d.ts.map +1 -0
  4. package/dist/auth/auth-client-compat.js +162 -0
  5. package/dist/auth/auth-client-compat.js.map +1 -0
  6. package/dist/auth/authentication-manager.d.ts +287 -5
  7. package/dist/auth/authentication-manager.d.ts.map +1 -1
  8. package/dist/auth/authentication-manager.js +920 -150
  9. package/dist/auth/authentication-manager.js.map +1 -1
  10. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -1
  11. package/dist/auth/createIdentityAttributeHooks.js +36 -20
  12. package/dist/auth/createIdentityAttributeHooks.js.map +1 -1
  13. package/dist/auth/identity-attributes-manager.d.ts +2 -1
  14. package/dist/auth/identity-attributes-manager.d.ts.map +1 -1
  15. package/dist/auth/identity-attributes-manager.js +90 -6
  16. package/dist/auth/identity-attributes-manager.js.map +1 -1
  17. package/dist/auth/identity-attributes.d.ts.map +1 -1
  18. package/dist/auth/identity-attributes.js +57 -0
  19. package/dist/auth/identity-attributes.js.map +1 -1
  20. package/dist/auth/local-ii-probe.d.ts +12 -1
  21. package/dist/auth/local-ii-probe.d.ts.map +1 -1
  22. package/dist/auth/local-ii-probe.js +22 -3
  23. package/dist/auth/local-ii-probe.js.map +1 -1
  24. package/dist/auth/types.d.ts +48 -5
  25. package/dist/auth/types.d.ts.map +1 -1
  26. package/dist/createActorHooks.d.ts +7 -18
  27. package/dist/createActorHooks.d.ts.map +1 -1
  28. package/dist/createActorHooks.js.map +1 -1
  29. package/dist/createInfiniteQuery.d.ts +51 -10
  30. package/dist/createInfiniteQuery.d.ts.map +1 -1
  31. package/dist/createInfiniteQuery.js +39 -15
  32. package/dist/createInfiniteQuery.js.map +1 -1
  33. package/dist/createMutation.d.ts +3 -0
  34. package/dist/createMutation.d.ts.map +1 -1
  35. package/dist/createMutation.js +87 -80
  36. package/dist/createMutation.js.map +1 -1
  37. package/dist/createQuery.d.ts +35 -2
  38. package/dist/createQuery.d.ts.map +1 -1
  39. package/dist/createQuery.js +104 -17
  40. package/dist/createQuery.js.map +1 -1
  41. package/dist/createReactorProvider.d.ts +158 -0
  42. package/dist/createReactorProvider.d.ts.map +1 -0
  43. package/dist/createReactorProvider.js +256 -0
  44. package/dist/createReactorProvider.js.map +1 -0
  45. package/dist/createSuspenseInfiniteQuery.d.ts +16 -9
  46. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  47. package/dist/createSuspenseInfiniteQuery.js +59 -27
  48. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  49. package/dist/createSuspenseQuery.d.ts +23 -2
  50. package/dist/createSuspenseQuery.d.ts.map +1 -1
  51. package/dist/createSuspenseQuery.js +68 -21
  52. package/dist/createSuspenseQuery.js.map +1 -1
  53. package/dist/defineDisplayReactor.d.ts +43 -0
  54. package/dist/defineDisplayReactor.d.ts.map +1 -0
  55. package/dist/defineDisplayReactor.js +42 -0
  56. package/dist/defineDisplayReactor.js.map +1 -0
  57. package/dist/defineReactor.d.ts +46 -72
  58. package/dist/defineReactor.d.ts.map +1 -1
  59. package/dist/defineReactor.js +11 -176
  60. package/dist/defineReactor.js.map +1 -1
  61. package/dist/defineReactorShared.d.ts +84 -0
  62. package/dist/defineReactorShared.d.ts.map +1 -0
  63. package/dist/defineReactorShared.js +139 -0
  64. package/dist/defineReactorShared.js.map +1 -0
  65. package/dist/hooks/createAuthHooks.d.ts +7 -0
  66. package/dist/hooks/createAuthHooks.d.ts.map +1 -1
  67. package/dist/hooks/createAuthHooks.js +180 -20
  68. package/dist/hooks/createAuthHooks.js.map +1 -1
  69. package/dist/hooks/useActorInfiniteQuery.d.ts +34 -6
  70. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  71. package/dist/hooks/useActorInfiniteQuery.js +54 -21
  72. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  73. package/dist/hooks/useActorMethod.d.ts +37 -4
  74. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  75. package/dist/hooks/useActorMethod.js +201 -57
  76. package/dist/hooks/useActorMethod.js.map +1 -1
  77. package/dist/hooks/useActorMutation.d.ts +10 -7
  78. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  79. package/dist/hooks/useActorMutation.js +14 -13
  80. package/dist/hooks/useActorMutation.js.map +1 -1
  81. package/dist/hooks/useActorQuery.d.ts +17 -4
  82. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  83. package/dist/hooks/useActorQuery.js +30 -9
  84. package/dist/hooks/useActorQuery.js.map +1 -1
  85. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +15 -3
  86. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  87. package/dist/hooks/useActorSuspenseInfiniteQuery.js +37 -17
  88. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  89. package/dist/hooks/useActorSuspenseQuery.d.ts +2 -2
  90. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  91. package/dist/hooks/useActorSuspenseQuery.js +20 -9
  92. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  93. package/dist/index.d.ts +4 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +6 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/ownedAuthentication.d.ts +52 -0
  98. package/dist/ownedAuthentication.d.ts.map +1 -0
  99. package/dist/ownedAuthentication.js +49 -0
  100. package/dist/ownedAuthentication.js.map +1 -0
  101. package/dist/server.d.ts +21 -0
  102. package/dist/server.d.ts.map +1 -0
  103. package/dist/server.js +23 -0
  104. package/dist/server.js.map +1 -0
  105. package/dist/testing.d.ts +19 -0
  106. package/dist/testing.d.ts.map +1 -0
  107. package/dist/testing.js +19 -0
  108. package/dist/testing.js.map +1 -0
  109. package/dist/types.d.ts +416 -15
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js +1 -1
  112. package/dist/utils.d.ts +159 -3
  113. package/dist/utils.d.ts.map +1 -1
  114. package/dist/utils.js +301 -1
  115. package/dist/utils.js.map +1 -1
  116. package/dist/validation.d.ts +12 -7
  117. package/dist/validation.d.ts.map +1 -1
  118. package/dist/validation.js +34 -15
  119. package/dist/validation.js.map +1 -1
  120. package/llms.txt +259 -33
  121. package/package.json +17 -5
  122. package/src/auth/auth-client-compat.ts +273 -0
  123. package/src/auth/authentication-manager.ts +918 -96
  124. package/src/auth/createIdentityAttributeHooks.ts +47 -21
  125. package/src/auth/identity-attributes-manager.ts +100 -5
  126. package/src/auth/identity-attributes.ts +75 -0
  127. package/src/auth/local-ii-probe.ts +29 -3
  128. package/src/auth/types.ts +49 -6
  129. package/src/createActorHooks.ts +20 -32
  130. package/src/createInfiniteQuery.ts +120 -28
  131. package/src/createMutation.ts +161 -178
  132. package/src/createQuery.ts +164 -32
  133. package/src/createReactorProvider.ts +365 -0
  134. package/src/createSuspenseInfiniteQuery.ts +93 -43
  135. package/src/createSuspenseQuery.ts +102 -32
  136. package/src/defineDisplayReactor.ts +62 -0
  137. package/src/defineReactor.ts +81 -263
  138. package/src/defineReactorShared.ts +268 -0
  139. package/src/hooks/createAuthHooks.ts +206 -24
  140. package/src/hooks/useActorInfiniteQuery.ts +122 -49
  141. package/src/hooks/useActorMethod.ts +295 -92
  142. package/src/hooks/useActorMutation.ts +23 -23
  143. package/src/hooks/useActorQuery.ts +43 -10
  144. package/src/hooks/useActorSuspenseInfiniteQuery.ts +93 -50
  145. package/src/hooks/useActorSuspenseQuery.ts +30 -15
  146. package/src/index.ts +8 -0
  147. package/src/ownedAuthentication.ts +81 -0
  148. package/src/server.ts +23 -0
  149. package/src/testing.ts +18 -0
  150. package/src/types.ts +463 -14
  151. package/src/utils.ts +387 -3
  152. package/src/validation.ts +43 -19
@@ -1,6 +1,28 @@
1
- import { useCallback, useEffect, useMemo, useRef } from "react";
2
- import { useQuery, useMutation, } from "@tanstack/react-query";
3
- import { normalizeQueryData } from "../utils.js";
1
+ import { useCallback, useEffect, useInsertionEffect, useMemo, useRef, } from "react";
2
+ import { useQuery, useMutation, hashKey, } from "@tanstack/react-query";
3
+ import { invalidateTargets, normalizeQueryData, pickFetchOptions, useMountQueryClient, } from "../utils.js";
4
+ /**
5
+ * A ref to `value` as of the last committed render, for code that runs outside
6
+ * render: event handlers, timers, effects and TanStack callbacks.
7
+ *
8
+ * Assigning the ref during render would also publish renders that React throws
9
+ * away, such as a transition that suspends or one that a more urgent update
10
+ * interrupts. The tree still on screen would then act on props it never showed,
11
+ * like calling a method it does not render. An insertion effect runs only when
12
+ * its render commits, and before every layout and passive effect of that
13
+ * commit, so no effect anywhere in the tree reads the previous commit's value.
14
+ * React's own `useEffectEvent` also swaps in its new function during the
15
+ * commit, ahead of layout effects. Unlike `useLayoutEffect`, an insertion
16
+ * effect does not warn in a React 18 server render. The initial value serves
17
+ * anything that runs before the first commit.
18
+ */
19
+ function useCommittedRef(value) {
20
+ const ref = useRef(value);
21
+ useInsertionEffect(() => {
22
+ ref.current = value;
23
+ });
24
+ return ref;
25
+ }
4
26
  /**
5
27
  * A unified hook for calling canister methods that automatically handles
6
28
  * both query and mutation methods based on the Candid interface.
@@ -13,12 +35,12 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
13
35
  return reactor.isQueryMethod(functionName);
14
36
  }, [reactor, functionName]);
15
37
  const functionType = isQuery ? "query" : "update";
16
- // Latest callbacks, read at dispatch time: this keeps a rerendered closure
17
- // from being ignored, and keeps callback identity out of the effect deps.
18
- const onSuccessRef = useRef(onSuccess);
19
- const onErrorRef = useRef(onError);
20
- onSuccessRef.current = onSuccess;
21
- onErrorRef.current = onError;
38
+ useMountQueryClient(reactor.queryClient);
39
+ // The committed render's callbacks, read at dispatch time: this keeps a
40
+ // rerendered closure from being ignored, and keeps callback identity out of
41
+ // the effect deps.
42
+ const onSuccessRef = useCommittedRef(onSuccess);
43
+ const onErrorRef = useCommittedRef(onError);
22
44
  // Build the key for a given set of call arguments.
23
45
  //
24
46
  // A custom `queryKey` is appended to the canister/function prefix rather than
@@ -68,15 +90,25 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
68
90
  // case that previously never notified at all.
69
91
  const notifiedSuccessAt = useRef(undefined);
70
92
  const notifiedErrorAt = useRef(undefined);
71
- const { status, data, error, dataUpdatedAt, errorUpdatedAt } = queryResult;
93
+ const { status, data, error, dataUpdatedAt, errorUpdatedAt, isPlaceholderData, isFetched, } = queryResult;
72
94
  useEffect(() => {
73
95
  if (!isQuery)
74
96
  return;
97
+ // Placeholder data also has `status: "success"`, but no call has returned
98
+ // it: it is the `placeholderData` option, or with `keepPreviousData` the
99
+ // previous args' result standing in while this call is in flight.
100
+ if (isPlaceholderData)
101
+ return;
102
+ // So does `initialData`: an entry starts with it, and `reset()` puts it
103
+ // back, before any fetch of the entry has settled. The first fetch that
104
+ // settles makes the entry fetched, and its result is reported below.
105
+ if (!isFetched)
106
+ return;
75
107
  if (status === "success" && dataUpdatedAt !== notifiedSuccessAt.current) {
76
108
  notifiedSuccessAt.current = dataUpdatedAt;
77
109
  onSuccessRef.current?.(data);
78
110
  }
79
- }, [isQuery, status, data, dataUpdatedAt]);
111
+ }, [isQuery, status, data, dataUpdatedAt, isPlaceholderData, isFetched]);
80
112
  useEffect(() => {
81
113
  if (!isQuery)
82
114
  return;
@@ -85,11 +117,67 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
85
117
  onErrorRef.current?.(error);
86
118
  }
87
119
  }, [isQuery, status, error, errorUpdatedAt]);
120
+ // `call(args)` reports its own outcome, once per call, because the args it
121
+ // fetched usually key an entry this observer does not watch. When they key
122
+ // the entry it does watch, the effects above see the same settle, and each
123
+ // callback used to fire twice for one call. So the settle that ends a call's
124
+ // fetch is marked as notified when it lands in the observed entry, and the
125
+ // effects skip it.
126
+ //
127
+ // A query cache listener sets that mark while TanStack dispatches the
128
+ // settle, before any render can show it. Matching a settle up by its
129
+ // timestamp afterwards could not tell settles apart: two in one millisecond
130
+ // share a timestamp. And a call that an identity switch cancels settles
131
+ // nothing: TanStack reverts the entry to its previous result, timestamp
132
+ // included, so the call's outcome looked reported already, and neither the
133
+ // call nor the effects reported it.
134
+ const observedKeyRef = useCommittedRef(queryKey);
135
+ const markCallSettle = (calledKey) => {
136
+ const { queryClient } = reactor;
137
+ // The hash TanStack files the called entry under, worked out the way
138
+ // `fetchQuery` does. The listener compares it with hashes TanStack has
139
+ // already computed rather than hashing keys itself: the QueryClient may be
140
+ // shared with the app, whose keys a custom `queryKeyHashFn` can let hold
141
+ // values that `hashKey` throws on, inside TanStack's dispatch.
142
+ const calledHash = queryClient.defaultQueryOptions({
143
+ queryKey: calledKey,
144
+ }).queryHash;
145
+ let settled = false;
146
+ return queryClient.getQueryCache().subscribe((event) => {
147
+ if (settled || event.type !== "updated")
148
+ return;
149
+ const { action, query } = event;
150
+ // A fetch settles with one of these. `setQueryData` dispatches a
151
+ // success too, flagged manual, and it does not end this call's fetch.
152
+ const isSettle = action.type === "error" || (action.type === "success" && !action.manual);
153
+ if (!isSettle || query.queryHash !== calledHash)
154
+ return;
155
+ settled = true;
156
+ if (hashKey(calledKey) !== hashKey(observedKeyRef.current))
157
+ return;
158
+ if (action.type === "success") {
159
+ notifiedSuccessAt.current = query.state.dataUpdatedAt;
160
+ }
161
+ else {
162
+ notifiedErrorAt.current = query.state.errorUpdatedAt;
163
+ }
164
+ });
165
+ };
88
166
  // ============================================================================
89
167
  // Mutation Implementation
90
168
  // ============================================================================
91
169
  const mutationResult = useMutation({
92
170
  mutationKey: queryKey,
171
+ // The hook's `retry`, `retryDelay`, `networkMode` and `meta`, the options
172
+ // that decide how a call runs, as the query branch's `call()` applies
173
+ // them. They reached only the query branch, so an update's call ignored
174
+ // them: it stayed paused offline under `networkMode: "always"` and
175
+ // reached the MutationCache callbacks without the hook's `meta`. Unset
176
+ // ones are left to the QueryClient's mutation defaults, which retry
177
+ // nothing unless the app set `mutations.retry`: each attempt of an
178
+ // update is a new call the canister runs, so only a `retry` given here
179
+ // or in those defaults sends one again.
180
+ ...pickFetchOptions(queryOptions),
93
181
  // Normalized like the query branch, so `data`, `call()` and `onSuccess`
94
182
  // mean the same thing for both kinds of method. The hook cannot type the
95
183
  // two branches apart: a Candid service type does not say which methods
@@ -99,23 +187,62 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
99
187
  args: mutationArgs ?? args,
100
188
  callConfig,
101
189
  }))),
102
- onSuccess: (data) => {
190
+ // Invalidation first, then `onSuccess`, as `useActorMutation` and
191
+ // `createMutation` do. TanStack Query waits for the promise returned
192
+ // here before it settles the mutation, so `call()` resolves, and
193
+ // `isPending` turns false, once the invalidated queries that are in use
194
+ // have refetched, and `onSuccess` reads the refetched data. A refetch
195
+ // that fails does not reject `invalidateQueries`, so it cannot turn the
196
+ // update, which has already run on the canister, into a failure.
197
+ onSuccess: async (data) => {
198
+ await invalidateTargets(reactor, invalidateQueries, callConfig);
103
199
  onSuccessRef.current?.(data);
104
- // Invalidate specified queries after successful mutation
105
- if (invalidateQueries && invalidateQueries.length > 0) {
106
- invalidateQueries.forEach((key) => {
107
- void reactor.queryClient.invalidateQueries({ queryKey: key });
108
- });
109
- }
110
200
  },
111
201
  onError: (error) => {
112
202
  onErrorRef.current?.(error);
113
203
  },
114
204
  }, reactor.queryClient);
115
205
  // ============================================================================
116
- // Unified Call Function
206
+ // Refetch and Call Functions
117
207
  // ============================================================================
118
- const call = useCallback(async (callArgs) => {
208
+ // A query's `call()` and `refetch()` resolve with the answer for the
209
+ // principal signed in when they settle. `ClientManager.updateAgent` cancels
210
+ // a fetch in flight when a sign-in or sign-out switches the principal, so
211
+ // that the previous principal's answer is never cached. TanStack then
212
+ // resolves the fetch with the data it puts the entry back to, which is the
213
+ // previous principal's, or rejects it with a `CancelledError` when the entry
214
+ // had none, and a call used to resolve with, and report, whichever it got.
215
+ // Through `fetchAcrossIdentitySwitch` it runs again for the principal signed
216
+ // in, as `reactor.fetchQuery()` and the factories' `fetch()` do. When the
217
+ // principal switches during that run too, and during each of two more, that
218
+ // rejects with a `CallError`, which is reported to `onError` like any other
219
+ // failure.
220
+ const refetchLatest = async () => {
221
+ if (!isQuery)
222
+ return undefined;
223
+ let runs = 0;
224
+ try {
225
+ const result = await reactor.clientManager.fetchAcrossIdentitySwitch(() =>
226
+ // A run after a switch joins the refetch the switch started for
227
+ // this entry, rather than cancel it and start another.
228
+ queryResult.refetch(runs++ === 0 ? undefined : { cancelRefetch: false }));
229
+ // TanStack's `refetch()` resolves even when the fetch fails, with the
230
+ // entry's last answer still in the result. After a sign-in or sign-out
231
+ // that is the previous principal's: the entry is put back to it when
232
+ // the switch cancels a fetch, and keeps it when the new principal's
233
+ // refetch fails. So a failed refetch resolves `undefined`, as a failed
234
+ // `call(args)` does, and the effects report the failure to `onError`.
235
+ // The hook's `data` keeps the last answer, as TanStack's does.
236
+ return result.isError ? undefined : result.data;
237
+ }
238
+ catch (error) {
239
+ // Only that CallError: `refetch()` itself never rejects. The effects
240
+ // report what the entry settles with, and it settles nothing for this.
241
+ onErrorRef.current?.(error);
242
+ return undefined;
243
+ }
244
+ };
245
+ const callLatest = async (callArgs) => {
119
246
  if (isQuery) {
120
247
  // For queries, refetch with new args if provided
121
248
  if (callArgs !== undefined) {
@@ -124,22 +251,41 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
124
251
  // entry — poisoning it for every other reader — and let fetchQuery
125
252
  // dedupe onto an in-flight request for the old args, returning that
126
253
  // response as though it answered this one.
254
+ const calledKey = buildQueryKey(callArgs);
255
+ // Reported here rather than by the observer effects: this result
256
+ // usually lands under a key the mounted observer (bound to the hook's
257
+ // own args) does not watch. When it is that key, `markCallSettle` has
258
+ // already kept the effects from reporting it as well. Either way the
259
+ // callbacks get what the call settles with.
127
260
  try {
128
- const result = await reactor.queryClient.fetchQuery({
129
- queryKey: buildQueryKey(callArgs),
130
- // Normalize for the same reason as the observer's queryFn.
131
- queryFn: async () => normalizeQueryData((await reactor.callMethod({
132
- functionName,
133
- args: callArgs,
134
- callConfig,
135
- }))),
136
- staleTime: 0,
261
+ const result = await reactor.clientManager.fetchAcrossIdentitySwitch(async () => {
262
+ // Each run marks the settle of its own fetch. A run a switch
263
+ // overtook may have settled with the previous principal's answer,
264
+ // which the effects must not report either.
265
+ const stopMarking = markCallSettle(calledKey);
266
+ try {
267
+ return await reactor.queryClient.fetchQuery({
268
+ // The options the hook's own fetches run with: `retry`,
269
+ // `retryDelay`, `networkMode` and `meta`. With only a key and
270
+ // a function, a call ran on the QueryClient's defaults. It
271
+ // failed on the first error the hook retried through, stayed
272
+ // paused offline under `networkMode: "always"`, and reached
273
+ // the QueryCache callbacks without the hook's `meta`.
274
+ ...pickFetchOptions(queryOptions),
275
+ queryKey: calledKey,
276
+ // Normalize for the same reason as the observer's queryFn.
277
+ queryFn: async () => normalizeQueryData((await reactor.callMethod({
278
+ functionName,
279
+ args: callArgs,
280
+ callConfig,
281
+ }))),
282
+ staleTime: 0,
283
+ });
284
+ }
285
+ finally {
286
+ stopMarking();
287
+ }
137
288
  });
138
- // Dispatched here rather than by the observer effect: this result
139
- // lands under the called args' key, which the mounted observer (bound
140
- // to the hook's own args) does not watch. That separation is also why
141
- // this can no longer double-fire the way it did when both wrote to
142
- // the same key.
143
289
  onSuccessRef.current?.(result);
144
290
  return result;
145
291
  }
@@ -149,8 +295,7 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
149
295
  }
150
296
  }
151
297
  // Otherwise just refetch
152
- const { data } = await queryResult.refetch();
153
- return data;
298
+ return refetchLatest();
154
299
  }
155
300
  else {
156
301
  // For mutations, execute with provided args
@@ -158,19 +303,11 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
158
303
  .mutateAsync(callArgs)
159
304
  .catch(() => undefined);
160
305
  }
161
- }, [
162
- isQuery,
163
- reactor,
164
- functionName,
165
- callConfig,
166
- buildQueryKey,
167
- queryResult,
168
- mutationResult,
169
- ]);
306
+ };
170
307
  // ============================================================================
171
308
  // Reset Function
172
309
  // ============================================================================
173
- const reset = useCallback(() => {
310
+ const resetLatest = () => {
174
311
  if (isQuery) {
175
312
  // Reset, not remove. `removeQueries` drops the entry without notifying
176
313
  // its observers, so this hook kept rendering the old data while bound to
@@ -184,17 +321,24 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
184
321
  else {
185
322
  mutationResult.reset();
186
323
  }
187
- }, [isQuery, reactor, queryKey, mutationResult]);
188
- // ============================================================================
189
- // Refetch Function
190
- // ============================================================================
191
- const refetch = useCallback(async () => {
192
- if (isQuery) {
193
- const result = await queryResult.refetch();
194
- return result.data;
195
- }
196
- return undefined;
197
- }, [isQuery, queryResult]);
324
+ };
325
+ // `call`, `reset` and `refetch` keep one identity for the life of the
326
+ // component, as TanStack's own `refetch`, `mutate` and `reset` do, and run
327
+ // the latest committed render's implementation above when invoked. They used
328
+ // to be `useCallback`s listing the query and mutation results, which TanStack
329
+ // Query returns fresh every render, so they changed every render too. An
330
+ // effect that lists one — `react-hooks/exhaustive-deps` requires it as soon
331
+ // as the effect calls it — then re-ran after every render its own call
332
+ // caused: an unbounded loop of canister calls, state-changing ones for an
333
+ // update method.
334
+ const latest = useCommittedRef({
335
+ call: callLatest,
336
+ reset: resetLatest,
337
+ refetch: refetchLatest,
338
+ });
339
+ const call = useCallback((callArgs) => latest.current.call(callArgs), []);
340
+ const reset = useCallback(() => latest.current.reset(), []);
341
+ const refetch = useCallback(() => latest.current.refetch(), []);
198
342
  // ============================================================================
199
343
  // Return Unified Result
200
344
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"useActorMethod.js","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useActorMethod.js","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,21 @@
1
- import { UseMutationOptions, UseMutationResult, QueryKey } from "@tanstack/react-query";
1
+ import { UseMutationOptions, UseMutationResult } from "@tanstack/react-query";
2
2
  import { Reactor, ReactorArgs, ReactorReturnOk, FunctionName, TransformKey, ReactorReturnErr, CanisterError, ErrResult, ActorMethodReturnType, TransformReturnRegistry } from "@ic-reactor/core";
3
3
  import { CallConfig } from "@icp-sdk/core/agent";
4
+ import type { InvalidationTarget } from "../types.js";
4
5
  export interface UseActorMutationParameters<Service, Method extends FunctionName<Service>, Transform extends TransformKey = "candid", TOnMutateResult = unknown> extends Omit<UseMutationOptions<ReactorReturnOk<Service, Method, Transform>, ReactorReturnErr<Service, Method, Transform>, ReactorArgs<Service, Method, Transform>, TOnMutateResult>, "mutationFn"> {
5
6
  reactor: Reactor<Service, Transform>;
6
7
  functionName: Method;
7
8
  callConfig?: CallConfig;
8
9
  /**
9
- * Queries to invalidate upon successful mutation.
10
+ * Queries to invalidate upon successful mutation, awaited before
11
+ * `onSuccess` runs.
10
12
  *
11
- * `undefined` entries are skipped, so the common
12
- * `[maybeQuery?.getQueryKey()]` idiom is safe when the optional query object
13
- * is absent.
13
+ * Each entry is a query key, a query object or query factory, or a
14
+ * `{ functionName, args? }` method of `reactor`; see
15
+ * {@link InvalidationTarget}. `undefined` entries are skipped, so
16
+ * `[maybeQuery]` is safe when the optional query object is absent.
14
17
  */
15
- invalidateQueries?: (QueryKey | undefined)[];
18
+ invalidateQueries?: InvalidationTarget<Service, Transform>[];
16
19
  /**
17
20
  * Callback for canister-level business logic errors.
18
21
  * Called when the canister returns a Result { Err: E } variant.
@@ -28,7 +31,7 @@ export type UseActorMutationResult<Service, Method extends FunctionName<Service>
28
31
  * For non-React usage, prefer `createMutation(...).execute(args)`.
29
32
  *
30
33
  * @example
31
- * const { mutate, isPending } = useActorMutation({
34
+ * const { mutate, isPending } = useReactorMutation({
32
35
  * reactor,
33
36
  * functionName: "transfer",
34
37
  * onSuccess: () => console.log("Success!"),
@@ -1 +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,EAEhB,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,WAAW,0BAA0B,CACzC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,CACzB,SAAQ,IAAI,CACZ,kBAAkB,CAChB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,eAAe,CAChB,EACD,YAAY,CACb;IACC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAA;IAC5C;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,aAAa,CAClB,uBAAuB,CACrB,SAAS,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EACjD,OAAO,CACR,CAAC,SAAS,CAAC,CACb,EACD,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,KAC/C,IAAI,CAAA;CACV;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,IACvB,IAAI,CACN,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EACvE,SAAS,CACV,CAAA;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,IACvB,iBAAiB,CACnB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,eAAe,CAChB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,EACzB,2GASC,0BAA0B,CAC3B,OAAO,EACP,MAAM,EACN,SAAS,EACT,eAAe,CAChB,KAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CA8ErE,CAAA"}
1
+ {"version":3,"file":"useActorMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorMutation.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,OAAO,EACP,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAEhB,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,0BAA0B,CACzC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,CACzB,SAAQ,IAAI,CACZ,kBAAkB,CAChB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,eAAe,CAChB,EACD,YAAY,CACb;IACC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAA;IAC5D;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,aAAa,CAClB,uBAAuB,CACrB,SAAS,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EACjD,OAAO,CACR,CAAC,SAAS,CAAC,CACb,EACD,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,KAC/C,IAAI,CAAA;CACV;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,IACvB,IAAI,CACN,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EACvE,SAAS,CACV,CAAA;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,IACvB,iBAAiB,CACnB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EACvC,eAAe,CAChB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,eAAe,GAAG,OAAO,EACzB,2GASC,0BAA0B,CAC3B,OAAO,EACP,MAAM,EACN,SAAS,EACT,eAAe,CAChB,KAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CA2ErE,CAAA"}
@@ -1,13 +1,14 @@
1
1
  import { useCallback } from "react";
2
2
  import { useMutation, } from "@tanstack/react-query";
3
3
  import { isCanisterError, } from "@ic-reactor/core";
4
+ import { invalidateTargets, useMountQueryClient } from "../utils.js";
4
5
  /**
5
6
  * Hook for executing mutation calls on a canister.
6
7
  * Use this for component-level mutation flows.
7
8
  * For non-React usage, prefer `createMutation(...).execute(args)`.
8
9
  *
9
10
  * @example
10
- * const { mutate, isPending } = useActorMutation({
11
+ * const { mutate, isPending } = useReactorMutation({
11
12
  * reactor,
12
13
  * functionName: "transfer",
13
14
  * onSuccess: () => console.log("Success!"),
@@ -24,21 +25,15 @@ import { isCanisterError, } from "@ic-reactor/core";
24
25
  * await transferMutation.execute([{ to: "aaaaa-aa", amount: "100" }])
25
26
  */
26
27
  export const useActorMutation = ({ reactor, functionName, invalidateQueries, onSuccess, onError, onCanisterError, callConfig, ...options }) => {
28
+ useMountQueryClient(reactor.queryClient);
27
29
  const mutationFn = useCallback(async (args) => reactor.callMethod({ functionName, callConfig, args }), [reactor, functionName, callConfig]);
28
30
  const handleSuccess = useCallback(async (...params) => {
29
- if (invalidateQueries) {
30
- // Skip undefined entries. React Query reads `{ queryKey: undefined }`
31
- // as "match everything", so a single undefined — which the natural
32
- // `invalidateQueries: [maybeQuery?.getQueryKey()]` idiom produces
33
- // whenever the optional query object is absent — would invalidate every
34
- // query in the client, including an app's unrelated non-canister ones.
35
- // `createMutation.invalidateAll` already filters the same way.
36
- await Promise.all(invalidateQueries
37
- .filter((queryKey) => queryKey !== undefined)
38
- .map((queryKey) => reactor.queryClient.invalidateQueries({ queryKey })));
39
- }
31
+ // Undefined entries are skipped: React Query reads
32
+ // `{ queryKey: undefined }` as "match everything", and the natural
33
+ // `[maybeQuery]` idiom produces one whenever the query is absent.
34
+ await invalidateTargets(reactor, invalidateQueries, callConfig);
40
35
  await onSuccess?.(...params);
41
- }, [reactor, invalidateQueries, onSuccess]);
36
+ }, [reactor, invalidateQueries, onSuccess, callConfig]);
42
37
  const handleError = useCallback(async (error, variables, context, mutation) => {
43
38
  if (isCanisterError(error)) {
44
39
  onCanisterError?.(error, variables);
@@ -60,6 +55,12 @@ export const useActorMutation = ({ reactor, functionName, invalidateQueries, onS
60
55
  // A fresh object per render costs nothing here: `setOptions` diffs the values
61
56
  // rather than the reference.
62
57
  return useMutation({
58
+ // Keyed like `createMutation`'s hook and `useActorMethod`'s mutations,
59
+ // so `useIsMutating({ mutationKey })`, `useMutationState` and defaults
60
+ // registered with `setMutationDefaults` can find this one too. An
61
+ // explicit `mutationKey` in the options still wins.
62
+ mutationKey: reactor.getQueryOptions({ functionName, callConfig })
63
+ .queryKey,
63
64
  ...options,
64
65
  mutationFn,
65
66
  onSuccess: handleSuccess,
@@ -1 +1 @@
1
- {"version":3,"file":"useActorMutation.js","sourceRoot":"","sources":["../../src/hooks/useActorMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EACL,WAAW,GAIZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAOL,eAAe,GAKhB,MAAM,kBAAkB,CAAA;AAkEzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAK9B,EACA,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,eAAe,EACf,UAAU,EACV,GAAG,OAAO,EAMX,EAAuE,EAAE;IACxE,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EAAE,IAA6C,EAAE,EAAE,CACtD,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EACxD,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CACpC,CAAA;IAED,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EACH,GAAG,MASF,EACD,EAAE;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,sEAAsE;YACtE,mEAAmE;YACnE,kEAAkE;YAClE,wEAAwE;YACxE,uEAAuE;YACvE,+DAA+D;YAC/D,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB;iBACd,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC;iBAC5C,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChB,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,CACpD,CACJ,CAAA;QACH,CAAC;QACD,MAAM,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;IAC9B,CAAC,EACD,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAC,CACxC,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EACH,KAAmD,EACnD,SAAkD,EAClD,OAAgB,EAChB,QAAiB,EACjB,EAAE;QACF,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC,KAAY,EAAE,SAAS,CAAC,CAAA;QAC5C,CAAC;QACD,uEAAuE;QACvE,yEAAyE;QACzE,+DAA+D;QAC/D,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAc,EAAE,QAAe,CAAC,CAAA;IACpE,CAAC,EACD,CAAC,eAAe,EAAE,OAAO,CAAC,CAC3B,CAAA;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,+EAA+E;IAC/E,4EAA4E;IAC5E,yEAAyE;IACzE,4EAA4E;IAC5E,+BAA+B;IAC/B,EAAE;IACF,6EAA6E;IAC7E,8EAA8E;IAC9E,6BAA6B;IAC7B,OAAO,WAAW,CAChB;QACE,GAAG,OAAO;QACV,UAAU;QACV,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,WAAW;KACrB,EACD,OAAO,CAAC,WAAW,CACpB,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"useActorMutation.js","sourceRoot":"","sources":["../../src/hooks/useActorMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EACL,WAAW,GAGZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAOL,eAAe,GAKhB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAoEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAK9B,EACA,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,eAAe,EACf,UAAU,EACV,GAAG,OAAO,EAMX,EAAuE,EAAE;IACxE,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAExC,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EAAE,IAA6C,EAAE,EAAE,CACtD,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EACxD,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CACpC,CAAA;IAED,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EACH,GAAG,MASF,EACD,EAAE;QACF,mDAAmD;QACnD,mEAAmE;QACnE,kEAAkE;QAClE,MAAM,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;IAC9B,CAAC,EACD,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,CAAC,CACpD,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EACH,KAAmD,EACnD,SAAkD,EAClD,OAAgB,EAChB,QAAiB,EACjB,EAAE;QACF,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,eAAe,EAAE,CAAC,KAAY,EAAE,SAAS,CAAC,CAAA;QAC5C,CAAC;QACD,uEAAuE;QACvE,yEAAyE;QACzE,+DAA+D;QAC/D,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAc,EAAE,QAAe,CAAC,CAAA;IACpE,CAAC,EACD,CAAC,eAAe,EAAE,OAAO,CAAC,CAC3B,CAAA;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,+EAA+E;IAC/E,4EAA4E;IAC5E,yEAAyE;IACzE,4EAA4E;IAC5E,+BAA+B;IAC/B,EAAE;IACF,6EAA6E;IAC7E,8EAA8E;IAC9E,6BAA6B;IAC7B,OAAO,WAAW,CAChB;QACE,uEAAuE;QACvE,uEAAuE;QACvE,kEAAkE;QAClE,oDAAoD;QACpD,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;aAC/D,QAAQ;QACX,GAAG,OAAO;QACV,UAAU;QACV,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,WAAW;KACrB,EACD,OAAO,CAAC,WAAW,CACpB,CAAA;AACH,CAAC,CAAA"}
@@ -1,10 +1,16 @@
1
- import { QueryKey, QueryObserverOptions, UseQueryResult } from "@tanstack/react-query";
1
+ import { QueryKey, QueryObserverOptions, UseQueryResult, type SkipToken } from "@tanstack/react-query";
2
2
  import { FunctionName, Reactor, TransformKey, ReactorArgs, ReactorReturnOk, ReactorQueryData, ReactorReturnErr } from "@ic-reactor/core";
3
3
  import { CallConfig } from "@icp-sdk/core/agent";
4
4
  export interface UseActorQueryParameters<Service, Method extends FunctionName<Service>, Transform extends TransformKey = "candid", Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>> extends Omit<QueryObserverOptions<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>, Selected, ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, QueryKey>, "queryKey" | "queryFn"> {
5
5
  reactor: Reactor<Service, Transform>;
6
6
  functionName: Method;
7
- args?: ReactorArgs<Service, Method, Transform>;
7
+ /**
8
+ * The method's arguments, or TanStack Query's `skipToken` while they are
9
+ * not known: the query then waits without fetching, in an entry of its own
10
+ * under its method's key, which no call's key shares, so it shows no data
11
+ * until the arguments arrive.
12
+ */
13
+ args?: ReactorArgs<Service, Method, Transform> | SkipToken;
8
14
  callConfig?: CallConfig;
9
15
  queryKey?: QueryKey;
10
16
  }
@@ -14,19 +20,26 @@ export type UseActorQueryResult<Service, Method extends FunctionName<Service>, T
14
20
  * Hook for executing query calls on a canister.
15
21
  *
16
22
  * @example
17
- * const { data, isLoading } = useActorQuery({
23
+ * const { data, isLoading } = useReactorQuery({
18
24
  * reactor,
19
25
  * functionName: "getUser",
20
26
  * args: ["user-123"],
21
27
  * })
22
28
  *
23
29
  * // With select transformation
24
- * const { data } = useActorQuery({
30
+ * const { data } = useReactorQuery({
25
31
  * reactor,
26
32
  * functionName: "getUser",
27
33
  * args: ["user-123"],
28
34
  * select: (user) => user.name,
29
35
  * })
36
+ *
37
+ * // Wait for the args: no fetch until userId is known
38
+ * const { data } = useReactorQuery({
39
+ * reactor,
40
+ * functionName: "getUser",
41
+ * args: userId ? [userId] : skipToken,
42
+ * })
30
43
  */
31
44
  export declare const useActorQuery: <Service, Method extends FunctionName<Service>, Transform extends TransformKey = "candid", Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>>({ reactor, functionName, args, callConfig, queryKey: defaultQueryKey, ...options }: UseActorQueryParameters<Service, Method, Transform, Selected>) => UseActorQueryResult<Service, Method, Transform, Selected>;
32
45
  //# sourceMappingURL=useActorQuery.d.ts.map
@@ -1 +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,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,WAAW,uBAAuB,CACtC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CACxE,SAAQ,IAAI,CACZ,oBAAoB,CAClB,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7D,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,QAAQ,EACR,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7D,QAAQ,CACT,EACD,UAAU,GAAG,SAAS,CACvB;IACC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IAC9C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,MAAM,MAAM,mBAAmB,CAC7B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,IACtE,IAAI,CACN,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC7D,SAAS,CACV,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,IACtE,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAE1E;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EACxE,oFAOC,uBAAuB,CACxB,OAAO,EACP,MAAM,EACN,SAAS,EACT,QAAQ,CACT,KAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CA+B3D,CAAA"}
1
+ {"version":3,"file":"useActorQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorQuery.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EAGR,oBAAoB,EACpB,cAAc,EACd,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD,MAAM,WAAW,uBAAuB,CACtC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CACxE,SAAQ,IAAI,CACZ,oBAAoB,CAClB,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7D,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAC5C,QAAQ,EACR,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7D,QAAQ,CACT,EACD,UAAU,GAAG,SAAS,CACvB;IACC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAA;IAC1D,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,MAAM,MAAM,mBAAmB,CAC7B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,IACtE,IAAI,CACN,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC7D,SAAS,CACV,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,IACtE,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,QAAQ,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EACxE,oFAOC,uBAAuB,CACxB,OAAO,EACP,MAAM,EACN,SAAS,EACT,QAAQ,CACT,KAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAgD3D,CAAA"}
@@ -1,31 +1,51 @@
1
1
  import { useMemo } from "react";
2
- import { useQuery, } from "@tanstack/react-query";
2
+ import { useQuery, skipToken, } from "@tanstack/react-query";
3
+ import { retryOption, skippedQueryKey, useMountQueryClient } from "../utils.js";
3
4
  /**
4
5
  * Hook for executing query calls on a canister.
5
6
  *
6
7
  * @example
7
- * const { data, isLoading } = useActorQuery({
8
+ * const { data, isLoading } = useReactorQuery({
8
9
  * reactor,
9
10
  * functionName: "getUser",
10
11
  * args: ["user-123"],
11
12
  * })
12
13
  *
13
14
  * // With select transformation
14
- * const { data } = useActorQuery({
15
+ * const { data } = useReactorQuery({
15
16
  * reactor,
16
17
  * functionName: "getUser",
17
18
  * args: ["user-123"],
18
19
  * select: (user) => user.name,
19
20
  * })
21
+ *
22
+ * // Wait for the args: no fetch until userId is known
23
+ * const { data } = useReactorQuery({
24
+ * reactor,
25
+ * functionName: "getUser",
26
+ * args: userId ? [userId] : skipToken,
27
+ * })
20
28
  */
21
29
  export const useActorQuery = ({ reactor, functionName, args, callConfig, queryKey: defaultQueryKey, ...options }) => {
30
+ useMountQueryClient(reactor.queryClient);
22
31
  // 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
- }),
32
+ // For an update method, the options also carry its default `retry`; see
33
+ // `Reactor.getQueryRetry`.
34
+ const { queryKey, queryFn, retry } = useMemo(() => args === skipToken
35
+ ? // Waiting for its args: an entry of its own under the method's key,
36
+ // with nothing to run until then; see skippedQueryKey.
37
+ {
38
+ queryKey: skippedQueryKey(reactor.generateQueryKey({ functionName }, callConfig), "query"),
39
+ // Kept as the unique symbol, which an object literal widens.
40
+ queryFn: skipToken,
41
+ retry: undefined,
42
+ }
43
+ : reactor.getQueryOptions({
44
+ callConfig,
45
+ functionName,
46
+ args,
47
+ queryKey: defaultQueryKey,
48
+ }),
29
49
  // `canisterId` is mutable reactor state that `setCanisterId` can change,
30
50
  // while `reactor` itself stays the same object — so it has to be a
31
51
  // dependency in its own right or the key stays pinned to the old canister.
@@ -41,6 +61,7 @@ export const useActorQuery = ({ reactor, functionName, args, callConfig, queryKe
41
61
  queryFn,
42
62
  ...options,
43
63
  queryKey,
64
+ ...retryOption(options.retry, retry),
44
65
  }, reactor.queryClient);
45
66
  };
46
67
  //# sourceMappingURL=useActorQuery.js.map