@alepha/ui 0.18.3 → 0.19.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/admin/{AdminApiKeys-Dy_k-4Vd.js → AdminApiKeys-Bt1PjO6o.js} +3 -4
- package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js.map → AdminApiKeys-Bt1PjO6o.js.map} +1 -1
- package/dist/admin/{AdminAudits-CKiFMSSU.js → AdminAudits-C7c1CN4c.js} +3 -4
- package/dist/admin/{AdminAudits-CKiFMSSU.js.map → AdminAudits-C7c1CN4c.js.map} +1 -1
- package/dist/admin/{AdminDashboard-PhC_dZqo.js → AdminDashboard-C3RXpTp6.js} +3 -4
- package/dist/admin/{AdminDashboard-PhC_dZqo.js.map → AdminDashboard-C3RXpTp6.js.map} +1 -1
- package/dist/admin/{AdminFiles-DFTjijGp.js → AdminFiles-31ivR6Wq.js} +3 -4
- package/dist/admin/{AdminFiles-DFTjijGp.js.map → AdminFiles-31ivR6Wq.js.map} +1 -1
- package/dist/admin/{AdminJobDashboard-BL8gGPDp.js → AdminJobDashboard-BABLe7hL.js} +73 -25
- package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D9E-CS-U.js → AdminJobExecutions-D-G8RIlr.js} +3 -4
- package/dist/admin/{AdminJobExecutions-D9E-CS-U.js.map → AdminJobExecutions-D-G8RIlr.js.map} +1 -1
- package/dist/admin/{AdminJobRegistry-Ci9ue1zC.js → AdminJobRegistry-oIS3K9NX.js} +3 -4
- package/dist/admin/{AdminJobRegistry-Ci9ue1zC.js.map → AdminJobRegistry-oIS3K9NX.js.map} +1 -1
- package/dist/admin/{AdminLayout-I6TlUMPc.js → AdminLayout-BmZ9mtXh.js} +8 -25
- package/dist/admin/AdminLayout-BmZ9mtXh.js.map +1 -0
- package/dist/admin/{AdminNotifications-ZPHCYrv7.js → AdminNotifications-DHdzksww.js} +3 -4
- package/dist/admin/{AdminNotifications-ZPHCYrv7.js.map → AdminNotifications-DHdzksww.js.map} +1 -1
- package/dist/admin/{AdminParameters-CqgvhRsb.js → AdminParameters-CyZQSXnN.js} +3 -12
- package/dist/admin/{AdminParameters-CqgvhRsb.js.map → AdminParameters-CyZQSXnN.js.map} +1 -1
- package/dist/admin/{AdminSessions-Bz5NRuoW.js → AdminSessions--xwELDSO.js} +3 -4
- package/dist/admin/{AdminSessions-Bz5NRuoW.js.map → AdminSessions--xwELDSO.js.map} +1 -1
- package/dist/admin/{AdminUserLayout-lXT6I0Qq.js → AdminUserLayout-DvBTG5gd.js} +72 -111
- package/dist/admin/AdminUserLayout-DvBTG5gd.js.map +1 -0
- package/dist/admin/{AdminUserProfile-vFBLoJ3h.js → AdminUserProfile-CzsPBl6Z.js} +7 -6
- package/dist/admin/AdminUserProfile-CzsPBl6Z.js.map +1 -0
- package/dist/admin/{AdminUserSessions-CT_YDim0.js → AdminUserSessions-C-aUnhVN.js} +3 -4
- package/dist/admin/{AdminUserSessions-CT_YDim0.js.map → AdminUserSessions-C-aUnhVN.js.map} +1 -1
- package/dist/admin/{AdminUsers-D1UfGya9.js → AdminUsers-BYwei5sj.js} +4 -4
- package/dist/admin/AdminUsers-BYwei5sj.js.map +1 -0
- package/dist/admin/{AuthLayout-_frhdgOO.js → AuthLayout-CkPGLJku.js} +3 -4
- package/dist/admin/{AuthLayout-_frhdgOO.js.map → AuthLayout-CkPGLJku.js.map} +1 -1
- package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/admin/{Login-xtNmQtGh.js → Login-DSBqNsZc.js} +5 -6
- package/dist/{auth/Login-BA1E8IZl.js.map → admin/Login-DSBqNsZc.js.map} +1 -1
- package/dist/admin/{Profile-_AtPUwAP.js → Profile-CDRjJo0P.js} +3 -5
- package/dist/{demo/Profile-DS5q4vOh.js.map → admin/Profile-CDRjJo0P.js.map} +1 -1
- package/dist/admin/{Register-JcCjHUUn.js → Register-4QGFOnfh.js} +5 -6
- package/dist/{demo/Register-B4hLBeEv.js.map → admin/Register-4QGFOnfh.js.map} +1 -1
- package/dist/admin/{ResetPassword-CwGBPLJO.js → ResetPassword-Gxc9L_mY.js} +4 -5
- package/dist/{auth/ResetPassword-DCtGcneA.js.map → admin/ResetPassword-Gxc9L_mY.js.map} +1 -1
- package/dist/admin/{VerifyEmail-hNxWejWf.js → VerifyEmail-D7G5NnaN.js} +4 -5
- package/dist/{auth/VerifyEmail-DkH7NBfn.js.map → admin/VerifyEmail-D7G5NnaN.js.map} +1 -1
- package/dist/admin/adminUserAtom-DCi4wf-v.js +11 -0
- package/dist/admin/adminUserAtom-DCi4wf-v.js.map +1 -0
- package/dist/admin/{core-CYaRQ8O-.js → core-D1AbU50V.js} +24 -85
- package/dist/admin/core-D1AbU50V.js.map +1 -0
- package/dist/admin/index.d.ts +59 -10
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +35 -36
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/{demo/AuthLayout-Brri4A-L.js → auth/AuthLayout-CfRKcTqP.js} +3 -4
- package/dist/auth/{AuthLayout-AvLlcLjS.js.map → AuthLayout-CfRKcTqP.js.map} +1 -1
- package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/auth/{Login-BA1E8IZl.js → Login-DJyweoPS.js} +5 -6
- package/dist/{demo/Login-C12N4oGs.js.map → auth/Login-DJyweoPS.js.map} +1 -1
- package/dist/{demo/Profile-DS5q4vOh.js → auth/Profile-Cy93pNTw.js} +3 -5
- package/dist/auth/{Profile-YcWdeuFz.js.map → Profile-Cy93pNTw.js.map} +1 -1
- package/dist/auth/{Register-CPhEO5MG.js → Register-CSqzzitW.js} +5 -6
- package/dist/{admin/Register-JcCjHUUn.js.map → auth/Register-CSqzzitW.js.map} +1 -1
- package/dist/{demo/ResetPassword-D8g9ha1N.js → auth/ResetPassword-B61QPlQi.js} +4 -5
- package/dist/{admin/ResetPassword-CwGBPLJO.js.map → auth/ResetPassword-B61QPlQi.js.map} +1 -1
- package/dist/auth/{VerifyEmail-DkH7NBfn.js → VerifyEmail-CqBJ11id.js} +4 -5
- package/dist/{admin/VerifyEmail-hNxWejWf.js.map → auth/VerifyEmail-CqBJ11id.js.map} +1 -1
- package/dist/auth/{core-D5jIAVF2.js → core-C6D3pazL.js} +22 -54
- package/dist/auth/core-C6D3pazL.js.map +1 -0
- package/dist/auth/index.d.ts +0 -6
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +13 -18
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/core/index.d.ts +10 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +21 -91
- package/dist/core/index.js.map +1 -1
- package/dist/{auth/AuthLayout-AvLlcLjS.js → demo/AuthLayout-Dq5tSLSc.js} +3 -4
- package/dist/demo/{AuthLayout-Brri4A-L.js.map → AuthLayout-Dq5tSLSc.js.map} +1 -1
- package/dist/demo/{DemoButton-wiCxZZ_L.js → DemoButton-_Ws2w-J0.js} +4 -5
- package/dist/demo/{DemoButton-wiCxZZ_L.js.map → DemoButton-_Ws2w-J0.js.map} +1 -1
- package/dist/demo/{DemoControlSelect-D7ILObVg.js → DemoControlSelect-ChP4ZOpQ.js} +4 -5
- package/dist/demo/{DemoControlSelect-D7ILObVg.js.map → DemoControlSelect-ChP4ZOpQ.js.map} +1 -1
- package/dist/demo/{DemoDataTable-DZ5Y8pFX.js → DemoDataTable-Hwf_UUni.js} +4 -5
- package/dist/demo/{DemoDataTable-DZ5Y8pFX.js.map → DemoDataTable-Hwf_UUni.js.map} +1 -1
- package/dist/demo/{DemoDialog-CUWdLHim.js → DemoDialog-B01OMVRd.js} +3 -4
- package/dist/demo/{DemoDialog-CUWdLHim.js.map → DemoDialog-B01OMVRd.js.map} +1 -1
- package/dist/demo/{DemoFlex-a8OhMMvq.js → DemoFlex-870PEl0V.js} +4 -5
- package/dist/demo/{DemoFlex-a8OhMMvq.js.map → DemoFlex-870PEl0V.js.map} +1 -1
- package/dist/demo/{DemoHeading-C13OVDfS.js → DemoHeading-C1YR27fz.js} +4 -5
- package/dist/demo/{DemoHeading-C13OVDfS.js.map → DemoHeading-C1YR27fz.js.map} +1 -1
- package/dist/demo/{DemoHome-D_De3UiT.js → DemoHome-DRbL2eGf.js} +4 -5
- package/dist/demo/{DemoHome-D_De3UiT.js.map → DemoHome-DRbL2eGf.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-B50s9aGM.js → DemoJsonViewer-DoABiqBW.js} +4 -5
- package/dist/demo/{DemoJsonViewer-B50s9aGM.js.map → DemoJsonViewer-DoABiqBW.js.map} +1 -1
- package/dist/demo/{DemoLayout-CHU8WTwO.js → DemoLayout-CN_PDCX2.js} +4 -5
- package/dist/demo/DemoLayout-CN_PDCX2.js.map +1 -0
- package/dist/demo/{DemoLogin-BBlrWpml.js → DemoLogin-B5x-ug3Q.js} +10 -11
- package/dist/demo/{DemoLogin-BBlrWpml.js.map → DemoLogin-B5x-ug3Q.js.map} +1 -1
- package/dist/demo/{DemoRegister-BuNE3_-f.js → DemoRegister-Q6sg2xuV.js} +10 -11
- package/dist/demo/{DemoRegister-BuNE3_-f.js.map → DemoRegister-Q6sg2xuV.js.map} +1 -1
- package/dist/demo/{DemoResetPassword-D_IjjjOJ.js → DemoResetPassword-DrqZfmEw.js} +10 -11
- package/dist/demo/{DemoResetPassword-D_IjjjOJ.js.map → DemoResetPassword-DrqZfmEw.js.map} +1 -1
- package/dist/demo/{DemoSidebar-Giy2HRBD.js → DemoSidebar-CfKS6w1o.js} +4 -5
- package/dist/demo/{DemoSidebar-Giy2HRBD.js.map → DemoSidebar-CfKS6w1o.js.map} +1 -1
- package/dist/demo/{DemoText-ubcw-vog.js → DemoText-pT6Gi5b5.js} +4 -5
- package/dist/demo/{DemoText-ubcw-vog.js.map → DemoText-pT6Gi5b5.js.map} +1 -1
- package/dist/demo/{DemoToast-9die_dYT.js → DemoToast-I13NBzQQ.js} +3 -4
- package/dist/demo/{DemoToast-9die_dYT.js.map → DemoToast-I13NBzQQ.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-D_d6OVKL.js → DemoTypeForm-BqzcrtvN.js} +4 -5
- package/dist/demo/{DemoTypeForm-D_d6OVKL.js.map → DemoTypeForm-BqzcrtvN.js.map} +1 -1
- package/dist/demo/{DemoVerifyEmail-B43KlF4F.js → DemoVerifyEmail-HwD8xfQw.js} +10 -11
- package/dist/demo/{DemoVerifyEmail-B43KlF4F.js.map → DemoVerifyEmail-HwD8xfQw.js.map} +1 -1
- package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
- package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
- package/dist/demo/{Login-C12N4oGs.js → Login-CqG1iJbn.js} +5 -6
- package/dist/{admin/Login-xtNmQtGh.js.map → demo/Login-CqG1iJbn.js.map} +1 -1
- package/dist/{auth/Profile-YcWdeuFz.js → demo/Profile-C0ojJCaG.js} +3 -5
- package/dist/{admin/Profile-_AtPUwAP.js.map → demo/Profile-C0ojJCaG.js.map} +1 -1
- package/dist/demo/{Register-B4hLBeEv.js → Register-KKZwr_lL.js} +5 -6
- package/dist/{auth/Register-CPhEO5MG.js.map → demo/Register-KKZwr_lL.js.map} +1 -1
- package/dist/{auth/ResetPassword-DCtGcneA.js → demo/ResetPassword-DMrLFEtr.js} +4 -5
- package/dist/demo/{ResetPassword-D8g9ha1N.js.map → ResetPassword-DMrLFEtr.js.map} +1 -1
- package/dist/demo/{Showcase-D6Fxt4X4.js → Showcase-D49Wud2v.js} +3 -5
- package/dist/demo/{Showcase-D6Fxt4X4.js.map → Showcase-D49Wud2v.js.map} +1 -1
- package/dist/demo/{VerifyEmail-BjDo0cZA.js → VerifyEmail-BFCAFz6T.js} +4 -5
- package/dist/demo/{VerifyEmail-BjDo0cZA.js.map → VerifyEmail-BFCAFz6T.js.map} +1 -1
- package/dist/demo/{auth-ByVTreDl.js → auth-D9qTZzCa.js} +18 -35
- package/dist/demo/{auth-ByVTreDl.js.map → auth-D9qTZzCa.js.map} +1 -1
- package/dist/demo/{core-DFgB3yU4.js → core-DRtQklr3.js} +23 -86
- package/dist/demo/core-DRtQklr3.js.map +1 -0
- package/dist/demo/index.js +19 -22
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
- package/package.json +17 -17
- package/src/admin/AdminRouter.tsx +18 -1
- package/src/admin/atoms/adminUserAtom.ts +7 -0
- package/src/admin/components/AdminLayout.tsx +2 -14
- package/src/admin/components/jobs/AdminJobDashboard.tsx +51 -20
- package/src/admin/components/users/AdminUserLayout.tsx +84 -127
- package/src/admin/components/users/AdminUserProfile.tsx +5 -2
- package/src/admin/components/users/AdminUsers.tsx +1 -1
- package/src/core/components/Flex.tsx +24 -0
- package/src/core/components/buttons/ActionButton.tsx +1 -0
- package/src/core/components/dialogs/PromptDialog.tsx +1 -1
- package/src/core/components/layout/Breadcrumb.tsx +2 -2
- package/src/core/components/layout/DashboardShell.tsx +1 -1
- package/src/core/services/DialogService.tsx +2 -2
- package/src/core/styles.css +2 -1
- package/src/core/table/components/DataTable.tsx +0 -1
- package/dist/admin/AdminJobDashboard-BL8gGPDp.js.map +0 -1
- package/dist/admin/AdminLayout-I6TlUMPc.js.map +0 -1
- package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +0 -1
- package/dist/admin/AdminUserProfile-vFBLoJ3h.js.map +0 -1
- package/dist/admin/AdminUsers-D1UfGya9.js.map +0 -1
- package/dist/admin/core-CYaRQ8O-.js.map +0 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/auth/core-D5jIAVF2.js.map +0 -1
- package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/demo/DemoLayout-CHU8WTwO.js.map +0 -1
- package/dist/demo/core-DFgB3yU4.js.map +0 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetPassword-DCtGcneA.js","names":[],"sources":["../../src/auth/components/ResetPassword.tsx"],"sourcesContent":["import { ActionButton, Control } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Image, PinInput, Text, Title } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconInfoCircle,\n IconLock,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type {\n PasswordResetIntentResponse,\n RealmConfig,\n UserController,\n} from \"alepha/api/users\";\nimport { resetPasswordRequestSchema } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\n\nexport interface ResetPasswordProps {\n realmConfig: RealmConfig;\n loginPath?: string;\n}\n\ntype Step = \"email\" | \"code\" | \"password\" | \"success\";\n\ninterface ResetState {\n step: Step;\n intent?: PasswordResetIntentResponse;\n email?: string;\n code?: string;\n}\n\nconst ResetPassword = (props: ResetPasswordProps) => {\n const router = useRouter();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const [resetState, setResetState] = useState<ResetState>({ step: \"email\" });\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const redirect = router.query.r || \"/\";\n\n const settings = props.realmConfig.settings;\n const isResetPasswordAllowed = settings?.resetPasswordAllowed !== false;\n\n // Phase 1: Request password reset intent\n const emailForm = useForm({\n schema: resetPasswordRequestSchema,\n handler: async (data) => {\n setError(null);\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: data.email },\n });\n\n setResetState({\n step: \"code\",\n intent,\n email: data.email,\n });\n },\n });\n\n // Phase 2: Complete password reset\n const passwordForm = useForm(\n {\n schema: t.object({\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n }),\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new AlephaError(\"Passwords do not match\");\n }\n\n if (!resetState.intent || !resetState.code) {\n throw new AlephaError(\"Invalid reset state\");\n }\n\n await userCtrl.completePasswordReset({\n body: {\n intentId: resetState.intent.intentId,\n code: resetState.code,\n newPassword: data.password,\n },\n });\n\n setResetState({ step: \"success\" });\n },\n },\n [resetState.intent, resetState.code],\n );\n\n const handleCodeComplete = (value: string) => {\n if (value.length === 6) {\n setResetState((prev) => ({\n ...prev,\n step: \"password\",\n code: value,\n }));\n }\n };\n\n const handleResendCode = async () => {\n if (!resetState.email) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: resetState.email },\n });\n\n setResetState((prev) => ({\n ...prev,\n intent,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to resend code\");\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl ||\n settings.displayName ||\n settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {error && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error}</Text>\n </Alert>\n )}\n\n {!isResetPasswordAllowed ? (\n <>\n <Alert\n variant=\"light\"\n color=\"yellow\"\n icon={<IconAlertCircle />}\n >\n <Text size=\"sm\">{tr(\"resetPasswordDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : \"\"}`}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n ) : resetState.step === \"email\" ? (\n <form {...emailForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterEmail\")}\n </Text>\n <Control\n label={tr(\"resetPasswordEmail\")}\n input={emailForm.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n autoFocus: true,\n disabled: !isResetPasswordAllowed,\n }}\n />\n <ActionButton\n form={emailForm}\n disabled={!isResetPasswordAllowed}\n >\n {tr(\"resetPasswordSendCode\")}\n </ActionButton>\n </Flex>\n </form>\n ) : resetState.step === \"code\" ? (\n <Flex direction=\"column\" gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"blue\" icon={<IconInfoCircle />}>\n <Text size=\"sm\">{tr(\"resetPasswordCodeSent\")}</Text>\n </Alert>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"resetPasswordEnterCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n type=\"number\"\n autoFocus\n oneTimeCode\n onComplete={handleCodeComplete}\n aria-label=\"Password reset verification code\"\n />\n </Flex>\n <ActionButton\n variant=\"subtle\"\n onClick={handleResendCode}\n loading={isSubmitting}\n >\n {tr(\"resetPasswordResendCode\")}\n </ActionButton>\n </Flex>\n ) : resetState.step === \"password\" ? (\n <form {...passwordForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterNewPassword\")}\n </Text>\n <Control\n label={tr(\"resetPasswordNewPassword\")}\n input={passwordForm.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n autoFocus: true,\n }}\n />\n <Control\n label={tr(\"resetPasswordConfirmPassword\")}\n input={passwordForm.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={passwordForm}>\n {tr(\"resetPasswordSetNewPassword\")}\n </ActionButton>\n </Flex>\n </form>\n ) : (\n <>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"resetPasswordSuccess\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : \"\"}`}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"resetPasswordCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default ResetPassword;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResetPassword-Gxc9L_mY.js","names":[],"sources":["../../src/auth/components/ResetPassword.tsx"],"sourcesContent":["import { ActionButton, Control } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Image, PinInput, Text, Title } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconInfoCircle,\n IconLock,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type {\n PasswordResetIntentResponse,\n RealmConfig,\n UserController,\n} from \"alepha/api/users\";\nimport { resetPasswordRequestSchema } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\n\nexport interface ResetPasswordProps {\n realmConfig: RealmConfig;\n loginPath?: string;\n}\n\ntype Step = \"email\" | \"code\" | \"password\" | \"success\";\n\ninterface ResetState {\n step: Step;\n intent?: PasswordResetIntentResponse;\n email?: string;\n code?: string;\n}\n\nconst ResetPassword = (props: ResetPasswordProps) => {\n const router = useRouter();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const [resetState, setResetState] = useState<ResetState>({ step: \"email\" });\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const redirect = router.query.r || \"/\";\n\n const settings = props.realmConfig.settings;\n const isResetPasswordAllowed = settings?.resetPasswordAllowed !== false;\n\n // Phase 1: Request password reset intent\n const emailForm = useForm({\n schema: resetPasswordRequestSchema,\n handler: async (data) => {\n setError(null);\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: data.email },\n });\n\n setResetState({\n step: \"code\",\n intent,\n email: data.email,\n });\n },\n });\n\n // Phase 2: Complete password reset\n const passwordForm = useForm(\n {\n schema: t.object({\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n }),\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new AlephaError(\"Passwords do not match\");\n }\n\n if (!resetState.intent || !resetState.code) {\n throw new AlephaError(\"Invalid reset state\");\n }\n\n await userCtrl.completePasswordReset({\n body: {\n intentId: resetState.intent.intentId,\n code: resetState.code,\n newPassword: data.password,\n },\n });\n\n setResetState({ step: \"success\" });\n },\n },\n [resetState.intent, resetState.code],\n );\n\n const handleCodeComplete = (value: string) => {\n if (value.length === 6) {\n setResetState((prev) => ({\n ...prev,\n step: \"password\",\n code: value,\n }));\n }\n };\n\n const handleResendCode = async () => {\n if (!resetState.email) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: resetState.email },\n });\n\n setResetState((prev) => ({\n ...prev,\n intent,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to resend code\");\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl ||\n settings.displayName ||\n settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {error && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error}</Text>\n </Alert>\n )}\n\n {!isResetPasswordAllowed ? (\n <>\n <Alert\n variant=\"light\"\n color=\"yellow\"\n icon={<IconAlertCircle />}\n >\n <Text size=\"sm\">{tr(\"resetPasswordDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : \"\"}`}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n ) : resetState.step === \"email\" ? (\n <form {...emailForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterEmail\")}\n </Text>\n <Control\n label={tr(\"resetPasswordEmail\")}\n input={emailForm.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n autoFocus: true,\n disabled: !isResetPasswordAllowed,\n }}\n />\n <ActionButton\n form={emailForm}\n disabled={!isResetPasswordAllowed}\n >\n {tr(\"resetPasswordSendCode\")}\n </ActionButton>\n </Flex>\n </form>\n ) : resetState.step === \"code\" ? (\n <Flex direction=\"column\" gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"blue\" icon={<IconInfoCircle />}>\n <Text size=\"sm\">{tr(\"resetPasswordCodeSent\")}</Text>\n </Alert>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"resetPasswordEnterCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n type=\"number\"\n autoFocus\n oneTimeCode\n onComplete={handleCodeComplete}\n aria-label=\"Password reset verification code\"\n />\n </Flex>\n <ActionButton\n variant=\"subtle\"\n onClick={handleResendCode}\n loading={isSubmitting}\n >\n {tr(\"resetPasswordResendCode\")}\n </ActionButton>\n </Flex>\n ) : resetState.step === \"password\" ? (\n <form {...passwordForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterNewPassword\")}\n </Text>\n <Control\n label={tr(\"resetPasswordNewPassword\")}\n input={passwordForm.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n autoFocus: true,\n }}\n />\n <Control\n label={tr(\"resetPasswordConfirmPassword\")}\n input={passwordForm.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={passwordForm}>\n {tr(\"resetPasswordSetNewPassword\")}\n </ActionButton>\n </Flex>\n </form>\n ) : (\n <>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"resetPasswordSuccess\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : \"\"}`}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"resetPasswordCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default ResetPassword;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-
|
|
2
|
-
import { _ as ActionButton } from "./core-
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
|
|
2
|
+
import { _ as ActionButton } from "./core-D1AbU50V.js";
|
|
3
3
|
import { useI18n } from "alepha/react/i18n";
|
|
4
4
|
import { Alert, Card, Flex, Loader, Text } from "@mantine/core";
|
|
5
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -7,7 +7,6 @@ import { useEffect, useState } from "react";
|
|
|
7
7
|
import { IconAlertCircle, IconCheck, IconMailCheck } from "@tabler/icons-react";
|
|
8
8
|
import { useRouterState } from "alepha/react/router";
|
|
9
9
|
import { useClient } from "alepha/react";
|
|
10
|
-
|
|
11
10
|
//#region ../../src/auth/components/VerifyEmail.tsx
|
|
12
11
|
var VerifyEmail_exports = /* @__PURE__ */ __exportAll({ default: () => VerifyEmail });
|
|
13
12
|
const VerifyEmailStateful = (props) => {
|
|
@@ -144,7 +143,7 @@ const VerifyEmail = (props) => {
|
|
|
144
143
|
});
|
|
145
144
|
return /* @__PURE__ */ jsx(VerifyEmailStateful, { ...props });
|
|
146
145
|
};
|
|
147
|
-
|
|
148
146
|
//#endregion
|
|
149
147
|
export { VerifyEmail_exports as t };
|
|
150
|
-
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=VerifyEmail-D7G5NnaN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyEmail-
|
|
1
|
+
{"version":3,"file":"VerifyEmail-D7G5NnaN.js","names":[],"sources":["../../src/auth/components/VerifyEmail.tsx"],"sourcesContent":["import { ActionButton } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Loader, Text } from \"@mantine/core\";\nimport { IconAlertCircle, IconCheck, IconMailCheck } from \"@tabler/icons-react\";\nimport type { UserController } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useEffect, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\n\nexport type VerifyEmailStep = \"verifying\" | \"success\" | \"error\";\n\nexport interface VerifyEmailProps {\n loginPath?: string;\n step?: VerifyEmailStep;\n}\n\nconst VerifyEmailStateful = (props: VerifyEmailProps) => {\n const state = useRouterState();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n\n const [step, setStep] = useState<VerifyEmailStep>(\"verifying\");\n const [error, setError] = useState<string | null>(null);\n\n const email = state.query.email as string | undefined;\n const token = state.query.token as string | undefined;\n\n useEffect(() => {\n const verify = async () => {\n if (!email || !token) {\n setError(tr(\"verifyEmailMissingParams\"));\n setStep(\"error\");\n return;\n }\n\n try {\n await userCtrl.verifyEmail({\n body: { email, token },\n });\n setStep(\"success\");\n } catch (err) {\n setError(err instanceof Error ? err.message : tr(\"verifyEmailFailed\"));\n setStep(\"error\");\n }\n };\n\n verify();\n }, [email, token]);\n\n return (\n <VerifyEmailView step={step} error={error} loginPath={props.loginPath} />\n );\n};\n\ninterface VerifyEmailViewProps {\n step: VerifyEmailStep;\n error?: string | null;\n loginPath?: string;\n}\n\nconst VerifyEmailView = (props: VerifyEmailViewProps) => {\n const { tr } = useI18n<AuthI18n, \"en\">();\n const { step } = props;\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" gap=\"sm\" w={400}>\n <Card withBorder p=\"lg\" bg=\"var(--alepha-elevated)\">\n <Flex direction=\"column\" gap=\"md\" align=\"center\">\n {step === \"verifying\" && (\n <>\n <Loader size=\"lg\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailVerifying\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"verifyEmailPleaseWait\")}\n </Text>\n </>\n )}\n\n {step === \"success\" && (\n <>\n <IconMailCheck size={48} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"verifyEmailSuccess\")}</Text>\n </Alert>\n <ActionButton href={props.loginPath ?? \"/auth/login\"} fullWidth>\n {tr(\"verifyEmailSignIn\")}\n </ActionButton>\n </>\n )}\n\n {step === \"error\" && (\n <>\n <IconAlertCircle size={48} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">\n {props.error || tr(\"verifyEmailFailed\")}\n </Text>\n </Alert>\n <ActionButton href={props.loginPath ?? \"/auth/login\"} fullWidth>\n {tr(\"verifyEmailBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n </Flex>\n </Flex>\n );\n};\n\nconst VerifyEmail = (props: VerifyEmailProps) => {\n if (props.step) {\n return <VerifyEmailView step={props.step} loginPath={props.loginPath} />;\n }\n return <VerifyEmailStateful {...props} />;\n};\n\nexport default VerifyEmail;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { $atom, t } from "alepha";
|
|
2
|
+
import { users } from "alepha/api/users";
|
|
3
|
+
//#region ../../src/admin/atoms/adminUserAtom.ts
|
|
4
|
+
const adminUserAtom = $atom({
|
|
5
|
+
name: "alepha.admin.user",
|
|
6
|
+
schema: t.optional(users.schema)
|
|
7
|
+
});
|
|
8
|
+
//#endregion
|
|
9
|
+
export { adminUserAtom as t };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=adminUserAtom-DCi4wf-v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adminUserAtom-DCi4wf-v.js","names":[],"sources":["../../src/admin/atoms/adminUserAtom.ts"],"sourcesContent":["import { $atom, t } from \"alepha\";\nimport { users } from \"alepha/api/users\";\n\nexport const adminUserAtom = $atom({\n name: \"alepha.admin.user\",\n schema: t.optional(users.schema),\n});\n"],"mappings":";;;AAGA,MAAa,gBAAgB,MAAM;CACjC,MAAM;CACN,QAAQ,EAAE,SAAS,MAAM,OAAO;CACjC,CAAC"}
|