@theoo/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,203 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { AuthModeSwitch, PasskeyEnrol, SignIn, styles, useEscape } from "./components.js";
4
+ import { useTheoo, useSession } from "./context.js";
5
+ /*
6
+ * The "connect wallet" button. One component that takes a visitor from
7
+ * nothing to a passkey-owned account: sign in, create a passkey, and then
8
+ * show the address with a menu. Everything it does goes through the same
9
+ * hooks and components an app could compose itself.
10
+ *
11
+ * Colour comes from the token chain documented in `components.tsx`, so the
12
+ * dialog follows a host's dark mode without being told about it.
13
+ */
14
+ const t = styles.token;
15
+ const s = {
16
+ button: {
17
+ padding: "9px 16px",
18
+ fontSize: 14,
19
+ fontWeight: 550,
20
+ borderRadius: 999,
21
+ border: "1px solid transparent",
22
+ background: t.accent,
23
+ color: t.accentInk,
24
+ cursor: "pointer",
25
+ fontFamily: t.sans,
26
+ },
27
+ chip: {
28
+ padding: "7px 13px",
29
+ fontSize: 13,
30
+ borderRadius: 999,
31
+ border: `1px solid ${t.line2}`,
32
+ background: t.surface,
33
+ color: t.ink,
34
+ cursor: "pointer",
35
+ fontFamily: t.mono,
36
+ },
37
+ backdrop: {
38
+ position: "fixed",
39
+ inset: 0,
40
+ background: "var(--theoo-backdrop, rgba(10, 12, 16, 0.5))",
41
+ backdropFilter: "blur(3px)",
42
+ display: "flex",
43
+ alignItems: "center",
44
+ justifyContent: "center",
45
+ padding: 16,
46
+ zIndex: 1000,
47
+ },
48
+ modal: {
49
+ position: "relative",
50
+ background: t.surface,
51
+ color: t.ink,
52
+ border: `1px solid ${t.line}`,
53
+ borderRadius: 16,
54
+ padding: 22,
55
+ width: "100%",
56
+ maxWidth: 380,
57
+ maxHeight: "calc(100dvh - 32px)",
58
+ overflowY: "auto",
59
+ boxShadow: "var(--theoo-shadow, 0 18px 50px rgba(10, 12, 16, 0.22))",
60
+ fontFamily: t.sans,
61
+ },
62
+ menu: {
63
+ position: "absolute",
64
+ right: 0,
65
+ top: "calc(100% + 6px)",
66
+ background: t.surface,
67
+ color: t.ink,
68
+ border: `1px solid ${t.line}`,
69
+ borderRadius: 12,
70
+ padding: 6,
71
+ minWidth: 260,
72
+ boxShadow: "var(--theoo-shadow, 0 12px 32px rgba(10, 12, 16, 0.16))",
73
+ zIndex: 1000,
74
+ fontFamily: t.sans,
75
+ },
76
+ item: {
77
+ display: "block",
78
+ width: "100%",
79
+ textAlign: "left",
80
+ padding: "8px 10px",
81
+ border: 0,
82
+ background: "transparent",
83
+ color: "inherit",
84
+ cursor: "pointer",
85
+ borderRadius: 8,
86
+ fontSize: 13.5,
87
+ fontFamily: t.sans,
88
+ },
89
+ muted: { color: t.ink2, fontSize: 13, lineHeight: 1.5 },
90
+ close: {
91
+ position: "absolute",
92
+ top: 12,
93
+ right: 12,
94
+ width: 28,
95
+ height: 28,
96
+ display: "grid",
97
+ placeItems: "center",
98
+ border: 0,
99
+ borderRadius: 8,
100
+ background: "transparent",
101
+ color: t.ink3,
102
+ cursor: "pointer",
103
+ fontSize: 16,
104
+ lineHeight: 1,
105
+ },
106
+ };
107
+ export function shortAddress(a, head = 6, tail = 4) {
108
+ return a.length > head + tail + 2 ? `${a.slice(0, head)}…${a.slice(-tail)}` : a;
109
+ }
110
+ /** A connect-wallet button for passkey-owned accounts. */
111
+ export function TheooConnect({ providers, label = "Connect", solana = true, onConnected, onDisconnected, open: controlledOpen, onOpenChange, mode: controlledMode, onModeChange, trigger = true, className, }) {
112
+ const theoo = useTheoo();
113
+ const session = useSession();
114
+ const [stage, setStage] = useState("loading");
115
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
116
+ const [uncontrolledMode, setUncontrolledMode] = useState("signup");
117
+ const [menu, setMenu] = useState(false);
118
+ const [solanaAccount, setSolanaAccount] = useState(null);
119
+ const [copied, setCopied] = useState(null);
120
+ const open = controlledOpen ?? uncontrolledOpen;
121
+ const setOpen = useCallback((v) => {
122
+ setUncontrolledOpen(v);
123
+ onOpenChange?.(v);
124
+ }, [onOpenChange]);
125
+ const mode = controlledMode ?? uncontrolledMode;
126
+ const setMode = (m) => {
127
+ setUncontrolledMode(m);
128
+ onModeChange?.(m);
129
+ };
130
+ // Where the session is decides where the button is.
131
+ useEffect(() => {
132
+ if (session.status === "loading")
133
+ return;
134
+ if (session.status === "signed_out") {
135
+ setStage((st) => (st === "signing_in" ? st : "disconnected"));
136
+ return;
137
+ }
138
+ let cancelled = false;
139
+ (async () => {
140
+ if (session.account) {
141
+ setStage("connected");
142
+ if (solana)
143
+ setSolanaAccount(await theoo.me.solana.account().catch(() => null));
144
+ return;
145
+ }
146
+ const ids = await theoo.me.identities().catch(() => []);
147
+ if (cancelled)
148
+ return;
149
+ setStage(ids.some((i) => i.provider === "passkey") ? "connected" : "needs_passkey");
150
+ })();
151
+ return () => {
152
+ cancelled = true;
153
+ };
154
+ }, [session.status, session.status === "signed_in" ? session.account?.address : null, theoo, solana]);
155
+ useEffect(() => {
156
+ if (stage === "connected") {
157
+ setOpen(false);
158
+ if (session.status === "signed_in" && session.account)
159
+ onConnected?.(session.account);
160
+ }
161
+ // eslint-disable-next-line react-hooks/exhaustive-deps
162
+ }, [stage]);
163
+ const signedIn = async (_o) => {
164
+ await session.reload();
165
+ };
166
+ const enrolled = async () => {
167
+ await session.reload();
168
+ };
169
+ const signOut = async () => {
170
+ setMenu(false);
171
+ await session.signOut();
172
+ setSolanaAccount(null);
173
+ setStage("disconnected");
174
+ onDisconnected?.();
175
+ };
176
+ const copy = async (text, what) => {
177
+ try {
178
+ await navigator.clipboard.writeText(text);
179
+ setCopied(what);
180
+ setTimeout(() => setCopied(null), 1200);
181
+ }
182
+ catch {
183
+ /* clipboard unavailable */
184
+ }
185
+ };
186
+ const showModal = open && (stage === "disconnected" || stage === "signing_in" || stage === "needs_passkey");
187
+ const close = useCallback(() => setOpen(false), [setOpen]);
188
+ useEscape(showModal, close);
189
+ if (stage === "loading") {
190
+ return (_jsx("button", { className: `theoo-connect ${className ?? ""}`, style: { ...s.chip, opacity: 0.6 }, disabled: true, children: "\u2026" }));
191
+ }
192
+ const account = session.status === "signed_in" ? session.account : null;
193
+ return (_jsxs("div", { className: `theoo-connect ${className ?? ""}`, style: { position: "relative", display: "inline-block" }, children: [!trigger ? null : stage === "connected" && account ? (_jsx("button", { className: "theoo-connect-account", style: s.chip, onClick: () => setMenu((m) => !m), title: account.address, children: shortAddress(account.address) })) : stage === "connected" ? (_jsx("button", { className: "theoo-connect-account", style: s.chip, onClick: () => setMenu((m) => !m), children: "Signed in" })) : (_jsx("button", { className: "theoo-connect-button", style: s.button, onClick: () => {
194
+ setStage((st) => (st === "disconnected" ? "signing_in" : st));
195
+ setOpen(true);
196
+ }, children: stage === "needs_passkey" ? "Finish connecting" : label })), menu && stage === "connected" ? (_jsxs("div", { className: "theoo-connect-menu", style: s.menu, onMouseLeave: () => setMenu(false), children: [account ? (_jsxs(_Fragment, { children: [_jsxs("div", { style: { ...s.muted, padding: "6px 10px" }, children: ["Chain ", account.chain, " \u00B7 ", account.deployed ? "deployed" : "not deployed yet"] }), _jsx("button", { className: "theoo-connect-item", style: s.item, onClick: () => void copy(account.address, "evm"), children: copied === "evm" ? "Copied" : `Copy ${shortAddress(account.address, 10, 6)}` })] })) : null, solanaAccount ? (_jsxs(_Fragment, { children: [_jsxs("div", { style: { ...s.muted, padding: "6px 10px" }, children: ["Solana \u00B7 ", solanaAccount.cluster] }), _jsx("button", { className: "theoo-connect-item", style: s.item, onClick: () => void copy(solanaAccount.address, "sol"), children: copied === "sol" ? "Copied" : `Copy ${shortAddress(solanaAccount.address, 8, 6)}` })] })) : null, _jsx("button", { className: "theoo-connect-item", style: { ...s.item, color: t.alert }, onClick: () => void signOut(), children: "Sign out" })] })) : null, showModal ? (_jsx("div", { className: "theoo-connect-backdrop", style: s.backdrop, onClick: close, children: _jsxs("div", { className: "theoo-connect-modal", style: s.modal, role: "dialog", "aria-modal": "true", "aria-label": stage === "needs_passkey" ? "Finish connecting" : mode === "signin" ? "Sign in" : "Create your account", onClick: (e) => e.stopPropagation(), children: [_jsx("button", { className: "theoo-connect-close", style: s.close, onClick: close, "aria-label": "Close", children: "\u2715" }), stage === "needs_passkey" ? (_jsxs("div", { style: { display: "grid", gap: 12 }, children: [_jsx(Head, { title: "One more step", sub: "Your account on chain is owned by a passkey on this device. Create one to finish connecting." }), _jsx(PasskeyEnrol, { onEnrolled: () => void enrolled() })] })) : (_jsxs("div", { style: { display: "grid", gap: 14 }, children: [_jsx(Head, { title: mode === "signin" ? "Welcome back" : "Create your account", sub: mode === "signin"
197
+ ? "Use the passkey on this device, or have a code sent."
198
+ : "No password, no seed phrase. A key on this device, and nothing on anybody's server." }), _jsx(AuthModeSwitch, { mode: mode, onChange: setMode }), _jsx(SignIn, { providers: providers, mode: mode, modeSwitch: false, onSignedIn: (o) => void signedIn(o) })] }))] }) })) : null] }));
199
+ }
200
+ function Head({ title, sub }) {
201
+ return (_jsxs("div", { style: { display: "grid", gap: 5, paddingRight: 28 }, children: [_jsx("h3", { style: { margin: 0, fontSize: 18, fontWeight: 600, letterSpacing: "-0.015em", color: t.ink }, children: title }), _jsx("p", { style: { margin: 0, ...s.muted }, children: sub })] }));
202
+ }
203
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ReactNode } from "react";
2
+ import type { Theoo, Me, SmartAccount } from "@theoo/sdk";
3
+ export type SessionState = {
4
+ status: "loading";
5
+ } | {
6
+ status: "signed_out";
7
+ } | {
8
+ status: "signed_in";
9
+ me: Me;
10
+ account: SmartAccount | null;
11
+ };
12
+ export interface SessionHandle {
13
+ state: SessionState;
14
+ /** Re-read the session from the server: after a sign-in, an enrolment, a refresh. */
15
+ reload: () => Promise<void>;
16
+ signOut: () => Promise<void>;
17
+ }
18
+ export interface TheooProviderProps {
19
+ client: Theoo;
20
+ children?: ReactNode;
21
+ }
22
+ /**
23
+ * Makes one `Theoo` client and one shared session available to every hook
24
+ * and component below it. The session is held here, not per hook, so a
25
+ * sign-in in one component is seen by all of them.
26
+ */
27
+ export declare function TheooProvider({ client, children }: TheooProviderProps): import("react").JSX.Element;
28
+ export declare function useTheoo(): Theoo;
29
+ /** The signed-in user, if any, shared by everything under the provider. */
30
+ export declare function useSession(): SessionState & {
31
+ reload: () => Promise<void>;
32
+ signOut: () => Promise<void>;
33
+ };
34
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7G,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,qFAAqF;IACrF,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AASD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAyBrE;AAQD,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAGzG"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
3
+ const Context = createContext(null);
4
+ /**
5
+ * Makes one `Theoo` client and one shared session available to every hook
6
+ * and component below it. The session is held here, not per hook, so a
7
+ * sign-in in one component is seen by all of them.
8
+ */
9
+ export function TheooProvider({ client, children }) {
10
+ const [state, setState] = useState({ status: "loading" });
11
+ const reload = useCallback(async () => {
12
+ const tokens = await client.auth.session();
13
+ if (!tokens)
14
+ return setState({ status: "signed_out" });
15
+ try {
16
+ const [me, account] = await Promise.all([client.me.get(), client.me.account().catch(() => null)]);
17
+ setState({ status: "signed_in", me, account });
18
+ }
19
+ catch {
20
+ setState({ status: "signed_out" });
21
+ }
22
+ }, [client]);
23
+ useEffect(() => {
24
+ void reload();
25
+ }, [reload]);
26
+ const signOut = useCallback(async () => {
27
+ await client.auth.signOut();
28
+ setState({ status: "signed_out" });
29
+ }, [client]);
30
+ const value = useMemo(() => ({ client, session: { state, reload, signOut } }), [client, state, reload, signOut]);
31
+ return _jsx(Context.Provider, { value: value, children: children });
32
+ }
33
+ function ctx() {
34
+ const c = useContext(Context);
35
+ if (!c)
36
+ throw new Error("useTheoo must be used inside <TheooProvider>.");
37
+ return c;
38
+ }
39
+ export function useTheoo() {
40
+ return ctx().client;
41
+ }
42
+ /** The signed-in user, if any, shared by everything under the provider. */
43
+ export function useSession() {
44
+ const { session } = ctx();
45
+ return { ...session.state, reload: session.reload, signOut: session.signOut };
46
+ }
47
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAoB7G,MAAM,OAAO,GAAG,aAAa,CAAa,IAAI,CAAC,CAAC;AAOhD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAsB;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAExE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClG,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,OAAO,CAAM,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtH,OAAO,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAoB,CAAC;AACvE,CAAC;AAED,SAAS,GAAG;IACV,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Hooks and the provider only: nothing that assumes a DOM. What `@theoo/react-native` builds on. */
2
+ export { TheooProvider, useTheoo, useSession, type TheooProviderProps, type SessionState } from "./context.js";
3
+ export { useChains, useEnrolPasskey, useOperation, useOperations, useRecovery, useSessionKeys, useSignIn, useSolanaSessionKeys, type SignInStep, } from "./hooks.js";
4
+ //# sourceMappingURL=hooks-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-entry.d.ts","sourceRoot":"","sources":["../src/hooks-entry.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/G,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,EACpB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Hooks and the provider only: nothing that assumes a DOM. What `@theoo/react-native` builds on. */
2
+ export { TheooProvider, useTheoo, useSession } from "./context.js";
3
+ export { useChains, useEnrolPasskey, useOperation, useOperations, useRecovery, useSessionKeys, useSignIn, useSolanaSessionKeys, } from "./hooks.js";
4
+ //# sourceMappingURL=hooks-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-entry.js","sourceRoot":"","sources":["../src/hooks-entry.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC;AAC/G,OAAO,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,GAErB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,253 @@
1
+ import type { AuthChallenge, AuthOutcome, ChainOption, TheooError, OperationKind, OperationStatus, RecoveryStatus, SessionGrant, SessionKey, SessionRenewal, SolanaAction, SolanaSessionGrant, SolanaSessionKey, WaitOptions } from "@theoo/sdk";
2
+ type Err = TheooError | Error | null;
3
+ export { useSession, type SessionState } from "./context.js";
4
+ export type SignInStep = {
5
+ step: "idle";
6
+ } | {
7
+ step: "code_sent";
8
+ challenge: Extract<AuthChallenge, {
9
+ kind: "code";
10
+ }>;
11
+ provider: "email" | "phone";
12
+ destination: string;
13
+ } | {
14
+ step: "redirect";
15
+ challenge: Extract<AuthChallenge, {
16
+ kind: "redirect" | "popup";
17
+ }>;
18
+ } | {
19
+ step: "done";
20
+ outcome: AuthOutcome;
21
+ };
22
+ /**
23
+ * The sign-in state machine: send a code and submit it, hand off to Google or
24
+ * KingsChat, or use a passkey. `onSignedIn` fires once with the outcome.
25
+ */
26
+ export declare function useSignIn(onSignedIn?: (outcome: AuthOutcome) => void): {
27
+ busy: boolean;
28
+ error: Err;
29
+ clearError: () => void;
30
+ reset: () => void;
31
+ sendCode: (provider: "email" | "phone", destination: string) => Promise<{
32
+ kind: "code";
33
+ challengeId: string;
34
+ destinationMasked: string;
35
+ expiresAt: number;
36
+ devCode?: string | null;
37
+ } | undefined>;
38
+ submitCode: (code: string) => Promise<AuthOutcome | undefined>;
39
+ withProvider: (provider: "google" | "kingschat") => Promise<{
40
+ kind: "redirect";
41
+ state: string;
42
+ url: string;
43
+ } | {
44
+ kind: "popup";
45
+ state: string;
46
+ url: string;
47
+ expectsPostMessage: boolean;
48
+ } | undefined>;
49
+ /** After the provider sent the user back: the `code` (or token) and the `state` it echoed. */
50
+ completeProvider: (result: {
51
+ code: string;
52
+ } | {
53
+ accessToken: string;
54
+ }) => Promise<AuthOutcome | undefined>;
55
+ withPasskey: () => Promise<AuthOutcome | undefined>;
56
+ step: "idle";
57
+ } | {
58
+ busy: boolean;
59
+ error: Err;
60
+ clearError: () => void;
61
+ reset: () => void;
62
+ sendCode: (provider: "email" | "phone", destination: string) => Promise<{
63
+ kind: "code";
64
+ challengeId: string;
65
+ destinationMasked: string;
66
+ expiresAt: number;
67
+ devCode?: string | null;
68
+ } | undefined>;
69
+ submitCode: (code: string) => Promise<AuthOutcome | undefined>;
70
+ withProvider: (provider: "google" | "kingschat") => Promise<{
71
+ kind: "redirect";
72
+ state: string;
73
+ url: string;
74
+ } | {
75
+ kind: "popup";
76
+ state: string;
77
+ url: string;
78
+ expectsPostMessage: boolean;
79
+ } | undefined>;
80
+ /** After the provider sent the user back: the `code` (or token) and the `state` it echoed. */
81
+ completeProvider: (result: {
82
+ code: string;
83
+ } | {
84
+ accessToken: string;
85
+ }) => Promise<AuthOutcome | undefined>;
86
+ withPasskey: () => Promise<AuthOutcome | undefined>;
87
+ step: "code_sent";
88
+ challenge: Extract<AuthChallenge, {
89
+ kind: "code";
90
+ }>;
91
+ provider: "email" | "phone";
92
+ destination: string;
93
+ } | {
94
+ busy: boolean;
95
+ error: Err;
96
+ clearError: () => void;
97
+ reset: () => void;
98
+ sendCode: (provider: "email" | "phone", destination: string) => Promise<{
99
+ kind: "code";
100
+ challengeId: string;
101
+ destinationMasked: string;
102
+ expiresAt: number;
103
+ devCode?: string | null;
104
+ } | undefined>;
105
+ submitCode: (code: string) => Promise<AuthOutcome | undefined>;
106
+ withProvider: (provider: "google" | "kingschat") => Promise<{
107
+ kind: "redirect";
108
+ state: string;
109
+ url: string;
110
+ } | {
111
+ kind: "popup";
112
+ state: string;
113
+ url: string;
114
+ expectsPostMessage: boolean;
115
+ } | undefined>;
116
+ /** After the provider sent the user back: the `code` (or token) and the `state` it echoed. */
117
+ completeProvider: (result: {
118
+ code: string;
119
+ } | {
120
+ accessToken: string;
121
+ }) => Promise<AuthOutcome | undefined>;
122
+ withPasskey: () => Promise<AuthOutcome | undefined>;
123
+ step: "redirect";
124
+ challenge: Extract<AuthChallenge, {
125
+ kind: "redirect" | "popup";
126
+ }>;
127
+ } | {
128
+ busy: boolean;
129
+ error: Err;
130
+ clearError: () => void;
131
+ reset: () => void;
132
+ sendCode: (provider: "email" | "phone", destination: string) => Promise<{
133
+ kind: "code";
134
+ challengeId: string;
135
+ destinationMasked: string;
136
+ expiresAt: number;
137
+ devCode?: string | null;
138
+ } | undefined>;
139
+ submitCode: (code: string) => Promise<AuthOutcome | undefined>;
140
+ withProvider: (provider: "google" | "kingschat") => Promise<{
141
+ kind: "redirect";
142
+ state: string;
143
+ url: string;
144
+ } | {
145
+ kind: "popup";
146
+ state: string;
147
+ url: string;
148
+ expectsPostMessage: boolean;
149
+ } | undefined>;
150
+ /** After the provider sent the user back: the `code` (or token) and the `state` it echoed. */
151
+ completeProvider: (result: {
152
+ code: string;
153
+ } | {
154
+ accessToken: string;
155
+ }) => Promise<AuthOutcome | undefined>;
156
+ withPasskey: () => Promise<AuthOutcome | undefined>;
157
+ step: "done";
158
+ outcome: AuthOutcome;
159
+ };
160
+ /** Enrol a passkey on the signed-in user. The first one becomes the account's owner on chain. */
161
+ export declare function useEnrolPasskey(): {
162
+ busy: boolean;
163
+ error: Err;
164
+ clearError: () => void;
165
+ outcome: AuthOutcome | null;
166
+ enrol: (label?: string) => Promise<AuthOutcome | undefined>;
167
+ };
168
+ /**
169
+ * The chains this tenant offers, and which one the app is pointed at.
170
+ *
171
+ * The choice is this hook's, not the server's: Theoo has a default and
172
+ * every call takes an override. Pass `chain` from here to `useOperation`,
173
+ * `useSessionKeys` and the rest.
174
+ *
175
+ * Worth telling users: **an account has a different address on each chain**,
176
+ * unless the factory was deployed at the same address on both. Switching is
177
+ * not moving funds between chains.
178
+ */
179
+ export declare function useChains(): {
180
+ chains: ChainOption[] | null;
181
+ /** `undefined` until loaded, which every call reads as "the default". */
182
+ chain: number | undefined;
183
+ select: import("react").Dispatch<import("react").SetStateAction<number | undefined>>;
184
+ current: ChainOption | null;
185
+ error: Err;
186
+ };
187
+ /** Run an operation: prepare, sign with the passkey, submit, follow it to inclusion. */
188
+ export declare function useOperation(wait?: WaitOptions): {
189
+ busy: boolean;
190
+ error: Err;
191
+ clearError: () => void;
192
+ status: OperationStatus | null;
193
+ run: (kind: OperationKind, chain?: number) => Promise<OperationStatus | undefined>;
194
+ };
195
+ /** The user's operations, newest first. */
196
+ export declare function useOperations(): {
197
+ operations: OperationStatus[] | null;
198
+ error: Err;
199
+ reload: () => Promise<void>;
200
+ };
201
+ /** Guardian recovery: whether it is on, and the three things a user can do about it. */
202
+ export declare function useRecovery(chain?: number): {
203
+ status: RecoveryStatus | null;
204
+ busy: boolean;
205
+ error: Err;
206
+ clearError: () => void;
207
+ reload: () => Promise<void>;
208
+ /** Appoint Theoo's platform guardian: a passkey-signed operation. */
209
+ enable: () => Promise<OperationStatus | undefined>;
210
+ /** Move the account to the newest passkey. Steps up first. */
211
+ begin: () => Promise<RecoveryStatus | undefined>;
212
+ complete: () => Promise<RecoveryStatus | undefined>;
213
+ cancel: () => Promise<OperationStatus | undefined>;
214
+ };
215
+ /** The user's session keys, and granting or revoking one with the passkey. */
216
+ export declare function useSessionKeys(): {
217
+ keys: SessionKey[] | null;
218
+ busy: boolean;
219
+ error: Err;
220
+ clearError: () => void;
221
+ reload: () => Promise<void>;
222
+ grant: (grant: SessionGrant, chain?: number) => Promise<{
223
+ session: SessionKey;
224
+ operation: OperationStatus;
225
+ } | undefined>;
226
+ renew: (renewal: SessionRenewal, chain?: number) => Promise<{
227
+ session: SessionKey;
228
+ operation: OperationStatus;
229
+ } | undefined>;
230
+ revoke: (id: string, chain?: number) => Promise<OperationStatus | undefined>;
231
+ };
232
+ /**
233
+ * The same, on Solana. `execute` is not a ceremony here: the key signs the
234
+ * transaction itself, so the call returns the finished operation.
235
+ */
236
+ export declare function useSolanaSessionKeys(cluster?: string): {
237
+ keys: SolanaSessionKey[] | null;
238
+ busy: boolean;
239
+ error: Err;
240
+ clearError: () => void;
241
+ reload: () => Promise<void>;
242
+ grant: (grant: SolanaSessionGrant) => Promise<{
243
+ session: SolanaSessionKey;
244
+ operation: import("@theoo/sdk").SolanaOperationStatus;
245
+ } | undefined>;
246
+ renew: (renewal: SessionRenewal) => Promise<{
247
+ session: SolanaSessionKey;
248
+ operation: import("@theoo/sdk").SolanaOperationStatus;
249
+ } | undefined>;
250
+ revoke: (id: string) => Promise<import("@theoo/sdk").SolanaOperationStatus | undefined>;
251
+ execute: (id: string, action: SolanaAction) => Promise<import("@theoo/sdk").SolanaOperationStatus | undefined>;
252
+ };
253
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}