@capxul/sdk-react 0.2.0-alpha.4 → 0.2.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +259 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +524 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +37 -75
- package/CHANGELOG.md +0 -304
- package/LICENSE +0 -44
- package/README.md +0 -187
- package/dist/index.cjs +0 -1289
- package/dist/index.d.cts +0 -673
- package/dist/index.d.ts +0 -673
- package/dist/index.js +0 -1230
- package/dist/proof/index.cjs +0 -12785
- package/dist/proof/index.d.cts +0 -753
- package/dist/proof/index.d.ts +0 -753
- package/dist/proof/index.js +0 -12758
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { QueryClient, QueryClientProvider, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { createCapxulClient } from "@capxul/sdk";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
import { Errors } from "@capxul/config";
|
|
7
|
+
//#region src/internal/capxul-bootstrap-context.tsx
|
|
8
|
+
const CapxulBootstrapContext = createContext(null);
|
|
9
|
+
function CapxulBootstrapProvider({ value, children }) {
|
|
10
|
+
return /* @__PURE__ */ jsx(CapxulBootstrapContext.Provider, {
|
|
11
|
+
value,
|
|
12
|
+
children
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function useCapxul() {
|
|
16
|
+
const state = useContext(CapxulBootstrapContext);
|
|
17
|
+
if (state === null) throw new Error("useCapxul must be used within <CapxulProvider>");
|
|
18
|
+
return state;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/internal/capxul-client-context.tsx
|
|
22
|
+
const CapxulClientContext = createContext(null);
|
|
23
|
+
function CapxulClientProvider({ client, children }) {
|
|
24
|
+
return /* @__PURE__ */ jsx(CapxulClientContext.Provider, {
|
|
25
|
+
value: client,
|
|
26
|
+
children
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function useCapxulClient() {
|
|
30
|
+
const client = useCapxulClientOrNull();
|
|
31
|
+
if (client === null) throw new Error("useCapxulClient called before <CapxulProvider> bootstrap resolved");
|
|
32
|
+
return client;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns the client, or `null` while `<CapxulProvider>` is still bootstrapping.
|
|
36
|
+
* Data hooks use this so they can sit in `isPending` (disabled query) until the
|
|
37
|
+
* client resolves, rather than throwing during bootstrap.
|
|
38
|
+
*/
|
|
39
|
+
function useCapxulClientOrNull() {
|
|
40
|
+
return useContext(CapxulClientContext);
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/provider.tsx
|
|
44
|
+
function makeDefaultQueryClient() {
|
|
45
|
+
return new QueryClient({ defaultOptions: {
|
|
46
|
+
queries: {
|
|
47
|
+
retry: 2,
|
|
48
|
+
staleTime: 3e4
|
|
49
|
+
},
|
|
50
|
+
mutations: { retry: 0 }
|
|
51
|
+
} });
|
|
52
|
+
}
|
|
53
|
+
function CapxulProvider(props) {
|
|
54
|
+
const { publishableKey, client: injectedClient, requirement, origin, bootstrapBaseUrl, authCache, invokeTimeoutMs, signer, queryClient, children } = props;
|
|
55
|
+
const [resolvedQueryClient] = useState(() => queryClient ?? makeDefaultQueryClient());
|
|
56
|
+
const [client, setClient] = useState(injectedClient ?? null);
|
|
57
|
+
const [status, setStatus] = useState(injectedClient === void 0 ? "bootstrapping" : "ready");
|
|
58
|
+
const [error, setError] = useState(null);
|
|
59
|
+
const [attempt, setAttempt] = useState(0);
|
|
60
|
+
const retry = useCallback(() => {
|
|
61
|
+
setAttempt((n) => n + 1);
|
|
62
|
+
}, []);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (publishableKey === void 0) return;
|
|
65
|
+
let cancelled = false;
|
|
66
|
+
let created = null;
|
|
67
|
+
setStatus("bootstrapping");
|
|
68
|
+
setError(null);
|
|
69
|
+
setClient(null);
|
|
70
|
+
(async () => {
|
|
71
|
+
const result = await createCapxulClient({
|
|
72
|
+
publishableKey,
|
|
73
|
+
...requirement === void 0 ? {} : { requirement },
|
|
74
|
+
...origin === void 0 ? {} : { origin },
|
|
75
|
+
...bootstrapBaseUrl === void 0 ? {} : { bootstrapBaseUrl },
|
|
76
|
+
...authCache === void 0 ? {} : { authCache },
|
|
77
|
+
...invokeTimeoutMs === void 0 ? {} : { invokeTimeoutMs },
|
|
78
|
+
...signer === void 0 ? {} : { signer }
|
|
79
|
+
});
|
|
80
|
+
if (cancelled) {
|
|
81
|
+
if (result.ok) await result.value._internal.close?.();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (result.ok) {
|
|
85
|
+
created = result.value;
|
|
86
|
+
setClient(result.value);
|
|
87
|
+
setStatus("ready");
|
|
88
|
+
} else {
|
|
89
|
+
setError(result.error);
|
|
90
|
+
setStatus("error");
|
|
91
|
+
}
|
|
92
|
+
})();
|
|
93
|
+
return () => {
|
|
94
|
+
cancelled = true;
|
|
95
|
+
created?._internal.close?.();
|
|
96
|
+
};
|
|
97
|
+
}, [
|
|
98
|
+
publishableKey,
|
|
99
|
+
requirement,
|
|
100
|
+
origin,
|
|
101
|
+
bootstrapBaseUrl,
|
|
102
|
+
authCache,
|
|
103
|
+
invokeTimeoutMs,
|
|
104
|
+
signer,
|
|
105
|
+
attempt
|
|
106
|
+
]);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (injectedClient === void 0) return;
|
|
109
|
+
setClient(injectedClient);
|
|
110
|
+
setStatus("ready");
|
|
111
|
+
setError(null);
|
|
112
|
+
}, [injectedClient]);
|
|
113
|
+
const bootstrapState = useMemo(() => ({
|
|
114
|
+
status,
|
|
115
|
+
error,
|
|
116
|
+
retry
|
|
117
|
+
}), [
|
|
118
|
+
status,
|
|
119
|
+
error,
|
|
120
|
+
retry
|
|
121
|
+
]);
|
|
122
|
+
if (publishableKey === void 0 === (injectedClient === void 0)) throw new Error("CapxulProvider requires exactly one of `publishableKey` or `client`");
|
|
123
|
+
return /* @__PURE__ */ jsx(QueryClientProvider, {
|
|
124
|
+
client: resolvedQueryClient,
|
|
125
|
+
children: /* @__PURE__ */ jsx(CapxulBootstrapProvider, {
|
|
126
|
+
value: bootstrapState,
|
|
127
|
+
children: /* @__PURE__ */ jsx(CapxulClientProvider, {
|
|
128
|
+
client,
|
|
129
|
+
children
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/internal/require-bootstrapped-client.ts
|
|
136
|
+
/**
|
|
137
|
+
* Narrow the bootstrap-nullable client to a ready client inside a query /
|
|
138
|
+
* mutation function (sdk-provider-owned-bootstrap.md). Data hooks gate their
|
|
139
|
+
* queries on `enabled: client !== null`, so this only ever throws for a mutation
|
|
140
|
+
* triggered while `<CapxulProvider>` is still bootstrapping.
|
|
141
|
+
*/
|
|
142
|
+
function requireBootstrappedClient(client, method) {
|
|
143
|
+
if (client === null) throw Errors.wrongState({
|
|
144
|
+
method,
|
|
145
|
+
currentState: "bootstrapping",
|
|
146
|
+
validStates: ["ready"]
|
|
147
|
+
});
|
|
148
|
+
return client;
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/internal/reactivity-keys.ts
|
|
152
|
+
const capxulKeys = {
|
|
153
|
+
session: ["capxul", "session"],
|
|
154
|
+
profile: ["capxul", "profile"],
|
|
155
|
+
account: ["capxul", "account"],
|
|
156
|
+
accountBalance: ["capxul", "accountBalance"],
|
|
157
|
+
subAccounts: (accountId) => [
|
|
158
|
+
"capxul",
|
|
159
|
+
"subAccounts",
|
|
160
|
+
accountId ?? "pending"
|
|
161
|
+
],
|
|
162
|
+
orgs: ["capxul", "orgs"],
|
|
163
|
+
org: (orgId) => [
|
|
164
|
+
"capxul",
|
|
165
|
+
"org",
|
|
166
|
+
orgId ?? "pending"
|
|
167
|
+
],
|
|
168
|
+
orgMembers: (orgId) => [
|
|
169
|
+
"capxul",
|
|
170
|
+
"org",
|
|
171
|
+
orgId ?? "pending",
|
|
172
|
+
"members"
|
|
173
|
+
],
|
|
174
|
+
orgRoles: (orgId) => [
|
|
175
|
+
"capxul",
|
|
176
|
+
"org",
|
|
177
|
+
orgId ?? "pending",
|
|
178
|
+
"roles"
|
|
179
|
+
],
|
|
180
|
+
orgTreasury: (orgId) => [
|
|
181
|
+
"capxul",
|
|
182
|
+
"org",
|
|
183
|
+
orgId ?? "pending",
|
|
184
|
+
"treasury"
|
|
185
|
+
]
|
|
186
|
+
};
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region src/internal/unwrap-capxul-result.ts
|
|
189
|
+
/** Unwrap a `CapxulResult` for TanStack query/mutation functions — throws into error paths. */
|
|
190
|
+
function unwrapCapxulResult(result) {
|
|
191
|
+
if (result.ok) return result.value;
|
|
192
|
+
throw result.error;
|
|
193
|
+
}
|
|
194
|
+
//#endregion
|
|
195
|
+
//#region src/hooks/use-capxul-session.ts
|
|
196
|
+
function useCapxulSession() {
|
|
197
|
+
const client = useCapxulClientOrNull();
|
|
198
|
+
return useQuery({
|
|
199
|
+
queryKey: capxulKeys.session,
|
|
200
|
+
queryFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "auth.getSession").auth.getSession()),
|
|
201
|
+
enabled: client !== null
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region src/hooks/use-capxul-profile.ts
|
|
206
|
+
function useCapxulProfile() {
|
|
207
|
+
const client = useCapxulClientOrNull();
|
|
208
|
+
return useQuery({
|
|
209
|
+
queryKey: capxulKeys.profile,
|
|
210
|
+
queryFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "identity.loadCurrent").identity.loadCurrent()),
|
|
211
|
+
enabled: client !== null
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
//#region src/hooks/use-capxul-account.ts
|
|
216
|
+
function useCapxulAccount() {
|
|
217
|
+
const client = useCapxulClientOrNull();
|
|
218
|
+
return useQuery({
|
|
219
|
+
queryKey: capxulKeys.account,
|
|
220
|
+
queryFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "account.getStatus").account.getStatus()),
|
|
221
|
+
enabled: client !== null
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
//#endregion
|
|
225
|
+
//#region src/hooks/use-capxul-account-balance.ts
|
|
226
|
+
function useCapxulAccountBalance(options) {
|
|
227
|
+
const client = useCapxulClientOrNull();
|
|
228
|
+
return useQuery({
|
|
229
|
+
queryKey: capxulKeys.accountBalance,
|
|
230
|
+
queryFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "accounts.read").accounts.read()),
|
|
231
|
+
enabled: client !== null && (options?.enabled ?? true)
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region src/hooks/use-capxul-account-fund.ts
|
|
236
|
+
function useCapxulAccountFund() {
|
|
237
|
+
const client = useCapxulClientOrNull();
|
|
238
|
+
const queryClient = useQueryClient();
|
|
239
|
+
return useMutation({
|
|
240
|
+
mutationFn: async (amount) => unwrapCapxulResult(await requireBootstrappedClient(client, "_internal.accounts.fund")._internal.accounts.fund(amount)),
|
|
241
|
+
onSuccess: async () => {
|
|
242
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/hooks/use-capxul-sign-in.ts
|
|
248
|
+
function useCapxulSignIn() {
|
|
249
|
+
const client = useCapxulClientOrNull();
|
|
250
|
+
return useMutation({ mutationFn: async (input) => unwrapCapxulResult(await requireBootstrappedClient(client, "auth.signIn").auth.signIn(input)) });
|
|
251
|
+
}
|
|
252
|
+
//#endregion
|
|
253
|
+
//#region src/internal/invalidate-auth-boundary.ts
|
|
254
|
+
/** Background refetch after verifyOtp — avoids hard reset cancel errors in UI. */
|
|
255
|
+
async function invalidateAuthBoundary(queryClient) {
|
|
256
|
+
await Promise.all([
|
|
257
|
+
queryClient.invalidateQueries({ queryKey: capxulKeys.session }),
|
|
258
|
+
queryClient.invalidateQueries({ queryKey: capxulKeys.profile }),
|
|
259
|
+
queryClient.invalidateQueries({ queryKey: capxulKeys.account }),
|
|
260
|
+
queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance })
|
|
261
|
+
]);
|
|
262
|
+
}
|
|
263
|
+
/** Hard reset after signOut — drop cached authenticated rows immediately. */
|
|
264
|
+
async function resetAuthBoundary(queryClient) {
|
|
265
|
+
await queryClient.cancelQueries({ queryKey: capxulKeys.accountBalance });
|
|
266
|
+
await Promise.all([
|
|
267
|
+
queryClient.resetQueries({ queryKey: capxulKeys.session }),
|
|
268
|
+
queryClient.resetQueries({ queryKey: capxulKeys.profile }),
|
|
269
|
+
queryClient.resetQueries({ queryKey: capxulKeys.account }),
|
|
270
|
+
queryClient.resetQueries({ queryKey: capxulKeys.accountBalance })
|
|
271
|
+
]);
|
|
272
|
+
}
|
|
273
|
+
//#endregion
|
|
274
|
+
//#region src/hooks/use-capxul-verify-otp.ts
|
|
275
|
+
function useCapxulVerifyOtp() {
|
|
276
|
+
const client = useCapxulClientOrNull();
|
|
277
|
+
const queryClient = useQueryClient();
|
|
278
|
+
return useMutation({
|
|
279
|
+
mutationFn: async (input) => unwrapCapxulResult(await requireBootstrappedClient(client, "auth.verifyOtp").auth.verifyOtp(input)),
|
|
280
|
+
onSuccess: () => invalidateAuthBoundary(queryClient)
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//#endregion
|
|
284
|
+
//#region src/hooks/use-capxul-sign-out.ts
|
|
285
|
+
function useCapxulSignOut() {
|
|
286
|
+
const client = useCapxulClientOrNull();
|
|
287
|
+
const queryClient = useQueryClient();
|
|
288
|
+
return useMutation({
|
|
289
|
+
onMutate: async () => {
|
|
290
|
+
await queryClient.cancelQueries({ queryKey: capxulKeys.accountBalance });
|
|
291
|
+
},
|
|
292
|
+
mutationFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "auth.signOut").auth.signOut()),
|
|
293
|
+
onSuccess: () => resetAuthBoundary(queryClient)
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//#endregion
|
|
297
|
+
//#region src/hooks/use-capxul-ensure-ready.ts
|
|
298
|
+
function useCapxulEnsureReady() {
|
|
299
|
+
const client = useCapxulClientOrNull();
|
|
300
|
+
const queryClient = useQueryClient();
|
|
301
|
+
return useMutation({
|
|
302
|
+
mutationFn: async () => unwrapCapxulResult(await requireBootstrappedClient(client, "account.ensureReady").account.ensureReady()),
|
|
303
|
+
onSuccess: () => invalidateAuthBoundary(queryClient)
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
//#endregion
|
|
307
|
+
//#region src/hooks/use-capxul-sub-accounts.ts
|
|
308
|
+
function useCapxulSubAccountsList(accountId, options) {
|
|
309
|
+
const client = useCapxulClientOrNull();
|
|
310
|
+
return useQuery({
|
|
311
|
+
queryKey: capxulKeys.subAccounts(accountId),
|
|
312
|
+
queryFn: async () => {
|
|
313
|
+
if (accountId === void 0) throw Errors.invalidInput("accountId", "required for subAccounts.list");
|
|
314
|
+
return unwrapCapxulResult(await requireBootstrappedClient(client, "subAccounts.list").subAccounts.list(accountId));
|
|
315
|
+
},
|
|
316
|
+
enabled: client !== null && (options?.enabled ?? true) && accountId !== void 0
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
function useCapxulSubAccountCreate() {
|
|
320
|
+
const client = useCapxulClientOrNull();
|
|
321
|
+
const queryClient = useQueryClient();
|
|
322
|
+
return useMutation({
|
|
323
|
+
mutationFn: async (input) => unwrapCapxulResult(await requireBootstrappedClient(client, "subAccounts.create").subAccounts.create(input.accountId, { name: input.name })),
|
|
324
|
+
onSuccess: async (_value, variables) => {
|
|
325
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.subAccounts(variables.accountId) });
|
|
326
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
function useCapxulSubAccountRename() {
|
|
331
|
+
const client = useCapxulClientOrNull();
|
|
332
|
+
const queryClient = useQueryClient();
|
|
333
|
+
return useMutation({
|
|
334
|
+
mutationFn: async (input) => unwrapCapxulResult(await requireBootstrappedClient(client, "subAccounts.rename").subAccounts.rename(input.subAccountId, input.name)),
|
|
335
|
+
onSuccess: async (_value, variables) => {
|
|
336
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.subAccounts(variables.accountId) });
|
|
337
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
function useCapxulSubAccountDelete() {
|
|
342
|
+
const client = useCapxulClientOrNull();
|
|
343
|
+
const queryClient = useQueryClient();
|
|
344
|
+
return useMutation({
|
|
345
|
+
mutationFn: async (input) => unwrapCapxulResult(await requireBootstrappedClient(client, "subAccounts.delete").subAccounts.delete(input.subAccountId)),
|
|
346
|
+
onSuccess: async (_value, variables) => {
|
|
347
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.subAccounts(variables.accountId) });
|
|
348
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
function useCapxulTransfer() {
|
|
353
|
+
const client = useCapxulClientOrNull();
|
|
354
|
+
const queryClient = useQueryClient();
|
|
355
|
+
return useMutation({
|
|
356
|
+
mutationFn: async ({ from, to, amount }) => unwrapCapxulResult(await requireBootstrappedClient(client, "subAccounts.transfer").subAccounts.transfer({
|
|
357
|
+
from,
|
|
358
|
+
to,
|
|
359
|
+
amount
|
|
360
|
+
})),
|
|
361
|
+
onSuccess: async (_value, variables) => {
|
|
362
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.subAccounts(variables.accountId) });
|
|
363
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
//#endregion
|
|
368
|
+
//#region src/hooks/use-capxul-orgs.ts
|
|
369
|
+
function useCapxulOrgs(options) {
|
|
370
|
+
const client = useCapxulClient();
|
|
371
|
+
return useQuery({
|
|
372
|
+
queryKey: capxulKeys.orgs,
|
|
373
|
+
queryFn: async () => unwrapCapxulResult(await client.orgs()),
|
|
374
|
+
enabled: options?.enabled ?? true
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
//#endregion
|
|
378
|
+
//#region src/hooks/use-capxul-org.ts
|
|
379
|
+
function useCapxulOrg(orgId, options) {
|
|
380
|
+
const client = useCapxulClient();
|
|
381
|
+
return useQuery({
|
|
382
|
+
queryKey: capxulKeys.org(orgId),
|
|
383
|
+
queryFn: async () => {
|
|
384
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulOrg");
|
|
385
|
+
return unwrapCapxulResult(await client.orgs()).find((org) => org.id === orgId) ?? null;
|
|
386
|
+
},
|
|
387
|
+
enabled: (options?.enabled ?? true) && orgId !== void 0
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
//#endregion
|
|
391
|
+
//#region src/hooks/use-capxul-org-members.ts
|
|
392
|
+
function useCapxulOrgMembers(orgId, options) {
|
|
393
|
+
const client = useCapxulClient();
|
|
394
|
+
return useQuery({
|
|
395
|
+
queryKey: capxulKeys.orgMembers(orgId),
|
|
396
|
+
queryFn: async () => {
|
|
397
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulOrgMembers");
|
|
398
|
+
return unwrapCapxulResult(await client.org(orgId).members());
|
|
399
|
+
},
|
|
400
|
+
enabled: (options?.enabled ?? true) && orgId !== void 0
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
//#endregion
|
|
404
|
+
//#region src/hooks/use-capxul-org-roles.ts
|
|
405
|
+
function useCapxulOrgRoles(orgId, options) {
|
|
406
|
+
const client = useCapxulClient();
|
|
407
|
+
return useQuery({
|
|
408
|
+
queryKey: capxulKeys.orgRoles(orgId),
|
|
409
|
+
queryFn: async () => {
|
|
410
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulOrgRoles");
|
|
411
|
+
return unwrapCapxulResult(await client.org(orgId).roles());
|
|
412
|
+
},
|
|
413
|
+
enabled: (options?.enabled ?? true) && orgId !== void 0
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
//#endregion
|
|
417
|
+
//#region src/hooks/use-capxul-org-deploy-roles.ts
|
|
418
|
+
function useCapxulOrgDeployRoles() {
|
|
419
|
+
const client = useCapxulClient();
|
|
420
|
+
const queryClient = useQueryClient();
|
|
421
|
+
return useMutation({
|
|
422
|
+
mutationFn: async (orgId) => {
|
|
423
|
+
return unwrapCapxulResult(await client.org(orgId).deployRoles());
|
|
424
|
+
},
|
|
425
|
+
onSuccess: async (_roles, orgId) => {
|
|
426
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgRoles(orgId) });
|
|
427
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.org(orgId) });
|
|
428
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgs });
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
//#endregion
|
|
433
|
+
//#region src/hooks/use-capxul-org-treasury.ts
|
|
434
|
+
function useCapxulOrgTreasury(orgId, options) {
|
|
435
|
+
const client = useCapxulClient();
|
|
436
|
+
return useQuery({
|
|
437
|
+
queryKey: capxulKeys.orgTreasury(orgId),
|
|
438
|
+
queryFn: async () => {
|
|
439
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulOrgTreasury");
|
|
440
|
+
return unwrapCapxulResult(await client.org(orgId).treasury());
|
|
441
|
+
},
|
|
442
|
+
enabled: (options?.enabled ?? true) && orgId !== void 0
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
//#endregion
|
|
446
|
+
//#region src/hooks/use-capxul-create-org.ts
|
|
447
|
+
function useCapxulCreateOrg() {
|
|
448
|
+
const client = useCapxulClient();
|
|
449
|
+
const queryClient = useQueryClient();
|
|
450
|
+
return useMutation({
|
|
451
|
+
mutationFn: async (input) => unwrapCapxulResult(await client.createOrg(input)),
|
|
452
|
+
onSuccess: async () => {
|
|
453
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgs });
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
//#endregion
|
|
458
|
+
//#region src/hooks/use-capxul-invite-member.ts
|
|
459
|
+
function useCapxulInviteMember(orgId) {
|
|
460
|
+
const client = useCapxulClient();
|
|
461
|
+
const queryClient = useQueryClient();
|
|
462
|
+
return useMutation({
|
|
463
|
+
mutationFn: async (input) => {
|
|
464
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulInviteMember");
|
|
465
|
+
return unwrapCapxulResult(await client.org(orgId).invite(input));
|
|
466
|
+
},
|
|
467
|
+
onSuccess: async () => {
|
|
468
|
+
if (orgId === void 0) return;
|
|
469
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
//#endregion
|
|
474
|
+
//#region src/hooks/use-capxul-remove-member.ts
|
|
475
|
+
function useCapxulRemoveMember(orgId) {
|
|
476
|
+
const client = useCapxulClient();
|
|
477
|
+
const queryClient = useQueryClient();
|
|
478
|
+
return useMutation({
|
|
479
|
+
mutationFn: async (input) => {
|
|
480
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulRemoveMember");
|
|
481
|
+
return unwrapCapxulResult(await client.org(orgId).removeMember(input));
|
|
482
|
+
},
|
|
483
|
+
onSuccess: async () => {
|
|
484
|
+
if (orgId === void 0) return;
|
|
485
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region src/hooks/use-capxul-assign-role.ts
|
|
491
|
+
function useCapxulAssignRole(orgId) {
|
|
492
|
+
const client = useCapxulClient();
|
|
493
|
+
const queryClient = useQueryClient();
|
|
494
|
+
return useMutation({
|
|
495
|
+
mutationFn: async (input) => {
|
|
496
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "required for useCapxulAssignRole");
|
|
497
|
+
return unwrapCapxulResult(await client.org(orgId).assignRole(input));
|
|
498
|
+
},
|
|
499
|
+
onSuccess: async () => {
|
|
500
|
+
if (orgId === void 0) return;
|
|
501
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
//#endregion
|
|
506
|
+
//#region src/hooks/use-capxul-org-spend.ts
|
|
507
|
+
function useCapxulOrgSpend(orgId) {
|
|
508
|
+
const client = useCapxulClient();
|
|
509
|
+
const queryClient = useQueryClient();
|
|
510
|
+
return useMutation({
|
|
511
|
+
mutationFn: async (input) => {
|
|
512
|
+
if (orgId === void 0) throw Errors.invalidInput("orgId", "org is not selected");
|
|
513
|
+
return unwrapCapxulResult(await client.org(orgId).spend(input));
|
|
514
|
+
},
|
|
515
|
+
onSuccess: async () => {
|
|
516
|
+
if (orgId === void 0) return;
|
|
517
|
+
await queryClient.invalidateQueries({ queryKey: capxulKeys.orgTreasury(orgId) });
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
//#endregion
|
|
522
|
+
export { CapxulProvider, useCapxul, useCapxulAccount, useCapxulAccountBalance, useCapxulAccountFund, useCapxulAssignRole, useCapxulCreateOrg, useCapxulEnsureReady, useCapxulInviteMember, useCapxulOrg, useCapxulOrgDeployRoles, useCapxulOrgMembers, useCapxulOrgRoles, useCapxulOrgSpend, useCapxulOrgTreasury, useCapxulOrgs, useCapxulProfile, useCapxulRemoveMember, useCapxulSession, useCapxulSignIn, useCapxulSignOut, useCapxulSubAccountCreate, useCapxulSubAccountDelete, useCapxulSubAccountRename, useCapxulSubAccountsList, useCapxulTransfer, useCapxulVerifyOtp };
|
|
523
|
+
|
|
524
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/internal/capxul-bootstrap-context.tsx","../src/internal/capxul-client-context.tsx","../src/provider.tsx","../src/internal/require-bootstrapped-client.ts","../src/internal/reactivity-keys.ts","../src/internal/unwrap-capxul-result.ts","../src/hooks/use-capxul-session.ts","../src/hooks/use-capxul-profile.ts","../src/hooks/use-capxul-account.ts","../src/hooks/use-capxul-account-balance.ts","../src/hooks/use-capxul-account-fund.ts","../src/hooks/use-capxul-sign-in.ts","../src/internal/invalidate-auth-boundary.ts","../src/hooks/use-capxul-verify-otp.ts","../src/hooks/use-capxul-sign-out.ts","../src/hooks/use-capxul-ensure-ready.ts","../src/hooks/use-capxul-sub-accounts.ts","../src/hooks/use-capxul-orgs.ts","../src/hooks/use-capxul-org.ts","../src/hooks/use-capxul-org-members.ts","../src/hooks/use-capxul-org-roles.ts","../src/hooks/use-capxul-org-deploy-roles.ts","../src/hooks/use-capxul-org-treasury.ts","../src/hooks/use-capxul-create-org.ts","../src/hooks/use-capxul-invite-member.ts","../src/hooks/use-capxul-remove-member.ts","../src/hooks/use-capxul-assign-role.ts","../src/hooks/use-capxul-org-spend.ts"],"sourcesContent":["\"use client\";\n\n// Bootstrap-state context (SDK publish readiness · sdk-provider-owned-bootstrap).\n//\n// `<CapxulProvider>` runs the async client bootstrap and publishes its status\n// here. Consumers read it via `useCapxul()` for an opt-in splash / error / retry\n// surface. Data hooks do NOT need it — they sit in `isPending` until the client\n// resolves (see `useCapxulClientOrNull`).\n\nimport * as React from \"react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport type { CapxulError } from \"@capxul/config\";\n\nvoid React;\n\nexport type CapxulBootstrapStatus = \"bootstrapping\" | \"ready\" | \"error\";\n\nexport interface CapxulBootstrapState {\n readonly status: CapxulBootstrapStatus;\n readonly error: CapxulError | null;\n readonly retry: () => void;\n}\n\nconst CapxulBootstrapContext = createContext<CapxulBootstrapState | null>(null);\n\nexport interface CapxulBootstrapProviderProps {\n readonly value: CapxulBootstrapState;\n readonly children: ReactNode;\n}\n\nexport function CapxulBootstrapProvider({ value, children }: CapxulBootstrapProviderProps) {\n return (\n <CapxulBootstrapContext.Provider value={value}>{children}</CapxulBootstrapContext.Provider>\n );\n}\n\nexport function useCapxul(): CapxulBootstrapState {\n const state = useContext(CapxulBootstrapContext);\n if (state === null) {\n throw new Error(\"useCapxul must be used within <CapxulProvider>\");\n }\n return state;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport type { CapxulClient } from \"@capxul/sdk\";\n\nconst CapxulClientContext = createContext<CapxulClient | null>(null);\n\nexport interface CapxulClientProviderProps {\n readonly client: CapxulClient | null;\n readonly children: ReactNode;\n}\n\nexport function CapxulClientProvider({ client, children }: CapxulClientProviderProps) {\n return <CapxulClientContext.Provider value={client}>{children}</CapxulClientContext.Provider>;\n}\n\nexport function useCapxulClient(): CapxulClient {\n const client = useCapxulClientOrNull();\n if (client === null) {\n throw new Error(\"useCapxulClient called before <CapxulProvider> bootstrap resolved\");\n }\n return client;\n}\n\n/**\n * Returns the client, or `null` while `<CapxulProvider>` is still bootstrapping.\n * Data hooks use this so they can sit in `isPending` (disabled query) until the\n * client resolves, rather than throwing during bootstrap.\n */\nexport function useCapxulClientOrNull(): CapxulClient | null {\n return useContext(CapxulClientContext);\n}\n","\"use client\";\n\n// CapxulProvider — owns the client lifecycle (sdk-provider-owned-bootstrap.md).\n//\n// Two modes:\n// - `publishableKey` (browser/app): the provider runs the async bootstrap via\n// `createCapxulClient`, owns the TanStack QueryClient, exposes status via\n// `useCapxul()`, and closes the client on unmount / re-bootstrap.\n// - `client` (Node/server consumers that bootstrap before React, plus test\n// harnesses): a pre-built client is supplied; the provider is `ready`\n// immediately and leaves that client's lifecycle to the caller.\n//\n// `signer` (backend-orchestrated-deploy.md) threads into the deploy lane via\n// `createCapxulClient` for `requirement: \"deployed\"` flows.\n\nimport * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type {\n AccountRequirement,\n CapxulClient,\n CapxulSigner,\n ProductionAdapterInput,\n} from \"@capxul/sdk\";\nimport { createCapxulClient } from \"@capxul/sdk\";\n\nimport {\n CapxulBootstrapProvider,\n type CapxulBootstrapState,\n} from \"./internal/capxul-bootstrap-context\";\nimport { CapxulClientProvider } from \"./internal/capxul-client-context\";\n\nvoid React;\n\nexport interface CapxulProviderProps {\n /** Publishable key — the provider bootstraps the client (browser / app path). */\n readonly publishableKey?: string;\n /**\n * Pre-built client (Node / server consumers that bootstrap before any React\n * tree, and test harnesses). Mutually exclusive with `publishableKey`.\n */\n readonly client?: CapxulClient;\n /** Init-time account readiness target. Default `\"none\"`. */\n readonly requirement?: AccountRequirement;\n /** Optional app origin forwarded to the SDK bootstrap request. */\n readonly origin?: ProductionAdapterInput[\"origin\"];\n /** Optional bootstrap host override for live/dev environments. */\n readonly bootstrapBaseUrl?: ProductionAdapterInput[\"bootstrapBaseUrl\"];\n /** Optional auth persistence adapter; Node CLIs pass their filesystem cache. */\n readonly authCache?: ProductionAdapterInput[\"authCache\"];\n /** Optional method invocation timeout in milliseconds. */\n readonly invokeTimeoutMs?: ProductionAdapterInput[\"invokeTimeoutMs\"];\n /**\n * Consumer-held signer for the backend-orchestrated deploy lane\n * (backend-orchestrated-deploy.md). Required for `requirement: \"deployed\"`.\n */\n readonly signer?: CapxulSigner;\n /** Bring your own QueryClient; otherwise the provider creates one. */\n readonly queryClient?: QueryClient;\n readonly children: ReactNode;\n}\n\nfunction makeDefaultQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: { retry: 2, staleTime: 30_000 },\n mutations: { retry: 0 },\n },\n });\n}\n\nexport function CapxulProvider(props: CapxulProviderProps) {\n const {\n publishableKey,\n client: injectedClient,\n requirement,\n origin,\n bootstrapBaseUrl,\n authCache,\n invokeTimeoutMs,\n signer,\n queryClient,\n children,\n } = props;\n\n // The QueryClient is pinned at mount: a later `queryClient` prop swap is\n // ignored (consumers should not swap it mid-tree) — pass your own once, or\n // let the provider create one.\n const [resolvedQueryClient] = useState(() => queryClient ?? makeDefaultQueryClient());\n\n const [client, setClient] = useState<CapxulClient | null>(injectedClient ?? null);\n const [status, setStatus] = useState<CapxulBootstrapState[\"status\"]>(\n injectedClient === undefined ? \"bootstrapping\" : \"ready\",\n );\n const [error, setError] = useState<CapxulError | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n const retry = useCallback(() => {\n setAttempt((n) => n + 1);\n }, []);\n\n // Bootstrap path: the provider owns the client it creates and closes it on\n // unmount / re-bootstrap. The `cancelled` guard closes a client that resolves\n // after the effect tears down (StrictMode double-invoke, retry, unmount).\n useEffect(() => {\n if (publishableKey === undefined) return;\n let cancelled = false;\n let created: CapxulClient | null = null;\n setStatus(\"bootstrapping\");\n setError(null);\n setClient(null);\n void (async () => {\n const result = await createCapxulClient({\n publishableKey,\n ...(requirement === undefined ? {} : { requirement }),\n ...(origin === undefined ? {} : { origin }),\n ...(bootstrapBaseUrl === undefined ? {} : { bootstrapBaseUrl }),\n ...(authCache === undefined ? {} : { authCache }),\n ...(invokeTimeoutMs === undefined ? {} : { invokeTimeoutMs }),\n ...(signer === undefined ? {} : { signer }),\n });\n if (cancelled) {\n if (result.ok) await result.value._internal.close?.();\n return;\n }\n if (result.ok) {\n created = result.value;\n setClient(result.value);\n setStatus(\"ready\");\n } else {\n setError(result.error);\n setStatus(\"error\");\n }\n })();\n return () => {\n cancelled = true;\n void created?._internal.close?.();\n };\n }, [\n publishableKey,\n requirement,\n origin,\n bootstrapBaseUrl,\n authCache,\n invokeTimeoutMs,\n signer,\n attempt,\n ]);\n\n // Injected-client path: track prop identity; lifecycle stays with the caller.\n useEffect(() => {\n if (injectedClient === undefined) return;\n setClient(injectedClient);\n setStatus(\"ready\");\n setError(null);\n }, [injectedClient]);\n\n const bootstrapState = useMemo<CapxulBootstrapState>(\n () => ({ status, error, retry }),\n [status, error, retry],\n );\n\n // Validate AFTER the hooks so a publishableKey↔client prop transition never\n // changes the hook count (rules of hooks); the throw aborts render cleanly.\n if ((publishableKey === undefined) === (injectedClient === undefined)) {\n throw new Error(\"CapxulProvider requires exactly one of `publishableKey` or `client`\");\n }\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <CapxulBootstrapProvider value={bootstrapState}>\n <CapxulClientProvider client={client}>{children}</CapxulClientProvider>\n </CapxulBootstrapProvider>\n </QueryClientProvider>\n );\n}\n","import { Errors } from \"@capxul/config\";\nimport type { CapxulClient } from \"@capxul/sdk\";\n\n/**\n * Narrow the bootstrap-nullable client to a ready client inside a query /\n * mutation function (sdk-provider-owned-bootstrap.md). Data hooks gate their\n * queries on `enabled: client !== null`, so this only ever throws for a mutation\n * triggered while `<CapxulProvider>` is still bootstrapping.\n */\nexport function requireBootstrappedClient(\n client: CapxulClient | null,\n method: string,\n): CapxulClient {\n if (client === null) {\n throw Errors.wrongState({ method, currentState: \"bootstrapping\", validStates: [\"ready\"] });\n }\n return client;\n}\n","// Typed query-key catalog (epic #258 · TanStack reactive surface).\n//\n// Auth-boundary mutations (`verifyOtp`, `signOut`) invalidate all three\n// keys on success. `signIn` does not — OTP sent leaves session null.\n\nimport type { AccountId, OrgId } from \"@capxul/types\";\n\nexport const capxulKeys = {\n session: [\"capxul\", \"session\"] as const,\n profile: [\"capxul\", \"profile\"] as const,\n account: [\"capxul\", \"account\"] as const,\n accountBalance: [\"capxul\", \"accountBalance\"] as const,\n subAccounts: (accountId: AccountId | undefined) =>\n [\"capxul\", \"subAccounts\", accountId ?? \"pending\"] as const,\n // Organization domain (canon §C3, D13 — entity-scoped, keyed by OrgId).\n orgs: [\"capxul\", \"orgs\"] as const,\n org: (orgId: OrgId | undefined) => [\"capxul\", \"org\", orgId ?? \"pending\"] as const,\n orgMembers: (orgId: OrgId | undefined) =>\n [\"capxul\", \"org\", orgId ?? \"pending\", \"members\"] as const,\n orgRoles: (orgId: OrgId | undefined) => [\"capxul\", \"org\", orgId ?? \"pending\", \"roles\"] as const,\n orgTreasury: (orgId: OrgId | undefined) =>\n [\"capxul\", \"org\", orgId ?? \"pending\", \"treasury\"] as const,\n} satisfies Record<string, readonly unknown[] | ((...args: never[]) => readonly unknown[])>;\n","import type { CapxulResult } from \"@capxul/sdk\";\n\n/** Unwrap a `CapxulResult` for TanStack query/mutation functions — throws into error paths. */\nexport function unwrapCapxulResult<T>(result: CapxulResult<T>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { Session } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulSessionReturn = UseQueryResult<Session | null, CapxulError>;\n\nexport function useCapxulSession(): UseCapxulSessionReturn {\n const client = useCapxulClientOrNull();\n return useQuery({\n queryKey: capxulKeys.session,\n queryFn: async () =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"auth.getSession\").auth.getSession(),\n ),\n enabled: client !== null,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { Profile } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulProfileReturn = UseQueryResult<Profile | null, CapxulError>;\n\nexport function useCapxulProfile(): UseCapxulProfileReturn {\n const client = useCapxulClientOrNull();\n return useQuery({\n queryKey: capxulKeys.profile,\n queryFn: async () =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"identity.loadCurrent\").identity.loadCurrent(),\n ),\n enabled: client !== null,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { AccountStatus } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulAccountReturn = UseQueryResult<AccountStatus, CapxulError>;\n\nexport function useCapxulAccount(): UseCapxulAccountReturn {\n const client = useCapxulClientOrNull();\n return useQuery({\n queryKey: capxulKeys.account,\n queryFn: async () =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"account.getStatus\").account.getStatus(),\n ),\n enabled: client !== null,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { Account } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulAccountBalanceReturn = UseQueryResult<Account, CapxulError>;\n\nexport type UseCapxulAccountBalanceOptions = {\n /** When false, skips the Convex readBalance action until the account ladder is ready. */\n readonly enabled?: boolean;\n};\n\nexport function useCapxulAccountBalance(\n options?: UseCapxulAccountBalanceOptions,\n): UseCapxulAccountBalanceReturn {\n const client = useCapxulClientOrNull();\n return useQuery({\n queryKey: capxulKeys.accountBalance,\n queryFn: async () =>\n unwrapCapxulResult(await requireBootstrappedClient(client, \"accounts.read\").accounts.read()),\n enabled: client !== null && (options?.enabled ?? true),\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { Money } from \"@capxul/types\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulAccountFundReturn = UseMutationResult<\n { readonly txHash: string },\n CapxulError,\n Money\n>;\n\nexport function useCapxulAccountFund(): UseCapxulAccountFundReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (amount: Money) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"_internal.accounts.fund\")._internal.accounts.fund(\n amount,\n ),\n ),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport interface SignInInput {\n readonly email: string;\n}\n\nexport interface SignInSuccess {\n readonly sessionId: string;\n readonly expiresAt: number;\n}\n\nexport type UseCapxulSignInReturn = UseMutationResult<SignInSuccess, CapxulError, SignInInput>;\n\nexport function useCapxulSignIn(): UseCapxulSignInReturn {\n const client = useCapxulClientOrNull();\n return useMutation({\n mutationFn: async (input: SignInInput) =>\n unwrapCapxulResult(await requireBootstrappedClient(client, \"auth.signIn\").auth.signIn(input)),\n });\n}\n","import type { QueryClient } from \"@tanstack/react-query\";\n\nimport { capxulKeys } from \"./reactivity-keys\";\n\n/** Background refetch after verifyOtp — avoids hard reset cancel errors in UI. */\nexport async function invalidateAuthBoundary(queryClient: QueryClient): Promise<void> {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: capxulKeys.session }),\n queryClient.invalidateQueries({ queryKey: capxulKeys.profile }),\n queryClient.invalidateQueries({ queryKey: capxulKeys.account }),\n queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance }),\n ]);\n}\n\n/** Hard reset after signOut — drop cached authenticated rows immediately. */\nexport async function resetAuthBoundary(queryClient: QueryClient): Promise<void> {\n await queryClient.cancelQueries({ queryKey: capxulKeys.accountBalance });\n await Promise.all([\n queryClient.resetQueries({ queryKey: capxulKeys.session }),\n queryClient.resetQueries({ queryKey: capxulKeys.profile }),\n queryClient.resetQueries({ queryKey: capxulKeys.account }),\n queryClient.resetQueries({ queryKey: capxulKeys.accountBalance }),\n ]);\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { Session } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { invalidateAuthBoundary } from \"../internal/invalidate-auth-boundary\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport interface VerifyOtpInput {\n readonly email: string;\n readonly code: string;\n}\n\nexport type UseCapxulVerifyOtpReturn = UseMutationResult<Session, CapxulError, VerifyOtpInput>;\n\nexport function useCapxulVerifyOtp(): UseCapxulVerifyOtpReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: VerifyOtpInput) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"auth.verifyOtp\").auth.verifyOtp(input),\n ),\n onSuccess: () => invalidateAuthBoundary(queryClient),\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { resetAuthBoundary } from \"../internal/invalidate-auth-boundary\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulSignOutReturn = UseMutationResult<void, CapxulError, void>;\n\nexport function useCapxulSignOut(): UseCapxulSignOutReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n onMutate: async () => {\n await queryClient.cancelQueries({ queryKey: capxulKeys.accountBalance });\n },\n mutationFn: async () =>\n unwrapCapxulResult(await requireBootstrappedClient(client, \"auth.signOut\").auth.signOut()),\n onSuccess: () => resetAuthBoundary(queryClient),\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { AccountStatus } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { invalidateAuthBoundary } from \"../internal/invalidate-auth-boundary\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulEnsureReadyReturn = UseMutationResult<AccountStatus, CapxulError, void>;\n\nexport function useCapxulEnsureReady(): UseCapxulEnsureReadyReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async () =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"account.ensureReady\").account.ensureReady(),\n ),\n onSuccess: () => invalidateAuthBoundary(queryClient),\n });\n}\n","\"use client\";\n\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationResult,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { AccountId, SubAccount, SubAccountId } from \"@capxul/types\";\nimport type { TransferInput, TransferResult } from \"@capxul/sdk\";\n\nimport { useCapxulClientOrNull } from \"../internal/capxul-client-context\";\nimport { requireBootstrappedClient } from \"../internal/require-bootstrapped-client\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulSubAccountsListOptions = {\n readonly enabled?: boolean;\n};\n\nexport type UseCapxulSubAccountsListReturn = UseQueryResult<readonly SubAccount[], CapxulError>;\n\nexport function useCapxulSubAccountsList(\n accountId: AccountId | undefined,\n options?: UseCapxulSubAccountsListOptions,\n): UseCapxulSubAccountsListReturn {\n const client = useCapxulClientOrNull();\n return useQuery({\n queryKey: capxulKeys.subAccounts(accountId),\n queryFn: async () => {\n if (accountId === undefined) {\n throw Errors.invalidInput(\"accountId\", \"required for subAccounts.list\");\n }\n return unwrapCapxulResult(\n await requireBootstrappedClient(client, \"subAccounts.list\").subAccounts.list(accountId),\n );\n },\n enabled: client !== null && (options?.enabled ?? true) && accountId !== undefined,\n });\n}\n\nexport type UseCapxulSubAccountCreateReturn = UseMutationResult<\n SubAccount,\n CapxulError,\n { readonly accountId: AccountId; readonly name: string }\n>;\n\nexport function useCapxulSubAccountCreate(): UseCapxulSubAccountCreateReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"subAccounts.create\").subAccounts.create(\n input.accountId,\n { name: input.name },\n ),\n ),\n onSuccess: async (_value, variables) => {\n await queryClient.invalidateQueries({\n queryKey: capxulKeys.subAccounts(variables.accountId),\n });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });\n },\n });\n}\n\nexport type UseCapxulSubAccountRenameReturn = UseMutationResult<\n SubAccount,\n CapxulError,\n { readonly accountId: AccountId; readonly subAccountId: SubAccountId; readonly name: string }\n>;\n\nexport function useCapxulSubAccountRename(): UseCapxulSubAccountRenameReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"subAccounts.rename\").subAccounts.rename(\n input.subAccountId,\n input.name,\n ),\n ),\n onSuccess: async (_value, variables) => {\n await queryClient.invalidateQueries({\n queryKey: capxulKeys.subAccounts(variables.accountId),\n });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });\n },\n });\n}\n\nexport type UseCapxulSubAccountDeleteReturn = UseMutationResult<\n void,\n CapxulError,\n { readonly accountId: AccountId; readonly subAccountId: SubAccountId }\n>;\n\nexport function useCapxulSubAccountDelete(): UseCapxulSubAccountDeleteReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"subAccounts.delete\").subAccounts.delete(\n input.subAccountId,\n ),\n ),\n onSuccess: async (_value, variables) => {\n await queryClient.invalidateQueries({\n queryKey: capxulKeys.subAccounts(variables.accountId),\n });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });\n },\n });\n}\n\n/**\n * Move money between two of the SAME Account's balances (canon §5/§12). The\n * consumer-facing labels are \"Add money\" (main → sub) and \"Move money out\"\n * (sub → main), both calling `transfer`. `accountId` is carried only to\n * invalidate the right cache keys; the SDK input itself is `{ from, to, amount }`.\n */\nexport type UseCapxulTransferReturn = UseMutationResult<\n TransferResult,\n CapxulError,\n { readonly accountId: AccountId } & TransferInput\n>;\n\nexport function useCapxulTransfer(): UseCapxulTransferReturn {\n const client = useCapxulClientOrNull();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async ({ from, to, amount }) =>\n unwrapCapxulResult(\n await requireBootstrappedClient(client, \"subAccounts.transfer\").subAccounts.transfer({\n from,\n to,\n amount,\n }),\n ),\n onSuccess: async (_value, variables) => {\n await queryClient.invalidateQueries({\n queryKey: capxulKeys.subAccounts(variables.accountId),\n });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.accountBalance });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { OrgView } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * List the Orgs you belong to (canon §C1 \"Org list\" / §C3). Binds directly to\n * the locked `capxul.orgs()` SDK method.\n */\nexport type UseCapxulOrgsReturn = UseQueryResult<readonly OrgView[], CapxulError>;\n\nexport type UseCapxulOrgsOptions = {\n /**\n * Gate the query on auth readiness. `client.orgs()` is a session-scoped\n * authenticated read; firing it before the session token settles surfaces a\n * spurious `NOT_AUTHENTICATED`. Consumers pass `enabled: <auth-ready>` (e.g.\n * \"the Organization surface is active\") — mirrors `useCapxulSubAccountsList`.\n * Defaults to `true` to preserve the bare `useCapxulOrgs()` call shape.\n */\n readonly enabled?: boolean;\n};\n\nexport function useCapxulOrgs(options?: UseCapxulOrgsOptions): UseCapxulOrgsReturn {\n const client = useCapxulClient();\n return useQuery({\n queryKey: capxulKeys.orgs,\n queryFn: async () => unwrapCapxulResult(await client.orgs()),\n enabled: options?.enabled ?? true,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { OrgId, OrgView } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulOrgOptions = {\n readonly enabled?: boolean;\n};\n\n/**\n * A single Org you belong to, resolved from `capxul.orgs()` and narrowed to the\n * requested `orgId` (canon §C3). Returns `null` when the Org is not in your list.\n * Gated by `orgId !== undefined`. RED until S1.\n */\nexport type UseCapxulOrgReturn = UseQueryResult<OrgView | null, CapxulError>;\n\nexport function useCapxulOrg(\n orgId: OrgId | undefined,\n options?: UseCapxulOrgOptions,\n): UseCapxulOrgReturn {\n const client = useCapxulClient();\n return useQuery({\n queryKey: capxulKeys.org(orgId),\n queryFn: async () => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulOrg\");\n }\n const orgs = unwrapCapxulResult(await client.orgs());\n return orgs.find((org) => org.id === orgId) ?? null;\n },\n enabled: (options?.enabled ?? true) && orgId !== undefined,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { MemberView, OrgId } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulOrgMembersOptions = {\n readonly enabled?: boolean;\n};\n\n/**\n * The members of an Org (canon §C1 \"Members\" / §C3, D8/D9). Binds directly to\n * the entity-scoped `capxul.org(orgId).members()` (D13). Gated by\n * `orgId !== undefined`. RED until S3.\n */\nexport type UseCapxulOrgMembersReturn = UseQueryResult<readonly MemberView[], CapxulError>;\n\nexport function useCapxulOrgMembers(\n orgId: OrgId | undefined,\n options?: UseCapxulOrgMembersOptions,\n): UseCapxulOrgMembersReturn {\n const client = useCapxulClient();\n return useQuery({\n queryKey: capxulKeys.orgMembers(orgId),\n queryFn: async () => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulOrgMembers\");\n }\n return unwrapCapxulResult(await client.org(orgId).members());\n },\n enabled: (options?.enabled ?? true) && orgId !== undefined,\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { OrgId, RoleView } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulOrgRolesOptions = {\n readonly enabled?: boolean;\n};\n\n/**\n * The roles seeded on an Org (canon §C1 \"Roles\" / §C3, D4/D6). Binds directly\n * to the entity-scoped `capxul.org(orgId).roles()` (D13). Gated by\n * `orgId !== undefined`. RED until S2.\n */\nexport type UseCapxulOrgRolesReturn = UseQueryResult<readonly RoleView[], CapxulError>;\n\nexport function useCapxulOrgRoles(\n orgId: OrgId | undefined,\n options?: UseCapxulOrgRolesOptions,\n): UseCapxulOrgRolesReturn {\n const client = useCapxulClient();\n return useQuery({\n queryKey: capxulKeys.orgRoles(orgId),\n queryFn: async () => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulOrgRoles\");\n }\n return unwrapCapxulResult(await client.org(orgId).roles());\n },\n enabled: (options?.enabled ?? true) && orgId !== undefined,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { OrgId, RoleView } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulOrgDeployRolesReturn = UseMutationResult<\n readonly RoleView[],\n CapxulError,\n OrgId\n>;\n\nexport function useCapxulOrgDeployRoles(): UseCapxulOrgDeployRolesReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (orgId: OrgId) => {\n return unwrapCapxulResult(await client.org(orgId).deployRoles());\n },\n onSuccess: async (_roles, orgId) => {\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgRoles(orgId) });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.org(orgId) });\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgs });\n },\n });\n}\n","\"use client\";\n\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { OrgId } from \"@capxul/sdk\";\nimport type { Account } from \"@capxul/types\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\nexport type UseCapxulOrgTreasuryOptions = {\n readonly enabled?: boolean;\n};\n\n/**\n * The Org treasury — the real M2 `Account` over the Org Safe (canon §C3, D3).\n * NEVER `AccountStatus` (the deploy-readiness ladder, no balance). Binds\n * directly to the entity-scoped `capxul.org(orgId).treasury()` (D13). Gated by\n * `orgId !== undefined`. RED until S1.\n */\nexport type UseCapxulOrgTreasuryReturn = UseQueryResult<Account, CapxulError>;\n\nexport function useCapxulOrgTreasury(\n orgId: OrgId | undefined,\n options?: UseCapxulOrgTreasuryOptions,\n): UseCapxulOrgTreasuryReturn {\n const client = useCapxulClient();\n return useQuery({\n queryKey: capxulKeys.orgTreasury(orgId),\n queryFn: async () => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulOrgTreasury\");\n }\n return unwrapCapxulResult(await client.org(orgId).treasury());\n },\n enabled: (options?.enabled ?? true) && orgId !== undefined,\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport type { CapxulError } from \"@capxul/config\";\nimport type { CreateOrgInput, OrgView } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * Create an Org (canon §C2 J1 / §C3, S1). Binds directly to the locked\n * `capxul.createOrg(input)` SDK method. On success, invalidates the org list.\n * RED until S1 — `mutate` rejects with `Errors.notImplemented(\"org\",\"createOrg\")`.\n */\nexport type UseCapxulCreateOrgReturn = UseMutationResult<OrgView, CapxulError, CreateOrgInput>;\n\nexport function useCapxulCreateOrg(): UseCapxulCreateOrgReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: CreateOrgInput) => unwrapCapxulResult(await client.createOrg(input)),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgs });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { InviteMemberInput, MemberView, OrgId } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * Invite a member to an Org by email (canon §C2 J2 virality loop / §C3, S3, D8).\n * Entity-scoped via the closed-over `orgId` (D13). Binds directly to\n * `capxul.org(orgId).invite(input)`. On success, invalidates the member list.\n * RED until S3 — `mutate` rejects with `Errors.notImplemented(\"org\",\"invite\")`.\n */\nexport type UseCapxulInviteMemberReturn = UseMutationResult<\n MemberView,\n CapxulError,\n InviteMemberInput\n>;\n\nexport function useCapxulInviteMember(orgId: OrgId | undefined): UseCapxulInviteMemberReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: InviteMemberInput) => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulInviteMember\");\n }\n return unwrapCapxulResult(await client.org(orgId).invite(input));\n },\n onSuccess: async () => {\n if (orgId === undefined) return;\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { OrgId, RemoveMemberInput } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * Remove a member from an Org (canon §C2 J2 / §C3, S3, D7/D8) — drives the\n * on-chain REVOKE + Convex mirror. Keyed on the member's personal Safe address\n * (D7). Entity-scoped via the closed-over `orgId` (D13). Binds directly to\n * `capxul.org(orgId).removeMember(input)`. On success, invalidates the member\n * list. RED until S3 — `mutate` rejects with\n * `Errors.notImplemented(\"org\",\"removeMember\")`.\n */\nexport type UseCapxulRemoveMemberReturn = UseMutationResult<void, CapxulError, RemoveMemberInput>;\n\nexport function useCapxulRemoveMember(orgId: OrgId | undefined): UseCapxulRemoveMemberReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: RemoveMemberInput) => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulRemoveMember\");\n }\n return unwrapCapxulResult(await client.org(orgId).removeMember(input));\n },\n onSuccess: async () => {\n if (orgId === undefined) return;\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { AssignRoleInput, MemberView, OrgId } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * Assign a role to a member (canon §C2 J2 / §C3, S3, D7/D9) — drives the\n * on-chain GRANT + Convex mirror. Keyed on the member's personal Safe address\n * (D7); the `role` label maps deterministically to the on-chain `roleKey` (D9).\n * Entity-scoped via the closed-over `orgId` (D13). Binds directly to\n * `capxul.org(orgId).assignRole(input)`. On success, invalidates the member\n * list. RED until S3 — `mutate` rejects with\n * `Errors.notImplemented(\"org\",\"assignRole\")`.\n */\nexport type UseCapxulAssignRoleReturn = UseMutationResult<MemberView, CapxulError, AssignRoleInput>;\n\nexport function useCapxulAssignRole(orgId: OrgId | undefined): UseCapxulAssignRoleReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: AssignRoleInput) => {\n if (orgId === undefined) {\n throw Errors.invalidInput(\"orgId\", \"required for useCapxulAssignRole\");\n }\n return unwrapCapxulResult(await client.org(orgId).assignRole(input));\n },\n onSuccess: async () => {\n if (orgId === undefined) return;\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgMembers(orgId) });\n },\n });\n}\n","\"use client\";\n\nimport { useMutation, useQueryClient, type UseMutationResult } from \"@tanstack/react-query\";\n\nimport { Errors, type CapxulError } from \"@capxul/config\";\nimport type { OrgId, OrgSpendInput, OrgSpendResult } from \"@capxul/sdk\";\n\nimport { useCapxulClient } from \"../internal/capxul-client-context\";\nimport { capxulKeys } from \"../internal/reactivity-keys\";\nimport { unwrapCapxulResult } from \"../internal/unwrap-capxul-result\";\n\n/**\n * Spend from an Org's scoped sub-account (canon §C2 J3+J4 capstone / §C3, S4,\n * D5) — two-level gated (Level 1 Zodiac cap + Level 2 envelope scope/balance)\n * one-UserOp spend via CapxulPayments. Entity-scoped via the closed-over\n * `orgId` (D13). Binds directly to `capxul.org(orgId).spend(input)`. On success,\n * invalidates the treasury (balance moved). RED until S4 — `mutate` rejects with\n * `Errors.notImplemented(\"org\",\"spend\")`.\n */\nexport type UseCapxulOrgSpendReturn = UseMutationResult<OrgSpendResult, CapxulError, OrgSpendInput>;\n\nexport function useCapxulOrgSpend(orgId: OrgId | undefined): UseCapxulOrgSpendReturn {\n const client = useCapxulClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (input: OrgSpendInput) => {\n if (orgId === undefined) throw Errors.invalidInput(\"orgId\", \"org is not selected\");\n return unwrapCapxulResult(await client.org(orgId).spend(input));\n },\n onSuccess: async () => {\n if (orgId === undefined) return;\n await queryClient.invalidateQueries({ queryKey: capxulKeys.orgTreasury(orgId) });\n },\n });\n}\n"],"mappings":"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"}
|