@ic-reactor/react 2.0.1 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -79
- package/dist/createActorHooks.d.ts +39 -0
- package/dist/createActorHooks.d.ts.map +1 -0
- package/dist/createActorHooks.js +30 -0
- package/dist/createActorHooks.js.map +1 -0
- package/dist/createAuthHooks.d.ts +37 -0
- package/dist/createAuthHooks.d.ts.map +1 -0
- package/dist/createAuthHooks.js +94 -0
- package/dist/createAuthHooks.js.map +1 -0
- package/dist/createInfiniteQuery.d.ts +129 -0
- package/dist/createInfiniteQuery.d.ts.map +1 -0
- package/dist/createInfiniteQuery.js +160 -0
- package/dist/createInfiniteQuery.js.map +1 -0
- package/dist/createMutation.d.ts +19 -0
- package/dist/createMutation.d.ts.map +1 -0
- package/dist/createMutation.js +98 -0
- package/dist/createMutation.js.map +1 -0
- package/dist/createQuery.d.ts +20 -0
- package/dist/createQuery.d.ts.map +1 -0
- package/dist/createQuery.js +111 -0
- package/dist/createQuery.js.map +1 -0
- package/dist/createSuspenseInfiniteQuery.d.ts +122 -0
- package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -0
- package/dist/createSuspenseInfiniteQuery.js +160 -0
- package/dist/createSuspenseInfiniteQuery.js.map +1 -0
- package/dist/createSuspenseQuery.d.ts +25 -0
- package/dist/createSuspenseQuery.d.ts.map +1 -0
- package/dist/createSuspenseQuery.js +116 -0
- package/dist/createSuspenseQuery.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -2
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -18
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useActorInfiniteQuery.d.ts +37 -0
- package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -0
- package/dist/hooks/useActorInfiniteQuery.js +33 -0
- package/dist/hooks/useActorInfiniteQuery.js.map +1 -0
- package/dist/hooks/useActorMutation.d.ts +23 -0
- package/dist/hooks/useActorMutation.d.ts.map +1 -0
- package/dist/hooks/useActorMutation.js +39 -0
- package/dist/hooks/useActorMutation.js.map +1 -0
- package/dist/hooks/useActorQuery.d.ts +32 -0
- package/dist/hooks/useActorQuery.d.ts.map +1 -0
- package/dist/hooks/useActorQuery.js +35 -0
- package/dist/hooks/useActorQuery.js.map +1 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +36 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.js +33 -0
- package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -0
- package/dist/hooks/useActorSuspenseQuery.d.ts +32 -0
- package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -0
- package/dist/hooks/useActorSuspenseQuery.js +36 -0
- package/dist/hooks/useActorSuspenseQuery.js.map +1 -0
- package/dist/index.d.ts +11 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -49
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +232 -13
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -22
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +131 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +125 -0
- package/dist/validation.js.map +1 -0
- package/package.json +70 -35
- package/LICENSE.md +0 -8
- package/dist/context/actor/create.d.ts +0 -63
- package/dist/context/actor/create.js +0 -119
- package/dist/context/actor/hooks/useActorInterface.d.ts +0 -4
- package/dist/context/actor/hooks/useActorInterface.js +0 -10
- package/dist/context/actor/hooks/useActorState.d.ts +0 -21
- package/dist/context/actor/hooks/useActorState.js +0 -25
- package/dist/context/actor/hooks/useActorStore.d.ts +0 -32
- package/dist/context/actor/hooks/useActorStore.js +0 -36
- package/dist/context/actor/hooks/useInitializeActor.d.ts +0 -6
- package/dist/context/actor/hooks/useInitializeActor.js +0 -10
- package/dist/context/actor/hooks/useMethod.d.ts +0 -29
- package/dist/context/actor/hooks/useMethod.js +0 -34
- package/dist/context/actor/hooks/useMethodAttributes.d.ts +0 -7
- package/dist/context/actor/hooks/useMethodAttributes.js +0 -11
- package/dist/context/actor/hooks/useMethodNames.d.ts +0 -7
- package/dist/context/actor/hooks/useMethodNames.js +0 -11
- package/dist/context/actor/hooks/useQueryCall.d.ts +0 -28
- package/dist/context/actor/hooks/useQueryCall.js +0 -33
- package/dist/context/actor/hooks/useUpdateCall.d.ts +0 -29
- package/dist/context/actor/hooks/useUpdateCall.js +0 -34
- package/dist/context/actor/hooks/useVisitMethod.d.ts +0 -8
- package/dist/context/actor/hooks/useVisitMethod.js +0 -13
- package/dist/context/actor/hooks/useVisitService.d.ts +0 -8
- package/dist/context/actor/hooks/useVisitService.js +0 -13
- package/dist/context/actor/index.d.ts +0 -16
- package/dist/context/actor/index.js +0 -33
- package/dist/context/actor/provider.d.ts +0 -71
- package/dist/context/actor/provider.js +0 -75
- package/dist/context/actor/types.d.ts +0 -35
- package/dist/context/actor/types.js +0 -2
- package/dist/context/adapter/create.d.ts +0 -2
- package/dist/context/adapter/create.js +0 -102
- package/dist/context/adapter/hooks/useCandidAdapter.d.ts +0 -23
- package/dist/context/adapter/hooks/useCandidAdapter.js +0 -27
- package/dist/context/adapter/hooks/useCandidEvaluation.d.ts +0 -5
- package/dist/context/adapter/hooks/useCandidEvaluation.js +0 -9
- package/dist/context/adapter/index.d.ts +0 -6
- package/dist/context/adapter/index.js +0 -24
- package/dist/context/adapter/provider.d.ts +0 -23
- package/dist/context/adapter/provider.js +0 -27
- package/dist/context/adapter/types.d.ts +0 -52
- package/dist/context/adapter/types.js +0 -2
- package/dist/context/agent/create.d.ts +0 -74
- package/dist/context/agent/create.js +0 -104
- package/dist/context/agent/hooks/useAgent.d.ts +0 -14
- package/dist/context/agent/hooks/useAgent.js +0 -18
- package/dist/context/agent/hooks/useAgentManager.d.ts +0 -14
- package/dist/context/agent/hooks/useAgentManager.js +0 -18
- package/dist/context/agent/hooks/useAgentState.d.ts +0 -21
- package/dist/context/agent/hooks/useAgentState.js +0 -25
- package/dist/context/agent/hooks/useAuth.d.ts +0 -57
- package/dist/context/agent/hooks/useAuth.js +0 -61
- package/dist/context/agent/hooks/useAuthState.d.ts +0 -19
- package/dist/context/agent/hooks/useAuthState.js +0 -23
- package/dist/context/agent/hooks/useUserPrincipal.d.ts +0 -17
- package/dist/context/agent/hooks/useUserPrincipal.js +0 -21
- package/dist/context/agent/index.d.ts +0 -12
- package/dist/context/agent/index.js +0 -29
- package/dist/context/agent/provider.d.ts +0 -28
- package/dist/context/agent/provider.js +0 -32
- package/dist/context/agent/types.d.ts +0 -17
- package/dist/context/agent/types.js +0 -2
- package/dist/core.d.ts +0 -1
- package/dist/core.js +0 -9
- package/dist/createReactor.d.ts +0 -49
- package/dist/createReactor.js +0 -69
- package/dist/helpers/actorHooks.d.ts +0 -18
- package/dist/helpers/actorHooks.js +0 -283
- package/dist/helpers/agentHooks.d.ts +0 -3
- package/dist/helpers/agentHooks.js +0 -22
- package/dist/helpers/authHooks.d.ts +0 -2
- package/dist/helpers/authHooks.js +0 -120
- package/dist/helpers/extractActorContext.d.ts +0 -4
- package/dist/helpers/extractActorContext.js +0 -44
- package/dist/helpers/extractAgentContext.d.ts +0 -28
- package/dist/helpers/extractAgentContext.js +0 -59
- package/dist/helpers/index.d.ts +0 -5
- package/dist/helpers/index.js +0 -21
- package/dist/helpers/types.d.ts +0 -222
- package/dist/helpers/types.js +0 -2
- package/dist/hooks/types.d.ts +0 -22
- package/dist/hooks/types.js +0 -2
- package/dist/hooks/useActor.d.ts +0 -67
- package/dist/hooks/useActor.js +0 -197
- package/dist/hooks/useActorManager.d.ts +0 -68
- package/dist/hooks/useActorManager.js +0 -75
- package/dist/utils.d.ts +0 -1
- package/dist/utils.js +0 -17
package/README.md
CHANGED
|
@@ -1,121 +1,147 @@
|
|
|
1
|
-
|
|
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
|
|
6
|
-
- **Type-Safe
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
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
|
-
|
|
19
|
+
## Quick Start
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
+
export const { useActorQuery, useActorMutation, useAuth, reactor } =
|
|
31
|
+
createActorHooks({
|
|
32
|
+
canisterId,
|
|
33
|
+
idlFactory,
|
|
34
|
+
})
|
|
35
|
+
```
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
### 2. Authentication (Auto-Initializes Session)
|
|
31
38
|
|
|
32
|
-
|
|
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
|
-
|
|
41
|
+
```tsx
|
|
42
|
+
// src/App.tsx
|
|
43
|
+
import { useAuth } from "./hooks/actor"
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
<
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
+
### Authentication
|
|
79
109
|
|
|
80
|
-
|
|
110
|
+
The `createActorHooks` function returns authentication hooks directly.
|
|
81
111
|
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
import { useAuth } from "./actor"
|
|
112
|
+
```typescript
|
|
113
|
+
import { useAuth } from "./hooks/actor"
|
|
85
114
|
|
|
86
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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":"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"}
|