@tinyrack/issuary-server 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entrypoints/app.d.ts +0 -6
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/lib/config/branding.d.ts +0 -4
- package/dist/lib/config/branding.d.ts.map +1 -1
- package/dist/lib/config/branding.js +0 -14
- package/dist/lib/config/branding.js.map +1 -1
- package/dist/lib/config/resolved.d.ts +0 -2
- package/dist/lib/config/resolved.d.ts.map +1 -1
- package/dist/routes/api/config/get.d.ts +0 -4
- package/dist/routes/api/config/get.d.ts.map +1 -1
- package/dist/routes/api/config/get.js +0 -2
- package/dist/routes/api/config/get.js.map +1 -1
- package/dist/routes/api/config/index.d.ts +0 -4
- package/dist/routes/api/config/index.d.ts.map +1 -1
- package/dist/routes/api/index.d.ts +0 -4
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/index.d.ts +0 -4
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/schemas/response.d.ts +0 -2
- package/dist/schemas/response.d.ts.map +1 -1
- package/dist/schemas/response.js +0 -5
- package/dist/schemas/response.js.map +1 -1
- package/dist/services/container.d.ts +0 -2
- package/dist/services/container.d.ts.map +1 -1
- package/package.json +2 -1
- package/public/assets/2fa-6btYq1AL.js +2 -0
- package/public/assets/{2fa-CCOTIHDZ.js.map → 2fa-6btYq1AL.js.map} +1 -1
- package/public/assets/{2fa-BqsM_D-X.js → 2fa-D3ieXkuh.js} +2 -2
- package/public/assets/{2fa-BqsM_D-X.js.map → 2fa-D3ieXkuh.js.map} +1 -1
- package/public/assets/{2fa-B5vLgDXQ.js → 2fa-Dxh4Kxy-.js} +2 -2
- package/public/assets/{2fa-B5vLgDXQ.js.map → 2fa-Dxh4Kxy-.js.map} +1 -1
- package/public/assets/2fa-UcpXAI9J.js +2 -0
- package/public/assets/{2fa-C5vUVgr_.js.map → 2fa-UcpXAI9J.js.map} +1 -1
- package/public/assets/{DialogHandle-BmtK2pRn.js → DialogHandle-tiMUnjZQ.js} +2 -2
- package/public/assets/{DialogHandle-BmtK2pRn.js.map → DialogHandle-tiMUnjZQ.js.map} +1 -1
- package/public/assets/admin-B8RQbf4_.js +2 -0
- package/public/assets/admin-B8RQbf4_.js.map +1 -0
- package/public/assets/{admin-users-DvPbw1Vq.js → admin-users-Dz1QNdy3.js} +2 -2
- package/public/assets/{admin-users-DvPbw1Vq.js.map → admin-users-Dz1QNdy3.js.map} +1 -1
- package/public/assets/alert-leqyvHOp.js.map +1 -1
- package/public/assets/{auth-choice-row-BCGjuedo.js → auth-choice-row-DWzfcZQY.js} +2 -2
- package/public/assets/{auth-choice-row-BCGjuedo.js.map → auth-choice-row-DWzfcZQY.js.map} +1 -1
- package/public/assets/{auth-field-DD8kvl--.js → auth-field-DsLGh1U-.js} +2 -2
- package/public/assets/{auth-field-DD8kvl--.js.map → auth-field-DsLGh1U-.js.map} +1 -1
- package/public/assets/auth-layout-DGTylGtX.js +2 -0
- package/public/assets/auth-layout-DGTylGtX.js.map +1 -0
- package/public/assets/{auth-page-header-CIn2E4zI.js → auth-page-header-COvqWINf.js} +2 -2
- package/public/assets/auth-page-header-COvqWINf.js.map +1 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js +2 -0
- package/public/assets/authorization-context-banner-DVx1TsPY.js.map +1 -0
- package/public/assets/{avatar-BEQjf2x6.js → avatar-BCLugfaZ.js} +2 -2
- package/public/assets/{avatar-BEQjf2x6.js.map → avatar-BCLugfaZ.js.map} +1 -1
- package/public/assets/badge-CsOfUji0.js.map +1 -1
- package/public/assets/{checkbox-gdHnSFQ-.js → checkbox-CFVDS3zJ.js} +2 -2
- package/public/assets/{checkbox-gdHnSFQ-.js.map → checkbox-CFVDS3zJ.js.map} +1 -1
- package/public/assets/config-DTQCUlfZ.js.map +1 -1
- package/public/assets/{consent-BqqFDdsr.js → consent-CKOohdYI.js} +2 -2
- package/public/assets/{consent-BqqFDdsr.js.map → consent-CKOohdYI.js.map} +1 -1
- package/public/assets/{consent-CfRbz2R7.js → consent-ChiWc7Ql.js} +2 -2
- package/public/assets/{consent-CfRbz2R7.js.map → consent-ChiWc7Ql.js.map} +1 -1
- package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
- package/public/assets/{email-CKKakxPJ.js → email-Crjg1dcr.js} +2 -2
- package/public/assets/{email-CKKakxPJ.js.map → email-Crjg1dcr.js.map} +1 -1
- package/public/assets/email-UcpXAI9J.js +2 -0
- package/public/assets/{email-C5vUVgr_.js.map → email-UcpXAI9J.js.map} +1 -1
- package/public/assets/{error-BMXxpgfR.js → error-VfMv226c.js} +2 -2
- package/public/assets/{error-BMXxpgfR.js.map → error-VfMv226c.js.map} +1 -1
- package/public/assets/{field-Cn4H1CUj.js → field-89zKYDVL.js} +2 -2
- package/public/assets/{field-Cn4H1CUj.js.map → field-89zKYDVL.js.map} +1 -1
- package/public/assets/{forgot-rO9sByfV.js → forgot-Dr88fVMq.js} +2 -2
- package/public/assets/{forgot-rO9sByfV.js.map → forgot-Dr88fVMq.js.map} +1 -1
- package/public/assets/forgot-UcpXAI9J.js +2 -0
- package/public/assets/{forgot-C5vUVgr_.js.map → forgot-UcpXAI9J.js.map} +1 -1
- package/public/assets/{index-DZyHRhbQ.css → index-CDD8owGK.css} +1 -1
- package/public/assets/{index-CS23Ozt6.js → index-CZ0rWM7l.js} +3 -3
- package/public/assets/{index-CS23Ozt6.js.map → index-CZ0rWM7l.js.map} +1 -1
- package/public/assets/{initial-avatar-CtuDUz_W.js → initial-avatar-ocwNWL38.js} +2 -2
- package/public/assets/{initial-avatar-CtuDUz_W.js.map → initial-avatar-ocwNWL38.js.map} +1 -1
- package/public/assets/{input-CzQki7k6.js → input-GPigtjgi.js} +2 -2
- package/public/assets/{input-CzQki7k6.js.map → input-GPigtjgi.js.map} +1 -1
- package/public/assets/link-C-WdTj3F.js.map +1 -1
- package/public/assets/{login-nukebli4.js → login-CQeTLmIu.js} +2 -2
- package/public/assets/{login-nukebli4.js.map → login-CQeTLmIu.js.map} +1 -1
- package/public/assets/login-UcpXAI9J.js +2 -0
- package/public/assets/{login-C5vUVgr_.js.map → login-UcpXAI9J.js.map} +1 -1
- package/public/assets/{modal-BDQFucjz.js → modal-BV3gpI-p.js} +2 -2
- package/public/assets/{modal-BDQFucjz.js.map → modal-BV3gpI-p.js.map} +1 -1
- package/public/assets/{passkey-CynCz1Dt.js → passkey-Bf7n49Z7.js} +2 -2
- package/public/assets/{passkey-CynCz1Dt.js.map → passkey-Bf7n49Z7.js.map} +1 -1
- package/public/assets/{passkey-BE9JvJOP.js → passkey-CT3G7pCL.js} +2 -2
- package/public/assets/{passkey-BE9JvJOP.js.map → passkey-CT3G7pCL.js.map} +1 -1
- package/public/assets/passkey-UcpXAI9J.js +2 -0
- package/public/assets/{passkey-C5vUVgr_.js.map → passkey-UcpXAI9J.js.map} +1 -1
- package/public/assets/{password-RkUttbhD.js → password-BKI5GTRs.js} +2 -2
- package/public/assets/{password-RkUttbhD.js.map → password-BKI5GTRs.js.map} +1 -1
- package/public/assets/password-UcpXAI9J.js +2 -0
- package/public/assets/{password-C5vUVgr_.js.map → password-UcpXAI9J.js.map} +1 -1
- package/public/assets/{password-strength-BeSOu_Ga.js → password-strength-DTWF07Px.js} +2 -2
- package/public/assets/{password-strength-BeSOu_Ga.js.map → password-strength-DTWF07Px.js.map} +1 -1
- package/public/assets/{pin-input-Cc-VkrQ3.js → pin-input-BGOLfkwL.js} +2 -2
- package/public/assets/{pin-input-Cc-VkrQ3.js.map → pin-input-BGOLfkwL.js.map} +1 -1
- package/public/assets/{profile-B5NaJfeS.js → profile-DSTMtoUf.js} +2 -2
- package/public/assets/{profile-B5NaJfeS.js.map → profile-DSTMtoUf.js.map} +1 -1
- package/public/assets/profile-RpDmbWNA.js +2 -0
- package/public/assets/profile-RpDmbWNA.js.map +1 -0
- package/public/assets/provider-logos-u1YURWQr.js.map +1 -1
- package/public/assets/{recovery-PnUATiUi.js → recovery-DbgpqG6f.js} +2 -2
- package/public/assets/{recovery-PnUATiUi.js.map → recovery-DbgpqG6f.js.map} +1 -1
- package/public/assets/{register-DQXhru0_.js → register-B2Lixapy.js} +2 -2
- package/public/assets/{register-DQXhru0_.js.map → register-B2Lixapy.js.map} +1 -1
- package/public/assets/register-UcpXAI9J.js +2 -0
- package/public/assets/{register-C5vUVgr_.js.map → register-UcpXAI9J.js.map} +1 -1
- package/public/assets/{reset-CQgIa3yf.js → reset-C-Qjl2Qy.js} +2 -2
- package/public/assets/{reset-CQgIa3yf.js.map → reset-C-Qjl2Qy.js.map} +1 -1
- package/public/assets/reset-UcpXAI9J.js +2 -0
- package/public/assets/{reset-C5vUVgr_.js.map → reset-UcpXAI9J.js.map} +1 -1
- package/public/assets/{select-DqZynXSt.js → select-BKx4bF4A.js} +2 -2
- package/public/assets/{select-DqZynXSt.js.map → select-BKx4bF4A.js.map} +1 -1
- package/public/assets/select-UcpXAI9J.js +2 -0
- package/public/assets/{select-C5vUVgr_.js.map → select-UcpXAI9J.js.map} +1 -1
- package/public/assets/separator-B0Bvh1he.js.map +1 -1
- package/public/assets/shell-header-bar-CgyNXbPS.js +2 -0
- package/public/assets/shell-header-bar-CgyNXbPS.js.map +1 -0
- package/public/assets/{terms-B5NaJfeS.js → terms-DSTMtoUf.js} +2 -2
- package/public/assets/{terms-B5NaJfeS.js.map → terms-DSTMtoUf.js.map} +1 -1
- package/public/assets/{terms-BHDAgn-H.js → terms-Vgpg5IZK.js} +2 -2
- package/public/assets/{terms-BHDAgn-H.js.map → terms-Vgpg5IZK.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js → terms-checkbox-list-DqbXU4qw.js} +2 -2
- package/public/assets/{terms-checkbox-list-6jteUTIZ.js.map → terms-checkbox-list-DqbXU4qw.js.map} +1 -1
- package/public/assets/{totp-CJtfVNEq.js → totp-Cjns-PoB.js} +2 -2
- package/public/assets/{totp-CJtfVNEq.js.map → totp-Cjns-PoB.js.map} +1 -1
- package/public/assets/{totp-ECvOUcFx.js → totp-g0-s50HZ.js} +2 -2
- package/public/assets/{totp-ECvOUcFx.js.map → totp-g0-s50HZ.js.map} +1 -1
- package/public/assets/{use-totp-setup-BbS3XcZA.js → use-totp-setup-CtTaklH-.js} +2 -2
- package/public/assets/{use-totp-setup-BbS3XcZA.js.map → use-totp-setup-CtTaklH-.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js → useAriaLabelledBy-7uIPXK-0.js} +2 -2
- package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js.map → useAriaLabelledBy-7uIPXK-0.js.map} +1 -1
- package/public/assets/useQuery-pOdkMV4B.js +2 -0
- package/public/assets/{useQuery-Ckxjmvtl.js.map → useQuery-pOdkMV4B.js.map} +1 -1
- package/public/assets/users-B1hvVo3B.js +2 -0
- package/public/assets/users-B1hvVo3B.js.map +1 -0
- package/public/index.html +2 -2
- package/public/assets/2fa-C5vUVgr_.js +0 -2
- package/public/assets/2fa-CCOTIHDZ.js +0 -2
- package/public/assets/admin-BPijkLw-.js +0 -2
- package/public/assets/admin-BPijkLw-.js.map +0 -1
- package/public/assets/auth-layout-VtpryDof.js +0 -2
- package/public/assets/auth-layout-VtpryDof.js.map +0 -1
- package/public/assets/auth-page-header-CIn2E4zI.js.map +0 -1
- package/public/assets/authorization-context-banner-SOuBHWIb.js +0 -2
- package/public/assets/authorization-context-banner-SOuBHWIb.js.map +0 -1
- package/public/assets/email-C5vUVgr_.js +0 -2
- package/public/assets/forgot-C5vUVgr_.js +0 -2
- package/public/assets/login-C5vUVgr_.js +0 -2
- package/public/assets/passkey-C5vUVgr_.js +0 -2
- package/public/assets/password-C5vUVgr_.js +0 -2
- package/public/assets/profile-BcjsVYOx.js +0 -2
- package/public/assets/profile-BcjsVYOx.js.map +0 -1
- package/public/assets/register-C5vUVgr_.js +0 -2
- package/public/assets/reset-C5vUVgr_.js +0 -2
- package/public/assets/select-C5vUVgr_.js +0 -2
- package/public/assets/shell-header-bar-CjG5qvPg.js +0 -2
- package/public/assets/shell-header-bar-CjG5qvPg.js.map +0 -1
- package/public/assets/useQuery-Ckxjmvtl.js +0 -2
- package/public/assets/users-CmFxrCQT.js +0 -2
- package/public/assets/users-CmFxrCQT.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{J as e,Z as t,i as n,n as r,q as i,s as a,t as o}from"./createLucideIcon-BPpAIXR_.js";import{Sn as s}from"./config-DTQCUlfZ.js";import{t as c}from"./useMutation-BWZ0G4Td.js";import{t as l}from"./auth-field-
|
|
2
|
-
//# sourceMappingURL=forgot-
|
|
1
|
+
import{J as e,Z as t,i as n,n as r,q as i,s as a,t as o}from"./createLucideIcon-BPpAIXR_.js";import{Sn as s}from"./config-DTQCUlfZ.js";import{t as c}from"./useMutation-BWZ0G4Td.js";import{t as l}from"./auth-field-DsLGh1U-.js";import{t as u}from"./mail-D0B_1Dzd.js";import{c as d,i as f,o as p}from"./zod-C87S6Tec.js";import{L as m,V as h}from"./index-CZ0rWM7l.js";import{t as g}from"./auth-page-header-COvqWINf.js";import{t as _}from"./auth-layout-DGTylGtX.js";import{n as v,t as y}from"./auth-footer-Cz5ivsDc.js";import{r as b,t as x}from"./standard-schema-e8gtSzGE.js";import{t as S}from"./password-reset-sU5KkBKi.js";var C=o(`mail-check`,[[`path`,{d:`M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8`,key:`12jkf8`}],[`path`,{d:`m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7`,key:`1ocrg3`}],[`path`,{d:`m16 19 2 2 4-4`,key:`1b14m6`}]]),w=t(e()),T=i();function E(){let{t:e}=n(),t=h(),[i,o]=(0,w.useState)(!1),[E,D]=(0,w.useState)(``),O=(0,w.useMemo)(()=>p({email:d().min(1,e(`validation.email.required`)).pipe(f(e(`validation.email.invalid`)))}),[e]),k=c({...S,onSuccess:()=>{o(!0)}}),{register:A,setError:j,handleSubmit:M,formState:{errors:N}}=b({defaultValues:{email:``},resolver:x(O)});return i?(0,T.jsx)(_,{children:(0,T.jsx)(`div`,{"data-testid":`alert-success`,children:(0,T.jsxs)(m,{description:(0,T.jsxs)(T.Fragment,{children:[e(`forgotPassword.success.subtitle`),(0,T.jsx)(`br`,{}),e(`forgotPassword.success.description`,{email:E})]}),icon:C,title:e(`forgotPassword.success.title`),tone:`success`,children:[(0,T.jsx)(a,{className:`w-full`,intent:`primary`,onClick:()=>t({to:`/login`}),type:`button`,uiSize:`lg`,children:e(`forgotPassword.backToLogin`)}),(0,T.jsx)(r,{align:`center`,color:`muted`,variant:`caption`,children:e(`forgotPassword.success.checkSpam`)})]})})}):(0,T.jsxs)(_,{children:[(0,T.jsx)(g,{subtitle:e(`forgotPassword.subtitle`),title:e(`forgotPassword.title`)}),(0,T.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:M(async t=>{try{D(t.email),await k.mutateAsync(t)}catch(t){t&&typeof t==`object`&&`code`in t&&t.code===`USER_NOT_EDITABLE`?j(`email`,{type:`manual`,message:e(`forgotPassword.error.notEditable`)}):o(!0)}}),children:[(0,T.jsx)(l,{autoComplete:`email`,error:N.email,icon:u,label:e(`forgotPassword.email.label`),placeholder:e(`forgotPassword.email.placeholder`),...A(`email`),type:`email`}),(0,T.jsx)(a,{className:`w-full`,intent:`primary`,loading:k.isPending,loadingLabel:e(`forgotPassword.submitting`),type:`submit`,uiSize:`lg`,children:e(`forgotPassword.submit`)})]}),(0,T.jsx)(y,{children:(0,T.jsx)(v,{link:(0,T.jsx)(s,{to:`/login`,children:e(`register.link.login`)}),text:e(`forgotPassword.footer.rememberedPassword`)})})]})}export{E as component};
|
|
2
|
+
//# sourceMappingURL=forgot-Dr88fVMq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-
|
|
1
|
+
{"version":3,"file":"forgot-Dr88fVMq.js","names":["standardSchemaResolver","useMutation","Link","useNavigate","TRButton","TRText","MailCheckIcon","MailIcon","useMemo","useState","useForm","useTranslation","z","AuthField","AuthFooter","AuthFooterLink","AuthOutcome","AuthPageHeader","AuthLayout","forgotPasswordMutationOptions","ForgotPasswordFormValues","email","ForgotPassword","t","navigate","emailSent","setEmailSent","submittedEmail","setSubmittedEmail","forgotPasswordSchema","object","string","min","pipe","forgotPasswordMutation","onSuccess","register","setError","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","mutateAsync","error","code","type","message","to","isPending","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/mail-check.mjs","../../../frontend/src/routes/password/forgot/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8\", key: \"12jkf8\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }],\n [\"path\", { d: \"m16 19 2 2 4-4\", key: \"1b14m6\" }]\n];\nconst MailCheck = createLucideIcon(\"mail-check\", __iconNode);\n\nexport { __iconNode, MailCheck as default };\n//# sourceMappingURL=mail-check.mjs.map\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { useMutation } from '@tanstack/react-query';\nimport {\n createFileRoute,\n Link,\n redirect,\n useNavigate,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { MailCheckIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { forgotPasswordMutationOptions } from '#frontend/queries/password-reset.ts';\n\nexport const Route = createFileRoute('/password/forgot/')({\n component: ForgotPassword,\n errorComponent: RouteErrorFallback,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config?.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype ForgotPasswordFormValues = {\n email: string;\n};\n\nfunction ForgotPassword() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const [emailSent, setEmailSent] = useState(false);\n const [submittedEmail, setSubmittedEmail] = useState('');\n\n const forgotPasswordSchema = useMemo(\n () =>\n z.object({\n email: z\n .string()\n .min(1, t('validation.email.required'))\n .pipe(z.email(t('validation.email.invalid'))),\n }),\n [t],\n );\n\n const forgotPasswordMutation = useMutation({\n ...forgotPasswordMutationOptions,\n onSuccess: () => {\n setEmailSent(true);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n defaultValues: {\n email: '',\n },\n resolver: standardSchemaResolver(forgotPasswordSchema),\n });\n\n const onSubmit = async (values: ForgotPasswordFormValues) => {\n try {\n setSubmittedEmail(values.email);\n await forgotPasswordMutation.mutateAsync(values);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'USER_NOT_EDITABLE'\n ) {\n setError('email', {\n type: 'manual',\n message: t('forgotPassword.error.notEditable'),\n });\n } else {\n setEmailSent(true);\n }\n }\n };\n\n if (emailSent) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('forgotPassword.success.subtitle')}\n <br />\n {t('forgotPassword.success.description', {\n email: submittedEmail,\n })}\n </>\n }\n icon={MailCheckIcon}\n title={t('forgotPassword.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/login' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.backToLogin')}\n </TRButton>\n <TRText align=\"center\" color=\"muted\" variant=\"caption\">\n {t('forgotPassword.success.checkSpam')}\n </TRText>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('forgotPassword.subtitle')}\n title={t('forgotPassword.title')}\n />\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n autoComplete=\"email\"\n error={errors.email}\n icon={MailIcon}\n label={t('forgotPassword.email.label')}\n placeholder={t('forgotPassword.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={forgotPasswordMutation.isPending}\n loadingLabel={t('forgotPassword.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.submit')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={<Link to=\"/login\">{t('register.link.login')}</Link>}\n text={t('forgotPassword.footer.rememberedPassword')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forgot-
|
|
1
|
+
{"version":3,"file":"forgot-UcpXAI9J.js","names":["RouteErrorFallback","ForgotPasswordFormValues","email","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/password/forgot/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { useMutation } from '@tanstack/react-query';\nimport {\n createFileRoute,\n Link,\n redirect,\n useNavigate,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { MailCheckIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { forgotPasswordMutationOptions } from '#frontend/queries/password-reset.ts';\n\nexport const Route = createFileRoute('/password/forgot/')({\n component: ForgotPassword,\n errorComponent: RouteErrorFallback,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config?.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype ForgotPasswordFormValues = {\n email: string;\n};\n\nfunction ForgotPassword() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const [emailSent, setEmailSent] = useState(false);\n const [submittedEmail, setSubmittedEmail] = useState('');\n\n const forgotPasswordSchema = useMemo(\n () =>\n z.object({\n email: z\n .string()\n .min(1, t('validation.email.required'))\n .pipe(z.email(t('validation.email.invalid'))),\n }),\n [t],\n );\n\n const forgotPasswordMutation = useMutation({\n ...forgotPasswordMutationOptions,\n onSuccess: () => {\n setEmailSent(true);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n defaultValues: {\n email: '',\n },\n resolver: standardSchemaResolver(forgotPasswordSchema),\n });\n\n const onSubmit = async (values: ForgotPasswordFormValues) => {\n try {\n setSubmittedEmail(values.email);\n await forgotPasswordMutation.mutateAsync(values);\n } catch (error) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === 'USER_NOT_EDITABLE'\n ) {\n setError('email', {\n type: 'manual',\n message: t('forgotPassword.error.notEditable'),\n });\n } else {\n setEmailSent(true);\n }\n }\n };\n\n if (emailSent) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('forgotPassword.success.subtitle')}\n <br />\n {t('forgotPassword.success.description', {\n email: submittedEmail,\n })}\n </>\n }\n icon={MailCheckIcon}\n title={t('forgotPassword.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/login' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.backToLogin')}\n </TRButton>\n <TRText align=\"center\" color=\"muted\" variant=\"caption\">\n {t('forgotPassword.success.checkSpam')}\n </TRText>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('forgotPassword.subtitle')}\n title={t('forgotPassword.title')}\n />\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n autoComplete=\"email\"\n error={errors.email}\n icon={MailIcon}\n label={t('forgotPassword.email.label')}\n placeholder={t('forgotPassword.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={forgotPasswordMutation.isPending}\n loadingLabel={t('forgotPassword.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('forgotPassword.submit')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={<Link to=\"/login\">{t('register.link.login')}</Link>}\n text={t('forgotPassword.footer.rememberedPassword')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"wCA8CE,IAAAG,EAxBOH"}
|