@plumile/backoffice-react 0.1.88 → 0.1.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/lib/esm/{AcceptInvitationScreen-dnOvRx4Z.js → AcceptInvitationScreen-DLc4aovr.js} +8 -7
  2. package/lib/esm/AcceptInvitationScreen-DLc4aovr.js.map +1 -0
  3. package/lib/esm/{AuthPanel-DiHejPoq.js → AuthPanel-BaIRFGbX.js} +2 -2
  4. package/lib/esm/{AuthPanel-DiHejPoq.js.map → AuthPanel-BaIRFGbX.js.map} +1 -1
  5. package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js → BackofficeAcceptInvitationPage-D0dZnrV7.js} +4 -4
  6. package/lib/esm/{BackofficeAcceptInvitationPage-CGht2ka0.js.map → BackofficeAcceptInvitationPage-D0dZnrV7.js.map} +1 -1
  7. package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js → BackofficeDashboardPage-YWvoQODn.js} +33 -33
  8. package/lib/esm/{BackofficeDashboardPage-h1OWb_rV.js.map → BackofficeDashboardPage-YWvoQODn.js.map} +1 -1
  9. package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js → BackofficeDetailPayload-P61MDRLE.js} +2 -2
  10. package/lib/esm/{BackofficeDetailPayload-iVx66o_6.js.map → BackofficeDetailPayload-P61MDRLE.js.map} +1 -1
  11. package/lib/esm/{BackofficeEntityActionFormDialog-V4QXnvpy.js → BackofficeEntityActionFormDialog-BgRTJ_JS.js} +3 -4
  12. package/lib/esm/{BackofficeEntityActionFormDialog-V4QXnvpy.js.map → BackofficeEntityActionFormDialog-BgRTJ_JS.js.map} +1 -1
  13. package/lib/esm/{BackofficeEntityDetailPage-CIyGKwVP.js → BackofficeEntityDetailPage-DPFXbJxC.js} +34 -34
  14. package/lib/esm/{BackofficeEntityDetailPage-CIyGKwVP.js.map → BackofficeEntityDetailPage-DPFXbJxC.js.map} +1 -1
  15. package/lib/esm/{BackofficeEntityListPage-DmZozSNk.js → BackofficeEntityListPage-C8Ucmc_E.js} +3 -4
  16. package/lib/esm/{BackofficeEntityListPage-DmZozSNk.js.map → BackofficeEntityListPage-C8Ucmc_E.js.map} +1 -1
  17. package/lib/esm/{useBackofficeReactTranslation-WfXU8kCf.js → BackofficeErrorBoundary-BwRVSDHU.js} +3 -9
  18. package/lib/esm/BackofficeErrorBoundary-BwRVSDHU.js.map +1 -0
  19. package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js → BackofficeLayoutPage-j3VUX3Tu.js} +35 -35
  20. package/lib/esm/{BackofficeLayoutPage-DtFDn_nU.js.map → BackofficeLayoutPage-j3VUX3Tu.js.map} +1 -1
  21. package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js → BackofficeLoginPage-BkQHm0x6.js} +7 -6
  22. package/lib/esm/{BackofficeLoginPage-BvOPqbKO.js.map → BackofficeLoginPage-BkQHm0x6.js.map} +1 -1
  23. package/lib/esm/{BackofficePasswordResetCompletePage-ZLhghfhC.js → BackofficePasswordResetCompletePage-CF_0t3Nq.js} +4 -5
  24. package/lib/esm/BackofficePasswordResetCompletePage-CF_0t3Nq.js.map +1 -0
  25. package/lib/esm/{BackofficePasswordResetRequestPage-BLNHQD79.js → BackofficePasswordResetRequestPage-BJOrQXcy.js} +4 -4
  26. package/lib/esm/BackofficePasswordResetRequestPage-BJOrQXcy.js.map +1 -0
  27. package/lib/esm/{BackofficeVerifyEmailPage-BSTtLXdx.js → BackofficeVerifyEmailPage-C81LlsNM.js} +4 -5
  28. package/lib/esm/BackofficeVerifyEmailPage-C81LlsNM.js.map +1 -0
  29. package/lib/esm/{EntityFilterValue-B5ZGHO_u.js → EntityFilterValue-BWUdPBwp.js} +10 -9
  30. package/lib/esm/{EntityFilterValue-B5ZGHO_u.js.map → EntityFilterValue-BWUdPBwp.js.map} +1 -1
  31. package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js → EntityIdPickerDialog-Yhmr-WsV.js} +9 -9
  32. package/lib/esm/{EntityIdPickerDialog-DbTnDU4v.js.map → EntityIdPickerDialog-Yhmr-WsV.js.map} +1 -1
  33. package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js} +8 -7
  34. package/lib/esm/{LazyBackofficeEntityActionFormDialog-BE3wVfU6.js.map → LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map} +1 -1
  35. package/lib/esm/{PasswordResetCompleteScreen-B0P_tZg2.js → PasswordResetCompleteScreen-Cgg96DPo.js} +6 -5
  36. package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +1 -0
  37. package/lib/esm/{PasswordResetRequestScreen-p9s0dblR.js → PasswordResetRequestScreen-I1nFvGLd.js} +6 -5
  38. package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +1 -0
  39. package/lib/esm/{VerifyEmailScreen--9lxOGlW.js → VerifyEmailScreen-Br5KyHjg.js} +7 -6
  40. package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +1 -0
  41. package/lib/esm/backoffice-react.js +843 -1012
  42. package/lib/esm/backoffice-react.js.map +1 -1
  43. package/lib/esm/loginPage.css-B7Io_DuU.js +6 -0
  44. package/lib/esm/loginPage.css-B7Io_DuU.js.map +1 -0
  45. package/lib/esm/{synchronizeAuthStatusQuery-By_lNCnP.js → synchronizeAuthStatusQuery-1juorUEX.js} +47 -46
  46. package/lib/esm/synchronizeAuthStatusQuery-1juorUEX.js.map +1 -0
  47. package/lib/esm/{useAuth-OVPPa9bO.js → useAuth-BdSNpGqe.js} +43 -42
  48. package/lib/esm/useAuth-BdSNpGqe.js.map +1 -0
  49. package/lib/esm/{useBackofficeAuth-BvEoEqnB.js → useBackofficeAuth-C16Euw2X.js} +3 -3
  50. package/lib/esm/{useBackofficeAuth-BvEoEqnB.js.map → useBackofficeAuth-C16Euw2X.js.map} +1 -1
  51. package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js → useBackofficeLazyValue-Bh_13h8A.js} +2 -2
  52. package/lib/esm/{useBackofficeLazyValue-Dnii1_dE.js.map → useBackofficeLazyValue-Bh_13h8A.js.map} +1 -1
  53. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js +18 -0
  54. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +1 -0
  55. package/lib/types/hooks/useBackofficeSessionAuth.d.ts.map +1 -1
  56. package/lib/types/i18n/resources.d.ts +211 -409
  57. package/lib/types/i18n/resources.d.ts.map +1 -1
  58. package/lib/types/pages/BackofficeLoginPage.d.ts.map +1 -1
  59. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  60. package/lib/types/provider/types.d.ts +4 -0
  61. package/lib/types/provider/types.d.ts.map +1 -1
  62. package/package.json +7 -5
  63. package/lib/esm/AcceptInvitationScreen-dnOvRx4Z.js.map +0 -1
  64. package/lib/esm/BackofficeConfigContext-R0t1owTI.js +0 -12
  65. package/lib/esm/BackofficeConfigContext-R0t1owTI.js.map +0 -1
  66. package/lib/esm/BackofficePasswordResetCompletePage-ZLhghfhC.js.map +0 -1
  67. package/lib/esm/BackofficePasswordResetRequestPage-BLNHQD79.js.map +0 -1
  68. package/lib/esm/BackofficeVerifyEmailPage-BSTtLXdx.js.map +0 -1
  69. package/lib/esm/PasswordResetCompleteScreen-B0P_tZg2.js.map +0 -1
  70. package/lib/esm/PasswordResetRequestScreen-p9s0dblR.js.map +0 -1
  71. package/lib/esm/VerifyEmailScreen--9lxOGlW.js.map +0 -1
  72. package/lib/esm/loginPage.css-CBJ1Ozm5.js +0 -12
  73. package/lib/esm/loginPage.css-CBJ1Ozm5.js.map +0 -1
  74. package/lib/esm/synchronizeAuthStatusQuery-By_lNCnP.js.map +0 -1
  75. package/lib/esm/useAuth-OVPPa9bO.js.map +0 -1
  76. package/lib/esm/useBackofficeReactTranslation-WfXU8kCf.js.map +0 -1
  77. package/lib/types/i18n/useSharedTranslation.d.ts +0 -3
  78. package/lib/types/i18n/useSharedTranslation.d.ts.map +0 -1
@@ -0,0 +1,6 @@
1
+ //#region src/auth/login/loginPage.css.ts
2
+ var e = "txvbqb9ip txvbqbai7 txvbqbaop", t = "txvbqb9ip txvbqbai7 txvbqbu7g", n = "txvbqbvbd txvbqb8y txvbqbfcp txvbqbf5y", r = "txvbqbcp txvbqb9ip txvbqbajy txvbqbaog txvbqbdpp txvbqbhyg", i = "w8yhmy0 txvbqbvaz txvbqbamp txvbqb78 txvbqb6x txvbqb7k", a = "txvbqbnwy txvbqbok7 txvbqbp7g txvbqblz7 txvbqb767 txvbqb73g txvbqb7d7 txvbqb7ag", o = "txvbqb9ip txvbqbai7 txvbqbaop", s = "txvbqbu7g", c = "txvbqbfcp txvbqb9p txvbqbamy txvbqbvaz txvbqbee7", l = "txvbqbhyp", u = "w8yhmy1 txvbqb107 txvbqb1dg txvbqb1qg txvbqbvaz txvbqbv5t txvbqb78 txvbqb6w txvbqb7k";
3
+ //#endregion
4
+ export { t as a, i as c, e as d, l as i, a as l, o as n, s as o, u as r, n as s, r as t, c as u };
5
+
6
+ //# sourceMappingURL=loginPage.css-B7Io_DuU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loginPage.css-B7Io_DuU.js","names":[],"sources":["../../src/auth/login/loginPage.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles, vars } from '@plumile/ui';\n\nexport const stack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const formSurface = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n});\n\nexport const helper = sprinkles({\n color: 'brandDarkGray',\n fontSize: 'sm',\n margin: 0,\n lineHeight: 1.6,\n});\n\nexport const divider = sprinkles({\n alignItems: 'center',\n color: 'brandDarkGray',\n display: 'flex',\n gap: 2,\n marginTop: 5,\n marginBottom: 3,\n});\n\nexport const dividerLine = sprinkles({\n backgroundColor: 'brandPrimaryRed',\n height: 'px',\n flex: 1,\n borderRadius: 'full',\n opacity: 35,\n});\n\nexport const actionsRow = sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n justifyContent: 'space-between',\n marginTop: 3,\n});\n\nexport const inlineLink = style([\n sprinkles({\n color: 'brandPrimaryRed',\n fontWeight: 'semibold',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n background: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'none',\n ':hover': {\n color: vars.colors.brandSecondaryOrange,\n textDecoration: 'underline',\n },\n },\n]);\n\nexport const panel = sprinkles({\n borderTopLeftRadius: 'none',\n borderTopRightRadius: 'none',\n borderBottomLeftRadius: '2xl',\n borderBottomRightRadius: '2xl',\n paddingX: 6,\n paddingY: 6,\n});\n\nexport const block = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const fullWidth = sprinkles({\n width: 'full',\n});\n\nexport const panelTitle = sprinkles({\n margin: 0,\n fontSize: 'xl',\n fontWeight: 'bold',\n color: 'brandPrimaryRed',\n letterSpacing: 'tight',\n});\n\nexport const footer = sprinkles({\n marginTop: 4,\n});\n\nexport const brandGhostButton = style([\n sprinkles({\n borderColor: 'brandPrimaryRed',\n borderWidth: 'px',\n borderStyle: 'solid',\n color: 'brandPrimaryRed',\n backgroundColor: 'brandLightGray',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: `color-mix(in srgb, ${vars.colors.brandPrimaryRed} 8%, transparent)`,\n color: vars.colors.brandSecondaryOrange,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n },\n },\n]);\n"],"mappings":""}
@@ -1,6 +1,7 @@
1
- import { a as e, c as t, d as n, f as r, o as i, r as a, s as o, t as s } from "./loginPage.css-CBJ1Ozm5.js";
2
- import { o as c } from "./useAuth-OVPPa9bO.js";
3
- import { t as l } from "./AuthPanel-DiHejPoq.js";
1
+ import { t as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
2
+ import { a as t, c as n, d as r, o as i, r as a, s as o, t as s } from "./loginPage.css-B7Io_DuU.js";
3
+ import { o as c } from "./useAuth-BdSNpGqe.js";
4
+ import { t as l } from "./AuthPanel-BaIRFGbX.js";
4
5
  import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
5
6
  import { Trans as h } from "react-i18next";
6
7
  import { AuthLayout as g, Button as _, FormError as v, FormField as y, LoginForm as b, cx as x } from "@plumile/ui";
@@ -8,7 +9,7 @@ import S from "relay-runtime";
8
9
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
9
10
  //#region src/auth/login/PasskeyLoginForm.tsx
10
11
  var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1, onShowMethods: f }) => {
11
- let { t: p } = r(), [h, g] = m(i.emailHint ?? ""), [b, x] = m(null);
12
+ let { t: p } = e(), [h, g] = m(i.emailHint ?? ""), [b, x] = m(null);
12
13
  d(() => {
13
14
  i.emailHint != null && i.emailHint !== "" ? g(i.emailHint) : c != null && c !== "" && g(c);
14
15
  }, [i.emailHint, c]);
@@ -39,11 +40,11 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
39
40
  p
40
41
  ]), T = b ?? i.error?.message ?? null;
41
42
  return /* @__PURE__ */ w("form", {
42
- className: e,
43
+ className: t,
43
44
  onSubmit: S,
44
45
  noValidate: !0,
45
46
  children: [/* @__PURE__ */ w("div", {
46
- className: n,
47
+ className: r,
47
48
  children: [
48
49
  /* @__PURE__ */ C("p", {
49
50
  className: o,
@@ -72,14 +73,14 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
72
73
  children: p(l ? "auth.passkey.actions.submitting" : "auth.passkey.actions.submit")
73
74
  }), f == null ? null : /* @__PURE__ */ C("button", {
74
75
  type: "button",
75
- className: t,
76
+ className: n,
76
77
  onClick: f,
77
78
  children: p("auth.passkey.actions.showMethods")
78
79
  })]
79
80
  })]
80
81
  });
81
82
  }, E = ({ email: s, methods: c, lockedUntil: l, onSelect: u, onBack: d }) => {
82
- let { t: f } = r(), p = c.length === 0, m = l == null ? f("auth.methodChooser.locked") : f("auth.methodChooser.lockedWithTime", { time: new Date(l).toLocaleString() }), g = c.map((e) => {
83
+ let { t: f } = e(), p = c.length === 0, m = l == null ? f("auth.methodChooser.locked") : f("auth.methodChooser.lockedWithTime", { time: new Date(l).toLocaleString() }), g = c.map((e) => {
83
84
  let t = e === "PASSKEY" ? f("auth.methodChooser.methods.passkey") : e === "PASSWORD" ? f("auth.methodChooser.methods.password") : f("auth.methodChooser.methods.other", { method: e.toLowerCase() });
84
85
  return /* @__PURE__ */ C(_, {
85
86
  type: "button",
@@ -92,9 +93,9 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
92
93
  }, e);
93
94
  });
94
95
  return /* @__PURE__ */ C("div", {
95
- className: e,
96
+ className: t,
96
97
  children: /* @__PURE__ */ w("div", {
97
- className: n,
98
+ className: r,
98
99
  children: [
99
100
  /* @__PURE__ */ C("p", {
100
101
  className: o,
@@ -110,16 +111,16 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
110
111
  type: "button",
111
112
  variant: "text",
112
113
  onClick: d,
113
- className: t,
114
+ className: n,
114
115
  children: f("auth.methodChooser.actions.back")
115
116
  })
116
117
  ]
117
118
  })
118
119
  });
119
- }, D = ({ email: n, errorMessage: i, isLoading: a, onEmailChange: c, onContinue: u, onForgotPassword: d }) => {
120
- let { t: f } = r();
120
+ }, D = ({ email: r, errorMessage: i, isLoading: a, onEmailChange: c, onContinue: u, onForgotPassword: d }) => {
121
+ let { t: f } = e();
121
122
  return /* @__PURE__ */ C(l, { children: /* @__PURE__ */ w("div", {
122
- className: e,
123
+ className: t,
123
124
  children: [
124
125
  /* @__PURE__ */ C("p", {
125
126
  className: o,
@@ -130,7 +131,7 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
130
131
  label: f("auth.emailCapture.emailLabel"),
131
132
  name: "email",
132
133
  type: "email",
133
- value: n,
134
+ value: r,
134
135
  onChange: (e) => {
135
136
  c(e.target.value);
136
137
  },
@@ -148,20 +149,20 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
148
149
  children: f("auth.emailCapture.continue")
149
150
  }), /* @__PURE__ */ C("button", {
150
151
  type: "button",
151
- className: t,
152
+ className: n,
152
153
  onClick: d,
153
154
  children: f("auth.emailCapture.forgotPassword")
154
155
  })]
155
156
  })
156
157
  ]
157
158
  }) });
158
- }, O = "/auth/oidc/start", k = ({ providers: e }) => {
159
- let { t } = r();
160
- return e.length === 0 ? null : /* @__PURE__ */ C("div", {
161
- className: n,
162
- children: e.map((e) => {
163
- let n = t("auth.oidc.buttons.generic");
164
- e === "GOOGLE" ? n = t("auth.oidc.buttons.google") : e === "APPLE" && (n = t("auth.oidc.buttons.apple"));
159
+ }, O = "/auth/oidc/start", k = ({ providers: t }) => {
160
+ let { t: n } = e();
161
+ return t.length === 0 ? null : /* @__PURE__ */ C("div", {
162
+ className: r,
163
+ children: t.map((e) => {
164
+ let t = n("auth.oidc.buttons.generic");
165
+ e === "GOOGLE" ? t = n("auth.oidc.buttons.google") : e === "APPLE" && (t = n("auth.oidc.buttons.apple"));
165
166
  let r = e.toLowerCase();
166
167
  return /* @__PURE__ */ C(_, {
167
168
  type: "button",
@@ -170,19 +171,19 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
170
171
  onClick: () => {
171
172
  window.location.assign(`${O}?provider=${r}`);
172
173
  },
173
- children: n
174
+ children: t
174
175
  }, e);
175
176
  })
176
177
  });
177
- }, A = ({ auth: n, defaultEmail: i, onForgotPassword: a, onSuccess: o, providers: c }) => {
178
- let { t: u } = r();
178
+ }, A = ({ auth: r, defaultEmail: i, onForgotPassword: a, onSuccess: o, providers: c }) => {
179
+ let { t: u } = e();
179
180
  return /* @__PURE__ */ C(l, {
180
181
  title: u("auth.passwordLogin.title"),
181
182
  children: /* @__PURE__ */ w("div", {
182
- className: e,
183
+ className: t,
183
184
  children: [
184
185
  /* @__PURE__ */ C(b, {
185
- auth: n,
186
+ auth: r,
186
187
  onSuccess: o,
187
188
  defaultEmail: i
188
189
  }),
@@ -190,7 +191,7 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
190
191
  className: s,
191
192
  children: /* @__PURE__ */ C("button", {
192
193
  type: "button",
193
- className: t,
194
+ className: n,
194
195
  onClick: a,
195
196
  children: u("auth.passwordLogin.forgotPassword")
196
197
  })
@@ -199,24 +200,24 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
199
200
  ]
200
201
  })
201
202
  });
202
- }, j = ({ auth: e, oidcProviders: t, onLoginSuccess: n, onForgotPassword: i }) => {
203
- let { t: a } = r(), [o, s] = m(""), [h, _] = m([]), [v, y] = m(null), [b, x] = m("email"), [S, w] = m(!1), [O, k] = m(null), j = p(!0), M = f(() => ({
204
- ...e,
205
- beginAuthentication: async (t) => {
206
- let n = await e.beginAuthentication(t);
207
- return s(t), _(n.methods), y(n.lockedUntil), n;
203
+ }, j = ({ auth: t, oidcProviders: n, onLoginSuccess: r, onForgotPassword: i }) => {
204
+ let { t: a } = e(), [o, s] = m(""), [h, _] = m([]), [v, y] = m(null), [b, x] = m("email"), [S, w] = m(!1), [O, k] = m(null), j = p(!0), M = f(() => ({
205
+ ...t,
206
+ beginAuthentication: async (e) => {
207
+ let n = await t.beginAuthentication(e);
208
+ return s(e), _(n.methods), y(n.lockedUntil), n;
208
209
  }
209
- }), [e]), N = u(({ force: t } = { force: !1 }) => {
210
- !t && e.nextStep === "TOTP" || n();
211
- }, [e.nextStep, n]), P = e.nextStep === "TOTP" || b === "mfa", F = a(P ? "auth.loginFlow.title.mfa" : "auth.loginFlow.title.default"), I = a(P ? "auth.loginFlow.subtitle.mfa" : "auth.loginFlow.subtitle.default"), L = u(async (t) => {
210
+ }), [t]), N = u(({ force: e } = { force: !1 }) => {
211
+ !e && t.nextStep === "TOTP" || r();
212
+ }, [t.nextStep, r]), P = t.nextStep === "TOTP" || b === "mfa", F = a(P ? "auth.loginFlow.title.mfa" : "auth.loginFlow.title.default"), I = a(P ? "auth.loginFlow.subtitle.mfa" : "auth.loginFlow.subtitle.default"), L = u(async (e) => {
212
213
  k(null);
213
214
  try {
214
- let n = t.trim(), r = await e.beginAuthentication(n);
215
+ let n = e.trim(), r = await t.beginAuthentication(n);
215
216
  s(n), _(r.methods), y(r.lockedUntil), r.methods.some((e) => e === "PASSKEY") ? x("passkey") : r.methods.includes("PASSWORD") ? x("password") : x("methods");
216
217
  } catch (e) {
217
218
  k(e instanceof Error ? e.message : a("auth.loginFlow.errors.tryAgain"));
218
219
  }
219
- }, [e, a]);
220
+ }, [t, a]);
220
221
  d(() => {
221
222
  j.current = !0;
222
223
  let e = o.trim();
@@ -250,12 +251,12 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
250
251
  ]);
251
252
  let R;
252
253
  return R = P ? /* @__PURE__ */ C(l, { children: /* @__PURE__ */ C(c, {
253
- auth: e,
254
+ auth: t,
254
255
  onSuccess: () => {
255
256
  N({ force: !0 });
256
257
  },
257
258
  onBack: () => {
258
- e.reset(), x("email");
259
+ t.reset(), x("email");
259
260
  }
260
261
  }) }) : b === "passkey" ? /* @__PURE__ */ C(l, {
261
262
  title: a("auth.loginFlow.passkey.title"),
@@ -267,7 +268,7 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
267
268
  x("methods");
268
269
  },
269
270
  defaultEmail: o,
270
- isAttemptingPasskey: e.isLoading
271
+ isAttemptingPasskey: t.isLoading
271
272
  })
272
273
  }) : b === "methods" ? /* @__PURE__ */ C(l, {
273
274
  title: a("auth.loginFlow.methods.title"),
@@ -291,11 +292,11 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
291
292
  defaultEmail: o,
292
293
  onForgotPassword: i,
293
294
  onSuccess: N,
294
- providers: t
295
+ providers: n
295
296
  }) : /* @__PURE__ */ C(D, {
296
297
  email: o,
297
298
  errorMessage: O,
298
- isLoading: e.isLoading,
299
+ isLoading: t.isLoading,
299
300
  onEmailChange: (e) => {
300
301
  s(e), k(null);
301
302
  },
@@ -320,4 +321,4 @@ async function N(e, t) {
320
321
  //#endregion
321
322
  export { j as n, N as t };
322
323
 
323
- //# sourceMappingURL=synchronizeAuthStatusQuery-By_lNCnP.js.map
324
+ //# sourceMappingURL=synchronizeAuthStatusQuery-1juorUEX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronizeAuthStatusQuery-1juorUEX.js","names":[],"sources":["../../src/auth/login/PasskeyLoginForm.tsx","../../src/auth/login/MethodChooser.tsx","../../src/auth/login/EmailCapturePanel.tsx","../../src/auth/login/OidcButtons.tsx","../../src/auth/login/PasswordLoginPanel.tsx","../../src/auth/login/LoginFlow.tsx","../../src/auth/login/synchronizeAuthStatusQuery.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 { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n | 'loginWithPasskey'\n | 'isLoading'\n | 'error'\n | 'emailHint'\n | 'nextStep'\n | 'beginAuthentication'\n | 'lockedUntil'\n | 'availableMethods'\n >;\n onSuccess: () => void;\n defaultEmail?: string;\n isAttemptingPasskey?: boolean;\n onShowMethods?: () => void;\n};\n\nexport const PasskeyLoginForm = ({\n auth,\n onSuccess,\n defaultEmail,\n isAttemptingPasskey = false,\n onShowMethods,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState(auth.emailHint ?? '');\n const [localError, setLocalError] = useState<string | null>(null);\n\n useEffect(() => {\n if (auth.emailHint != null && auth.emailHint !== '') {\n setEmail(auth.emailHint);\n } else if (defaultEmail != null && defaultEmail !== '') {\n setEmail(defaultEmail);\n }\n }, [auth.emailHint, defaultEmail]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n if (email.trim() === '') {\n setLocalError(t('auth.passkey.errors.emailRequired'));\n return;\n }\n\n try {\n const result = await auth.beginAuthentication(email.trim());\n if (Array.isArray(result.methods) && result.methods.length === 0) {\n const lockedUntilMessage =\n result.lockedUntil != null\n ? t('auth.passkey.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.passkey.errors.locked');\n setLocalError(lockedUntilMessage);\n return;\n }\n if (\n Array.isArray(result.methods) &&\n !result.methods.includes('PASSKEY')\n ) {\n setLocalError(t('auth.passkey.errors.notAvailable'));\n return;\n }\n\n const status = await auth.loginWithPasskey({ email: email.trim() });\n if (status === 'success') {\n onSuccess();\n }\n } catch {\n const authMessage = auth.error?.message;\n setLocalError(authMessage ?? t('auth.passkey.errors.failed'));\n }\n },\n [auth, email, onSuccess, t],\n );\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}>{t('auth.passkey.helper')}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.passkey.form.emailLabel')}\n name=\"passkey-email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n setEmail(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.passkey.form.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={auth.isLoading}>\n {isAttemptingPasskey\n ? t('auth.passkey.actions.submitting')\n : t('auth.passkey.actions.submit')}\n </Button>\n {onShowMethods != null ? (\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onShowMethods}\n >\n {t('auth.passkey.actions.showMethods')}\n </button>\n ) : null}\n </div>\n </form>\n );\n};\n","/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { Trans } from 'react-i18next';\nimport { Button, FormError, cx } from '@plumile/ui';\n\nimport type { AuthMethod } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n methods: readonly AuthMethod[];\n lockedUntil: string | null;\n onSelect: (method: AuthMethod) => void;\n onBack: () => void;\n};\n\nexport const MethodChooser = ({\n email,\n methods,\n lockedUntil,\n onSelect,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const isLocked = methods.length === 0;\n const lockedMessage =\n lockedUntil != null\n ? t('auth.methodChooser.lockedWithTime', {\n time: new Date(lockedUntil).toLocaleString(),\n })\n : t('auth.methodChooser.locked');\n\n const methodButtons = methods.map((method) => {\n const label =\n method === 'PASSKEY'\n ? t('auth.methodChooser.methods.passkey')\n : method === 'PASSWORD'\n ? t('auth.methodChooser.methods.password')\n : t('auth.methodChooser.methods.other', {\n method: method.toLowerCase(),\n });\n return (\n <Button\n key={method}\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n onSelect(method);\n }}\n className={cx(styles.fullWidth, styles.brandGhostButton)}\n >\n {label}\n </Button>\n );\n });\n\n return (\n <div className={styles.formSurface}>\n <div className={styles.stack}>\n <p className={styles.helper}>\n <Trans\n i18nKey=\"auth.methodChooser.prompt\"\n values={{ email }}\n components={{ strong: <strong /> }}\n />\n </p>\n {isLocked ? <FormError>{lockedMessage}</FormError> : null}\n {!isLocked ? methodButtons : null}\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onBack}\n className={styles.inlineLink}\n >\n {t('auth.methodChooser.actions.back')}\n </Button>\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, FormError, FormField } from '@plumile/ui';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n errorMessage: string | null;\n isLoading: boolean;\n onEmailChange: (value: string) => void;\n onContinue: () => void;\n onForgotPassword: () => void;\n};\n\nexport const EmailCapturePanel = ({\n email,\n errorMessage,\n isLoading,\n onEmailChange,\n onContinue,\n onForgotPassword,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel>\n <div className={styles.formSurface}>\n <p className={styles.helper}>{t('auth.emailCapture.description')}</p>\n {errorMessage != null && <FormError>{errorMessage}</FormError>}\n <FormField\n label={t('auth.emailCapture.emailLabel')}\n name=\"email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n onEmailChange(event.target.value);\n }}\n placeholder={t('auth.emailCapture.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n <div className={styles.actionsRow}>\n <Button\n type=\"button\"\n variant=\"primary\"\n onClick={onContinue}\n isLoading={isLoading}\n >\n {t('auth.emailCapture.continue')}\n </Button>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.emailCapture.forgotPassword')}\n </button>\n </div>\n </div>\n </AuthPanel>\n );\n};\n","import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\nconst OIDC_START_PATH = '/auth/oidc/start';\n\ntype Props = {\n providers: readonly OidcProviderKind[];\n};\n\nexport const OidcButtons = ({ providers }: Props): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (providers.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.stack}>\n {providers.map((provider) => {\n let label = t('auth.oidc.buttons.generic');\n if (provider === 'GOOGLE') {\n label = t('auth.oidc.buttons.google');\n } else if (provider === 'APPLE') {\n label = t('auth.oidc.buttons.apple');\n }\n const providerName = provider.toLowerCase();\n return (\n <Button\n key={provider}\n type=\"button\"\n variant=\"secondary\"\n className={styles.brandGhostButton}\n onClick={() => {\n window.location.assign(\n `${OIDC_START_PATH}?provider=${providerName}`,\n );\n }}\n >\n {label}\n </Button>\n );\n })}\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { LoginForm, type LoginFormAuthAdapter } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport { OidcButtons } from './OidcButtons.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n defaultEmail: string;\n onForgotPassword: () => void;\n onSuccess: () => void;\n providers: readonly OidcProviderKind[];\n};\n\nexport const PasswordLoginPanel = ({\n auth,\n defaultEmail,\n onForgotPassword,\n onSuccess,\n providers,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel title={t('auth.passwordLogin.title')}>\n <div className={styles.formSurface}>\n <LoginForm\n auth={auth}\n onSuccess={onSuccess}\n defaultEmail={defaultEmail}\n />\n <div className={styles.actionsRow}>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.passwordLogin.forgotPassword')}\n </button>\n </div>\n <OidcButtons providers={providers} />\n </div>\n </AuthPanel>\n );\n};\n","/* eslint-disable no-ternary */\nimport {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { AuthLayout } from '@plumile/ui';\n\nimport type {\n AuthMethod,\n OidcProviderKind,\n} from '../../modules/sharedSchemaTypes.js';\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport { MfaChallengeForm } from './MfaChallengeForm.js';\nimport { PasskeyLoginForm } from './PasskeyLoginForm.js';\nimport { MethodChooser } from './MethodChooser.js';\nimport AuthPanel from './AuthPanel.js';\nimport { EmailCapturePanel } from './EmailCapturePanel.js';\nimport { PasswordLoginPanel } from './PasswordLoginPanel.js';\n\nexport type LoginFlowProps = {\n auth: UseAuthReturn;\n oidcProviders: readonly OidcProviderKind[];\n onLoginSuccess: () => void;\n onForgotPassword: () => void;\n};\n\ntype View = 'email' | 'passkey' | 'methods' | 'password' | 'mfa';\n\nexport const LoginFlow = ({\n auth,\n oidcProviders,\n onLoginSuccess,\n onForgotPassword,\n}: LoginFlowProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState('');\n const [methods, setMethods] = useState<readonly AuthMethod[]>([]);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [view, setView] = useState<View>('email');\n const [hasTriedPasskey, setHasTriedPasskey] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n const passkeyAttemptActive = useRef(true);\n\n const loginAdapter = useMemo(() => {\n return {\n ...auth,\n beginAuthentication: async (inputEmail: string) => {\n const result = await auth.beginAuthentication(inputEmail);\n setEmail(inputEmail);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n return result;\n },\n };\n }, [auth]);\n\n const handleLoginSuccess = useCallback(\n ({ force } = { force: false }) => {\n if (!force && auth.nextStep === 'TOTP') {\n return;\n }\n onLoginSuccess();\n },\n [auth.nextStep, onLoginSuccess],\n );\n\n const isMfaStep = auth.nextStep === 'TOTP' || view === 'mfa';\n const title = isMfaStep\n ? t('auth.loginFlow.title.mfa')\n : t('auth.loginFlow.title.default');\n const subtitle = isMfaStep\n ? t('auth.loginFlow.subtitle.mfa')\n : t('auth.loginFlow.subtitle.default');\n\n const startFlowForEmail = useCallback(\n async (inputEmail: string) => {\n setLocalError(null);\n try {\n const trimmed = inputEmail.trim();\n const result = await auth.beginAuthentication(trimmed);\n setEmail(trimmed);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n const hasPasskey = result.methods.some((method) => {\n return method === 'PASSKEY';\n });\n\n if (hasPasskey) {\n setView('passkey');\n } else if (result.methods.includes('PASSWORD')) {\n setView('password');\n } else {\n setView('methods');\n }\n } catch (beginError) {\n const message =\n beginError instanceof Error\n ? beginError.message\n : t('auth.loginFlow.errors.tryAgain');\n setLocalError(message);\n }\n },\n [auth, t],\n );\n\n useEffect(() => {\n passkeyAttemptActive.current = true;\n const trimmedEmail = email.trim();\n const shouldAttempt =\n view === 'passkey' && !hasTriedPasskey && trimmedEmail !== '';\n\n if (shouldAttempt) {\n setHasTriedPasskey(true);\n const runPasskeyLogin = async () => {\n try {\n const status = await loginAdapter.loginWithPasskey({\n email: trimmedEmail,\n });\n\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n if (status === 'success') {\n handleLoginSuccess();\n return;\n }\n\n if (status === 'mfa-required') {\n setView('mfa');\n return;\n }\n\n setView('methods');\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n } catch (passkeyError) {\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n const message =\n passkeyError instanceof Error\n ? passkeyError.message\n : t('auth.loginFlow.errors.passkeyUnavailable');\n setLocalError(message);\n setView('methods');\n }\n };\n runPasskeyLogin().catch(() => {\n // Errors are handled inside runPasskeyLogin; ignore any unexpected rethrow.\n });\n }\n\n return () => {\n passkeyAttemptActive.current = false;\n };\n }, [email, handleLoginSuccess, hasTriedPasskey, loginAdapter, t, view]);\n\n let content: JSX.Element;\n\n if (isMfaStep) {\n content = (\n <AuthPanel>\n <MfaChallengeForm\n auth={auth}\n onSuccess={() => {\n handleLoginSuccess({ force: true });\n }}\n onBack={() => {\n auth.reset();\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'passkey') {\n content = (\n <AuthPanel\n title={t('auth.loginFlow.passkey.title')}\n description={t('auth.loginFlow.passkey.description', { email })}\n >\n <PasskeyLoginForm\n auth={loginAdapter}\n onSuccess={handleLoginSuccess}\n onShowMethods={() => {\n setView('methods');\n }}\n defaultEmail={email}\n isAttemptingPasskey={auth.isLoading}\n />\n </AuthPanel>\n );\n } else if (view === 'methods') {\n content = (\n <AuthPanel title={t('auth.loginFlow.methods.title')}>\n <MethodChooser\n email={email}\n methods={methods}\n lockedUntil={lockedUntil}\n onSelect={(method) => {\n if (method === 'PASSKEY') {\n setView('passkey');\n return;\n }\n if (method === 'PASSWORD') {\n setView('password');\n }\n }}\n onBack={() => {\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'password') {\n content = (\n <PasswordLoginPanel\n auth={loginAdapter}\n defaultEmail={email}\n onForgotPassword={onForgotPassword}\n onSuccess={handleLoginSuccess}\n providers={oidcProviders}\n />\n );\n } else {\n // email capture only\n content = (\n <EmailCapturePanel\n email={email}\n errorMessage={localError}\n isLoading={auth.isLoading}\n onEmailChange={(value) => {\n setEmail(value);\n setLocalError(null);\n }}\n onContinue={() => {\n const trimmed = email.trim();\n if (trimmed === '') {\n setLocalError(t('auth.loginFlow.errors.emailRequired'));\n return;\n }\n startFlowForEmail(trimmed).catch(() => {\n // startFlowForEmail handles its own errors.\n });\n }}\n onForgotPassword={onForgotPassword}\n />\n );\n }\n\n return (\n <AuthLayout title={title} subtitle={subtitle}>\n {content}\n </AuthLayout>\n );\n};\n","import RelayRuntime, {\n type GraphQLTaggedNode,\n type IEnvironment,\n type OperationType,\n} from 'relay-runtime';\n\nconst { fetchQuery } = RelayRuntime;\n\ntype AuthStatusQueryResponse = {\n readonly isLoggedIn?: boolean | null;\n};\n\n/**\n * Forces a fresh auth-status read from network to avoid stale cache guards\n * right after login mutations complete.\n */\nexport async function synchronizeAuthStatusQuery<TQuery extends OperationType>(\n environment: IEnvironment,\n query: GraphQLTaggedNode,\n): Promise<boolean> {\n const response = await fetchQuery<TQuery>(\n environment,\n query,\n {},\n { fetchPolicy: 'network-only' },\n ).toPromise();\n\n const isLoggedIn = (response as AuthStatusQueryResponse | null | undefined)\n ?.isLoggedIn;\n return isLoggedIn === true;\n}\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { i as e } from "./environment-BXoBq_6e.js";
2
- import { a as t, c as n, d as r, f as i, s as a, t as o } from "./loginPage.css-CBJ1Ozm5.js";
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: _ } = i(), [v, y] = d(""), [b, x] = d(null);
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: t,
35
+ className: n,
35
36
  onSubmit: S,
36
37
  noValidate: !0,
37
38
  children: [/* @__PURE__ */ g("div", {
38
- className: r,
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: n,
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 = (t) => () => {
118
- let { t: n } = i(), [r, a] = d(!1), [o, u] = d(null), [f, p] = d(null), [m, h] = d(null), [g, _] = d([]), [b, C] = d(S), w = t.login.commit, T = t.logout.commit, E = t.completeMfa.commit, D = t.beginPasskeyLogin.commit, O = t.finishPasskeyLogin.commit, k = t.acceptInvitation?.commit, A = t.beginAuthentication.commit, j = n("auth.loginFlow.errors.tryAgain"), M = n("auth.loginFlow.errors.tryAgain"), N = n("auth.passkey.errors.failed"), P = n("auth.mfa.errors.verificationFailed"), F = n("auth.acceptInvitation.errors.default"), I = n("auth.mfa.errors.invalidChallenge"), L = n("auth.passkey.errors.notAvailable"), R = "Logout failed.", z = l(() => {
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 n("auth.loginFlow.errors.invalidCredentials");
134
- case "ACCOUNT_LOCKED": return n("auth.loginFlow.errors.accountLocked");
135
- case "RATE_LIMITED": return n("auth.loginFlow.errors.rateLimited");
136
- case "INTERNAL_ERROR": return n("auth.loginFlow.errors.tryAgain");
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
- }, [n]), W = l((e) => {
140
+ }, [r]), W = l((e) => {
140
141
  switch (e) {
141
- case "INVALID_EMAIL": return n("auth.loginFlow.errors.invalidEmail");
142
- case "INTERNAL_ERROR": return n("auth.loginFlow.errors.tryAgain");
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
- }, [n]), G = l((e) => {
146
+ }, [r]), G = l((e) => {
146
147
  switch (e) {
147
- case "INVALID_EMAIL": return n("auth.passkey.errors.invalidEmail");
148
- case "PASSKEY_NOT_FOUND": return n("auth.passkey.errors.notFound");
149
- case "PASSKEY_NOT_SUPPORTED": return n("auth.passkey.errors.notAvailable");
150
- case "INTERNAL_ERROR": return n("auth.passkey.errors.failed");
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
- }, [n]), K = l((e) => {
154
+ }, [r]), K = l((e) => {
154
155
  switch (e) {
155
- case "INVALID_CHALLENGE_TOKEN": return n("auth.passkey.errors.invalidChallenge");
156
- case "CHALLENGE_EXPIRED": return n("auth.passkey.errors.challengeExpired");
157
- case "INVALID_ASSERTION": return n("auth.passkey.errors.invalidAssertion");
158
- case "INTERNAL_ERROR": return n("auth.passkey.errors.failed");
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
- }, [n]), q = l((e) => {
162
+ }, [r]), q = l((e) => {
162
163
  switch (e) {
163
- case "INVALID_CHALLENGE_TOKEN": return n("auth.mfa.errors.invalidChallenge");
164
- case "CHALLENGE_EXPIRED": return n("auth.mfa.errors.expired");
165
- case "INVALID_CODE": return n("auth.mfa.errors.invalidCode");
166
- case "TOO_MANY_ATTEMPTS": return n("auth.mfa.errors.tooManyAttempts");
167
- case "INTERNAL_ERROR": return n("auth.mfa.errors.verificationFailed");
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
- }, [n]), J = l((e) => {
171
+ }, [r]), J = l((e) => {
171
172
  switch (e) {
172
- case "INVALID_TOKEN": return n("auth.acceptInvitation.errors.invalidToken");
173
- case "TOKEN_EXPIRED": return n("auth.acceptInvitation.errors.expired");
174
- case "ALREADY_ACCEPTED": return n("auth.acceptInvitation.errors.alreadyAccepted");
175
- case "PASSWORD_MISMATCH": return n("auth.acceptInvitation.errors.passwordMismatch");
176
- case "PASSWORD_POLICY_VIOLATION": return n("auth.acceptInvitation.errors.passwordPolicyViolation");
177
- case "RATE_LIMITED": return n("auth.acceptInvitation.errors.rateLimited");
178
- case "EMAIL_MISMATCH": return n("auth.acceptInvitation.errors.emailMismatch");
179
- case "INTERNAL_ERROR": return n("auth.acceptInvitation.errors.default");
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
- }, [n]), Y = l(async (e) => new Promise((t, n) => {
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 = r || t.login.isInFlight || t.logout.isInFlight || t.completeMfa.isInFlight || t.beginPasskeyLogin.isInFlight || t.finishPasskeyLogin.isInFlight || (t.acceptInvitation?.isInFlight ?? !1) || t.beginAuthentication.isInFlight;
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-OVPPa9bO.js.map
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":";;;;;;;;AAyBA,IAAa,KAAoB,EAC/B,SACA,cACA,gBACwB;CACxB,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAY,KAAiB,EAAwB,KAAK;AAGjE,SAAgB;AAEd,EADA,EAAK,YAAY,EACjB,EAAc,KAAK;IAClB,CAAC,EAAK,CAAC;CAEV,IAAM,IAAe,EACnB,OAAO,MAAsC;AAE3C,EADA,EAAM,gBAAgB,EACtB,EAAc,KAAK;EAEnB,IAAM,IAAU,EAAK,MAAM;AAC3B,MAAI,EAAQ,SAAS,GAAG;AACtB,KAAc,EAAE,4BAA4B,CAAC;AAC7C;;AAGF,MAAI;GACF,IAAM,IAA+B,EACnC,MAAM,GACP;AAED,GADA,MAAM,EAAK,YAAY,EAAY,EACnC,GAAW;UACL;GACN,IAAM,IAAc,EAAK,OAAO;AAChC,KAAc,KAAe,EAAE,qCAAqC,CAAC;;IAGzE;EAAC;EAAM;EAAM;EAAW;EAAE,CAC3B,EAEK,IACJ,EAAK,aAAa,OAEd,EAAE,0BAA0B,GAD5B,EAAE,6BAA6B,EAAE,OAAO,EAAK,WAAW,CAAC,EAGzD,IAAY,KAAc,EAAK,OAAO,WAAW;AAEvD,QAEE,kBAAC,QAAD;EAAM,WAAW;EAAoB,UAAU;EAAc,YAAA;YAA7D,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,KAAD;KAAG,WAAW;eAAgB;KAAW,CAAA;IACxC,KAAa,OAA4C,OAArC,kBAAC,GAAD,EAAA,UAAY,GAAsB,CAAA;IACvD,kBAAC,GAAD;KACE,OAAO,EAAE,sBAAsB;KAC/B,MAAK;KACL,MAAK;KACL,OAAO;KACP,WAAW,MAAU;AAEnB,MADA,EAAQ,EAAM,OAAO,MAAM,EAC3B,EAAc,KAAK;;KAErB,aAAa,EAAE,4BAA4B;KAC3C,cAAa;KACb,WAAA;KACA,UAAA;KACA,CAAA;IACE;MACN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,WAAW;IACX,eAAe;AAEb,KADA,EAAK,OAAO,EACZ,GAAQ;;cAGT,EAAE,wBAAwB;IACpB,CAAA,EACT,kBAAC,GAAD;IAAQ,MAAK;IAAS,MAAK;IAAQ,WAAW,EAAK;cAChD,EAAE,0BAA0B;IACtB,CAAA,CACL;KACD;;;;;AC3GX,SAAgB,EAAkB,GAA4B;CAC5D,IAAM,IAAY,IAAI,WAAW,EAAM,EACnC,IAAS;AACb,MAAK,IAAM,KAAQ,EACjB,MAAU,OAAO,aAAa,EAAK;AAErC,QAAO,KAAK,EAAO,CAChB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,GAAG;;AAMvB,SAAgB,EAAkB,GAA4B;CAC5D,IAAM,IAAa,EAAM,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,EACxD,IAAY,EAAW,SAAS,GAClC,IAAU;AACd,KAAI,MAAc,EAChB,KAAU;UACD,MAAc,EACvB,KAAU;UACD,MAAc,EACvB,OAAU,MAAM,kCAAkC;CAEpD,IAAM,IAAS,GAAG,IAAa,KACzB,IAAS,KAAK,EAAO,EACrB,IAAS,IAAI,WAAW,EAAO,OAAO;AAC5C,MAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,EACtC,GAAO,KAAK,EAAO,WAAW,EAAE;AAElC,QAAO,EAAO;;AAYhB,SAAgB,EACd,GAC+B;AAC/B,KAAI,EAAE,aAAiB,cACrB,QAAO;AAGT,SAAQ,EAAM,MAAd;EACE,KAAK;EACL,KAAK,aACH,QAAO;EACT,KAAK,oBACH,QAAO;EACT,KAAK;EACL,KAAK,oBACH,QAAO;EACT,QACE,QAAO;;;AAOb,SAAgB,EAAe,GAAwC;AAKrE,QAJI,EAAkB,aAAa,KAC1B,IAGF,IADU,SAAS,EACnB,CAAK,UAAU,IAAI,GAAM;;;;AC8LlC,IAAM,IAAe;CACnB,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,UAAU;CACV,UAAU;CACX,EAEY,KAAiB,YACA;CAC1B,IAAM,EAAE,SAAM,GAA+B,EACvC,CAAC,GAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,GAAO,KAAY,EAA2B,KAAK,EACpD,CAAC,GAAM,KAAW,EAAsB,KAAK,EAC7C,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAkB,KAAuB,EAAuB,EAAE,CAAC,EACpE,CAAC,GAAW,KAAgB,EAAS,EAAa,EAElD,IAAsB,EAAU,MAAM,QACtC,IAAuB,EAAU,OAAO,QACxC,IAA4B,EAAU,YAAY,QAClD,IAAkC,EAAU,kBAAkB,QAC9D,IACJ,EAAU,mBAAmB,QACzB,IAAiC,EAAU,kBAAkB,QAC7D,IACJ,EAAU,oBAAoB,QAE1B,IAA2B,EAAE,iCAAiC,EAC9D,IAAyC,EAC7C,iCACD,EACK,IAA6B,EAAE,6BAA6B,EAC5D,IAAyB,EAAE,qCAAqC,EAChE,IAAgC,EACpC,uCACD,EACK,IAA6B,EAAE,mCAAmC,EAClE,IAA6B,EAAE,mCAAmC,EAClE,IAA4B,kBAE5B,IAAQ,QAAkB;AAK9B,EAJA,EAAS,KAAK,EACd,EAAQ,KAAK,EACb,EAAe,KAAK,EACpB,EAAoB,EAAE,CAAC,EACvB,EAAa,EAAa;IACzB,EAAE,CAAC,EAEA,IAAa,QAAkB;AACnC,IAAS,KAAK;IACb,EAAE,CAAC,EAEA,IAA6B,GAChC,MAAsC;EACrC,IAAM,IAAa,EAAQ,cAAc,MACnC,IAAiB,EAAQ,kBAAkB,MAC3C,IAAW,EAAQ,YAAY,MAC/B,IAAW,EAAQ,YAAY;AAuBrC,SArBA,GAAc,OACL;GACL,GAAG;GACH;GACA;GACA;GACA;GACD,EACD,EAEE,EAAQ,gBAAgB,QAAQ,KAAY,QAC9C,EAAQ,EACN,IAAI,EAAQ,aAAa,IAC1B,CAAC,EACK,aAGL,MAAa,UAAU,KAAkB,OACpC,iBAGF;IAET,EAAE,CACH,EAEK,IAAoB,GACvB,MAGG,OAAO,KAAU,cADjB,MAEC,YAAY,KAAS,YAAY,IAGtC,EAAE,CACH,EAEK,IAAiB,GACpB,MAA4C;AAC3C,UAAQ,GAAR;GACE,KAAK,sBACH,QAAO,EAAE,2CAA2C;GACtD,KAAK,iBACH,QAAO,EAAE,sCAAsC;GACjD,KAAK,eACH,QAAO,EAAE,oCAAoC;GAC/C,KAAK,iBACH,QAAO,EAAE,iCAAiC;GAC5C,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAA+B,GAClC,MAA0D;AACzD,UAAQ,GAAR;GACE,KAAK,gBACH,QAAO,EAAE,qCAAqC;GAChD,KAAK,iBACH,QAAO,EAAE,iCAAiC;GAC5C,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAA6B,GAChC,MAAwD;AACvD,UAAQ,GAAR;GACE,KAAK,gBACH,QAAO,EAAE,mCAAmC;GAC9C,KAAK,oBACH,QAAO,EAAE,+BAA+B;GAC1C,KAAK,wBACH,QAAO,EAAE,mCAAmC;GAC9C,KAAK,iBACH,QAAO,EAAE,6BAA6B;GACxC,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAA8B,GACjC,MAAyD;AACxD,UAAQ,GAAR;GACE,KAAK,0BACH,QAAO,EAAE,uCAAuC;GAClD,KAAK,oBACH,QAAO,EAAE,uCAAuC;GAClD,KAAK,oBACH,QAAO,EAAE,uCAAuC;GAClD,KAAK,iBACH,QAAO,EAAE,6BAA6B;GACxC,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAAuB,GAC1B,MAAkD;AACjD,UAAQ,GAAR;GACE,KAAK,0BACH,QAAO,EAAE,mCAAmC;GAC9C,KAAK,oBACH,QAAO,EAAE,0BAA0B;GACrC,KAAK,eACH,QAAO,EAAE,8BAA8B;GACzC,KAAK,oBACH,QAAO,EAAE,kCAAkC;GAC7C,KAAK,iBACH,QAAO,EAAE,qCAAqC;GAChD,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAA4B,GAC/B,MAAuD;AACtD,UAAQ,GAAR;GACE,KAAK,gBACH,QAAO,EAAE,4CAA4C;GACvD,KAAK,gBACH,QAAO,EAAE,uCAAuC;GAClD,KAAK,mBACH,QAAO,EAAE,+CAA+C;GAC1D,KAAK,oBACH,QAAO,EAAE,gDAAgD;GAC3D,KAAK,4BACH,QAAO,EAAE,uDAAuD;GAClE,KAAK,eACH,QAAO,EAAE,2CAA2C;GACtD,KAAK,iBACH,QAAO,EAAE,6CAA6C;GACxD,KAAK,iBACH,QAAO,EAAE,uCAAuC;GAClD,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ,EAEK,IAAsB,EAC1B,OACE,MAEO,IAAI,SAAS,GAAS,MAAW;AACtC,IAAkC;GAChC,WAAW,EAAE,UAAO;GACpB,cAAc,MAAa;IACzB,IAAM,IAAa,EAAS,qBACxB,IAAU;AAEd,QAAI,EAAkB,EAAW,EAAE;KACjC,IAAM,IAAU,EAAuB,GAAY;MACjD,qBAAqB;MACrB,WAAW;MACZ,CAAC;AACF,SAAI,CAAC,EAAQ,IAAI;MACf,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,SAAU,EAAQ;;IAGpB,IAAM,IAAU,EAAQ,QAAQ,KAAK,MAC5B,EAAK,OACZ,EACI,IAAS,EAAQ,eAAe;AAGtC,IAFA,EAAoB,EAAQ,EAC5B,EAAe,EAAO,EACtB,EAAQ;KAAE;KAAS,aAAa;KAAQ,CAAC;;GAE3C,eAAe;IACb,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,IADA,EAAS,EAAU,EACnB,EAAO,EAAU;;GAEpB,CAAC;GACF,EAEJ;EACE;EACA;EACA;EACA;EACD,CACF,EAEK,IAAQ,EACZ,OAAO,OACL,EAAa,GAAK,EAClB,EAAS,KAAK,EACd,GAAc,OACL;EACL,GAAG;EACH,WAAW,EAAY;EACxB,EACD,EAEK,IAAI,SAAS,GAAS,MAAW;AACtC,IAAoB;GAClB,WAAW,EACT,OAAO,GACR;GACD,cAAc,MAAa;AACzB,MAAa,GAAM;IACnB,IAAM,IAAa,EAAS,OACxB,IAAkC;AAEtC,QAAI,EAAkB,EAAW,EAAE;KACjC,IAAM,IAAU,EAAuB,GAAY;MACjD,qBAAqB;MACrB,WAAW;MACZ,CAAC;AACF,SAAI,CAAC,EAAQ,IAAI;MACf,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,SAAc,EAAW,WAAW;UAEpC,KAAc;AAGhB,QAAI,KAAe,MAAM;KACvB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;IAGF,IAAM,IAAS,EAA2B,EAAY;AACtD,QAAI,MAAW,aAAa,MAAW,gBAAgB;AACrD,OAAQ,EAAO;AACf;;IAGF,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,IADA,EAAS,EAAU,EACnB,EAAO,EAAU;;GAEnB,eAAe;AACb,MAAa,GAAM;IACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,IADA,EAAS,EAAU,EACnB,EAAO,EAAU;;GAEpB,CAAC;GACF,GAEJ;EACE;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,IAAc,EAClB,OAAO,MAAgD;EACrD,IAAM,EAAE,sBAAmB;AAC3B,MAAI,KAAkB,MAAM;GAC1B,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,UADA,EAAS,EAAU,EACZ,QAAQ,OAAO,EAAU;;AAMlC,SAHA,EAAa,GAAK,EAClB,EAAS,KAAK,EAEP,IAAI,SAAS,GAAS,MAAW;AACtC,KAA0B;IACxB,WAAW,EACT,OAAO;KACL;KACA,MAAM,EAAY;KACnB,EACF;IACD,cAAc,MAAa;AACzB,OAAa,GAAM;KACnB,IAAM,IAAa,EAAS,aACxB,IAAkC;AAEtC,SAAI,EAAkB,EAAW,EAAE;MACjC,IAAM,IAAU,EAAuB,GAAY;OACjD,qBAAqB;OACrB,WAAW;OACZ,CAAC;AACF,UAAI,CAAC,EAAQ,IAAI;OACf,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,OADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,UAAc,EAAW,WAAW;WAEpC,KAAc;AAGhB,SAAI,KAAe,MAAM;MACvB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAIF,SADe,EAA2B,EACtC,KAAW,WAAW;AACxB,SAAS;AACT;;KAGF,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;;IAEnB,eAAe;AACb,OAAa,GAAM;KACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;;IAEpB,CAAC;IACF;IAEJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,IAAmB,EACvB,OAAO,EAAE,eAAqD;AAC5D,MAAI,OAAO,SAAW,KAAa;GACjC,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,UADA,EAAS,EAAU,EACZ,QAAQ,OAAO,EAAU;;AAYlC,SATA,EAAa,GAAK,EAClB,EAAS,KAAK,EACd,GAAc,OACL;GACL,GAAG;GACH,WAAW;GACZ,EACD,EAEK,IAAI,SAAS,GAAS,MAAW;AACtC,KAAgC;IAC9B,WAAW,EACT,UACD;IACD,cAAc,MAAa;KACzB,IAAM,IAAa,EAAS,mBACxB,IAAU;AAEd,SAAI,EAAkB,EAAW,EAAE;MACjC,IAAM,IAAU,EAAuB,GAAY;OACjD,qBAAqB;OACrB,WAAW;OACZ,CAAC;AACF,UAAI,CAAC,EAAQ,IAAI;AACf,SAAa,GAAM;OACnB,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,OADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,UAAU,EAAQ;;AA+GpB,kBA5GwD;AACtD,UAAI;OACF,IAAM,IAAa,MAAM,UAAU,YAAY,IAAI,EACjD,WAAW;QACT,kBAAkB,EAAQ,iBAAiB,KACxC,OACQ;SACL,IAAI,EAAkB,EAAa;SACnC,MAAM;SACP,EAEJ;QACD,WAAW,EAAkB,EAAQ,UAAU;QAC/C,MAAM,EAAQ;QACd,kBAAkB;QACnB,EACF,CAAC;AAEF,WAAI,KAAa,KACf,OAAU,MACR,+CACD;OAGH,IAAM,IACJ,EAAU,UACN,IAAY,EAChB,EAAkB,kBACnB;AAED,SAAiC;QAC/B,WAAW,EACT,OAAO;SACL,WAAW,EAAQ;SACnB,gBAAgB,EAAQ;SACxB,cAAc,EAAU;SACxB;SACA,YACE,EAAkB,cAAc,OAE5B,OADA,EAAkB,EAAkB,WAAW;SAEtD,EACF;QACD,cAAc,MAAmB;AAC/B,WAAa,GAAM;SACnB,IAAM,IAAa,EAAe,oBAC9B,IAAkC;AAEtC,aAAI,EAAkB,EAAW,EAAE;UACjC,IAAM,IAAU,EAAuB,GAAY;WACjD,qBAAqB;WACrB,WAAW;WACZ,CAAC;AACF,cAAI,CAAC,EAAQ,IAAI;WACf,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,WADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,cAAc,EAAW,WAAW;eAEpC,KAAc;AAGhB,aAAI,KAAe,MAAM;UACvB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,UADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;SAGF,IAAM,IAAS,EAA2B,EAAY;AACtD,aAAI,MAAW,WAAW;AACxB,YAAQ,EAAO;AACf;;SAEF,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,SADA,EAAS,EAAU,EACnB,EAAO,EAAU;;QAEnB,eAAe;AACb,WAAa,GAAM;SACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,SADA,EAAS,EAAU,EACnB,EAAO,EAAU;;QAEpB,CAAC;eACK,GAAiB;AACxB,SAAa,GAAM;OACnB,IAAM,IAAuB,EAC3B,SACE,aAA2B,QACvB,EAAgB,UAChB,gCACP;AAED,OADA,EAAS,EAAU,EACnB,EAAO,EAAU;;SAIC,CAAC,YAAY,GAEjC;;IAEJ,eAAe;AACb,OAAa,GAAM;KACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;;IAEpB,CAAC;IACF;IAEJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,IAAmB,EACvB,OACE,MACyB;AACzB,MAAI,KAAkC,MAAM;GAC1C,IAAM,IAAuB,EAC3B,SAAS,2CACV;AAED,UADA,EAAS,EAAU,EACZ,QAAQ,OAAO,EAAU;;AAMlC,SAHA,EAAa,GAAK,EAClB,EAAS,KAAK,EAEP,IAAI,SAAS,GAAS,MAAW;AACtC,KAA+B;IAC7B,WAAW,EACT,OAAO;KACL,OAAO,EAAY;KACnB,UAAU,EAAY;KACtB,sBAAsB,EAAY;KACnC,EACF;IACD,cAAc,MAAa;AACzB,OAAa,GAAM;KACnB,IAAM,IAAa,EAAS,kBACxB,IAAkC;AAEtC,SAAI,EAAkB,EAAW,EAAE;MACjC,IAAM,IAAU,EAAuB,GAAY;OACjD,qBAAqB;OACrB,WAAW;OACZ,CAAC;AACF,UAAI,CAAC,EAAQ,IAAI;OACf,IAAM,IAAuB,EAC3B,SAAS,EAAQ,SAClB;AAED,OADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,UAAc,EAAW,WAAW;WAEpC,KAAc;AAGhB,SAAI,KAAe,MAAM;MACvB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;KAGF,IAAM,IAAS,EAA2B,EAAY;AACtD,SAAI,MAAW,aAAa,MAAW,gBAAgB;AACrD,QAAQ,EAAO;AACf;;KAEF,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;;IAEnB,eAAe;AACb,OAAa,GAAM;KACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;;IAEpB,CAAC;IACF;IAEJ;EACE;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,KAAS,EAAY,aACzB,EAAa,GAAK,EAEX,IAAI,SAAS,GAAS,MAAW;AACtC,IAAqB;GACnB,WAAW,EAAE;GACb,cAAc,MAAa;AACzB,MAAa,GAAM;IACnB,IAAM,IAAa,EAAS,QACxB,IAAiC;AAErC,QAAI,EAAkB,EAAW,EAAE;KACjC,IAAM,IAAU,EAAuB,GAAY,EACjD,qBAAqB,GACtB,CAAC;AACF,SAAI,CAAC,EAAQ,IAAI;MACf,IAAM,IAAuB,EAAE,SAAS,EAAQ,SAAS;AAEzD,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;KAGF,IAAM,IAAkB,EACtB,EAAW,SAAS,aAAa,MACjC,EACD;AACD,SAAI,CAAC,EAAgB,IAAI;MACvB,IAAM,IAAuB,EAC3B,SAAS,EAAgB,SAC1B;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,SAAiB,EAAgB;WAC5B;KACL,IAAM,IAAkB,EACtB,EAAW,aAAa,MACxB,EACD;AACD,SAAI,CAAC,EAAgB,IAAI;MACvB,IAAM,IAAuB,EAC3B,SAAS,EAAgB,SAC1B;AAED,MADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AAEF,SAAiB,EAAgB;;AAGnC,QAAI,CAAC,GAAgB;KACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAED,KADA,EAAS,EAAU,EACnB,EAAO,EAAU;AACjB;;AASF,IANA,aAAa,WAAW,aAAa,EACrC,aAAa,WAAW,cAAc,EACtC,EAAQ,KAAK,EACb,EAAa,EAAa,EAC1B,GAAiB,EAEjB,GAAS;;GAEX,eAAe;AACb,MAAa,GAAM;IACnB,IAAM,IAAuB,EAC3B,SAAS,GACV;AAID,IAHA,EAAS,EAAU,EACnB,GAAiB,EAEjB,EAAO,EAAU;;GAEpB,CAAC;GACF,GACD;EAAC;EAAsB;EAA2B;EAAkB,CAAC,EAElE,KACJ,KACA,EAAU,MAAM,cAChB,EAAU,OAAO,cACjB,EAAU,YAAY,cACtB,EAAU,kBAAkB,cAC5B,EAAU,mBAAmB,eAC5B,EAAU,kBAAkB,cAAc,OAC3C,EAAU,oBAAoB;AAEhC,QAAO;EACL,YAAY,EAAU;EACtB,gBAAgB,EAAU;EAC1B,UAAU,EAAU;EACpB,UAAU,EAAU;EACpB,WAAW,EAAU;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX;EACA;EACA;EACA;EACD"}
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./useRelayEnvironment-vQ86aW-n.js";
2
- import { n as t } from "./BackofficeConfigContext-R0t1owTI.js";
3
- import { t as n } from "./useAuth-OVPPa9bO.js";
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-BvEoEqnB.js.map
89
+ //# sourceMappingURL=useBackofficeAuth-C16Euw2X.js.map