@ic-reactor/react 2.0.1 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +105 -79
  2. package/dist/createActorHooks.d.ts +39 -0
  3. package/dist/createActorHooks.d.ts.map +1 -0
  4. package/dist/createActorHooks.js +30 -0
  5. package/dist/createActorHooks.js.map +1 -0
  6. package/dist/createAuthHooks.d.ts +37 -0
  7. package/dist/createAuthHooks.d.ts.map +1 -0
  8. package/dist/createAuthHooks.js +94 -0
  9. package/dist/createAuthHooks.js.map +1 -0
  10. package/dist/createInfiniteQuery.d.ts +129 -0
  11. package/dist/createInfiniteQuery.d.ts.map +1 -0
  12. package/dist/createInfiniteQuery.js +160 -0
  13. package/dist/createInfiniteQuery.js.map +1 -0
  14. package/dist/createMutation.d.ts +19 -0
  15. package/dist/createMutation.d.ts.map +1 -0
  16. package/dist/createMutation.js +98 -0
  17. package/dist/createMutation.js.map +1 -0
  18. package/dist/createQuery.d.ts +20 -0
  19. package/dist/createQuery.d.ts.map +1 -0
  20. package/dist/createQuery.js +111 -0
  21. package/dist/createQuery.js.map +1 -0
  22. package/dist/createSuspenseInfiniteQuery.d.ts +122 -0
  23. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -0
  24. package/dist/createSuspenseInfiniteQuery.js +160 -0
  25. package/dist/createSuspenseInfiniteQuery.js.map +1 -0
  26. package/dist/createSuspenseQuery.d.ts +25 -0
  27. package/dist/createSuspenseQuery.d.ts.map +1 -0
  28. package/dist/createSuspenseQuery.js +116 -0
  29. package/dist/createSuspenseQuery.js.map +1 -0
  30. package/dist/hooks/index.d.ts +6 -2
  31. package/dist/hooks/index.d.ts.map +1 -0
  32. package/dist/hooks/index.js +6 -18
  33. package/dist/hooks/index.js.map +1 -0
  34. package/dist/hooks/useActorInfiniteQuery.d.ts +37 -0
  35. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -0
  36. package/dist/hooks/useActorInfiniteQuery.js +33 -0
  37. package/dist/hooks/useActorInfiniteQuery.js.map +1 -0
  38. package/dist/hooks/useActorMutation.d.ts +23 -0
  39. package/dist/hooks/useActorMutation.d.ts.map +1 -0
  40. package/dist/hooks/useActorMutation.js +39 -0
  41. package/dist/hooks/useActorMutation.js.map +1 -0
  42. package/dist/hooks/useActorQuery.d.ts +32 -0
  43. package/dist/hooks/useActorQuery.d.ts.map +1 -0
  44. package/dist/hooks/useActorQuery.js +35 -0
  45. package/dist/hooks/useActorQuery.js.map +1 -0
  46. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +36 -0
  47. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -0
  48. package/dist/hooks/useActorSuspenseInfiniteQuery.js +33 -0
  49. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -0
  50. package/dist/hooks/useActorSuspenseQuery.d.ts +32 -0
  51. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -0
  52. package/dist/hooks/useActorSuspenseQuery.js +36 -0
  53. package/dist/hooks/useActorSuspenseQuery.js.map +1 -0
  54. package/dist/index.d.ts +11 -8
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +17 -49
  57. package/dist/index.js.map +1 -0
  58. package/dist/types.d.ts +232 -13
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -22
  61. package/dist/types.js.map +1 -0
  62. package/dist/validation.d.ts +131 -0
  63. package/dist/validation.d.ts.map +1 -0
  64. package/dist/validation.js +125 -0
  65. package/dist/validation.js.map +1 -0
  66. package/package.json +70 -35
  67. package/LICENSE.md +0 -8
  68. package/dist/context/actor/create.d.ts +0 -63
  69. package/dist/context/actor/create.js +0 -119
  70. package/dist/context/actor/hooks/useActorInterface.d.ts +0 -4
  71. package/dist/context/actor/hooks/useActorInterface.js +0 -10
  72. package/dist/context/actor/hooks/useActorState.d.ts +0 -21
  73. package/dist/context/actor/hooks/useActorState.js +0 -25
  74. package/dist/context/actor/hooks/useActorStore.d.ts +0 -32
  75. package/dist/context/actor/hooks/useActorStore.js +0 -36
  76. package/dist/context/actor/hooks/useInitializeActor.d.ts +0 -6
  77. package/dist/context/actor/hooks/useInitializeActor.js +0 -10
  78. package/dist/context/actor/hooks/useMethod.d.ts +0 -29
  79. package/dist/context/actor/hooks/useMethod.js +0 -34
  80. package/dist/context/actor/hooks/useMethodAttributes.d.ts +0 -7
  81. package/dist/context/actor/hooks/useMethodAttributes.js +0 -11
  82. package/dist/context/actor/hooks/useMethodNames.d.ts +0 -7
  83. package/dist/context/actor/hooks/useMethodNames.js +0 -11
  84. package/dist/context/actor/hooks/useQueryCall.d.ts +0 -28
  85. package/dist/context/actor/hooks/useQueryCall.js +0 -33
  86. package/dist/context/actor/hooks/useUpdateCall.d.ts +0 -29
  87. package/dist/context/actor/hooks/useUpdateCall.js +0 -34
  88. package/dist/context/actor/hooks/useVisitMethod.d.ts +0 -8
  89. package/dist/context/actor/hooks/useVisitMethod.js +0 -13
  90. package/dist/context/actor/hooks/useVisitService.d.ts +0 -8
  91. package/dist/context/actor/hooks/useVisitService.js +0 -13
  92. package/dist/context/actor/index.d.ts +0 -16
  93. package/dist/context/actor/index.js +0 -33
  94. package/dist/context/actor/provider.d.ts +0 -71
  95. package/dist/context/actor/provider.js +0 -75
  96. package/dist/context/actor/types.d.ts +0 -35
  97. package/dist/context/actor/types.js +0 -2
  98. package/dist/context/adapter/create.d.ts +0 -2
  99. package/dist/context/adapter/create.js +0 -102
  100. package/dist/context/adapter/hooks/useCandidAdapter.d.ts +0 -23
  101. package/dist/context/adapter/hooks/useCandidAdapter.js +0 -27
  102. package/dist/context/adapter/hooks/useCandidEvaluation.d.ts +0 -5
  103. package/dist/context/adapter/hooks/useCandidEvaluation.js +0 -9
  104. package/dist/context/adapter/index.d.ts +0 -6
  105. package/dist/context/adapter/index.js +0 -24
  106. package/dist/context/adapter/provider.d.ts +0 -23
  107. package/dist/context/adapter/provider.js +0 -27
  108. package/dist/context/adapter/types.d.ts +0 -52
  109. package/dist/context/adapter/types.js +0 -2
  110. package/dist/context/agent/create.d.ts +0 -74
  111. package/dist/context/agent/create.js +0 -104
  112. package/dist/context/agent/hooks/useAgent.d.ts +0 -14
  113. package/dist/context/agent/hooks/useAgent.js +0 -18
  114. package/dist/context/agent/hooks/useAgentManager.d.ts +0 -14
  115. package/dist/context/agent/hooks/useAgentManager.js +0 -18
  116. package/dist/context/agent/hooks/useAgentState.d.ts +0 -21
  117. package/dist/context/agent/hooks/useAgentState.js +0 -25
  118. package/dist/context/agent/hooks/useAuth.d.ts +0 -57
  119. package/dist/context/agent/hooks/useAuth.js +0 -61
  120. package/dist/context/agent/hooks/useAuthState.d.ts +0 -19
  121. package/dist/context/agent/hooks/useAuthState.js +0 -23
  122. package/dist/context/agent/hooks/useUserPrincipal.d.ts +0 -17
  123. package/dist/context/agent/hooks/useUserPrincipal.js +0 -21
  124. package/dist/context/agent/index.d.ts +0 -12
  125. package/dist/context/agent/index.js +0 -29
  126. package/dist/context/agent/provider.d.ts +0 -28
  127. package/dist/context/agent/provider.js +0 -32
  128. package/dist/context/agent/types.d.ts +0 -17
  129. package/dist/context/agent/types.js +0 -2
  130. package/dist/core.d.ts +0 -1
  131. package/dist/core.js +0 -9
  132. package/dist/createReactor.d.ts +0 -49
  133. package/dist/createReactor.js +0 -69
  134. package/dist/helpers/actorHooks.d.ts +0 -18
  135. package/dist/helpers/actorHooks.js +0 -283
  136. package/dist/helpers/agentHooks.d.ts +0 -3
  137. package/dist/helpers/agentHooks.js +0 -22
  138. package/dist/helpers/authHooks.d.ts +0 -2
  139. package/dist/helpers/authHooks.js +0 -120
  140. package/dist/helpers/extractActorContext.d.ts +0 -4
  141. package/dist/helpers/extractActorContext.js +0 -44
  142. package/dist/helpers/extractAgentContext.d.ts +0 -28
  143. package/dist/helpers/extractAgentContext.js +0 -59
  144. package/dist/helpers/index.d.ts +0 -5
  145. package/dist/helpers/index.js +0 -21
  146. package/dist/helpers/types.d.ts +0 -222
  147. package/dist/helpers/types.js +0 -2
  148. package/dist/hooks/types.d.ts +0 -22
  149. package/dist/hooks/types.js +0 -2
  150. package/dist/hooks/useActor.d.ts +0 -67
  151. package/dist/hooks/useActor.js +0 -197
  152. package/dist/hooks/useActorManager.d.ts +0 -68
  153. package/dist/hooks/useActorManager.js +0 -75
  154. package/dist/utils.d.ts +0 -1
  155. package/dist/utils.js +0 -17
package/README.md CHANGED
@@ -1,121 +1,147 @@
1
- `@ic-reactor/react` is a comprehensive React library designed to streamline interactions with the Internet Computer (IC) blockchain. It provides React hooks and utilities for efficient state management, authentication, and interaction with IC actors.
1
+ # @ic-reactor/react
2
+
3
+ **The Ultimate React Hooks for the Internet Computer.**
4
+ Connect your React application to the Internet Computer Blockchain in seconds. using the power of [TanStack Query](https://tanstack.com/query).
2
5
 
3
6
  ## Features
4
7
 
5
- - **React Hooks Integration**: Custom hooks for managing blockchain actor states and authentication within React applications.
6
- - **Type-Safe Actor Interactions**: Type-safe interaction with IC actors using the provided actor declaration file.
7
- - **Efficient State Management**: Utilize the power of Zustand for global state management in React components.
8
- - **Asynchronous Data Handling**: Easy handling of asynchronous operations related to IC actors.
9
- - **Authentication Support**: Integrated hooks for managing authentication with the IC blockchain.
10
- - **Auto-Refresh and Query Capabilities**: Support for auto-refreshing data and querying IC actors.
8
+ - ⚛️ **React Query Integration**: Full power of TanStack Query (Caching, Refetching, Suspense).
9
+ - 🔄 ** Type-Safe**: Full TypeScript support with automatic type inference from your Candid files.
10
+ - 🔐 **Authentication**: Easy-to-use authentication hooks with Internet Identity and other providers.
11
+ - 🚀 **Performance**: Efficient caching and state management tailored for IC.
11
12
 
12
13
  ## Installation
13
14
 
14
- Install the package using npm:
15
-
16
15
  ```bash
17
- npm install @ic-reactor/react
16
+ npm install @ic-reactor/react @ic-reactor/core @tanstack/react-query @icp-sdk/core @icp-sdk/auth
18
17
  ```
19
18
 
20
- or using yarn:
19
+ ## Quick Start
21
20
 
22
- ```bash
23
- yarn add @ic-reactor/react
24
- ```
21
+ ### 1. Initialize the Actor
22
+
23
+ Create your actor hooks using `createActorHooks`. This is the "One Stop Shop" for interacting with your canister.
25
24
 
26
- ## Usage
25
+ ```typescript
26
+ // src/hooks/actor.ts
27
+ import { createActorHooks } from "@ic-reactor/react"
28
+ import { canisterId, idlFactory } from "../declarations/my_canister"
27
29
 
28
- Here's a simple example to get you started:
30
+ export const { useActorQuery, useActorMutation, useAuth, reactor } =
31
+ createActorHooks({
32
+ canisterId,
33
+ idlFactory,
34
+ })
35
+ ```
29
36
 
30
- First, create an actor declaration file:
37
+ ### 2. Authentication (Auto-Initializes Session)
31
38
 
32
- ```ts
33
- // actor.ts
34
- import { canisterId, idlFactory, actor } from "declaration/actor"
35
- import { createReactor } from "@ic-reactor/react"
39
+ The `useAuth` hook automatically initializes the agent and restores any previous session on first use.
36
40
 
37
- type Actor = typeof actor
41
+ ```tsx
42
+ // src/App.tsx
43
+ import { useAuth } from "./hooks/actor"
38
44
 
39
- export const { useActorStore, useAuth, useQueryCall } = createReactor<Actor>({
40
- canisterId,
41
- idlFactory,
42
- host: "https://localhost:4943",
43
- })
45
+ function App() {
46
+ // useAuth() auto-initializes - no separate setup needed!
47
+ const { isAuthenticated, login, logout } = useAuth()
48
+
49
+ return (
50
+ <div>
51
+ {isAuthenticated ? (
52
+ <button onClick={logout}>Logout</button>
53
+ ) : (
54
+ <button onClick={login}>Login with II</button>
55
+ )}
56
+ <Dashboard />
57
+ </div>
58
+ )
59
+ }
44
60
  ```
45
61
 
46
- Then, use the `useQueryCall` hook to call your canister method:
47
-
48
- ```jsx
49
- // Balance.tsx
50
- import { useQueryCall } from "./actor"
51
-
52
- const Balance = ({ principal }) => {
53
- const { call, data, loading, error } = useQueryCall({
54
- functionName: "get_balance",
55
- args: [principal],
56
- refetchInterval: 1000,
57
- refetchOnMount: true,
58
- onLoading: () => console.log("Loading..."),
59
- onSuccess: (data) => console.log("Success!", data),
60
- onError: (error) => console.log("Error!", error),
62
+ ### 3. Use in Components
63
+
64
+ Now you can use your hooks directly in your components!
65
+
66
+ ```tsx
67
+ // src/Dashboard.tsx
68
+ import { useActorQuery, useActorMutation } from "./hooks/actor"
69
+
70
+ function Dashboard() {
71
+ // Query: Fetch data (auto-cached!)
72
+ const { data: balance } = useActorQuery({
73
+ functionName: "icrc1_balance_of",
74
+ args: [{ owner: Principal.fromText("...") }],
75
+ })
76
+
77
+ // Update: Execute state changes
78
+ const { mutate: transfer, isPending } = useActorMutation({
79
+ functionName: "icrc1_transfer",
80
+ onSuccess: () => {
81
+ console.log("Transfer successful!")
82
+ }
61
83
  })
62
84
 
63
85
  return (
64
86
  <div>
65
- <button onClick={call} disabled={loading}>
66
- {loading ? "Loading..." : "Refresh"}
87
+ <h1>Balance: {balance?.toString()}</h1>
88
+ <button onClick={() => transfer(...)} disabled={isPending}>
89
+ Transfer
67
90
  </button>
68
- {loading && <p>Loading...</p>}
69
- {data && <p>Balance: {data}</p>}
70
- {error && <p>Error: {error}</p>}
71
91
  </div>
72
92
  )
73
93
  }
94
+ ```
74
95
 
75
- export default Balance
96
+ ### Form Friendly (CandidAdapter)
97
+
98
+ If you want your hooks to automatically handle type transformations (e.g., converting `bigint` to `string` for simple form binding), set `autoCodecs: true`.
99
+
100
+ ```typescript
101
+ export const { useActorQuery } = createActorHooks({
102
+ canisterId,
103
+ idlFactory,
104
+ autoCodecs: true, // Returns stringified values for bigint, principal, small blobs
105
+ })
76
106
  ```
77
107
 
78
- ## Authentication
108
+ ### Authentication
79
109
 
80
- `@ic-reactor/react` provides a custom hook for managing authentication with the IC blockchain. To use it, first create an authentication declaration file:
110
+ The `createActorHooks` function returns authentication hooks directly.
81
111
 
82
- ```jsx
83
- // Login.tsx
84
- import { useAuth } from "./actor"
112
+ ```typescript
113
+ import { useAuth } from "./hooks/actor"
85
114
 
86
- const Login = () => {
87
- const {
88
- login,
89
- logout,
90
- loginLoading,
91
- loginError,
92
- identity,
93
- authenticating,
94
- authenticated,
95
- } = useAuth()
115
+ function LoginButton() {
116
+ const { login, logout, identity, isAuthenticated } = useAuth()
96
117
 
97
118
  return (
98
119
  <div>
99
- <h2>Login:</h2>
100
- <div>
101
- {loginLoading && <div>Loading...</div>}
102
- {loginError ? <div>{JSON.stringify(loginError)}</div> : null}
103
- {identity && <div>{identity.getPrincipal().toText()}</div>}
104
- </div>
105
- {authenticated ? (
106
- <div>
107
- <button onClick={logout}>Logout</button>
108
- </div>
120
+ {isAuthenticated ? (
121
+ <button onClick={logout}>Logout</button>
109
122
  ) : (
110
- <div>
111
- <button onClick={login} disabled={authenticating}>
112
- Login
113
- </button>
114
- </div>
123
+ <button onClick={login}>Login</button>
115
124
  )}
116
125
  </div>
117
126
  )
118
127
  }
128
+ ```
129
+
130
+ ### Dynamic Queries
131
+
132
+ Need to create queries on the fly? Use `createQuery`.
133
+
134
+ ```typescript
135
+ import { createQuery } from "@ic-reactor/react"
119
136
 
120
- export default Login
137
+ const balanceQuery = createQuery(reactor, {
138
+ functionName: "icrc1_balance_of",
139
+ select: (balance) => balance.toString() + " ICP",
140
+ })
141
+
142
+ const { data } = balanceQuery.useQuery()
121
143
  ```
144
+
145
+ ## License
146
+
147
+ MIT
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Actor Hooks Factory - Creates a full set of React hooks for a reactor instance.
3
+ *
4
+ * This is the primary entry point for using the library in React applications.
5
+ * It generates type-safe hooks for:
6
+ * - Queries (useActorQuery)
7
+ * - Suspense Queries (useActorSuspenseQuery)
8
+ * - Infinite Queries (useActorInfiniteQuery)
9
+ * - Suspense Infinite Queries (useActorSuspenseInfiniteQuery)
10
+ * - Mutations (useActorMutation)
11
+ *
12
+ * @example
13
+ * const { useActorQuery, useActorMutation } = createActorHooks(reactor)
14
+ *
15
+ * // In component
16
+ * const { data } = useActorQuery({ functionName: 'get_user' })
17
+ * const { mutate } = useActorMutation({ functionName: 'update_user' })
18
+ */
19
+ import { Reactor, DisplayReactor, ReactorReturnErr, ReactorReturnOk, BaseActor, FunctionName, TransformKey } from "@ic-reactor/core";
20
+ import { UseQueryResult, UseSuspenseQueryResult, UseInfiniteQueryResult, UseSuspenseInfiniteQueryResult, UseMutationResult, InfiniteData } from "@tanstack/react-query";
21
+ import { InfiniteQueryConfig } from "./createInfiniteQuery";
22
+ import { SuspenseInfiniteQueryConfig } from "./createSuspenseInfiniteQuery";
23
+ import { QueryConfig, SuspenseQueryConfig, MutationConfig } from "./types";
24
+ export type ActorHooks<A, T extends TransformKey> = {
25
+ useActorQuery: {
26
+ <M extends FunctionName<A>>(config: QueryConfig<A, M, T, ReactorReturnOk<A, M, T>>): UseQueryResult<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>>;
27
+ <M extends FunctionName<A>, TData>(config: QueryConfig<A, M, T, TData>): UseQueryResult<TData, ReactorReturnErr<A, M, T>>;
28
+ };
29
+ useActorSuspenseQuery: {
30
+ <M extends FunctionName<A>>(config: SuspenseQueryConfig<A, M, T, ReactorReturnOk<A, M, T>>): UseSuspenseQueryResult<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>>;
31
+ <M extends FunctionName<A>, TData>(config: SuspenseQueryConfig<A, M, T, TData>): UseSuspenseQueryResult<TData, ReactorReturnErr<A, M, T>>;
32
+ };
33
+ useActorInfiniteQuery: <M extends FunctionName<A>, TPageParam = unknown>(config: InfiniteQueryConfig<A, M, T, TPageParam>) => UseInfiniteQueryResult<InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>, ReactorReturnErr<A, M, T>>;
34
+ useActorSuspenseInfiniteQuery: <M extends FunctionName<A>, TPageParam = unknown>(config: SuspenseInfiniteQueryConfig<A, M, T, TPageParam>) => UseSuspenseInfiniteQueryResult<InfiniteData<ReactorReturnOk<A, M, T>, TPageParam>, ReactorReturnErr<A, M, T>>;
35
+ useActorMutation: <M extends FunctionName<A>>(config: MutationConfig<A, M, T>) => UseMutationResult<ReactorReturnOk<A, M, T>, ReactorReturnErr<A, M, T>>;
36
+ };
37
+ export declare function createActorHooks<A>(reactor: DisplayReactor<A>): ActorHooks<A, "display">;
38
+ export declare function createActorHooks<A = BaseActor, T extends TransformKey = "candid">(reactor: Reactor<A, T>): ActorHooks<A, T>;
39
+ //# sourceMappingURL=createActorHooks.d.ts.map
@@ -0,0 +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,SAAS,EACT,YAAY,EACZ,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,YAAY,EACb,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAuB,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAEL,2BAA2B,EAC5B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,IAAI;IAClD,aAAa,EAAE;QACb,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACxB,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GACrD,cAAc,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACtE,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAC/B,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAClC,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;KACpD,CAAA;IAED,qBAAqB,EAAE;QACrB,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACxB,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAC7D,sBAAsB,CACvB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC1B,CAAA;QACD,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAC/B,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAC1C,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;KAC5D,CAAA;IAED,qBAAqB,EAAE,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,EACrE,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAC7C,sBAAsB,CACzB,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,EAClD,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC1B,CAAA;IAED,6BAA6B,EAAE,CAC7B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,UAAU,GAAG,OAAO,EAEpB,MAAM,EAAE,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KACrD,8BAA8B,CACjC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,EAClD,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC1B,CAAA;IAED,gBAAgB,EAAE,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC1C,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,iBAAiB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAC5E,CAAA;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AAE3B,wBAAgB,gBAAgB,CAC9B,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { createQuery } from "./createQuery";
2
+ import { createSuspenseQuery } from "./createSuspenseQuery";
3
+ import { createInfiniteQuery } from "./createInfiniteQuery";
4
+ import { createSuspenseInfiniteQuery, } from "./createSuspenseInfiniteQuery";
5
+ import { createMutation } from "./createMutation";
6
+ export function createActorHooks(reactor) {
7
+ return {
8
+ useActorQuery: ((config) => {
9
+ const { select, ...options } = config;
10
+ return createQuery(reactor, config).useQuery(options);
11
+ }),
12
+ useActorSuspenseQuery: ((config) => {
13
+ const { select, ...options } = config;
14
+ return createSuspenseQuery(reactor, config).useSuspenseQuery(options);
15
+ }),
16
+ useActorInfiniteQuery: ((config) => {
17
+ const { select, ...options } = config;
18
+ return createInfiniteQuery(reactor, config).useInfiniteQuery(options);
19
+ }),
20
+ useActorSuspenseInfiniteQuery: ((config) => {
21
+ const { select, ...options } = config;
22
+ return createSuspenseInfiniteQuery(reactor, config).useSuspenseInfiniteQuery(options);
23
+ }),
24
+ useActorMutation: ((config) => {
25
+ const { onSuccess, refetchQueries, ...options } = config;
26
+ return createMutation(reactor, config).useMutation(options);
27
+ }),
28
+ };
29
+ }
30
+ //# sourceMappingURL=createActorHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createActorHooks.js","sourceRoot":"","sources":["../src/createActorHooks.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAA;AAChF,OAAO,EACL,2BAA2B,GAE5B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAwDjD,MAAM,UAAU,gBAAgB,CAC9B,OAAsB;IAEtB,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;YACrC,OAAO,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC,CAAsC;QAEvC,qBAAqB,EAAE,CAAC,CAAC,MAAW,EAAE,EAAE;YACtC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;YACrC,OAAO,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACvE,CAAC,CAA8C;QAE/C,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;YACjC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;YACrC,OAAO,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACvE,CAAC,CAA8C;QAE/C,6BAA6B,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;YACrC,OAAO,2BAA2B,CAChC,OAAO,EACP,MAAM,CACP,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC,CAAsD;QAEvD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;YACxD,OAAO,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC7D,CAAC,CAAyC;KAC3C,CAAA;AACH,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { ClientManager, AgentState } from "@ic-reactor/core";
2
+ import { Principal } from "@icp-sdk/core/principal";
3
+ import { Identity } from "@icp-sdk/core/agent";
4
+ import { AuthClientLoginOptions } from "@icp-sdk/auth/client";
5
+ export interface UseAuthReturn {
6
+ authenticate: () => Promise<Identity | undefined>;
7
+ login: (options?: AuthClientLoginOptions) => Promise<void>;
8
+ logout: (options?: {
9
+ returnTo?: string;
10
+ }) => Promise<void>;
11
+ isAuthenticated: boolean;
12
+ isAuthenticating: boolean;
13
+ principal: Principal | null;
14
+ identity: Identity | null;
15
+ error: Error | undefined;
16
+ }
17
+ export interface CreateAuthHooksReturn {
18
+ useAgentState: () => AgentState;
19
+ useUserPrincipal: () => Principal | null;
20
+ useAuth: () => UseAuthReturn;
21
+ }
22
+ /**
23
+ * Create authentication hooks for managing user sessions with Internet Identity.
24
+ *
25
+ * @example
26
+ * const { useAuth, useUserPrincipal, useAgentState } = createAuthHooks(clientManager)
27
+ *
28
+ * function App() {
29
+ * const { login, logout, principal, isAuthenticated } = useAuth()
30
+ *
31
+ * return isAuthenticated
32
+ * ? <button onClick={logout}>Logout {principal?.toText()}</button>
33
+ * : <button onClick={login}>Login with II</button>
34
+ * }
35
+ */
36
+ export declare const createAuthHooks: (clientManager: ClientManager) => CreateAuthHooksReturn;
37
+ //# sourceMappingURL=createAuthHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAuthHooks.d.ts","sourceRoot":"","sources":["../src/createAuthHooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAa,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACjD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,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;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,KAC3B,qBAiGF,CAAA"}
@@ -0,0 +1,94 @@
1
+ import { useSyncExternalStore, useEffect, useRef, useMemo } from "react";
2
+ /**
3
+ * Create authentication hooks for managing user sessions with Internet Identity.
4
+ *
5
+ * @example
6
+ * const { useAuth, useUserPrincipal, useAgentState } = createAuthHooks(clientManager)
7
+ *
8
+ * function App() {
9
+ * const { login, logout, principal, isAuthenticated } = useAuth()
10
+ *
11
+ * return isAuthenticated
12
+ * ? <button onClick={logout}>Logout {principal?.toText()}</button>
13
+ * : <button onClick={login}>Login with II</button>
14
+ * }
15
+ */
16
+ export const createAuthHooks = (clientManager) => {
17
+ /**
18
+ * Subscribe to agent state changes.
19
+ * Returns the current agent state (agent, isInitialized, etc.)
20
+ */
21
+ const useAgentState = () => useSyncExternalStore((callback) => clientManager.subscribeAgentState(callback), () => clientManager.agentState,
22
+ // Server snapshot - provide initial state for SSR
23
+ () => clientManager.agentState);
24
+ /**
25
+ * Subscribe to authentication state changes.
26
+ * Returns auth state (isAuthenticated, isAuthenticating, identity, error)
27
+ */
28
+ const useAuthState = () => useSyncExternalStore((callback) => clientManager.subscribeAuthState(callback), () => clientManager.authState,
29
+ // Server snapshot - provide initial state for SSR
30
+ () => clientManager.authState);
31
+ /**
32
+ * Main authentication hook that provides login/logout methods and auth state.
33
+ * Automatically initializes the session on first use, restoring any previous session.
34
+ *
35
+ * @example
36
+ * function AuthButton() {
37
+ * const { login, logout, isAuthenticated, isAuthenticating } = useAuth()
38
+ *
39
+ * if (isAuthenticated) {
40
+ * return <button onClick={logout}>Logout</button>
41
+ * }
42
+ * return (
43
+ * <button onClick={login} disabled={isAuthenticating}>
44
+ * {isAuthenticating ? "Connecting..." : "Login"}
45
+ * </button>
46
+ * )
47
+ * }
48
+ */
49
+ const useAuth = () => {
50
+ const { login, logout, authenticate } = clientManager;
51
+ const { isAuthenticated, isAuthenticating, identity, error } = useAuthState();
52
+ // Track if we've already initialized to avoid duplicate calls
53
+ const initializedRef = useRef(false);
54
+ // Auto-initialize on first mount to restore previous session
55
+ useEffect(() => {
56
+ if (!initializedRef.current) {
57
+ initializedRef.current = true;
58
+ clientManager.initialize();
59
+ }
60
+ }, []);
61
+ const principal = useMemo(() => (identity ? identity.getPrincipal() : null), [identity]);
62
+ return {
63
+ authenticate,
64
+ login,
65
+ logout,
66
+ isAuthenticated,
67
+ isAuthenticating,
68
+ principal,
69
+ identity,
70
+ error,
71
+ };
72
+ };
73
+ /**
74
+ * Get the current user's Principal.
75
+ * Returns null if not authenticated.
76
+ *
77
+ * @example
78
+ * function UserInfo() {
79
+ * const principal = useUserPrincipal()
80
+ * if (!principal) return null
81
+ * return <span>Logged in as: {principal.toText()}</span>
82
+ * }
83
+ */
84
+ const useUserPrincipal = () => {
85
+ const { identity } = useAuthState();
86
+ return identity ? identity.getPrincipal() : null;
87
+ };
88
+ return {
89
+ useAuth,
90
+ useAgentState,
91
+ useUserPrincipal,
92
+ };
93
+ };
94
+ //# sourceMappingURL=createAuthHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAuthHooks.js","sourceRoot":"","sources":["../src/createAuthHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAuBxE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,aAA4B,EACL,EAAE;IACzB;;;OAGG;IACH,MAAM,aAAa,GAAG,GAAe,EAAE,CACrC,oBAAoB,CAClB,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EACzD,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU;IAC9B,kDAAkD;IAClD,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAC/B,CAAA;IAEH;;;OAGG;IACH,MAAM,YAAY,GAAG,GAAc,EAAE,CACnC,oBAAoB,CAClB,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EACxD,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS;IAC7B,kDAAkD;IAClD,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAC9B,CAAA;IAEH;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,OAAO,GAAG,GAAkB,EAAE;QAClC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAA;QACrD,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,GAC1D,YAAY,EAAE,CAAA;QAEhB,8DAA8D;QAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAEpC,6DAA6D;QAC7D,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC5B,cAAc,CAAC,OAAO,GAAG,IAAI,CAAA;gBAC7B,aAAa,CAAC,UAAU,EAAE,CAAA;YAC5B,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACjD,CAAC,QAAQ,CAAC,CACX,CAAA;QAED,OAAO;YACL,YAAY;YACZ,KAAK;YACL,MAAM;YACN,eAAe;YACf,gBAAgB;YAChB,SAAS;YACT,QAAQ;YACR,KAAK;SACN,CAAA;IACH,CAAC,CAAA;IAED;;;;;;;;;;OAUG;IACH,MAAM,gBAAgB,GAAG,GAAqB,EAAE;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAA;QACnC,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,CAAC,CAAA;IAED,OAAO;QACL,OAAO;QACP,aAAa;QACb,gBAAgB;KACjB,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Infinite Query Factory - Generic wrapper for React Query paginated canister data
3
+ *
4
+ * Creates unified fetch/hook/refetch functions for any paginated canister method.
5
+ * Works with any Reactor instance.
6
+ *
7
+ * @example
8
+ * const postsQuery = createInfiniteQuery(reactor, {
9
+ * functionName: "get_posts",
10
+ * initialPageParam: 0,
11
+ * getArgs: (cursor) => [{ cursor, limit: 10 }],
12
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
13
+ * })
14
+ *
15
+ * // In component
16
+ * const { data, fetchNextPage, hasNextPage } = postsQuery.useInfiniteQuery()
17
+ *
18
+ * // Flatten all pages
19
+ * const allPosts = data?.pages.flatMap(page => page.posts)
20
+ *
21
+ * // Invalidate cache
22
+ * postsQuery.refetch()
23
+ */
24
+ import type { Reactor, FunctionName, ReactorArgs, BaseActor, TransformKey, ReactorReturnOk, ReactorReturnErr } from "@ic-reactor/core";
25
+ import { QueryKey, InfiniteData, UseInfiniteQueryResult, UseInfiniteQueryOptions } from "@tanstack/react-query";
26
+ import { CallConfig } from "@icp-sdk/core/agent";
27
+ import { NoInfer } from "./types";
28
+ /** The raw page data type returned by the query function */
29
+ export type InfiniteQueryPageData<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnOk<A, M, T>;
30
+ /** The error type for infinite queries */
31
+ export type InfiniteQueryError<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid"> = ReactorReturnErr<A, M, T>;
32
+ /**
33
+ * Configuration for createActorInfiniteQuery.
34
+ *
35
+ * @template A - The actor interface type
36
+ * @template M - The method name on the actor
37
+ * @template T - The transformation key (identity, display, etc.)
38
+ * @template TPageParam - The type of the page parameter
39
+ * @template TSelected - The type returned after select transformation
40
+ */
41
+ export interface InfiniteQueryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>> {
42
+ /** The method to call on the canister */
43
+ functionName: M;
44
+ /** Call configuration for the actor method */
45
+ callConfig?: CallConfig;
46
+ /** Custom query key (optional, auto-generated if not provided) */
47
+ queryKey?: QueryKey;
48
+ /** Initial page parameter */
49
+ initialPageParam: TPageParam;
50
+ /** Function to get args from page parameter */
51
+ getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>;
52
+ /** Function to determine next page parameter */
53
+ getNextPageParam: (lastPage: InfiniteQueryPageData<A, M, T>, allPages: InfiniteQueryPageData<A, M, T>[], lastPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
54
+ /** Function to determine previous page parameter (for bi-directional) */
55
+ getPreviousPageParam?: (firstPage: InfiniteQueryPageData<A, M, T>, allPages: InfiniteQueryPageData<A, M, T>[], firstPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
56
+ /** Maximum number of pages to keep in cache */
57
+ maxPages?: number;
58
+ /** How long data stays fresh before refetching (default: 5 min) */
59
+ staleTime?: number;
60
+ /** Transform the raw InfiniteData result before returning */
61
+ select?: (data: InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>) => TSelected;
62
+ }
63
+ /**
64
+ * Configuration for createActorInfiniteQueryFactory (without initialPageParam, getArgs determined at call time).
65
+ */
66
+ export type InfiniteQueryFactoryConfig<A = BaseActor, M extends FunctionName<A> = FunctionName<A>, T extends TransformKey = "candid", TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>> = Omit<InfiniteQueryConfig<A, M, T, TPageParam, TSelected>, "getArgs">;
67
+ /**
68
+ * useInfiniteQuery hook with chained select support.
69
+ */
70
+ export interface UseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
71
+ (options?: Omit<UseInfiniteQueryOptions<TPageData, TError, TSelected, QueryKey, TPageParam>, "select" | "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam">): UseInfiniteQueryResult<TSelected, TError>;
72
+ <TFinal = TSelected>(options: Omit<UseInfiniteQueryOptions<TPageData, TError, TFinal, QueryKey, TPageParam>, "queryKey" | "queryFn" | "select" | "initialPageParam" | "getNextPageParam" | "getPreviousPageParam"> & {
73
+ select: (data: TSelected) => TFinal;
74
+ }): UseInfiniteQueryResult<TFinal, TError>;
75
+ }
76
+ /**
77
+ * Result from createActorInfiniteQuery
78
+ *
79
+ * @template TPageData - The raw page data type
80
+ * @template TPageParam - The page parameter type
81
+ * @template TSelected - The type after select transformation
82
+ * @template TError - The error type
83
+ */
84
+ export interface InfiniteQueryResult<TPageData, TPageParam, TSelected = InfiniteData<TPageData, TPageParam>, TError = Error> {
85
+ /** Fetch first page in loader (uses ensureQueryData for cache-first) */
86
+ fetch: () => Promise<TSelected>;
87
+ /** React hook for components - supports pagination */
88
+ useInfiniteQuery: UseInfiniteQueryWithSelect<TPageData, TPageParam, TSelected, TError>;
89
+ /** Invalidate and refetch cache */
90
+ refetch: () => Promise<void>;
91
+ /** Get query key (for advanced React Query usage) */
92
+ getQueryKey: () => QueryKey;
93
+ /**
94
+ * Read data directly from cache without fetching.
95
+ * Returns undefined if data is not in cache.
96
+ */
97
+ getCacheData: {
98
+ (): TSelected | undefined;
99
+ <TFinal>(select: (data: TSelected) => TFinal): TFinal | undefined;
100
+ };
101
+ }
102
+ export declare function createInfiniteQuery<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: InfiniteQueryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): InfiniteQueryResult<InfiniteQueryPageData<A, M, T>, TPageParam, TSelected, InfiniteQueryError<A, M, T>>;
103
+ /**
104
+ * Create an infinite query factory that accepts getArgs at call time.
105
+ * Useful when pagination logic varies by context.
106
+ *
107
+ * @template A - The actor interface type
108
+ * @template M - The method name on the actor
109
+ * @template T - The transformation key (identity, display, etc.)
110
+ * @template TPageParam - The page parameter type
111
+ * @template TSelected - The type returned after select transformation
112
+ *
113
+ * @param reactor - The Reactor instance
114
+ * @param config - Infinite query configuration (without getArgs)
115
+ * @returns A function that accepts getArgs and returns an ActorInfiniteQueryResult
116
+ *
117
+ * @example
118
+ * const getPostsQuery = createActorInfiniteQueryFactory(reactor, {
119
+ * functionName: "get_posts",
120
+ * initialPageParam: 0,
121
+ * getNextPageParam: (lastPage) => lastPage.nextCursor,
122
+ * })
123
+ *
124
+ * // Create query with specific args builder
125
+ * const userPostsQuery = getPostsQuery((cursor) => [{ userId, cursor, limit: 10 }])
126
+ * const { data, fetchNextPage } = userPostsQuery.useInfiniteQuery()
127
+ */
128
+ export declare function createInfiniteQueryFactory<A, T extends TransformKey, M extends FunctionName<A> = FunctionName<A>, TPageParam = unknown, TSelected = InfiniteData<InfiniteQueryPageData<A, M, T>, TPageParam>>(reactor: Reactor<A, T>, config: InfiniteQueryFactoryConfig<NoInfer<A>, M, T, TPageParam, TSelected>): (getArgs: (pageParam: TPageParam) => ReactorArgs<A, M, T>) => InfiniteQueryResult<InfiniteQueryPageData<A, M, T>, TPageParam, TSelected, InfiniteQueryError<A, M, T>>;
129
+ //# sourceMappingURL=createInfiniteQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createInfiniteQuery.d.ts","sourceRoot":"","sources":["../src/createInfiniteQuery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,QAAQ,EAER,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EAGxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMjC,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,CAC/B,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,CAAC,SAAS,YAAY,GAAG,QAAQ,IAC/B,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAE5B,0CAA0C;AAC1C,MAAM,MAAM,kBAAkB,CAC5B,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,CAAC,SAAS,YAAY,GAAG,QAAQ,IAC/B,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAM7B;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB,CAClC,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,UAAU,GAAG,OAAO,EACpB,SAAS,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC;IAEpE,yCAAyC;IACzC,YAAY,EAAE,CAAC,CAAA;IACf,8CAA8C;IAC9C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,6BAA6B;IAC7B,gBAAgB,EAAE,UAAU,CAAA;IAC5B,+CAA+C;IAC/C,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxD,gDAAgD;IAChD,gBAAgB,EAAE,CAChB,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAC1C,aAAa,EAAE,UAAU,EACzB,aAAa,EAAE,UAAU,EAAE,KACxB,UAAU,GAAG,SAAS,GAAG,IAAI,CAAA;IAClC,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,CACrB,SAAS,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACzC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAC1C,cAAc,EAAE,UAAU,EAC1B,aAAa,EAAE,UAAU,EAAE,KACxB,UAAU,GAAG,SAAS,GAAG,IAAI,CAAA;IAClC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CACP,IAAI,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,KAC3D,SAAS,CAAA;CACf;AAED;;GAEG;AACH,MAAM,MAAM,0BAA0B,CACpC,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,CAAC,SAAS,YAAY,GAAG,QAAQ,EACjC,UAAU,GAAG,OAAO,EACpB,SAAS,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,IAClE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;AAMxE;;GAEG;AACH,MAAM,WAAW,0BAA0B,CACzC,SAAS,EACT,UAAU,EACV,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,EAC/C,MAAM,GAAG,KAAK;IAGd,CACE,OAAO,CAAC,EAAE,IAAI,CACZ,uBAAuB,CACrB,SAAS,EACT,MAAM,EACN,SAAS,EACT,QAAQ,EACR,UAAU,CACX,EACC,QAAQ,GACR,UAAU,GACV,SAAS,GACT,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,CACzB,GACA,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAG5C,CAAC,MAAM,GAAG,SAAS,EACjB,OAAO,EAAE,IAAI,CACX,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EACtE,UAAU,GACV,SAAS,GACT,QAAQ,GACR,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,CACzB,GAAG;QACF,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAA;KACpC,GACA,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB,CAClC,SAAS,EACT,UAAU,EACV,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,EAC/C,MAAM,GAAG,KAAK;IAEd,wEAAwE;IACxE,KAAK,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;IAE/B,sDAAsD;IACtD,gBAAgB,EAAE,0BAA0B,CAC1C,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,CACP,CAAA;IAED,mCAAmC;IACnC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5B,qDAAqD;IACrD,WAAW,EAAE,MAAM,QAAQ,CAAA;IAE3B;;;OAGG;IACH,YAAY,EAAE;QACZ,IAAI,SAAS,GAAG,SAAS,CAAA;QACzB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAClE,CAAA;CACF;AA0KD,wBAAgB,mBAAmB,CACjC,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,UAAU,GAAG,OAAO,EACpB,SAAS,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,EAEpE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,GACnE,mBAAmB,CACpB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,EACV,SAAS,EACT,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC5B,CAKA;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAgB,0BAA0B,CACxC,CAAC,EACD,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAC3C,UAAU,GAAG,OAAO,EACpB,SAAS,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,EAEpE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,GAC1E,CACD,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACrD,mBAAmB,CACtB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,EACV,SAAS,EACT,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC5B,CAcA"}