@plumile/backoffice-react 0.1.87 → 0.1.90
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/README.md +6 -6
- package/lib/esm/{AcceptInvitationScreen-dnOvRx4Z.js → AcceptInvitationScreen-DLc4aovr.js} +8 -7
- package/lib/esm/AcceptInvitationScreen-DLc4aovr.js.map +1 -0
- package/lib/esm/{AuthPanel-DiHejPoq.js → AuthPanel-BaIRFGbX.js} +2 -2
- package/lib/esm/{AuthPanel-DiHejPoq.js.map → AuthPanel-BaIRFGbX.js.map} +1 -1
- package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js → BackofficeAcceptInvitationPage-D0dZnrV7.js} +4 -4
- package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js.map → BackofficeAcceptInvitationPage-D0dZnrV7.js.map} +1 -1
- package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js → BackofficeDashboardPage-YWvoQODn.js} +33 -33
- package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js.map → BackofficeDashboardPage-YWvoQODn.js.map} +1 -1
- package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js → BackofficeDetailPayload-P61MDRLE.js} +2 -2
- package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js.map → BackofficeDetailPayload-P61MDRLE.js.map} +1 -1
- package/lib/esm/{BackofficeEntityActionFormDialog-V4QXnvpy.js → BackofficeEntityActionFormDialog-BgRTJ_JS.js} +3 -4
- package/lib/esm/BackofficeEntityActionFormDialog-BgRTJ_JS.js.map +1 -0
- package/lib/esm/BackofficeEntityDetailLayoutPage-DXjRqvcZ.js.map +1 -1
- package/lib/esm/{BackofficeEntityDetailPage-CIyGKwVP.js → BackofficeEntityDetailPage-DPFXbJxC.js} +34 -34
- package/lib/esm/BackofficeEntityDetailPage-DPFXbJxC.js.map +1 -0
- package/lib/esm/{BackofficeEntityListPage-DmZozSNk.js → BackofficeEntityListPage-C8Ucmc_E.js} +3 -4
- package/lib/esm/BackofficeEntityListPage-C8Ucmc_E.js.map +1 -0
- package/lib/esm/{useBackofficeReactTranslation-WfXU8kCf.js → BackofficeErrorBoundary-BwRVSDHU.js} +3 -9
- package/lib/esm/BackofficeErrorBoundary-BwRVSDHU.js.map +1 -0
- package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js → BackofficeLayoutPage-j3VUX3Tu.js} +35 -35
- package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js.map → BackofficeLayoutPage-j3VUX3Tu.js.map} +1 -1
- package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js → BackofficeLoginPage-DgdIWTeu.js} +5 -5
- package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js.map → BackofficeLoginPage-DgdIWTeu.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetCompletePage-ZLhghfhC.js → BackofficePasswordResetCompletePage-CF_0t3Nq.js} +4 -5
- package/lib/esm/BackofficePasswordResetCompletePage-CF_0t3Nq.js.map +1 -0
- package/lib/esm/{BackofficePasswordResetRequestPage-BLNHQD79.js → BackofficePasswordResetRequestPage-BJOrQXcy.js} +4 -4
- package/lib/esm/BackofficePasswordResetRequestPage-BJOrQXcy.js.map +1 -0
- package/lib/esm/BackofficeRightPageLayout-DZQvIHnj.js.map +1 -1
- package/lib/esm/{BackofficeVerifyEmailPage-BSTtLXdx.js → BackofficeVerifyEmailPage-C81LlsNM.js} +4 -5
- package/lib/esm/BackofficeVerifyEmailPage-C81LlsNM.js.map +1 -0
- package/lib/esm/{EntityFilterValue-B5ZGHO_u.js → EntityFilterValue-BWUdPBwp.js} +10 -9
- package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +1 -0
- package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js → EntityIdPickerDialog-Yhmr-WsV.js} +9 -9
- package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js.map → EntityIdPickerDialog-Yhmr-WsV.js.map} +1 -1
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js} +8 -7
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js.map → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map} +1 -1
- package/lib/esm/{PasswordResetCompleteScreen-B0P_tZg2.js → PasswordResetCompleteScreen-Cgg96DPo.js} +6 -5
- package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +1 -0
- package/lib/esm/{PasswordResetRequestScreen-p9s0dblR.js → PasswordResetRequestScreen-I1nFvGLd.js} +6 -5
- package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +1 -0
- package/lib/esm/{VerifyEmailScreen--9lxOGlW.js → VerifyEmailScreen-Br5KyHjg.js} +7 -6
- package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +1 -0
- package/lib/esm/backoffice-react.js +830 -1001
- package/lib/esm/backoffice-react.js.map +1 -1
- package/lib/esm/buildBreadcrumbs-CqF9Nh6x.js.map +1 -1
- package/lib/esm/environment-BXoBq_6e.js.map +1 -1
- package/lib/esm/loginPage.css-B7Io_DuU.js +6 -0
- package/lib/esm/loginPage.css-B7Io_DuU.js.map +1 -0
- package/lib/esm/mutationResult-CcQMY13J.js.map +1 -1
- package/lib/esm/pageResolution-hAQA5C6S.js.map +1 -1
- package/lib/esm/sidebarUtils-CuwJ_3mD.js.map +1 -1
- package/lib/esm/{synchronizeAuthStatusQuery-By_lNCnP.js → synchronizeAuthStatusQuery-1juorUEX.js} +47 -46
- package/lib/esm/synchronizeAuthStatusQuery-1juorUEX.js.map +1 -0
- package/lib/esm/{useAuth-OVPPa9bO.js → useAuth-BdSNpGqe.js} +43 -42
- package/lib/esm/useAuth-BdSNpGqe.js.map +1 -0
- package/lib/esm/{useBackofficeAuth-BvEoEqnB.js → useBackofficeAuth-C16Euw2X.js} +3 -3
- package/lib/esm/{useBackofficeAuth-BvEoEqnB.js.map → useBackofficeAuth-C16Euw2X.js.map} +1 -1
- package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js → useBackofficeLazyValue-Bh_13h8A.js} +2 -2
- package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js.map → useBackofficeLazyValue-Bh_13h8A.js.map} +1 -1
- package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +1 -1
- package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js +18 -0
- package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +1 -0
- package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts.map +1 -1
- package/lib/types/hooks/useConditionalSubscription.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +211 -409
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +14 -12
- package/lib/esm/AcceptInvitationScreen-dnOvRx4Z.js.map +0 -1
- package/lib/esm/BackofficeConfigContext-R0t1owTI.js +0 -12
- package/lib/esm/BackofficeConfigContext-R0t1owTI.js.map +0 -1
- package/lib/esm/BackofficeEntityActionFormDialog-V4QXnvpy.js.map +0 -1
- package/lib/esm/BackofficeEntityDetailPage-CIyGKwVP.js.map +0 -1
- package/lib/esm/BackofficeEntityListPage-DmZozSNk.js.map +0 -1
- package/lib/esm/BackofficePasswordResetCompletePage-ZLhghfhC.js.map +0 -1
- package/lib/esm/BackofficePasswordResetRequestPage-BLNHQD79.js.map +0 -1
- package/lib/esm/BackofficeVerifyEmailPage-BSTtLXdx.js.map +0 -1
- package/lib/esm/EntityFilterValue-B5ZGHO_u.js.map +0 -1
- package/lib/esm/PasswordResetCompleteScreen-B0P_tZg2.js.map +0 -1
- package/lib/esm/PasswordResetRequestScreen-p9s0dblR.js.map +0 -1
- package/lib/esm/VerifyEmailScreen--9lxOGlW.js.map +0 -1
- package/lib/esm/loginPage.css-CBJ1Ozm5.js +0 -12
- package/lib/esm/loginPage.css-CBJ1Ozm5.js.map +0 -1
- package/lib/esm/synchronizeAuthStatusQuery-By_lNCnP.js.map +0 -1
- package/lib/esm/useAuth-OVPPa9bO.js.map +0 -1
- package/lib/esm/useBackofficeReactTranslation-WfXU8kCf.js.map +0 -1
- package/lib/types/i18n/useSharedTranslation.d.ts +0 -3
- package/lib/types/i18n/useSharedTranslation.d.ts.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { i as e } from "./environment-BXoBq_6e.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
3
|
+
import { a as n, c as r, d as i, s as a, t as o } from "./loginPage.css-B7Io_DuU.js";
|
|
3
4
|
import { i as s, t as c } from "./mutationResult-CcQMY13J.js";
|
|
4
5
|
import { useCallback as l, useEffect as u, useState as d } from "react";
|
|
5
6
|
import { Button as f, FormError as p, FormField as m } from "@plumile/ui";
|
|
6
7
|
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
7
8
|
//#region src/auth/login/MfaChallengeForm.tsx
|
|
8
9
|
var _ = ({ auth: e, onSuccess: s, onBack: c }) => {
|
|
9
|
-
let { t: _ } =
|
|
10
|
+
let { t: _ } = t(), [v, y] = d(""), [b, x] = d(null);
|
|
10
11
|
u(() => {
|
|
11
12
|
e.clearError(), x(null);
|
|
12
13
|
}, [e]);
|
|
@@ -31,11 +32,11 @@ var _ = ({ auth: e, onSuccess: s, onBack: c }) => {
|
|
|
31
32
|
_
|
|
32
33
|
]), C = e.emailHint == null ? _("auth.mfa.helper.default") : _("auth.mfa.helper.withEmail", { email: e.emailHint }), w = b ?? e.error?.message ?? null;
|
|
33
34
|
return /* @__PURE__ */ g("form", {
|
|
34
|
-
className:
|
|
35
|
+
className: n,
|
|
35
36
|
onSubmit: S,
|
|
36
37
|
noValidate: !0,
|
|
37
38
|
children: [/* @__PURE__ */ g("div", {
|
|
38
|
-
className:
|
|
39
|
+
className: i,
|
|
39
40
|
children: [
|
|
40
41
|
/* @__PURE__ */ h("p", {
|
|
41
42
|
className: a,
|
|
@@ -62,7 +63,7 @@ var _ = ({ auth: e, onSuccess: s, onBack: c }) => {
|
|
|
62
63
|
type: "button",
|
|
63
64
|
variant: "text",
|
|
64
65
|
size: "small",
|
|
65
|
-
className:
|
|
66
|
+
className: r,
|
|
66
67
|
onClick: () => {
|
|
67
68
|
e.reset(), c();
|
|
68
69
|
},
|
|
@@ -114,8 +115,8 @@ var S = {
|
|
|
114
115
|
emailHint: null,
|
|
115
116
|
mfaLevel: null,
|
|
116
117
|
nextStep: null
|
|
117
|
-
}, C = (
|
|
118
|
-
let { t:
|
|
118
|
+
}, C = (n) => () => {
|
|
119
|
+
let { t: r } = t(), [i, a] = d(!1), [o, u] = d(null), [f, p] = d(null), [m, h] = d(null), [g, _] = d([]), [b, C] = d(S), w = n.login.commit, T = n.logout.commit, E = n.completeMfa.commit, D = n.beginPasskeyLogin.commit, O = n.finishPasskeyLogin.commit, k = n.acceptInvitation?.commit, A = n.beginAuthentication.commit, j = r("auth.loginFlow.errors.tryAgain"), M = r("auth.loginFlow.errors.tryAgain"), N = r("auth.passkey.errors.failed"), P = r("auth.mfa.errors.verificationFailed"), F = r("auth.acceptInvitation.errors.default"), I = r("auth.mfa.errors.invalidChallenge"), L = r("auth.passkey.errors.notAvailable"), R = "Logout failed.", z = l(() => {
|
|
119
120
|
u(null), p(null), h(null), _([]), C(S);
|
|
120
121
|
}, []), B = l(() => {
|
|
121
122
|
u(null);
|
|
@@ -130,56 +131,56 @@ var S = {
|
|
|
130
131
|
})), e.loggedInUser != null && i == null ? (p({ id: e.loggedInUser.id }), "success") : i === "TOTP" && n != null ? "mfa-required" : "error";
|
|
131
132
|
}, []), H = l((e) => typeof e == "object" && !!e && ("status" in e || "result" in e), []), U = l((e) => {
|
|
132
133
|
switch (e) {
|
|
133
|
-
case "INVALID_CREDENTIALS": return
|
|
134
|
-
case "ACCOUNT_LOCKED": return
|
|
135
|
-
case "RATE_LIMITED": return
|
|
136
|
-
case "INTERNAL_ERROR": return
|
|
134
|
+
case "INVALID_CREDENTIALS": return r("auth.loginFlow.errors.invalidCredentials");
|
|
135
|
+
case "ACCOUNT_LOCKED": return r("auth.loginFlow.errors.accountLocked");
|
|
136
|
+
case "RATE_LIMITED": return r("auth.loginFlow.errors.rateLimited");
|
|
137
|
+
case "INTERNAL_ERROR": return r("auth.loginFlow.errors.tryAgain");
|
|
137
138
|
default: return null;
|
|
138
139
|
}
|
|
139
|
-
}, [
|
|
140
|
+
}, [r]), W = l((e) => {
|
|
140
141
|
switch (e) {
|
|
141
|
-
case "INVALID_EMAIL": return
|
|
142
|
-
case "INTERNAL_ERROR": return
|
|
142
|
+
case "INVALID_EMAIL": return r("auth.loginFlow.errors.invalidEmail");
|
|
143
|
+
case "INTERNAL_ERROR": return r("auth.loginFlow.errors.tryAgain");
|
|
143
144
|
default: return null;
|
|
144
145
|
}
|
|
145
|
-
}, [
|
|
146
|
+
}, [r]), G = l((e) => {
|
|
146
147
|
switch (e) {
|
|
147
|
-
case "INVALID_EMAIL": return
|
|
148
|
-
case "PASSKEY_NOT_FOUND": return
|
|
149
|
-
case "PASSKEY_NOT_SUPPORTED": return
|
|
150
|
-
case "INTERNAL_ERROR": return
|
|
148
|
+
case "INVALID_EMAIL": return r("auth.passkey.errors.invalidEmail");
|
|
149
|
+
case "PASSKEY_NOT_FOUND": return r("auth.passkey.errors.notFound");
|
|
150
|
+
case "PASSKEY_NOT_SUPPORTED": return r("auth.passkey.errors.notAvailable");
|
|
151
|
+
case "INTERNAL_ERROR": return r("auth.passkey.errors.failed");
|
|
151
152
|
default: return null;
|
|
152
153
|
}
|
|
153
|
-
}, [
|
|
154
|
+
}, [r]), K = l((e) => {
|
|
154
155
|
switch (e) {
|
|
155
|
-
case "INVALID_CHALLENGE_TOKEN": return
|
|
156
|
-
case "CHALLENGE_EXPIRED": return
|
|
157
|
-
case "INVALID_ASSERTION": return
|
|
158
|
-
case "INTERNAL_ERROR": return
|
|
156
|
+
case "INVALID_CHALLENGE_TOKEN": return r("auth.passkey.errors.invalidChallenge");
|
|
157
|
+
case "CHALLENGE_EXPIRED": return r("auth.passkey.errors.challengeExpired");
|
|
158
|
+
case "INVALID_ASSERTION": return r("auth.passkey.errors.invalidAssertion");
|
|
159
|
+
case "INTERNAL_ERROR": return r("auth.passkey.errors.failed");
|
|
159
160
|
default: return null;
|
|
160
161
|
}
|
|
161
|
-
}, [
|
|
162
|
+
}, [r]), q = l((e) => {
|
|
162
163
|
switch (e) {
|
|
163
|
-
case "INVALID_CHALLENGE_TOKEN": return
|
|
164
|
-
case "CHALLENGE_EXPIRED": return
|
|
165
|
-
case "INVALID_CODE": return
|
|
166
|
-
case "TOO_MANY_ATTEMPTS": return
|
|
167
|
-
case "INTERNAL_ERROR": return
|
|
164
|
+
case "INVALID_CHALLENGE_TOKEN": return r("auth.mfa.errors.invalidChallenge");
|
|
165
|
+
case "CHALLENGE_EXPIRED": return r("auth.mfa.errors.expired");
|
|
166
|
+
case "INVALID_CODE": return r("auth.mfa.errors.invalidCode");
|
|
167
|
+
case "TOO_MANY_ATTEMPTS": return r("auth.mfa.errors.tooManyAttempts");
|
|
168
|
+
case "INTERNAL_ERROR": return r("auth.mfa.errors.verificationFailed");
|
|
168
169
|
default: return null;
|
|
169
170
|
}
|
|
170
|
-
}, [
|
|
171
|
+
}, [r]), J = l((e) => {
|
|
171
172
|
switch (e) {
|
|
172
|
-
case "INVALID_TOKEN": return
|
|
173
|
-
case "TOKEN_EXPIRED": return
|
|
174
|
-
case "ALREADY_ACCEPTED": return
|
|
175
|
-
case "PASSWORD_MISMATCH": return
|
|
176
|
-
case "PASSWORD_POLICY_VIOLATION": return
|
|
177
|
-
case "RATE_LIMITED": return
|
|
178
|
-
case "EMAIL_MISMATCH": return
|
|
179
|
-
case "INTERNAL_ERROR": return
|
|
173
|
+
case "INVALID_TOKEN": return r("auth.acceptInvitation.errors.invalidToken");
|
|
174
|
+
case "TOKEN_EXPIRED": return r("auth.acceptInvitation.errors.expired");
|
|
175
|
+
case "ALREADY_ACCEPTED": return r("auth.acceptInvitation.errors.alreadyAccepted");
|
|
176
|
+
case "PASSWORD_MISMATCH": return r("auth.acceptInvitation.errors.passwordMismatch");
|
|
177
|
+
case "PASSWORD_POLICY_VIOLATION": return r("auth.acceptInvitation.errors.passwordPolicyViolation");
|
|
178
|
+
case "RATE_LIMITED": return r("auth.acceptInvitation.errors.rateLimited");
|
|
179
|
+
case "EMAIL_MISMATCH": return r("auth.acceptInvitation.errors.emailMismatch");
|
|
180
|
+
case "INTERNAL_ERROR": return r("auth.acceptInvitation.errors.default");
|
|
180
181
|
default: return null;
|
|
181
182
|
}
|
|
182
|
-
}, [
|
|
183
|
+
}, [r]), Y = l(async (e) => new Promise((t, n) => {
|
|
183
184
|
A({
|
|
184
185
|
variables: { email: e },
|
|
185
186
|
onCompleted: (e) => {
|
|
@@ -515,7 +516,7 @@ var S = {
|
|
|
515
516
|
T,
|
|
516
517
|
R,
|
|
517
518
|
H
|
|
518
|
-
]), te =
|
|
519
|
+
]), te = i || n.login.isInFlight || n.logout.isInFlight || n.completeMfa.isInFlight || n.beginPasskeyLogin.isInFlight || n.finishPasskeyLogin.isInFlight || (n.acceptInvitation?.isInFlight ?? !1) || n.beginAuthentication.isInFlight;
|
|
519
520
|
return {
|
|
520
521
|
authMethod: b.authMethod,
|
|
521
522
|
challengeToken: b.challengeToken,
|
|
@@ -540,4 +541,4 @@ var S = {
|
|
|
540
541
|
//#endregion
|
|
541
542
|
export { x as a, b as i, y as n, _ as o, v as r, C as t };
|
|
542
543
|
|
|
543
|
-
//# sourceMappingURL=useAuth-
|
|
544
|
+
//# sourceMappingURL=useAuth-BdSNpGqe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth-BdSNpGqe.js","names":[],"sources":["../../src/auth/login/MfaChallengeForm.tsx","../../src/modules/webauthn.ts","../../src/hooks/useAuth.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, FormError, FormField } from '@plumile/ui';\n\nimport type { TotpCredentials, UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n 'completeMfa' | 'isLoading' | 'error' | 'emailHint' | 'reset' | 'clearError'\n >;\n onSuccess: () => void;\n onBack: () => void;\n};\n\nexport const MfaChallengeForm = ({\n auth,\n onSuccess,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [code, setCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n\n // Clear any stale errors when the MFA form is shown\n useEffect(() => {\n auth.clearError();\n setLocalError(null);\n }, [auth]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n const trimmed = code.trim();\n if (trimmed.length < 4) {\n setLocalError(t('auth.mfa.errors.shortCode'));\n return;\n }\n\n try {\n const credentials: TotpCredentials = {\n code: trimmed,\n };\n await auth.completeMfa(credentials);\n onSuccess();\n } catch {\n const authMessage = auth.error?.message;\n setLocalError(authMessage ?? t('auth.mfa.errors.verificationFailed'));\n }\n },\n [auth, code, onSuccess, t],\n );\n\n const helper =\n auth.emailHint != null\n ? t('auth.mfa.helper.withEmail', { email: auth.emailHint })\n : t('auth.mfa.helper.default');\n\n const formError = localError ?? auth.error?.message ?? null;\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n <form className={styles.formSurface} onSubmit={handleSubmit} noValidate>\n <div className={styles.stack}>\n <p className={styles.helper}>{helper}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.mfa.form.label')}\n name=\"code\"\n type=\"text\"\n value={code}\n onChange={(event) => {\n setCode(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.mfa.form.placeholder')}\n autoComplete=\"one-time-code\"\n autoFocus\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n className={styles.inlineLink}\n onClick={() => {\n auth.reset();\n onBack();\n }}\n >\n {t('auth.mfa.actions.back')}\n </Button>\n <Button type=\"submit\" size=\"large\" isLoading={auth.isLoading}>\n {t('auth.mfa.actions.submit')}\n </Button>\n </div>\n </form>\n );\n};\n","/**\n * Buffer to base64 url\n */\nexport function bufferToBase64Url(input: ArrayBuffer): string {\n const byteArray = new Uint8Array(input);\n let binary = '';\n for (const byte of byteArray) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64 url to buffer\n */\nexport function base64UrlToBuffer(input: string): ArrayBuffer {\n const normalized = input.replace(/-/g, '+').replace(/_/g, '/');\n const remainder = normalized.length % 4;\n let padding = '';\n if (remainder === 2) {\n padding = '==';\n } else if (remainder === 3) {\n padding = '=';\n } else if (remainder === 1) {\n throw new Error('Invalid base64url input length.');\n }\n const padded = `${normalized}${padding}`;\n const binary = atob(padded);\n const output = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n output[i] = binary.charCodeAt(i);\n }\n return output.buffer;\n}\n\nexport type WebAuthnRegistrationErrorKind =\n | 'cancelled'\n | 'credentialInUse'\n | 'notSupported'\n | 'failed';\n\n/**\n * Maps a browser WebAuthn registration error to a stable UI category.\n */\nexport function mapWebAuthnRegistrationError(\n error: unknown,\n): WebAuthnRegistrationErrorKind {\n if (!(error instanceof DOMException)) {\n return 'failed';\n }\n\n switch (error.name) {\n case 'NotAllowedError':\n case 'AbortError':\n return 'cancelled';\n case 'InvalidStateError':\n return 'credentialInUse';\n case 'SecurityError':\n case 'NotSupportedError':\n return 'notSupported';\n default:\n return 'failed';\n }\n}\n\n/**\n * Parse sign count\n */\nexport function parseSignCount(authenticatorData: ArrayBuffer): number {\n if (authenticatorData.byteLength < 37) {\n return 0;\n }\n const view = new DataView(authenticatorData);\n return view.getUint32(33, false);\n}\n","/* eslint-disable no-ternary */\nimport { useCallback, useState } from 'react';\n\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\n\nimport { resetRelayStore } from '../relay/environment.js';\nimport type { PayloadError } from 'relay-runtime';\n\nimport type {\n AuthMethod,\n LoginNextStep,\n MfaLevel,\n} from '../modules/sharedSchemaTypes.js';\nimport {\n base64UrlToBuffer,\n bufferToBase64Url,\n parseSignCount,\n} from '../modules/webauthn.js';\n\nexport type AuthPayload = {\n authMethod: AuthMethod | null | undefined;\n challengeToken: string | null | undefined;\n loggedInUser: { id: string } | null | undefined;\n mfaLevel: MfaLevel | null | undefined;\n nextStep: LoginNextStep | null | undefined;\n};\n\ntype LoginErrorReason =\n | 'INVALID_CREDENTIALS'\n | 'ACCOUNT_LOCKED'\n | 'RATE_LIMITED'\n | 'INTERNAL_ERROR';\n\ntype LogoutErrorReason =\n | 'UNAUTHENTICATED'\n | 'SESSION_NOT_FOUND'\n | 'INTERNAL_ERROR';\n\ntype BeginAuthenticationErrorReason = 'INVALID_EMAIL' | 'INTERNAL_ERROR';\n\ntype BeginPasskeyLoginErrorReason =\n | 'INVALID_EMAIL'\n | 'PASSKEY_NOT_FOUND'\n | 'PASSKEY_NOT_SUPPORTED'\n | 'INTERNAL_ERROR';\n\ntype FinishPasskeyLoginErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_ASSERTION'\n | 'INTERNAL_ERROR';\n\ntype CompleteMfaErrorReason =\n | 'INVALID_CHALLENGE_TOKEN'\n | 'CHALLENGE_EXPIRED'\n | 'INVALID_CODE'\n | 'TOO_MANY_ATTEMPTS'\n | 'INTERNAL_ERROR';\n\ntype AcceptInvitationErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'ALREADY_ACCEPTED'\n | 'PASSWORD_MISMATCH'\n | 'PASSWORD_POLICY_VIOLATION'\n | 'RATE_LIMITED'\n | 'EMAIL_MISMATCH'\n | 'INTERNAL_ERROR';\n\nexport type BeginAuthenticationPayload =\n MutationPayloadBase<BeginAuthenticationErrorReason> & {\n lockedUntil: string | null | undefined;\n methods: readonly {\n method: AuthMethod;\n mfaEnforced?: boolean | null | undefined;\n }[];\n };\n\nexport type BeginPasskeyLoginPayload =\n MutationPayloadBase<BeginPasskeyLoginErrorReason> & {\n allowCredentials: readonly string[];\n challenge: string;\n challengeToken: string;\n rpId: string;\n };\n\ntype LoginMutationPayload = MutationPayloadBase<LoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n};\n\ntype LogoutPayload = {\n loggedOut?: boolean | null | undefined;\n};\n\ntype LogoutMutationPayload = MutationPayloadBase<LogoutErrorReason> & {\n payload?: LogoutPayload | null | undefined;\n};\n\ntype CompleteMfaMutationPayload =\n MutationPayloadBase<CompleteMfaErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype FinishPasskeyLoginMutationPayload =\n MutationPayloadBase<FinishPasskeyLoginErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\ntype AcceptInvitationMutationPayload =\n MutationPayloadBase<AcceptInvitationErrorReason> & {\n payload?: AuthPayload | null | undefined;\n };\n\nexport type LoginResponse = { login: AuthPayload | LoginMutationPayload };\nexport type LogoutResponse = { logout: LogoutPayload | LogoutMutationPayload };\nexport type CompleteMfaResponse = {\n completeMfa: AuthPayload | CompleteMfaMutationPayload;\n};\nexport type FinishPasskeyLoginResponse = {\n finishPasskeyLogin: AuthPayload | FinishPasskeyLoginMutationPayload;\n};\nexport type AcceptInvitationResponse = {\n acceptInvitation: AuthPayload | AcceptInvitationMutationPayload;\n};\nexport type BeginAuthenticationResponse = {\n beginAuthentication: BeginAuthenticationPayload;\n};\nexport type BeginPasskeyLoginResponse = {\n beginPasskeyLogin: BeginPasskeyLoginPayload;\n};\n\nexport type LoginVariables = {\n input: LoginCredentials;\n};\n\nexport type LogoutVariables = Record<PropertyKey, never>;\n\nexport type CompleteMfaVariables = {\n input: {\n challengeToken: string;\n code: string;\n };\n};\n\nexport type BeginPasskeyLoginVariables = {\n email: string;\n};\n\nexport type FinishPasskeyLoginVariables = {\n input: {\n challenge: string;\n challengeToken: string;\n credentialId: string;\n signCount: number;\n userHandle?: string | null;\n };\n};\n\nexport type AcceptInvitationVariables = {\n input: {\n token: string;\n password: string;\n passwordConfirmation: string;\n };\n};\n\nexport type BeginAuthenticationVariables = {\n email: string;\n};\n\ntype MutationCommitConfig<TVariables, TResponse> = {\n variables: TVariables;\n onCompleted?: (\n response: TResponse,\n errors: readonly PayloadError[] | null,\n ) => void;\n onError?: (error: Error) => void;\n};\n\ntype MutationCommit<TVariables, TResponse> = (\n config: MutationCommitConfig<TVariables, TResponse>,\n) => void;\n\ntype MutationEntry<TVariables, TResponse> = {\n commit: MutationCommit<TVariables, TResponse>;\n isInFlight: boolean;\n};\n\nexport type AuthMutationHooks = {\n login: MutationEntry<LoginVariables, LoginResponse>;\n logout: MutationEntry<LogoutVariables, LogoutResponse>;\n completeMfa: MutationEntry<CompleteMfaVariables, CompleteMfaResponse>;\n beginPasskeyLogin: MutationEntry<\n BeginPasskeyLoginVariables,\n BeginPasskeyLoginResponse\n >;\n finishPasskeyLogin: MutationEntry<\n FinishPasskeyLoginVariables,\n FinishPasskeyLoginResponse\n >;\n acceptInvitation?: MutationEntry<\n AcceptInvitationVariables,\n AcceptInvitationResponse\n >;\n beginAuthentication: MutationEntry<\n BeginAuthenticationVariables,\n BeginAuthenticationResponse\n >;\n};\n\ninterface User {\n id: string;\n}\n\nexport type LoginStatus = 'success' | 'mfa-required' | 'error';\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface TotpCredentials {\n code: string;\n}\n\nexport interface AcceptInvitationCredentials {\n token: string;\n password: string;\n passwordConfirmation: string;\n}\n\nexport interface AuthError {\n message: string;\n code?: string;\n}\n\nexport interface UseAuthReturn {\n authMethod: AuthMethod | null;\n challengeToken: string | null;\n nextStep: LoginNextStep | null;\n mfaLevel: MfaLevel | null;\n emailHint: string | null;\n lockedUntil: string | null;\n availableMethods: AuthMethod[];\n login: (credentials: LoginCredentials) => Promise<LoginStatus>;\n loginWithPasskey: (params: { email: string }) => Promise<LoginStatus>;\n completeMfa: (credentials: TotpCredentials) => Promise<void>;\n acceptInvitation: (\n credentials: AcceptInvitationCredentials,\n ) => Promise<LoginStatus>;\n beginAuthentication: (\n email: string,\n ) => Promise<{ methods: AuthMethod[]; lockedUntil: string | null }>;\n logout: () => Promise<void>;\n reset: () => void;\n clearError: () => void;\n isLoading: boolean;\n error: AuthError | null;\n user: User | null;\n}\n\nconst initialState = {\n authMethod: null as AuthMethod | null,\n challengeToken: null as string | null,\n emailHint: null as string | null,\n mfaLevel: null as MfaLevel | null,\n nextStep: null as LoginNextStep | null,\n};\n\nexport const createUseAuth = (mutations: AuthMutationHooks) => {\n return (): UseAuthReturn => {\n const { t } = useBackofficeReactTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n const [user, setUser] = useState<User | null>(null);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [availableMethods, setAvailableMethods] = useState<AuthMethod[]>([]);\n const [authState, setAuthState] = useState(initialState);\n\n const commitLoginMutation = mutations.login.commit;\n const commitLogoutMutation = mutations.logout.commit;\n const commitCompleteMfaMutation = mutations.completeMfa.commit;\n const commitBeginPasskeyLoginMutation = mutations.beginPasskeyLogin.commit;\n const commitFinishPasskeyLoginMutation =\n mutations.finishPasskeyLogin.commit;\n const commitAcceptInvitationMutation = mutations.acceptInvitation?.commit;\n const commitBeginAuthenticationMutation =\n mutations.beginAuthentication.commit;\n\n const defaultLoginErrorMessage = t('auth.loginFlow.errors.tryAgain');\n const defaultBeginAuthenticationErrorMessage = t(\n 'auth.loginFlow.errors.tryAgain',\n );\n const defaultPasskeyErrorMessage = t('auth.passkey.errors.failed');\n const defaultMfaErrorMessage = t('auth.mfa.errors.verificationFailed');\n const defaultInvitationErrorMessage = t(\n 'auth.acceptInvitation.errors.default',\n );\n const mfaInvalidChallengeMessage = t('auth.mfa.errors.invalidChallenge');\n const passkeyNotAvailableMessage = t('auth.passkey.errors.notAvailable');\n const defaultLogoutErrorMessage = 'Logout failed.';\n\n const reset = useCallback(() => {\n setError(null);\n setUser(null);\n setLockedUntil(null);\n setAvailableMethods([]);\n setAuthState(initialState);\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const updateAuthStateFromPayload = useCallback(\n (payload: AuthPayload): LoginStatus => {\n const authMethod = payload.authMethod ?? null;\n const challengeToken = payload.challengeToken ?? null;\n const mfaLevel = payload.mfaLevel ?? null;\n const nextStep = payload.nextStep ?? null;\n\n setAuthState((prev) => {\n return {\n ...prev,\n authMethod,\n challengeToken,\n mfaLevel,\n nextStep,\n };\n });\n\n if (payload.loggedInUser != null && nextStep == null) {\n setUser({\n id: payload.loggedInUser.id,\n });\n return 'success';\n }\n\n if (nextStep === 'TOTP' && challengeToken != null) {\n return 'mfa-required';\n }\n\n return 'error';\n },\n [],\n );\n\n const isMutationPayload = useCallback(\n (value: unknown): value is MutationPayloadBase => {\n return (\n value != null &&\n typeof value === 'object' &&\n ('status' in value || 'result' in value)\n );\n },\n [],\n );\n\n const mapLoginReason = useCallback(\n (reason: LoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CREDENTIALS':\n return t('auth.loginFlow.errors.invalidCredentials');\n case 'ACCOUNT_LOCKED':\n return t('auth.loginFlow.errors.accountLocked');\n case 'RATE_LIMITED':\n return t('auth.loginFlow.errors.rateLimited');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginAuthenticationReason = useCallback(\n (reason: BeginAuthenticationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.loginFlow.errors.invalidEmail');\n case 'INTERNAL_ERROR':\n return t('auth.loginFlow.errors.tryAgain');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapBeginPasskeyLoginReason = useCallback(\n (reason: BeginPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.passkey.errors.invalidEmail');\n case 'PASSKEY_NOT_FOUND':\n return t('auth.passkey.errors.notFound');\n case 'PASSKEY_NOT_SUPPORTED':\n return t('auth.passkey.errors.notAvailable');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapFinishPasskeyLoginReason = useCallback(\n (reason: FinishPasskeyLoginErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.passkey.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.passkey.errors.challengeExpired');\n case 'INVALID_ASSERTION':\n return t('auth.passkey.errors.invalidAssertion');\n case 'INTERNAL_ERROR':\n return t('auth.passkey.errors.failed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapCompleteMfaReason = useCallback(\n (reason: CompleteMfaErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_CHALLENGE_TOKEN':\n return t('auth.mfa.errors.invalidChallenge');\n case 'CHALLENGE_EXPIRED':\n return t('auth.mfa.errors.expired');\n case 'INVALID_CODE':\n return t('auth.mfa.errors.invalidCode');\n case 'TOO_MANY_ATTEMPTS':\n return t('auth.mfa.errors.tooManyAttempts');\n case 'INTERNAL_ERROR':\n return t('auth.mfa.errors.verificationFailed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const mapAcceptInvitationReason = useCallback(\n (reason: AcceptInvitationErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return t('auth.acceptInvitation.errors.invalidToken');\n case 'TOKEN_EXPIRED':\n return t('auth.acceptInvitation.errors.expired');\n case 'ALREADY_ACCEPTED':\n return t('auth.acceptInvitation.errors.alreadyAccepted');\n case 'PASSWORD_MISMATCH':\n return t('auth.acceptInvitation.errors.passwordMismatch');\n case 'PASSWORD_POLICY_VIOLATION':\n return t('auth.acceptInvitation.errors.passwordPolicyViolation');\n case 'RATE_LIMITED':\n return t('auth.acceptInvitation.errors.rateLimited');\n case 'EMAIL_MISMATCH':\n return t('auth.acceptInvitation.errors.emailMismatch');\n case 'INTERNAL_ERROR':\n return t('auth.acceptInvitation.errors.default');\n default:\n return null;\n }\n },\n [t],\n );\n\n const beginAuthentication = useCallback(\n async (\n email: string,\n ): Promise<{ methods: AuthMethod[]; lockedUntil: string | null }> => {\n return new Promise((resolve, reject) => {\n commitBeginAuthenticationMutation({\n variables: { email },\n onCompleted: (response) => {\n const rawPayload = response.beginAuthentication;\n let payload = rawPayload;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultBeginAuthenticationErrorMessage,\n mapReason: mapBeginAuthenticationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n payload = outcome.payload;\n }\n\n const methods = payload.methods.map((item) => {\n return item.method;\n });\n const locked = payload.lockedUntil ?? null;\n setAvailableMethods(methods);\n setLockedUntil(locked);\n resolve({ methods, lockedUntil: locked });\n },\n onError: () => {\n const authError: AuthError = {\n message: defaultBeginAuthenticationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginAuthenticationMutation,\n defaultBeginAuthenticationErrorMessage,\n isMutationPayload,\n mapBeginAuthenticationReason,\n ],\n );\n\n const login = useCallback(\n async (credentials: LoginCredentials): Promise<LoginStatus> => {\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: credentials.email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitLoginMutation({\n variables: {\n input: credentials,\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.login;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLoginErrorMessage,\n mapReason: mapLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLoginErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitLoginMutation,\n defaultLoginErrorMessage,\n isMutationPayload,\n mapLoginReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const completeMfa = useCallback(\n async (credentials: TotpCredentials): Promise<void> => {\n const { challengeToken } = authState;\n if (challengeToken == null) {\n const authError: AuthError = {\n message: mfaInvalidChallengeMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitCompleteMfaMutation({\n variables: {\n input: {\n challengeToken,\n code: credentials.code,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.completeMfa;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultMfaErrorMessage,\n mapReason: mapCompleteMfaReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve();\n return;\n }\n\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultMfaErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n authState,\n commitCompleteMfaMutation,\n defaultMfaErrorMessage,\n isMutationPayload,\n mapCompleteMfaReason,\n mfaInvalidChallengeMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const loginWithPasskey = useCallback(\n async ({ email }: { email: string }): Promise<LoginStatus> => {\n if (typeof window === 'undefined') {\n const authError: AuthError = {\n message: passkeyNotAvailableMessage,\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n setAuthState((prev) => {\n return {\n ...prev,\n emailHint: email,\n };\n });\n\n return new Promise((resolve, reject) => {\n commitBeginPasskeyLoginMutation({\n variables: {\n email,\n },\n onCompleted: (response) => {\n const rawOptions = response.beginPasskeyLogin;\n let options = rawOptions;\n\n if (isMutationPayload(rawOptions)) {\n const outcome = resolveMutationOutcome(rawOptions, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapBeginPasskeyLoginReason,\n });\n if (!outcome.ok) {\n setIsLoading(false);\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n options = outcome.payload;\n }\n\n const continuePasskeyLogin = async (): Promise<void> => {\n try {\n const assertion = (await navigator.credentials.get({\n publicKey: {\n allowCredentials: options.allowCredentials.map(\n (credentialId) => {\n return {\n id: base64UrlToBuffer(credentialId),\n type: 'public-key' as const,\n };\n },\n ),\n challenge: base64UrlToBuffer(options.challenge),\n rpId: options.rpId,\n userVerification: 'preferred',\n },\n })) as PublicKeyCredential | null;\n\n if (assertion == null) {\n throw new Error(\n 'No credential returned by the authenticator.',\n );\n }\n\n const assertionResponse =\n assertion.response as AuthenticatorAssertionResponse;\n const signCount = parseSignCount(\n assertionResponse.authenticatorData,\n );\n\n commitFinishPasskeyLoginMutation({\n variables: {\n input: {\n challenge: options.challenge,\n challengeToken: options.challengeToken,\n credentialId: assertion.id,\n signCount,\n userHandle:\n assertionResponse.userHandle != null\n ? bufferToBase64Url(assertionResponse.userHandle)\n : null,\n },\n },\n onCompleted: (finishResponse) => {\n setIsLoading(false);\n const rawPayload = finishResponse.finishPasskeyLogin;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultPasskeyErrorMessage,\n mapReason: mapFinishPasskeyLoginReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n } catch (credentialError) {\n setIsLoading(false);\n const authError: AuthError = {\n message:\n credentialError instanceof Error\n ? credentialError.message\n : 'Passkey login was cancelled.',\n };\n setError(authError);\n reject(authError);\n }\n };\n\n continuePasskeyLogin().catch(() => {\n return undefined;\n });\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultPasskeyErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitBeginPasskeyLoginMutation,\n commitFinishPasskeyLoginMutation,\n defaultPasskeyErrorMessage,\n isMutationPayload,\n mapBeginPasskeyLoginReason,\n mapFinishPasskeyLoginReason,\n passkeyNotAvailableMessage,\n updateAuthStateFromPayload,\n ],\n );\n\n const acceptInvitation = useCallback(\n async (\n credentials: AcceptInvitationCredentials,\n ): Promise<LoginStatus> => {\n if (commitAcceptInvitationMutation == null) {\n const authError: AuthError = {\n message: 'Invitation acceptance is not available.',\n };\n setError(authError);\n return Promise.reject(authError);\n }\n\n setIsLoading(true);\n setError(null);\n\n return new Promise((resolve, reject) => {\n commitAcceptInvitationMutation({\n variables: {\n input: {\n token: credentials.token,\n password: credentials.password,\n passwordConfirmation: credentials.passwordConfirmation,\n },\n },\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.acceptInvitation;\n let authPayload: AuthPayload | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultInvitationErrorMessage,\n mapReason: mapAcceptInvitationReason,\n });\n if (!outcome.ok) {\n const authError: AuthError = {\n message: outcome.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n authPayload = rawPayload.payload ?? null;\n } else {\n authPayload = rawPayload;\n }\n\n if (authPayload == null) {\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n const status = updateAuthStateFromPayload(authPayload);\n if (status === 'success' || status === 'mfa-required') {\n resolve(status);\n return;\n }\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultInvitationErrorMessage,\n };\n setError(authError);\n reject(authError);\n },\n });\n });\n },\n [\n commitAcceptInvitationMutation,\n defaultInvitationErrorMessage,\n isMutationPayload,\n mapAcceptInvitationReason,\n updateAuthStateFromPayload,\n ],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n\n return new Promise((resolve, reject) => {\n commitLogoutMutation({\n variables: {},\n onCompleted: (response) => {\n setIsLoading(false);\n const rawPayload = response.logout;\n let loggedOutValue: boolean | null = null;\n\n if (isMutationPayload(rawPayload)) {\n const outcome = resolveMutationOutcome(rawPayload, {\n defaultErrorMessage: defaultLogoutErrorMessage,\n });\n if (!outcome.ok) {\n const authError: AuthError = { message: outcome.message };\n setError(authError);\n reject(authError);\n return;\n }\n\n const loggedOutResult = requireField(\n rawPayload.payload?.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n } else {\n const loggedOutResult = requireField(\n rawPayload.loggedOut ?? null,\n defaultLogoutErrorMessage,\n );\n if (!loggedOutResult.ok) {\n const authError: AuthError = {\n message: loggedOutResult.message,\n };\n setError(authError);\n reject(authError);\n return;\n }\n loggedOutValue = loggedOutResult.value;\n }\n\n if (!loggedOutValue) {\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n reject(authError);\n return;\n }\n\n localStorage.removeItem('auth_token');\n localStorage.removeItem('remember_me');\n setUser(null);\n setAuthState(initialState);\n resetRelayStore();\n\n resolve();\n },\n onError: () => {\n setIsLoading(false);\n const authError: AuthError = {\n message: defaultLogoutErrorMessage,\n };\n setError(authError);\n resetRelayStore();\n\n reject(authError);\n },\n });\n });\n }, [commitLogoutMutation, defaultLogoutErrorMessage, isMutationPayload]);\n\n const combinedIsLoading =\n isLoading ||\n mutations.login.isInFlight ||\n mutations.logout.isInFlight ||\n mutations.completeMfa.isInFlight ||\n mutations.beginPasskeyLogin.isInFlight ||\n mutations.finishPasskeyLogin.isInFlight ||\n (mutations.acceptInvitation?.isInFlight ?? false) ||\n mutations.beginAuthentication.isInFlight;\n\n return {\n authMethod: authState.authMethod,\n challengeToken: authState.challengeToken,\n nextStep: authState.nextStep,\n mfaLevel: authState.mfaLevel,\n emailHint: authState.emailHint,\n login,\n loginWithPasskey,\n completeMfa,\n acceptInvitation,\n beginAuthentication,\n logout,\n reset,\n clearError,\n isLoading: combinedIsLoading,\n error,\n user,\n lockedUntil,\n availableMethods,\n };\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./useRelayEnvironment-vQ86aW-n.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as n } from "./useAuth-
|
|
2
|
+
import { r as t } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
3
|
+
import { t as n } from "./useAuth-BdSNpGqe.js";
|
|
4
4
|
import { useCallback as r, useMemo as i, useState as a } from "react";
|
|
5
5
|
import * as o from "react-relay";
|
|
6
6
|
//#region src/hooks/useBackofficeAuth.ts
|
|
@@ -86,4 +86,4 @@ function d() {
|
|
|
86
86
|
//#endregion
|
|
87
87
|
export { d as t };
|
|
88
88
|
|
|
89
|
-
//# sourceMappingURL=useBackofficeAuth-
|
|
89
|
+
//# sourceMappingURL=useBackofficeAuth-C16Euw2X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBackofficeAuth-BvEoEqnB.js","names":[],"sources":["../../src/hooks/useBackofficeAuth.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, PayloadError } from 'relay-runtime';\n\nimport {\n createUseAuth,\n type UseAuthReturn,\n type AcceptInvitationResponse,\n type AcceptInvitationVariables,\n type BeginAuthenticationResponse,\n type BeginAuthenticationVariables,\n type BeginPasskeyLoginResponse,\n type BeginPasskeyLoginVariables,\n type CompleteMfaResponse,\n type CompleteMfaVariables,\n type FinishPasskeyLoginResponse,\n type FinishPasskeyLoginVariables,\n type LoginResponse,\n type LoginVariables,\n type LogoutResponse,\n type LogoutVariables,\n} from './useAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { BackofficeLazyValue } from '../provider/lazyValue.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\n\nconst { commitMutation } = ReactRelay;\n\ntype MutationCommitConfig<TVariables, TResponse> = {\n variables: TVariables;\n onCompleted?: (\n response: TResponse,\n errors: readonly PayloadError[] | null,\n ) => void;\n onError?: (error: Error) => void;\n};\n\nconst toMutationLoadError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error('Unable to load auth mutation.');\n};\n\nconst useDeferredMutation = <TVariables extends object, TResponse>(\n loadMutation: () => Promise<GraphQLTaggedNode | null>,\n) => {\n const relayEnvironment = useRelayEnvironment();\n const [inFlightCount, setInFlightCount] = useState(0);\n\n const commit = useCallback(\n (config: MutationCommitConfig<TVariables, TResponse>) => {\n setInFlightCount((count) => {\n return count + 1;\n });\n\n const finish = () => {\n setInFlightCount((count) => {\n return Math.max(0, count - 1);\n });\n };\n\n loadMutation()\n .then((mutation) => {\n if (mutation == null) {\n throw new Error('Missing auth mutation config.');\n }\n\n commitMutation(relayEnvironment, {\n mutation,\n variables: config.variables,\n onCompleted: (response, errors) => {\n finish();\n config.onCompleted?.(response as TResponse, errors ?? null);\n },\n onError: (error) => {\n finish();\n config.onError?.(error);\n },\n });\n })\n .catch((error: unknown) => {\n finish();\n config.onError?.(toMutationLoadError(error));\n });\n },\n [loadMutation, relayEnvironment],\n );\n\n return {\n commit,\n isInFlight: inFlightCount > 0,\n };\n};\n\nconst loadOptionalMutation = async <TConfig>(\n eagerMutation: GraphQLTaggedNode | null | undefined,\n lazyConfig: BackofficeLazyValue<TConfig> | null | undefined,\n selectMutation: (config: TConfig) => GraphQLTaggedNode,\n): Promise<GraphQLTaggedNode | null> => {\n if (eagerMutation != null) {\n return eagerMutation;\n }\n if (lazyConfig == null) {\n return null;\n }\n const loadedConfig = await lazyConfig.load();\n return selectMutation(loadedConfig);\n};\n\n/**\n * Provides auth actions/state backed by Relay mutations from BackofficeProvider.\n */\nexport function useBackofficeAuth(): UseAuthReturn {\n const { auth: authConfig } = useBackofficeConfig();\n const { commit: commitLogin, isInFlight: isLoginInFlight } =\n useDeferredMutation<LoginVariables, LoginResponse>(\n useCallback(async () => {\n const loginConfig = authConfig.login.get();\n return loadOptionalMutation(\n loginConfig?.loginMutation,\n authConfig.login,\n (config) => {\n return config.loginMutation;\n },\n );\n }, [authConfig.login]),\n );\n const { commit: commitLogout, isInFlight: isLogoutInFlight } =\n useDeferredMutation<LogoutVariables, LogoutResponse>(\n useCallback(async () => {\n const logoutConfig = await authConfig.logout.load();\n return logoutConfig.logoutMutation;\n }, [authConfig.logout]),\n );\n const { commit: commitCompleteMfa, isInFlight: isCompleteMfaInFlight } =\n useDeferredMutation<CompleteMfaVariables, CompleteMfaResponse>(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.completeMfaMutation,\n authConfig.completeMfa,\n (config) => {\n return config.completeMfaMutation;\n },\n );\n }, [authConfig.completeMfa, authConfig.login]),\n );\n const {\n commit: commitBeginPasskeyLogin,\n isInFlight: isBeginPasskeyLoginInFlight,\n } = useDeferredMutation<\n BeginPasskeyLoginVariables,\n BeginPasskeyLoginResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.beginPasskeyLoginMutation,\n authConfig.passkeyLogin,\n (config) => {\n return config.beginPasskeyLoginMutation;\n },\n );\n }, [authConfig.login, authConfig.passkeyLogin]),\n );\n const {\n commit: commitFinishPasskeyLogin,\n isInFlight: isFinishPasskeyLoginInFlight,\n } = useDeferredMutation<\n FinishPasskeyLoginVariables,\n FinishPasskeyLoginResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.finishPasskeyLoginMutation,\n authConfig.passkeyLogin,\n (config) => {\n return config.finishPasskeyLoginMutation;\n },\n );\n }, [authConfig.login, authConfig.passkeyLogin]),\n );\n const {\n commit: commitBeginAuthentication,\n isInFlight: isBeginAuthenticationInFlight,\n } = useDeferredMutation<\n BeginAuthenticationVariables,\n BeginAuthenticationResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.beginAuthenticationMutation,\n authConfig.authentication,\n (config) => {\n return config.beginAuthenticationMutation;\n },\n );\n }, [authConfig.authentication, authConfig.login]),\n );\n const {\n commit: commitAcceptInvitation,\n isInFlight: isAcceptInvitationInFlight,\n } = useDeferredMutation<AcceptInvitationVariables, AcceptInvitationResponse>(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.acceptInvitationMutation,\n authConfig.acceptInvitation,\n (config) => {\n return config.acceptInvitationMutation;\n },\n );\n }, [authConfig.acceptInvitation, authConfig.login]),\n );\n const hasAcceptInvitationMutation =\n authConfig.login.get()?.acceptInvitationMutation != null ||\n authConfig.acceptInvitation != null;\n\n const useAuthWithMutations = useMemo(() => {\n let acceptInvitation:\n | {\n commit: typeof commitAcceptInvitation;\n isInFlight: boolean;\n }\n | undefined;\n if (hasAcceptInvitationMutation) {\n acceptInvitation = {\n commit: commitAcceptInvitation,\n isInFlight: isAcceptInvitationInFlight,\n };\n }\n return createUseAuth({\n login: { commit: commitLogin, isInFlight: isLoginInFlight },\n logout: { commit: commitLogout, isInFlight: isLogoutInFlight },\n completeMfa: {\n commit: commitCompleteMfa,\n isInFlight: isCompleteMfaInFlight,\n },\n beginPasskeyLogin: {\n commit: commitBeginPasskeyLogin,\n isInFlight: isBeginPasskeyLoginInFlight,\n },\n finishPasskeyLogin: {\n commit: commitFinishPasskeyLogin,\n isInFlight: isFinishPasskeyLoginInFlight,\n },\n beginAuthentication: {\n commit: commitBeginAuthentication,\n isInFlight: isBeginAuthenticationInFlight,\n },\n acceptInvitation,\n });\n }, [\n commitAcceptInvitation,\n commitBeginAuthentication,\n commitBeginPasskeyLogin,\n commitCompleteMfa,\n commitFinishPasskeyLogin,\n commitLogin,\n commitLogout,\n hasAcceptInvitationMutation,\n isAcceptInvitationInFlight,\n isBeginAuthenticationInFlight,\n isBeginPasskeyLoginInFlight,\n isCompleteMfaInFlight,\n isFinishPasskeyLoginInFlight,\n isLoginInFlight,\n isLogoutInFlight,\n ]);\n\n return useAuthWithMutations();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useBackofficeAuth-C16Euw2X.js","names":[],"sources":["../../src/hooks/useBackofficeAuth.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, PayloadError } from 'relay-runtime';\n\nimport {\n createUseAuth,\n type UseAuthReturn,\n type AcceptInvitationResponse,\n type AcceptInvitationVariables,\n type BeginAuthenticationResponse,\n type BeginAuthenticationVariables,\n type BeginPasskeyLoginResponse,\n type BeginPasskeyLoginVariables,\n type CompleteMfaResponse,\n type CompleteMfaVariables,\n type FinishPasskeyLoginResponse,\n type FinishPasskeyLoginVariables,\n type LoginResponse,\n type LoginVariables,\n type LogoutResponse,\n type LogoutVariables,\n} from './useAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { BackofficeLazyValue } from '../provider/lazyValue.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\n\nconst { commitMutation } = ReactRelay;\n\ntype MutationCommitConfig<TVariables, TResponse> = {\n variables: TVariables;\n onCompleted?: (\n response: TResponse,\n errors: readonly PayloadError[] | null,\n ) => void;\n onError?: (error: Error) => void;\n};\n\nconst toMutationLoadError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error('Unable to load auth mutation.');\n};\n\nconst useDeferredMutation = <TVariables extends object, TResponse>(\n loadMutation: () => Promise<GraphQLTaggedNode | null>,\n) => {\n const relayEnvironment = useRelayEnvironment();\n const [inFlightCount, setInFlightCount] = useState(0);\n\n const commit = useCallback(\n (config: MutationCommitConfig<TVariables, TResponse>) => {\n setInFlightCount((count) => {\n return count + 1;\n });\n\n const finish = () => {\n setInFlightCount((count) => {\n return Math.max(0, count - 1);\n });\n };\n\n loadMutation()\n .then((mutation) => {\n if (mutation == null) {\n throw new Error('Missing auth mutation config.');\n }\n\n commitMutation(relayEnvironment, {\n mutation,\n variables: config.variables,\n onCompleted: (response, errors) => {\n finish();\n config.onCompleted?.(response as TResponse, errors ?? null);\n },\n onError: (error) => {\n finish();\n config.onError?.(error);\n },\n });\n })\n .catch((error: unknown) => {\n finish();\n config.onError?.(toMutationLoadError(error));\n });\n },\n [loadMutation, relayEnvironment],\n );\n\n return {\n commit,\n isInFlight: inFlightCount > 0,\n };\n};\n\nconst loadOptionalMutation = async <TConfig>(\n eagerMutation: GraphQLTaggedNode | null | undefined,\n lazyConfig: BackofficeLazyValue<TConfig> | null | undefined,\n selectMutation: (config: TConfig) => GraphQLTaggedNode,\n): Promise<GraphQLTaggedNode | null> => {\n if (eagerMutation != null) {\n return eagerMutation;\n }\n if (lazyConfig == null) {\n return null;\n }\n const loadedConfig = await lazyConfig.load();\n return selectMutation(loadedConfig);\n};\n\n/**\n * Provides auth actions/state backed by Relay mutations from BackofficeProvider.\n */\nexport function useBackofficeAuth(): UseAuthReturn {\n const { auth: authConfig } = useBackofficeConfig();\n const { commit: commitLogin, isInFlight: isLoginInFlight } =\n useDeferredMutation<LoginVariables, LoginResponse>(\n useCallback(async () => {\n const loginConfig = authConfig.login.get();\n return loadOptionalMutation(\n loginConfig?.loginMutation,\n authConfig.login,\n (config) => {\n return config.loginMutation;\n },\n );\n }, [authConfig.login]),\n );\n const { commit: commitLogout, isInFlight: isLogoutInFlight } =\n useDeferredMutation<LogoutVariables, LogoutResponse>(\n useCallback(async () => {\n const logoutConfig = await authConfig.logout.load();\n return logoutConfig.logoutMutation;\n }, [authConfig.logout]),\n );\n const { commit: commitCompleteMfa, isInFlight: isCompleteMfaInFlight } =\n useDeferredMutation<CompleteMfaVariables, CompleteMfaResponse>(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.completeMfaMutation,\n authConfig.completeMfa,\n (config) => {\n return config.completeMfaMutation;\n },\n );\n }, [authConfig.completeMfa, authConfig.login]),\n );\n const {\n commit: commitBeginPasskeyLogin,\n isInFlight: isBeginPasskeyLoginInFlight,\n } = useDeferredMutation<\n BeginPasskeyLoginVariables,\n BeginPasskeyLoginResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.beginPasskeyLoginMutation,\n authConfig.passkeyLogin,\n (config) => {\n return config.beginPasskeyLoginMutation;\n },\n );\n }, [authConfig.login, authConfig.passkeyLogin]),\n );\n const {\n commit: commitFinishPasskeyLogin,\n isInFlight: isFinishPasskeyLoginInFlight,\n } = useDeferredMutation<\n FinishPasskeyLoginVariables,\n FinishPasskeyLoginResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.finishPasskeyLoginMutation,\n authConfig.passkeyLogin,\n (config) => {\n return config.finishPasskeyLoginMutation;\n },\n );\n }, [authConfig.login, authConfig.passkeyLogin]),\n );\n const {\n commit: commitBeginAuthentication,\n isInFlight: isBeginAuthenticationInFlight,\n } = useDeferredMutation<\n BeginAuthenticationVariables,\n BeginAuthenticationResponse\n >(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.beginAuthenticationMutation,\n authConfig.authentication,\n (config) => {\n return config.beginAuthenticationMutation;\n },\n );\n }, [authConfig.authentication, authConfig.login]),\n );\n const {\n commit: commitAcceptInvitation,\n isInFlight: isAcceptInvitationInFlight,\n } = useDeferredMutation<AcceptInvitationVariables, AcceptInvitationResponse>(\n useCallback(async () => {\n return loadOptionalMutation(\n authConfig.login.get()?.acceptInvitationMutation,\n authConfig.acceptInvitation,\n (config) => {\n return config.acceptInvitationMutation;\n },\n );\n }, [authConfig.acceptInvitation, authConfig.login]),\n );\n const hasAcceptInvitationMutation =\n authConfig.login.get()?.acceptInvitationMutation != null ||\n authConfig.acceptInvitation != null;\n\n const useAuthWithMutations = useMemo(() => {\n let acceptInvitation:\n | {\n commit: typeof commitAcceptInvitation;\n isInFlight: boolean;\n }\n | undefined;\n if (hasAcceptInvitationMutation) {\n acceptInvitation = {\n commit: commitAcceptInvitation,\n isInFlight: isAcceptInvitationInFlight,\n };\n }\n return createUseAuth({\n login: { commit: commitLogin, isInFlight: isLoginInFlight },\n logout: { commit: commitLogout, isInFlight: isLogoutInFlight },\n completeMfa: {\n commit: commitCompleteMfa,\n isInFlight: isCompleteMfaInFlight,\n },\n beginPasskeyLogin: {\n commit: commitBeginPasskeyLogin,\n isInFlight: isBeginPasskeyLoginInFlight,\n },\n finishPasskeyLogin: {\n commit: commitFinishPasskeyLogin,\n isInFlight: isFinishPasskeyLoginInFlight,\n },\n beginAuthentication: {\n commit: commitBeginAuthentication,\n isInFlight: isBeginAuthenticationInFlight,\n },\n acceptInvitation,\n });\n }, [\n commitAcceptInvitation,\n commitBeginAuthentication,\n commitBeginPasskeyLogin,\n commitCompleteMfa,\n commitFinishPasskeyLogin,\n commitLogin,\n commitLogout,\n hasAcceptInvitationMutation,\n isAcceptInvitationInFlight,\n isBeginAuthenticationInFlight,\n isBeginPasskeyLoginInFlight,\n isCompleteMfaInFlight,\n isFinishPasskeyLoginInFlight,\n isLoginInFlight,\n isLogoutInFlight,\n ]);\n\n return useAuthWithMutations();\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { r as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
2
2
|
//#region src/provider/useBackofficeLazyValue.ts
|
|
3
3
|
var t = (e) => {
|
|
4
4
|
if (e == null) return null;
|
|
@@ -28,4 +28,4 @@ var t = (e) => {
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { o as a, a as i, i as n, r, n as t };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=useBackofficeLazyValue-
|
|
31
|
+
//# sourceMappingURL=useBackofficeLazyValue-Bh_13h8A.js.map
|
package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js.map → useBackofficeLazyValue-Bh_13h8A.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBackofficeLazyValue-
|
|
1
|
+
{"version":3,"file":"useBackofficeLazyValue-Bh_13h8A.js","names":[],"sources":["../../src/provider/useBackofficeLazyValue.ts"],"sourcesContent":["import type { BackofficeDashboardConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from './BackofficeConfigContext.js';\nimport type {\n BackofficeResolvedAuthLoginConfig,\n BackofficeResolvedAuthLogoutConfig,\n BackofficeResolvedAuthPasswordResetCompleteConfig,\n BackofficeResolvedAuthPasswordResetRequestConfig,\n BackofficeResolvedAuthSessionConfig,\n BackofficeResolvedAuthVerifyEmailConfig,\n} from './types.js';\nimport type { BackofficeLazyValue } from './lazyValue.js';\n\nconst useResolvedLazyValue = <TValue>(\n resource: BackofficeLazyValue<TValue> | null | undefined,\n): TValue | null => {\n if (resource == null) {\n return null;\n }\n const loadedValue = resource.get();\n if (loadedValue != null) {\n return loadedValue;\n }\n // React Suspense expects a pending promise to be thrown while the lazy value loads.\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw resource.load();\n};\n\nexport const useBackofficeAuthSessionConfig =\n (): BackofficeResolvedAuthSessionConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.session);\n if (resolved == null) {\n throw new Error('Missing backoffice auth session config.');\n }\n return resolved;\n };\n\nexport const useBackofficeAuthLoginConfig =\n (): BackofficeResolvedAuthLoginConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.login);\n if (resolved == null) {\n throw new Error('Missing backoffice auth login config.');\n }\n return resolved;\n };\n\nexport const useBackofficeAuthLogoutConfig =\n (): BackofficeResolvedAuthLogoutConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.logout);\n if (resolved == null) {\n throw new Error('Missing backoffice logout auth config.');\n }\n return resolved;\n };\n\nexport const useBackofficeAuthPasswordResetRequestConfig =\n (): BackofficeResolvedAuthPasswordResetRequestConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.passwordResetRequest);\n if (resolved == null) {\n throw new Error('Missing backoffice password reset request auth config.');\n }\n return resolved;\n };\n\nexport const useBackofficeAuthPasswordResetCompleteConfig =\n (): BackofficeResolvedAuthPasswordResetCompleteConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.passwordResetComplete);\n if (resolved == null) {\n throw new Error(\n 'Missing backoffice password reset completion auth config.',\n );\n }\n return resolved;\n };\n\nexport const useBackofficeAuthVerifyEmailConfig =\n (): BackofficeResolvedAuthVerifyEmailConfig => {\n const { auth } = useBackofficeConfig();\n const resolved = useResolvedLazyValue(auth.verifyEmail);\n if (resolved == null) {\n throw new Error('Missing backoffice verify email auth config.');\n }\n return resolved;\n };\n\nexport const useBackofficeDashboardConfig =\n (): BackofficeDashboardConfig | null => {\n const { dashboard } = useBackofficeConfig();\n return useResolvedLazyValue(dashboard);\n };\n\nexport default useResolvedLazyValue;\n"],"mappings":";;AAaA,IAAM,KACJ,MACkB;AAClB,KAAI,KAAY,KACd,QAAO;CAET,IAAM,IAAc,EAAS,KAAK;AAClC,KAAI,KAAe,KACjB,QAAO;AAIT,OAAM,EAAS,MAAM;GAaV,UAC8B;CACvC,IAAM,EAAE,YAAS,GAAqB,EAChC,IAAW,EAAqB,EAAK,MAAM;AACjD,KAAI,KAAY,KACd,OAAU,MAAM,wCAAwC;AAE1D,QAAO;GAaE,UAC6C;CACtD,IAAM,EAAE,YAAS,GAAqB,EAChC,IAAW,EAAqB,EAAK,qBAAqB;AAChE,KAAI,KAAY,KACd,OAAU,MAAM,yDAAyD;AAE3E,QAAO;GAGE,UAC8C;CACvD,IAAM,EAAE,YAAS,GAAqB,EAChC,IAAW,EAAqB,EAAK,sBAAsB;AACjE,KAAI,KAAY,KACd,OAAU,MACR,4DACD;AAEH,QAAO;GAGE,UACoC;CAC7C,IAAM,EAAE,YAAS,GAAqB,EAChC,IAAW,EAAqB,EAAK,YAAY;AACvD,KAAI,KAAY,KACd,OAAU,MAAM,+CAA+C;AAEjE,QAAO;GAGE,UAC6B;CACtC,IAAM,EAAE,iBAAc,GAAqB;AAC3C,QAAO,EAAqB,EAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBackofficeListUrlState-D4fx5O7u.js","names":[],"sources":["../../src/hooks/useBackofficeListUrlState.ts"],"sourcesContent":["import { useCallback, useContext, useMemo } from 'react';\nimport { RoutingContext, useLocation } from '@plumile/router';\n\nimport type {\n BackofficeListState,\n BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\n\n/** Normalizes a router `location.search` string into URLSearchParams. */\nfunction normalizeSearch(value: string): URLSearchParams {\n if (value.trim() === '') {\n return new URLSearchParams();\n }\n return new URLSearchParams(value);\n}\n\ntype ReturnValue<Where extends Record<string, unknown>, Sort extends string> = {\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n};\n\n/** Keeps list state in sync with the URL search params for backoffice pages. */\nexport function useBackofficeListUrlState<\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n config: BackofficeResolvedListFacetConfig<Where, Sort>,\n): ReturnValue<Where, Sort> {\n const routing = useContext(RoutingContext);\n const { hash, pathname, search } = useLocation();\n const fallbackState = useMemo(() => {\n return {\n where: null,\n sort: null,\n }
|
|
1
|
+
{"version":3,"file":"useBackofficeListUrlState-D4fx5O7u.js","names":[],"sources":["../../src/hooks/useBackofficeListUrlState.ts"],"sourcesContent":["import { useCallback, useContext, useMemo } from 'react';\nimport { RoutingContext, useLocation } from '@plumile/router';\n\nimport type {\n BackofficeListState,\n BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\n\n/** Normalizes a router `location.search` string into URLSearchParams. */\nfunction normalizeSearch(value: string): URLSearchParams {\n if (value.trim() === '') {\n return new URLSearchParams();\n }\n return new URLSearchParams(value);\n}\n\ntype ReturnValue<Where extends Record<string, unknown>, Sort extends string> = {\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n};\n\n/** Keeps list state in sync with the URL search params for backoffice pages. */\nexport function useBackofficeListUrlState<\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n config: BackofficeResolvedListFacetConfig<Where, Sort>,\n): ReturnValue<Where, Sort> {\n const routing = useContext(RoutingContext);\n const { hash, pathname, search } = useLocation();\n const fallbackState = useMemo(() => {\n return {\n where: null,\n sort: null,\n };\n }, []);\n\n const state = useMemo(() => {\n if (config.listUrlCodec == null) {\n return fallbackState;\n }\n return config.listUrlCodec.parse(normalizeSearch(search));\n }, [config.listUrlCodec, fallbackState, search]);\n\n const pushState = useCallback(\n (next: BackofficeListState<Where, Sort>) => {\n if (routing == null) {\n return;\n }\n if (config.listUrlCodec == null) {\n return;\n }\n\n const params = config.listUrlCodec.serialize(next);\n const qs = params.toString();\n\n let nextSearch = '';\n if (qs !== '') {\n nextSearch = `?${qs}`;\n }\n\n routing.history.push({\n pathname,\n search: nextSearch,\n hash,\n });\n },\n [config.listUrlCodec, hash, pathname, routing],\n );\n\n return { state, pushState };\n}\n"],"mappings":";;;AASA,SAAS,EAAgB,GAAgC;AAIvD,QAHI,EAAM,MAAM,KAAK,KACZ,IAAI,iBAAiB,GAEvB,IAAI,gBAAgB,EAAM;;AASnC,SAAgB,EAId,GAC0B;CAC1B,IAAM,IAAU,EAAW,EAAe,EACpC,EAAE,SAAM,aAAU,cAAW,GAAa,EAC1C,IAAgB,SACb;EACL,OAAO;EACP,MAAM;EACP,GACA,EAAE,CAAC;AAmCN,QAAO;EAAE,OAjCK,QACR,EAAO,gBAAgB,OAClB,IAEF,EAAO,aAAa,MAAM,EAAgB,EAAO,CAAC,EACxD;GAAC,EAAO;GAAc;GAAe;GAAO,CA4BtC;EAAO,WA1BE,GACf,MAA2C;AAI1C,OAHI,KAAW,QAGX,EAAO,gBAAgB,KACzB;GAIF,IAAM,IADS,EAAO,aAAa,UAAU,EAClC,CAAO,UAAU,EAExB,IAAa;AAKjB,GAJI,MAAO,OACT,IAAa,IAAI,MAGnB,EAAQ,QAAQ,KAAK;IACnB;IACA,QAAQ;IACR;IACD,CAAC;KAEJ;GAAC,EAAO;GAAc;GAAM;GAAU;GAAQ,CAGhC;EAAW"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createContext as e, useContext as t } from "react";
|
|
2
|
+
import { useTranslation as n } from "react-i18next";
|
|
3
|
+
//#region src/provider/BackofficeConfigContext.tsx
|
|
4
|
+
var r = e(null), i = r.Provider;
|
|
5
|
+
function a() {
|
|
6
|
+
let e = t(r);
|
|
7
|
+
if (e == null) throw Error("BackofficeProvider is missing in the component tree.");
|
|
8
|
+
return e;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/i18n/useBackofficeReactTranslation.ts
|
|
12
|
+
function o() {
|
|
13
|
+
return n("backofficeReact");
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { i as n, a as r, o as t };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=useBackofficeReactTranslation-Btt58EIo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBackofficeReactTranslation-Btt58EIo.js","names":[],"sources":["../../src/provider/BackofficeConfigContext.tsx","../../src/i18n/useBackofficeReactTranslation.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardModule,\n BackofficeGraphQLConfig,\n BackofficeSidebarConfig,\n} from './types.js';\nimport type { BackofficeEntityRegistry } from './entityRegistry.js';\n\nexport type BackofficeConfigContextValue = {\n basePath: string;\n entities: BackofficeEntityManifestMap;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n filterColumnAliases?: Record<string, string>;\n sidebar?: BackofficeSidebarConfig;\n dashboard?: BackofficeDashboardModule;\n auth: BackofficeAuthConfig;\n graphql: BackofficeGraphQLConfig;\n};\n\nconst BackofficeConfigContext =\n createContext<BackofficeConfigContextValue | null>(null);\n\nexport const BackofficeConfigProvider = BackofficeConfigContext.Provider;\n\n/**\n * Hook to access the Backoffice configuration context\n */\nexport function useBackofficeConfig(): BackofficeConfigContextValue {\n const context = useContext(BackofficeConfigContext);\n if (context == null) {\n throw new Error('BackofficeProvider is missing in the component tree.');\n }\n return context;\n}\n\nexport default BackofficeConfigContext;\n","import { useTranslation } from 'react-i18next';\n\n/** Returns i18n helpers bound to the backofficeReact namespace. */\nexport function useBackofficeReactTranslation(): ReturnType<\n typeof useTranslation\n> {\n return useTranslation('backofficeReact');\n}\n"],"mappings":";;;AAwBA,IAAM,IACJ,EAAmD,KAAK,EAE7C,IAA2B,EAAwB;AAKhE,SAAgB,IAAoD;CAClE,IAAM,IAAU,EAAW,EAAwB;AACnD,KAAI,KAAW,KACb,OAAU,MAAM,uDAAuD;AAEzE,QAAO;;;;AClCT,SAAgB,IAEd;AACA,QAAO,EAAe,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeListFilterContext.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/scaffolds/BackofficeListFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,mBAAmB,EACnB,iCAAiC,EAClC,MAAM,mCAAmC,CAAC;AAI3C,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,iCAAiC,CAAC;IAC1C,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,SAAS,EAAE,CACT,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KACvD,IAAI,CAAC;IACV,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,KACrB,IAAI,CAAC;IACV,eAAe,EAAE,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,KACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAEF,QAAA,MAAM,2BAA2B,kEAC6B,CAAC;AAE/D,KAAK,aAAa,CAChB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,SAAS,MAAM,IACjB;IACF,MAAM,EAAE,iCAAiC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvD,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxC,SAAS,EAAE,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,SAAS,MAAM,EAEnB,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAChC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"BackofficeListFilterContext.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/scaffolds/BackofficeListFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,mBAAmB,EACnB,iCAAiC,EAClC,MAAM,mCAAmC,CAAC;AAI3C,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,iCAAiC,CAAC;IAC1C,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,SAAS,EAAE,CACT,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KACvD,IAAI,CAAC;IACV,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,KACrB,IAAI,CAAC;IACV,eAAe,EAAE,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,KACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAEF,QAAA,MAAM,2BAA2B,kEAC6B,CAAC;AAE/D,KAAK,aAAa,CAChB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,SAAS,MAAM,IACjB;IACF,MAAM,EAAE,iCAAiC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvD,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxC,SAAS,EAAE,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IAC5D,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,SAAS,MAAM,EAEnB,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAChC,GAAG,CAAC,OA4CN,CAAC;AAEF,eAAO,MAAM,8BAA8B,QACrC,gCAAgC,GAAG,IAEtC,CAAC;AAEJ,eAAe,2BAA2B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConditionalSubscription.d.ts","sourceRoot":"","sources":["../../../src/hooks/useConditionalSubscription.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;CACrC,CAAC;AAEF,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"useConditionalSubscription.d.ts","sourceRoot":"","sources":["../../../src/hooks/useConditionalSubscription.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9E,KAAK,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;CACrC,CAAC;AAEF,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAkBF,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,aAAa,EAChE,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC,EACpC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,gCAAgC,CAoFlC"}
|