@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.
- package/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/components.d.ts +86 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +216 -0
- package/dist/components.js.map +1 -0
- package/dist/connect.d.ts +31 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +203 -0
- package/dist/connect.js.map +1 -0
- package/dist/context.d.ts +34 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +47 -0
- package/dist/context.js.map +1 -0
- package/dist/hooks-entry.d.ts +4 -0
- package/dist/hooks-entry.d.ts.map +1 -0
- package/dist/hooks-entry.js +4 -0
- package/dist/hooks-entry.js.map +1 -0
- package/dist/hooks.d.ts +253 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +317 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
package/dist/connect.js
ADDED
|
@@ -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":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAsC,MAAM,OAAO,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;;;GAQG;AAEH,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAEvB,MAAM,CAAC,GAAG;IACR,MAAM,EAAE;QACN,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;QACf,YAAY,EAAE,GAAG;QACjB,MAAM,EAAE,uBAAuB;QAC/B,UAAU,EAAE,CAAC,CAAC,MAAM;QACpB,KAAK,EAAE,CAAC,CAAC,SAAS;QAClB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,CAAC,CAAC,IAAI;KACF;IAClB,IAAI,EAAE;QACJ,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,GAAG;QACjB,MAAM,EAAE,aAAa,CAAC,CAAC,KAAK,EAAE;QAC9B,UAAU,EAAE,CAAC,CAAC,OAAO;QACrB,KAAK,EAAE,CAAC,CAAC,GAAG;QACZ,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,CAAC,CAAC,IAAI;KACF;IAClB,QAAQ,EAAE;QACR,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,8CAA8C;QAC1D,cAAc,EAAE,WAAW;QAC3B,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;QACxB,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,IAAI;KACI;IAClB,KAAK,EAAE;QACL,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE,CAAC,CAAC,OAAO;QACrB,KAAK,EAAE,CAAC,CAAC,GAAG;QACZ,MAAM,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE;QAC7B,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,yDAAyD;QACpE,UAAU,EAAE,CAAC,CAAC,IAAI;KACF;IAClB,IAAI,EAAE;QACJ,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,kBAAkB;QACvB,UAAU,EAAE,CAAC,CAAC,OAAO;QACrB,KAAK,EAAE,CAAC,CAAC,GAAG;QACZ,MAAM,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE;QAC7B,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,yDAAyD;QACpE,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,IAAI;KACF;IAClB,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,CAAC,CAAC,IAAI;KACF;IAClB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAmB;IACxE,KAAK,EAAE;QACL,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,CAAC;QACT,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,CAAC,CAAC,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,CAAC;KACG;CACnB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC;IACxD,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AA6BD,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,GAAG,SAAS,EACjB,MAAM,GAAG,IAAI,EACb,WAAW,EACX,cAAc,EACd,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,OAAO,GAAG,IAAI,EACd,SAAS,GACS;IAClB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAQ,SAAS,CAAC,CAAC;IACrD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAW,QAAQ,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IAC/E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,cAAc,IAAI,gBAAgB,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,CAAU,EAAE,EAAE;QACb,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACvB,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IACF,MAAM,IAAI,GAAG,cAAc,IAAI,gBAAgB,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE;QAC9B,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACvB,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,oDAAoD;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACpC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACtB,IAAI,MAAM;oBAAE,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAsB,MAAM,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3E,IAAI,SAAS;gBAAE,OAAO;YACtB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACtF,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO;gBAAE,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxF,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAe,EAAE,EAAE;QACzC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,QAAQ,CAAC,cAAc,CAAC,CAAC;QACzB,cAAc,EAAE,EAAE,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,eAAe,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CACL,iBAAQ,SAAS,EAAE,iBAAiB,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,6BAE1F,CACV,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,OAAO,CACL,eAAK,SAAS,EAAE,iBAAiB,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,aACzG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,CACpD,iBAAQ,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,YAC/G,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GACvB,CACV,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAC1B,iBAAQ,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,0BAEjF,CACV,CAAC,CAAC,CAAC,CACF,iBACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EACf,OAAO,EAAE,GAAG,EAAE;oBACZ,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,YAQA,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,GACjD,CACV,EAEA,IAAI,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAC/B,eAAK,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,aAClF,OAAO,CAAC,CAAC,CAAC,CACT,8BACE,eAAK,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,uBACtC,OAAO,CAAC,KAAK,cAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,IACvE,EACN,iBAAQ,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,YACnG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GACtE,IACR,CACJ,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,CAAC,CAAC,CAAC,CACf,8BACE,eAAK,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,+BAAY,aAAa,CAAC,OAAO,IAAO,EACvF,iBAAQ,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,YACzG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,YAAY,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAC3E,IACR,CACJ,CAAC,CAAC,CAAC,IAAI,EACR,iBAAQ,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,yBAEjG,IACL,CACP,CAAC,CAAC,CAAC,IAAI,EAEP,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,wBAAwB,EAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,YACvE,eACE,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,IAAI,EAAC,QAAQ,gBACF,MAAM,gBACL,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,EACnH,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,aAEnC,iBAAQ,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,gBAAa,OAAO,uBAEjF,EAER,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,CAC3B,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,aACtC,KAAC,IAAI,IACH,KAAK,EAAC,eAAe,EACrB,GAAG,EAAC,8FAA8F,GAClG,EACF,KAAC,YAAY,IAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAI,IAC/C,CACP,CAAC,CAAC,CAAC,CACF,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,aACtC,KAAC,IAAI,IACH,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,qBAAqB,EACjE,GAAG,EACD,IAAI,KAAK,QAAQ;wCACf,CAAC,CAAC,sDAAsD;wCACxD,CAAC,CAAC,qFAAqF,GAE3F,EACF,KAAC,cAAc,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAI,EACjD,KAAC,MAAM,IAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAI,IAChG,CACP,IACG,GACF,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAkC;IAC1D,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,aACvD,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,YAAG,KAAK,GAAM,EAC9G,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,YAAG,GAAG,GAAK,IAC1C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|
package/dist/context.js
ADDED
|
@@ -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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -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":"AACA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,KAAK,GAAG,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AA2BrC,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAI7D,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5H;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI;;;;;yBAmB5C,OAAO,GAAG,OAAO,eAAe,MAAM;;;;;;;uBAOxC,MAAM;6BAKA,QAAQ,GAAG,WAAW;;;;;;;;;;IAO/C,8FAA8F;+BACnE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;;UAhD7D,MAAM;;;;;;yBA4BO,OAAO,GAAG,OAAO,eAAe,MAAM;;;;;;;uBAOxC,MAAM;6BAKA,QAAQ,GAAG,WAAW;;;;;;;;;;IAO/C,8FAA8F;+BACnE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;;UA/C7D,WAAW;eAAa,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;cAAY,OAAO,GAAG,OAAO;iBAAe,MAAM;;;;;;yBA2BrG,OAAO,GAAG,OAAO,eAAe,MAAM;;;;;;;uBAOxC,MAAM;6BAKA,QAAQ,GAAG,WAAW;;;;;;;;;;IAO/C,8FAA8F;+BACnE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;;UA9C7D,UAAU;eAAa,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,CAAC;;;;;;yBA0BhE,OAAO,GAAG,OAAO,eAAe,MAAM;;;;;;;uBAOxC,MAAM;6BAKA,QAAQ,GAAG,WAAW;;;;;;;;;;IAO/C,8FAA8F;+BACnE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;;UA7C7D,MAAM;aAAW,WAAW;EAyDvC;AAED,iGAAiG;AACjG,wBAAgB,eAAe;;;;;oBASX,MAAM;EAOzB;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS;;IAyBrB,yEAAyE;;;;;EAM5E;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,IAAI,GAAE,WAAgB;;;;;gBAUnC,aAAa,UAAU,MAAM;EAW5C;AAED,2CAA2C;AAC3C,wBAAgB,aAAa;;;;EAe5B;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM;;;;;;IAoBtC,qEAAqE;;IAOrE,8DAA8D;;;;EAqBjE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc;;;;;;mBAoBX,YAAY,UAAU,MAAM;;;;qBAM1B,cAAc,UAAU,MAAM;;;;iBAMlC,MAAM,UAAU,MAAM;EAOtC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM;;;;;;mBAoBlC,kBAAkB;;;;qBAMhB,cAAc;;;;iBAMlB,MAAM;kBAML,MAAM,UAAU,YAAY;EAO7C"}
|