@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,305 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizePhone
|
|
3
|
+
} from "./chunk-V2W3WPCZ.js";
|
|
4
|
+
import {
|
|
5
|
+
handleError
|
|
6
|
+
} from "./chunk-55BMNC4S.js";
|
|
7
|
+
import {
|
|
8
|
+
AuthLayout
|
|
9
|
+
} from "./chunk-DPH2PHK3.js";
|
|
10
|
+
import {
|
|
11
|
+
useTranslator
|
|
12
|
+
} from "./chunk-QNCE2B5O.js";
|
|
13
|
+
import {
|
|
14
|
+
useApi,
|
|
15
|
+
useConfig
|
|
16
|
+
} from "./chunk-72YRO3A7.js";
|
|
17
|
+
|
|
18
|
+
// src/components/auth/set-password.tsx
|
|
19
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
20
|
+
import {
|
|
21
|
+
Alert,
|
|
22
|
+
AlertDescription,
|
|
23
|
+
AlertTitle,
|
|
24
|
+
Button,
|
|
25
|
+
Form,
|
|
26
|
+
FormControl,
|
|
27
|
+
FormField,
|
|
28
|
+
FormItem,
|
|
29
|
+
FormLabel,
|
|
30
|
+
FormMessage,
|
|
31
|
+
Input,
|
|
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, useEffectEvent, 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 setPasswordSchema = (t) => z.object({
|
|
69
|
+
password: z.string().min(8, t("errors.passwordLength")).max(128, t("errors.longPasswordError")),
|
|
70
|
+
confirmPassword: z.string()
|
|
71
|
+
}).refine((data) => data.password === data.confirmPassword, {
|
|
72
|
+
message: t("errors.passwordsMismatch"),
|
|
73
|
+
path: ["confirmPassword"]
|
|
74
|
+
});
|
|
75
|
+
var getPhoneRegex = (phoneRegex) => {
|
|
76
|
+
if (typeof phoneRegex === "string") {
|
|
77
|
+
return new RegExp(phoneRegex);
|
|
78
|
+
}
|
|
79
|
+
return phoneRegex || /^(\+2519|\+2517|2519|2517|09|07)\d{8}$/;
|
|
80
|
+
};
|
|
81
|
+
var normalizeIdentifier = (identifier, phoneRegex) => {
|
|
82
|
+
const resolvedPhoneRegex = getPhoneRegex(phoneRegex);
|
|
83
|
+
return resolvedPhoneRegex.test(identifier) ? normalizePhone(identifier) : identifier;
|
|
84
|
+
};
|
|
85
|
+
var SetPassword = function SetPassword2({
|
|
86
|
+
identifier,
|
|
87
|
+
redirectUrl
|
|
88
|
+
} = {}) {
|
|
89
|
+
const { hooks, setAuth } = useApi();
|
|
90
|
+
const { config } = useConfig();
|
|
91
|
+
const mesob = useMesob();
|
|
92
|
+
const t = useTranslator("Auth.setPassword");
|
|
93
|
+
const Link = mesob?.navigation?.Link;
|
|
94
|
+
const [error, setError] = useState(null);
|
|
95
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
96
|
+
const [isChecking, setIsChecking] = useState(true);
|
|
97
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
98
|
+
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
|
|
99
|
+
const [account, setAccount] = useState(null);
|
|
100
|
+
const checkAccountMutation = hooks.useMutation("post", "/check-account");
|
|
101
|
+
const setPasswordMutation = hooks.useMutation("post", "/password/set");
|
|
102
|
+
const onNavigate = config.navigation?.onNavigate || ((path) => {
|
|
103
|
+
if (typeof window !== "undefined") {
|
|
104
|
+
window.location.href = path;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const signInLink = config.navigation?.links?.signIn || "/auth/sign-in";
|
|
108
|
+
const logoImage = config.ui.logoImage;
|
|
109
|
+
const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
|
|
110
|
+
const form = useForm({
|
|
111
|
+
resolver: zodResolver(setPasswordSchema(t)),
|
|
112
|
+
defaultValues: {
|
|
113
|
+
password: "",
|
|
114
|
+
confirmPassword: ""
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (error) {
|
|
119
|
+
toast.error(error.title || "Error", {
|
|
120
|
+
description: error.description
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}, [error]);
|
|
124
|
+
const loadAccount = useEffectEvent(async () => {
|
|
125
|
+
if (!identifier) {
|
|
126
|
+
setError({
|
|
127
|
+
title: t("errors.fallback"),
|
|
128
|
+
description: t("errors.missingIdentifier")
|
|
129
|
+
});
|
|
130
|
+
setIsChecking(false);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const normalizedIdentifier = normalizeIdentifier(
|
|
135
|
+
identifier,
|
|
136
|
+
config.phoneRegex
|
|
137
|
+
);
|
|
138
|
+
const res = await checkAccountMutation.mutateAsync({
|
|
139
|
+
body: { username: normalizedIdentifier }
|
|
140
|
+
});
|
|
141
|
+
if (!(res.exists && res.account && res.requiresPasswordSetup)) {
|
|
142
|
+
setError({
|
|
143
|
+
title: t("errors.fallback"),
|
|
144
|
+
description: t("errors.accountNotEligible")
|
|
145
|
+
});
|
|
146
|
+
setIsChecking(false);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
setAccount({
|
|
150
|
+
fullName: res.account.fullName,
|
|
151
|
+
email: res.account.email,
|
|
152
|
+
phone: res.account.phone
|
|
153
|
+
});
|
|
154
|
+
} catch {
|
|
155
|
+
setError({
|
|
156
|
+
title: t("errors.fallback"),
|
|
157
|
+
description: t("errors.accountLookupFailed")
|
|
158
|
+
});
|
|
159
|
+
} finally {
|
|
160
|
+
setIsChecking(false);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
loadAccount().catch(() => {
|
|
165
|
+
setIsChecking(false);
|
|
166
|
+
});
|
|
167
|
+
}, [identifier]);
|
|
168
|
+
const handleSubmit = form.handleSubmit(async (values) => {
|
|
169
|
+
if (!identifier) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
setIsLoading(true);
|
|
173
|
+
setError(null);
|
|
174
|
+
try {
|
|
175
|
+
const normalizedIdentifier = normalizeIdentifier(
|
|
176
|
+
identifier,
|
|
177
|
+
config.phoneRegex
|
|
178
|
+
);
|
|
179
|
+
const res = await setPasswordMutation.mutateAsync({
|
|
180
|
+
body: {
|
|
181
|
+
identifier: normalizedIdentifier,
|
|
182
|
+
password: values.password
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
if ("user" in res && "session" in res) {
|
|
186
|
+
setAuth(res);
|
|
187
|
+
}
|
|
188
|
+
onNavigate(defaultRedirect);
|
|
189
|
+
} catch (err) {
|
|
190
|
+
handleError(err, setError, t);
|
|
191
|
+
} finally {
|
|
192
|
+
setIsLoading(false);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
const accountLabel = account?.email ? t("form.emailLabel") : t("form.phoneLabel");
|
|
196
|
+
const accountValue = account?.email || account?.phone || identifier || "";
|
|
197
|
+
let errorContent = null;
|
|
198
|
+
if (error) {
|
|
199
|
+
errorContent = typeof error === "string" ? { title: "Error", description: error } : error;
|
|
200
|
+
}
|
|
201
|
+
const showError = !isChecking && !!errorContent;
|
|
202
|
+
const errorAlert = showError && errorContent && /* @__PURE__ */ jsxs(Alert, { variant: "destructive", className: "mt-4", children: [
|
|
203
|
+
/* @__PURE__ */ jsx(IconAlertCircle, { className: "h-4 w-4" }),
|
|
204
|
+
/* @__PURE__ */ jsx(AlertTitle, { children: errorContent.title }),
|
|
205
|
+
/* @__PURE__ */ jsx(AlertDescription, { children: errorContent.description })
|
|
206
|
+
] });
|
|
207
|
+
return /* @__PURE__ */ jsxs(
|
|
208
|
+
AuthLayout,
|
|
209
|
+
{
|
|
210
|
+
title: config.ui.name,
|
|
211
|
+
description: t("description"),
|
|
212
|
+
logoImage,
|
|
213
|
+
footer: /* @__PURE__ */ jsxs("p", { children: [
|
|
214
|
+
t("footer.hasPassword"),
|
|
215
|
+
" ",
|
|
216
|
+
Link ? /* @__PURE__ */ jsx(Link, { href: signInLink, className: "text-primary hover:underline", children: t("footer.signInCta") }) : /* @__PURE__ */ jsx(
|
|
217
|
+
"a",
|
|
218
|
+
{
|
|
219
|
+
href: signInLink,
|
|
220
|
+
onClick: (e) => {
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
onNavigate(signInLink);
|
|
223
|
+
},
|
|
224
|
+
className: "text-primary hover:underline",
|
|
225
|
+
children: t("footer.signInCta")
|
|
226
|
+
}
|
|
227
|
+
)
|
|
228
|
+
] }),
|
|
229
|
+
children: [
|
|
230
|
+
/* @__PURE__ */ jsx(Form, { ...form, children: /* @__PURE__ */ jsxs(
|
|
231
|
+
"form",
|
|
232
|
+
{
|
|
233
|
+
id: "set-password-form",
|
|
234
|
+
onSubmit: handleSubmit,
|
|
235
|
+
className: "space-y-4",
|
|
236
|
+
children: [
|
|
237
|
+
/* @__PURE__ */ jsxs(FormItem, { children: [
|
|
238
|
+
/* @__PURE__ */ jsx(FormLabel, { children: t("form.fullNameLabel") }),
|
|
239
|
+
/* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { value: account?.fullName || "", disabled: true }) })
|
|
240
|
+
] }),
|
|
241
|
+
/* @__PURE__ */ jsxs(FormItem, { children: [
|
|
242
|
+
/* @__PURE__ */ jsx(FormLabel, { children: accountLabel }),
|
|
243
|
+
/* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { value: accountValue, disabled: true }) })
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsx(
|
|
246
|
+
FormField,
|
|
247
|
+
{
|
|
248
|
+
control: form.control,
|
|
249
|
+
name: "password",
|
|
250
|
+
render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
|
|
251
|
+
/* @__PURE__ */ jsx(FormLabel, { children: t("form.passwordLabel") }),
|
|
252
|
+
/* @__PURE__ */ jsx(
|
|
253
|
+
PasswordInput,
|
|
254
|
+
{
|
|
255
|
+
field,
|
|
256
|
+
show: showPassword,
|
|
257
|
+
onToggle: () => setShowPassword(!showPassword)
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
/* @__PURE__ */ jsx(FormMessage, {})
|
|
261
|
+
] })
|
|
262
|
+
}
|
|
263
|
+
),
|
|
264
|
+
/* @__PURE__ */ jsx(
|
|
265
|
+
FormField,
|
|
266
|
+
{
|
|
267
|
+
control: form.control,
|
|
268
|
+
name: "confirmPassword",
|
|
269
|
+
render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
|
|
270
|
+
/* @__PURE__ */ jsx(FormLabel, { children: t("form.confirmPasswordLabel") }),
|
|
271
|
+
/* @__PURE__ */ jsx(
|
|
272
|
+
PasswordInput,
|
|
273
|
+
{
|
|
274
|
+
field,
|
|
275
|
+
show: showConfirmPassword,
|
|
276
|
+
onToggle: () => setShowConfirmPassword(!showConfirmPassword)
|
|
277
|
+
}
|
|
278
|
+
),
|
|
279
|
+
/* @__PURE__ */ jsx(FormMessage, {})
|
|
280
|
+
] })
|
|
281
|
+
}
|
|
282
|
+
),
|
|
283
|
+
/* @__PURE__ */ jsx(
|
|
284
|
+
Button,
|
|
285
|
+
{
|
|
286
|
+
type: "submit",
|
|
287
|
+
form: "set-password-form",
|
|
288
|
+
className: "w-full",
|
|
289
|
+
disabled: isChecking || !account || isLoading || setPasswordMutation.isPending,
|
|
290
|
+
children: isLoading || setPasswordMutation.isPending ? t("form.submitting") : t("form.submit")
|
|
291
|
+
}
|
|
292
|
+
)
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
) }),
|
|
296
|
+
errorAlert
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
);
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export {
|
|
303
|
+
SetPassword
|
|
304
|
+
};
|
|
305
|
+
//# sourceMappingURL=chunk-HOO2VLNM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/auth/set-password.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 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, useEffectEvent, 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 { normalizePhone } from '../../utils/normalize-phone';\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\nconst setPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\ntype SetPasswordFormValues = z.infer<ReturnType<typeof setPasswordSchema>>;\n\ntype SetPasswordProps = {\n identifier?: string;\n redirectUrl?: string;\n};\n\ntype AccountState = {\n fullName: string;\n email: string | null;\n phone: string | null;\n};\n\nconst getPhoneRegex = (phoneRegex: RegExp | string | undefined) => {\n if (typeof phoneRegex === 'string') {\n return new RegExp(phoneRegex);\n }\n\n return phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n};\n\nconst normalizeIdentifier = (\n identifier: string,\n phoneRegex: RegExp | string | undefined,\n) => {\n const resolvedPhoneRegex = getPhoneRegex(phoneRegex);\n return resolvedPhoneRegex.test(identifier)\n ? normalizePhone(identifier)\n : identifier;\n};\n\nexport const SetPassword = function SetPassword({\n identifier,\n redirectUrl,\n}: SetPasswordProps = {}) {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.setPassword');\n const Link = mesob?.navigation?.Link;\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [account, setAccount] = useState<AccountState | null>(null);\n\n const checkAccountMutation = hooks.useMutation('post', '/check-account');\n const setPasswordMutation = hooks.useMutation('post', '/password/set');\n\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n const form = useForm<SetPasswordFormValues>({\n resolver: zodResolver(setPasswordSchema(t)),\n defaultValues: {\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 loadAccount = useEffectEvent(async () => {\n if (!identifier) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingIdentifier'),\n });\n setIsChecking(false);\n return;\n }\n\n try {\n const normalizedIdentifier = normalizeIdentifier(\n identifier,\n config.phoneRegex,\n );\n const res = await checkAccountMutation.mutateAsync({\n body: { username: normalizedIdentifier },\n });\n\n if (!(res.exists && res.account && res.requiresPasswordSetup)) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.accountNotEligible'),\n });\n setIsChecking(false);\n return;\n }\n\n setAccount({\n fullName: res.account.fullName,\n email: res.account.email,\n phone: res.account.phone,\n });\n } catch {\n setError({\n title: t('errors.fallback'),\n description: t('errors.accountLookupFailed'),\n });\n } finally {\n setIsChecking(false);\n }\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: rerun only when route identifier changes\n useEffect(() => {\n loadAccount().catch(() => {\n setIsChecking(false);\n });\n }, [identifier]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!identifier) {\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const normalizedIdentifier = normalizeIdentifier(\n identifier,\n config.phoneRegex,\n );\n const res = await setPasswordMutation.mutateAsync({\n body: {\n identifier: normalizedIdentifier,\n password: values.password,\n },\n });\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n const accountLabel = account?.email\n ? t('form.emailLabel')\n : t('form.phoneLabel');\n const accountValue = account?.email || account?.phone || identifier || '';\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n errorContent =\n typeof error === 'string'\n ? { title: 'Error', description: error }\n : error;\n }\n const showError = !isChecking && !!errorContent;\n const errorAlert = showError && 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\n return (\n <AuthLayout\n title={config.ui.name}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <p>\n {t('footer.hasPassword')}{' '}\n {Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.signInCta')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.signInCta')}\n </a>\n )}\n </p>\n }\n >\n <Form {...form}>\n <form\n id=\"set-password-form\"\n onSubmit={handleSubmit}\n className=\"space-y-4\"\n >\n <FormItem>\n <FormLabel>{t('form.fullNameLabel')}</FormLabel>\n <FormControl>\n <Input value={account?.fullName || ''} disabled />\n </FormControl>\n </FormItem>\n <FormItem>\n <FormLabel>{accountLabel}</FormLabel>\n <FormControl>\n <Input value={accountValue} disabled />\n </FormControl>\n </FormItem>\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={showConfirmPassword}\n onToggle={() => setShowConfirmPassword(!showConfirmPassword)}\n />\n <FormMessage />\n </FormItem>\n )}\n />\n <Button\n type=\"submit\"\n form=\"set-password-form\"\n className=\"w-full\"\n disabled={\n isChecking ||\n !account ||\n isLoading ||\n setPasswordMutation.isPending\n }\n >\n {isLoading || setPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </form>\n </Form>\n {errorAlert}\n </AuthLayout>\n );\n};\n"],"mappings":"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","names":["SetPassword"]}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VerificationForm
|
|
3
|
+
} from "./chunk-FFR5UHTS.js";
|
|
4
|
+
import {
|
|
5
|
+
handleError
|
|
6
|
+
} from "./chunk-55BMNC4S.js";
|
|
7
|
+
import {
|
|
8
|
+
AuthLayout
|
|
9
|
+
} from "./chunk-DPH2PHK3.js";
|
|
10
|
+
import {
|
|
11
|
+
useTranslator
|
|
12
|
+
} from "./chunk-QNCE2B5O.js";
|
|
13
|
+
import {
|
|
14
|
+
useApi,
|
|
15
|
+
useConfig
|
|
16
|
+
} from "./chunk-72YRO3A7.js";
|
|
17
|
+
|
|
18
|
+
// src/components/auth/verify-email.tsx
|
|
19
|
+
import { Alert, AlertDescription, AlertTitle } from "@mesob/ui/components";
|
|
20
|
+
import { useMesob } from "@mesob/ui/providers";
|
|
21
|
+
import { IconAlertCircle } from "@tabler/icons-react";
|
|
22
|
+
import { useEffect, useState } from "react";
|
|
23
|
+
import { toast } from "sonner";
|
|
24
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
25
|
+
var VerifyEmail = ({
|
|
26
|
+
verificationId,
|
|
27
|
+
email,
|
|
28
|
+
redirectUrl
|
|
29
|
+
}) => {
|
|
30
|
+
const { hooks, setAuth } = useApi();
|
|
31
|
+
const { config } = useConfig();
|
|
32
|
+
const mesob = useMesob();
|
|
33
|
+
const t = useTranslator("Auth.verification");
|
|
34
|
+
const common = useTranslator("Common");
|
|
35
|
+
const footer = useTranslator("Auth.forgotPassword.footer");
|
|
36
|
+
const Link = mesob?.navigation?.Link;
|
|
37
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
38
|
+
const [error, setError] = useState(null);
|
|
39
|
+
const verifyEmailMutation = hooks.useMutation(
|
|
40
|
+
"post",
|
|
41
|
+
"/email/verification/confirm"
|
|
42
|
+
);
|
|
43
|
+
const requestEmailMutation = hooks.useMutation(
|
|
44
|
+
"post",
|
|
45
|
+
"/email/verification/request"
|
|
46
|
+
);
|
|
47
|
+
const signInLink = config.navigation?.links?.signIn || "/auth/sign-in";
|
|
48
|
+
const onNavigate = config.navigation?.onNavigate || ((path) => {
|
|
49
|
+
if (typeof window !== "undefined") {
|
|
50
|
+
window.location.href = path;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const logoImage = config.ui.logoImage;
|
|
54
|
+
const defaultRedirect = redirectUrl || config.navigation?.defaultRedirectUrl || "/";
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (error) {
|
|
57
|
+
toast.error(error.title || "Error", {
|
|
58
|
+
description: error.description
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}, [error]);
|
|
62
|
+
const handleSubmit = async (values) => {
|
|
63
|
+
if (!verificationId) {
|
|
64
|
+
setError({
|
|
65
|
+
title: t("errors.fallback"),
|
|
66
|
+
description: t("errors.missingVerificationId")
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
setIsLoading(true);
|
|
71
|
+
setError(null);
|
|
72
|
+
try {
|
|
73
|
+
const res = await verifyEmailMutation.mutateAsync({
|
|
74
|
+
body: {
|
|
75
|
+
verificationId,
|
|
76
|
+
code: values.code
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
if ("user" in res && "session" in res) {
|
|
80
|
+
setAuth(res);
|
|
81
|
+
}
|
|
82
|
+
onNavigate(defaultRedirect);
|
|
83
|
+
} catch (err) {
|
|
84
|
+
handleError(err, setError, t);
|
|
85
|
+
} finally {
|
|
86
|
+
setIsLoading(false);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const handleResend = async () => {
|
|
90
|
+
setError(null);
|
|
91
|
+
try {
|
|
92
|
+
const res = await requestEmailMutation.mutateAsync({
|
|
93
|
+
body: {
|
|
94
|
+
email
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (res.verificationId) {
|
|
98
|
+
onNavigate(
|
|
99
|
+
`/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(email)}`
|
|
100
|
+
);
|
|
101
|
+
} else {
|
|
102
|
+
setError({
|
|
103
|
+
title: t("errors.fallback"),
|
|
104
|
+
description: t("errors.resendFailed")
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
handleError(err, setError, t);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
if (!verificationId) {
|
|
112
|
+
return /* @__PURE__ */ jsx(
|
|
113
|
+
AuthLayout,
|
|
114
|
+
{
|
|
115
|
+
title: common("invalidLinkTitle"),
|
|
116
|
+
description: common("invalidLinkDescription"),
|
|
117
|
+
footer: Link ? /* @__PURE__ */ jsx(Link, { href: signInLink, className: "text-primary hover:underline", children: footer("backToSignIn") }) : /* @__PURE__ */ jsx(
|
|
118
|
+
"a",
|
|
119
|
+
{
|
|
120
|
+
href: signInLink,
|
|
121
|
+
onClick: (e) => {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
onNavigate(signInLink);
|
|
124
|
+
},
|
|
125
|
+
className: "text-primary hover:underline",
|
|
126
|
+
children: footer("backToSignIn")
|
|
127
|
+
}
|
|
128
|
+
),
|
|
129
|
+
children: /* @__PURE__ */ jsx("div", {})
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
let errorContent = null;
|
|
134
|
+
if (error) {
|
|
135
|
+
if (typeof error === "string") {
|
|
136
|
+
errorContent = { title: "Error", description: error };
|
|
137
|
+
} else {
|
|
138
|
+
errorContent = error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return /* @__PURE__ */ jsxs(
|
|
142
|
+
AuthLayout,
|
|
143
|
+
{
|
|
144
|
+
title: config.ui.name,
|
|
145
|
+
description: t("email.description"),
|
|
146
|
+
logoImage,
|
|
147
|
+
footer: Link ? /* @__PURE__ */ jsx(Link, { href: signInLink, className: "text-primary hover:underline", children: footer("backToSignIn") }) : /* @__PURE__ */ jsx(
|
|
148
|
+
"a",
|
|
149
|
+
{
|
|
150
|
+
href: signInLink,
|
|
151
|
+
onClick: (e) => {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
onNavigate(signInLink);
|
|
154
|
+
},
|
|
155
|
+
className: "text-primary hover:underline",
|
|
156
|
+
children: footer("backToSignIn")
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx(
|
|
161
|
+
VerificationForm,
|
|
162
|
+
{
|
|
163
|
+
verificationId,
|
|
164
|
+
onSubmit: handleSubmit,
|
|
165
|
+
onResend: handleResend,
|
|
166
|
+
isLoading: isLoading || verifyEmailMutation.isPending || requestEmailMutation.isPending,
|
|
167
|
+
error
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
errorContent && /* @__PURE__ */ jsxs(Alert, { variant: "destructive", className: "mt-4", children: [
|
|
171
|
+
/* @__PURE__ */ jsx(IconAlertCircle, { className: "h-4 w-4" }),
|
|
172
|
+
/* @__PURE__ */ jsx(AlertTitle, { children: errorContent.title }),
|
|
173
|
+
/* @__PURE__ */ jsx(AlertDescription, { children: errorContent.description })
|
|
174
|
+
] })
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
VerifyEmail
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=chunk-II5MLBSB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/auth/verify-email.tsx"],"sourcesContent":["'use client';\n\nimport { Alert, AlertDescription, AlertTitle } from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { toast } from 'sonner';\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';\nimport { VerificationForm } from './verification-form';\n\ntype VerifyEmailProps = {\n verificationId: string;\n email: string;\n redirectUrl?: string;\n};\n\nexport const VerifyEmail = ({\n verificationId,\n email,\n redirectUrl,\n}: VerifyEmailProps) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.verification');\n const common = useTranslator('Common');\n const footer = useTranslator('Auth.forgotPassword.footer');\n const Link = mesob?.navigation?.Link;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const verifyEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/confirm',\n );\n const requestEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\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 useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { code: string }) => {\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 const res = await verifyEmailMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n },\n });\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleResend = async () => {\n setError(null);\n try {\n const res = await requestEmailMutation.mutateAsync({\n body: {\n email,\n },\n });\n if (res.verificationId) {\n onNavigate(\n `/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(email)}`,\n );\n } else {\n setError({\n title: t('errors.fallback'),\n description: t('errors.resendFailed'),\n });\n }\n } catch (err) {\n handleError(err, setError, t);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\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('email.description')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <VerificationForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n onResend={handleResend}\n isLoading={\n isLoading ||\n verifyEmailMutation.isPending ||\n requestEmailMutation.isPending\n }\n error={error}\n />\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,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AppLink
|
|
3
|
+
} from "./chunk-T6P7UHVP.js";
|
|
4
|
+
import {
|
|
5
|
+
useSession
|
|
6
|
+
} from "./chunk-72YRO3A7.js";
|
|
7
|
+
|
|
8
|
+
// src/pages/profile/_components/profile-sidebar.tsx
|
|
9
|
+
import { Avatar, AvatarFallback, AvatarImage } from "@mesob/ui/components";
|
|
10
|
+
import { cn } from "@mesob/ui/lib/utils";
|
|
11
|
+
import { IconLock, IconUser } from "@tabler/icons-react";
|
|
12
|
+
import { useMemo } from "react";
|
|
13
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
var profileNavItems = [
|
|
15
|
+
{
|
|
16
|
+
title: "Account",
|
|
17
|
+
href: "/profile/account",
|
|
18
|
+
icon: IconUser,
|
|
19
|
+
caption: "Identity and contact"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
title: "Security",
|
|
23
|
+
href: "/profile/security",
|
|
24
|
+
icon: IconLock,
|
|
25
|
+
caption: "Password and recovery"
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
function ProfileSidebar() {
|
|
29
|
+
const { user } = useSession();
|
|
30
|
+
const pathname = useMemo(() => {
|
|
31
|
+
if (typeof window === "undefined") {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
return window.location.pathname;
|
|
35
|
+
}, []);
|
|
36
|
+
const initials = user?.fullName?.split(" ").map((part) => part[0]).join("").toUpperCase().slice(0, 2) || "U";
|
|
37
|
+
return /* @__PURE__ */ jsx("aside", { className: "w-full border-b border-border/60 bg-gradient-to-b from-muted/30 via-background to-background lg:w-80 lg:border-b-0 lg:border-r", children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col gap-6 p-4 lg:p-5", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-[1.75rem] border border-border/60 bg-background/85 p-5 shadow-sm backdrop-blur", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
39
|
+
/* @__PURE__ */ jsxs(Avatar, { className: "h-12 w-12 ring-4 ring-primary/10", children: [
|
|
40
|
+
/* @__PURE__ */ jsx(AvatarImage, { src: user?.image || "", alt: user?.fullName || "" }),
|
|
41
|
+
/* @__PURE__ */ jsx(AvatarFallback, { children: initials })
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-sm font-medium text-muted-foreground", children: "Profile workspace" }),
|
|
45
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-base font-semibold", children: user?.fullName ?? "Account" })
|
|
46
|
+
] })
|
|
47
|
+
] }) }),
|
|
48
|
+
/* @__PURE__ */ jsx("nav", { className: "grid gap-2", children: profileNavItems.map((item) => {
|
|
49
|
+
const Icon = item.icon;
|
|
50
|
+
const isActive = pathname === item.href;
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
AppLink,
|
|
53
|
+
{
|
|
54
|
+
href: item.href,
|
|
55
|
+
className: cn(
|
|
56
|
+
"group rounded-[1.5rem] border px-4 py-4 transition-all",
|
|
57
|
+
isActive ? "border-primary/30 bg-primary/[0.08] shadow-sm" : "border-border/60 bg-background/70 hover:border-primary/20 hover:bg-muted/30"
|
|
58
|
+
),
|
|
59
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"rounded-2xl p-2 transition-colors",
|
|
65
|
+
isActive ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-foreground"
|
|
66
|
+
),
|
|
67
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "size-4" })
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
71
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: item.title }),
|
|
72
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: item.caption })
|
|
73
|
+
] })
|
|
74
|
+
] })
|
|
75
|
+
},
|
|
76
|
+
item.href
|
|
77
|
+
);
|
|
78
|
+
}) })
|
|
79
|
+
] }) });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/components/profile/profile-layout.tsx
|
|
83
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
84
|
+
function ProfileLayout({ children }) {
|
|
85
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex flex-1 flex-col overflow-hidden lg:flex-row", children: [
|
|
86
|
+
/* @__PURE__ */ jsx2(ProfileSidebar, {}),
|
|
87
|
+
/* @__PURE__ */ jsx2("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden bg-[linear-gradient(180deg,hsl(var(--muted)/0.18),transparent_18rem)]", children })
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
ProfileSidebar,
|
|
93
|
+
ProfileLayout
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=chunk-ISNNPMF7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pages/profile/_components/profile-sidebar.tsx","../src/components/profile/profile-layout.tsx"],"sourcesContent":["'use client';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconLock, IconUser } from '@tabler/icons-react';\nimport { useMemo } from 'react';\nimport { useSession } from '../../../provider';\nimport { AppLink } from '../../iam/shared/navigation';\n\nconst profileNavItems = [\n {\n title: 'Account',\n href: '/profile/account',\n icon: IconUser,\n caption: 'Identity and contact',\n },\n {\n title: 'Security',\n href: '/profile/security',\n icon: IconLock,\n caption: 'Password and recovery',\n },\n];\n\nexport function ProfileSidebar() {\n const { user } = useSession();\n const pathname = useMemo(() => {\n if (typeof window === 'undefined') {\n return '';\n }\n return window.location.pathname;\n }, []);\n\n const initials =\n user?.fullName\n ?.split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2) || 'U';\n\n return (\n <aside className=\"w-full border-b border-border/60 bg-gradient-to-b from-muted/30 via-background to-background lg:w-80 lg:border-b-0 lg:border-r\">\n <div className=\"flex h-full flex-col gap-6 p-4 lg:p-5\">\n <div className=\"rounded-[1.75rem] border border-border/60 bg-background/85 p-5 shadow-sm backdrop-blur\">\n <div className=\"flex items-center gap-4\">\n <Avatar className=\"h-12 w-12 ring-4 ring-primary/10\">\n <AvatarImage src={user?.image || ''} alt={user?.fullName || ''} />\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-muted-foreground\">\n Profile workspace\n </div>\n <div className=\"truncate text-base font-semibold\">\n {user?.fullName ?? 'Account'}\n </div>\n </div>\n </div>\n </div>\n\n <nav className=\"grid gap-2\">\n {profileNavItems.map((item) => {\n const Icon = item.icon;\n const isActive = pathname === item.href;\n\n return (\n <AppLink\n key={item.href}\n href={item.href}\n className={cn(\n 'group rounded-[1.5rem] border px-4 py-4 transition-all',\n isActive\n ? 'border-primary/30 bg-primary/[0.08] shadow-sm'\n : 'border-border/60 bg-background/70 hover:border-primary/20 hover:bg-muted/30',\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div\n className={cn(\n 'rounded-2xl p-2 transition-colors',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-foreground',\n )}\n >\n <Icon className=\"size-4\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"font-medium\">{item.title}</div>\n <div className=\"text-sm text-muted-foreground\">\n {item.caption}\n </div>\n </div>\n </div>\n </AppLink>\n );\n })}\n </nav>\n </div>\n </aside>\n );\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { ProfileSidebar } from '../../pages/profile/_components/profile-sidebar';\n\nexport function ProfileLayout({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex flex-1 flex-col overflow-hidden lg:flex-row\">\n <ProfileSidebar />\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden bg-[linear-gradient(180deg,hsl(var(--muted)/0.18),transparent_18rem)]\">\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAEA,SAAS,QAAQ,gBAAgB,mBAAmB;AACpD,SAAS,UAAU;AACnB,SAAS,UAAU,gBAAgB;AACnC,SAAS,eAAe;AAyCZ,SACE,KADF;AArCZ,IAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,iBAAiB;AAC/B,QAAM,EAAE,KAAK,IAAI,WAAW;AAC5B,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,WAAO,OAAO,SAAS;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,WACJ,MAAM,UACF,MAAM,GAAG,EACV,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC,KAAK;AAEpB,SACE,oBAAC,WAAM,WAAU,kIACf,+BAAC,SAAI,WAAU,yCACb;AAAA,wBAAC,SAAI,WAAU,0FACb,+BAAC,SAAI,WAAU,2BACb;AAAA,2BAAC,UAAO,WAAU,oCAChB;AAAA,4BAAC,eAAY,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,YAAY,IAAI;AAAA,QAChE,oBAAC,kBAAgB,oBAAS;AAAA,SAC5B;AAAA,MACA,qBAAC,SAAI,WAAU,WACb;AAAA,4BAAC,SAAI,WAAU,sDAAqD,+BAEpE;AAAA,QACA,oBAAC,SAAI,WAAU,oCACZ,gBAAM,YAAY,WACrB;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAEA,oBAAC,SAAI,WAAU,cACZ,0BAAgB,IAAI,CAAC,SAAS;AAC7B,YAAM,OAAO,KAAK;AAClB,YAAM,WAAW,aAAa,KAAK;AAEnC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,KAAK;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA,WACI,kDACA;AAAA,UACN;AAAA,UAEA,+BAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,WACI,uCACA;AAAA,gBACN;AAAA,gBAEA,8BAAC,QAAK,WAAU,UAAS;AAAA;AAAA,YAC3B;AAAA,YACA,qBAAC,SAAI,WAAU,WACb;AAAA,kCAAC,SAAI,WAAU,eAAe,eAAK,OAAM;AAAA,cACzC,oBAAC,SAAI,WAAU,iCACZ,eAAK,SACR;AAAA,eACF;AAAA,aACF;AAAA;AAAA,QA1BK,KAAK;AAAA,MA2BZ;AAAA,IAEJ,CAAC,GACH;AAAA,KACF,GACF;AAEJ;;;AC/FI,SACE,OAAAA,MADF,QAAAC,aAAA;AAFG,SAAS,cAAc,EAAE,SAAS,GAA4B;AACnE,SACE,gBAAAA,MAAC,SAAI,WAAU,oDACb;AAAA,oBAAAD,KAAC,kBAAe;AAAA,IAChB,gBAAAA,KAAC,SAAI,WAAU,sHACZ,UACH;AAAA,KACF;AAEJ;","names":["jsx","jsxs"]}
|