@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.
- package/CHANGELOG.md +20 -0
- package/dist/AtlasProvider.d.ts +1 -0
- package/dist/AtlasProvider.js +34 -5
- package/dist/AtlasProvider.js.map +1 -1
- package/dist/account.d.ts +12 -1
- package/dist/account.js +6 -9
- package/dist/account.js.map +1 -1
- package/dist/active-atlas.d.ts +29 -0
- package/dist/active-atlas.js +40 -0
- package/dist/active-atlas.js.map +1 -0
- package/dist/billing.d.ts +30 -1
- package/dist/billing.js +86 -14
- package/dist/billing.js.map +1 -1
- package/dist/captcha.js +1 -1
- package/dist/captcha.js.map +1 -1
- package/dist/compat.d.ts +307 -0
- package/dist/compat.js +387 -0
- package/dist/compat.js.map +1 -0
- package/dist/components.d.ts +5 -1
- package/dist/components.js +16 -1
- package/dist/components.js.map +1 -1
- package/dist/device-authorization.d.ts +42 -0
- package/dist/device-authorization.js +137 -0
- package/dist/device-authorization.js.map +1 -0
- package/dist/flow.d.ts +22 -1
- package/dist/flow.js +8 -1
- package/dist/flow.js.map +1 -1
- package/dist/i18n.js +15 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/policies.d.ts +114 -0
- package/dist/policies.js +324 -0
- package/dist/policies.js.map +1 -0
- package/dist/sign-in.js +9 -2
- package/dist/sign-in.js.map +1 -1
- package/dist/sign-up.d.ts +3 -0
- package/dist/sign-up.js +36 -7
- package/dist/sign-up.js.map +1 -1
- package/dist/styles.d.ts +1 -28
- package/dist/styles.js +3 -1
- package/dist/styles.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +15 -4
package/dist/policies.js
ADDED
|
@@ -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":";AAAA,YAAY,CAAC;;AAkDb,sCAGC;AAGD,wCAUC;AA0BD,kCA0BC;AAoBD,oCAsBC;AAsCD,sCAyDC;AAGD,0CAWC;AAiBD,kCA4EC;AAOD,8CAsCC;AAOD,4CAyBC;AA2DD,gCAuEC;;AAvjBD,iCASe;AACf,sCAmBuB;AACvB,mDAA2C;AAC3C,2DAAmF;AAGnF;;;;;;;;;;;GAWG;AAEH,mFAAmF;AACnF,SAAgB,aAAa;IAC3B,MAAM,CAAC,GAAG,IAAA,2BAAO,GAAE,CAAC;IACpB,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,qBAAgB,EAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,qDAAqD;AACrD,SAAgB,cAAc,CAAC,UAAsC;IACnE,MAAM,KAAK,GAAG,IAAA,cAAM,EAA+C,IAAI,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtJ,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1D,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACjB,OAAO,IAAA,4BAAoB,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAsBD;;;GAGG;AACH,SAAgB,WAAW,CAAC,UAA8B,EAAE,EAAE,cAA2B;IACvF,MAAM,GAAG,GAAG,IAAA,iCAAa,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,cAAc,IAAI,GAAG,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,wBAAQ,GAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAI,+BAA0B,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzH,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,KAAK,IAAI,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAY,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAA,iBAAY,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/F,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAA0C;IAC9E,MAAM,OAAO,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAA,cAAM,EAAkB,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,uBAAkB,EAAC,IAAA,eAAU,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAA,4BAAQ,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QACvC,OAAO,IAAA,qBAAgB,EAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAClB,OAAO,CACL,iCAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAC,QAAQ,gBAAa,MAAM,CAAC,KAAK,+BAA4B,EAAE,aAClH,gCAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI,EAClD,iCAAM,GAAG,EAAE,WAAW,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,2BAAuB,EAAE,GAAG,IACpG,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAA8D;IAC7G,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG;QACX,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACtE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAA,qBAAgB,EAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;KAChG;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,CACL,iCAAK,SAAS,EAAC,qBAAqB,EAAC,IAAI,EAAC,QAAQ,gBAAa,MAAM,CAAC,KAAK,8BAA4B,MAAM,CAAC,GAAG,aAC/G,iCAAK,SAAS,EAAC,0BAA0B,aACvC,6CAAS,MAAM,CAAC,KAAK,GAAU,EAC/B,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,4BAAyB,EAAE,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,YACnI,CAAC,CAAC,mBAAmB,CAAC,GAChB,IACL,EACL,IAAI,CAAC,CAAC,CAAC,8BAAG,SAAS,EAAC,mBAAmB,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,EAC1D,uBAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAI,IAC3C,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAA8D;IACpG,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,OAAO,CACL,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,4BACnB,MAAM,CAAC,GAAG,mBACpB,QAAQ,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,YAEjD,MAAM,CAAC,KAAK,GACN,CACV,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAuE;IACnH,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAAA,kBAAa,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,CACL,6DACG,MAAM,EACN,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,6CACG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAC3D,IAAI,KAFI,CAAC,CAGL,CACR,CAAC,EACD,KAAK,IACL,CACJ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,EAAqE;IAC1H,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAA,aAAK,GAAE,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,IAAI,OAAO;QAAE,OAAO,uBAAC,YAAY,IAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAI,CAAC;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAC5B,OAAO,CACL,iCAAK,SAAS,EAAC,sBAAsB,yBAAqB,EAAE,aACzD,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CACrB,iCAAK,SAAS,EAAC,gCAAgC,aAC7C,kCACE,EAAE,EAAE,GAAG,EAAE,MAAM,EACf,IAAI,EAAC,UAAU,EACf,IAAI,EAAC,UAAU,2BACO,EAAE,EACxB,OAAO,EAAE,KAAK,CAAC,eAAe,EAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC3D,EACF,kCAAO,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,YAC/D,uBAAC,QAAQ,IAAC,QAAQ,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAC,UAAU,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAC,UAAU,IAAa,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,IAAxC,CAAC,CAAC,GAAG,CAAuC,CAAC,GAAI,GAC7J,IACJ,CACP,CAAC,CAAC,CAAC,CACF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,IAAA,kBAAa,EAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACtE,OAAO,CACL,iCAAiB,SAAS,EAAC,gCAAgC,aACzD,kCACE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EACpB,IAAI,EAAC,UAAU,EACf,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,EAAE,2BACA,CAAC,CAAC,GAAG,EAC5B,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EACpC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC/D,EACF,mCAAO,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,aACnE,MAAM,EACP,uBAAC,UAAU,IAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,GAAI,EAChD,KAAK,IACA,KAbA,CAAC,CAAC,GAAG,CAcT,CACP,CAAC;YACJ,CAAC,CAAC,CACH,EACA,MAAM;iBACJ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,oBAAoB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;iBACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACV,iCAAmB,SAAS,EAAE,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,YAC/D,CAAC,CAAC,OAAO,IADD,CAAC,CAAC,IAAI,CAEV,CACR,CAAC,IACA,CACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAgB,eAAe,CAAC,EAAE,UAAU,EAA8C;IACxF,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,8BAAG,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,iCAA8B,EAAE,YACjF,uBAAC,QAAQ,IAAC,QAAQ,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAC,UAAU,EAAC,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAC,UAAU,IAAa,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,IAAxC,CAAC,CAAC,GAAG,CAAuC,CAAC,GAAI,GACzK,CACL,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAoB;IACzG,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAA,aAAK,GAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,uBAAkB,EAAC,IAAA,eAAU,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,IAAA,cAAM,EAAkB,IAAI,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,OAAO,IAAA,qBAAgB,EAAC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;YACtD,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAEnC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAA,cAAS,EAAC,KAAK,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,GAAG,GAAG,QAAQ,CAAC;IAC/B,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;IAC7B,OAAO,CACL,gCAAK,SAAS,EAAC,sBAAsB,6BAA0B,MAAM,CAAC,GAAG,YACvE,iCACE,GAAG,EAAE,QAAQ,EACb,SAAS,EAAC,oBAAoB,EAC9B,IAAI,EAAC,QAAQ,gBACF,MAAM,qBACA,OAAO,sBACN,MAAM,EACxB,QAAQ,EAAE,CAAC,CAAC,aAEZ,+BAAI,EAAE,EAAE,OAAO,YAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAM,EACjI,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAClE,iCAAK,SAAS,EAAC,sBAAsB,+BAA2B,EAAE,aAChE,6CAAS,CAAC,CAAC,qBAAqB,CAAC,GAAU,EAC3C,2CAAO,MAAM,CAAC,gBAAgB,GAAQ,IAClC,CACP,CAAC,CAAC,CAAC,IAAI,EACR,iCAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,mBAAmB,EAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAC,QAAQ,gBAAa,MAAM,CAAC,KAAK,+BAA4B,EAAE,aAChI,gCAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI,EAClD,iCAAM,GAAG,EAAE,WAAW,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,2BAAuB,EAAE,GAAG,IACpG,EACN,8BAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAC,mBAAmB,eAAW,QAAQ,YAC5D,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAClC,EACJ,iCAAK,SAAS,EAAC,sBAAsB,aACnC,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,+BAA4B,EAAE,EAAC,OAAO,EAAE,SAAS,YAC7G,CAAC,CAAC,gBAAgB,CAAC,GACb,EACT,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,8BACjC,EAAE,EAC3B,QAAQ,EAAE,CAAC,KAAK,mBACD,CAAC,KAAK,EACrB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,QAAQ,EAAE,YAEjC,CAAC,CAAC,eAAe,CAAC,GACZ,IACL,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,MAAM,EACN,SAAS,GAOV;IACC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACzB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,MAAM;YAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACrC,gHAAgH;aAC3G,IAAI,SAAS,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1D,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IACjD,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CACL,uBAAC,WAAW,IAEV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EACnD,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAL7B,MAAM,CAAC,SAAS,CAMrB,CACH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,SAAS,GAMV;IACC,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,MAAM,GAAG,IAAA,iCAAa,GAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,wBAAQ,GAAE,CAAC;IAC9B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAoC,IAAI,CAAC,CAAC;IACtF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAA,yBAAoB,EAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACnI,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU;QAAE,OAAO,8BAAG,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,YAAG,CAAC,CAAC,gBAAgB,CAAC,GAAK,CAAC;IAC3F,OAAO,uBAAC,oBAAoB,IAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAI,CAAC;AAChH,CAAC;AAED,SAAS,oBAAoB,CAAC,EAC5B,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,SAAS,GAMV;IACC,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7H,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACrE,OAAO,CACL,2DAA4B,EAAE,aAC5B,8BAAG,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,YAAG,CAAC,CAAC,qBAAqB,CAAC,GAAK,EACvE,uBAAC,aAAa,IAAC,UAAU,EAAE,UAAU,GAAI,EACzC,uBAAC,eAAe,IAAC,UAAU,EAAE,UAAU,GAAI,EAC1C,SAAS,CAAC,CAAC,CAAC,CACX,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,gCAA6B,EAAE,EAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI,YACrM,CAAC,CAAC,eAAe,CAAC,GACZ,CACV,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,iBAAiB,IAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,CAAC,QAAQ,EAClB,QAAQ,QACR,MAAM,EAAE,GAAG,EAAE;oBACX,IAAI,CAAC,SAAS;wBAAE,IAAI,EAAE,CAAC;gBACzB,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,CAAC,IAAI,CAAC,CAAC;oBAClB,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC,GACD,IACE,CACP,CAAC;AACJ,CAAC;AAUD;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAmB;IACpF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,wBAAQ,GAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAA,iCAAa,GAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAmB,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAoC,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAExC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAA,mBAAc,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAErB,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,KAAK,IAAI,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,IAAA,iBAAY,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,+BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtH,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU;YAAE,KAAK,KAAK,EAAE,CAAC;IAClE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,KAAK,IAAI,EAAE;QACpC,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAgB,EAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,UAAU,EAAE,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,OAAO,CACL,6DACG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7B,iCAAK,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAC,QAAQ,8BAA0B,EAAE,aAC5F,6CACE,+CAAS,CAAC,CAAC,oBAAoB,CAAC,UAAY,EAC3C,CAAC,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAA,eAAU,EAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EACzE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAA,qBAAgB,EAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAC7E,EACP,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,YAC3F,CAAC,CAAC,qBAAqB,CAAC,GAClB,IACL,CACP,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CACpB,uBAAC,gBAAgB,IAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CACpL,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,IACR,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,UAAU,EACV,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,GAQT;IACC,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAA,8BAAU,GAAE,CAAC;IACzB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACrE,OAAO,CACL,6DACG,SAAS,CAAC,CAAC,CAAC,CACX,iCAAK,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,4BAAyB,EAAE,aAClE,uBAAC,aAAa,IAAC,UAAU,EAAE,UAAU,GAAI,EACzC,uBAAC,eAAe,IAAC,UAAU,EAAE,UAAU,GAAI,EAC1C,KAAK,CAAC,CAAC,CAAC,8BAAG,SAAS,EAAE,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE,IAAI,EAAC,OAAO,YAAE,KAAK,GAAK,CAAC,CAAC,CAAC,IAAI,EAC5F,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,QAAQ,YAC3K,CAAC,CAAC,eAAe,CAAC,GACZ,EACR,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjB,mCAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,YAC1E,CAAC,CAAC,gBAAgB,CAAC,GACb,CACV,IACG,CACP,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,iBAAiB,IAChB,UAAU,EAAE,UAAU,EACtB,OAAO,QACP,QAAQ,QACR,MAAM,EAAE,GAAG,EAAE;oBACX,IAAI,CAAC,SAAS;wBAAE,QAAQ,EAAE,CAAC;gBAC7B,CAAC,EACD,SAAS,EAAE,GAAG,EAAE;oBACd,IAAI,CAAC,QAAQ;wBAAE,QAAQ,EAAE,CAAC;gBAC5B,CAAC,GACD,IACD,CACJ,CAAC;AACJ,CAAC"}
|
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
|
|
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
|
|
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
|
package/dist/sign-in.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../src/sign-in.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../src/sign-in.tsx"],"names":[],"mappings":"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"}
|
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
|
|
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)(
|
|
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
|