@atlashub/smartstack 3.21.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
- package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
- package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
- package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
- package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
- package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
- package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
- package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
- package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
- package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
- package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
- package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
- package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
- package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
- package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
- package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
- package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
- package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
- package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
- package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
- package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
- package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
- package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
- package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
- package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
- package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
- package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
- package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
- package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
- package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
- package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
- package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
- package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
- package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
- package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
- package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
- package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
- package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
- package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
- package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
- package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
- package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
- package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
- package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
- package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
- package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
- package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
- package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
- package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
- package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
- package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
- package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
- package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
- package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
- package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
- package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
- package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
- package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
- package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
- package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
- package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
- package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
- package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
- package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
- package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
- package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
- package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
- package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
- package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
- package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
- package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
- package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
- package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
- package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
- package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
- package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
- package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
- package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
- package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
- package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
- package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
- package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
- package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
- package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
- package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
- package/dist/chunks/index-IgLVXPg8.js.map +1 -0
- package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
- package/dist/chunks/index-lpIzhufD.js.map +1 -0
- package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
- package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
- package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
- package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
- package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
- package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
- package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
- package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
- package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
- package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
- package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
- package/dist/hooks/useCollapsibleState.d.ts +5 -2
- package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
- package/dist/i18n/config.d.ts +1 -0
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/dist/utils/permissions.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
- package/dist/chunks/index-CwSaRXXg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsPage-C29Lln5o.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotificationsPage-CAbNW_Cn.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),s=require("react"),Y=require("react-router-dom"),$=require("react-i18next"),r=require("lucide-react"),n=require("./index-
|
|
2
|
-
//# sourceMappingURL=NotificationsPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),s=require("react"),Y=require("react-router-dom"),$=require("react-i18next"),r=require("lucide-react"),n=require("./index-IgLVXPg8.js"),V=require("./ConfirmModal-CYWRiVoD.js");function W(){const u=Y.useNavigate(),{t:c}=$.useTranslation("common"),{currentTenant:S,userTenants:T,hasMultipleTenants:j}=n.useTenant(),[x,N]=s.useState(!0),[i,o]=s.useState([]),[D,m]=s.useState(!1),[P,b]=s.useState(!1),[h,p]=s.useState(1),[y,k]=s.useState(1),[g,f]=s.useState(0),[l,F]=s.useState(void 0),[v,q]=s.useState(void 0),A=s.useCallback(async()=>{try{N(!0);const e=await n.notificationsApi.getAll(h,20,l,v);o(e.items),k(e.totalPages),f(e.totalCount)}catch(e){console.error("Failed to load notifications:",e)}finally{N(!1)}},[h,l,v]);s.useEffect(()=>{A()},[A]);const C=async e=>{try{await n.notificationsApi.markAsRead(e),o(a=>a.map(d=>d.id===e?{...d,isRead:!0,readAt:new Date().toISOString()}:d))}catch(a){console.error("Failed to mark as read:",a)}},I=async()=>{try{await n.notificationsApi.markAllAsRead(),o(e=>e.map(a=>({...a,isRead:!0,readAt:new Date().toISOString()})))}catch(e){console.error("Failed to mark all as read:",e)}},M=async e=>{try{await n.notificationsApi.delete(e),o(a=>a.filter(d=>d.id!==e)),f(a=>a-1)}catch(a){console.error("Failed to delete notification:",a)}},B=async()=>{try{b(!0),await n.notificationsApi.deleteAll(),o([]),f(0),k(1)}catch(e){console.error("Failed to delete all notifications:",e)}finally{b(!1),m(!1)}},O=e=>{e.isRead||C(e.id),e.actionUrl&&u(e.actionUrl)},L=e=>{switch(e){case"TicketCreated":return"🎫";case"TicketAssigned":return"👤";case"StatusChanged":return"🔄";case"CommentAdded":return"💬";case"SlaResponseBreached":case"SlaResolutionBreached":return"⚠️";case"SlaWarning":return"⏰";case"TicketEscalated":return"📈";case"SatisfactionRequested":return"⭐";default:return"📌"}},w=e=>new Date(e).toLocaleString(),E=e=>{if(!j)return null;const a=n.getTenantBadgeVariant(e.tenantId,S?.id??null);return a==="global"?t.jsx("span",{className:"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700",children:"System"}):a==="current"?t.jsx("span",{className:"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]",children:e.tenantName}):t.jsx("span",{className:"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium",children:e.tenantName})},R=i.filter(e=>!e.isRead).length,U=()=>l===void 0?"":l?"read":"unread";return t.jsxs("div",{className:"space-y-6",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{children:[t.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[t.jsx(r.Bell,{className:"w-6 h-6"}),"Notifications"]}),t.jsxs("p",{className:"text-[var(--text-secondary)]",children:[g," notification",g!==1?"s":"",", ",R," unread"]})]}),t.jsx("div",{className:"flex items-center gap-2",children:t.jsxs("button",{onClick:()=>u("/myspace/notification-preferences"),className:"btn btn-secondary flex items-center gap-2",children:[t.jsx(r.Settings,{className:"w-4 h-4"}),"Preferences"]})})]}),t.jsxs("div",{className:"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(r.Filter,{className:"w-4 h-4 text-[var(--text-secondary)]"}),t.jsxs("select",{value:U(),onChange:e=>{const a=e.target.value;F(a===""?void 0:a==="read"),p(1)},className:"input",children:[t.jsx("option",{value:"",children:"All Notifications"}),t.jsx("option",{value:"unread",children:"Unread Only"}),t.jsx("option",{value:"read",children:"Read Only"})]}),j&&t.jsxs("select",{value:v||"",onChange:e=>{q(e.target.value||void 0),p(1)},className:"input",children:[t.jsx("option",{value:"",children:"All Workspaces"}),T.filter(e=>e.status==="Active").map(e=>t.jsx("option",{value:e.id,children:e.name},e.id))]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[R>0&&t.jsxs("button",{onClick:I,className:"btn btn-secondary flex items-center gap-2",children:[t.jsx(r.CheckCheck,{className:"w-4 h-4"}),"Mark All Read"]}),i.length>0&&t.jsxs("button",{onClick:()=>m(!0),className:"btn btn-secondary flex items-center gap-2 text-red-600",children:[t.jsx(r.Trash2,{className:"w-4 h-4"}),"Delete All"]})]})]}),x&&t.jsx("div",{className:"flex items-center justify-center py-12",children:t.jsx(r.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-primary-600)]"})}),!x&&i.length>0&&t.jsx("div",{className:"card divide-y divide-[var(--border-color)]",children:i.map(e=>t.jsx("button",{type:"button",onClick:()=>O(e),className:`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${e.isRead?"":"bg-blue-50/50"}`,children:t.jsxs("div",{className:"flex gap-4",children:[t.jsx("span",{className:"text-2xl flex-shrink-0",children:L(e.type)}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsxs("div",{className:"flex items-start justify-between gap-4",children:[t.jsxs("div",{children:[t.jsx("h3",{className:`${e.isRead?"":"font-semibold"}`,children:e.title}),t.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:e.message})]}),t.jsxs("div",{className:"text-right flex-shrink-0",children:[t.jsx("div",{className:"text-sm text-[var(--text-secondary)]",children:w(e.createdAt)}),e.isRead&&e.readAt&&t.jsxs("div",{className:"text-xs text-[var(--text-secondary)] mt-1",children:["Read ",w(e.readAt)]})]})]}),t.jsxs("div",{className:"flex items-center gap-2 mt-2",children:[t.jsx("span",{className:"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded",children:Z(e.type)}),E(e),e.relatedEntityType&&t.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:e.relatedEntityType})]})]}),t.jsxs("div",{className:"flex flex-col gap-2 flex-shrink-0",onClick:a=>a.stopPropagation(),children:[!e.isRead&&t.jsx("button",{onClick:()=>C(e.id),className:"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors",title:"Mark as read",children:t.jsx(r.Check,{className:"w-4 h-4 text-green-600"})}),t.jsx("button",{onClick:()=>M(e.id),className:"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors",title:"Delete",children:t.jsx(r.Trash2,{className:"w-4 h-4 text-red-500"})})]})]})},e.id))}),!x&&i.length===0&&t.jsxs("div",{className:"card p-12 text-center",children:[t.jsx(r.Bell,{className:"w-16 h-16 mx-auto mb-4 opacity-30"}),t.jsx("h3",{className:"text-lg font-medium mb-2",children:"No notifications"}),t.jsx("p",{className:"text-[var(--text-secondary)]",children:l===!1?"You have no unread notifications":l===!0?"You have no read notifications":"You're all caught up!"})]}),!x&&y>1&&t.jsx(n.Pagination,{page:h,totalPages:y,totalCount:g,onPageChange:p}),t.jsx(V.ConfirmModal,{isOpen:D,title:c("notifications.deleteAll.title"),message:c("notifications.deleteAll.message"),confirmLabel:c("notifications.deleteAll.confirm"),variant:"danger",loading:P,onConfirm:B,onCancel:()=>m(!1)})]})}function Z(u){return u.replace(/([A-Z])/g," $1").replace(/^./,c=>c.toUpperCase()).trim()}exports.NotificationsPage=W;
|
|
2
|
+
//# sourceMappingURL=NotificationsPage-DxwizUhL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsPage-BiaLRb0s.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","getFilterReadValue","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotificationsPage-DxwizUhL.js","sources":["../../src/pages/notifications/NotificationsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Bell,\r\n Check,\r\n CheckCheck,\r\n Trash2,\r\n Loader2,\r\n Filter,\r\n Settings,\r\n} from 'lucide-react';\r\nimport {\r\n notificationsApi,\r\n type NotificationDto,\r\n} from '@/services/api/supportApi';\r\nimport { Pagination } from '@/components/ui/DataView';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { getTenantBadgeVariant } from '@/utils/notificationTenant';\r\n\r\nexport function NotificationsPage(): ReactElement | null {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('common');\r\n const { currentTenant, userTenants, hasMultipleTenants } = useTenant();\r\n const [loading, setLoading] = useState(true);\r\n const [notifications, setNotifications] = useState<NotificationDto[]>([]);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [page, setPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [filterRead, setFilterRead] = useState<boolean | undefined>(undefined);\r\n const [filterTenantId, setFilterTenantId] = useState<string | undefined>(undefined);\r\n\r\n const loadNotifications = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await notificationsApi.getAll(page, 20, filterRead, filterTenantId);\r\n setNotifications(result.items);\r\n setTotalPages(result.totalPages);\r\n setTotalCount(result.totalCount);\r\n } catch (error) {\r\n console.error('Failed to load notifications:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, filterRead, filterTenantId]);\r\n\r\n useEffect(() => {\r\n loadNotifications();\r\n }, [loadNotifications]);\r\n\r\n const handleMarkAsRead = async (id: string) => {\r\n try {\r\n await notificationsApi.markAsRead(id);\r\n setNotifications((prev) =>\r\n prev.map((n) => (n.id === id ? { ...n, isRead: true, readAt: new Date().toISOString() } : n))\r\n );\r\n } catch (error) {\r\n console.error('Failed to mark as read:', error);\r\n }\r\n };\r\n\r\n const handleMarkAllAsRead = async () => {\r\n try {\r\n await notificationsApi.markAllAsRead();\r\n setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true, readAt: new Date().toISOString() })));\r\n } catch (error) {\r\n console.error('Failed to mark all as read:', error);\r\n }\r\n };\r\n\r\n const handleDelete = async (id: string) => {\r\n try {\r\n await notificationsApi.delete(id);\r\n setNotifications((prev) => prev.filter((n) => n.id !== id));\r\n setTotalCount((prev) => prev - 1);\r\n } catch (error) {\r\n console.error('Failed to delete notification:', error);\r\n }\r\n };\r\n\r\n const handleDeleteAll = async () => {\r\n try {\r\n setDeleting(true);\r\n await notificationsApi.deleteAll();\r\n setNotifications([]);\r\n setTotalCount(0);\r\n setTotalPages(1);\r\n } catch (error) {\r\n console.error('Failed to delete all notifications:', error);\r\n } finally {\r\n setDeleting(false);\r\n setShowDeleteConfirm(false);\r\n }\r\n };\r\n\r\n const handleNotificationClick = (notification: NotificationDto) => {\r\n if (!notification.isRead) {\r\n handleMarkAsRead(notification.id);\r\n }\r\n if (notification.actionUrl) {\r\n navigate(notification.actionUrl);\r\n }\r\n };\r\n\r\n const getNotificationIcon = (type: string) => {\r\n switch (type) {\r\n case 'TicketCreated':\r\n return '🎫';\r\n case 'TicketAssigned':\r\n return '👤';\r\n case 'StatusChanged':\r\n return '🔄';\r\n case 'CommentAdded':\r\n return '💬';\r\n case 'SlaResponseBreached':\r\n case 'SlaResolutionBreached':\r\n return '⚠️';\r\n case 'SlaWarning':\r\n return '⏰';\r\n case 'TicketEscalated':\r\n return '📈';\r\n case 'SatisfactionRequested':\r\n return '⭐';\r\n default:\r\n return '📌';\r\n }\r\n };\r\n\r\n const formatDate = (dateStr: string) => {\r\n const date = new Date(dateStr);\r\n return date.toLocaleString();\r\n };\r\n\r\n const renderTenantBadge = (notification: NotificationDto) => {\r\n if (!hasMultipleTenants) return null;\r\n\r\n const variant = getTenantBadgeVariant(notification.tenantId, currentTenant?.id ?? null);\r\n\r\n if (variant === 'global') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-700\">\r\n System\r\n </span>\r\n );\r\n }\r\n\r\n if (variant === 'current') {\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n }\r\n\r\n // 'other' tenant - highlighted\r\n return (\r\n <span className=\"text-xs px-2 py-1 rounded bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700 font-medium\">\r\n {notification.tenantName}\r\n </span>\r\n );\r\n };\r\n\r\n const unreadCount = notifications.filter((n) => !n.isRead).length;\r\n\r\n const getFilterReadValue = () => {\r\n if (filterRead === undefined) return '';\r\n return filterRead ? 'read' : 'unread';\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold flex items-center gap-2\">\r\n <Bell className=\"w-6 h-6\" />\r\n Notifications\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {totalCount} notification{totalCount !== 1 ? 's' : ''}, {unreadCount} unread\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate('/myspace/notification-preferences')}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n Preferences\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters and Actions */}\r\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <select\r\n value={getFilterReadValue()}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n setFilterRead(value === '' ? undefined : value === 'read');\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Notifications</option>\r\n <option value=\"unread\">Unread Only</option>\r\n <option value=\"read\">Read Only</option>\r\n </select>\r\n\r\n {hasMultipleTenants && (\r\n <select\r\n value={filterTenantId || ''}\r\n onChange={(e) => {\r\n setFilterTenantId(e.target.value || undefined);\r\n setPage(1);\r\n }}\r\n className=\"input\"\r\n >\r\n <option value=\"\">All Workspaces</option>\r\n {userTenants\r\n .filter(t => t.status === 'Active')\r\n .map(tenant => (\r\n <option key={tenant.id} value={tenant.id}>\r\n {tenant.name}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {unreadCount > 0 && (\r\n <button\r\n onClick={handleMarkAllAsRead}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <CheckCheck className=\"w-4 h-4\" />\r\n Mark All Read\r\n </button>\r\n )}\r\n {notifications.length > 0 && (\r\n <button\r\n onClick={() => setShowDeleteConfirm(true)}\r\n className=\"btn btn-secondary flex items-center gap-2 text-red-600\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n Delete All\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Notifications List */}\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && notifications.length > 0 && (\r\n <div className=\"card divide-y divide-[var(--border-color)]\">\r\n {notifications.map((notification) => (\r\n <button\r\n type=\"button\"\r\n key={notification.id}\r\n onClick={() => handleNotificationClick(notification)}\r\n className={`w-full text-left p-4 cursor-pointer hover:bg-[var(--bg-hover)] transition-colors ${\r\n !notification.isRead ? 'bg-blue-50/50' : ''\r\n }`}\r\n >\r\n <div className=\"flex gap-4\">\r\n <span className=\"text-2xl flex-shrink-0\">\r\n {getNotificationIcon(notification.type)}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-4\">\r\n <div>\r\n <h3 className={`${!notification.isRead ? 'font-semibold' : ''}`}>\r\n {notification.title}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {notification.message}\r\n </p>\r\n </div>\r\n <div className=\"text-right flex-shrink-0\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {formatDate(notification.createdAt)}\r\n </div>\r\n {notification.isRead && notification.readAt && (\r\n <div className=\"text-xs text-[var(--text-secondary)] mt-1\">\r\n Read {formatDate(notification.readAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <span className=\"text-xs px-2 py-1 bg-[var(--bg-secondary)] rounded\">\r\n {formatNotificationType(notification.type)}\r\n </span>\r\n {renderTenantBadge(notification)}\r\n {notification.relatedEntityType && (\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {notification.relatedEntityType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-2 flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\r\n {!notification.isRead && (\r\n <button\r\n onClick={() => handleMarkAsRead(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Mark as read\"\r\n >\r\n <Check className=\"w-4 h-4 text-green-600\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={() => handleDelete(notification.id)}\r\n className=\"p-2 rounded hover:bg-[var(--bg-secondary)] transition-colors\"\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-4 h-4 text-red-500\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && notifications.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Bell className=\"w-16 h-16 mx-auto mb-4 opacity-30\" />\r\n <h3 className=\"text-lg font-medium mb-2\">No notifications</h3>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {(() => {\r\n if (filterRead === false) return 'You have no unread notifications';\r\n if (filterRead === true) return 'You have no read notifications';\r\n return \"You're all caught up!\";\r\n })()}\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {!loading && totalPages > 1 && (\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n onPageChange={setPage}\r\n />\r\n )}\r\n\r\n {/* Delete All Confirmation */}\r\n <ConfirmModal\r\n isOpen={showDeleteConfirm}\r\n title={t('notifications.deleteAll.title')}\r\n message={t('notifications.deleteAll.message')}\r\n confirmLabel={t('notifications.deleteAll.confirm')}\r\n variant=\"danger\"\r\n loading={deleting}\r\n onConfirm={handleDeleteAll}\r\n onCancel={() => setShowDeleteConfirm(false)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction formatNotificationType(type: string): string {\r\n return type\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n"],"names":["NotificationsPage","navigate","useNavigate","t","useTranslation","currentTenant","userTenants","hasMultipleTenants","useTenant","loading","setLoading","useState","notifications","setNotifications","showDeleteConfirm","setShowDeleteConfirm","deleting","setDeleting","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","filterRead","setFilterRead","filterTenantId","setFilterTenantId","loadNotifications","useCallback","result","notificationsApi","error","useEffect","handleMarkAsRead","id","prev","n","handleMarkAllAsRead","handleDelete","handleDeleteAll","handleNotificationClick","notification","getNotificationIcon","type","formatDate","dateStr","renderTenantBadge","variant","getTenantBadgeVariant","jsx","unreadCount","getFilterReadValue","jsxs","Bell","Settings","Filter","value","tenant","CheckCheck","Trash2","Loader2","formatNotificationType","e","Check","Pagination","ConfirmModal","str"],"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"),P=require("react-router-dom"),T=require("react-i18next"),t=require("lucide-react"),g=require("./index-
|
|
2
|
-
//# sourceMappingURL=OnboardingWizardPage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),P=require("react-router-dom"),T=require("react-i18next"),t=require("lucide-react"),g=require("./index-IgLVXPg8.js"),N=[{code:"fr",name:"Francais",flag:"🇫🇷"},{code:"en",name:"English",flag:"🇬🇧"},{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"it",name:"Italiano",flag:"🇮🇹"}],b=[{value:"light",labelKey:"themeLight",icon:"☀️"},{value:"dark",labelKey:"themeDark",icon:"🌙"},{value:"system",labelKey:"themeSystem",icon:"💻"}],u=[{key:"indigo",color:"#6366f1",name:"Indigo"},{key:"blue",color:"#3b82f6",name:"Blue"},{key:"emerald",color:"#10b981",name:"Emerald"},{key:"amber",color:"#f59e0b",name:"Amber"},{key:"rose",color:"#f43f5e",name:"Rose"},{key:"purple",color:"#a855f7",name:"Purple"}];function $(){const{t:s,i18n:x}=T.useTranslation("auth"),h=P.useNavigate(),[l,f]=r.useState("language"),[n,k]=r.useState(x.language?.substring(0,2)||"fr"),[o,w]=r.useState("dark"),[i,S]=r.useState("indigo"),[p,v]=r.useState(!1),[j,y]=r.useState(null),[C,L]=r.useState(!1);r.useEffect(()=>{(async()=>{try{(await g.api.get("/api/onboarding/status")).hasCompletedOnboarding&&h("/myspace",{replace:!0})}catch{}})()},[h]),r.useEffect(()=>{n&&n!==x.language?.substring(0,2)&&g.changeLanguage(n)},[n,x]);const c=[{key:"language",labelKey:"stepLanguage",icon:e.jsx(t.Globe,{className:"w-5 h-5"})},{key:"theme",labelKey:"stepTheme",icon:e.jsx(t.Palette,{className:"w-5 h-5"})},{key:"complete",labelKey:"stepComplete",icon:e.jsx(t.Sparkles,{className:"w-5 h-5"})}],d=c.findIndex(a=>a.key===l),I=()=>{const a=d+1;a<c.length&&f(c[a].key)},K=()=>{const a=d-1;a>=0&&f(c[a].key)},O=async()=>{v(!0),y(null);try{await g.api.post("/api/onboarding/complete",{language:n,theme:o,accentColorKey:i}),localStorage.setItem("i18nextLng",n),localStorage.setItem("smartstack-theme-config",JSON.stringify({mode:o,accentColorKey:i,borderRadius:{},itemPaletteKey:"neutral"})),L(!0),setTimeout(()=>{window.location.href="/myspace"},2e3)}catch(a){console.error("Onboarding error:",a),y(s("onboarding.errorMessage"))}finally{v(!1)}};return C?e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]",children:e.jsx("div",{className:"max-w-md w-full mx-4",children:e.jsx("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.CheckCircle,{className:"w-12 h-12 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-2xl font-bold mb-3",children:s("onboarding.successTitle")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.successMessage")}),e.jsx("div",{className:"mt-6",children:e.jsx(t.Loader2,{className:"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin"})})]})})})}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4",children:e.jsxs("div",{className:"max-w-lg w-full",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"flex items-center justify-center gap-2 mb-4",children:e.jsx("div",{className:"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center",children:e.jsx("span",{className:"text-white text-xl font-bold",children:"S"})})}),e.jsx("h1",{className:"text-3xl font-bold mb-2",children:s("onboarding.title")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.subtitle")})]}),e.jsx("div",{className:"flex justify-center mb-8",children:e.jsx("div",{className:"flex items-center gap-2",children:c.map((a,m)=>e.jsxs("div",{className:"flex items-center",children:[e.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center transition-all ${m<=d?"bg-[var(--color-accent-500)] text-white":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)]"}`,children:a.icon}),m<c.length-1&&e.jsx("div",{className:`w-12 h-1 mx-1 rounded transition-all ${m<d?"bg-[var(--color-accent-500)]":"bg-[var(--bg-tertiary)]"}`})]},a.key))})}),e.jsxs("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:[l==="language"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.languageLabel")}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:N.map(a=>e.jsxs("button",{onClick:()=>k(a.code),className:`p-4 rounded-xl border-2 transition-all ${n===a.code?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-3xl mb-2 block",children:a.flag}),e.jsx("span",{className:"font-medium",children:a.name})]},a.code))})]}),l==="theme"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.themeLabel")}),e.jsx("div",{className:"grid grid-cols-3 gap-3 mb-8",children:b.map(a=>e.jsxs("button",{onClick:()=>w(a.value),className:`p-4 rounded-xl border-2 transition-all ${o===a.value?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-2xl mb-2 block",children:a.icon}),e.jsx("span",{className:"text-sm font-medium",children:s(`onboarding.${a.labelKey}`)})]},a.value))}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-3 text-[var(--text-secondary)]",children:s("onboarding.accentColorLabel")}),e.jsx("div",{className:"flex justify-center gap-3",children:u.map(a=>e.jsx("button",{onClick:()=>S(a.key),className:`w-10 h-10 rounded-full transition-all ${i===a.key?"ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]":"hover:scale-110"}`,style:{backgroundColor:a.color},title:a.name},a.key))})]})]}),l==="complete"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.Sparkles,{className:"w-10 h-10 text-[var(--color-accent-500)]"})}),e.jsx("h2",{className:"text-xl font-semibold mb-4",children:s("onboarding.stepComplete")}),e.jsxs("div",{className:"text-[var(--text-secondary)] mb-6 space-y-2",children:[e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Globe,{className:"w-4 h-4"}),N.find(a=>a.code===n)?.name]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Palette,{className:"w-4 h-4"}),b.find(a=>a.value===o)?.icon," ",s(`onboarding.${b.find(a=>a.value===o)?.labelKey}`)]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx("span",{className:"w-4 h-4 rounded-full",style:{backgroundColor:u.find(a=>a.key===i)?.color}}),u.find(a=>a.key===i)?.name]})})]}),j&&e.jsx("div",{className:"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm",children:j})]}),e.jsxs("div",{className:"flex justify-between mt-8",children:[d>0?e.jsxs("button",{onClick:K,className:"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors",children:[e.jsx(t.ArrowLeft,{className:"w-4 h-4"}),s("onboarding.back")]}):e.jsx("div",{}),l==="complete"?e.jsx("button",{onClick:O,disabled:p,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50",children:p?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"w-4 h-4 animate-spin"}),s("onboarding.completing")]}):e.jsxs(e.Fragment,{children:[s("onboarding.complete"),e.jsx(t.CheckCircle,{className:"w-4 h-4"})]})}):e.jsxs("button",{onClick:I,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors",children:[s("onboarding.continue"),e.jsx(t.ArrowRight,{className:"w-4 h-4"})]})]})]})]})})}exports.OnboardingWizardPage=$;
|
|
2
|
+
//# sourceMappingURL=OnboardingWizardPage-C6HlbJ3K.js.map
|
package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OnboardingWizardPage-DQrBKNBq.js","sources":["../../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage(): ReactElement {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","t","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"4PAsBMA,EAA8B,CAClC,CAAE,KAAM,KAAM,KAAM,WAAY,KAAM,MAAA,EACtC,CAAE,KAAM,KAAM,KAAM,UAAW,KAAM,MAAA,EACrC,CAAE,KAAM,KAAM,KAAM,UAAW,KAAM,MAAA,EACrC,CAAE,KAAM,KAAM,KAAM,WAAY,KAAM,MAAA,CACxC,EAEMC,EAAwB,CAC5B,CAAE,MAAO,QAAS,SAAU,aAAc,KAAM,IAAA,EAChD,CAAE,MAAO,OAAQ,SAAU,YAAa,KAAM,IAAA,EAC9C,CAAE,MAAO,SAAU,SAAU,cAAe,KAAM,IAAA,CACpD,EAEMC,EAAe,CACnB,CAAE,IAAK,SAAU,MAAO,UAAW,KAAM,QAAA,EACzC,CAAE,IAAK,OAAQ,MAAO,UAAW,KAAM,MAAA,EACvC,CAAE,IAAK,UAAW,MAAO,UAAW,KAAM,SAAA,EAC1C,CAAE,IAAK,QAAS,MAAO,UAAW,KAAM,OAAA,EACxC,CAAE,IAAK,OAAQ,MAAO,UAAW,KAAM,MAAA,EACvC,CAAE,IAAK,SAAU,MAAO,UAAW,KAAM,QAAA,CAC3C,EAEO,SAASC,GAAqC,CACnD,KAAM,CAAE,EAAAC,EAAG,KAAAC,GAASC,EAAAA,eAAe,MAAM,EACnCC,EAAWC,EAAAA,YAAA,EAEX,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAe,UAAU,EACzD,CAACC,EAAkBC,CAAmB,EAAIF,WAASN,EAAK,UAAU,UAAU,EAAG,CAAC,GAAK,IAAI,EACzF,CAACS,EAAeC,CAAgB,EAAIJ,EAAAA,SAAS,MAAM,EACnD,CAACK,EAAqBC,CAAsB,EAAIN,EAAAA,SAAS,QAAQ,EACjE,CAACO,EAAcC,CAAe,EAAIR,EAAAA,SAAS,EAAK,EAChD,CAACS,EAAOC,CAAQ,EAAIV,EAAAA,SAAwB,IAAI,EAChD,CAACW,EAASC,CAAU,EAAIZ,EAAAA,SAAS,EAAK,EAG5Ca,EAAAA,UAAU,IAAM,EACgB,SAAY,CACxC,GAAI,EACe,MAAMC,MAAI,IAAyC,wBAAwB,GAC/E,wBAEXlB,EAAS,WAAY,CAAE,QAAS,EAAA,CAAM,CAE1C,MAAQ,CAER,CACF,GAEA,CACF,EAAG,CAACA,CAAQ,CAAC,EAGbiB,EAAAA,UAAU,IAAM,CACVZ,GAAoBA,IAAqBP,EAAK,UAAU,UAAU,EAAG,CAAC,GACxEqB,EAAAA,eAAed,CAAgB,CAEnC,EAAG,CAACA,EAAkBP,CAAI,CAAC,EAE3B,MAAMsB,EAAkE,CACtE,CAAE,IAAK,WAAY,SAAU,eAAgB,KAAMC,EAAAA,IAACC,QAAA,CAAM,UAAU,SAAA,CAAU,CAAA,EAC9E,CAAE,IAAK,QAAS,SAAU,YAAa,KAAMD,EAAAA,IAACE,UAAA,CAAQ,UAAU,SAAA,CAAU,CAAA,EAC1E,CAAE,IAAK,WAAY,SAAU,eAAgB,KAAMF,EAAAA,IAACG,WAAA,CAAS,UAAU,UAAU,CAAA,CAAG,EAGhFC,EAAmBL,EAAM,UAAWM,GAAMA,EAAE,MAAQxB,CAAW,EAE/DyB,EAAa,IAAM,CACvB,MAAMC,EAAYH,EAAmB,EACjCG,EAAYR,EAAM,QACpBjB,EAAeiB,EAAMQ,CAAS,EAAE,GAAG,CAEvC,EAEMC,EAAa,IAAM,CACvB,MAAMC,EAAYL,EAAmB,EACjCK,GAAa,GACf3B,EAAeiB,EAAMU,CAAS,EAAE,GAAG,CAEvC,EAEMC,EAAiB,SAAY,CACjCnB,EAAgB,EAAI,EACpBE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMI,EAAAA,IAAI,KAAK,2BAA4B,CACzC,SAAUb,EACV,MAAOE,EACP,eAAgBE,CAAA,CACjB,EAGD,aAAa,QAAQ,aAAcJ,CAAgB,EACnD,aAAa,QACX,0BACA,KAAK,UAAU,CACb,KAAME,EACN,eAAgBE,EAChB,aAAc,CAAA,EACd,eAAgB,SAAA,CACjB,CAAA,EAGHO,EAAW,EAAI,EAGf,WAAW,IAAM,CACf,OAAO,SAAS,KAAO,UACzB,EAAG,GAAI,CACT,OAASgB,EAAK,CACZ,QAAQ,MAAM,oBAAqBA,CAAG,EACtClB,EAASjB,EAAE,yBAAyB,CAAC,CACvC,QAAA,CACEe,EAAgB,EAAK,CACvB,CACF,EAEA,OAAIG,EAEAM,MAAC,MAAA,CAAI,UAAU,uEACb,eAAC,MAAA,CAAI,UAAU,uBACb,SAAAA,EAAAA,IAAC,OAAI,UAAU,yFACb,SAAAY,OAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAZ,EAAAA,IAAC,OAAI,UAAU,yGACb,eAACa,EAAAA,YAAA,CAAY,UAAU,+CAA+C,CAAA,CACxE,QACC,KAAA,CAAG,UAAU,0BAA2B,SAAArC,EAAE,yBAAyB,EAAE,QACrE,IAAA,CAAE,UAAU,+BAAgC,SAAAA,EAAE,2BAA2B,EAAE,EAC5EwB,EAAAA,IAAC,OAAI,UAAU,OACb,eAACc,UAAA,CAAQ,UAAU,8DAA8D,CAAA,CACnF,CAAA,EACF,CAAA,CACF,EACF,EACF,QAKD,MAAA,CAAI,UAAU,2EACb,SAAAF,EAAAA,KAAC,MAAA,CAAI,UAAU,kBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAZ,MAAC,MAAA,CAAI,UAAU,8CACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,sGACb,SAAAA,EAAAA,IAAC,OAAA,CAAK,UAAU,+BAA+B,SAAA,GAAA,CAAC,EAClD,EACF,QACC,KAAA,CAAG,UAAU,0BAA2B,SAAAxB,EAAE,kBAAkB,EAAE,QAC9D,IAAA,CAAE,UAAU,+BAAgC,SAAAA,EAAE,qBAAqB,CAAA,CAAE,CAAA,EACxE,QAGC,MAAA,CAAI,UAAU,2BACb,SAAAwB,MAAC,OAAI,UAAU,0BACZ,SAAAD,EAAM,IAAI,CAACgB,EAAMC,IAChBJ,OAAC,MAAA,CAAmB,UAAU,oBAC5B,SAAA,CAAAZ,EAAAA,IAAC,MAAA,CACC,UAAW,0EACTgB,GAASZ,EACL,0CACA,sDACN,GAEC,SAAAW,EAAK,IAAA,CAAA,EAEPC,EAAQjB,EAAM,OAAS,GACtBC,EAAAA,IAAC,MAAA,CACC,UAAW,wCACTgB,EAAQZ,EACJ,+BACA,yBACN,EAAA,CAAA,CACF,CAAA,EAjBMW,EAAK,GAmBf,CACD,CAAA,CACH,CAAA,CACF,EAGAH,EAAAA,KAAC,MAAA,CAAI,UAAU,yFAEZ,SAAA,CAAA/B,IAAgB,mBACd,MAAA,CACC,SAAA,CAAAmB,MAAC,KAAA,CAAG,UAAU,yCAA0C,SAAAxB,EAAE,0BAA0B,EAAE,QACrF,MAAA,CAAI,UAAU,yBACZ,SAAAJ,EAAU,IAAK6C,GACdL,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAM3B,EAAoBgC,EAAK,IAAI,EAC5C,UAAW,0CACTjC,IAAqBiC,EAAK,KACtB,oGACA,qEACN,GAEA,SAAA,CAAAjB,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAAiB,EAAK,KAAK,EACjDjB,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAe,WAAK,IAAA,CAAK,CAAA,CAAA,EATpCiB,EAAK,IAAA,CAWb,CAAA,CACH,CAAA,EACF,EAIDpC,IAAgB,SACf+B,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAZ,MAAC,KAAA,CAAG,UAAU,yCAA0C,SAAAxB,EAAE,uBAAuB,EAAE,QAGlF,MAAA,CAAI,UAAU,8BACZ,SAAAH,EAAO,IAAK6C,GACXN,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMzB,EAAiB+B,EAAM,KAAK,EAC3C,UAAW,0CACThC,IAAkBgC,EAAM,MACpB,oGACA,qEACN,GAEA,SAAA,CAAAlB,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAAkB,EAAM,KAAK,EAClDlB,EAAAA,IAAC,QAAK,UAAU,sBAAuB,WAAE,cAAckB,EAAM,QAAQ,EAAE,CAAA,CAAE,CAAA,CAAA,EATpEA,EAAM,KAAA,CAWd,EACH,SAGC,MAAA,CACC,SAAA,CAAAlB,MAAC,KAAA,CAAG,UAAU,wDACX,SAAAxB,EAAE,6BAA6B,EAClC,QACC,MAAA,CAAI,UAAU,4BACZ,SAAAF,EAAa,IAAK6C,GACjBnB,EAAAA,IAAC,SAAA,CAEC,QAAS,IAAMX,EAAuB8B,EAAM,GAAG,EAC/C,UAAW,yCACT/B,IAAwB+B,EAAM,IAC1B,wFACA,iBACN,GACA,MAAO,CAAE,gBAAiBA,EAAM,KAAA,EAChC,MAAOA,EAAM,IAAA,EARRA,EAAM,GAAA,CAUd,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAIDtC,IAAgB,YACf+B,OAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAZ,EAAAA,IAAC,OAAI,UAAU,yIACb,eAACG,EAAAA,SAAA,CAAS,UAAU,2CAA2C,CAAA,CACjE,QACC,KAAA,CAAG,UAAU,6BAA8B,SAAA3B,EAAE,yBAAyB,EAAE,EACzEoC,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAZ,MAAC,IAAA,CACC,SAAAY,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAZ,EAAAA,IAACC,EAAAA,MAAA,CAAM,UAAU,SAAA,CAAU,EAC1B7B,EAAU,KAAMgD,GAAMA,EAAE,OAASpC,CAAgB,GAAG,IAAA,CAAA,CACvD,CAAA,CACF,EACAgB,MAAC,IAAA,CACC,SAAAY,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAZ,EAAAA,IAACE,EAAAA,QAAA,CAAQ,UAAU,SAAA,CAAU,EAC5B7B,EAAO,KAAMG,GAAMA,EAAE,QAAUU,CAAa,GAAG,KAAM,IACrDV,EAAE,cAAcH,EAAO,KAAMgD,GAAOA,EAAG,QAAUnC,CAAa,GAAG,QAAQ,EAAE,CAAA,CAAA,CAC9E,CAAA,CACF,EACAc,MAAC,IAAA,CACC,SAAAY,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAZ,EAAAA,IAAC,OAAA,CACC,UAAU,uBACV,MAAO,CAAE,gBAAiB1B,EAAa,KAAMgD,GAAMA,EAAE,MAAQlC,CAAmB,GAAG,KAAA,CAAM,CAAA,EAE1Fd,EAAa,KAAMgD,GAAMA,EAAE,MAAQlC,CAAmB,GAAG,IAAA,CAAA,CAC5D,CAAA,CACF,CAAA,EACF,EAECI,GACCQ,EAAAA,IAAC,MAAA,CAAI,UAAU,0FACZ,SAAAR,CAAA,CACH,CAAA,EAEJ,EAIFoB,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAR,EAAmB,EAClBQ,EAAAA,KAAC,SAAA,CACC,QAASJ,EACT,UAAU,oHAEV,SAAA,CAAAR,EAAAA,IAACuB,EAAAA,UAAA,CAAU,UAAU,SAAA,CAAU,EAC9B/C,EAAE,iBAAiB,CAAA,CAAA,CAAA,QAGrB,MAAA,EAAI,EAGNK,IAAgB,WACfmB,EAAAA,IAAC,SAAA,CACC,QAASU,EACT,SAAUpB,EACV,UAAU,4KAET,WACCsB,EAAAA,KAAAY,EAAAA,SAAA,CACE,SAAA,CAAAxB,EAAAA,IAACc,EAAAA,QAAA,CAAQ,UAAU,sBAAA,CAAuB,EACzCtC,EAAE,uBAAuB,CAAA,CAAA,CAC5B,EAEAoC,EAAAA,KAAAY,EAAAA,SAAA,CACG,SAAA,CAAAhD,EAAE,qBAAqB,EACxBwB,EAAAA,IAACa,EAAAA,YAAA,CAAY,UAAU,SAAA,CAAU,CAAA,CAAA,CACnC,CAAA,CAAA,EAIJD,EAAAA,KAAC,SAAA,CACC,QAASN,EACT,UAAU,wJAET,SAAA,CAAA9B,EAAE,qBAAqB,EACxBwB,EAAAA,IAACyB,EAAAA,WAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAAA,CAAA,CAClC,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ"}
|
|
1
|
+
{"version":3,"file":"OnboardingWizardPage-C6HlbJ3K.js","sources":["../../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage(): ReactElement {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","t","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { useState as c, useEffect as k } from "react";
|
|
|
3
3
|
import { useNavigate as D } from "react-router-dom";
|
|
4
4
|
import { useTranslation as F } from "react-i18next";
|
|
5
5
|
import { CheckCircle as w, Loader2 as C, Sparkles as S, Globe as j, Palette as K, ArrowLeft as M, ArrowRight as z } from "lucide-react";
|
|
6
|
-
import { h as G, i as L } from "./index-
|
|
6
|
+
import { h as G, i as L } from "./index-lpIzhufD.js";
|
|
7
7
|
const I = [
|
|
8
8
|
{ code: "fr", name: "Francais", flag: "🇫🇷" },
|
|
9
9
|
{ code: "en", name: "English", flag: "🇬🇧" },
|
|
@@ -208,4 +208,4 @@ function V() {
|
|
|
208
208
|
export {
|
|
209
209
|
V as OnboardingWizardPage
|
|
210
210
|
};
|
|
211
|
-
//# sourceMappingURL=OnboardingWizardPage-
|
|
211
|
+
//# sourceMappingURL=OnboardingWizardPage-CyC2zONO.js.map
|