@ic-reactor/react 3.12.3 → 3.12.4
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/dist/auth/authentication-manager.d.ts +1 -1
- package/dist/auth/authentication-manager.js +1 -1
- package/dist/createActorHooks.d.ts +15 -4
- package/dist/createActorHooks.d.ts.map +1 -1
- package/dist/createActorHooks.js.map +1 -1
- package/dist/createMutation.d.ts.map +1 -1
- package/dist/createMutation.js +33 -7
- package/dist/createMutation.js.map +1 -1
- package/dist/defineReactor.js +1 -4
- package/dist/defineReactor.js.map +1 -1
- package/dist/hooks/createAuthHooks.d.ts +5 -0
- package/dist/hooks/createAuthHooks.d.ts.map +1 -1
- package/dist/hooks/createAuthHooks.js +18 -4
- package/dist/hooks/createAuthHooks.js.map +1 -1
- package/dist/hooks/useActorMethod.d.ts +21 -11
- package/dist/hooks/useActorMethod.d.ts.map +1 -1
- package/dist/hooks/useActorMethod.js +29 -14
- package/dist/hooks/useActorMethod.js.map +1 -1
- package/dist/hooks/useActorMutation.d.ts.map +1 -1
- package/dist/hooks/useActorMutation.js +5 -2
- package/dist/hooks/useActorMutation.js.map +1 -1
- package/package.json +7 -8
- package/src/auth/authentication-manager.ts +1 -1
- package/src/createActorHooks.ts +29 -12
- package/src/createMutation.ts +39 -14
- package/src/defineReactor.ts +1 -2
- package/src/hooks/createAuthHooks.ts +30 -7
- package/src/hooks/useActorMethod.ts +79 -38
- package/src/hooks/useActorMutation.ts +5 -2
|
@@ -71,7 +71,7 @@ export declare class AuthenticationManager {
|
|
|
71
71
|
* module has not been loaded yet.
|
|
72
72
|
*
|
|
73
73
|
* Callers that must stay inside a user gesture use this instead of
|
|
74
|
-
*
|
|
74
|
+
* `ensureClient`; awaiting anything before opening the identity
|
|
75
75
|
* provider window loses the gesture.
|
|
76
76
|
*/
|
|
77
77
|
getPreparedClient(options?: AuthenticationClientOptions): AuthClientLike | undefined;
|
|
@@ -385,7 +385,7 @@ export class AuthenticationManager {
|
|
|
385
385
|
* module has not been loaded yet.
|
|
386
386
|
*
|
|
387
387
|
* Callers that must stay inside a user gesture use this instead of
|
|
388
|
-
*
|
|
388
|
+
* `ensureClient`; awaiting anything before opening the identity
|
|
389
389
|
* provider window loses the gesture.
|
|
390
390
|
*/
|
|
391
391
|
getPreparedClient(options) {
|
|
@@ -19,17 +19,27 @@
|
|
|
19
19
|
import { Reactor, DisplayReactor, ReactorReturnErr, ReactorReturnOk, ReactorQueryData, BaseActor, FunctionName, ReactorArgs, TransformKey } from "@ic-reactor/core";
|
|
20
20
|
import { UseQueryResult, UseSuspenseQueryResult, UseInfiniteQueryResult, UseSuspenseInfiniteQueryResult, UseMutationResult, InfiniteData } from "@tanstack/react-query";
|
|
21
21
|
import { useActorMethod, UseActorMethodParameters } from "./hooks/useActorMethod.js";
|
|
22
|
+
import type { CallConfig } from "@icp-sdk/core/agent";
|
|
22
23
|
import { InfiniteQueryConfig } from "./createInfiniteQuery.js";
|
|
23
24
|
import { SuspenseInfiniteQueryConfig } from "./createSuspenseInfiniteQuery.js";
|
|
24
25
|
import { QueryConfig, SuspenseQueryConfig, MutationConfig } from "./types.js";
|
|
26
|
+
/**
|
|
27
|
+
* The bound query hooks forward their config to `useActorQuery` and
|
|
28
|
+
* `useActorSuspenseQuery`, which take `callConfig`. `QueryConfig` is shared with
|
|
29
|
+
* `createQuery`, which does not use it, so it is added here and not there.
|
|
30
|
+
*/
|
|
31
|
+
type WithCallConfig<Config> = Config & {
|
|
32
|
+
/** Agent call configuration (canisterId override, effectiveCanisterId, etc.) */
|
|
33
|
+
callConfig?: CallConfig;
|
|
34
|
+
};
|
|
25
35
|
export type ActorHooks<Service, Transform extends TransformKey> = {
|
|
26
36
|
useActorQuery: {
|
|
27
|
-
<Method extends FunctionName<Service>>(config: QueryConfig<Service, Method, Transform, ReactorQueryData<ReactorReturnOk<Service, Method, Transform
|
|
28
|
-
<Method extends FunctionName<Service>, TData>(config: QueryConfig<Service, Method, Transform, TData
|
|
37
|
+
<Method extends FunctionName<Service>>(config: WithCallConfig<QueryConfig<Service, Method, Transform, ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>>>): UseQueryResult<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>>;
|
|
38
|
+
<Method extends FunctionName<Service>, TData>(config: WithCallConfig<QueryConfig<Service, Method, Transform, TData>>): UseQueryResult<TData, ReactorReturnErr<Service, Method, Transform>>;
|
|
29
39
|
};
|
|
30
40
|
useActorSuspenseQuery: {
|
|
31
|
-
<Method extends FunctionName<Service>>(config: SuspenseQueryConfig<Service, Method, Transform, ReactorQueryData<ReactorReturnOk<Service, Method, Transform
|
|
32
|
-
<Method extends FunctionName<Service>, TData>(config: SuspenseQueryConfig<Service, Method, Transform, TData
|
|
41
|
+
<Method extends FunctionName<Service>>(config: WithCallConfig<SuspenseQueryConfig<Service, Method, Transform, ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>>>): UseSuspenseQueryResult<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>>;
|
|
42
|
+
<Method extends FunctionName<Service>, TData>(config: WithCallConfig<SuspenseQueryConfig<Service, Method, Transform, TData>>): UseSuspenseQueryResult<TData, ReactorReturnErr<Service, Method, Transform>>;
|
|
33
43
|
};
|
|
34
44
|
useActorInfiniteQuery: <Method extends FunctionName<Service>, TPageParam = unknown>(config: InfiniteQueryConfig<Service, Method, Transform, TPageParam>) => UseInfiniteQueryResult<InfiniteData<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, TPageParam>, ReactorReturnErr<Service, Method, Transform>>;
|
|
35
45
|
useActorSuspenseInfiniteQuery: <Method extends FunctionName<Service>, TPageParam = unknown>(config: SuspenseInfiniteQueryConfig<Service, Method, Transform, TPageParam>) => UseSuspenseInfiniteQueryResult<InfiniteData<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, TPageParam>, ReactorReturnErr<Service, Method, Transform>>;
|
|
@@ -38,4 +48,5 @@ export type ActorHooks<Service, Transform extends TransformKey> = {
|
|
|
38
48
|
};
|
|
39
49
|
export declare function createActorHooks<Service>(reactor: DisplayReactor<Service>): ActorHooks<Service, "display">;
|
|
40
50
|
export declare function createActorHooks<Service = BaseActor, Transform extends TransformKey = "candid">(reactor: Reactor<Service, Transform>): ActorHooks<Service, Transform>;
|
|
51
|
+
export {};
|
|
41
52
|
//# sourceMappingURL=createActorHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createActorHooks.d.ts","sourceRoot":"","sources":["../src/createActorHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,YAAY,EACb,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EACL,cAAc,EACd,wBAAwB,EACzB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7E,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,SAAS,YAAY,IAAI;IAChE,aAAa,EAAE;QACb,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACnC,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"createActorHooks.d.ts","sourceRoot":"","sources":["../src/createActorHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createActorHooks.js","sourceRoot":"","sources":["../src/createActorHooks.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EACL,cAAc,GAEf,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"createActorHooks.js","sourceRoot":"","sources":["../src/createActorHooks.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EACL,cAAc,GAEf,MAAM,2BAA2B,CAAA;AAiHlC,MAAM,UAAU,gBAAgB,CAC9B,OAAoC;IAEpC,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE,CAC9B,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAGrB;QAElB,qBAAqB,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE,CACtC,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAGrB;QAE1B,qBAAqB,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE,CACtC,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAGrB;QAE1B,6BAA6B,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE,CAC9C,6BAA6B,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAGrB;QAElC,gBAAgB,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE,CACjC,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAGrB;QAErB,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAIlC,CAAC;KACL,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMutation.d.ts","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"createMutation.d.ts","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAEZ,YAAY,EAEb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,OAAO,EACR,MAAM,YAAY,CAAA;AA0LnB,wBAAgB,cAAc,CAC5B,OAAO,EACP,SAAS,SAAS,YAAY,EAC9B,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EAE5D,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EACpC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,GAC1D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAK5C"}
|
package/dist/createMutation.js
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* // Outside React (loader/service/script)
|
|
25
25
|
* await transferMutation.execute([{ to: "aaaaa-aa", amount: "1000" }])
|
|
26
26
|
*/
|
|
27
|
-
import { useMutation } from "@tanstack/react-query";
|
|
27
|
+
import { useMutation, } from "@tanstack/react-query";
|
|
28
28
|
import { isCanisterError } from "@ic-reactor/core";
|
|
29
29
|
// ============================================================================
|
|
30
30
|
// Internal helpers
|
|
@@ -52,12 +52,33 @@ const createMutationImpl = (reactor, config) => {
|
|
|
52
52
|
* object behaves the same through both call paths. Only hook-level callbacks
|
|
53
53
|
* are absent, because there is no hook here to supply them.
|
|
54
54
|
*
|
|
55
|
+
* The callbacks get the same `{ client, meta, mutationKey }` context
|
|
56
|
+
* TanStack Query passes them on the hook path.
|
|
57
|
+
*
|
|
55
58
|
* The error is rethrown after the callbacks run, so `await execute(...)`
|
|
56
59
|
* still rejects for the caller.
|
|
57
60
|
*
|
|
58
61
|
* Use this in route loaders, scripts, or server-side code.
|
|
59
62
|
*/
|
|
60
63
|
const execute = async (args) => {
|
|
64
|
+
// TanStack Query builds this for the hook path, and the callback types
|
|
65
|
+
// declare it as always present. None of it is mutation state, so this path
|
|
66
|
+
// builds the same object. Passing `undefined` made a callback that reads
|
|
67
|
+
// `context.client` throw here and nowhere else.
|
|
68
|
+
//
|
|
69
|
+
// The hook path takes `meta` and `mutationKey` from the client's defaulted
|
|
70
|
+
// options, so this runs the same spread through `defaultMutationOptions`.
|
|
71
|
+
// Reading `factoryOptions` alone dropped mutation defaults registered on
|
|
72
|
+
// the QueryClient (`defaultOptions.mutations`, `setMutationDefaults`).
|
|
73
|
+
const effectiveOptions = reactor.queryClient.defaultMutationOptions({
|
|
74
|
+
mutationKey: reactor.getQueryOptions({ functionName }).queryKey,
|
|
75
|
+
...factoryOptions,
|
|
76
|
+
});
|
|
77
|
+
const context = {
|
|
78
|
+
client: reactor.queryClient,
|
|
79
|
+
meta: effectiveOptions.meta,
|
|
80
|
+
mutationKey: effectiveOptions.mutationKey,
|
|
81
|
+
};
|
|
61
82
|
let result;
|
|
62
83
|
try {
|
|
63
84
|
result = await callFn(args);
|
|
@@ -66,14 +87,16 @@ const createMutationImpl = (reactor, config) => {
|
|
|
66
87
|
if (isCanisterError(error)) {
|
|
67
88
|
factoryOnCanisterError?.(error, args);
|
|
68
89
|
}
|
|
69
|
-
//
|
|
70
|
-
|
|
90
|
+
// `onMutate` does not run on this path, so there is no result to pass.
|
|
91
|
+
// Awaited like `onSuccess` below and like the hook path, so an async
|
|
92
|
+
// rollback or report finishes before `execute()` rejects.
|
|
93
|
+
await factoryOnError?.(error, args, undefined, context);
|
|
71
94
|
throw error;
|
|
72
95
|
}
|
|
73
96
|
if (factoryInvalidateQueries) {
|
|
74
97
|
await invalidateAll(reactor.queryClient, factoryInvalidateQueries);
|
|
75
98
|
}
|
|
76
|
-
await factoryOnSuccess?.(result, args, undefined,
|
|
99
|
+
await factoryOnSuccess?.(result, args, undefined, context);
|
|
77
100
|
return result;
|
|
78
101
|
};
|
|
79
102
|
// Hook implementation
|
|
@@ -101,13 +124,16 @@ const createMutationImpl = (reactor, config) => {
|
|
|
101
124
|
// 4. Hook onSuccess
|
|
102
125
|
await restOptions.onSuccess?.(...args);
|
|
103
126
|
},
|
|
104
|
-
onError: (error, variables, context, mutation) => {
|
|
127
|
+
onError: async (error, variables, context, mutation) => {
|
|
105
128
|
if (isCanisterError(error)) {
|
|
106
129
|
factoryOnCanisterError?.(error, variables);
|
|
107
130
|
hookOnCanisterError?.(error, variables);
|
|
108
131
|
}
|
|
109
|
-
|
|
110
|
-
|
|
132
|
+
// Awaited in order, like `onSuccess`. TanStack Query holds
|
|
133
|
+
// `onSettled` and the settled state until this promise resolves, so
|
|
134
|
+
// an async `onError` must be part of it.
|
|
135
|
+
await factoryOnError?.(error, variables, context, mutation);
|
|
136
|
+
await restOptions.onError?.(error, variables, context, mutation);
|
|
111
137
|
},
|
|
112
138
|
// `onMutate` and `onSettled` are composed like `onSuccess`/`onError`
|
|
113
139
|
// above. They used to arrive through the `...restOptions` spread, so a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"createMutation.js","sourceRoot":"","sources":["../src/createMutation.ts"],"names":[],"mappings":"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"}
|
package/dist/defineReactor.js
CHANGED
|
@@ -76,9 +76,7 @@ import { createAuthHooks } from "./hooks/createAuthHooks.js";
|
|
|
76
76
|
const createDefaultQueryClient = () => new QueryClient({
|
|
77
77
|
defaultOptions: { queries: { retry: reactorRetry } },
|
|
78
78
|
});
|
|
79
|
-
export function defineReactor(params
|
|
80
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
-
) {
|
|
79
|
+
export function defineReactor(params) {
|
|
82
80
|
const { clientManager: providedClientManager, queryClient: providedQueryClient, authentication: providedAuthentication, auth, display, agentOptions, allowEnvConfig, allowEnvRootKey, name, idlFactory, canisterId, pollingOptions, } = params;
|
|
83
81
|
// A shared AuthenticationManager updates the identity on its own
|
|
84
82
|
// ClientManager. Giving this reactor a different one would leave its calls
|
|
@@ -138,7 +136,6 @@ export function defineReactor(params
|
|
|
138
136
|
// The Reactor / DisplayReactor union cannot be expressed through the shared
|
|
139
137
|
// implementation signature, so the body is intentionally untyped here; the
|
|
140
138
|
// public overloads above carry the precise types for callers.
|
|
141
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
142
139
|
const reactor = display
|
|
143
140
|
? new DisplayReactor({
|
|
144
141
|
...reactorConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineReactor.js","sourceRoot":"","sources":["../src/defineReactor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,OAAO,EACL,aAAa,EACb,OAAO,EACP,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAA;AAQzB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAc,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AA2E5D;;;;;;;;;;;GAWG;AACH,MAAM,wBAAwB,GAAG,GAAG,EAAE,CACpC,IAAI,WAAW,CAAC;IACd,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;CACrD,CAAC,CAAA;AAUJ,MAAM,UAAU,aAAa,CAC3B,MAAyE;
|
|
1
|
+
{"version":3,"file":"defineReactor.js","sourceRoot":"","sources":["../src/defineReactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,11 @@ export interface UseAuthReturn {
|
|
|
11
11
|
}) => Promise<void>;
|
|
12
12
|
isAuthenticated: boolean;
|
|
13
13
|
isAuthenticating: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* The signed-in user's principal, or `null` while signed out. A signed-out
|
|
16
|
+
* session still holds an anonymous `identity`, and its principal is not
|
|
17
|
+
* returned here.
|
|
18
|
+
*/
|
|
14
19
|
principal: Principal | null;
|
|
15
20
|
identity: Identity | null;
|
|
16
21
|
error: Error | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthHooks.d.ts","sourceRoot":"","sources":["../../src/hooks/createAuthHooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAa,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACjD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,eAAe,EAAE,OAAO,CAAA;IACxB,gBAAgB,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,gBAAgB,EAAE,MAAM,SAAS,GAAG,IAAI,CAAA;IACxC,OAAO,EAAE,MAAM,aAAa,CAAA;CAC7B;
|
|
1
|
+
{"version":3,"file":"createAuthHooks.d.ts","sourceRoot":"","sources":["../../src/hooks/createAuthHooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAa,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACjD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,eAAe,EAAE,OAAO,CAAA;IACxB,gBAAgB,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,gBAAgB,EAAE,MAAM,SAAS,GAAG,IAAI,CAAA;IACxC,OAAO,EAAE,MAAM,aAAa,CAAA;CAC7B;AAsBD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,qBAAqB,KACpC,qBA2HF,CAAA"}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { useSyncExternalStore, useEffect, useRef, useMemo } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* The principal both hooks return.
|
|
4
|
+
*
|
|
5
|
+
* `authenticate()` and `logout()` leave the client's anonymous identity in
|
|
6
|
+
* `authState.identity` with `isAuthenticated: false`, so deriving the principal
|
|
7
|
+
* from the identity alone reported `2vxsx-fae` for a signed-out user, and
|
|
8
|
+
* `principal ? <SignedIn /> : <SignedOut />` rendered the signed-in branch.
|
|
9
|
+
* Memoized on the identity, because `getPrincipal()` may build a new object on
|
|
10
|
+
* each call and the result is often a hook dependency.
|
|
11
|
+
*/
|
|
12
|
+
function usePrincipal(isAuthenticated, identity) {
|
|
13
|
+
return useMemo(() => (isAuthenticated && identity ? identity.getPrincipal() : null), [isAuthenticated, identity]);
|
|
14
|
+
}
|
|
2
15
|
/**
|
|
3
16
|
* Create authentication hooks for managing user sessions with Internet Identity.
|
|
4
17
|
*
|
|
@@ -81,7 +94,7 @@ export const createAuthHooks = (authentication) => {
|
|
|
81
94
|
.catch(() => undefined);
|
|
82
95
|
}
|
|
83
96
|
}, []);
|
|
84
|
-
const principal =
|
|
97
|
+
const principal = usePrincipal(isAuthenticated, identity);
|
|
85
98
|
return {
|
|
86
99
|
authenticate,
|
|
87
100
|
login,
|
|
@@ -95,7 +108,8 @@ export const createAuthHooks = (authentication) => {
|
|
|
95
108
|
};
|
|
96
109
|
/**
|
|
97
110
|
* Get the current user's Principal.
|
|
98
|
-
* Returns null if not authenticated
|
|
111
|
+
* Returns null if not authenticated, including while the signed-out session
|
|
112
|
+
* holds the anonymous identity.
|
|
99
113
|
*
|
|
100
114
|
* @example
|
|
101
115
|
* function UserInfo() {
|
|
@@ -105,8 +119,8 @@ export const createAuthHooks = (authentication) => {
|
|
|
105
119
|
* }
|
|
106
120
|
*/
|
|
107
121
|
const useUserPrincipal = () => {
|
|
108
|
-
const { identity } = useAuthState();
|
|
109
|
-
return
|
|
122
|
+
const { isAuthenticated, identity } = useAuthState();
|
|
123
|
+
return usePrincipal(isAuthenticated, identity);
|
|
110
124
|
};
|
|
111
125
|
return {
|
|
112
126
|
useAuth,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthHooks.js","sourceRoot":"","sources":["../../src/hooks/createAuthHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"createAuthHooks.js","sourceRoot":"","sources":["../../src/hooks/createAuthHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type UseQueryResult, type UseMutationResult, type QueryKey, type QueryObserverOptions } from "@tanstack/react-query";
|
|
2
|
-
import { Reactor, BaseActor, FunctionName, TransformKey, ReactorArgs, ReactorReturnOk, ReactorReturnErr, FunctionType } from "@ic-reactor/core";
|
|
2
|
+
import { Reactor, BaseActor, FunctionName, TransformKey, ReactorArgs, ReactorReturnOk, ReactorQueryData, ReactorReturnErr, FunctionType } from "@ic-reactor/core";
|
|
3
3
|
import { CallConfig } from "@icp-sdk/core/agent";
|
|
4
4
|
/**
|
|
5
5
|
* Configuration for useActorMethod hook.
|
|
@@ -9,7 +9,7 @@ import { CallConfig } from "@icp-sdk/core/agent";
|
|
|
9
9
|
* Query-specific options (like refetchInterval) only apply to query methods.
|
|
10
10
|
* Mutation-specific options (like invalidateQueries) only apply to mutation methods.
|
|
11
11
|
*/
|
|
12
|
-
export interface UseActorMethodParameters<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid"> extends Omit<QueryObserverOptions<ReactorReturnOk<Service, Method, Transform
|
|
12
|
+
export interface UseActorMethodParameters<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid"> extends Omit<QueryObserverOptions<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>, ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, QueryKey>, "queryKey" | "queryFn"> {
|
|
13
13
|
/** The reactor instance to use for method calls */
|
|
14
14
|
reactor: Reactor<Service, Transform>;
|
|
15
15
|
/** The method name to call on the canister */
|
|
@@ -23,8 +23,11 @@ export interface UseActorMethodParameters<Service = BaseActor, Method extends Fu
|
|
|
23
23
|
/**
|
|
24
24
|
* Callback when the method call succeeds.
|
|
25
25
|
* Works for both query and mutation methods.
|
|
26
|
+
*
|
|
27
|
+
* A method's `undefined` result arrives as `null`, as in `useActorQuery`,
|
|
28
|
+
* for query and update methods alike.
|
|
26
29
|
*/
|
|
27
|
-
onSuccess?: (data: ReactorReturnOk<Service, Method, Transform
|
|
30
|
+
onSuccess?: (data: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>) => void;
|
|
28
31
|
/**
|
|
29
32
|
* Callback when the method call fails.
|
|
30
33
|
* Works for both query and mutation methods.
|
|
@@ -46,8 +49,12 @@ export type UseActorMethodConfig<Service = BaseActor, Method extends FunctionNam
|
|
|
46
49
|
* Provides a unified interface for both query and mutation methods.
|
|
47
50
|
*/
|
|
48
51
|
export interface UseActorMethodResult<Service = BaseActor, Method extends FunctionName<Service> = FunctionName<Service>, Transform extends TransformKey = "candid"> {
|
|
49
|
-
/**
|
|
50
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The returned data from the method call. A method's `undefined` result is
|
|
54
|
+
* `null` here, as in `useActorQuery`, so `undefined` only means no call has
|
|
55
|
+
* settled yet.
|
|
56
|
+
*/
|
|
57
|
+
data: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined;
|
|
51
58
|
/** Whether the method is currently executing */
|
|
52
59
|
isLoading: boolean;
|
|
53
60
|
/** Alias for isLoading - whether a mutation is pending */
|
|
@@ -67,21 +74,24 @@ export interface UseActorMethodResult<Service = BaseActor, Method extends Functi
|
|
|
67
74
|
* For queries: triggers a refetch
|
|
68
75
|
* For mutations: executes the mutation with the provided args
|
|
69
76
|
*/
|
|
70
|
-
call: (args?: ReactorArgs<Service, Method, Transform>) => Promise<ReactorReturnOk<Service, Method, Transform
|
|
77
|
+
call: (args?: ReactorArgs<Service, Method, Transform>) => Promise<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined>;
|
|
71
78
|
/**
|
|
72
|
-
* Reset the state (
|
|
73
|
-
* For queries:
|
|
79
|
+
* Reset the state (data and error).
|
|
80
|
+
* For queries: resets this hook's own cache entry to its initial state, so
|
|
81
|
+
* `data` goes back to `initialData` when one was given and is cleared
|
|
82
|
+
* otherwise. An enabled hook then refetches. Other args of the same method
|
|
83
|
+
* are left alone.
|
|
74
84
|
* For mutations: resets the mutation state
|
|
75
85
|
*/
|
|
76
86
|
reset: () => void;
|
|
77
87
|
/**
|
|
78
88
|
* For queries only: Refetch the query
|
|
79
89
|
*/
|
|
80
|
-
refetch: () => Promise<ReactorReturnOk<Service, Method, Transform
|
|
90
|
+
refetch: () => Promise<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined>;
|
|
81
91
|
/** The raw query result (only available for query methods) */
|
|
82
|
-
queryResult?: UseQueryResult<ReactorReturnOk<Service, Method, Transform
|
|
92
|
+
queryResult?: UseQueryResult<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>>;
|
|
83
93
|
/** The raw mutation result (only available for mutation methods) */
|
|
84
|
-
mutationResult?: UseMutationResult<ReactorReturnOk<Service, Method, Transform
|
|
94
|
+
mutationResult?: UseMutationResult<ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>, ReactorReturnErr<Service, Method, Transform>, ReactorArgs<Service, Method, Transform>>;
|
|
85
95
|
}
|
|
86
96
|
/**
|
|
87
97
|
* A unified hook for calling canister methods that automatically handles
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActorMethod.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"useActorMethod.d.ts","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
2
2
|
import { useQuery, useMutation, } from "@tanstack/react-query";
|
|
3
|
+
import { normalizeQueryData } from "../utils.js";
|
|
3
4
|
/**
|
|
4
5
|
* A unified hook for calling canister methods that automatically handles
|
|
5
6
|
* both query and mutation methods based on the Candid interface.
|
|
@@ -47,11 +48,16 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
|
|
|
47
48
|
// QueryClient) and `onSuccess` never fired when data came from the cache
|
|
48
49
|
// or a deduped sibling. They are dispatched from the settled observer
|
|
49
50
|
// result below instead.
|
|
50
|
-
|
|
51
|
+
//
|
|
52
|
+
// TanStack Query fails a query whose queryFn resolves `undefined`, with
|
|
53
|
+
// "data is undefined", and a successful call can resolve it. A
|
|
54
|
+
// DisplayReactor decodes an `opt` None to `undefined`, and a `()` query
|
|
55
|
+
// returns nothing. Every other query path normalizes the value to `null`.
|
|
56
|
+
queryFn: async () => normalizeQueryData((await reactor.callMethod({
|
|
51
57
|
functionName,
|
|
52
58
|
args,
|
|
53
59
|
callConfig,
|
|
54
|
-
}),
|
|
60
|
+
}))),
|
|
55
61
|
enabled: isQuery && enabled,
|
|
56
62
|
...queryOptions,
|
|
57
63
|
}, reactor.queryClient);
|
|
@@ -84,20 +90,21 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
|
|
|
84
90
|
// ============================================================================
|
|
85
91
|
const mutationResult = useMutation({
|
|
86
92
|
mutationKey: queryKey,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
// Normalized like the query branch, so `data`, `call()` and `onSuccess`
|
|
94
|
+
// mean the same thing for both kinds of method. The hook cannot type the
|
|
95
|
+
// two branches apart: a Candid service type does not say which methods
|
|
96
|
+
// are queries.
|
|
97
|
+
mutationFn: async (mutationArgs) => normalizeQueryData((await reactor.callMethod({
|
|
98
|
+
functionName,
|
|
99
|
+
args: mutationArgs ?? args,
|
|
100
|
+
callConfig,
|
|
101
|
+
}))),
|
|
95
102
|
onSuccess: (data) => {
|
|
96
103
|
onSuccessRef.current?.(data);
|
|
97
104
|
// Invalidate specified queries after successful mutation
|
|
98
105
|
if (invalidateQueries && invalidateQueries.length > 0) {
|
|
99
106
|
invalidateQueries.forEach((key) => {
|
|
100
|
-
reactor.queryClient.invalidateQueries({ queryKey: key });
|
|
107
|
+
void reactor.queryClient.invalidateQueries({ queryKey: key });
|
|
101
108
|
});
|
|
102
109
|
}
|
|
103
110
|
},
|
|
@@ -120,11 +127,12 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
|
|
|
120
127
|
try {
|
|
121
128
|
const result = await reactor.queryClient.fetchQuery({
|
|
122
129
|
queryKey: buildQueryKey(callArgs),
|
|
123
|
-
|
|
130
|
+
// Normalize for the same reason as the observer's queryFn.
|
|
131
|
+
queryFn: async () => normalizeQueryData((await reactor.callMethod({
|
|
124
132
|
functionName,
|
|
125
133
|
args: callArgs,
|
|
126
134
|
callConfig,
|
|
127
|
-
}),
|
|
135
|
+
}))),
|
|
128
136
|
staleTime: 0,
|
|
129
137
|
});
|
|
130
138
|
// Dispatched here rather than by the observer effect: this result
|
|
@@ -164,7 +172,14 @@ export function useActorMethod({ reactor, functionName, args, callConfig, queryK
|
|
|
164
172
|
// ============================================================================
|
|
165
173
|
const reset = useCallback(() => {
|
|
166
174
|
if (isQuery) {
|
|
167
|
-
|
|
175
|
+
// Reset, not remove. `removeQueries` drops the entry without notifying
|
|
176
|
+
// its observers, so this hook kept rendering the old data while bound to
|
|
177
|
+
// a query that was no longer in the cache. No later invalidation reached
|
|
178
|
+
// it, including the one an identity switch runs. `resetQueries` notifies
|
|
179
|
+
// the observer and refetches the entry when the hook is enabled. It is
|
|
180
|
+
// `exact` because only this hook's entry should reset. A prefix match on
|
|
181
|
+
// a no-args key would also reset every args variant other hooks render.
|
|
182
|
+
void reactor.queryClient.resetQueries({ queryKey, exact: true });
|
|
168
183
|
}
|
|
169
184
|
else {
|
|
170
185
|
mutationResult.reset();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActorMethod.js","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,EACL,QAAQ,EACR,WAAW,GAKZ,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"useActorMethod.js","sourceRoot":"","sources":["../../src/hooks/useActorMethod.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CACzC,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,CACxC,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,CAClD,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,IACvC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;AAE3E,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,IACvC,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,CACxC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,2GASC,0BAA0B,CAC3B,OAAO,EACP,MAAM,EACN,SAAS,CACV,KAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,
|
|
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,CACzC,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,CACxC,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,CAClD,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,IACvC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;AAE3E,MAAM,MAAM,sBAAsB,CAChC,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,IACvC,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,CACxC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,EACP,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,EACpC,SAAS,SAAS,YAAY,GAAG,QAAQ,EACzC,2GASC,0BAA0B,CAC3B,OAAO,EACP,MAAM,EACN,SAAS,CACV,KAAG,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CA6EpD,CAAA"}
|
|
@@ -39,11 +39,14 @@ export const useActorMutation = ({ reactor, functionName, invalidateQueries, onS
|
|
|
39
39
|
}
|
|
40
40
|
await onSuccess?.(...params);
|
|
41
41
|
}, [reactor, invalidateQueries, onSuccess]);
|
|
42
|
-
const handleError = useCallback((error, variables, context, mutation) => {
|
|
42
|
+
const handleError = useCallback(async (error, variables, context, mutation) => {
|
|
43
43
|
if (isCanisterError(error)) {
|
|
44
44
|
onCanisterError?.(error, variables);
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
// Awaited like `onSuccess` above. TanStack Query waits for the promise
|
|
47
|
+
// `onError` returns before it runs `onSettled` and settles the mutation,
|
|
48
|
+
// and it can only wait for a promise this wrapper passes back.
|
|
49
|
+
await onError?.(error, variables, context, mutation);
|
|
47
50
|
}, [onCanisterError, onError]);
|
|
48
51
|
// Not memoized. The deps could only ever list the values destructured above,
|
|
49
52
|
// never the `options` rest bucket, so everything passed straight through —
|
|
@@ -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;AAyDzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAI9B,EACA,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,eAAe,EACf,UAAU,EACV,GAAG,OAAO,EAKX,EAAsD,EAAE;IACvD,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,MAQF,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,
|
|
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;AAyDzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAI9B,EACA,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,eAAe,EACf,UAAU,EACV,GAAG,OAAO,EAKX,EAAsD,EAAE;IACvD,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,MAQF,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ic-reactor/react",
|
|
3
|
-
"version": "3.12.
|
|
3
|
+
"version": "3.12.4",
|
|
4
4
|
"description": "IC Reactor React library for building Internet Computer apps",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"author": "Behrad Deylami",
|
|
54
54
|
"license": "MIT",
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@ic-reactor/core": "^3.12.
|
|
56
|
+
"@ic-reactor/core": "^3.12.4"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"@icp-sdk/auth": "^8.0.0",
|
|
@@ -70,14 +70,14 @@
|
|
|
70
70
|
"@testing-library/dom": "^10.4.1",
|
|
71
71
|
"@testing-library/jest-dom": "^7.0.1",
|
|
72
72
|
"@testing-library/react": "^16.3.3",
|
|
73
|
-
"@types/react": "^19.
|
|
74
|
-
"@types/react-dom": "^19.
|
|
73
|
+
"@types/react": "^19.3.0",
|
|
74
|
+
"@types/react-dom": "^19.3.0",
|
|
75
75
|
"fake-indexeddb": "^6.2.5",
|
|
76
76
|
"jsdom": "^30.0.1",
|
|
77
|
-
"react": "^19.
|
|
78
|
-
"react-dom": "^19.
|
|
77
|
+
"react": "^19.3.0",
|
|
78
|
+
"react-dom": "^19.3.0",
|
|
79
79
|
"size-limit": "^13.0.3",
|
|
80
|
-
"vitest": "^
|
|
80
|
+
"vitest": "^5.0.0"
|
|
81
81
|
},
|
|
82
82
|
"size-limit": [
|
|
83
83
|
{
|
|
@@ -106,7 +106,6 @@
|
|
|
106
106
|
"build": "rm -rf dist tsconfig.tsbuildinfo && tsc",
|
|
107
107
|
"test": "vitest run",
|
|
108
108
|
"size": "size-limit",
|
|
109
|
-
"analyze": "size-limit",
|
|
110
109
|
"typecheck": "tsc --noEmit -p tsconfig.typecheck.json"
|
|
111
110
|
}
|
|
112
111
|
}
|
|
@@ -203,7 +203,7 @@ export class AuthenticationManager {
|
|
|
203
203
|
* module has not been loaded yet.
|
|
204
204
|
*
|
|
205
205
|
* Callers that must stay inside a user gesture use this instead of
|
|
206
|
-
*
|
|
206
|
+
* `ensureClient`; awaiting anything before opening the identity
|
|
207
207
|
* provider window loses the gesture.
|
|
208
208
|
*/
|
|
209
209
|
public getPreparedClient(
|
package/src/createActorHooks.ts
CHANGED
|
@@ -44,42 +44,59 @@ import {
|
|
|
44
44
|
useActorMethod,
|
|
45
45
|
UseActorMethodParameters,
|
|
46
46
|
} from "./hooks/useActorMethod.js"
|
|
47
|
+
import type { CallConfig } from "@icp-sdk/core/agent"
|
|
47
48
|
import { InfiniteQueryConfig } from "./createInfiniteQuery.js"
|
|
48
49
|
import { SuspenseInfiniteQueryConfig } from "./createSuspenseInfiniteQuery.js"
|
|
49
50
|
import { QueryConfig, SuspenseQueryConfig, MutationConfig } from "./types.js"
|
|
50
51
|
|
|
52
|
+
/**
|
|
53
|
+
* The bound query hooks forward their config to `useActorQuery` and
|
|
54
|
+
* `useActorSuspenseQuery`, which take `callConfig`. `QueryConfig` is shared with
|
|
55
|
+
* `createQuery`, which does not use it, so it is added here and not there.
|
|
56
|
+
*/
|
|
57
|
+
type WithCallConfig<Config> = Config & {
|
|
58
|
+
/** Agent call configuration (canisterId override, effectiveCanisterId, etc.) */
|
|
59
|
+
callConfig?: CallConfig
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
export type ActorHooks<Service, Transform extends TransformKey> = {
|
|
52
63
|
useActorQuery: {
|
|
53
64
|
<Method extends FunctionName<Service>>(
|
|
54
|
-
config:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
config: WithCallConfig<
|
|
66
|
+
QueryConfig<
|
|
67
|
+
Service,
|
|
68
|
+
Method,
|
|
69
|
+
Transform,
|
|
70
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>
|
|
71
|
+
>
|
|
59
72
|
>
|
|
60
73
|
): UseQueryResult<
|
|
61
74
|
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
62
75
|
ReactorReturnErr<Service, Method, Transform>
|
|
63
76
|
>
|
|
64
77
|
<Method extends FunctionName<Service>, TData>(
|
|
65
|
-
config: QueryConfig<Service, Method, Transform, TData
|
|
78
|
+
config: WithCallConfig<QueryConfig<Service, Method, Transform, TData>>
|
|
66
79
|
): UseQueryResult<TData, ReactorReturnErr<Service, Method, Transform>>
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
useActorSuspenseQuery: {
|
|
70
83
|
<Method extends FunctionName<Service>>(
|
|
71
|
-
config:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
84
|
+
config: WithCallConfig<
|
|
85
|
+
SuspenseQueryConfig<
|
|
86
|
+
Service,
|
|
87
|
+
Method,
|
|
88
|
+
Transform,
|
|
89
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>
|
|
90
|
+
>
|
|
76
91
|
>
|
|
77
92
|
): UseSuspenseQueryResult<
|
|
78
93
|
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
79
94
|
ReactorReturnErr<Service, Method, Transform>
|
|
80
95
|
>
|
|
81
96
|
<Method extends FunctionName<Service>, TData>(
|
|
82
|
-
config:
|
|
97
|
+
config: WithCallConfig<
|
|
98
|
+
SuspenseQueryConfig<Service, Method, Transform, TData>
|
|
99
|
+
>
|
|
83
100
|
): UseSuspenseQueryResult<
|
|
84
101
|
TData,
|
|
85
102
|
ReactorReturnErr<Service, Method, Transform>
|
package/src/createMutation.ts
CHANGED
|
@@ -25,7 +25,10 @@
|
|
|
25
25
|
* await transferMutation.execute([{ to: "aaaaa-aa", amount: "1000" }])
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
useMutation,
|
|
30
|
+
type MutationFunctionContext,
|
|
31
|
+
} from "@tanstack/react-query"
|
|
29
32
|
import type {
|
|
30
33
|
Reactor,
|
|
31
34
|
FunctionName,
|
|
@@ -99,6 +102,9 @@ const createMutationImpl = <
|
|
|
99
102
|
* object behaves the same through both call paths. Only hook-level callbacks
|
|
100
103
|
* are absent, because there is no hook here to supply them.
|
|
101
104
|
*
|
|
105
|
+
* The callbacks get the same `{ client, meta, mutationKey }` context
|
|
106
|
+
* TanStack Query passes them on the hook path.
|
|
107
|
+
*
|
|
102
108
|
* The error is rethrown after the callbacks run, so `await execute(...)`
|
|
103
109
|
* still rejects for the caller.
|
|
104
110
|
*
|
|
@@ -107,6 +113,25 @@ const createMutationImpl = <
|
|
|
107
113
|
const execute = async (
|
|
108
114
|
args: ReactorArgs<Service, Method, Transform>
|
|
109
115
|
): Promise<ReactorReturnOk<Service, Method, Transform>> => {
|
|
116
|
+
// TanStack Query builds this for the hook path, and the callback types
|
|
117
|
+
// declare it as always present. None of it is mutation state, so this path
|
|
118
|
+
// builds the same object. Passing `undefined` made a callback that reads
|
|
119
|
+
// `context.client` throw here and nowhere else.
|
|
120
|
+
//
|
|
121
|
+
// The hook path takes `meta` and `mutationKey` from the client's defaulted
|
|
122
|
+
// options, so this runs the same spread through `defaultMutationOptions`.
|
|
123
|
+
// Reading `factoryOptions` alone dropped mutation defaults registered on
|
|
124
|
+
// the QueryClient (`defaultOptions.mutations`, `setMutationDefaults`).
|
|
125
|
+
const effectiveOptions = reactor.queryClient.defaultMutationOptions({
|
|
126
|
+
mutationKey: reactor.getQueryOptions({ functionName }).queryKey,
|
|
127
|
+
...factoryOptions,
|
|
128
|
+
})
|
|
129
|
+
const context: MutationFunctionContext = {
|
|
130
|
+
client: reactor.queryClient,
|
|
131
|
+
meta: effectiveOptions.meta,
|
|
132
|
+
mutationKey: effectiveOptions.mutationKey,
|
|
133
|
+
}
|
|
134
|
+
|
|
110
135
|
let result: ReactorReturnOk<Service, Method, Transform>
|
|
111
136
|
try {
|
|
112
137
|
result = await callFn(args)
|
|
@@ -114,12 +139,14 @@ const createMutationImpl = <
|
|
|
114
139
|
if (isCanisterError(error)) {
|
|
115
140
|
factoryOnCanisterError?.(error, args)
|
|
116
141
|
}
|
|
117
|
-
//
|
|
118
|
-
|
|
142
|
+
// `onMutate` does not run on this path, so there is no result to pass.
|
|
143
|
+
// Awaited like `onSuccess` below and like the hook path, so an async
|
|
144
|
+
// rollback or report finishes before `execute()` rejects.
|
|
145
|
+
await factoryOnError?.(
|
|
119
146
|
error as Parameters<NonNullable<typeof factoryOnError>>[0],
|
|
120
147
|
args,
|
|
121
|
-
undefined
|
|
122
|
-
|
|
148
|
+
undefined,
|
|
149
|
+
context
|
|
123
150
|
)
|
|
124
151
|
throw error
|
|
125
152
|
}
|
|
@@ -127,12 +154,7 @@ const createMutationImpl = <
|
|
|
127
154
|
if (factoryInvalidateQueries) {
|
|
128
155
|
await invalidateAll(reactor.queryClient, factoryInvalidateQueries)
|
|
129
156
|
}
|
|
130
|
-
await factoryOnSuccess?.(
|
|
131
|
-
result,
|
|
132
|
-
args,
|
|
133
|
-
undefined as never,
|
|
134
|
-
undefined as never
|
|
135
|
-
)
|
|
157
|
+
await factoryOnSuccess?.(result, args, undefined, context)
|
|
136
158
|
return result
|
|
137
159
|
}
|
|
138
160
|
|
|
@@ -169,13 +191,16 @@ const createMutationImpl = <
|
|
|
169
191
|
// 4. Hook onSuccess
|
|
170
192
|
await restOptions.onSuccess?.(...args)
|
|
171
193
|
},
|
|
172
|
-
onError: (error, variables, context, mutation) => {
|
|
194
|
+
onError: async (error, variables, context, mutation) => {
|
|
173
195
|
if (isCanisterError(error)) {
|
|
174
196
|
factoryOnCanisterError?.(error, variables)
|
|
175
197
|
hookOnCanisterError?.(error, variables)
|
|
176
198
|
}
|
|
177
|
-
|
|
178
|
-
|
|
199
|
+
// Awaited in order, like `onSuccess`. TanStack Query holds
|
|
200
|
+
// `onSettled` and the settled state until this promise resolves, so
|
|
201
|
+
// an async `onError` must be part of it.
|
|
202
|
+
await factoryOnError?.(error, variables, context, mutation)
|
|
203
|
+
await restOptions.onError?.(error, variables, context, mutation)
|
|
179
204
|
},
|
|
180
205
|
// `onMutate` and `onSettled` are composed like `onSuccess`/`onError`
|
|
181
206
|
// above. They used to arrive through the `...restOptions` spread, so a
|
package/src/defineReactor.ts
CHANGED
|
@@ -175,7 +175,6 @@ export function defineReactor<Service = BaseActor>(
|
|
|
175
175
|
|
|
176
176
|
export function defineReactor<Service = BaseActor>(
|
|
177
177
|
params: DefineReactorParameters | DefineDisplayReactorParameters<Service>
|
|
178
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
179
178
|
): DefineReactorResult<Service, any, any> {
|
|
180
179
|
const {
|
|
181
180
|
clientManager: providedClientManager,
|
|
@@ -267,7 +266,7 @@ export function defineReactor<Service = BaseActor>(
|
|
|
267
266
|
// The Reactor / DisplayReactor union cannot be expressed through the shared
|
|
268
267
|
// implementation signature, so the body is intentionally untyped here; the
|
|
269
268
|
// public overloads above carry the precise types for callers.
|
|
270
|
-
|
|
269
|
+
|
|
271
270
|
const reactor: any = display
|
|
272
271
|
? new DisplayReactor<Service>({
|
|
273
272
|
...reactorConfig,
|
|
@@ -11,6 +11,11 @@ export interface UseAuthReturn {
|
|
|
11
11
|
logout: (options?: { returnTo?: string }) => Promise<void>
|
|
12
12
|
isAuthenticated: boolean
|
|
13
13
|
isAuthenticating: boolean
|
|
14
|
+
/**
|
|
15
|
+
* The signed-in user's principal, or `null` while signed out. A signed-out
|
|
16
|
+
* session still holds an anonymous `identity`, and its principal is not
|
|
17
|
+
* returned here.
|
|
18
|
+
*/
|
|
14
19
|
principal: Principal | null
|
|
15
20
|
identity: Identity | null
|
|
16
21
|
error: Error | undefined
|
|
@@ -22,6 +27,26 @@ export interface CreateAuthHooksReturn {
|
|
|
22
27
|
useAuth: () => UseAuthReturn
|
|
23
28
|
}
|
|
24
29
|
|
|
30
|
+
/**
|
|
31
|
+
* The principal both hooks return.
|
|
32
|
+
*
|
|
33
|
+
* `authenticate()` and `logout()` leave the client's anonymous identity in
|
|
34
|
+
* `authState.identity` with `isAuthenticated: false`, so deriving the principal
|
|
35
|
+
* from the identity alone reported `2vxsx-fae` for a signed-out user, and
|
|
36
|
+
* `principal ? <SignedIn /> : <SignedOut />` rendered the signed-in branch.
|
|
37
|
+
* Memoized on the identity, because `getPrincipal()` may build a new object on
|
|
38
|
+
* each call and the result is often a hook dependency.
|
|
39
|
+
*/
|
|
40
|
+
function usePrincipal(
|
|
41
|
+
isAuthenticated: boolean,
|
|
42
|
+
identity: Identity | null
|
|
43
|
+
): Principal | null {
|
|
44
|
+
return useMemo(
|
|
45
|
+
() => (isAuthenticated && identity ? identity.getPrincipal() : null),
|
|
46
|
+
[isAuthenticated, identity]
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
25
50
|
/**
|
|
26
51
|
* Create authentication hooks for managing user sessions with Internet Identity.
|
|
27
52
|
*
|
|
@@ -125,10 +150,7 @@ export const createAuthHooks = (
|
|
|
125
150
|
}
|
|
126
151
|
}, [])
|
|
127
152
|
|
|
128
|
-
const principal =
|
|
129
|
-
() => (identity ? identity.getPrincipal() : null),
|
|
130
|
-
[identity]
|
|
131
|
-
)
|
|
153
|
+
const principal = usePrincipal(isAuthenticated, identity)
|
|
132
154
|
|
|
133
155
|
return {
|
|
134
156
|
authenticate,
|
|
@@ -144,7 +166,8 @@ export const createAuthHooks = (
|
|
|
144
166
|
|
|
145
167
|
/**
|
|
146
168
|
* Get the current user's Principal.
|
|
147
|
-
* Returns null if not authenticated
|
|
169
|
+
* Returns null if not authenticated, including while the signed-out session
|
|
170
|
+
* holds the anonymous identity.
|
|
148
171
|
*
|
|
149
172
|
* @example
|
|
150
173
|
* function UserInfo() {
|
|
@@ -154,8 +177,8 @@ export const createAuthHooks = (
|
|
|
154
177
|
* }
|
|
155
178
|
*/
|
|
156
179
|
const useUserPrincipal = (): Principal | null => {
|
|
157
|
-
const { identity } = useAuthState()
|
|
158
|
-
return
|
|
180
|
+
const { isAuthenticated, identity } = useAuthState()
|
|
181
|
+
return usePrincipal(isAuthenticated, identity)
|
|
159
182
|
}
|
|
160
183
|
|
|
161
184
|
return {
|
|
@@ -14,10 +14,12 @@ import {
|
|
|
14
14
|
TransformKey,
|
|
15
15
|
ReactorArgs,
|
|
16
16
|
ReactorReturnOk,
|
|
17
|
+
ReactorQueryData,
|
|
17
18
|
ReactorReturnErr,
|
|
18
19
|
FunctionType,
|
|
19
20
|
} from "@ic-reactor/core"
|
|
20
21
|
import { CallConfig } from "@icp-sdk/core/agent"
|
|
22
|
+
import { normalizeQueryData } from "../utils.js"
|
|
21
23
|
|
|
22
24
|
/**
|
|
23
25
|
* Configuration for useActorMethod hook.
|
|
@@ -33,10 +35,10 @@ export interface UseActorMethodParameters<
|
|
|
33
35
|
Transform extends TransformKey = "candid",
|
|
34
36
|
> extends Omit<
|
|
35
37
|
QueryObserverOptions<
|
|
36
|
-
ReactorReturnOk<Service, Method, Transform
|
|
38
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
37
39
|
ReactorReturnErr<Service, Method, Transform>,
|
|
38
|
-
ReactorReturnOk<Service, Method, Transform
|
|
39
|
-
ReactorReturnOk<Service, Method, Transform
|
|
40
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
41
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
40
42
|
QueryKey
|
|
41
43
|
>,
|
|
42
44
|
"queryKey" | "queryFn"
|
|
@@ -59,8 +61,13 @@ export interface UseActorMethodParameters<
|
|
|
59
61
|
/**
|
|
60
62
|
* Callback when the method call succeeds.
|
|
61
63
|
* Works for both query and mutation methods.
|
|
64
|
+
*
|
|
65
|
+
* A method's `undefined` result arrives as `null`, as in `useActorQuery`,
|
|
66
|
+
* for query and update methods alike.
|
|
62
67
|
*/
|
|
63
|
-
onSuccess?: (
|
|
68
|
+
onSuccess?: (
|
|
69
|
+
data: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>
|
|
70
|
+
) => void
|
|
64
71
|
|
|
65
72
|
/**
|
|
66
73
|
* Callback when the method call fails.
|
|
@@ -94,8 +101,13 @@ export interface UseActorMethodResult<
|
|
|
94
101
|
Method extends FunctionName<Service> = FunctionName<Service>,
|
|
95
102
|
Transform extends TransformKey = "candid",
|
|
96
103
|
> {
|
|
97
|
-
/**
|
|
98
|
-
|
|
104
|
+
/**
|
|
105
|
+
* The returned data from the method call. A method's `undefined` result is
|
|
106
|
+
* `null` here, as in `useActorQuery`, so `undefined` only means no call has
|
|
107
|
+
* settled yet.
|
|
108
|
+
*/
|
|
109
|
+
data:
|
|
110
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined
|
|
99
111
|
|
|
100
112
|
/** Whether the method is currently executing */
|
|
101
113
|
isLoading: boolean
|
|
@@ -125,11 +137,16 @@ export interface UseActorMethodResult<
|
|
|
125
137
|
*/
|
|
126
138
|
call: (
|
|
127
139
|
args?: ReactorArgs<Service, Method, Transform>
|
|
128
|
-
) => Promise<
|
|
140
|
+
) => Promise<
|
|
141
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined
|
|
142
|
+
>
|
|
129
143
|
|
|
130
144
|
/**
|
|
131
|
-
* Reset the state (
|
|
132
|
-
* For queries:
|
|
145
|
+
* Reset the state (data and error).
|
|
146
|
+
* For queries: resets this hook's own cache entry to its initial state, so
|
|
147
|
+
* `data` goes back to `initialData` when one was given and is cleared
|
|
148
|
+
* otherwise. An enabled hook then refetches. Other args of the same method
|
|
149
|
+
* are left alone.
|
|
133
150
|
* For mutations: resets the mutation state
|
|
134
151
|
*/
|
|
135
152
|
reset: () => void
|
|
@@ -138,19 +155,19 @@ export interface UseActorMethodResult<
|
|
|
138
155
|
* For queries only: Refetch the query
|
|
139
156
|
*/
|
|
140
157
|
refetch: () => Promise<
|
|
141
|
-
ReactorReturnOk<Service, Method, Transform
|
|
158
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>> | undefined
|
|
142
159
|
>
|
|
143
160
|
|
|
144
161
|
// Expose underlying results for advanced use cases
|
|
145
162
|
/** The raw query result (only available for query methods) */
|
|
146
163
|
queryResult?: UseQueryResult<
|
|
147
|
-
ReactorReturnOk<Service, Method, Transform
|
|
164
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
148
165
|
ReactorReturnErr<Service, Method, Transform>
|
|
149
166
|
>
|
|
150
167
|
|
|
151
168
|
/** The raw mutation result (only available for mutation methods) */
|
|
152
169
|
mutationResult?: UseMutationResult<
|
|
153
|
-
ReactorReturnOk<Service, Method, Transform
|
|
170
|
+
ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
|
|
154
171
|
ReactorReturnErr<Service, Method, Transform>,
|
|
155
172
|
ReactorArgs<Service, Method, Transform>
|
|
156
173
|
>
|
|
@@ -180,6 +197,9 @@ export function useActorMethod<
|
|
|
180
197
|
Method,
|
|
181
198
|
Transform
|
|
182
199
|
> {
|
|
200
|
+
type TData = ReactorReturnOk<Service, Method, Transform>
|
|
201
|
+
type TQueryData = ReactorQueryData<TData>
|
|
202
|
+
|
|
183
203
|
// Determine if this is a query method by checking the IDL
|
|
184
204
|
const isQuery = useMemo(() => {
|
|
185
205
|
if (!reactor) throw new Error("Reactor instance is required")
|
|
@@ -227,7 +247,7 @@ export function useActorMethod<
|
|
|
227
247
|
// ============================================================================
|
|
228
248
|
|
|
229
249
|
const queryResult = useQuery<
|
|
230
|
-
|
|
250
|
+
TQueryData,
|
|
231
251
|
ReactorReturnErr<Service, Method, Transform>
|
|
232
252
|
>(
|
|
233
253
|
{
|
|
@@ -237,12 +257,19 @@ export function useActorMethod<
|
|
|
237
257
|
// QueryClient) and `onSuccess` never fired when data came from the cache
|
|
238
258
|
// or a deduped sibling. They are dispatched from the settled observer
|
|
239
259
|
// result below instead.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
260
|
+
//
|
|
261
|
+
// TanStack Query fails a query whose queryFn resolves `undefined`, with
|
|
262
|
+
// "data is undefined", and a successful call can resolve it. A
|
|
263
|
+
// DisplayReactor decodes an `opt` None to `undefined`, and a `()` query
|
|
264
|
+
// returns nothing. Every other query path normalizes the value to `null`.
|
|
265
|
+
queryFn: async () =>
|
|
266
|
+
normalizeQueryData<TData>(
|
|
267
|
+
(await reactor.callMethod({
|
|
268
|
+
functionName,
|
|
269
|
+
args,
|
|
270
|
+
callConfig,
|
|
271
|
+
})) as TData
|
|
272
|
+
),
|
|
246
273
|
enabled: isQuery && enabled,
|
|
247
274
|
...queryOptions,
|
|
248
275
|
},
|
|
@@ -282,26 +309,30 @@ export function useActorMethod<
|
|
|
282
309
|
// ============================================================================
|
|
283
310
|
|
|
284
311
|
const mutationResult = useMutation<
|
|
285
|
-
|
|
312
|
+
TQueryData,
|
|
286
313
|
ReactorReturnErr<Service, Method, Transform>,
|
|
287
314
|
ReactorArgs<Service, Method, Transform>
|
|
288
315
|
>(
|
|
289
316
|
{
|
|
290
317
|
mutationKey: queryKey,
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
318
|
+
// Normalized like the query branch, so `data`, `call()` and `onSuccess`
|
|
319
|
+
// mean the same thing for both kinds of method. The hook cannot type the
|
|
320
|
+
// two branches apart: a Candid service type does not say which methods
|
|
321
|
+
// are queries.
|
|
322
|
+
mutationFn: async (mutationArgs) =>
|
|
323
|
+
normalizeQueryData<TData>(
|
|
324
|
+
(await reactor.callMethod({
|
|
325
|
+
functionName,
|
|
326
|
+
args: mutationArgs ?? args,
|
|
327
|
+
callConfig,
|
|
328
|
+
})) as TData
|
|
329
|
+
),
|
|
299
330
|
onSuccess: (data) => {
|
|
300
331
|
onSuccessRef.current?.(data)
|
|
301
332
|
// Invalidate specified queries after successful mutation
|
|
302
333
|
if (invalidateQueries && invalidateQueries.length > 0) {
|
|
303
334
|
invalidateQueries.forEach((key) => {
|
|
304
|
-
reactor.queryClient.invalidateQueries({ queryKey: key })
|
|
335
|
+
void reactor.queryClient.invalidateQueries({ queryKey: key })
|
|
305
336
|
})
|
|
306
337
|
}
|
|
307
338
|
},
|
|
@@ -319,7 +350,7 @@ export function useActorMethod<
|
|
|
319
350
|
const call = useCallback(
|
|
320
351
|
async (
|
|
321
352
|
callArgs?: ReactorArgs<Service, Method, Transform>
|
|
322
|
-
): Promise<
|
|
353
|
+
): Promise<TQueryData | undefined> => {
|
|
323
354
|
if (isQuery) {
|
|
324
355
|
// For queries, refetch with new args if provided
|
|
325
356
|
if (callArgs !== undefined) {
|
|
@@ -329,14 +360,17 @@ export function useActorMethod<
|
|
|
329
360
|
// dedupe onto an in-flight request for the old args, returning that
|
|
330
361
|
// response as though it answered this one.
|
|
331
362
|
try {
|
|
332
|
-
const result = await reactor.queryClient.fetchQuery({
|
|
363
|
+
const result = await reactor.queryClient.fetchQuery<TQueryData>({
|
|
333
364
|
queryKey: buildQueryKey(callArgs),
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
365
|
+
// Normalize for the same reason as the observer's queryFn.
|
|
366
|
+
queryFn: async () =>
|
|
367
|
+
normalizeQueryData<TData>(
|
|
368
|
+
(await reactor.callMethod({
|
|
369
|
+
functionName,
|
|
370
|
+
args: callArgs,
|
|
371
|
+
callConfig,
|
|
372
|
+
})) as TData
|
|
373
|
+
),
|
|
340
374
|
staleTime: 0,
|
|
341
375
|
})
|
|
342
376
|
// Dispatched here rather than by the observer effect: this result
|
|
@@ -380,7 +414,14 @@ export function useActorMethod<
|
|
|
380
414
|
|
|
381
415
|
const reset = useCallback(() => {
|
|
382
416
|
if (isQuery) {
|
|
383
|
-
|
|
417
|
+
// Reset, not remove. `removeQueries` drops the entry without notifying
|
|
418
|
+
// its observers, so this hook kept rendering the old data while bound to
|
|
419
|
+
// a query that was no longer in the cache. No later invalidation reached
|
|
420
|
+
// it, including the one an identity switch runs. `resetQueries` notifies
|
|
421
|
+
// the observer and refetches the entry when the hook is enabled. It is
|
|
422
|
+
// `exact` because only this hook's entry should reset. A prefix match on
|
|
423
|
+
// a no-args key would also reset every args variant other hooks render.
|
|
424
|
+
void reactor.queryClient.resetQueries({ queryKey, exact: true })
|
|
384
425
|
} else {
|
|
385
426
|
mutationResult.reset()
|
|
386
427
|
}
|
|
@@ -153,7 +153,7 @@ export const useActorMutation = <
|
|
|
153
153
|
)
|
|
154
154
|
|
|
155
155
|
const handleError = useCallback(
|
|
156
|
-
(
|
|
156
|
+
async (
|
|
157
157
|
error: ReactorReturnErr<Service, Method, Transform>,
|
|
158
158
|
variables: ReactorArgs<Service, Method, Transform>,
|
|
159
159
|
context: unknown,
|
|
@@ -162,7 +162,10 @@ export const useActorMutation = <
|
|
|
162
162
|
if (isCanisterError(error)) {
|
|
163
163
|
onCanisterError?.(error as any, variables)
|
|
164
164
|
}
|
|
165
|
-
|
|
165
|
+
// Awaited like `onSuccess` above. TanStack Query waits for the promise
|
|
166
|
+
// `onError` returns before it runs `onSettled` and settles the mutation,
|
|
167
|
+
// and it can only wait for a promise this wrapper passes back.
|
|
168
|
+
await onError?.(error, variables, context as any, mutation as any)
|
|
166
169
|
},
|
|
167
170
|
[onCanisterError, onError]
|
|
168
171
|
)
|