@mesob/auth-react 0.3.5 → 0.4.1
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/chunk-35TCGAW3.js +98 -0
- package/dist/chunk-35TCGAW3.js.map +1 -0
- package/dist/chunk-3BZC4VVD.js +36 -0
- package/dist/chunk-3BZC4VVD.js.map +1 -0
- package/dist/chunk-45UCLKH2.js +188 -0
- package/dist/chunk-45UCLKH2.js.map +1 -0
- package/dist/chunk-55BMNC4S.js +115 -0
- package/dist/chunk-55BMNC4S.js.map +1 -0
- package/dist/chunk-5F5FZMHE.js +94 -0
- package/dist/chunk-5F5FZMHE.js.map +1 -0
- package/dist/chunk-5M7I7WNH.js +31 -0
- package/dist/chunk-5M7I7WNH.js.map +1 -0
- package/dist/chunk-72YRO3A7.js +288 -0
- package/dist/chunk-72YRO3A7.js.map +1 -0
- package/dist/chunk-7KXTL6NT.js +48 -0
- package/dist/chunk-7KXTL6NT.js.map +1 -0
- package/dist/chunk-AIMD6R6U.js +466 -0
- package/dist/chunk-AIMD6R6U.js.map +1 -0
- package/dist/chunk-BGSHXIHI.js +953 -0
- package/dist/chunk-BGSHXIHI.js.map +1 -0
- package/dist/chunk-BZ42QPXE.js +271 -0
- package/dist/chunk-BZ42QPXE.js.map +1 -0
- package/dist/chunk-C26NPUPI.js +272 -0
- package/dist/chunk-C26NPUPI.js.map +1 -0
- package/dist/chunk-C2KFZ57H.js +194 -0
- package/dist/chunk-C2KFZ57H.js.map +1 -0
- package/dist/chunk-C5ZW7FD2.js +46 -0
- package/dist/chunk-C5ZW7FD2.js.map +1 -0
- package/dist/chunk-DPH2PHK3.js +32 -0
- package/dist/chunk-DPH2PHK3.js.map +1 -0
- package/dist/chunk-EQ4346FE.js +139 -0
- package/dist/chunk-EQ4346FE.js.map +1 -0
- package/dist/chunk-FAHN63DA.js +535 -0
- package/dist/chunk-FAHN63DA.js.map +1 -0
- package/dist/chunk-FBABIA5J.js +345 -0
- package/dist/chunk-FBABIA5J.js.map +1 -0
- package/dist/chunk-FFR5UHTS.js +99 -0
- package/dist/chunk-FFR5UHTS.js.map +1 -0
- package/dist/chunk-FHOLUOOZ.js +164 -0
- package/dist/chunk-FHOLUOOZ.js.map +1 -0
- package/dist/chunk-G2AW2H36.js +11 -0
- package/dist/chunk-G2AW2H36.js.map +1 -0
- package/dist/chunk-G7SCXCCM.js +89 -0
- package/dist/chunk-G7SCXCCM.js.map +1 -0
- package/dist/chunk-GP7GIUI3.js +64 -0
- package/dist/chunk-GP7GIUI3.js.map +1 -0
- package/dist/chunk-GRT6EBR6.js +93 -0
- package/dist/chunk-GRT6EBR6.js.map +1 -0
- package/dist/chunk-GXKBVCVS.js +102 -0
- package/dist/chunk-GXKBVCVS.js.map +1 -0
- package/dist/chunk-HOO2VLNM.js +305 -0
- package/dist/chunk-HOO2VLNM.js.map +1 -0
- package/dist/chunk-II5MLBSB.js +183 -0
- package/dist/chunk-II5MLBSB.js.map +1 -0
- package/dist/chunk-ISNNPMF7.js +95 -0
- package/dist/chunk-ISNNPMF7.js.map +1 -0
- package/dist/chunk-JB6XVST4.js +141 -0
- package/dist/chunk-JB6XVST4.js.map +1 -0
- package/dist/chunk-JUHBVG5Q.js +303 -0
- package/dist/chunk-JUHBVG5Q.js.map +1 -0
- package/dist/chunk-JZZJCBAE.js +118 -0
- package/dist/chunk-JZZJCBAE.js.map +1 -0
- package/dist/chunk-KWG4DSB5.js +55 -0
- package/dist/chunk-KWG4DSB5.js.map +1 -0
- package/dist/chunk-L4CGIO2I.js +265 -0
- package/dist/chunk-L4CGIO2I.js.map +1 -0
- package/dist/chunk-LNG736CV.js +19 -0
- package/dist/chunk-LNG736CV.js.map +1 -0
- package/dist/chunk-LSYKVFJA.js +98 -0
- package/dist/chunk-LSYKVFJA.js.map +1 -0
- package/dist/chunk-LZR4YUDV.js +107 -0
- package/dist/chunk-LZR4YUDV.js.map +1 -0
- package/dist/chunk-MELNS4QH.js +255 -0
- package/dist/chunk-MELNS4QH.js.map +1 -0
- package/dist/chunk-MS2JUZ3N.js +94 -0
- package/dist/chunk-MS2JUZ3N.js.map +1 -0
- package/dist/chunk-NEO72TMH.js +32 -0
- package/dist/chunk-NEO72TMH.js.map +1 -0
- package/dist/chunk-NJPNTAAT.js +68 -0
- package/dist/chunk-NJPNTAAT.js.map +1 -0
- package/dist/chunk-NPW7D2HZ.js +16 -0
- package/dist/chunk-NPW7D2HZ.js.map +1 -0
- package/dist/chunk-OAN4EXU4.js +310 -0
- package/dist/chunk-OAN4EXU4.js.map +1 -0
- package/dist/chunk-OFLSINVU.js +138 -0
- package/dist/chunk-OFLSINVU.js.map +1 -0
- package/dist/chunk-OHIIMUQC.js +286 -0
- package/dist/chunk-OHIIMUQC.js.map +1 -0
- package/dist/chunk-OQGJX37L.js +239 -0
- package/dist/chunk-OQGJX37L.js.map +1 -0
- package/dist/chunk-OYHH7HQG.js +65 -0
- package/dist/chunk-OYHH7HQG.js.map +1 -0
- package/dist/chunk-PSRIZMWJ.js +486 -0
- package/dist/chunk-PSRIZMWJ.js.map +1 -0
- package/dist/chunk-QNCE2B5O.js +23 -0
- package/dist/chunk-QNCE2B5O.js.map +1 -0
- package/dist/chunk-RLPZFLAS.js +23 -0
- package/dist/chunk-RLPZFLAS.js.map +1 -0
- package/dist/chunk-RT5C7IAE.js +38 -0
- package/dist/chunk-RT5C7IAE.js.map +1 -0
- package/dist/chunk-S3CXCCKL.js +272 -0
- package/dist/chunk-S3CXCCKL.js.map +1 -0
- package/dist/chunk-SOCZK4CV.js +69 -0
- package/dist/chunk-SOCZK4CV.js.map +1 -0
- package/dist/chunk-T6P7UHVP.js +34 -0
- package/dist/chunk-T6P7UHVP.js.map +1 -0
- package/dist/chunk-TFVBER3Y.js +52 -0
- package/dist/chunk-TFVBER3Y.js.map +1 -0
- package/dist/chunk-UXOZ2TME.js +104 -0
- package/dist/chunk-UXOZ2TME.js.map +1 -0
- package/dist/chunk-V2W3WPCZ.js +22 -0
- package/dist/chunk-V2W3WPCZ.js.map +1 -0
- package/dist/chunk-YZ264S2L.js +286 -0
- package/dist/chunk-YZ264S2L.js.map +1 -0
- package/dist/chunk-ZESFGO3K.js +28 -0
- package/dist/chunk-ZESFGO3K.js.map +1 -0
- package/dist/chunk-ZG6WFZHX.js +143 -0
- package/dist/chunk-ZG6WFZHX.js.map +1 -0
- package/dist/components/auth/auth-card.d.ts +3 -6
- package/dist/components/auth/auth-card.js +3 -7
- package/dist/components/auth/auth-card.js.map +1 -1
- package/dist/components/auth/auth-layout.d.ts +3 -6
- package/dist/components/auth/auth-layout.js +3 -28
- package/dist/components/auth/auth-layout.js.map +1 -1
- package/dist/components/auth/countdown.d.ts +2 -5
- package/dist/components/auth/countdown.js +5 -130
- package/dist/components/auth/countdown.js.map +1 -1
- package/dist/components/auth/forgot-password.d.ts +1 -5
- package/dist/components/auth/forgot-password.js +6 -361
- package/dist/components/auth/forgot-password.js.map +1 -1
- package/dist/components/auth/reset-password-form.d.ts +2 -5
- package/dist/components/auth/reset-password-form.js +6 -483
- package/dist/components/auth/reset-password-form.js.map +1 -1
- package/dist/components/auth/set-password.d.ts +6 -0
- package/dist/components/auth/set-password.js +13 -0
- package/dist/components/auth/set-password.js.map +1 -0
- package/dist/components/auth/sign-in.d.ts +2 -5
- package/dist/components/auth/sign-in.js +7 -540
- package/dist/components/auth/sign-in.js.map +1 -1
- package/dist/components/auth/sign-up.d.ts +2 -5
- package/dist/components/auth/sign-up.js +6 -509
- package/dist/components/auth/sign-up.js.map +1 -1
- package/dist/components/auth/verification-form.d.ts +13 -2
- package/dist/components/auth/verification-form.js +5 -217
- package/dist/components/auth/verification-form.js.map +1 -1
- package/dist/components/auth/verify-email.d.ts +2 -5
- package/dist/components/auth/verify-email.js +8 -523
- package/dist/components/auth/verify-email.js.map +1 -1
- package/dist/components/auth/verify-phone.d.ts +2 -5
- package/dist/components/auth/verify-phone.js +8 -528
- package/dist/components/auth/verify-phone.js.map +1 -1
- package/dist/components/authorization/deny.d.ts +8 -0
- package/dist/components/authorization/deny.js +9 -0
- package/dist/components/authorization/deny.js.map +1 -0
- package/dist/components/authorization/grant.d.ts +9 -0
- package/dist/components/authorization/grant.js +9 -0
- package/dist/components/authorization/grant.js.map +1 -0
- package/dist/components/error-boundary.d.ts +6 -10
- package/dist/components/error-boundary.js +4 -43
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/iam/permission-selector.d.ts +16 -0
- package/dist/components/iam/permission-selector.js +9 -0
- package/dist/components/iam/permission-selector.js.map +1 -0
- package/dist/components/iam/permissions-page.d.ts +1 -0
- package/dist/components/iam/permissions-page.js +10 -0
- package/dist/components/iam/permissions-page.js.map +1 -0
- package/dist/components/iam/permissions.d.ts +1 -5
- package/dist/components/iam/permissions.js +5 -217
- package/dist/components/iam/permissions.js.map +1 -1
- package/dist/components/iam/role-detail-layout.d.ts +8 -0
- package/dist/components/iam/role-detail-layout.js +9 -0
- package/dist/components/iam/role-detail-layout.js.map +1 -0
- package/dist/components/iam/role-detail-page.d.ts +6 -0
- package/dist/components/iam/role-detail-page.js +9 -0
- package/dist/components/iam/role-detail-page.js.map +1 -0
- package/dist/components/iam/role-permissions-page.d.ts +5 -0
- package/dist/components/iam/role-permissions-page.js +10 -0
- package/dist/components/iam/role-permissions-page.js.map +1 -0
- package/dist/components/iam/roles-page.d.ts +1 -0
- package/dist/components/iam/roles-page.js +13 -0
- package/dist/components/iam/roles-page.js.map +1 -0
- package/dist/components/iam/roles.d.ts +1 -5
- package/dist/components/iam/roles.js +5 -215
- package/dist/components/iam/roles.js.map +1 -1
- package/dist/components/iam/sessions-page.d.ts +1 -0
- package/dist/components/iam/sessions-page.js +12 -0
- package/dist/components/iam/sessions-page.js.map +1 -0
- package/dist/components/iam/sessions.d.ts +1 -5
- package/dist/components/iam/sessions.js +5 -198
- package/dist/components/iam/sessions.js.map +1 -1
- package/dist/components/iam/tenants-page.d.ts +1 -0
- package/dist/components/iam/tenants-page.js +13 -0
- package/dist/components/iam/tenants-page.js.map +1 -0
- package/dist/components/iam/tenants.d.ts +1 -5
- package/dist/components/iam/tenants.js +5 -204
- package/dist/components/iam/tenants.js.map +1 -1
- package/dist/components/iam/users-page.d.ts +1 -0
- package/dist/components/iam/users-page.js +13 -0
- package/dist/components/iam/users-page.js.map +1 -0
- package/dist/components/iam/users.d.ts +1 -5
- package/dist/components/iam/users.js +5 -213
- package/dist/components/iam/users.js.map +1 -1
- package/dist/components/profile/account.d.ts +1 -5
- package/dist/components/profile/account.js +5 -61
- package/dist/components/profile/account.js.map +1 -1
- package/dist/components/profile/change-email-form.d.ts +1 -5
- package/dist/components/profile/change-email-form.js +9 -735
- package/dist/components/profile/change-email-form.js.map +1 -1
- package/dist/components/profile/change-password-form.d.ts +1 -5
- package/dist/components/profile/change-password-form.js +3 -262
- package/dist/components/profile/change-password-form.js.map +1 -1
- package/dist/components/profile/change-phone-form.d.ts +1 -5
- package/dist/components/profile/change-phone-form.js +10 -772
- package/dist/components/profile/change-phone-form.js.map +1 -1
- package/dist/components/profile/change-profile.d.ts +3 -6
- package/dist/components/profile/change-profile.js +2 -32
- package/dist/components/profile/change-profile.js.map +1 -1
- package/dist/components/profile/otp-verification-modal.d.ts +2 -5
- package/dist/components/profile/otp-verification-modal.js +6 -266
- package/dist/components/profile/otp-verification-modal.js.map +1 -1
- package/dist/components/profile/profile-layout.d.ts +4 -0
- package/dist/components/profile/profile-layout.js +10 -0
- package/dist/components/profile/profile-layout.js.map +1 -0
- package/dist/components/profile/request-change-email-form.d.ts +2 -5
- package/dist/components/profile/request-change-email-form.js +4 -285
- package/dist/components/profile/request-change-email-form.js.map +1 -1
- package/dist/components/profile/request-change-phone-form.d.ts +2 -5
- package/dist/components/profile/request-change-phone-form.js +5 -323
- package/dist/components/profile/request-change-phone-form.js.map +1 -1
- package/dist/components/profile/security.d.ts +1 -5
- package/dist/components/profile/security.js +15 -1474
- package/dist/components/profile/security.js.map +1 -1
- package/dist/components/profile/verify-change-email-form.d.ts +2 -5
- package/dist/components/profile/verify-change-email-form.js +7 -407
- package/dist/components/profile/verify-change-email-form.js.map +1 -1
- package/dist/components/profile/verify-change-phone-form.d.ts +2 -5
- package/dist/components/profile/verify-change-phone-form.js +7 -411
- package/dist/components/profile/verify-change-phone-form.js.map +1 -1
- package/dist/components/shared/data-table.d.ts +5 -8
- package/dist/components/shared/data-table.js +3 -79
- package/dist/components/shared/data-table.js.map +1 -1
- package/dist/components/skeletons/auth-form-skeleton.d.ts +1 -5
- package/dist/components/skeletons/auth-form-skeleton.js +3 -27
- package/dist/components/skeletons/auth-form-skeleton.js.map +1 -1
- package/dist/components/skeletons/profile-skeleton.d.ts +1 -5
- package/dist/components/skeletons/profile-skeleton.js +3 -28
- package/dist/components/skeletons/profile-skeleton.js.map +1 -1
- package/dist/components/skeletons/table-skeleton.d.ts +2 -5
- package/dist/components/skeletons/table-skeleton.js +3 -34
- package/dist/components/skeletons/table-skeleton.js.map +1 -1
- package/dist/constants/auth.error.codes.d.ts +5 -0
- package/dist/hooks/use-session-cookie-name.d.ts +1 -0
- package/dist/hooks/use-translator.d.ts +1 -0
- package/dist/index.d.ts +50 -84
- package/dist/index.js +160 -3861
- package/dist/index.js.map +1 -1
- package/dist/lib/query-options.d.ts +10 -0
- package/dist/lib/translations.d.ts +3 -0
- package/dist/pages/auth/forgot-password.d.ts +3 -0
- package/dist/pages/auth/forgot-password.js +22 -0
- package/dist/pages/auth/forgot-password.js.map +1 -0
- package/dist/pages/auth/layout.d.ts +4 -0
- package/dist/pages/auth/layout.js +39 -0
- package/dist/pages/auth/layout.js.map +1 -0
- package/dist/pages/auth/reset-password.d.ts +7 -0
- package/dist/pages/auth/reset-password.js +33 -0
- package/dist/pages/auth/reset-password.js.map +1 -0
- package/dist/pages/auth/set-password.d.ts +7 -0
- package/dist/pages/auth/set-password.js +28 -0
- package/dist/pages/auth/set-password.js.map +1 -0
- package/dist/pages/auth/sign-in.d.ts +7 -0
- package/dist/pages/auth/sign-in.js +26 -0
- package/dist/pages/auth/sign-in.js.map +1 -0
- package/dist/pages/auth/sign-up.d.ts +7 -0
- package/dist/pages/auth/sign-up.js +33 -0
- package/dist/pages/auth/sign-up.js.map +1 -0
- package/dist/pages/auth/verify-email.d.ts +7 -0
- package/dist/pages/auth/verify-email.js +38 -0
- package/dist/pages/auth/verify-email.js.map +1 -0
- package/dist/pages/auth/verify-phone.d.ts +7 -0
- package/dist/pages/auth/verify-phone.js +47 -0
- package/dist/pages/auth/verify-phone.js.map +1 -0
- package/dist/pages/iam/permissions/_components/permission-card.d.ts +6 -0
- package/dist/pages/iam/permissions/_components/permissions-data.d.ts +7 -0
- package/dist/pages/iam/permissions/_components/permissions-list.d.ts +14 -0
- package/dist/pages/iam/permissions.d.ts +1 -0
- package/dist/pages/iam/permissions.js +10 -0
- package/dist/pages/iam/permissions.js.map +1 -0
- package/dist/pages/iam/role-detail-layout.d.ts +9 -0
- package/dist/pages/iam/role-detail-layout.js +18 -0
- package/dist/pages/iam/role-detail-layout.js.map +1 -0
- package/dist/pages/iam/role-detail.d.ts +9 -0
- package/dist/pages/iam/role-detail.js +22 -0
- package/dist/pages/iam/role-detail.js.map +1 -0
- package/dist/pages/iam/role-permissions.d.ts +9 -0
- package/dist/pages/iam/role-permissions.js +23 -0
- package/dist/pages/iam/role-permissions.js.map +1 -0
- package/dist/pages/iam/role-users.d.ts +9 -0
- package/dist/pages/iam/role-users.js +26 -0
- package/dist/pages/iam/role-users.js.map +1 -0
- package/dist/pages/iam/roles/_components/role-card.d.ts +7 -0
- package/dist/pages/iam/roles/_components/role-form.d.ts +9 -0
- package/dist/pages/iam/roles/_components/role-selector.d.ts +11 -0
- package/dist/pages/iam/roles/_components/roles-data.d.ts +16 -0
- package/dist/pages/iam/roles/_components/roles-list.d.ts +15 -0
- package/dist/pages/iam/roles/users/_components/role-users-page.d.ts +5 -0
- package/dist/pages/iam/roles.d.ts +1 -0
- package/dist/pages/iam/roles.js +13 -0
- package/dist/pages/iam/roles.js.map +1 -0
- package/dist/pages/iam/sessions/_components/session-card.d.ts +6 -0
- package/dist/pages/iam/sessions/_components/sessions-data.d.ts +7 -0
- package/dist/pages/iam/sessions/_components/sessions-list.d.ts +14 -0
- package/dist/pages/iam/sessions.d.ts +1 -0
- package/dist/pages/iam/sessions.js +12 -0
- package/dist/pages/iam/sessions.js.map +1 -0
- package/dist/pages/iam/shared/navigation.d.ts +8 -0
- package/dist/pages/iam/shared/page-helpers.d.ts +12 -0
- package/dist/pages/iam/tenant-detail.d.ts +7 -0
- package/dist/pages/iam/tenant-detail.js +18 -0
- package/dist/pages/iam/tenant-detail.js.map +1 -0
- package/dist/pages/iam/tenants/_components/tenant-card.d.ts +6 -0
- package/dist/pages/iam/tenants/_components/tenant-form.d.ts +9 -0
- package/dist/pages/iam/tenants/_components/tenant-selector.d.ts +13 -0
- package/dist/pages/iam/tenants/_components/tenants-data.d.ts +12 -0
- package/dist/pages/iam/tenants/_components/tenants-list.d.ts +15 -0
- package/dist/pages/iam/tenants/tenant-detail-page-content.d.ts +5 -0
- package/dist/pages/iam/tenants.d.ts +1 -0
- package/dist/pages/iam/tenants.js +13 -0
- package/dist/pages/iam/tenants.js.map +1 -0
- package/dist/pages/iam/user-activity.d.ts +7 -0
- package/dist/pages/iam/user-activity.js +21 -0
- package/dist/pages/iam/user-activity.js.map +1 -0
- package/dist/pages/iam/user-detail-layout.d.ts +9 -0
- package/dist/pages/iam/user-detail-layout.js +18 -0
- package/dist/pages/iam/user-detail-layout.js.map +1 -0
- package/dist/pages/iam/user-detail.d.ts +7 -0
- package/dist/pages/iam/user-detail.js +15 -0
- package/dist/pages/iam/user-detail.js.map +1 -0
- package/dist/pages/iam/users/_components/bulk-invite-user-form.d.ts +6 -0
- package/dist/pages/iam/users/_components/invite-user-form.d.ts +6 -0
- package/dist/pages/iam/users/_components/invite-user-shared.d.ts +25 -0
- package/dist/pages/iam/users/_components/user-card.d.ts +6 -0
- package/dist/pages/iam/users/_components/user-detail-layout-content.d.ts +6 -0
- package/dist/pages/iam/users/_components/user-detail-page-content.d.ts +5 -0
- package/dist/pages/iam/users/_components/user-form.d.ts +9 -0
- package/dist/pages/iam/users/_components/user-selector.d.ts +12 -0
- package/dist/pages/iam/users/_components/users-data.d.ts +22 -0
- package/dist/pages/iam/users/_components/users-list.d.ts +15 -0
- package/dist/pages/iam/users/activity/_components/role-section.d.ts +3 -0
- package/dist/pages/iam/users/activity/user-activity-page-content.d.ts +5 -0
- package/dist/pages/iam/users.d.ts +1 -0
- package/dist/pages/iam/users.js +13 -0
- package/dist/pages/iam/users.js.map +1 -0
- package/dist/pages/profile/_components/profile-sidebar.d.ts +1 -0
- package/dist/pages/profile/account.d.ts +1 -0
- package/dist/pages/profile/account.js +33 -0
- package/dist/pages/profile/account.js.map +1 -0
- package/dist/pages/profile/layout.d.ts +1 -0
- package/dist/pages/profile/layout.js +10 -0
- package/dist/pages/profile/layout.js.map +1 -0
- package/dist/pages/profile/security.d.ts +1 -0
- package/dist/pages/profile/security.js +44 -0
- package/dist/pages/profile/security.js.map +1 -0
- package/dist/provider.d.ts +53 -0
- package/dist/types.d.ts +96 -0
- package/dist/utils/cookie.d.ts +2 -0
- package/dist/utils/custom-fetch.d.ts +2 -0
- package/dist/utils/handle-error.d.ts +7 -0
- package/dist/utils/normalize-phone.d.ts +1 -0
- package/package.json +103 -4
- package/dist/types-vcfvnAzQ.d.ts +0 -69
- package/dist/verification-form-ipSRTtQB.d.ts +0 -22
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import {
|
|
2
|
+
handleError
|
|
3
|
+
} from "./chunk-55BMNC4S.js";
|
|
4
|
+
import {
|
|
5
|
+
AuthLayout
|
|
6
|
+
} from "./chunk-DPH2PHK3.js";
|
|
7
|
+
import {
|
|
8
|
+
useTranslator
|
|
9
|
+
} from "./chunk-QNCE2B5O.js";
|
|
10
|
+
import {
|
|
11
|
+
useApi,
|
|
12
|
+
useConfig
|
|
13
|
+
} from "./chunk-72YRO3A7.js";
|
|
14
|
+
|
|
15
|
+
// src/components/auth/reset-password-form.tsx
|
|
16
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
17
|
+
import {
|
|
18
|
+
Alert,
|
|
19
|
+
AlertDescription,
|
|
20
|
+
AlertTitle,
|
|
21
|
+
Button,
|
|
22
|
+
Form,
|
|
23
|
+
FormControl,
|
|
24
|
+
FormField,
|
|
25
|
+
FormItem,
|
|
26
|
+
FormLabel,
|
|
27
|
+
FormMessage,
|
|
28
|
+
Input,
|
|
29
|
+
InputOTP,
|
|
30
|
+
InputOTPGroup,
|
|
31
|
+
InputOTPSlot,
|
|
32
|
+
useFormField
|
|
33
|
+
} from "@mesob/ui/components";
|
|
34
|
+
import { useMesob } from "@mesob/ui/providers";
|
|
35
|
+
import { IconAlertCircle, IconEye, IconEyeOff } from "@tabler/icons-react";
|
|
36
|
+
import { useEffect, useState } from "react";
|
|
37
|
+
import { useForm } from "react-hook-form";
|
|
38
|
+
import { toast } from "sonner";
|
|
39
|
+
import { z } from "zod";
|
|
40
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
41
|
+
function PasswordInput({ field, show, onToggle }) {
|
|
42
|
+
const { formItemId, error } = useFormField();
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
Input,
|
|
46
|
+
{
|
|
47
|
+
...field,
|
|
48
|
+
id: formItemId,
|
|
49
|
+
type: show ? "text" : "password",
|
|
50
|
+
"aria-invalid": !!error,
|
|
51
|
+
className: "pr-10"
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
Button,
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
variant: "ghost",
|
|
59
|
+
size: "icon",
|
|
60
|
+
className: "absolute right-0 top-0 h-full px-3 text-muted-foreground hover:text-foreground",
|
|
61
|
+
onClick: onToggle,
|
|
62
|
+
"aria-label": show ? "Hide password" : "Show password",
|
|
63
|
+
children: show ? /* @__PURE__ */ jsx(IconEyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(IconEye, { className: "h-4 w-4" })
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
var resetPasswordSchema = (t) => z.object({
|
|
69
|
+
code: z.string().length(6, t("errors.codeLength")),
|
|
70
|
+
password: z.string().min(8, t("errors.passwordLength")),
|
|
71
|
+
confirmPassword: z.string()
|
|
72
|
+
}).refine((data) => data.password === data.confirmPassword, {
|
|
73
|
+
message: t("errors.passwordsMismatch"),
|
|
74
|
+
path: ["confirmPassword"]
|
|
75
|
+
});
|
|
76
|
+
var ResetPasswordForm = ({
|
|
77
|
+
verificationId,
|
|
78
|
+
redirectUrl
|
|
79
|
+
}) => {
|
|
80
|
+
const { hooks, refresh } = useApi();
|
|
81
|
+
const { config } = useConfig();
|
|
82
|
+
const mesob = useMesob();
|
|
83
|
+
const Link = mesob?.navigation?.Link;
|
|
84
|
+
const t = useTranslator("Auth.resetPassword");
|
|
85
|
+
const common = useTranslator("Common");
|
|
86
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
87
|
+
const [error, setError] = useState(null);
|
|
88
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
89
|
+
const resetPasswordMutation = hooks.useMutation("post", "/password/reset");
|
|
90
|
+
const signInLink = config.navigation?.links?.signIn || "/auth/sign-in";
|
|
91
|
+
const forgotPasswordLink = config.navigation?.links?.forgotPassword || "/auth/forgot-password";
|
|
92
|
+
const onNavigate = config.navigation?.onNavigate || ((path) => {
|
|
93
|
+
if (typeof window !== "undefined") {
|
|
94
|
+
window.location.href = path;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const logoImage = config.ui.logoImage;
|
|
98
|
+
const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
|
|
99
|
+
const form = useForm({
|
|
100
|
+
resolver: zodResolver(resetPasswordSchema(t)),
|
|
101
|
+
defaultValues: {
|
|
102
|
+
code: "",
|
|
103
|
+
password: "",
|
|
104
|
+
confirmPassword: ""
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (error) {
|
|
109
|
+
toast.error(error.title || "Error", {
|
|
110
|
+
description: error.description
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}, [error]);
|
|
114
|
+
const handleSubmit = form.handleSubmit(async (values) => {
|
|
115
|
+
if (!verificationId) {
|
|
116
|
+
setError({
|
|
117
|
+
title: t("errors.fallback"),
|
|
118
|
+
description: t("errors.missingVerificationId")
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
setIsLoading(true);
|
|
123
|
+
setError(null);
|
|
124
|
+
try {
|
|
125
|
+
await resetPasswordMutation.mutateAsync({
|
|
126
|
+
body: {
|
|
127
|
+
verificationId,
|
|
128
|
+
code: values.code,
|
|
129
|
+
password: values.password
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
await refresh();
|
|
133
|
+
onNavigate(defaultRedirect);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
handleError(err, setError, t);
|
|
136
|
+
} finally {
|
|
137
|
+
setIsLoading(false);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
if (!verificationId) {
|
|
141
|
+
return /* @__PURE__ */ jsx(
|
|
142
|
+
AuthLayout,
|
|
143
|
+
{
|
|
144
|
+
title: common("invalidLinkTitle"),
|
|
145
|
+
description: common("invalidLinkDescription"),
|
|
146
|
+
logoImage,
|
|
147
|
+
footer: /* @__PURE__ */ jsx(
|
|
148
|
+
Link,
|
|
149
|
+
{
|
|
150
|
+
href: forgotPasswordLink,
|
|
151
|
+
className: "text-primary hover:underline",
|
|
152
|
+
children: t("footer.requestNew")
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
children: /* @__PURE__ */ jsx("div", {})
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
let errorContent = null;
|
|
160
|
+
if (error) {
|
|
161
|
+
if (typeof error === "string") {
|
|
162
|
+
errorContent = { title: "Error", description: error };
|
|
163
|
+
} else {
|
|
164
|
+
errorContent = error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return /* @__PURE__ */ jsxs(
|
|
168
|
+
AuthLayout,
|
|
169
|
+
{
|
|
170
|
+
title: config.ui.name,
|
|
171
|
+
description: t("description"),
|
|
172
|
+
logoImage,
|
|
173
|
+
footer: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between w-full gap-2", children: [
|
|
174
|
+
/* @__PURE__ */ jsx(Link, { href: signInLink, className: "text-primary hover:underline", children: t("footer.backToSignIn") }),
|
|
175
|
+
/* @__PURE__ */ jsx(
|
|
176
|
+
Link,
|
|
177
|
+
{
|
|
178
|
+
href: forgotPasswordLink,
|
|
179
|
+
className: "text-primary hover:underline",
|
|
180
|
+
children: t("footer.changeAccount")
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
] }),
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Form, { ...form, children: /* @__PURE__ */ jsxs(
|
|
186
|
+
"form",
|
|
187
|
+
{
|
|
188
|
+
id: "reset-password-form",
|
|
189
|
+
onSubmit: handleSubmit,
|
|
190
|
+
className: "space-y-4",
|
|
191
|
+
children: [
|
|
192
|
+
/* @__PURE__ */ jsx(
|
|
193
|
+
FormField,
|
|
194
|
+
{
|
|
195
|
+
control: form.control,
|
|
196
|
+
name: "code",
|
|
197
|
+
render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
|
|
198
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(FormLabel, { children: t("form.codeLabel") }) }),
|
|
199
|
+
/* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(
|
|
200
|
+
InputOTP,
|
|
201
|
+
{
|
|
202
|
+
maxLength: 6,
|
|
203
|
+
value: field.value,
|
|
204
|
+
onChange: field.onChange,
|
|
205
|
+
onBlur: field.onBlur,
|
|
206
|
+
containerClassName: "gap-4 flex justify-center mt-2",
|
|
207
|
+
children: /* @__PURE__ */ jsxs(InputOTPGroup, { className: "gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl", children: [
|
|
208
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 0 }),
|
|
209
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 1 }),
|
|
210
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 2 }),
|
|
211
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 3 }),
|
|
212
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 4 }),
|
|
213
|
+
/* @__PURE__ */ jsx(InputOTPSlot, { className: "h-12", index: 5 })
|
|
214
|
+
] })
|
|
215
|
+
}
|
|
216
|
+
) }),
|
|
217
|
+
/* @__PURE__ */ jsx(FormMessage, {})
|
|
218
|
+
] })
|
|
219
|
+
}
|
|
220
|
+
),
|
|
221
|
+
/* @__PURE__ */ jsx(
|
|
222
|
+
FormField,
|
|
223
|
+
{
|
|
224
|
+
control: form.control,
|
|
225
|
+
name: "password",
|
|
226
|
+
render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
|
|
227
|
+
/* @__PURE__ */ jsx(FormLabel, { children: t("form.passwordLabel") }),
|
|
228
|
+
/* @__PURE__ */ jsx(
|
|
229
|
+
PasswordInput,
|
|
230
|
+
{
|
|
231
|
+
field,
|
|
232
|
+
show: showPassword,
|
|
233
|
+
onToggle: () => setShowPassword(!showPassword)
|
|
234
|
+
}
|
|
235
|
+
),
|
|
236
|
+
/* @__PURE__ */ jsx(FormMessage, {})
|
|
237
|
+
] })
|
|
238
|
+
}
|
|
239
|
+
),
|
|
240
|
+
/* @__PURE__ */ jsx(
|
|
241
|
+
FormField,
|
|
242
|
+
{
|
|
243
|
+
control: form.control,
|
|
244
|
+
name: "confirmPassword",
|
|
245
|
+
render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
|
|
246
|
+
/* @__PURE__ */ jsx(FormLabel, { children: t("form.confirmPasswordLabel") }),
|
|
247
|
+
/* @__PURE__ */ jsx(
|
|
248
|
+
PasswordInput,
|
|
249
|
+
{
|
|
250
|
+
field,
|
|
251
|
+
show: showPassword,
|
|
252
|
+
onToggle: () => setShowPassword(!showPassword)
|
|
253
|
+
}
|
|
254
|
+
),
|
|
255
|
+
/* @__PURE__ */ jsx(FormMessage, {})
|
|
256
|
+
] })
|
|
257
|
+
}
|
|
258
|
+
),
|
|
259
|
+
/* @__PURE__ */ jsx(
|
|
260
|
+
Button,
|
|
261
|
+
{
|
|
262
|
+
type: "submit",
|
|
263
|
+
form: "reset-password-form",
|
|
264
|
+
className: "w-full",
|
|
265
|
+
disabled: isLoading || resetPasswordMutation.isPending,
|
|
266
|
+
loading: isLoading || resetPasswordMutation.isPending,
|
|
267
|
+
children: isLoading || resetPasswordMutation.isPending ? t("form.submitting") : t("form.submit")
|
|
268
|
+
}
|
|
269
|
+
)
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
) }),
|
|
273
|
+
errorContent && /* @__PURE__ */ jsxs(Alert, { variant: "destructive", className: "mt-4", children: [
|
|
274
|
+
/* @__PURE__ */ jsx(IconAlertCircle, { className: "h-4 w-4" }),
|
|
275
|
+
/* @__PURE__ */ jsx(AlertTitle, { children: errorContent.title }),
|
|
276
|
+
/* @__PURE__ */ jsx(AlertDescription, { children: errorContent.description })
|
|
277
|
+
] })
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export {
|
|
284
|
+
ResetPasswordForm
|
|
285
|
+
};
|
|
286
|
+
//# sourceMappingURL=chunk-OHIIMUQC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/auth/reset-password-form.tsx"],"sourcesContent":["'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n useFormField,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport type { ChangeEvent, ComponentProps } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\ntype PasswordInputProps = {\n field: ComponentProps<'input'> & {\n value: string;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onBlur: () => void;\n };\n show: boolean;\n onToggle: () => void;\n};\n\nfunction PasswordInput({ field, show, onToggle }: PasswordInputProps) {\n const { formItemId, error } = useFormField();\n return (\n <div className=\"relative\">\n <Input\n {...field}\n id={formItemId}\n type={show ? 'text' : 'password'}\n aria-invalid={!!error}\n className=\"pr-10\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-0 top-0 h-full px-3 text-muted-foreground hover:text-foreground\"\n onClick={onToggle}\n aria-label={show ? 'Hide password' : 'Show password'}\n >\n {show ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n );\n}\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n redirectUrl?: string;\n};\n\nconst resetPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n code: z.string().length(6, t('errors.codeLength')),\n password: z.string().min(8, t('errors.passwordLength')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const ResetPasswordForm = ({\n verificationId,\n redirectUrl,\n}: ResetPasswordFormProps) => {\n const { hooks, refresh } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const Link = mesob?.navigation?.Link;\n const t = useTranslator('Auth.resetPassword');\n const common = useTranslator('Common');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n\n const resetPasswordMutation = hooks.useMutation('post', '/password/reset');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema(t)),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await resetPasswordMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n password: values.password,\n },\n });\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={config.ui.name}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <div className=\"flex items-center justify-between w-full gap-2\">\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </Link>\n </div>\n }\n >\n <Form {...form}>\n <form\n id=\"reset-password-form\"\n onSubmit={handleSubmit}\n className=\"space-y-4\"\n >\n <FormField\n control={form.control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex justify-center\">\n <FormLabel>{t('form.codeLabel')}</FormLabel>\n </div>\n <FormControl>\n <InputOTP\n maxLength={6}\n value={field.value}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4 flex justify-center mt-2\"\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showPassword}\n onToggle={() => setShowPassword(!showPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"confirmPassword\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.confirmPasswordLabel')}</FormLabel>\n <PasswordInput\n field={field}\n show={showPassword}\n onToggle={() => setShowPassword(!showPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n form=\"reset-password-form\"\n className=\"w-full\"\n disabled={isLoading || resetPasswordMutation.isPending}\n loading={isLoading || resetPasswordMutation.isPending}\n >\n {isLoading || resetPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </form>\n </Form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useSession
|
|
3
|
+
} from "./chunk-72YRO3A7.js";
|
|
4
|
+
|
|
5
|
+
// src/components/profile/change-password-form.tsx
|
|
6
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
7
|
+
import {
|
|
8
|
+
Button,
|
|
9
|
+
Collapsible,
|
|
10
|
+
CollapsibleContent,
|
|
11
|
+
CollapsibleTrigger,
|
|
12
|
+
Input,
|
|
13
|
+
Label,
|
|
14
|
+
Spinner
|
|
15
|
+
} from "@mesob/ui/components";
|
|
16
|
+
import { IconChevronDown, IconEye, IconEyeOff } from "@tabler/icons-react";
|
|
17
|
+
import { useState } from "react";
|
|
18
|
+
import { useForm } from "react-hook-form";
|
|
19
|
+
import { toast } from "sonner";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
+
var changePasswordSchema = z.object({
|
|
23
|
+
currentPassword: z.string().min(8, "Password must be at least 8 characters"),
|
|
24
|
+
newPassword: z.string().min(8, "Password must be at least 8 characters"),
|
|
25
|
+
confirmPassword: z.string().min(8, "Password must be at least 8 characters")
|
|
26
|
+
}).refine((data) => data.newPassword === data.confirmPassword, {
|
|
27
|
+
message: "Passwords don't match",
|
|
28
|
+
path: ["confirmPassword"]
|
|
29
|
+
});
|
|
30
|
+
function isAuthError(error) {
|
|
31
|
+
return typeof error === "object" && error !== null && ("code" in error || "message" in error || "name" in error);
|
|
32
|
+
}
|
|
33
|
+
function getErrorCode(error) {
|
|
34
|
+
if (error.code) {
|
|
35
|
+
return error.code;
|
|
36
|
+
}
|
|
37
|
+
if (error.message) {
|
|
38
|
+
const upperMessage = error.message.toUpperCase().trim();
|
|
39
|
+
const validCodes = [
|
|
40
|
+
"INVALID_PASSWORD",
|
|
41
|
+
"UNAUTHORIZED",
|
|
42
|
+
"HAS_NO_PASSWORD",
|
|
43
|
+
"USER_NOT_FOUND",
|
|
44
|
+
"USER_EXISTS",
|
|
45
|
+
"VERIFICATION_EXPIRED",
|
|
46
|
+
"VERIFICATION_MISMATCH",
|
|
47
|
+
"VERIFICATION_NOT_FOUND",
|
|
48
|
+
"TOO_MANY_ATTEMPTS",
|
|
49
|
+
"REQUIRES_VERIFICATION",
|
|
50
|
+
"ACCESS_DENIED"
|
|
51
|
+
];
|
|
52
|
+
if (validCodes.includes(upperMessage)) {
|
|
53
|
+
return upperMessage;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return void 0;
|
|
57
|
+
}
|
|
58
|
+
function getPasswordChangeErrorMessage(error) {
|
|
59
|
+
if (isAuthError(error)) {
|
|
60
|
+
const errorCode = getErrorCode(error);
|
|
61
|
+
switch (errorCode) {
|
|
62
|
+
case "INVALID_PASSWORD":
|
|
63
|
+
return "The current password you entered is incorrect. Please try again.";
|
|
64
|
+
case "UNAUTHORIZED":
|
|
65
|
+
return "You are not authorized to perform this action. Please sign in again.";
|
|
66
|
+
case "HAS_NO_PASSWORD":
|
|
67
|
+
return "Your account does not have a password set. Please use password reset instead.";
|
|
68
|
+
default:
|
|
69
|
+
return error.message || "Failed to change password. Please try again.";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (error instanceof Error) {
|
|
73
|
+
return error.message;
|
|
74
|
+
}
|
|
75
|
+
return "Failed to change password. Please try again.";
|
|
76
|
+
}
|
|
77
|
+
function ChangePasswordForm() {
|
|
78
|
+
const { user: _user } = useSession();
|
|
79
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
80
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
81
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
82
|
+
const [showNewPassword, setShowNewPassword] = useState(false);
|
|
83
|
+
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
|
|
84
|
+
const form = useForm({
|
|
85
|
+
resolver: zodResolver(changePasswordSchema),
|
|
86
|
+
defaultValues: {
|
|
87
|
+
currentPassword: "",
|
|
88
|
+
newPassword: "",
|
|
89
|
+
confirmPassword: ""
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
const { register, handleSubmit, formState, reset } = form;
|
|
93
|
+
const onSubmit = (_data) => {
|
|
94
|
+
try {
|
|
95
|
+
setIsSubmitting(true);
|
|
96
|
+
toast.error("Password change unavailable");
|
|
97
|
+
setIsOpen(false);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
const errorMessage = getPasswordChangeErrorMessage(error);
|
|
100
|
+
toast.error(errorMessage);
|
|
101
|
+
} finally {
|
|
102
|
+
setIsSubmitting(false);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
return /* @__PURE__ */ jsx(Collapsible, { open: isOpen, onOpenChange: setIsOpen, children: /* @__PURE__ */ jsxs("div", { className: "border rounded-lg", children: [
|
|
106
|
+
/* @__PURE__ */ jsxs(
|
|
107
|
+
CollapsibleTrigger,
|
|
108
|
+
{
|
|
109
|
+
render: /* @__PURE__ */ jsx(
|
|
110
|
+
Button,
|
|
111
|
+
{
|
|
112
|
+
variant: "ghost",
|
|
113
|
+
className: "w-full justify-between p-4 h-auto"
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
children: [
|
|
117
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start", children: [
|
|
118
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Change Password" }),
|
|
119
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "Update your account password" })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(
|
|
122
|
+
IconChevronDown,
|
|
123
|
+
{
|
|
124
|
+
className: `h-4 w-4 transition-transform ${isOpen ? "rotate-180" : ""}`
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
),
|
|
130
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxs(
|
|
131
|
+
"form",
|
|
132
|
+
{
|
|
133
|
+
onSubmit: handleSubmit(onSubmit),
|
|
134
|
+
className: "p-4 space-y-4 border-t",
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 w-full md:w-1/2", children: [
|
|
137
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "currentPassword", children: "Old Password" }),
|
|
138
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
139
|
+
/* @__PURE__ */ jsx(
|
|
140
|
+
Input,
|
|
141
|
+
{
|
|
142
|
+
id: "currentPassword",
|
|
143
|
+
type: showPassword ? "text" : "password",
|
|
144
|
+
autoComplete: "current-password",
|
|
145
|
+
placeholder: "Enter your current password",
|
|
146
|
+
...register("currentPassword")
|
|
147
|
+
}
|
|
148
|
+
),
|
|
149
|
+
/* @__PURE__ */ jsx(
|
|
150
|
+
"button",
|
|
151
|
+
{
|
|
152
|
+
type: "button",
|
|
153
|
+
onClick: () => setShowPassword(!showPassword),
|
|
154
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
|
|
155
|
+
children: showPassword ? /* @__PURE__ */ jsx(IconEyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(IconEye, { className: "h-4 w-4" })
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
] }),
|
|
159
|
+
formState.errors.currentPassword && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: formState.errors.currentPassword.message })
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 w-full md:w-1/2", children: [
|
|
162
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "newPassword", children: "New Password" }),
|
|
163
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
164
|
+
/* @__PURE__ */ jsx(
|
|
165
|
+
Input,
|
|
166
|
+
{
|
|
167
|
+
id: "newPassword",
|
|
168
|
+
type: showNewPassword ? "text" : "password",
|
|
169
|
+
placeholder: "Enter your new password",
|
|
170
|
+
autoComplete: "new-password",
|
|
171
|
+
...register("newPassword")
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
/* @__PURE__ */ jsx(
|
|
175
|
+
"button",
|
|
176
|
+
{
|
|
177
|
+
type: "button",
|
|
178
|
+
onClick: () => setShowNewPassword(!showNewPassword),
|
|
179
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
|
|
180
|
+
children: showNewPassword ? /* @__PURE__ */ jsx(IconEyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(IconEye, { className: "h-4 w-4" })
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
] }),
|
|
184
|
+
formState.errors.newPassword && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: formState.errors.newPassword.message })
|
|
185
|
+
] }),
|
|
186
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2 w-full md:w-1/2", children: [
|
|
187
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "confirmPassword", children: "Confirm New Password" }),
|
|
188
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
Input,
|
|
191
|
+
{
|
|
192
|
+
id: "confirmPassword",
|
|
193
|
+
type: showConfirmPassword ? "text" : "password",
|
|
194
|
+
placeholder: "Confirm your new password",
|
|
195
|
+
autoComplete: "new-password",
|
|
196
|
+
...register("confirmPassword")
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
/* @__PURE__ */ jsx(
|
|
200
|
+
"button",
|
|
201
|
+
{
|
|
202
|
+
type: "button",
|
|
203
|
+
onClick: () => setShowConfirmPassword(!showConfirmPassword),
|
|
204
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
|
|
205
|
+
children: showConfirmPassword ? /* @__PURE__ */ jsx(IconEyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(IconEye, { className: "h-4 w-4" })
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
] }),
|
|
209
|
+
formState.errors.confirmPassword && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: formState.errors.confirmPassword.message })
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
212
|
+
/* @__PURE__ */ jsx(
|
|
213
|
+
Button,
|
|
214
|
+
{
|
|
215
|
+
type: "button",
|
|
216
|
+
variant: "outline",
|
|
217
|
+
onClick: () => {
|
|
218
|
+
reset();
|
|
219
|
+
setIsOpen(false);
|
|
220
|
+
},
|
|
221
|
+
disabled: isSubmitting,
|
|
222
|
+
children: "Cancel"
|
|
223
|
+
}
|
|
224
|
+
),
|
|
225
|
+
/* @__PURE__ */ jsxs(Button, { type: "submit", disabled: isSubmitting, children: [
|
|
226
|
+
isSubmitting && /* @__PURE__ */ jsx(Spinner, { className: "mr-2 h-4 w-4" }),
|
|
227
|
+
"Change Password"
|
|
228
|
+
] })
|
|
229
|
+
] })
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
) })
|
|
233
|
+
] }) });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export {
|
|
237
|
+
ChangePasswordForm
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=chunk-OQGJX37L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/profile/change-password-form.tsx"],"sourcesContent":["'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Input,\n Label,\n Spinner,\n} from '@mesob/ui/components';\nimport { IconChevronDown, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useSession } from '../../provider';\n\nconst changePasswordSchema = z\n .object({\n currentPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n newPassword: z.string().min(8, 'Password must be at least 8 characters'),\n confirmPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n })\n .refine((data) => data.newPassword === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: ['confirmPassword'],\n });\n\ntype ChangePasswordFormData = z.infer<typeof changePasswordSchema>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'INVALID_PASSWORD',\n 'UNAUTHORIZED',\n 'HAS_NO_PASSWORD',\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'REQUIRES_VERIFICATION',\n 'ACCESS_DENIED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getPasswordChangeErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'INVALID_PASSWORD':\n return 'The current password you entered is incorrect. Please try again.';\n case 'UNAUTHORIZED':\n return 'You are not authorized to perform this action. Please sign in again.';\n case 'HAS_NO_PASSWORD':\n return 'Your account does not have a password set. Please use password reset instead.';\n default:\n return error.message || 'Failed to change password. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Failed to change password. Please try again.';\n}\n\nexport function ChangePasswordForm() {\n const { user: _user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [showNewPassword, setShowNewPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const form = useForm<ChangePasswordFormData>({\n resolver: zodResolver(changePasswordSchema),\n defaultValues: {\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n });\n\n const { register, handleSubmit, formState, reset } = form;\n\n const onSubmit = (_data: ChangePasswordFormData) => {\n try {\n setIsSubmitting(true);\n toast.error('Password change unavailable');\n setIsOpen(false);\n } catch (error) {\n const errorMessage = getPasswordChangeErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger\n render={\n <Button\n variant=\"ghost\"\n className=\"w-full justify-between p-4 h-auto\"\n />\n }\n >\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">Change Password</span>\n <span className=\"text-sm text-muted-foreground\">\n Update your account password\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"currentPassword\">Old Password</Label>\n <div className=\"relative\">\n <Input\n id=\"currentPassword\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your current password\"\n {...register('currentPassword')}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.currentPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.currentPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"newPassword\">New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"newPassword\"\n type={showNewPassword ? 'text' : 'password'}\n placeholder=\"Enter your new password\"\n autoComplete=\"new-password\"\n {...register('newPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowNewPassword(!showNewPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showNewPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.newPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.newPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"confirmPassword\">Confirm New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder=\"Confirm your new password\"\n autoComplete=\"new-password\"\n {...register('confirmPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showConfirmPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.confirmPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.confirmPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n reset();\n setIsOpen(false);\n }}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting && <Spinner className=\"mr-2 h-4 w-4\" />}\n Change Password\n </Button>\n </div>\n </form>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,SAAS,kBAAkB;AACrD,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,SAAS;AAqHN,cAMF,YANE;AAlHZ,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,iBAAiB,EACd,OAAO,EACP,IAAI,GAAG,wCAAwC;AAAA,EAClD,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,wCAAwC;AAAA,EACvE,iBAAiB,EACd,OAAO,EACP,IAAI,GAAG,wCAAwC;AACpD,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,gBAAgB,KAAK,iBAAiB;AAAA,EAC3D,SAAS;AAAA,EACT,MAAM,CAAC,iBAAiB;AAC1B,CAAC;AAUH,SAAS,YAAY,OAAwC;AAC3D,SACE,OAAO,UAAU,YACjB,UAAU,SACT,UAAU,SAAS,aAAa,SAAS,UAAU;AAExD;AAEA,SAAS,aAAa,OAA0C;AAC9D,MAAI,MAAM,MAAM;AACd,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,eAAe,MAAM,QAAQ,YAAY,EAAE,KAAK;AACtD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,SAAS,YAAY,GAAG;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,OAAwB;AAC7D,MAAI,YAAY,KAAK,GAAG;AACtB,UAAM,YAAY,aAAa,KAAK;AACpC,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,MAAM,WAAW;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB;AACnC,QAAM,EAAE,MAAM,MAAM,IAAI,WAAW;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AAEpE,QAAM,OAAO,QAAgC;AAAA,IAC3C,UAAU,YAAY,oBAAoB;AAAA,IAC1C,eAAe;AAAA,MACb,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,MAAM,IAAI;AAErD,QAAM,WAAW,CAAC,UAAkC;AAClD,QAAI;AACF,sBAAgB,IAAI;AACpB,YAAM,MAAM,6BAA6B;AACzC,gBAAU,KAAK;AAAA,IACjB,SAAS,OAAO;AACd,YAAM,eAAe,8BAA8B,KAAK;AACxD,YAAM,MAAM,YAAY;AAAA,IAC1B,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,SACE,oBAAC,eAAY,MAAM,QAAQ,cAAc,WACvC,+BAAC,SAAI,WAAU,qBACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QACE;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,QAGF;AAAA,+BAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,UAAK,WAAU,eAAc,6BAAe;AAAA,YAC7C,oBAAC,UAAK,WAAU,iCAAgC,0CAEhD;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,gCACT,SAAS,eAAe,EAC1B;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,oBAAC,sBACC;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,aAAa,QAAQ;AAAA,QAC/B,WAAU;AAAA,QAEV;AAAA,+BAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,SAAM,SAAQ,mBAAkB,0BAAY;AAAA,YAC7C,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAM,eAAe,SAAS;AAAA,kBAC9B,cAAa;AAAA,kBACb,aAAY;AAAA,kBACX,GAAG,SAAS,iBAAiB;AAAA;AAAA,cAChC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,kBAC5C,WAAU;AAAA,kBAET,yBACC,oBAAC,cAAW,WAAU,WAAU,IAEhC,oBAAC,WAAQ,WAAU,WAAU;AAAA;AAAA,cAEjC;AAAA,eACF;AAAA,YACC,UAAU,OAAO,mBAChB,oBAAC,OAAE,WAAU,4BACV,oBAAU,OAAO,gBAAgB,SACpC;AAAA,aAEJ;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,SAAM,SAAQ,eAAc,0BAAY;AAAA,YACzC,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAM,kBAAkB,SAAS;AAAA,kBACjC,aAAY;AAAA,kBACZ,cAAa;AAAA,kBACZ,GAAG,SAAS,aAAa;AAAA;AAAA,cAC5B;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,mBAAmB,CAAC,eAAe;AAAA,kBAClD,WAAU;AAAA,kBAET,4BACC,oBAAC,cAAW,WAAU,WAAU,IAEhC,oBAAC,WAAQ,WAAU,WAAU;AAAA;AAAA,cAEjC;AAAA,eACF;AAAA,YACC,UAAU,OAAO,eAChB,oBAAC,OAAE,WAAU,4BACV,oBAAU,OAAO,YAAY,SAChC;AAAA,aAEJ;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,SAAM,SAAQ,mBAAkB,kCAAoB;AAAA,YACrD,qBAAC,SAAI,WAAU,YACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAM,sBAAsB,SAAS;AAAA,kBACrC,aAAY;AAAA,kBACZ,cAAa;AAAA,kBACZ,GAAG,SAAS,iBAAiB;AAAA;AAAA,cAChC;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,uBAAuB,CAAC,mBAAmB;AAAA,kBAC1D,WAAU;AAAA,kBAET,gCACC,oBAAC,cAAW,WAAU,WAAU,IAEhC,oBAAC,WAAQ,WAAU,WAAU;AAAA;AAAA,cAEjC;AAAA,eACF;AAAA,YACC,UAAU,OAAO,mBAChB,oBAAC,OAAE,WAAU,4BACV,oBAAU,OAAO,gBAAgB,SACpC;AAAA,aAEJ;AAAA,UAEA,qBAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS,MAAM;AACb,wBAAM;AACN,4BAAU,KAAK;AAAA,gBACjB;AAAA,gBACA,UAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,qBAAC,UAAO,MAAK,UAAS,UAAU,cAC7B;AAAA,8BAAgB,oBAAC,WAAQ,WAAU,gBAAe;AAAA,cAAG;AAAA,eAExD;AAAA,aACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangePhoneForm
|
|
3
|
+
} from "./chunk-5F5FZMHE.js";
|
|
4
|
+
import {
|
|
5
|
+
ChangeEmailForm
|
|
6
|
+
} from "./chunk-MS2JUZ3N.js";
|
|
7
|
+
import {
|
|
8
|
+
ChangePasswordForm
|
|
9
|
+
} from "./chunk-OQGJX37L.js";
|
|
10
|
+
import {
|
|
11
|
+
useSession
|
|
12
|
+
} from "./chunk-72YRO3A7.js";
|
|
13
|
+
|
|
14
|
+
// src/components/profile/security.tsx
|
|
15
|
+
import { Badge, Card, CardContent, Separator } from "@mesob/ui/components";
|
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
function Security() {
|
|
18
|
+
const { user } = useSession();
|
|
19
|
+
return /* @__PURE__ */ jsxs("div", { className: "mx-auto flex w-full max-w-6xl flex-col gap-6", children: [
|
|
20
|
+
/* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-[2rem] border border-border/60 bg-gradient-to-br from-background via-background to-amber-500/5 p-6 shadow-sm", children: [
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: "absolute left-0 top-0 h-32 w-32 rounded-full bg-primary/10 blur-3xl" }),
|
|
22
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex flex-col gap-4", children: [
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Security center" }),
|
|
25
|
+
/* @__PURE__ */ jsx(Badge, { variant: "secondary", children: user?.emailVerified || user?.phoneVerified ? "Recovery methods available" : "Add a recovery method" })
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
28
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold tracking-tight", children: "Security" }),
|
|
29
|
+
/* @__PURE__ */ jsx("p", { className: "max-w-2xl text-sm text-muted-foreground", children: "Password, email, and phone updates all live here. Keep recovery channels current so account recovery stays predictable." })
|
|
30
|
+
] })
|
|
31
|
+
] })
|
|
32
|
+
] }),
|
|
33
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 lg:grid-cols-[0.85fr_1.4fr]", children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Card, { className: "rounded-[1.75rem] border-border/60 shadow-sm", children: /* @__PURE__ */ jsxs(CardContent, { className: "space-y-5 p-6", children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-muted-foreground", children: "Verification state" }),
|
|
37
|
+
/* @__PURE__ */ jsx("div", { className: "text-lg font-semibold", children: "Recovery readiness" })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsx(Separator, {}),
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border/60 bg-muted/20 p-4", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: "Email" }),
|
|
43
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 text-sm text-muted-foreground", children: user?.email ?? "No email added" }),
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsx(Badge, { variant: "outline", children: user?.emailVerified ? "Verified" : "Unverified" }) })
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border/60 bg-muted/20 p-4", children: [
|
|
47
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: "Phone" }),
|
|
48
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 text-sm text-muted-foreground", children: user?.phone ?? "No phone added" }),
|
|
49
|
+
/* @__PURE__ */ jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsx(Badge, { variant: "outline", children: user?.phoneVerified ? "Verified" : "Unverified" }) })
|
|
50
|
+
] })
|
|
51
|
+
] })
|
|
52
|
+
] }) }),
|
|
53
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
54
|
+
/* @__PURE__ */ jsx(ChangePasswordForm, {}),
|
|
55
|
+
/* @__PURE__ */ jsx(ChangeEmailForm, {}),
|
|
56
|
+
/* @__PURE__ */ jsx(ChangePhoneForm, {})
|
|
57
|
+
] })
|
|
58
|
+
] })
|
|
59
|
+
] });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
Security
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=chunk-OYHH7HQG.js.map
|