@atlashub/smartstack 3.39.0-preview.1049 → 3.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js → AgentSkillsPage-BS_W2KTh.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DgqyaZwI.js.map → AgentSkillsPage-BS_W2KTh.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js → AgentSkillsPage-CmDFLnp7.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ojivq0Cu.js.map → AgentSkillsPage-CmDFLnp7.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js → AgentWorkloadPage-C8IvYfhT.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BGGTfOLs.js.map → AgentWorkloadPage-C8IvYfhT.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js → AgentWorkloadPage-JXsQbwuM.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-DWsC5VoS.js.map → AgentWorkloadPage-JXsQbwuM.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js → ApiCatalogDetailPage-CYOt34Vy.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-7EifQOAh.js.map → ApiCatalogDetailPage-CYOt34Vy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js → ApiCatalogDetailPage-wFZDsTGy.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BD7XE4xK.js.map → ApiCatalogDetailPage-wFZDsTGy.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js → ApiCatalogPage-Bdm3HNGP.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BfPoZGD3.js.map → ApiCatalogPage-Bdm3HNGP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js → ApiCatalogPage-m_TWQyGv.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BOPTnk-b.js.map → ApiCatalogPage-m_TWQyGv.js.map} +1 -1
- package/dist/chunks/ApplicationDetailPage-C2BSpEoW.js +2 -0
- package/dist/chunks/{ApplicationDetailPage-CWdz0TS4.js.map → ApplicationDetailPage-C2BSpEoW.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js → ApplicationDetailPage-CcgDAP-J.js} +503 -501
- package/dist/chunks/{ApplicationDetailPage-CDQqViuH.js.map → ApplicationDetailPage-CcgDAP-J.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js → ApplicationsDashboardPage-CDIjziL3.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-ZyXm2Cd1.js.map → ApplicationsDashboardPage-CDIjziL3.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js → ApplicationsDashboardPage-DslDyNzJ.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BH4S3qA2.js.map → ApplicationsDashboardPage-DslDyNzJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js → ApplicationsGridPage-BCjsQGU0.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-D0fU1_Le.js.map → ApplicationsGridPage-BCjsQGU0.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js → ApplicationsGridPage-CIfKiCND.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-C1WF2Htv.js.map → ApplicationsGridPage-CIfKiCND.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js → ApplicationsListPage-CT75kNcH.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-Cxvt2_WQ.js.map → ApplicationsListPage-CT75kNcH.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js → ApplicationsListPage-D2B4PZ5n.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B3ItaY4r.js.map → ApplicationsListPage-D2B4PZ5n.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js → ApplicationsPage-CaTBtduL.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BqfNR-kc.js.map → ApplicationsPage-CaTBtduL.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js → ApplicationsPage-DW1LhL0U.js} +4 -4
- package/dist/chunks/{ApplicationsPage-DuxuWfrN.js.map → ApplicationsPage-DW1LhL0U.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js → AssignmentRulesPage-Bt9M0ki7.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CR1C7V0a.js.map → AssignmentRulesPage-Bt9M0ki7.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js → AssignmentRulesPage-Y7xv60NY.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C4Jouh2g.js.map → AssignmentRulesPage-Y7xv60NY.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js → AssignmentsPage-1eQGTjTi.js} +2 -2
- package/dist/chunks/{AssignmentsPage-v8QUJkE7.js.map → AssignmentsPage-1eQGTjTi.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js → AssignmentsPage-RURdPvfZ.js} +2 -2
- package/dist/chunks/{AssignmentsPage-CjuGAd8n.js.map → AssignmentsPage-RURdPvfZ.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js → AuthCallbackPage-8hF0jYlK.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BxIXPUJk.js.map → AuthCallbackPage-8hF0jYlK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js → AuthCallbackPage-DPL68Asu.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-CuS-efzY.js.map → AuthCallbackPage-DPL68Asu.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js → ConfirmEmailPage-BKlpZkVk.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CWIqy2bT.js.map → ConfirmEmailPage-BKlpZkVk.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js → ConfirmEmailPage-CawSZypI.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-CkN8IfP-.js.map → ConfirmEmailPage-CawSZypI.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js → CreateSupportTicketPage-AwbMbBIH.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-Df0ow5ge.js.map → CreateSupportTicketPage-AwbMbBIH.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js → CreateSupportTicketPage-Dg1YW1eA.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CmrDfFxP.js.map → CreateSupportTicketPage-Dg1YW1eA.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js → DashboardPage-B4YxOF-9.js} +3 -3
- package/dist/chunks/{DashboardPage-B4Pi5P3O.js.map → DashboardPage-B4YxOF-9.js.map} +1 -1
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js → DashboardPage-BZxjinar.js} +2 -2
- package/dist/chunks/{DashboardPage-wEKZ_DWf.js.map → DashboardPage-BZxjinar.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BAqpoxCW.js → DashboardPage-Bo09y8r7.js} +3 -3
- package/dist/chunks/{DashboardPage-BAqpoxCW.js.map → DashboardPage-Bo09y8r7.js.map} +1 -1
- package/dist/chunks/{DashboardPage-BT5kFaQA.js → DashboardPage-Cq5adDjP.js} +2 -2
- package/dist/chunks/{DashboardPage-BT5kFaQA.js.map → DashboardPage-Cq5adDjP.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js → EscalationConfigPage-C8Hv5naz.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-4pF38E4N.js.map → EscalationConfigPage-C8Hv5naz.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js → EscalationConfigPage-DNAqMRxA.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-Bcifnt_h.js.map → EscalationConfigPage-DNAqMRxA.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js → ForceChangePasswordPage-BURE_vNg.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CBaMV_PS.js.map → ForceChangePasswordPage-BURE_vNg.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js → ForceChangePasswordPage-C6jDZshk.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-ClDXluX1.js.map → ForceChangePasswordPage-C6jDZshk.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js → ForgotPasswordPage-C5HLYbz4.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage--ueWRNSO.js.map → ForgotPasswordPage-C5HLYbz4.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js → ForgotPasswordPage-D3ZQBtjd.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CzpAkP5R.js.map → ForgotPasswordPage-D3ZQBtjd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js → GroupDetailPage-CTuzp9Vp.js} +5 -5
- package/dist/chunks/{GroupDetailPage-dXNOoSXE.js.map → GroupDetailPage-CTuzp9Vp.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js → GroupDetailPage-NJc2zCxC.js} +2 -2
- package/dist/chunks/{GroupDetailPage-BIgBzQk0.js.map → GroupDetailPage-NJc2zCxC.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js → MyAccessRequestsPage-Cvr29Pnq.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-K2NXkdy4.js.map → MyAccessRequestsPage-Cvr29Pnq.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js → MyAccessRequestsPage-t6I24rHN.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-Be8VvLhh.js.map → MyAccessRequestsPage-t6I24rHN.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js → MyTenantsPage-Dy2RZ_Ei.js} +2 -2
- package/dist/chunks/{MyTenantsPage-BXx1nPC8.js.map → MyTenantsPage-Dy2RZ_Ei.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js → MyTenantsPage-SvDCQ4Wt.js} +3 -3
- package/dist/chunks/{MyTenantsPage-B9ZAUeCa.js.map → MyTenantsPage-SvDCQ4Wt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js → MyTicketsPage-C3lEBFD9.js} +2 -2
- package/dist/chunks/{MyTicketsPage-C9MSmmR5.js.map → MyTicketsPage-C3lEBFD9.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js → MyTicketsPage-DydDgFyz.js} +2 -2
- package/dist/chunks/{MyTicketsPage-d0PoJpnX.js.map → MyTicketsPage-DydDgFyz.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js → NavigationAppsPage-Dyv767w8.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CJ3BjLlz.js.map → NavigationAppsPage-Dyv767w8.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js → NavigationAppsPage-WqSspaVo.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-8t2xbddT.js.map → NavigationAppsPage-WqSspaVo.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-_62-bmuk.js → NotificationsPage-Di4I95PM.js} +2 -2
- package/dist/chunks/{NotificationsPage-_62-bmuk.js.map → NotificationsPage-Di4I95PM.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js → NotificationsPage-elSovpBw.js} +2 -2
- package/dist/chunks/{NotificationsPage-CLHfVUxm.js.map → NotificationsPage-elSovpBw.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js → OnboardingWizardPage-fdWdkwiT.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Dkc22Jc4.js.map → OnboardingWizardPage-fdWdkwiT.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js → OnboardingWizardPage-nPLe2buQ.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-D1rzD6gR.js.map → OnboardingWizardPage-nPLe2buQ.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js → PermissionDetailPage-B8C7tWFP.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-BSvSe4SI.js.map → PermissionDetailPage-B8C7tWFP.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js → PermissionDetailPage-IUgUaTkE.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-_HhbxzlG.js.map → PermissionDetailPage-IUgUaTkE.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js → PermissionsPage-CmX5sQf2.js} +2 -2
- package/dist/chunks/{PermissionsPage-Xb92YAHn.js.map → PermissionsPage-CmX5sQf2.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js → PermissionsPage-Kg0rduOM.js} +2 -2
- package/dist/chunks/{PermissionsPage-B0M4gA5m.js.map → PermissionsPage-Kg0rduOM.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js → PortalDashboardPage-CCAYuhtI.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DTeMESj9.js.map → PortalDashboardPage-CCAYuhtI.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js → PortalDashboardPage-Dme1XmzN.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-pt9hipR4.js.map → PortalDashboardPage-Dme1XmzN.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js → PreferencesPage-Ct6xWAFp.js} +2 -2
- package/dist/chunks/{PreferencesPage-Cy30AWIN.js.map → PreferencesPage-Ct6xWAFp.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js → PreferencesPage-Db2RjMpm.js} +2 -2
- package/dist/chunks/{PreferencesPage-CsHVGMgp.js.map → PreferencesPage-Db2RjMpm.js.map} +1 -1
- package/dist/chunks/{ProfilePage-6Gf7igUI.js → ProfilePage-D6Xb1ALH.js} +2 -2
- package/dist/chunks/{ProfilePage-6Gf7igUI.js.map → ProfilePage-D6Xb1ALH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-BzBWkztf.js → ProfilePage-DN2s-lfp.js} +2 -2
- package/dist/chunks/{ProfilePage-BzBWkztf.js.map → ProfilePage-DN2s-lfp.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js → ReferencesManagementPage-B5mcshG1.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DEDoHrnU.js.map → ReferencesManagementPage-B5mcshG1.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js → ReferencesManagementPage-DB975ktX.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-DD1QiFYr.js.map → ReferencesManagementPage-DB975ktX.js.map} +1 -1
- package/dist/chunks/{RegisterPage-asdx33fV.js → RegisterPage-ZskZrLZH.js} +2 -2
- package/dist/chunks/{RegisterPage-asdx33fV.js.map → RegisterPage-ZskZrLZH.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CIPHRYkl.js → RegisterPage-b8yIPVgh.js} +2 -2
- package/dist/chunks/{RegisterPage-CIPHRYkl.js.map → RegisterPage-b8yIPVgh.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js → ResetPasswordPage-CeAvfsE-.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B4Dj24vU.js.map → ResetPasswordPage-CeAvfsE-.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js → ResetPasswordPage-Dzp5dCp8.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-B8MWH_Vi.js.map → ResetPasswordPage-Dzp5dCp8.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Cs6T441o.js → ResolutionModal-CRVN7gHv.js} +2 -2
- package/dist/chunks/{ResolutionModal-Cs6T441o.js.map → ResolutionModal-CRVN7gHv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js → ResolutionModal-DJOw1sLT.js} +2 -2
- package/dist/chunks/{ResolutionModal-rLoFOxm9.js.map → ResolutionModal-DJOw1sLT.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js → RoleDetailPage-CLVoFVF8.js} +2 -2
- package/dist/chunks/{RoleDetailPage-Pkw0wU5g.js.map → RoleDetailPage-CLVoFVF8.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js → RoleDetailPage-XGnPD_8C.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CNFG6j6P.js.map → RoleDetailPage-XGnPD_8C.js.map} +1 -1
- package/dist/chunks/{RolesPage-BHEkMR2O.js → RolesPage-BnAMpR2b.js} +2 -2
- package/dist/chunks/{RolesPage-BHEkMR2O.js.map → RolesPage-BnAMpR2b.js.map} +1 -1
- package/dist/chunks/{RolesPage-D35jwDJU.js → RolesPage-Czj9LMkL.js} +2 -2
- package/dist/chunks/{RolesPage-D35jwDJU.js.map → RolesPage-Czj9LMkL.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DtonDehw.js → SlaConfigPage-HM0MpIlg.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DtonDehw.js.map → SlaConfigPage-HM0MpIlg.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js → SlaConfigPage-ZRyAs8aY.js} +2 -2
- package/dist/chunks/{SlaConfigPage-C5Jstix-.js.map → SlaConfigPage-ZRyAs8aY.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js → SupportPermissionsPage-CxJuGgcQ.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-6pC73oCY.js.map → SupportPermissionsPage-CxJuGgcQ.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js → SupportPermissionsPage-DNd323OK.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-CsJKGt__.js.map → SupportPermissionsPage-DNd323OK.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js → TemplatesPage-CdwPLsHj.js} +2 -2
- package/dist/chunks/{TemplatesPage-DjmYOGEC.js.map → TemplatesPage-CdwPLsHj.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DlY91VO_.js → TemplatesPage-Co3ygZvF.js} +2 -2
- package/dist/chunks/{TemplatesPage-DlY91VO_.js.map → TemplatesPage-Co3ygZvF.js.map} +1 -1
- package/dist/chunks/{TenantCard-BHLcv2gD.js → TenantCard-CmCfIK2F.js} +2 -2
- package/dist/chunks/{TenantCard-BHLcv2gD.js.map → TenantCard-CmCfIK2F.js.map} +1 -1
- package/dist/chunks/{TenantCard-DGCKVvKI.js → TenantCard-DI66acce.js} +2 -2
- package/dist/chunks/{TenantCard-DGCKVvKI.js.map → TenantCard-DI66acce.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js → TenantScopeSelector-5NOwmFX2.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-dsSwnOWg.js.map → TenantScopeSelector-5NOwmFX2.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js → TenantScopeSelector-CEFgxiWt.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CU5z5PJH.js.map → TenantScopeSelector-CEFgxiWt.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js → TicketDetailPage-BhZ-mpv7.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BQHMaRmq.js.map → TicketDetailPage-BhZ-mpv7.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js → TicketDetailPage-BxOiOG22.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Bk_0uQ3B.js.map → TicketDetailPage-BxOiOG22.js.map} +1 -1
- package/dist/chunks/{TicketsPage-CufUJctx.js → TicketsPage-BiTvIcM8.js} +2 -2
- package/dist/chunks/{TicketsPage-CufUJctx.js.map → TicketsPage-BiTvIcM8.js.map} +1 -1
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js → TicketsPage-CSiinHME.js} +2 -2
- package/dist/chunks/{TicketsPage-C8QQ4SKy.js.map → TicketsPage-CSiinHME.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js → UserCreateTicketPage-B3TW1oV7.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-DoEMtJoe.js.map → UserCreateTicketPage-B3TW1oV7.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js → UserCreateTicketPage-BszUd_WZ.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-XxjNlR9K.js.map → UserCreateTicketPage-BszUd_WZ.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js → UserDashboardPage-C6MvatAb.js} +2 -2
- package/dist/chunks/{UserDashboardPage-fdhZwMLg.js.map → UserDashboardPage-C6MvatAb.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js → UserDashboardPage-Dtt9VzG_.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BV1d2hMG.js.map → UserDashboardPage-Dtt9VzG_.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-C97e-Dax.js → UserDetailPage-BEEV2vlJ.js} +5 -5
- package/dist/chunks/{UserDetailPage-C97e-Dax.js.map → UserDetailPage-BEEV2vlJ.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js → UserDetailPage-Dw5OHheZ.js} +2 -2
- package/dist/chunks/{UserDetailPage-BcA7Vhb2.js.map → UserDetailPage-Dw5OHheZ.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js → UserTicketDetailPage-B4YkzzbR.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-BA2syxXG.js.map → UserTicketDetailPage-B4YkzzbR.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js → UserTicketDetailPage-DCFV-0ny.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CXuZVAa2.js.map → UserTicketDetailPage-DCFV-0ny.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js → UsersGroupsPage-CY-l9fTp.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CPVk31Dh.js.map → UsersGroupsPage-CY-l9fTp.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js → UsersGroupsPage-c28vYHN9.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-DS2YiUE4.js.map → UsersGroupsPage-c28vYHN9.js.map} +1 -1
- package/dist/chunks/{UsersPage-BIXWHFmG.js → UsersPage-1sLlq9QD.js} +2 -2
- package/dist/chunks/{UsersPage-BIXWHFmG.js.map → UsersPage-1sLlq9QD.js.map} +1 -1
- package/dist/chunks/{UsersPage-DS8aWUKj.js → UsersPage-Bm-uNxh0.js} +2 -2
- package/dist/chunks/{UsersPage-DS8aWUKj.js.map → UsersPage-Bm-uNxh0.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js → accessRequestsApi-CJPjyEkH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-C-r0mrCH.js.map → accessRequestsApi-CJPjyEkH.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js → accessRequestsApi-D_pj1wl6.js} +2 -2
- package/dist/chunks/{accessRequestsApi-k3ZwhcFb.js.map → accessRequestsApi-D_pj1wl6.js.map} +1 -1
- package/dist/chunks/{aiApi-B-H-76wM.js → aiApi-ByF-oo1J.js} +2 -2
- package/dist/chunks/{aiApi-B-H-76wM.js.map → aiApi-ByF-oo1J.js.map} +1 -1
- package/dist/chunks/{aiApi-CcdrBILv.js → aiApi-Dt3fj0dU.js} +2 -2
- package/dist/chunks/{aiApi-CcdrBILv.js.map → aiApi-Dt3fj0dU.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js → applicationAnalyticsApi-BgG3SGJm.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CO3tk6Ju.js.map → applicationAnalyticsApi-BgG3SGJm.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js → applicationAnalyticsApi-ktD65iLO.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-CLVdVLDu.js.map → applicationAnalyticsApi-ktD65iLO.js.map} +1 -1
- package/dist/chunks/{groupsApi-DExOJZPF.js → groupsApi-C-FLWPCO.js} +2 -2
- package/dist/chunks/{groupsApi-DExOJZPF.js.map → groupsApi-C-FLWPCO.js.map} +1 -1
- package/dist/chunks/{groupsApi-CyqyYsmi.js → groupsApi-CBI5vMLa.js} +2 -2
- package/dist/chunks/{groupsApi-CyqyYsmi.js.map → groupsApi-CBI5vMLa.js.map} +1 -1
- package/dist/chunks/{index-DtAReZI6.js → index-B727-QSU.js} +2 -2
- package/dist/chunks/{index-DtAReZI6.js.map → index-B727-QSU.js.map} +1 -1
- package/dist/chunks/{index-BlOgmQzc.js → index-B9q3vx13.js} +2 -2
- package/dist/chunks/{index-BlOgmQzc.js.map → index-B9q3vx13.js.map} +1 -1
- package/dist/chunks/{index-VSQ2prtJ.js → index-BD-REzV9.js} +2 -2
- package/dist/chunks/{index-VSQ2prtJ.js.map → index-BD-REzV9.js.map} +1 -1
- package/dist/chunks/{index-XOOiD_zY.js → index-BDRogQH_.js} +3 -3
- package/dist/chunks/{index-XOOiD_zY.js.map → index-BDRogQH_.js.map} +1 -1
- package/dist/chunks/{index-DOQyf5yZ.js → index-C-DYxdvd.js} +8 -8
- package/dist/chunks/{index-DOQyf5yZ.js.map → index-C-DYxdvd.js.map} +1 -1
- package/dist/chunks/{index-Cq80YBne.js → index-CBtjGPod.js} +105 -105
- package/dist/chunks/{index-Cq80YBne.js.map → index-CBtjGPod.js.map} +1 -1
- package/dist/chunks/{index-dlXYTPWH.js → index-CF1cvNUL.js} +4 -4
- package/dist/chunks/{index-dlXYTPWH.js.map → index-CF1cvNUL.js.map} +1 -1
- package/dist/chunks/{index-COA_xJVJ.js → index-CH0pTHy1.js} +2 -2
- package/dist/chunks/{index-COA_xJVJ.js.map → index-CH0pTHy1.js.map} +1 -1
- package/dist/chunks/{index-DjZQ6ZG_.js → index-Ca88RIuT.js} +2 -2
- package/dist/chunks/{index-DjZQ6ZG_.js.map → index-Ca88RIuT.js.map} +1 -1
- package/dist/chunks/{index-Cj-9tGpd.js → index-CkWvsvKW.js} +2 -2
- package/dist/chunks/{index-Cj-9tGpd.js.map → index-CkWvsvKW.js.map} +1 -1
- package/dist/chunks/{index-EL_ZNnMH.js → index-CzYKE5fL.js} +2 -2
- package/dist/chunks/{index-EL_ZNnMH.js.map → index-CzYKE5fL.js.map} +1 -1
- package/dist/chunks/{index-qXfYaEmV.js → index-D32ol7lq.js} +2 -2
- package/dist/chunks/{index-qXfYaEmV.js.map → index-D32ol7lq.js.map} +1 -1
- package/dist/chunks/{index-DMQQ0KyA.js → index-D7hmx9IX.js} +2 -2
- package/dist/chunks/{index-DMQQ0KyA.js.map → index-D7hmx9IX.js.map} +1 -1
- package/dist/chunks/{index-BetDcNZm.js → index-DThcQmwZ.js} +2 -2
- package/dist/chunks/{index-BetDcNZm.js.map → index-DThcQmwZ.js.map} +1 -1
- package/dist/chunks/{index-C7h5yvcP.js → index-D_3J6ziZ.js} +2 -2
- package/dist/chunks/{index-C7h5yvcP.js.map → index-D_3J6ziZ.js.map} +1 -1
- package/dist/chunks/{index-C_nDTEP5.js → index-JSjfMShT.js} +2 -2
- package/dist/chunks/{index-C_nDTEP5.js.map → index-JSjfMShT.js.map} +1 -1
- package/dist/chunks/{index-COXxU0FH.js → index-gzXJw_ow.js} +3 -3
- package/dist/chunks/{index-COXxU0FH.js.map → index-gzXJw_ow.js.map} +1 -1
- package/dist/chunks/{index-jJxtz2bs.js → index-rRAbl04H.js} +2 -2
- package/dist/chunks/{index-jJxtz2bs.js.map → index-rRAbl04H.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js → tenantIconMap-Cw-hQ9n4.js} +2 -2
- package/dist/chunks/{tenantIconMap-Ddvguo0l.js.map → tenantIconMap-Cw-hQ9n4.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js → tenantIconMap-DinwojNW.js} +2 -2
- package/dist/chunks/{tenantIconMap-DBa5MjIz.js.map → tenantIconMap-DinwojNW.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js → ticketingApi-CcWdebXv.js} +2 -2
- package/dist/chunks/{ticketingApi-Cr6QSv0g.js.map → ticketingApi-CcWdebXv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-D6s75rOB.js → ticketingApi-x0BwZ1NH.js} +2 -2
- package/dist/chunks/{ticketingApi-D6s75rOB.js.map → ticketingApi-x0BwZ1NH.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js → useAccessRequests-BBTIYht3.js} +2 -2
- package/dist/chunks/{useAccessRequests-VuQT-n-P.js.map → useAccessRequests-BBTIYht3.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CanI2ypo.js → useAccessRequests-BBUj9XY9.js} +71 -71
- package/dist/chunks/{useAccessRequests-CanI2ypo.js.map → useAccessRequests-BBUj9XY9.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js → useUserAccessRequests-BKQxcOXH.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BEVZLX_M.js.map → useUserAccessRequests-BKQxcOXH.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js → useUserAccessRequests-BPUPiP55.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Ba40FDLm.js.map → useUserAccessRequests-BPUPiP55.js.map} +1 -1
- package/dist/pages/platform/administration/applications/ApplicationDetailPage.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/ApplicationDetailPage-CWdz0TS4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterPage-asdx33fV.js","sources":["../../src/pages/auth/RegisterPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Eye, EyeOff, Lock, Mail, Loader2, User, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { NetworkError } from '@/types/errors';\r\n\r\nexport function RegisterPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const validateForm = () => {\r\n if (!email || !password || !confirmPassword || !firstName || !lastName) {\r\n setError(t('registerPage.allFieldsRequired'));\r\n return false;\r\n }\r\n\r\n if (password !== confirmPassword) {\r\n setError(t('registerPage.passwordMismatch'));\r\n return false;\r\n }\r\n\r\n if (password.length < 8) {\r\n setError(t('registerPage.passwordTooShort'));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n logService.logEvent('register_attempt', 'auth', { email });\r\n\r\n const response = await authApi.register({\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n });\r\n\r\n logService.logEvent('register_success', 'auth', { email });\r\n setSuccess(response.message);\r\n\r\n // Clear form\r\n setEmail('');\r\n setPassword('');\r\n setConfirmPassword('');\r\n setFirstName('');\r\n setLastName('');\r\n } catch (err) {\r\n if (err instanceof NetworkError) {\r\n setError(err.message);\r\n } else {\r\n const message = err instanceof Error ? err.message : 'Une erreur inattendue est survenue';\r\n setError(message);\r\n }\r\n logService.logError(\r\n err instanceof Error ? err : new Error(String(err)),\r\n 'RegisterPage.handleSubmit',\r\n { email }\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex\">\r\n {/* Left side - Branding & Features */}\r\n <div className=\"hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-600 p-12 text-white flex-col justify-between relative overflow-hidden\">\r\n {/* Background pattern */}\r\n <div className=\"absolute inset-0 opacity-10\">\r\n <div className=\"absolute inset-0\" style={{\r\n backgroundImage: 'radial-gradient(circle at 2px 2px, white 1px, transparent 0)',\r\n backgroundSize: '40px 40px'\r\n }} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n <div className=\"flex items-center gap-3 mb-12\">\r\n <div className=\"p-2 bg-white/20 backdrop-blur-sm rounded-lg\">\r\n <div className=\"w-8 h-8 flex items-center justify-center\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\r\n <path d=\"M12 2L2 7V17L12 22L22 17V7L12 2ZM12 4.5L19 8.27V15.73L12 19.5L5 15.73V8.27L12 4.5Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div className=\"text-2xl font-bold tracking-tight\">SmartStack</div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n <h1 className=\"text-4xl font-bold leading-tight\">\r\n {t('registerPage.brandTitle')}<br />\r\n <span className=\"text-white/80\">{t('registerPage.brandSubtitle')}</span>\r\n </h1>\r\n <p className=\"text-white/80 text-lg max-w-md\">\r\n {t('registerPage.brandDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative z-10 text-sm text-white/60\">\r\n © {new Date().getFullYear()} SmartStack. {t('registerPage.copyright')}\r\n </div>\r\n </div>\r\n\r\n {/* Right side - Registration Form */}\r\n <div className=\"w-full lg:w-1/2 flex items-center justify-center p-8 bg-white dark:bg-gray-900\">\r\n <div className=\"w-full max-w-md\">\r\n {/* Theme Switcher */}\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n {/* Form Header */}\r\n <div className=\"text-center mb-8\">\r\n <h2 className=\"text-3xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('registerPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.subtitle')}\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {success && (\r\n <div className=\"mb-6 p-4 bg-green-500/10 border border-green-500/20 rounded-lg flex items-start gap-3\">\r\n <CheckCircle2 className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm text-green-600 dark:text-green-400\">{success}</p>\r\n <p className=\"text-xs text-green-600/80 dark:text-green-400/80 mt-1\">\r\n {t('registerPage.successMessage')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500 flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Registration Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Name Fields */}\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label htmlFor=\"firstName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.firstName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"firstName\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.firstNamePlaceholder')}\r\n required\r\n autoComplete=\"given-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"lastName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.lastName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"lastName\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.lastNamePlaceholder')}\r\n required\r\n autoComplete=\"family-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.email')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.emailPlaceholder')}\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Password Field */}\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('registerPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Confirm Password Field */}\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('registerPage.submitting')}\r\n </>\r\n ) : (\r\n <>{t('registerPage.submitButton')}</>\r\n )}\r\n </button>\r\n </form>\r\n\r\n {/* Links */}\r\n <div className=\"mt-6 text-center space-y-2\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.alreadyHaveAccount')}{' '}\r\n <Link to=\"/login\" className=\"text-blue-600 dark:text-blue-400 hover:underline font-medium\">\r\n {t('registerPage.signIn')}\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["RegisterPage","t","useTranslation","email","setEmail","useState","password","setPassword","confirmPassword","setConfirmPassword","firstName","setFirstName","lastName","setLastName","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","error","setError","success","setSuccess","validateForm","handleSubmit","e","logService","response","authApi","err","NetworkError","message","jsxs","jsx","ThemeSwitcher","CheckCircle2","AlertCircle","User","Mail","Lock","EyeOff","Eye","Fragment","Loader2","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RegisterPage-ZskZrLZH.js","sources":["../../src/pages/auth/RegisterPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Eye, EyeOff, Lock, Mail, Loader2, User, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { NetworkError } from '@/types/errors';\r\n\r\nexport function RegisterPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const validateForm = () => {\r\n if (!email || !password || !confirmPassword || !firstName || !lastName) {\r\n setError(t('registerPage.allFieldsRequired'));\r\n return false;\r\n }\r\n\r\n if (password !== confirmPassword) {\r\n setError(t('registerPage.passwordMismatch'));\r\n return false;\r\n }\r\n\r\n if (password.length < 8) {\r\n setError(t('registerPage.passwordTooShort'));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n logService.logEvent('register_attempt', 'auth', { email });\r\n\r\n const response = await authApi.register({\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n });\r\n\r\n logService.logEvent('register_success', 'auth', { email });\r\n setSuccess(response.message);\r\n\r\n // Clear form\r\n setEmail('');\r\n setPassword('');\r\n setConfirmPassword('');\r\n setFirstName('');\r\n setLastName('');\r\n } catch (err) {\r\n if (err instanceof NetworkError) {\r\n setError(err.message);\r\n } else {\r\n const message = err instanceof Error ? err.message : 'Une erreur inattendue est survenue';\r\n setError(message);\r\n }\r\n logService.logError(\r\n err instanceof Error ? err : new Error(String(err)),\r\n 'RegisterPage.handleSubmit',\r\n { email }\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex\">\r\n {/* Left side - Branding & Features */}\r\n <div className=\"hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-600 p-12 text-white flex-col justify-between relative overflow-hidden\">\r\n {/* Background pattern */}\r\n <div className=\"absolute inset-0 opacity-10\">\r\n <div className=\"absolute inset-0\" style={{\r\n backgroundImage: 'radial-gradient(circle at 2px 2px, white 1px, transparent 0)',\r\n backgroundSize: '40px 40px'\r\n }} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n <div className=\"flex items-center gap-3 mb-12\">\r\n <div className=\"p-2 bg-white/20 backdrop-blur-sm rounded-lg\">\r\n <div className=\"w-8 h-8 flex items-center justify-center\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\r\n <path d=\"M12 2L2 7V17L12 22L22 17V7L12 2ZM12 4.5L19 8.27V15.73L12 19.5L5 15.73V8.27L12 4.5Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div className=\"text-2xl font-bold tracking-tight\">SmartStack</div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n <h1 className=\"text-4xl font-bold leading-tight\">\r\n {t('registerPage.brandTitle')}<br />\r\n <span className=\"text-white/80\">{t('registerPage.brandSubtitle')}</span>\r\n </h1>\r\n <p className=\"text-white/80 text-lg max-w-md\">\r\n {t('registerPage.brandDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative z-10 text-sm text-white/60\">\r\n © {new Date().getFullYear()} SmartStack. {t('registerPage.copyright')}\r\n </div>\r\n </div>\r\n\r\n {/* Right side - Registration Form */}\r\n <div className=\"w-full lg:w-1/2 flex items-center justify-center p-8 bg-white dark:bg-gray-900\">\r\n <div className=\"w-full max-w-md\">\r\n {/* Theme Switcher */}\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n {/* Form Header */}\r\n <div className=\"text-center mb-8\">\r\n <h2 className=\"text-3xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('registerPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.subtitle')}\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {success && (\r\n <div className=\"mb-6 p-4 bg-green-500/10 border border-green-500/20 rounded-lg flex items-start gap-3\">\r\n <CheckCircle2 className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm text-green-600 dark:text-green-400\">{success}</p>\r\n <p className=\"text-xs text-green-600/80 dark:text-green-400/80 mt-1\">\r\n {t('registerPage.successMessage')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500 flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Registration Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Name Fields */}\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label htmlFor=\"firstName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.firstName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"firstName\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.firstNamePlaceholder')}\r\n required\r\n autoComplete=\"given-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"lastName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.lastName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"lastName\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.lastNamePlaceholder')}\r\n required\r\n autoComplete=\"family-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.email')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.emailPlaceholder')}\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Password Field */}\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('registerPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Confirm Password Field */}\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('registerPage.submitting')}\r\n </>\r\n ) : (\r\n <>{t('registerPage.submitButton')}</>\r\n )}\r\n </button>\r\n </form>\r\n\r\n {/* Links */}\r\n <div className=\"mt-6 text-center space-y-2\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.alreadyHaveAccount')}{' '}\r\n <Link to=\"/login\" className=\"text-blue-600 dark:text-blue-400 hover:underline font-medium\">\r\n {t('registerPage.signIn')}\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["RegisterPage","t","useTranslation","email","setEmail","useState","password","setPassword","confirmPassword","setConfirmPassword","firstName","setFirstName","lastName","setLastName","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","error","setError","success","setSuccess","validateForm","handleSubmit","e","logService","response","authApi","err","NetworkError","message","jsxs","jsx","ThemeSwitcher","CheckCircle2","AlertCircle","User","Mail","Lock","EyeOff","Eye","Fragment","Loader2","Link"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useState as s } from "react";
|
|
|
3
3
|
import { useTranslation as V } from "react-i18next";
|
|
4
4
|
import { CheckCircle2 as z, AlertCircle as A, User as S, Mail as D, Lock as L, EyeOff as E, Eye as F, Loader2 as R } from "lucide-react";
|
|
5
5
|
import { Link as B } from "react-router-dom";
|
|
6
|
-
import { T as H, l as p, c as U, N as Z } from "./index-
|
|
6
|
+
import { T as H, l as p, c as U, N as Z } from "./index-CBtjGPod.js";
|
|
7
7
|
function Q() {
|
|
8
8
|
const { t } = V("auth"), [n, b] = s(""), [d, f] = s(""), [c, x] = s(""), [g, y] = s(""), [m, w] = s(""), [u, j] = s(!1), [h, q] = s(!1), [i, N] = s(!1), [v, o] = s(null), [k, P] = s(null), T = () => !n || !d || !c || !g || !m ? (o(t("registerPage.allFieldsRequired")), !1) : d !== c ? (o(t("registerPage.passwordMismatch")), !1) : d.length < 8 ? (o(t("registerPage.passwordTooShort")), !1) : !0, I = async (a) => {
|
|
9
9
|
if (a.preventDefault(), o(null), P(null), !!T()) {
|
|
@@ -226,4 +226,4 @@ function Q() {
|
|
|
226
226
|
export {
|
|
227
227
|
Q as RegisterPage
|
|
228
228
|
};
|
|
229
|
-
//# sourceMappingURL=RegisterPage-
|
|
229
|
+
//# sourceMappingURL=RegisterPage-b8yIPVgh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterPage-CIPHRYkl.js","sources":["../../src/pages/auth/RegisterPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Eye, EyeOff, Lock, Mail, Loader2, User, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { NetworkError } from '@/types/errors';\r\n\r\nexport function RegisterPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const validateForm = () => {\r\n if (!email || !password || !confirmPassword || !firstName || !lastName) {\r\n setError(t('registerPage.allFieldsRequired'));\r\n return false;\r\n }\r\n\r\n if (password !== confirmPassword) {\r\n setError(t('registerPage.passwordMismatch'));\r\n return false;\r\n }\r\n\r\n if (password.length < 8) {\r\n setError(t('registerPage.passwordTooShort'));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n logService.logEvent('register_attempt', 'auth', { email });\r\n\r\n const response = await authApi.register({\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n });\r\n\r\n logService.logEvent('register_success', 'auth', { email });\r\n setSuccess(response.message);\r\n\r\n // Clear form\r\n setEmail('');\r\n setPassword('');\r\n setConfirmPassword('');\r\n setFirstName('');\r\n setLastName('');\r\n } catch (err) {\r\n if (err instanceof NetworkError) {\r\n setError(err.message);\r\n } else {\r\n const message = err instanceof Error ? err.message : 'Une erreur inattendue est survenue';\r\n setError(message);\r\n }\r\n logService.logError(\r\n err instanceof Error ? err : new Error(String(err)),\r\n 'RegisterPage.handleSubmit',\r\n { email }\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex\">\r\n {/* Left side - Branding & Features */}\r\n <div className=\"hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-600 p-12 text-white flex-col justify-between relative overflow-hidden\">\r\n {/* Background pattern */}\r\n <div className=\"absolute inset-0 opacity-10\">\r\n <div className=\"absolute inset-0\" style={{\r\n backgroundImage: 'radial-gradient(circle at 2px 2px, white 1px, transparent 0)',\r\n backgroundSize: '40px 40px'\r\n }} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n <div className=\"flex items-center gap-3 mb-12\">\r\n <div className=\"p-2 bg-white/20 backdrop-blur-sm rounded-lg\">\r\n <div className=\"w-8 h-8 flex items-center justify-center\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\r\n <path d=\"M12 2L2 7V17L12 22L22 17V7L12 2ZM12 4.5L19 8.27V15.73L12 19.5L5 15.73V8.27L12 4.5Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div className=\"text-2xl font-bold tracking-tight\">SmartStack</div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n <h1 className=\"text-4xl font-bold leading-tight\">\r\n {t('registerPage.brandTitle')}<br />\r\n <span className=\"text-white/80\">{t('registerPage.brandSubtitle')}</span>\r\n </h1>\r\n <p className=\"text-white/80 text-lg max-w-md\">\r\n {t('registerPage.brandDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative z-10 text-sm text-white/60\">\r\n © {new Date().getFullYear()} SmartStack. {t('registerPage.copyright')}\r\n </div>\r\n </div>\r\n\r\n {/* Right side - Registration Form */}\r\n <div className=\"w-full lg:w-1/2 flex items-center justify-center p-8 bg-white dark:bg-gray-900\">\r\n <div className=\"w-full max-w-md\">\r\n {/* Theme Switcher */}\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n {/* Form Header */}\r\n <div className=\"text-center mb-8\">\r\n <h2 className=\"text-3xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('registerPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.subtitle')}\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {success && (\r\n <div className=\"mb-6 p-4 bg-green-500/10 border border-green-500/20 rounded-lg flex items-start gap-3\">\r\n <CheckCircle2 className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm text-green-600 dark:text-green-400\">{success}</p>\r\n <p className=\"text-xs text-green-600/80 dark:text-green-400/80 mt-1\">\r\n {t('registerPage.successMessage')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500 flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Registration Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Name Fields */}\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label htmlFor=\"firstName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.firstName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"firstName\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.firstNamePlaceholder')}\r\n required\r\n autoComplete=\"given-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"lastName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.lastName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"lastName\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.lastNamePlaceholder')}\r\n required\r\n autoComplete=\"family-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.email')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.emailPlaceholder')}\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Password Field */}\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('registerPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Confirm Password Field */}\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('registerPage.submitting')}\r\n </>\r\n ) : (\r\n <>{t('registerPage.submitButton')}</>\r\n )}\r\n </button>\r\n </form>\r\n\r\n {/* Links */}\r\n <div className=\"mt-6 text-center space-y-2\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.alreadyHaveAccount')}{' '}\r\n <Link to=\"/login\" className=\"text-blue-600 dark:text-blue-400 hover:underline font-medium\">\r\n {t('registerPage.signIn')}\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["RegisterPage","useTranslation","email","setEmail","useState","password","setPassword","confirmPassword","setConfirmPassword","firstName","setFirstName","lastName","setLastName","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","error","setError","success","setSuccess","validateForm","handleSubmit","e","logService","response","authApi","err","NetworkError","message","jsxs","jsx","ThemeSwitcher","CheckCircle2","AlertCircle","User","Mail","Lock","EyeOff","Eye","Fragment","Loader2","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RegisterPage-b8yIPVgh.js","sources":["../../src/pages/auth/RegisterPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Eye, EyeOff, Lock, Mail, Loader2, User, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\nimport { logService } from '@/services/logging/logService';\r\nimport { NetworkError } from '@/types/errors';\r\n\r\nexport function RegisterPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const validateForm = () => {\r\n if (!email || !password || !confirmPassword || !firstName || !lastName) {\r\n setError(t('registerPage.allFieldsRequired'));\r\n return false;\r\n }\r\n\r\n if (password !== confirmPassword) {\r\n setError(t('registerPage.passwordMismatch'));\r\n return false;\r\n }\r\n\r\n if (password.length < 8) {\r\n setError(t('registerPage.passwordTooShort'));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n logService.logEvent('register_attempt', 'auth', { email });\r\n\r\n const response = await authApi.register({\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n });\r\n\r\n logService.logEvent('register_success', 'auth', { email });\r\n setSuccess(response.message);\r\n\r\n // Clear form\r\n setEmail('');\r\n setPassword('');\r\n setConfirmPassword('');\r\n setFirstName('');\r\n setLastName('');\r\n } catch (err) {\r\n if (err instanceof NetworkError) {\r\n setError(err.message);\r\n } else {\r\n const message = err instanceof Error ? err.message : 'Une erreur inattendue est survenue';\r\n setError(message);\r\n }\r\n logService.logError(\r\n err instanceof Error ? err : new Error(String(err)),\r\n 'RegisterPage.handleSubmit',\r\n { email }\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex\">\r\n {/* Left side - Branding & Features */}\r\n <div className=\"hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-600 p-12 text-white flex-col justify-between relative overflow-hidden\">\r\n {/* Background pattern */}\r\n <div className=\"absolute inset-0 opacity-10\">\r\n <div className=\"absolute inset-0\" style={{\r\n backgroundImage: 'radial-gradient(circle at 2px 2px, white 1px, transparent 0)',\r\n backgroundSize: '40px 40px'\r\n }} />\r\n </div>\r\n\r\n <div className=\"relative z-10\">\r\n <div className=\"flex items-center gap-3 mb-12\">\r\n <div className=\"p-2 bg-white/20 backdrop-blur-sm rounded-lg\">\r\n <div className=\"w-8 h-8 flex items-center justify-center\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-6 h-6\">\r\n <path d=\"M12 2L2 7V17L12 22L22 17V7L12 2ZM12 4.5L19 8.27V15.73L12 19.5L5 15.73V8.27L12 4.5Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div className=\"text-2xl font-bold tracking-tight\">SmartStack</div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n <h1 className=\"text-4xl font-bold leading-tight\">\r\n {t('registerPage.brandTitle')}<br />\r\n <span className=\"text-white/80\">{t('registerPage.brandSubtitle')}</span>\r\n </h1>\r\n <p className=\"text-white/80 text-lg max-w-md\">\r\n {t('registerPage.brandDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative z-10 text-sm text-white/60\">\r\n © {new Date().getFullYear()} SmartStack. {t('registerPage.copyright')}\r\n </div>\r\n </div>\r\n\r\n {/* Right side - Registration Form */}\r\n <div className=\"w-full lg:w-1/2 flex items-center justify-center p-8 bg-white dark:bg-gray-900\">\r\n <div className=\"w-full max-w-md\">\r\n {/* Theme Switcher */}\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n {/* Form Header */}\r\n <div className=\"text-center mb-8\">\r\n <h2 className=\"text-3xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('registerPage.pageTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.subtitle')}\r\n </p>\r\n </div>\r\n\r\n {/* Success Message */}\r\n {success && (\r\n <div className=\"mb-6 p-4 bg-green-500/10 border border-green-500/20 rounded-lg flex items-start gap-3\">\r\n <CheckCircle2 className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm text-green-600 dark:text-green-400\">{success}</p>\r\n <p className=\"text-xs text-green-600/80 dark:text-green-400/80 mt-1\">\r\n {t('registerPage.successMessage')}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500 flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Registration Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* Name Fields */}\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label htmlFor=\"firstName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.firstName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"firstName\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.firstNamePlaceholder')}\r\n required\r\n autoComplete=\"given-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"lastName\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.lastName')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <User className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"lastName\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.lastNamePlaceholder')}\r\n required\r\n autoComplete=\"family-name\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Email Field */}\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.email')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.emailPlaceholder')}\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Password Field */}\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('registerPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n {/* Confirm Password Field */}\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('registerPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors\"\r\n placeholder={t('registerPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('registerPage.submitting')}\r\n </>\r\n ) : (\r\n <>{t('registerPage.submitButton')}</>\r\n )}\r\n </button>\r\n </form>\r\n\r\n {/* Links */}\r\n <div className=\"mt-6 text-center space-y-2\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\r\n {t('registerPage.alreadyHaveAccount')}{' '}\r\n <Link to=\"/login\" className=\"text-blue-600 dark:text-blue-400 hover:underline font-medium\">\r\n {t('registerPage.signIn')}\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["RegisterPage","useTranslation","email","setEmail","useState","password","setPassword","confirmPassword","setConfirmPassword","firstName","setFirstName","lastName","setLastName","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","error","setError","success","setSuccess","validateForm","handleSubmit","e","logService","response","authApi","err","NetworkError","message","jsxs","jsx","ThemeSwitcher","CheckCircle2","AlertCircle","User","Mail","Lock","EyeOff","Eye","Fragment","Loader2","Link"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),T=require("react-i18next"),o=require("react-router-dom"),t=require("lucide-react"),y=require("./index-
|
|
2
|
-
//# sourceMappingURL=ResetPasswordPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),T=require("react-i18next"),o=require("react-router-dom"),t=require("lucide-react"),y=require("./index-BDRogQH_.js");function L(){const{t:s}=T.useTranslation("auth"),[j]=o.useSearchParams(),P=o.useNavigate(),d=j.get("token"),[n,N]=r.useState(""),[b,k]=r.useState(""),[m,v]=r.useState(!1),[g,S]=r.useState(!1),[i,f]=r.useState(!1),[c,u]=r.useState("form"),[x,a]=r.useState(null);r.useEffect(()=>{d||(u("invalid_token"),a(s("resetPasswordPage.invalidToken")))},[d,s]);const C=()=>n.length<8?(a(s("resetPasswordPage.passwordTooShort")),!1):n!==b?(a(s("resetPasswordPage.passwordMismatch")),!1):!0,E=async l=>{if(l.preventDefault(),a(null),!(!C()||!d)){f(!0);try{await y.authApi.resetPassword(d,n),u("success")}catch(w){const p=w,h=w?.code;h==="TOKEN_EXPIRED"||h==="TOKEN_ALREADY_USED"||h==="INVALID_TOKEN"?(u("error"),a(p?.message||s("resetPasswordPage.errorMessage"))):a(p?.message||s("common:error"))}finally{f(!1)}}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(y.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[c==="invalid_token"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(t.XCircle,{className:"w-10 h-10 text-red-600 dark:text-red-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:s("resetPasswordPage.errorTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:x}),e.jsx(o.Link,{to:"/forgot-password",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors",children:s("forgotPasswordPage.pageTitle")})]}),c==="error"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(t.XCircle,{className:"w-10 h-10 text-red-600 dark:text-red-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:s("resetPasswordPage.errorTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:x}),e.jsx(o.Link,{to:"/forgot-password",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors",children:s("forgotPasswordPage.pageTitle")})]}),c==="success"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(t.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:s("resetPasswordPage.successTitle")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:s("resetPasswordPage.successMessage")}),e.jsx("button",{onClick:()=>P("/login"),className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all",children:s("confirmEmailPage.signIn")})]}),c==="form"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(t.Lock,{className:"w-8 h-8 text-blue-600 dark:text-blue-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2",children:s("resetPasswordPage.submitButton")}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:s("resetPasswordPage.successMessage")})]}),x&&e.jsxs("div",{className:"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(t.AlertCircle,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-red-500",children:x})]}),e.jsxs("form",{onSubmit:E,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"password",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:s("resetPasswordPage.password")}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(t.Lock,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"password",type:m?"text":"password",value:n,onChange:l=>N(l.target.value),className:"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:s("resetPasswordPage.passwordPlaceholder"),required:!0,autoComplete:"new-password",disabled:i}),e.jsx("button",{type:"button",onClick:()=>v(!m),className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600",tabIndex:-1,children:m?e.jsx(t.EyeOff,{className:"h-5 w-5"}):e.jsx(t.Eye,{className:"h-5 w-5"})})]}),e.jsx("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-400",children:s("resetPasswordPage.passwordHint")})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"confirmPassword",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:s("resetPasswordPage.confirmPassword")}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(t.Lock,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"confirmPassword",type:g?"text":"password",value:b,onChange:l=>k(l.target.value),className:"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:s("resetPasswordPage.passwordPlaceholder"),required:!0,autoComplete:"new-password",disabled:i}),e.jsx("button",{type:"button",onClick:()=>S(!g),className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600",tabIndex:-1,children:g?e.jsx(t.EyeOff,{className:"h-5 w-5"}):e.jsx(t.Eye,{className:"h-5 w-5"})})]})]}),e.jsx("button",{type:"submit",disabled:i,className:"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all",children:i?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"h-5 w-5 animate-spin"}),s("resetPasswordPage.submitting")]}):s("resetPasswordPage.submitButton")})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsx(o.Link,{to:"/login",className:"flex items-center justify-center text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors",children:s("resetPasswordPage.backToLogin")})})]})]})})}exports.ResetPasswordPage=L;
|
|
2
|
+
//# sourceMappingURL=ResetPasswordPage-CeAvfsE-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetPasswordPage-B4Dj24vU.js","sources":["../../src/pages/auth/ResetPasswordPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSearchParams, Link, useNavigate } from 'react-router-dom';\r\nimport { Lock, Eye, EyeOff, Loader2, CheckCircle2, XCircle, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'form' | 'success' | 'error' | 'invalid_token';\r\n\r\nexport function ResetPasswordPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const token = searchParams.get('token');\r\n\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [status, setStatus] = useState<Status>('form');\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('invalid_token');\r\n setError(t('resetPasswordPage.invalidToken'));\r\n }\r\n }, [token, t]);\r\n\r\n const validateForm = () => {\r\n if (password.length < 8) {\r\n setError(t('resetPasswordPage.passwordTooShort'));\r\n return false;\r\n }\r\n if (password !== confirmPassword) {\r\n setError(t('resetPasswordPage.passwordMismatch'));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n if (!validateForm() || !token) return;\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, password);\r\n setStatus('success');\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED' || code === 'TOKEN_ALREADY_USED' || code === 'INVALID_TOKEN') {\r\n setStatus('error');\r\n setError(error?.message || t('resetPasswordPage.errorMessage'));\r\n } else {\r\n setError(error?.message || t('common:error'));\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Invalid Token State */}\r\n {status === 'invalid_token' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error State (expired/used token) */}\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n <button\r\n onClick={() => navigate('/login')}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n {t('confirmEmailPage.signIn')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Form State */}\r\n {status === 'form' && (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.submitButton')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('resetPasswordPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('resetPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('resetPasswordPage.submitButton')\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n {t('resetPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ResetPasswordPage","t","useTranslation","searchParams","useSearchParams","navigate","useNavigate","token","password","setPassword","useState","confirmPassword","setConfirmPassword","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","status","setStatus","error","setError","useEffect","validateForm","handleSubmit","e","authApi","err","code","jsxs","jsx","ThemeSwitcher","XCircle","Link","CheckCircle2","Fragment","Lock","AlertCircle","EyeOff","Eye","Loader2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResetPasswordPage-CeAvfsE-.js","sources":["../../src/pages/auth/ResetPasswordPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSearchParams, Link, useNavigate } from 'react-router-dom';\r\nimport { Lock, Eye, EyeOff, Loader2, CheckCircle2, XCircle, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'form' | 'success' | 'error' | 'invalid_token';\r\n\r\nexport function ResetPasswordPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const token = searchParams.get('token');\r\n\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [status, setStatus] = useState<Status>('form');\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('invalid_token');\r\n setError(t('resetPasswordPage.invalidToken'));\r\n }\r\n }, [token, t]);\r\n\r\n const validateForm = () => {\r\n if (password.length < 8) {\r\n setError(t('resetPasswordPage.passwordTooShort'));\r\n return false;\r\n }\r\n if (password !== confirmPassword) {\r\n setError(t('resetPasswordPage.passwordMismatch'));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n if (!validateForm() || !token) return;\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, password);\r\n setStatus('success');\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED' || code === 'TOKEN_ALREADY_USED' || code === 'INVALID_TOKEN') {\r\n setStatus('error');\r\n setError(error?.message || t('resetPasswordPage.errorMessage'));\r\n } else {\r\n setError(error?.message || t('common:error'));\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Invalid Token State */}\r\n {status === 'invalid_token' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error State (expired/used token) */}\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n <button\r\n onClick={() => navigate('/login')}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n {t('confirmEmailPage.signIn')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Form State */}\r\n {status === 'form' && (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.submitButton')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('resetPasswordPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('resetPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('resetPasswordPage.submitButton')\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n {t('resetPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ResetPasswordPage","t","useTranslation","searchParams","useSearchParams","navigate","useNavigate","token","password","setPassword","useState","confirmPassword","setConfirmPassword","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","status","setStatus","error","setError","useEffect","validateForm","handleSubmit","e","authApi","err","code","jsxs","jsx","ThemeSwitcher","XCircle","Link","CheckCircle2","Fragment","Lock","AlertCircle","EyeOff","Eye","Loader2"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useState as s, useEffect as A } from "react";
|
|
|
3
3
|
import { useTranslation as D } from "react-i18next";
|
|
4
4
|
import { useSearchParams as F, useNavigate as M, Link as x } from "react-router-dom";
|
|
5
5
|
import { XCircle as N, CheckCircle2 as O, Lock as b, AlertCircle as K, EyeOff as k, Eye as v, Loader2 as R } from "lucide-react";
|
|
6
|
-
import { T as q, c as B } from "./index-
|
|
6
|
+
import { T as q, c as B } from "./index-CBtjGPod.js";
|
|
7
7
|
function G() {
|
|
8
8
|
const { t: r } = D("auth"), [C] = F(), T = M(), o = C.get("token"), [d, j] = s(""), [f, E] = s(""), [m, S] = s(!1), [g, L] = s(!1), [n, w] = s(!1), [i, u] = s("form"), [c, a] = s(null);
|
|
9
9
|
A(() => {
|
|
@@ -164,4 +164,4 @@ function G() {
|
|
|
164
164
|
export {
|
|
165
165
|
G as ResetPasswordPage
|
|
166
166
|
};
|
|
167
|
-
//# sourceMappingURL=ResetPasswordPage-
|
|
167
|
+
//# sourceMappingURL=ResetPasswordPage-Dzp5dCp8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetPasswordPage-B8MWH_Vi.js","sources":["../../src/pages/auth/ResetPasswordPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSearchParams, Link, useNavigate } from 'react-router-dom';\r\nimport { Lock, Eye, EyeOff, Loader2, CheckCircle2, XCircle, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'form' | 'success' | 'error' | 'invalid_token';\r\n\r\nexport function ResetPasswordPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const token = searchParams.get('token');\r\n\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [status, setStatus] = useState<Status>('form');\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('invalid_token');\r\n setError(t('resetPasswordPage.invalidToken'));\r\n }\r\n }, [token, t]);\r\n\r\n const validateForm = () => {\r\n if (password.length < 8) {\r\n setError(t('resetPasswordPage.passwordTooShort'));\r\n return false;\r\n }\r\n if (password !== confirmPassword) {\r\n setError(t('resetPasswordPage.passwordMismatch'));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n if (!validateForm() || !token) return;\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, password);\r\n setStatus('success');\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED' || code === 'TOKEN_ALREADY_USED' || code === 'INVALID_TOKEN') {\r\n setStatus('error');\r\n setError(error?.message || t('resetPasswordPage.errorMessage'));\r\n } else {\r\n setError(error?.message || t('common:error'));\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Invalid Token State */}\r\n {status === 'invalid_token' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error State (expired/used token) */}\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n <button\r\n onClick={() => navigate('/login')}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n {t('confirmEmailPage.signIn')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Form State */}\r\n {status === 'form' && (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.submitButton')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('resetPasswordPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('resetPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('resetPasswordPage.submitButton')\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n {t('resetPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ResetPasswordPage","t","useTranslation","searchParams","useSearchParams","navigate","useNavigate","token","password","setPassword","useState","confirmPassword","setConfirmPassword","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","status","setStatus","error","setError","useEffect","validateForm","handleSubmit","e","authApi","err","code","jsxs","jsx","ThemeSwitcher","XCircle","Link","CheckCircle2","Fragment","Lock","AlertCircle","EyeOff","Eye","Loader2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResetPasswordPage-Dzp5dCp8.js","sources":["../../src/pages/auth/ResetPasswordPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSearchParams, Link, useNavigate } from 'react-router-dom';\r\nimport { Lock, Eye, EyeOff, Loader2, CheckCircle2, XCircle, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'form' | 'success' | 'error' | 'invalid_token';\r\n\r\nexport function ResetPasswordPage(): ReactElement {\r\n const { t } = useTranslation('auth');\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const token = searchParams.get('token');\r\n\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [status, setStatus] = useState<Status>('form');\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('invalid_token');\r\n setError(t('resetPasswordPage.invalidToken'));\r\n }\r\n }, [token, t]);\r\n\r\n const validateForm = () => {\r\n if (password.length < 8) {\r\n setError(t('resetPasswordPage.passwordTooShort'));\r\n return false;\r\n }\r\n if (password !== confirmPassword) {\r\n setError(t('resetPasswordPage.passwordMismatch'));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n if (!validateForm() || !token) return;\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, password);\r\n setStatus('success');\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED' || code === 'TOKEN_ALREADY_USED' || code === 'INVALID_TOKEN') {\r\n setStatus('error');\r\n setError(error?.message || t('resetPasswordPage.errorMessage'));\r\n } else {\r\n setError(error?.message || t('common:error'));\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Invalid Token State */}\r\n {status === 'invalid_token' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error State (expired/used token) */}\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.errorTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">{error}</p>\r\n <Link\r\n to=\"/forgot-password\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\r\n >\r\n {t('forgotPasswordPage.pageTitle')}\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.successTitle')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n <button\r\n onClick={() => navigate('/login')}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n {t('confirmEmailPage.signIn')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Form State */}\r\n {status === 'form' && (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n {t('resetPasswordPage.submitButton')}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n {t('resetPasswordPage.successMessage')}\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.password')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\r\n {t('resetPasswordPage.passwordHint')}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <label htmlFor=\"confirmPassword\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n {t('resetPasswordPage.confirmPassword')}\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Lock className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showConfirmPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n className=\"block w-full pl-10 pr-10 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder={t('resetPasswordPage.passwordPlaceholder')}\r\n required\r\n autoComplete=\"new-password\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\r\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600\"\r\n tabIndex={-1}\r\n >\r\n {showConfirmPassword ? <EyeOff className=\"h-5 w-5\" /> : <Eye className=\"h-5 w-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n {t('resetPasswordPage.submitting')}\r\n </>\r\n ) : (\r\n t('resetPasswordPage.submitButton')\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n {t('resetPasswordPage.backToLogin')}\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ResetPasswordPage","t","useTranslation","searchParams","useSearchParams","navigate","useNavigate","token","password","setPassword","useState","confirmPassword","setConfirmPassword","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","isLoading","setIsLoading","status","setStatus","error","setError","useEffect","validateForm","handleSubmit","e","authApi","err","code","jsxs","jsx","ThemeSwitcher","XCircle","Link","CheckCircle2","Fragment","Lock","AlertCircle","EyeOff","Eye","Loader2"],"mappings":"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"}
|