@atlasauth/react 0.14.0 → 0.16.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/AtlasProvider.d.ts +1 -0
  3. package/dist/AtlasProvider.js +34 -5
  4. package/dist/AtlasProvider.js.map +1 -1
  5. package/dist/account.d.ts +12 -1
  6. package/dist/account.js +6 -9
  7. package/dist/account.js.map +1 -1
  8. package/dist/active-atlas.d.ts +29 -0
  9. package/dist/active-atlas.js +40 -0
  10. package/dist/active-atlas.js.map +1 -0
  11. package/dist/billing.d.ts +30 -1
  12. package/dist/billing.js +86 -14
  13. package/dist/billing.js.map +1 -1
  14. package/dist/captcha.js +1 -1
  15. package/dist/captcha.js.map +1 -1
  16. package/dist/compat.d.ts +307 -0
  17. package/dist/compat.js +387 -0
  18. package/dist/compat.js.map +1 -0
  19. package/dist/components.d.ts +5 -1
  20. package/dist/components.js +16 -1
  21. package/dist/components.js.map +1 -1
  22. package/dist/device-authorization.d.ts +42 -0
  23. package/dist/device-authorization.js +137 -0
  24. package/dist/device-authorization.js.map +1 -0
  25. package/dist/flow.d.ts +22 -1
  26. package/dist/flow.js +8 -1
  27. package/dist/flow.js.map +1 -1
  28. package/dist/i18n.js +15 -0
  29. package/dist/i18n.js.map +1 -1
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/policies.d.ts +114 -0
  33. package/dist/policies.js +324 -0
  34. package/dist/policies.js.map +1 -0
  35. package/dist/sign-in.js +9 -2
  36. package/dist/sign-in.js.map +1 -1
  37. package/dist/sign-up.d.ts +3 -0
  38. package/dist/sign-up.js +36 -7
  39. package/dist/sign-up.js.map +1 -1
  40. package/dist/styles.d.ts +1 -28
  41. package/dist/styles.js +3 -1
  42. package/dist/styles.js.map +1 -1
  43. package/dist/types.d.ts +33 -0
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +1 -1
  46. package/package.json +15 -4
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.usePolicyText = usePolicyText;
5
+ exports.usePolicyState = usePolicyState;
6
+ exports.usePolicies = usePolicies;
7
+ exports.PolicyViewer = PolicyViewer;
8
+ exports.PolicyConsent = PolicyConsent;
9
+ exports.PolicyClickwrap = PolicyClickwrap;
10
+ exports.PolicyModal = PolicyModal;
11
+ exports.PolicyScrollQueue = PolicyScrollQueue;
12
+ exports.PolicyAcceptStep = PolicyAcceptStep;
13
+ exports.PolicyGate = PolicyGate;
14
+ const jsx_runtime_1 = require("react/jsx-runtime");
15
+ const react_1 = require("react");
16
+ const js_1 = require("@atlasauth/js");
17
+ const AtlasProvider_1 = require("./AtlasProvider");
18
+ const components_shared_1 = require("./components-shared");
19
+ /**
20
+ * Policy acceptance (terms of service, privacy, any policy) — the React half.
21
+ *
22
+ * `<SignUp/>` and `<SignIn/>` use these themselves; they are exported for
23
+ * custom forms and for in-app re-acceptance:
24
+ * - {@link usePolicies}: load the instance's policies into a controller;
25
+ * - {@link PolicyConsent} / {@link PolicyClickwrap}: the checkbox block (with
26
+ * an in-page document viewer) and the clickwrap sentence;
27
+ * - {@link PolicyModal}: the unskippable scroll-to-accept dialog;
28
+ * - {@link PolicyGate}: a signed-in banner for policies that need
29
+ * re-acceptance, opening the modal / checkboxes on demand.
30
+ */
31
+ /** A translator over the catalog that falls back to the English policy strings. */
32
+ function usePolicyText() {
33
+ const t = (0, components_shared_1.useText)();
34
+ return (0, react_1.useMemo)(() => (0, js_1.policyTranslator)((key, vars) => t(key, vars)), [t]);
35
+ }
36
+ /** Subscribe a component to a controller's state. */
37
+ function usePolicyState(controller) {
38
+ const cache = (0, react_1.useRef)(null);
39
+ const get = (0, react_1.useCallback)(() => {
40
+ const snap = controller.snapshot();
41
+ const key = `${snap.viewing}|${snap.combinedChecked}|${snap.policies.map((p) => `${p.key}:${p.versionId}:${controller.isChecked(p.key)}`).join(',')}`;
42
+ if (cache.current?.key === key)
43
+ return cache.current.snap;
44
+ cache.current = { key, snap };
45
+ return snap;
46
+ }, [controller]);
47
+ return (0, react_1.useSyncExternalStore)((cb) => controller.subscribe(cb), get, get);
48
+ }
49
+ /**
50
+ * Load the instance's policies (`GET /v1/client/policies`) into a controller.
51
+ * Resolves to an empty list when the instance defines none — render nothing.
52
+ */
53
+ function usePolicies(options = {}, clientOverride) {
54
+ const own = (0, components_shared_1.useFapiClient)();
55
+ const client = clientOverride ?? own;
56
+ const { locale } = (0, AtlasProvider_1.useAtlas)();
57
+ const enabled = options.enabled !== false;
58
+ const controller = (0, react_1.useMemo)(() => new js_1.PolicyAcceptanceController([], { combined: options.combined }), [options.combined]);
59
+ const [loading, setLoading] = (0, react_1.useState)(enabled);
60
+ const refresh = (0, react_1.useCallback)(async () => {
61
+ const list = await (0, js_1.loadPolicies)(client, { locale: locale ?? undefined, signIn: options.signIn });
62
+ controller.setPolicies(list);
63
+ setLoading(false);
64
+ }, [client, controller, locale, options.signIn]);
65
+ (0, react_1.useEffect)(() => {
66
+ if (!enabled)
67
+ return;
68
+ let alive = true;
69
+ void (0, js_1.loadPolicies)(client, { locale: locale ?? undefined, signIn: options.signIn }).then((list) => {
70
+ if (!alive)
71
+ return;
72
+ controller.setPolicies(list);
73
+ setLoading(false);
74
+ });
75
+ return () => {
76
+ alive = false;
77
+ };
78
+ }, [client, controller, enabled, locale, options.signIn]);
79
+ const state = usePolicyState(controller);
80
+ return { controller, policies: state.policies, loading, refresh, build: () => controller.build() };
81
+ }
82
+ function PolicyContent({ policy, onEnd }) {
83
+ const bodyRef = (0, react_1.useRef)(null);
84
+ const sentinelRef = (0, react_1.useRef)(null);
85
+ const html = (0, react_1.useMemo)(() => (0, js_1.sanitizePolicyHtml)((0, js_1.policyHtml)(policy)), [policy]);
86
+ const cls = (0, components_shared_1.useClass)('text', 'atlas-policy-body');
87
+ (0, react_1.useEffect)(() => {
88
+ if (!onEnd || !bodyRef.current)
89
+ return;
90
+ return (0, js_1.observeScrollEnd)(bodyRef.current, sentinelRef.current, onEnd);
91
+ }, [html, onEnd]);
92
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: bodyRef, className: cls, tabIndex: 0, role: "region", "aria-label": policy.title, "data-atlas-policy-content": "", children: [(0, jsx_runtime_1.jsx)("div", { dangerouslySetInnerHTML: { __html: html } }), (0, jsx_runtime_1.jsx)("span", { ref: sentinelRef, className: "atlas-policy-sentinel", "aria-hidden": "true", "data-atlas-policy-end": "" })] }));
93
+ }
94
+ /** The in-page document viewer: the exact version the user is agreeing to. */
95
+ function PolicyViewer({ policy, controller }) {
96
+ const t = usePolicyText();
97
+ const cls = (0, components_shared_1.useClasses)();
98
+ const onEnd = (0, react_1.useCallback)(() => controller.markScrolledToEnd(policy.key), [controller, policy.key]);
99
+ const meta = [
100
+ policy.version ? t('policy.version', { version: policy.version }) : '',
101
+ policy.effectiveAt ? t('policy.effective', { date: (0, js_1.formatPolicyDate)(policy.effectiveAt) }) : '',
102
+ ]
103
+ .filter(Boolean)
104
+ .join(' · ');
105
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-viewer", role: "region", "aria-label": policy.title, "data-atlas-policy-viewer": policy.key, children: [(0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-viewer-head", children: [(0, jsx_runtime_1.jsx)("strong", { children: policy.title }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-policy-link'), "data-atlas-policy-back": "", onClick: () => controller.closeDocument(), children: t('policy.viewerBack') })] }), meta ? (0, jsx_runtime_1.jsx)("p", { className: "atlas-policy-meta", children: meta }) : null, (0, jsx_runtime_1.jsx)(PolicyContent, { policy: policy, onEnd: onEnd })] }));
106
+ }
107
+ function PolicyLink({ policy, controller }) {
108
+ const cls = (0, components_shared_1.useClasses)();
109
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-policy-link'), "data-atlas-policy-open": policy.key, "aria-haspopup": "dialog", onClick: () => controller.openDocument(policy.key), children: policy.title }));
110
+ }
111
+ function Sentence({ template, name, nodes, and }) {
112
+ const [before, after] = (0, js_1.splitTemplate)(template, name);
113
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [before, nodes.map((node, i) => ((0, jsx_runtime_1.jsxs)("span", { children: [i > 0 ? (i === nodes.length - 1 ? ` ${and} ` : ', ') : null, node] }, i))), after] }));
114
+ }
115
+ /**
116
+ * The checkbox-mode policies: one combined checkbox ("I agree to the Terms of
117
+ * Service and Privacy Policy") or one each, the names opening the in-page
118
+ * viewer. While a document is open it replaces the checkboxes.
119
+ */
120
+ function PolicyConsent({ controller, errors = [] }) {
121
+ const t = usePolicyText();
122
+ const cls = (0, components_shared_1.useClasses)();
123
+ const state = usePolicyState(controller);
124
+ const id = (0, react_1.useId)();
125
+ const viewing = state.viewing ? state.policies.find((p) => p.key === state.viewing) : null;
126
+ if (viewing)
127
+ return (0, jsx_runtime_1.jsx)(PolicyViewer, { policy: viewing, controller: controller });
128
+ const boxes = state.policies.filter((p) => p.display === 'checkbox');
129
+ if (boxes.length === 0)
130
+ return null;
131
+ const and = t('policy.and');
132
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-consent", "data-atlas-policies": "", children: [controller.combined ? ((0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-row atlas-consent", children: [(0, jsx_runtime_1.jsx)("input", { id: `${id}-all`, type: "checkbox", name: "policies", "data-atlas-policy-all": "", checked: state.combinedChecked, onChange: (e) => controller.setAllChecked(e.target.checked) }), (0, jsx_runtime_1.jsx)("label", { htmlFor: `${id}-all`, className: cls('text', 'atlas-text'), children: (0, jsx_runtime_1.jsx)(Sentence, { template: t('policy.agreeCombined'), name: "policies", and: and, nodes: boxes.map((p) => (0, jsx_runtime_1.jsx)(PolicyLink, { policy: p, controller: controller }, p.key)) }) })] })) : (boxes.map((p) => {
133
+ const [before, after] = (0, js_1.splitTemplate)(t('policy.agreeOne'), 'policy');
134
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-row atlas-consent", children: [(0, jsx_runtime_1.jsx)("input", { id: `${id}-${p.key}`, type: "checkbox", name: `policy_${p.key}`, "data-atlas-policy-box": p.key, checked: controller.isChecked(p.key), onChange: (e) => controller.setChecked(p.key, e.target.checked) }), (0, jsx_runtime_1.jsxs)("label", { htmlFor: `${id}-${p.key}`, className: cls('text', 'atlas-text'), children: [before, (0, jsx_runtime_1.jsx)(PolicyLink, { policy: p, controller: controller }), after] })] }, p.key));
135
+ })), errors
136
+ .filter((e) => e.param === 'policy_acceptances' || e.param === 'consent')
137
+ .map((e) => ((0, jsx_runtime_1.jsx)("span", { className: cls('formFieldError', 'atlas-error'), children: e.message }, e.code)))] }));
138
+ }
139
+ /** The clickwrap sentence under the submit button for `link`-mode policies. */
140
+ function PolicyClickwrap({ controller }) {
141
+ const t = usePolicyText();
142
+ const cls = (0, components_shared_1.useClasses)();
143
+ const state = usePolicyState(controller);
144
+ const links = state.policies.filter((p) => p.display === 'link');
145
+ if (links.length === 0)
146
+ return null;
147
+ return ((0, jsx_runtime_1.jsx)("p", { className: cls('text', 'atlas-policy-clickwrap'), "data-atlas-policy-clickwrap": "", children: (0, jsx_runtime_1.jsx)(Sentence, { template: t('policy.clickwrap'), name: "policies", and: t('policy.and'), nodes: links.map((p) => (0, jsx_runtime_1.jsx)(PolicyLink, { policy: p, controller: controller }, p.key)) }) }));
148
+ }
149
+ /**
150
+ * The unskippable scroll-mode dialog: `role="dialog" aria-modal="true"`, focus
151
+ * trapped, no close button, Escape disabled. Accept enables only once the end of
152
+ * the text has been seen (an IntersectionObserver on an end sentinel) or the
153
+ * text fits; Decline calls `onDecline`.
154
+ */
155
+ function PolicyModal({ policy, reaccept = false, controller, onAccept, onDecline }) {
156
+ const t = usePolicyText();
157
+ const cls = (0, components_shared_1.useClasses)();
158
+ const uid = (0, react_1.useId)();
159
+ const modalRef = (0, react_1.useRef)(null);
160
+ const bodyRef = (0, react_1.useRef)(null);
161
+ const [ready, setReady] = (0, react_1.useState)(false);
162
+ const html = (0, react_1.useMemo)(() => (0, js_1.sanitizePolicyHtml)((0, js_1.policyHtml)(policy)), [policy]);
163
+ const sentinelRef = (0, react_1.useRef)(null);
164
+ (0, react_1.useEffect)(() => {
165
+ setReady(false);
166
+ const body = bodyRef.current;
167
+ if (!body)
168
+ return;
169
+ return (0, js_1.observeScrollEnd)(body, sentinelRef.current, () => {
170
+ setReady(true);
171
+ controller?.markScrolledToEnd(policy.key);
172
+ });
173
+ }, [html, controller, policy.key]);
174
+ (0, react_1.useEffect)(() => {
175
+ const modal = modalRef.current;
176
+ if (!modal)
177
+ return;
178
+ controller?.startClock(policy.key);
179
+ const release = (0, js_1.trapFocus)(modal, { initialFocus: bodyRef.current });
180
+ return () => {
181
+ release();
182
+ controller?.stopClock(policy.key);
183
+ };
184
+ }, [controller, policy.key]);
185
+ const titleId = `${uid}-title`;
186
+ const hintId = `${uid}-hint`;
187
+ return ((0, jsx_runtime_1.jsx)("div", { className: "atlas-policy-overlay", "data-atlas-policy-modal": policy.key, children: (0, jsx_runtime_1.jsxs)("div", { ref: modalRef, className: "atlas-policy-modal", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": hintId, tabIndex: -1, children: [(0, jsx_runtime_1.jsx)("h2", { id: titleId, children: reaccept && policy.reaccept !== false ? t('policy.reacceptTitle', { policy: policy.title }) : policy.title }), reaccept && policy.reaccept !== false && policy.summaryOfChanges ? ((0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-summary", "data-atlas-policy-summary": "", children: [(0, jsx_runtime_1.jsx)("strong", { children: t('policy.summaryTitle') }), (0, jsx_runtime_1.jsx)("span", { children: policy.summaryOfChanges })] })) : null, (0, jsx_runtime_1.jsxs)("div", { ref: bodyRef, className: "atlas-policy-body", tabIndex: 0, role: "region", "aria-label": policy.title, "data-atlas-policy-content": "", children: [(0, jsx_runtime_1.jsx)("div", { dangerouslySetInnerHTML: { __html: html } }), (0, jsx_runtime_1.jsx)("span", { ref: sentinelRef, className: "atlas-policy-sentinel", "aria-hidden": "true", "data-atlas-policy-end": "" })] }), (0, jsx_runtime_1.jsx)("p", { id: hintId, className: "atlas-policy-hint", "aria-live": "polite", children: ready ? '' : t('policy.scrollHint') }), (0, jsx_runtime_1.jsxs)("div", { className: "atlas-policy-actions", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('formButtonSecondary', ''), "data-atlas-policy-decline": "", onClick: onDecline, children: t('policy.decline') }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('formButtonPrimary', 'atlas-policy-accept'), "data-atlas-policy-accept": "", disabled: !ready, "aria-disabled": !ready, onClick: () => ready && onAccept(), children: t('policy.accept') })] })] }) }));
188
+ }
189
+ /**
190
+ * Walk the controller's unread scroll-mode policies one dialog at a time while
191
+ * `running`. `onDone` fires once when the last one is accepted;
192
+ * `onDecline(policy)` when the user declines one.
193
+ */
194
+ function PolicyScrollQueue({ controller, running, reaccept = false, onDone, onDecline, }) {
195
+ usePolicyState(controller);
196
+ const pending = controller.pendingScroll();
197
+ const policy = running ? pending : null;
198
+ const hadPolicy = (0, react_1.useRef)(false);
199
+ const doneRef = (0, react_1.useRef)(onDone);
200
+ doneRef.current = onDone;
201
+ (0, react_1.useEffect)(() => {
202
+ if (policy)
203
+ hadPolicy.current = true;
204
+ // Done only when the queue emptied because the user accepted the last one — not because it stopped (a decline).
205
+ else if (hadPolicy.current && running && pending === null) {
206
+ hadPolicy.current = false;
207
+ doneRef.current();
208
+ }
209
+ else if (!running)
210
+ hadPolicy.current = false;
211
+ }, [policy, running, pending]);
212
+ if (!policy)
213
+ return null;
214
+ return ((0, jsx_runtime_1.jsx)(PolicyModal, { policy: policy, reaccept: reaccept, controller: controller, onAccept: () => controller.acceptScroll(policy.key), onDecline: () => onDecline(policy) }, policy.versionId));
215
+ }
216
+ /**
217
+ * The sign-in step for a `needs_policy_acceptance` attempt: scroll-mode policies
218
+ * in their dialog, the rest as checkboxes / a clickwrap sentence, then
219
+ * "Accept and continue", which hands the `policy_acceptances` JSON to `onSubmit`.
220
+ */
221
+ function PolicyAcceptStep({ attempt, busy, onSubmit, onDecline, }) {
222
+ const t = usePolicyText();
223
+ const cls = (0, components_shared_1.useClasses)();
224
+ const client = (0, components_shared_1.useFapiClient)();
225
+ const { locale } = (0, AtlasProvider_1.useAtlas)();
226
+ const [controller, setController] = (0, react_1.useState)(null);
227
+ (0, react_1.useEffect)(() => {
228
+ let alive = true;
229
+ void (0, js_1.controllerForPending)(client, attempt, { locale: locale ?? undefined, combined: true }).then((c) => alive && setController(c));
230
+ return () => {
231
+ alive = false;
232
+ };
233
+ }, [client, attempt, locale]);
234
+ if (!controller)
235
+ return (0, jsx_runtime_1.jsx)("p", { className: cls('text', 'atlas-text'), children: t('policy.loading') });
236
+ return (0, jsx_runtime_1.jsx)(PolicyAcceptStepBody, { controller: controller, busy: busy, onSubmit: onSubmit, onDecline: onDecline });
237
+ }
238
+ function PolicyAcceptStepBody({ controller, busy, onSubmit, onDecline, }) {
239
+ const t = usePolicyText();
240
+ const cls = (0, components_shared_1.useClasses)();
241
+ const state = usePolicyState(controller);
242
+ const [declined, setDeclined] = (0, react_1.useState)(false);
243
+ const send = (0, react_1.useCallback)(() => onSubmit({ policy_acceptances: JSON.stringify(controller.build()) }), [controller, onSubmit]);
244
+ const hasOthers = state.policies.some((p) => p.display !== 'scroll');
245
+ return ((0, jsx_runtime_1.jsxs)("div", { "data-atlas-policy-step": "", children: [(0, jsx_runtime_1.jsx)("p", { className: cls('text', 'atlas-text'), children: t('policy.pendingIntro') }), (0, jsx_runtime_1.jsx)(PolicyConsent, { controller: controller }), (0, jsx_runtime_1.jsx)(PolicyClickwrap, { controller: controller }), hasOthers ? ((0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('formButtonPrimary', 'atlas-button'), "data-atlas-policy-continue": "", disabled: busy || !controller.canSubmit() || controller.pendingScroll() !== null, onClick: send, children: t('policy.submit') })) : null, (0, jsx_runtime_1.jsx)(PolicyScrollQueue, { controller: controller, running: !declined, reaccept: true, onDone: () => {
246
+ if (!hasOthers)
247
+ send();
248
+ }, onDecline: (p) => {
249
+ setDeclined(true);
250
+ onDecline?.(p);
251
+ } })] }));
252
+ }
253
+ /**
254
+ * In-app re-acceptance. For a signed-in user it checks
255
+ * `GET /v1/client/me/policies`; when a policy needs re-acceptance it shows a
256
+ * banner (or, with `blocking`, the dialog at once). Accepting posts to
257
+ * `/v1/client/me/policies/accept`. Renders `children` (if any) always.
258
+ */
259
+ function PolicyGate({ onAccepted, blocking = false, children }) {
260
+ const { status } = (0, AtlasProvider_1.useAtlas)();
261
+ const client = (0, components_shared_1.useFapiClient)();
262
+ const t = usePolicyText();
263
+ const cls = (0, components_shared_1.useClasses)();
264
+ const [pending, setPending] = (0, react_1.useState)([]);
265
+ const [controller, setController] = (0, react_1.useState)(null);
266
+ const [open, setOpen] = (0, react_1.useState)(false);
267
+ const [error, setError] = (0, react_1.useState)('');
268
+ const [busy, setBusy] = (0, react_1.useState)(false);
269
+ (0, react_1.useEffect)(() => {
270
+ if (status !== 'signed_in')
271
+ return;
272
+ let alive = true;
273
+ void (0, js_1.loadMyPolicies)(client).then((all) => {
274
+ if (alive)
275
+ setPending(all.filter((p) => p.needsReaccept));
276
+ });
277
+ return () => {
278
+ alive = false;
279
+ };
280
+ }, [client, status]);
281
+ const begin = (0, react_1.useCallback)(async () => {
282
+ const all = await (0, js_1.loadPolicies)(client, {});
283
+ const wanted = new Set(pending.map((p) => p.key));
284
+ const c = new js_1.PolicyAcceptanceController(all.filter((p) => wanted.has(p.key)).map((p) => ({ ...p, required: true })));
285
+ setController(c);
286
+ setOpen(true);
287
+ }, [client, pending]);
288
+ (0, react_1.useEffect)(() => {
289
+ if (blocking && pending.length > 0 && !controller)
290
+ void begin();
291
+ }, [blocking, pending, controller, begin]);
292
+ const submit = (0, react_1.useCallback)(async () => {
293
+ if (!controller)
294
+ return;
295
+ setBusy(true);
296
+ const res = await (0, js_1.acceptMyPolicies)(client, controller.build());
297
+ setBusy(false);
298
+ if (!res.ok) {
299
+ setError(res.errors[0]?.message ?? t('policy.requiredGeneric'));
300
+ return;
301
+ }
302
+ setPending([]);
303
+ setOpen(false);
304
+ setController(null);
305
+ onAccepted?.();
306
+ }, [client, controller, onAccepted, t]);
307
+ const titles = pending.map((p) => p.title);
308
+ const soonest = pending.map((p) => p.graceEndsAt).filter((x) => !!x).sort()[0];
309
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [pending.length > 0 && !open ? ((0, jsx_runtime_1.jsxs)("div", { className: cls('alert', 'atlas-policy-banner'), role: "status", "data-atlas-policy-banner": "", children: [(0, jsx_runtime_1.jsxs)("span", { children: [(0, jsx_runtime_1.jsxs)("strong", { children: [t('policy.bannerTitle'), ". "] }), t('policy.bannerBody', { policies: (0, js_1.joinTitles)(titles, t('policy.and')) }), soonest ? ` ${t('policy.bannerGrace', { date: (0, js_1.formatPolicyDate)(soonest) })}` : ''] }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-policy-link'), onClick: () => void begin(), children: t('policy.bannerReview') })] })) : null, open && controller ? ((0, jsx_runtime_1.jsx)(PolicyGateDialog, { controller: controller, busy: busy, error: error, onSubmit: () => void submit(), onCancel: () => { setOpen(false); setController(null); }, blocking: blocking })) : null, children] }));
310
+ }
311
+ function PolicyGateDialog({ controller, busy, error, onSubmit, onCancel, blocking, }) {
312
+ const t = usePolicyText();
313
+ const cls = (0, components_shared_1.useClasses)();
314
+ const state = usePolicyState(controller);
315
+ const hasOthers = state.policies.some((p) => p.display !== 'scroll');
316
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [hasOthers ? ((0, jsx_runtime_1.jsxs)("div", { className: cls('card', 'atlas-card'), "data-atlas-policy-gate": "", children: [(0, jsx_runtime_1.jsx)(PolicyConsent, { controller: controller }), (0, jsx_runtime_1.jsx)(PolicyClickwrap, { controller: controller }), error ? (0, jsx_runtime_1.jsx)("p", { className: cls('formFieldError', 'atlas-error'), role: "alert", children: error }) : null, (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('formButtonPrimary', 'atlas-button'), disabled: busy || !controller.canSubmit() || controller.pendingScroll() !== null, onClick: onSubmit, children: t('policy.submit') }), blocking ? null : ((0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-link'), onClick: onCancel, children: t('policy.decline') }))] })) : null, (0, jsx_runtime_1.jsx)(PolicyScrollQueue, { controller: controller, running: true, reaccept: true, onDone: () => {
317
+ if (!hasOthers)
318
+ onSubmit();
319
+ }, onDecline: () => {
320
+ if (!blocking)
321
+ onCancel();
322
+ } })] }));
323
+ }
324
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.tsx"],"names":[],"mappings":"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"}
package/dist/sign-in.js CHANGED
@@ -9,16 +9,23 @@ const react_1 = require("react");
9
9
  const js_1 = require("@atlasauth/js");
10
10
  const AtlasProvider_1 = require("./AtlasProvider");
11
11
  const fapi_1 = require("./fapi");
12
+ const policies_1 = require("./policies");
12
13
  const captcha_1 = require("./captcha");
13
14
  const flow_1 = require("./flow");
14
15
  const version_1 = require("./version");
15
16
  function SignIn(props = {}) {
16
- const { state, submit, client, finish, captcha, prepare, usePassword, saveRecoveryCodes } = (0, flow_1.useFlow)({
17
+ const t = (0, policies_1.usePolicyText)();
18
+ const { state, setState, submit, client, finish, captcha, prepare, usePassword, saveRecoveryCodes } = (0, flow_1.useFlow)({
17
19
  afterUrl: props.afterUrl,
18
20
  referral: props.referral,
19
21
  referralConsent: props.referralConsent,
20
22
  });
21
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!state.attempt ? (0, jsx_runtime_1.jsx)(flow_1.LastUsedHint, { client: client }) : null, (0, jsx_runtime_1.jsx)(flow_1.AttemptFlow, { attempt: state.attempt, busy: state.busy, errors: state.errors, sessionKept: state.sessionKept, titleKey: "signIn.title", hideTitle: props.hideTitle, onSubmit: submit, captcha: (0, jsx_runtime_1.jsx)(captcha_1.CaptchaSlot, { controller: captcha }), prepared: state.prepared ?? null, onPrepare: prepare, onUsePassword: usePassword, recoveryCodes: (0, js_1.pendingRecoveryCodes)(state), onRecoveryCodesSaved: saveRecoveryCodes }), state.attempt?.status !== 'complete' ? (0, jsx_runtime_1.jsx)(flow_1.SignUpPrompt, { signUpUrl: props.signUpUrl, afterUrl: props.afterUrl }) : null, !state.attempt ? ((0, jsx_runtime_1.jsx)(flow_1.SocialSignInButtons, { client: client, onComplete: finish, oneTap: props.googleOneTap, oauthMode: props.oauthMode, onProviderUnavailable: props.onProviderUnavailable, googleButton: props.googleButton })) : null] }));
23
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!state.attempt ? (0, jsx_runtime_1.jsx)(flow_1.LastUsedHint, { client: client }) : null, (0, jsx_runtime_1.jsx)(flow_1.AttemptFlow, { attempt: state.attempt, busy: state.busy, errors: state.errors, sessionKept: state.sessionKept, titleKey: "signIn.title", hideTitle: props.hideTitle, onSubmit: submit, captcha: (0, jsx_runtime_1.jsx)(captcha_1.CaptchaSlot, { controller: captcha }), prepared: state.prepared ?? null, onPrepare: prepare, onUsePassword: usePassword, recoveryCodes: (0, js_1.pendingRecoveryCodes)(state), onRecoveryCodesSaved: saveRecoveryCodes, onPolicyDecline: (policy) =>
24
+ // Declining cancels the attempt: back to the first step, saying why.
25
+ setState({
26
+ ...fapi_1.initialFlow,
27
+ errors: [{ code: 'POLICY_DECLINED', message: t('policy.declined', { policy: policy.title }) }],
28
+ }) }), state.attempt?.status !== 'complete' ? (0, jsx_runtime_1.jsx)(flow_1.SignUpPrompt, { signUpUrl: props.signUpUrl, afterUrl: props.afterUrl }) : null, !state.attempt ? ((0, jsx_runtime_1.jsx)(flow_1.SocialSignInButtons, { client: client, onComplete: finish, oneTap: props.googleOneTap, oauthMode: props.oauthMode, onProviderUnavailable: props.onProviderUnavailable, googleButton: props.googleButton })) : null] }));
22
29
  }
23
30
  /**
24
31
  * §6 headless native sign-in, for a consumer that renders its OWN Google button
@@ -1 +1 @@
1
- {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../src/sign-in.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../src/sign-in.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA6Bb,wBAgDC;AAUD,8BAgFC;AAwBD,gDA4FC;;AAzRD,iCAAgG;AAChG,sCAOuB;AACvB,mDAA2C;AAC3C,iCAAiE;AACjE,yCAA2C;AAC3C,uCAAwC;AACxC,iCAWgB;AAChB,uCAA4C;AAE5C,SAAgB,MAAM,CAAC,QAAmB,EAAE;IAC1C,MAAM,CAAC,GAAG,IAAA,wBAAa,GAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,IAAA,cAAO,EAAC;QAC5G,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;KACvC,CAAC,CAAC;IAEH,OAAO,CACL,6DACG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAC,mBAAY,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC,CAAC,IAAI,EACzD,uBAAC,kBAAW,IACV,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAC,cAAc,EACvB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uBAAC,qBAAW,IAAC,UAAU,EAAE,OAAO,GAAI,EAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI,EAChC,SAAS,EAAE,OAAO,EAClB,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,IAAA,yBAAoB,EAAC,KAAK,CAAC,EAC1C,oBAAoB,EAAE,iBAAiB,EACvC,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC1B,qEAAqE;gBACrE,QAAQ,CAAC;oBACP,GAAG,kBAAW;oBACd,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;iBAC/F,CAAC,GAEJ,EAGD,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAC,mBAAY,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,EACpH,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAChB,uBAAC,0BAAmB,IAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,KAAK,CAAC,YAAY,EAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAClD,YAAY,EAAE,KAAK,CAAC,YAAY,GAChC,CACH,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS;IACvB,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,wBAAQ,GAAE,CAAC;IACnE,MAAM,MAAM,GAAG,IAAA,eAAO,EACpB,GAAG,EAAE,CAAC,IAAI,iBAAU,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,yBAAe,EAAE,CAAC,EAC5F,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CACtC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAA,mBAAW,EAC3B,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAA,oBAAe,EAAC,MAAM,EAAE,QAAQ,CAAC,EACvD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,iBAAiB,GAAG,IAAA,mBAAW,EACnC,KAAK,EAAE,KAA4D,EAAsB,EAAE;QACzF,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAY,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC/C,UAAU,EAAG,IAAI,CAAC,OAA2B,CAAC,EAAE;gBAChD,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,CACjB,CAAC;IAEF;;;;;OAKG;IACH,MAAM,UAAU,GAAG,IAAA,mBAAW,EAC5B,KAAK,EAAE,KAON,EAAiB,EAAE;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE9D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAe,EAC/B,MAAM,EACN,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC/D,KAAK,CAAC,QAAQ,CACf,CAAC;YACF,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;oBAC/C,UAAU,EAAE,GAAG,CAAC,SAAS;oBACzB,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,MAAM,MAAM,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,mEAAmE;YACnE,uDAAuD;YACvD,IAAI,GAAG,CAAC,eAAe;gBAAE,MAAM,MAAM,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAA,uBAAkB,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACxF,IAAI,GAAG;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC;IACvD,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,CACjB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,GAAG,WAAW,EAe4C;IAC1D,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9D,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAQ,GAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,IAAI,SAAS,IAAI,UAAU,CAAC;IACtD,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,CAAC;IACvC,iFAAiF;IACjF,iFAAiF;IACjF,+EAA+E;IAC/E,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,gCAAyB,EAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAEhE,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAA,cAAM,EAAkB,IAAI,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,KAAK,EAAE,OAAe,EAAE,KAAa,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,EACD,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAC7B,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,6BAAsB,EAAC,UAAU,EAAE;QAClE,MAAM;QACN,YAAY;QACZ,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,QAAQ,IAAI,OAAO;QAC5B,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACrC,KAAK,UAAU,CAAC;YACd,QAAQ;YACR,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE;SACjD,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,CACb,mCACE,IAAI,EAAC,QAAQ,KACT,WAAW,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACzB,qEAAqE;YACrE,wEAAwE;YACxE,iDAAiD;YACjD,IAAI,CAAC,YAAY;gBAAE,aAAa,EAAE,CAAC;QACrC,CAAC,YAEA,QAAQ,IAAI,iBAAiB,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GACvD,CACV,CAAC;IAEF,+EAA+E;IAC/E,6EAA6E;IAC7E,8EAA8E;IAC9E,gEAAgE;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,iCAAM,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,YAC5E,MAAM,GACF,CACR,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/sign-up.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type PolicyAcceptancePayload } from '@atlasauth/js';
1
2
  import { type FlowState } from './fapi';
2
3
  import { type FlowProps } from './flow';
3
4
  /**
@@ -38,5 +39,7 @@ export declare function useSignUp(): {
38
39
  fields?: Record<string, string>;
39
40
  consent?: boolean;
40
41
  captchaToken?: string;
42
+ /** The instance's policies the user accepted (`usePolicies().build()`). */
43
+ policyAcceptances?: PolicyAcceptancePayload[];
41
44
  }) => Promise<FlowState>;
42
45
  };
package/dist/sign-up.js CHANGED
@@ -11,6 +11,7 @@ const fapi_1 = require("./fapi");
11
11
  const flow_1 = require("./flow");
12
12
  const captcha_1 = require("./captcha");
13
13
  const referral_1 = require("./referral");
14
+ const policies_1 = require("./policies");
14
15
  const components_shared_1 = require("./components-shared");
15
16
  const version_1 = require("./version");
16
17
  /**
@@ -60,6 +61,8 @@ function SignUp(props = {}) {
60
61
  active: !state.attempt && !emailUnavailable && (0, js_1.flowNeedsCaptcha)(signUpFlow),
61
62
  atlasLabels: (0, js_1.atlasCaptchaLabels)(t),
62
63
  });
64
+ // The instance's policies (terms, privacy, …): shown in place of the legacy single consent row.
65
+ const policies = (0, policies_1.usePolicies)({ combined: props.policyConsent !== 'separate' }, client);
63
66
  const create = (0, react_1.useCallback)((values, consent) => {
64
67
  void (async () => {
65
68
  setState((current) => ({ ...current, busy: true, errors: [] }));
@@ -70,12 +73,14 @@ function SignUp(props = {}) {
70
73
  if (value)
71
74
  fields[key] = value;
72
75
  const token = await captcha.getToken();
76
+ const policyAcceptances = policies.controller.build();
73
77
  let next = usingPasskey
74
78
  ? await (0, js_1.startPasskeySignUp)(client, {
75
79
  email: email || undefined,
76
80
  fields,
77
81
  consent,
78
82
  captchaToken: token ?? undefined,
83
+ policyAcceptances,
79
84
  })
80
85
  : await (0, js_1.startSignUp)(client, {
81
86
  email,
@@ -83,7 +88,11 @@ function SignUp(props = {}) {
83
88
  fields,
84
89
  consent,
85
90
  captchaToken: token ?? undefined,
91
+ policyAcceptances,
86
92
  });
93
+ // A policy changed while the form was open: reload them so the form asks again.
94
+ if ((0, js_1.isPolicyAcceptanceRequired)(next.errors))
95
+ await policies.refresh();
87
96
  const localized = (0, captcha_1.localizeCaptchaErrors)(next.errors, t);
88
97
  next = { ...next, errors: localized.errors };
89
98
  // The token was spent either way; a refused create needs a fresh one.
@@ -96,13 +105,16 @@ function SignUp(props = {}) {
96
105
  const createPasskey = (0, react_1.useCallback)(() => {
97
106
  void (async () => {
98
107
  setState((current) => ({ ...current, busy: true, errors: [] }));
99
- const next = await (0, js_1.registerSignUpPasskey)(client, state);
108
+ const next = await (0, js_1.registerSignUpPasskey)(client, state, {
109
+ ...(props.passkeyPrf ? { prf: props.passkeyPrf } : {}),
110
+ ...(props.onPasskeyExtensionResults ? { onExtensionResults: props.onPasskeyExtensionResults } : {}),
111
+ });
100
112
  await finish({
101
113
  ...next,
102
114
  errors: next.errors.map((e) => (e.code === 'PASSKEY_CANCELLED' ? { ...e, message: t('signUp.passkeyCancelled') } : e)),
103
115
  });
104
116
  })();
105
- }, [client, finish, setState, state, t]);
117
+ }, [client, finish, setState, state, t, props.passkeyPrf, props.onPasskeyExtensionResults]);
106
118
  if (state.attempt && (0, js_1.awaitingPasskey)(state.attempt)) {
107
119
  return (0, jsx_runtime_1.jsx)(PasskeySignUpStep, { busy: state.busy, errors: state.errors, hideTitle: props.hideTitle, onCreate: createPasskey });
108
120
  }
@@ -111,7 +123,7 @@ function SignUp(props = {}) {
111
123
  }
112
124
  if (emailUnavailable)
113
125
  return (0, jsx_runtime_1.jsx)(SignUpEmailUnavailable, { hideTitle: props.hideTitle });
114
- return ((0, jsx_runtime_1.jsx)(SignUpForm, { settings: instanceSettings, busy: state.busy, errors: state.errors, hideTitle: props.hideTitle, captcha: captcha, onSubmit: create, passkey: usingPasskey ? { email: passkeyOffer.email } : null, onSwitchMode: canPasskey
126
+ return ((0, jsx_runtime_1.jsx)(SignUpForm, { settings: instanceSettings, busy: state.busy, errors: state.errors, hideTitle: props.hideTitle, captcha: captcha, policies: policies, onSubmit: create, passkey: usingPasskey ? { email: passkeyOffer.email } : null, onSwitchMode: canPasskey
115
127
  ? () => {
116
128
  setState((current) => ({ ...current, errors: [] }));
117
129
  setMode(usingPasskey ? 'password' : 'passkey');
@@ -138,7 +150,7 @@ function SignUpEmailUnavailable({ hideTitle }) {
138
150
  return ((0, jsx_runtime_1.jsxs)("div", { className: cardClass, children: [hideTitle ? null : (0, jsx_runtime_1.jsx)("h1", { className: titleClass, children: t('signUp.title') }), (0, jsx_runtime_1.jsx)("p", { className: errorClass, role: "alert", "data-atlas-email-unavailable": "", children: t('signUp.emailUnavailable') })] }));
139
151
  }
140
152
  /** The create-account step. Values are kept in state so an error never clears them. */
141
- function SignUpForm({ settings, busy, errors, hideTitle, captcha, onSubmit, passkey = null, onSwitchMode, }) {
153
+ function SignUpForm({ settings, busy, errors, hideTitle, captcha, policies, onSubmit, passkey = null, onSwitchMode, }) {
142
154
  const t = (0, components_shared_1.useText)();
143
155
  const errorText = (0, components_shared_1.useErrorText)();
144
156
  const cardClass = (0, components_shared_1.useClass)('card', 'atlas-card');
@@ -150,9 +162,14 @@ function SignUpForm({ settings, busy, errors, hideTitle, captcha, onSubmit, pass
150
162
  const [values, setValues] = (0, react_1.useState)({});
151
163
  const [agreed, setAgreed] = (0, react_1.useState)(false);
152
164
  const set = (name, value) => setValues((v) => ({ ...v, [name]: value }));
153
- const legal = settings?.legal;
165
+ const pt = (0, policies_1.usePolicyText)();
166
+ const [reading, setReading] = (0, react_1.useState)(false);
167
+ const [declined, setDeclined] = (0, react_1.useState)(null);
168
+ const hasPolicies = policies.policies.length > 0;
169
+ // Instance policies replace the legacy single "I agree to the Terms" row.
170
+ const legal = hasPolicies ? undefined : settings?.legal;
154
171
  const showLegal = !!legal && (!!legal.termsUrl || !!legal.privacyUrl);
155
- const consentOk = !legal?.required || agreed;
172
+ const consentOk = (!legal?.required || agreed) && (!hasPolicies || policies.controller.canSubmit());
156
173
  const fieldErrors = (name) => errors
157
174
  .filter((error) => error.param === name)
158
175
  .map((error) => ((0, jsx_runtime_1.jsx)("span", { className: errorClass, children: errorText(error) }, error.code)));
@@ -197,6 +214,12 @@ function SignUpForm({ settings, busy, errors, hideTitle, captcha, onSubmit, pass
197
214
  event.preventDefault();
198
215
  if (!consentOk)
199
216
  return;
217
+ setDeclined(null);
218
+ // Scroll-mode policies are read in their dialog first; the sign-up goes once they are accepted.
219
+ if (policies.controller.pendingScroll()) {
220
+ setReading(true);
221
+ return;
222
+ }
200
223
  onSubmit(values, legal?.required ? agreed : true);
201
224
  }, children: [(settings?.signUpFields ?? []).map((f) => {
202
225
  const body = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: cls('formFieldLabel', 'atlas-field-label'), children: label(f) }), control(f), fieldErrors(f.key)] }));
@@ -206,7 +229,13 @@ function SignUpForm({ settings, busy, errors, hideTitle, captcha, onSubmit, pass
206
229
  ? passkey.email === 'off'
207
230
  ? null
208
231
  : textField('email', 'signUp.emailLabel', 'email', 'email', passkey.email === 'required')
209
- : textField('email', 'signUp.emailLabel', 'email', 'email'), passkey ? null : textField('password', 'signUp.passwordLabel', 'password', 'new-password'), passkey ? (0, jsx_runtime_1.jsx)("p", { className: cls('text', 'atlas-text'), children: t('signUp.passkeyIntro') }) : null, showLegal ? ((0, jsx_runtime_1.jsxs)("label", { className: cls('formField', 'atlas-consent'), children: [legal.required ? ((0, jsx_runtime_1.jsx)("input", { type: "checkbox", name: "consent", checked: agreed, onChange: (e) => setAgreed(e.target.checked) })) : null, (0, jsx_runtime_1.jsxs)("span", { className: cls('text', 'atlas-text'), children: [t(legal.required ? 'signUp.consentAgree' : 'signUp.consentNotice'), ' ', links.map((link, i) => ((0, jsx_runtime_1.jsxs)("span", { children: [i > 0 ? ` ${t('signUp.and')} ` : null, link] }, i))), "."] }), fieldErrors('consent')] })) : null, (0, jsx_runtime_1.jsx)(captcha_1.CaptchaSlot, { controller: captcha }), (0, jsx_runtime_1.jsx)("button", { className: buttonClass, disabled: busy || !consentOk, type: "submit", children: t('signUp.submit') }), onSwitchMode ? ((0, jsx_runtime_1.jsx)("div", { className: "atlas-alternatives", children: (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-link'), "data-atlas-sign-up-mode": passkey ? 'password' : 'passkey', disabled: busy, onClick: onSwitchMode, children: t(passkey ? 'signUp.passwordOption' : 'signUp.passkeyOption') }) })) : null] })] }));
232
+ : textField('email', 'signUp.emailLabel', 'email', 'email'), passkey ? null : textField('password', 'signUp.passwordLabel', 'password', 'new-password'), passkey ? (0, jsx_runtime_1.jsx)("p", { className: cls('text', 'atlas-text'), children: t('signUp.passkeyIntro') }) : null, showLegal ? ((0, jsx_runtime_1.jsxs)("label", { className: cls('formField', 'atlas-consent'), children: [legal.required ? ((0, jsx_runtime_1.jsx)("input", { type: "checkbox", name: "consent", checked: agreed, onChange: (e) => setAgreed(e.target.checked) })) : null, (0, jsx_runtime_1.jsxs)("span", { className: cls('text', 'atlas-text'), children: [t(legal.required ? 'signUp.consentAgree' : 'signUp.consentNotice'), ' ', links.map((link, i) => ((0, jsx_runtime_1.jsxs)("span", { children: [i > 0 ? ` ${t('signUp.and')} ` : null, link] }, i))), "."] }), fieldErrors('consent')] })) : null, hasPolicies ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(policies_1.PolicyConsent, { controller: policies.controller, errors: errors }), declined ? ((0, jsx_runtime_1.jsx)("span", { className: errorClass, role: "alert", "data-atlas-policy-declined": "", children: pt('policy.declined', { policy: declined }) })) : null] })) : null, (0, jsx_runtime_1.jsx)(captcha_1.CaptchaSlot, { controller: captcha }), (0, jsx_runtime_1.jsx)("button", { className: buttonClass, disabled: busy || !consentOk, type: "submit", children: t('signUp.submit') }), hasPolicies ? (0, jsx_runtime_1.jsx)(policies_1.PolicyClickwrap, { controller: policies.controller }) : null, hasPolicies ? ((0, jsx_runtime_1.jsx)(policies_1.PolicyScrollQueue, { controller: policies.controller, running: reading, onDone: () => {
233
+ setReading(false);
234
+ onSubmit(values, true);
235
+ }, onDecline: (policy) => {
236
+ setReading(false);
237
+ setDeclined(policy.title);
238
+ } })) : null, onSwitchMode ? ((0, jsx_runtime_1.jsx)("div", { className: "atlas-alternatives", children: (0, jsx_runtime_1.jsx)("button", { type: "button", className: cls('link', 'atlas-link'), "data-atlas-sign-up-mode": passkey ? 'password' : 'passkey', disabled: busy, onClick: onSwitchMode, children: t(passkey ? 'signUp.passwordOption' : 'signUp.passkeyOption') }) })) : null] })] }));
210
239
  }
211
240
  /**
212
241
  * §5.1 headless sign-up — the sign-up counterpart of {@link useSignIn}. Starts a