@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.
Files changed (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. 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-2wUhd9Lu.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-BiaLRb0s.js.map
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-2wUhd9Lu.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-DQrBKNBq.js.map
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
@@ -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":"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"}
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-CwSaRXXg.js";
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-BQah4cI8.js.map
211
+ //# sourceMappingURL=OnboardingWizardPage-CyC2zONO.js.map