@ic-reactor/react 3.6.0 → 3.8.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 (131) hide show
  1. package/README.md +117 -13
  2. package/dist/auth/authentication-manager.d.ts +98 -0
  3. package/dist/auth/authentication-manager.d.ts.map +1 -0
  4. package/dist/auth/authentication-manager.js +532 -0
  5. package/dist/auth/authentication-manager.js.map +1 -0
  6. package/dist/auth/constants.d.ts +18 -0
  7. package/dist/auth/constants.d.ts.map +1 -0
  8. package/dist/auth/constants.js +18 -0
  9. package/dist/auth/constants.js.map +1 -0
  10. package/dist/auth/createIdentityAttributeHooks.d.ts +14 -0
  11. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -0
  12. package/dist/auth/createIdentityAttributeHooks.js +54 -0
  13. package/dist/auth/createIdentityAttributeHooks.js.map +1 -0
  14. package/dist/auth/identity-attributes-manager.d.ts +26 -0
  15. package/dist/auth/identity-attributes-manager.d.ts.map +1 -0
  16. package/dist/auth/identity-attributes-manager.js +108 -0
  17. package/dist/auth/identity-attributes-manager.js.map +1 -0
  18. package/dist/auth/identity-attributes.d.ts +19 -0
  19. package/dist/auth/identity-attributes.d.ts.map +1 -0
  20. package/dist/auth/identity-attributes.js +170 -0
  21. package/dist/auth/identity-attributes.js.map +1 -0
  22. package/dist/auth/index.d.ts +8 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/types.d.ts +182 -0
  27. package/dist/auth/types.d.ts.map +1 -0
  28. package/dist/auth/types.js +2 -0
  29. package/dist/auth/types.js.map +1 -0
  30. package/dist/createActorHooks.d.ts +16 -16
  31. package/dist/createActorHooks.d.ts.map +1 -1
  32. package/dist/createActorHooks.js +6 -6
  33. package/dist/createActorHooks.js.map +1 -1
  34. package/dist/createInfiniteQuery.d.ts +33 -33
  35. package/dist/createInfiniteQuery.d.ts.map +1 -1
  36. package/dist/createInfiniteQuery.js +6 -6
  37. package/dist/createInfiniteQuery.js.map +1 -1
  38. package/dist/createMutation.d.ts +13 -2
  39. package/dist/createMutation.d.ts.map +1 -1
  40. package/dist/createMutation.js +11 -0
  41. package/dist/createMutation.js.map +1 -1
  42. package/dist/createQuery.d.ts +13 -3
  43. package/dist/createQuery.d.ts.map +1 -1
  44. package/dist/createQuery.js +16 -6
  45. package/dist/createQuery.js.map +1 -1
  46. package/dist/createSuspenseInfiniteQuery.d.ts +32 -32
  47. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  48. package/dist/createSuspenseInfiniteQuery.js +6 -6
  49. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  50. package/dist/createSuspenseQuery.d.ts +3 -3
  51. package/dist/createSuspenseQuery.d.ts.map +1 -1
  52. package/dist/createSuspenseQuery.js +1 -1
  53. package/dist/createSuspenseQuery.js.map +1 -1
  54. package/dist/defineReactor.d.ts +124 -0
  55. package/dist/defineReactor.d.ts.map +1 -0
  56. package/dist/defineReactor.js +145 -0
  57. package/dist/defineReactor.js.map +1 -0
  58. package/dist/{createAuthHooks.d.ts → hooks/createAuthHooks.d.ts} +6 -13
  59. package/dist/hooks/createAuthHooks.d.ts.map +1 -0
  60. package/dist/{createAuthHooks.js → hooks/createAuthHooks.js} +18 -58
  61. package/dist/hooks/createAuthHooks.js.map +1 -0
  62. package/dist/hooks/index.d.ts +2 -0
  63. package/dist/hooks/index.d.ts.map +1 -1
  64. package/dist/hooks/index.js +2 -0
  65. package/dist/hooks/index.js.map +1 -1
  66. package/dist/hooks/useActorInfiniteQuery.d.ts +9 -9
  67. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  68. package/dist/hooks/useActorInfiniteQuery.js +3 -1
  69. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  70. package/dist/hooks/useActorMethod.d.ts +17 -17
  71. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  72. package/dist/hooks/useActorMethod.js.map +1 -1
  73. package/dist/hooks/useActorMutation.d.ts +18 -7
  74. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  75. package/dist/hooks/useActorMutation.js +11 -0
  76. package/dist/hooks/useActorMutation.js.map +1 -1
  77. package/dist/hooks/useActorQuery.d.ts +8 -8
  78. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  79. package/dist/hooks/useActorQuery.js.map +1 -1
  80. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +9 -9
  81. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  82. package/dist/hooks/useActorSuspenseInfiniteQuery.js +3 -1
  83. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  84. package/dist/hooks/useActorSuspenseQuery.d.ts +8 -8
  85. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  86. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  87. package/dist/index.d.ts +11 -10
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +11 -10
  90. package/dist/index.js.map +1 -1
  91. package/dist/types.d.ts +24 -24
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/utils.d.ts +3 -0
  94. package/dist/utils.d.ts.map +1 -1
  95. package/dist/utils.js +10 -2
  96. package/dist/utils.js.map +1 -1
  97. package/llms.txt +48 -0
  98. package/package.json +34 -23
  99. package/src/auth/authentication-manager.ts +591 -0
  100. package/src/auth/constants.ts +25 -0
  101. package/src/auth/createIdentityAttributeHooks.ts +83 -0
  102. package/src/auth/identity-attributes-manager.ts +136 -0
  103. package/src/auth/identity-attributes.ts +270 -0
  104. package/src/auth/index.ts +7 -0
  105. package/src/auth/types.ts +204 -0
  106. package/src/createActorHooks.ts +90 -58
  107. package/src/createInfiniteQuery.ts +154 -98
  108. package/src/createMutation.ts +35 -19
  109. package/src/createQuery.ts +94 -50
  110. package/src/createSuspenseInfiniteQuery.ts +166 -115
  111. package/src/createSuspenseQuery.ts +69 -43
  112. package/src/defineReactor.ts +272 -0
  113. package/src/{createAuthHooks.ts → hooks/createAuthHooks.ts} +23 -99
  114. package/src/hooks/index.ts +4 -0
  115. package/src/hooks/useActorInfiniteQuery.ts +44 -30
  116. package/src/hooks/useActorMethod.ts +62 -53
  117. package/src/hooks/useActorMutation.ts +47 -30
  118. package/src/hooks/useActorQuery.ts +36 -32
  119. package/src/hooks/useActorSuspenseInfiniteQuery.ts +56 -30
  120. package/src/hooks/useActorSuspenseQuery.ts +42 -32
  121. package/src/index.ts +12 -10
  122. package/src/types.ts +76 -71
  123. package/src/utils.ts +15 -2
  124. package/dist/createAuthHooks.d.ts.map +0 -1
  125. package/dist/createAuthHooks.js.map +0 -1
  126. package/src/hooks/useActorInfiniteQuery.test.tsx +0 -457
  127. package/src/hooks/useActorMethod.test.tsx +0 -798
  128. package/src/hooks/useActorMutation.test.tsx +0 -220
  129. package/src/hooks/useActorQuery.test.tsx +0 -287
  130. package/src/hooks/useActorSuspenseInfiniteQuery.test.tsx +0 -472
  131. package/src/hooks/useActorSuspenseQuery.test.tsx +0 -254
@@ -12,36 +12,41 @@ import {
12
12
  TransformKey,
13
13
  ReactorArgs,
14
14
  ReactorReturnOk,
15
+ ReactorQueryData,
15
16
  ReactorReturnErr,
16
17
  } from "@ic-reactor/core"
17
18
  import { CallConfig } from "@icp-sdk/core/agent"
19
+ import { normalizeQueryData } from "../utils.js"
18
20
 
19
21
  /**
20
22
  * Parameters for useActorInfiniteQuery hook.
21
23
  * Extends react-query's UseInfiniteQueryOptions with custom reactor params.
22
24
  */
23
25
  export interface UseActorInfiniteQueryParameters<
24
- A,
25
- M extends FunctionName<A>,
26
- T extends TransformKey = "candid",
26
+ Service,
27
+ Method extends FunctionName<Service>,
28
+ Transform extends TransformKey = "candid",
27
29
  TPageParam = unknown,
28
- TSelected = InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>,
30
+ Selected = InfiniteData<
31
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
32
+ TPageParam
33
+ >,
29
34
  > extends Omit<
30
35
  UseInfiniteQueryOptions<
31
- ReactorReturnOk<A, M, T>,
32
- ReactorReturnErr<A, M, T>,
33
- TSelected,
36
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
37
+ ReactorReturnErr<Service, Method, Transform>,
38
+ Selected,
34
39
  QueryKey,
35
40
  TPageParam
36
41
  >,
37
42
  "queryKey" | "queryFn" | "getNextPageParam" | "initialPageParam"
38
43
  > {
39
44
  /** The reactor instance to use for method calls */
40
- reactor: Reactor<A, T>
45
+ reactor: Reactor<Service, Transform>
41
46
  /** The method name to call on the canister */
42
- functionName: M
47
+ functionName: Method
43
48
  /** Function to get args from page parameter */
44
- getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>
49
+ getArgs: (pageParam: TPageParam) => ReactorArgs<Service, Method, Transform>
45
50
  /** Agent call configuration (effectiveCanisterId, etc.) */
46
51
  callConfig?: CallConfig
47
52
  /** Custom query key (auto-generated if not provided) */
@@ -50,28 +55,34 @@ export interface UseActorInfiniteQueryParameters<
50
55
  initialPageParam: TPageParam
51
56
  /** Function to determine next page parameter */
52
57
  getNextPageParam: (
53
- lastPage: ReactorReturnOk<A, M, T>,
54
- allPages: ReactorReturnOk<A, M, T>[],
58
+ lastPage: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
59
+ allPages: ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>[],
55
60
  lastPageParam: TPageParam,
56
61
  allPageParams: TPageParam[]
57
62
  ) => TPageParam | undefined | null
58
63
  }
59
64
 
60
65
  export type UseActorInfiniteQueryConfig<
61
- A,
62
- M extends FunctionName<A>,
63
- T extends TransformKey = "candid",
66
+ Service,
67
+ Method extends FunctionName<Service>,
68
+ Transform extends TransformKey = "candid",
64
69
  TPageParam = unknown,
65
- > = Omit<UseActorInfiniteQueryParameters<A, M, T, TPageParam>, "reactor">
70
+ > = Omit<
71
+ UseActorInfiniteQueryParameters<Service, Method, Transform, TPageParam>,
72
+ "reactor"
73
+ >
66
74
 
67
75
  export type UseActorInfiniteQueryResult<
68
- A,
69
- M extends FunctionName<A>,
70
- T extends TransformKey = "candid",
76
+ Service,
77
+ Method extends FunctionName<Service>,
78
+ Transform extends TransformKey = "candid",
71
79
  TPageParam = unknown,
72
80
  > = UseInfiniteQueryResult<
73
- InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>,
74
- ReactorReturnErr<A, M, T>
81
+ InfiniteData<
82
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
83
+ TPageParam
84
+ >,
85
+ ReactorReturnErr<Service, Method, Transform>
75
86
  >
76
87
 
77
88
  /**
@@ -87,9 +98,9 @@ export type UseActorInfiniteQueryResult<
87
98
  * })
88
99
  */
89
100
  export const useActorInfiniteQuery = <
90
- A,
91
- M extends FunctionName<A>,
92
- T extends TransformKey = "candid",
101
+ Service,
102
+ Method extends FunctionName<Service>,
103
+ Transform extends TransformKey = "candid",
93
104
  TPageParam = unknown,
94
105
  >({
95
106
  reactor,
@@ -99,11 +110,11 @@ export const useActorInfiniteQuery = <
99
110
  queryKey,
100
111
  ...options
101
112
  }: UseActorInfiniteQueryParameters<
102
- A,
103
- M,
104
- T,
113
+ Service,
114
+ Method,
115
+ Transform,
105
116
  TPageParam
106
- >): UseActorInfiniteQueryResult<A, M, T, TPageParam> => {
117
+ >): UseActorInfiniteQueryResult<Service, Method, Transform, TPageParam> => {
107
118
  // Always pass queryKey through generateQueryKey so it is merged with the
108
119
  // reactor/function identity. Using the custom key verbatim would cause cache
109
120
  // collisions if two different actors or methods share the same key string.
@@ -116,11 +127,14 @@ export const useActorInfiniteQuery = <
116
127
  const queryFn = useCallback(
117
128
  async ({ pageParam }: { pageParam: TPageParam }) => {
118
129
  const args = getArgs(pageParam)
119
- return reactor.callMethod({
130
+ const result = await reactor.callMethod({
120
131
  functionName,
121
132
  args,
122
133
  callConfig,
123
134
  })
135
+ return normalizeQueryData<ReactorReturnOk<Service, Method, Transform>>(
136
+ result as ReactorReturnOk<Service, Method, Transform>
137
+ )
124
138
  },
125
139
  [reactor, functionName, getArgs, callConfig]
126
140
  )
@@ -132,5 +146,5 @@ export const useActorInfiniteQuery = <
132
146
  ...options,
133
147
  } as any,
134
148
  reactor.queryClient
135
- ) as UseActorInfiniteQueryResult<A, M, T, TPageParam>
149
+ ) as UseActorInfiniteQueryResult<Service, Method, Transform, TPageParam>
136
150
  }
@@ -28,27 +28,27 @@ import { CallConfig } from "@icp-sdk/core/agent"
28
28
  * Mutation-specific options (like invalidateQueries) only apply to mutation methods.
29
29
  */
30
30
  export interface UseActorMethodParameters<
31
- A = BaseActor,
32
- M extends FunctionName<A> = FunctionName<A>,
33
- T extends TransformKey = "candid",
31
+ Service = BaseActor,
32
+ Method extends FunctionName<Service> = FunctionName<Service>,
33
+ Transform extends TransformKey = "candid",
34
34
  > extends Omit<
35
35
  QueryObserverOptions<
36
- ReactorReturnOk<A, M, T>,
37
- ReactorReturnErr<A, M, T>,
38
- ReactorReturnOk<A, M, T>,
39
- ReactorReturnOk<A, M, T>,
36
+ ReactorReturnOk<Service, Method, Transform>,
37
+ ReactorReturnErr<Service, Method, Transform>,
38
+ ReactorReturnOk<Service, Method, Transform>,
39
+ ReactorReturnOk<Service, Method, Transform>,
40
40
  QueryKey
41
41
  >,
42
42
  "queryKey" | "queryFn"
43
43
  > {
44
44
  /** The reactor instance to use for method calls */
45
- reactor: Reactor<A, T>
45
+ reactor: Reactor<Service, Transform>
46
46
 
47
47
  /** The method name to call on the canister */
48
- functionName: M
48
+ functionName: Method
49
49
 
50
50
  /** Arguments to pass to the method (optional for parameterless methods) */
51
- args?: ReactorArgs<A, M, T>
51
+ args?: ReactorArgs<Service, Method, Transform>
52
52
 
53
53
  /** Agent call configuration (effectiveCanisterId, etc.) */
54
54
  callConfig?: CallConfig
@@ -60,13 +60,13 @@ export interface UseActorMethodParameters<
60
60
  * Callback when the method call succeeds.
61
61
  * Works for both query and mutation methods.
62
62
  */
63
- onSuccess?: (data: ReactorReturnOk<A, M, T>) => void
63
+ onSuccess?: (data: ReactorReturnOk<Service, Method, Transform>) => void
64
64
 
65
65
  /**
66
66
  * Callback when the method call fails.
67
67
  * Works for both query and mutation methods.
68
68
  */
69
- onError?: (error: ReactorReturnErr<A, M, T>) => void
69
+ onError?: (error: ReactorReturnErr<Service, Method, Transform>) => void
70
70
 
71
71
  /**
72
72
  * Query keys to invalidate after a successful mutation.
@@ -80,22 +80,22 @@ export interface UseActorMethodParameters<
80
80
  * For use with createActorHooks.
81
81
  */
82
82
  export type UseActorMethodConfig<
83
- A = BaseActor,
84
- M extends FunctionName<A> = FunctionName<A>,
85
- T extends TransformKey = "candid",
86
- > = Omit<UseActorMethodParameters<A, M, T>, "reactor">
83
+ Service = BaseActor,
84
+ Method extends FunctionName<Service> = FunctionName<Service>,
85
+ Transform extends TransformKey = "candid",
86
+ > = Omit<UseActorMethodParameters<Service, Method, Transform>, "reactor">
87
87
 
88
88
  /**
89
89
  * Result type for useActorMethod hook.
90
90
  * Provides a unified interface for both query and mutation methods.
91
91
  */
92
92
  export interface UseActorMethodResult<
93
- A = BaseActor,
94
- M extends FunctionName<A> = FunctionName<A>,
95
- T extends TransformKey = "candid",
93
+ Service = BaseActor,
94
+ Method extends FunctionName<Service> = FunctionName<Service>,
95
+ Transform extends TransformKey = "candid",
96
96
  > {
97
97
  /** The returned data from the method call */
98
- data: ReactorReturnOk<A, M, T> | undefined
98
+ data: ReactorReturnOk<Service, Method, Transform> | undefined
99
99
 
100
100
  /** Whether the method is currently executing */
101
101
  isLoading: boolean
@@ -110,7 +110,7 @@ export interface UseActorMethodResult<
110
110
  isSuccess: boolean
111
111
 
112
112
  /** The error if one occurred */
113
- error: ReactorReturnErr<A, M, T> | null
113
+ error: ReactorReturnErr<Service, Method, Transform> | null
114
114
 
115
115
  /** Whether this is a query method (true) or mutation method (false) */
116
116
  isQuery: boolean
@@ -124,8 +124,8 @@ export interface UseActorMethodResult<
124
124
  * For mutations: executes the mutation with the provided args
125
125
  */
126
126
  call: (
127
- args?: ReactorArgs<A, M, T>
128
- ) => Promise<ReactorReturnOk<A, M, T> | undefined>
127
+ args?: ReactorArgs<Service, Method, Transform>
128
+ ) => Promise<ReactorReturnOk<Service, Method, Transform> | undefined>
129
129
 
130
130
  /**
131
131
  * Reset the state (clear data and error).
@@ -137,20 +137,22 @@ export interface UseActorMethodResult<
137
137
  /**
138
138
  * For queries only: Refetch the query
139
139
  */
140
- refetch: () => Promise<ReactorReturnOk<A, M, T> | undefined>
140
+ refetch: () => Promise<
141
+ ReactorReturnOk<Service, Method, Transform> | undefined
142
+ >
141
143
 
142
144
  // Expose underlying results for advanced use cases
143
145
  /** The raw query result (only available for query methods) */
144
146
  queryResult?: UseQueryResult<
145
- ReactorReturnOk<A, M, T>,
146
- ReactorReturnErr<A, M, T>
147
+ ReactorReturnOk<Service, Method, Transform>,
148
+ ReactorReturnErr<Service, Method, Transform>
147
149
  >
148
150
 
149
151
  /** The raw mutation result (only available for mutation methods) */
150
152
  mutationResult?: UseMutationResult<
151
- ReactorReturnOk<A, M, T>,
152
- ReactorReturnErr<A, M, T>,
153
- ReactorArgs<A, M, T>
153
+ ReactorReturnOk<Service, Method, Transform>,
154
+ ReactorReturnErr<Service, Method, Transform>,
155
+ ReactorArgs<Service, Method, Transform>
154
156
  >
155
157
  }
156
158
 
@@ -159,9 +161,9 @@ export interface UseActorMethodResult<
159
161
  * both query and mutation methods based on the Candid interface.
160
162
  */
161
163
  export function useActorMethod<
162
- A = BaseActor,
163
- M extends FunctionName<A> = FunctionName<A>,
164
- T extends TransformKey = "candid",
164
+ Service = BaseActor,
165
+ Method extends FunctionName<Service> = FunctionName<Service>,
166
+ Transform extends TransformKey = "candid",
165
167
  >({
166
168
  reactor,
167
169
  functionName,
@@ -173,7 +175,11 @@ export function useActorMethod<
173
175
  onError,
174
176
  invalidateQueries,
175
177
  ...queryOptions
176
- }: UseActorMethodParameters<A, M, T>): UseActorMethodResult<A, M, T> {
178
+ }: UseActorMethodParameters<Service, Method, Transform>): UseActorMethodResult<
179
+ Service,
180
+ Method,
181
+ Transform
182
+ > {
177
183
  // Determine if this is a query method by checking the IDL
178
184
  const isQuery = useMemo(() => {
179
185
  if (!reactor) throw new Error("Reactor instance is required")
@@ -199,8 +205,8 @@ export function useActorMethod<
199
205
  // ============================================================================
200
206
 
201
207
  const queryResult = useQuery<
202
- ReactorReturnOk<A, M, T>,
203
- ReactorReturnErr<A, M, T>
208
+ ReactorReturnOk<Service, Method, Transform>,
209
+ ReactorReturnErr<Service, Method, Transform>
204
210
  >(
205
211
  {
206
212
  queryKey,
@@ -214,7 +220,7 @@ export function useActorMethod<
214
220
  onSuccess?.(result)
215
221
  return result
216
222
  } catch (error) {
217
- onError?.(error as ReactorReturnErr<A, M, T>)
223
+ onError?.(error as ReactorReturnErr<Service, Method, Transform>)
218
224
  throw error
219
225
  }
220
226
  },
@@ -229,9 +235,9 @@ export function useActorMethod<
229
235
  // ============================================================================
230
236
 
231
237
  const mutationResult = useMutation<
232
- ReactorReturnOk<A, M, T>,
233
- ReactorReturnErr<A, M, T>,
234
- ReactorArgs<A, M, T>
238
+ ReactorReturnOk<Service, Method, Transform>,
239
+ ReactorReturnErr<Service, Method, Transform>,
240
+ ReactorArgs<Service, Method, Transform>
235
241
  >(
236
242
  {
237
243
  mutationKey: queryKey,
@@ -265,8 +271,8 @@ export function useActorMethod<
265
271
 
266
272
  const call = useCallback(
267
273
  async (
268
- callArgs?: ReactorArgs<A, M, T>
269
- ): Promise<ReactorReturnOk<A, M, T> | undefined> => {
274
+ callArgs?: ReactorArgs<Service, Method, Transform>
275
+ ): Promise<ReactorReturnOk<Service, Method, Transform> | undefined> => {
270
276
  if (isQuery) {
271
277
  // For queries, refetch with new args if provided
272
278
  if (callArgs !== undefined) {
@@ -284,7 +290,7 @@ export function useActorMethod<
284
290
  onSuccess?.(result)
285
291
  return result
286
292
  } catch (error) {
287
- onError?.(error as ReactorReturnErr<A, M, T>)
293
+ onError?.(error as ReactorReturnErr<Service, Method, Transform>)
288
294
  return undefined
289
295
  }
290
296
  }
@@ -294,7 +300,7 @@ export function useActorMethod<
294
300
  } else {
295
301
  // For mutations, execute with provided args
296
302
  return mutationResult
297
- .mutateAsync(callArgs as ReactorArgs<A, M, T>)
303
+ .mutateAsync(callArgs as ReactorArgs<Service, Method, Transform>)
298
304
  .catch(() => undefined)
299
305
  }
300
306
  },
@@ -353,7 +359,7 @@ export function useActorMethod<
353
359
  reset,
354
360
  refetch,
355
361
  queryResult,
356
- } as UseActorMethodResult<A, M, T>
362
+ } as UseActorMethodResult<Service, Method, Transform>
357
363
  } else {
358
364
  return {
359
365
  data: mutationResult.data,
@@ -368,7 +374,7 @@ export function useActorMethod<
368
374
  reset,
369
375
  refetch,
370
376
  mutationResult,
371
- } as UseActorMethodResult<A, M, T>
377
+ } as UseActorMethodResult<Service, Method, Transform>
372
378
  }
373
379
  }
374
380
 
@@ -381,20 +387,23 @@ export function useActorMethod<
381
387
  * ```
382
388
  */
383
389
  export function createActorMethodHooks<
384
- A = BaseActor,
385
- T extends TransformKey = "candid",
386
- >(reactor: Reactor<A, T>) {
390
+ Service = BaseActor,
391
+ Transform extends TransformKey = "candid",
392
+ >(reactor: Reactor<Service, Transform>) {
387
393
  return {
388
394
  /**
389
395
  * Hook for calling methods on the bound reactor.
390
396
  */
391
- useMethod: <M extends FunctionName<A>>(
392
- config: Omit<UseActorMethodParameters<A, M, T>, "reactor">
397
+ useMethod: <Method extends FunctionName<Service>>(
398
+ config: Omit<
399
+ UseActorMethodParameters<Service, Method, Transform>,
400
+ "reactor"
401
+ >
393
402
  ) =>
394
403
  useActorMethod({ ...config, reactor } as UseActorMethodParameters<
395
- A,
396
- M,
397
- T
404
+ Service,
405
+ Method,
406
+ Transform
398
407
  >),
399
408
  }
400
409
  }
@@ -21,19 +21,19 @@ import {
21
21
  import { CallConfig } from "@icp-sdk/core/agent"
22
22
 
23
23
  export interface UseActorMutationParameters<
24
- A,
25
- M extends FunctionName<A>,
26
- T extends TransformKey = "candid",
24
+ Service,
25
+ Method extends FunctionName<Service>,
26
+ Transform extends TransformKey = "candid",
27
27
  > extends Omit<
28
28
  UseMutationOptions<
29
- ReactorReturnOk<A, M, T>,
30
- ReactorReturnErr<A, M, T>,
31
- ReactorArgs<A, M, T>
29
+ ReactorReturnOk<Service, Method, Transform>,
30
+ ReactorReturnErr<Service, Method, Transform>,
31
+ ReactorArgs<Service, Method, Transform>
32
32
  >,
33
33
  "mutationFn"
34
34
  > {
35
- reactor: Reactor<A, T>
36
- functionName: M
35
+ reactor: Reactor<Service, Transform>
36
+ functionName: Method
37
37
  callConfig?: CallConfig
38
38
  invalidateQueries?: QueryKey[]
39
39
  /**
@@ -43,30 +43,34 @@ export interface UseActorMutationParameters<
43
43
  */
44
44
  onCanisterError?: (
45
45
  error: CanisterError<
46
- TransformReturnRegistry<ErrResult<ActorMethodReturnType<A[M]>>>[T]
46
+ TransformReturnRegistry<
47
+ ErrResult<ActorMethodReturnType<Service[Method]>>
48
+ >[Transform]
47
49
  >,
48
- variables: ReactorArgs<A, M, T>
50
+ variables: ReactorArgs<Service, Method, Transform>
49
51
  ) => void
50
52
  }
51
53
 
52
54
  export type UseActorMutationConfig<
53
- A,
54
- M extends FunctionName<A>,
55
- T extends TransformKey = "candid",
56
- > = Omit<UseActorMutationParameters<A, M, T>, "reactor">
55
+ Service,
56
+ Method extends FunctionName<Service>,
57
+ Transform extends TransformKey = "candid",
58
+ > = Omit<UseActorMutationParameters<Service, Method, Transform>, "reactor">
57
59
 
58
60
  export type UseActorMutationResult<
59
- A,
60
- M extends FunctionName<A>,
61
- T extends TransformKey = "candid",
61
+ Service,
62
+ Method extends FunctionName<Service>,
63
+ Transform extends TransformKey = "candid",
62
64
  > = UseMutationResult<
63
- ReactorReturnOk<A, M, T>,
64
- ReactorReturnErr<A, M, T>,
65
- ReactorArgs<A, M, T>
65
+ ReactorReturnOk<Service, Method, Transform>,
66
+ ReactorReturnErr<Service, Method, Transform>,
67
+ ReactorArgs<Service, Method, Transform>
66
68
  >
67
69
 
68
70
  /**
69
71
  * Hook for executing mutation calls on a canister.
72
+ * Use this for component-level mutation flows.
73
+ * For non-React usage, prefer `createMutation(...).execute(args)`.
70
74
  *
71
75
  * @example
72
76
  * const { mutate, isPending } = useActorMutation({
@@ -75,11 +79,20 @@ export type UseActorMutationResult<
75
79
  * onSuccess: () => console.log("Success!"),
76
80
  * onCanisterError: (err) => console.error("Canister Err:", err.code),
77
81
  * })
82
+ *
83
+ * @example
84
+ * const transferMutation = createMutation(reactor, {
85
+ * functionName: "transfer",
86
+ * onCanisterError: (err) => console.error(err.code),
87
+ * })
88
+ *
89
+ * // Non-React execution path
90
+ * await transferMutation.execute([{ to: "aaaaa-aa", amount: "100" }])
78
91
  */
79
92
  export const useActorMutation = <
80
- A,
81
- M extends FunctionName<A>,
82
- T extends TransformKey = "candid",
93
+ Service,
94
+ Method extends FunctionName<Service>,
95
+ Transform extends TransformKey = "candid",
83
96
  >({
84
97
  reactor,
85
98
  functionName,
@@ -89,9 +102,13 @@ export const useActorMutation = <
89
102
  onCanisterError,
90
103
  callConfig,
91
104
  ...options
92
- }: UseActorMutationParameters<A, M, T>): UseActorMutationResult<A, M, T> => {
105
+ }: UseActorMutationParameters<
106
+ Service,
107
+ Method,
108
+ Transform
109
+ >): UseActorMutationResult<Service, Method, Transform> => {
93
110
  const mutationFn = useCallback(
94
- async (args: ReactorArgs<A, M, T>) =>
111
+ async (args: ReactorArgs<Service, Method, Transform>) =>
95
112
  reactor.callMethod({ functionName, callConfig, args }),
96
113
  [reactor, functionName, callConfig]
97
114
  )
@@ -101,9 +118,9 @@ export const useActorMutation = <
101
118
  ...params: Parameters<
102
119
  NonNullable<
103
120
  UseMutationOptions<
104
- ReactorReturnOk<A, M, T>,
105
- ReactorReturnErr<A, M, T>,
106
- ReactorArgs<A, M, T>
121
+ ReactorReturnOk<Service, Method, Transform>,
122
+ ReactorReturnErr<Service, Method, Transform>,
123
+ ReactorArgs<Service, Method, Transform>
107
124
  >["onSuccess"]
108
125
  >
109
126
  >
@@ -122,8 +139,8 @@ export const useActorMutation = <
122
139
 
123
140
  const handleError = useCallback(
124
141
  (
125
- error: ReactorReturnErr<A, M, T>,
126
- variables: ReactorArgs<A, M, T>,
142
+ error: ReactorReturnErr<Service, Method, Transform>,
143
+ variables: ReactorArgs<Service, Method, Transform>,
127
144
  context: unknown,
128
145
  mutation: unknown
129
146
  ) => {
@@ -11,45 +11,49 @@ import {
11
11
  TransformKey,
12
12
  ReactorArgs,
13
13
  ReactorReturnOk,
14
+ ReactorQueryData,
14
15
  ReactorReturnErr,
15
16
  } from "@ic-reactor/core"
16
17
  import { CallConfig } from "@icp-sdk/core/agent"
17
18
 
18
19
  export interface UseActorQueryParameters<
19
- A,
20
- M extends FunctionName<A>,
21
- T extends TransformKey = "candid",
22
- TSelected = ReactorReturnOk<A, M, T>,
20
+ Service,
21
+ Method extends FunctionName<Service>,
22
+ Transform extends TransformKey = "candid",
23
+ Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
23
24
  > extends Omit<
24
25
  QueryObserverOptions<
25
- ReactorReturnOk<A, M, T>,
26
- ReactorReturnErr<A, M, T>,
27
- TSelected,
28
- ReactorReturnOk<A, M, T>,
26
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
27
+ ReactorReturnErr<Service, Method, Transform>,
28
+ Selected,
29
+ ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
29
30
  QueryKey
30
31
  >,
31
32
  "queryKey" | "queryFn"
32
33
  > {
33
- reactor: Reactor<A, T>
34
- functionName: M
35
- args?: ReactorArgs<A, M, T>
34
+ reactor: Reactor<Service, Transform>
35
+ functionName: Method
36
+ args?: ReactorArgs<Service, Method, Transform>
36
37
  callConfig?: CallConfig
37
38
  queryKey?: QueryKey
38
39
  }
39
40
 
40
41
  export type UseActorQueryConfig<
41
- A,
42
- M extends FunctionName<A>,
43
- T extends TransformKey = "candid",
44
- TSelected = ReactorReturnOk<A, M, T>,
45
- > = Omit<UseActorQueryParameters<A, M, T, TSelected>, "reactor">
42
+ Service,
43
+ Method extends FunctionName<Service>,
44
+ Transform extends TransformKey = "candid",
45
+ Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
46
+ > = Omit<
47
+ UseActorQueryParameters<Service, Method, Transform, Selected>,
48
+ "reactor"
49
+ >
46
50
 
47
51
  export type UseActorQueryResult<
48
- A,
49
- M extends FunctionName<A>,
50
- T extends TransformKey = "candid",
51
- TSelected = ReactorReturnOk<A, M, T>,
52
- > = UseQueryResult<TSelected, ReactorReturnErr<A, M, T>>
52
+ Service,
53
+ Method extends FunctionName<Service>,
54
+ Transform extends TransformKey = "candid",
55
+ Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
56
+ > = UseQueryResult<Selected, ReactorReturnErr<Service, Method, Transform>>
53
57
 
54
58
  /**
55
59
  * Hook for executing query calls on a canister.
@@ -70,10 +74,10 @@ export type UseActorQueryResult<
70
74
  * })
71
75
  */
72
76
  export const useActorQuery = <
73
- A,
74
- M extends FunctionName<A>,
75
- T extends TransformKey = "candid",
76
- TSelected = ReactorReturnOk<A, M, T>,
77
+ Service,
78
+ Method extends FunctionName<Service>,
79
+ Transform extends TransformKey = "candid",
80
+ Selected = ReactorQueryData<ReactorReturnOk<Service, Method, Transform>>,
77
81
  >({
78
82
  reactor,
79
83
  functionName,
@@ -81,16 +85,16 @@ export const useActorQuery = <
81
85
  callConfig,
82
86
  queryKey: defaultQueryKey,
83
87
  ...options
84
- }: UseActorQueryParameters<A, M, T, TSelected>): UseActorQueryResult<
85
- A,
86
- M,
87
- T,
88
- TSelected
89
- > => {
88
+ }: UseActorQueryParameters<
89
+ Service,
90
+ Method,
91
+ Transform,
92
+ Selected
93
+ >): UseActorQueryResult<Service, Method, Transform, Selected> => {
90
94
  // Memoize query options to prevent unnecessary re-computations
91
95
  const { queryKey, queryFn } = useMemo(
92
96
  () =>
93
- reactor.getQueryOptions<M>({
97
+ reactor.getQueryOptions<Method>({
94
98
  callConfig,
95
99
  functionName,
96
100
  args,