@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":"AuthCallbackPage-C7XiZxKb.js","sources":["../../src/pages/auth/AuthCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { Loader2, CheckCircle, XCircle, AlertCircle } from 'lucide-react';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { getClientIpAddress } from '@/utils/ipDetection';\r\nimport { detectDeviceType } from '@/utils/deviceDetection';\r\n\r\ntype CallbackStatus = 'processing' | 'success' | 'error';\r\n\r\nconst errorMessages: Record<string, string> = {\r\n auth_failed: 'L\\'authentification a échoué. Veuillez réessayer.',\r\n no_email: 'Impossible de récupérer votre adresse email depuis le fournisseur.',\r\n account_disabled: 'Votre compte est désactivé. Contactez l\\'administrateur.',\r\n account_locked: 'Votre compte est verrouillé. Contactez l\\'administrateur.',\r\n internal_error: 'Une erreur interne est survenue. Veuillez réessayer.',\r\n};\r\n\r\nexport function AuthCallbackPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const [status, setStatus] = useState<CallbackStatus>('processing');\r\n const [errorMessage, setErrorMessage] = useState<string>('');\r\n\r\n useEffect(() => {\r\n const token = searchParams.get('token');\r\n const refreshToken = searchParams.get('refreshToken');\r\n const error = searchParams.get('error');\r\n\r\n if (error) {\r\n setStatus('error');\r\n setErrorMessage(errorMessages[error] || 'Une erreur est survenue lors de l\\'authentification.');\r\n return;\r\n }\r\n\r\n if (token && refreshToken) {\r\n handleSuccessfulAuth(token, refreshToken);\r\n } else {\r\n setStatus('error');\r\n setErrorMessage('Paramètres d\\'authentification manquants.');\r\n }\r\n }, [searchParams]);\r\n\r\n const handleSuccessfulAuth = async (token: string, refreshToken: string) => {\r\n try {\r\n localStorage.setItem('token', token);\r\n localStorage.setItem('refreshToken', refreshToken);\r\n\r\n // Update session with client-side IP address (retrieved via external service like ipify.org)\r\n // This is important for OAuth flows where the server can't reliably get the client IP\r\n try {\r\n const clientIp = await getClientIpAddress();\r\n const deviceType = detectDeviceType();\r\n\r\n if (clientIp || deviceType) {\r\n await fetch(`/api/auth/update-session-client-info`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({ clientIp, deviceType }),\r\n });\r\n }\r\n } catch (ipError) {\r\n // Non-critical - continue with the flow even if IP update fails\r\n }\r\n\r\n // Fetch user info\r\n const userResponse = await fetch(`/api/auth/me`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!userResponse.ok) {\r\n throw new Error('Failed to fetch user info');\r\n }\r\n\r\n const user = await userResponse.json();\r\n localStorage.setItem('user', JSON.stringify(user));\r\n\r\n // Check if user needs onboarding\r\n try {\r\n const onboardingResponse = await fetch(`/api/onboarding/status`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (onboardingResponse.ok) {\r\n const onboardingData = await onboardingResponse.json();\r\n if (!onboardingData.hasCompletedOnboarding) {\r\n // Redirect to onboarding wizard\r\n setStatus('success');\r\n setTimeout(() => {\r\n window.location.href = '/auth/onboarding';\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Non-critical - continue with normal flow\r\n }\r\n\r\n // Fetch user preferences\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n const themeConfig = {\r\n mode: prefs.theme || 'dark',\r\n accentColorKey: prefs.accentColorKey || 'indigo',\r\n borderRadius: prefs.borderRadius || {},\r\n itemPaletteKey: prefs.itemPaletteKey || 'neutral',\r\n };\r\n localStorage.setItem('smartstack-theme-config', JSON.stringify(themeConfig));\r\n if (prefs.language) {\r\n localStorage.setItem('i18nextLng', prefs.language);\r\n }\r\n } catch {\r\n // Non-critical - continue with defaults\r\n }\r\n\r\n setStatus('success');\r\n\r\n // Clear stale tenant state so TenantContext uses the user's configured default tenant (Priority 3: isDefault)\r\n localStorage.removeItem('currentTenantId');\r\n localStorage.removeItem('currentTenantSlug');\r\n localStorage.removeItem('isGlobalView');\r\n\r\n // Redirect after showing success\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 1500);\r\n } catch (err) {\r\n console.error('Auth callback error:', err);\r\n setStatus('error');\r\n setErrorMessage('Erreur lors de la finalisation de l\\'authentification.');\r\n }\r\n };\r\n\r\n const handleRetry = () => {\r\n navigate('/login');\r\n };\r\n\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 {status === 'processing' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 mx-auto text-[var(--color-accent-500)] animate-spin mb-4\" />\r\n <h2 className=\"text-xl font-semibold mb-2\">Authentification en cours...</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Veuillez patienter pendant que nous finalisons votre connexion.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <CheckCircle className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Connexion réussie !</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Vous allez être redirigé vers votre espace personnel...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Échec de l'authentification</h2>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 rounded-lg p-4 mb-6\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-700 dark:text-red-300\">{errorMessage}</p>\r\n </div>\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"btn btn-primary w-full\"\r\n >\r\n Retourner à la connexion\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["errorMessages","AuthCallbackPage","searchParams","useSearchParams","navigate","useNavigate","status","setStatus","useState","errorMessage","setErrorMessage","useEffect","token","refreshToken","error","handleSuccessfulAuth","clientIp","getClientIpAddress","deviceType","detectDeviceType","userResponse","user","onboardingResponse","prefs","userApi","themeConfig","err","handleRetry","jsx","jsxs","Loader2","CheckCircle","XCircle","AlertCircle"],"mappings":"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"}
1
+ {"version":3,"file":"AuthCallbackPage-CA2nO6DG.js","sources":["../../src/pages/auth/AuthCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { Loader2, CheckCircle, XCircle, AlertCircle } from 'lucide-react';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { getClientIpAddress } from '@/utils/ipDetection';\r\nimport { detectDeviceType } from '@/utils/deviceDetection';\r\n\r\ntype CallbackStatus = 'processing' | 'success' | 'error';\r\n\r\nconst errorMessages: Record<string, string> = {\r\n auth_failed: 'L\\'authentification a échoué. Veuillez réessayer.',\r\n no_email: 'Impossible de récupérer votre adresse email depuis le fournisseur.',\r\n account_disabled: 'Votre compte est désactivé. Contactez l\\'administrateur.',\r\n account_locked: 'Votre compte est verrouillé. Contactez l\\'administrateur.',\r\n internal_error: 'Une erreur interne est survenue. Veuillez réessayer.',\r\n};\r\n\r\nexport function AuthCallbackPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const [status, setStatus] = useState<CallbackStatus>('processing');\r\n const [errorMessage, setErrorMessage] = useState<string>('');\r\n\r\n useEffect(() => {\r\n const token = searchParams.get('token');\r\n const refreshToken = searchParams.get('refreshToken');\r\n const error = searchParams.get('error');\r\n\r\n if (error) {\r\n setStatus('error');\r\n setErrorMessage(errorMessages[error] || 'Une erreur est survenue lors de l\\'authentification.');\r\n return;\r\n }\r\n\r\n if (token && refreshToken) {\r\n handleSuccessfulAuth(token, refreshToken);\r\n } else {\r\n setStatus('error');\r\n setErrorMessage('Paramètres d\\'authentification manquants.');\r\n }\r\n }, [searchParams]);\r\n\r\n const handleSuccessfulAuth = async (token: string, refreshToken: string) => {\r\n try {\r\n localStorage.setItem('token', token);\r\n localStorage.setItem('refreshToken', refreshToken);\r\n\r\n // Update session with client-side IP address (retrieved via external service like ipify.org)\r\n // This is important for OAuth flows where the server can't reliably get the client IP\r\n try {\r\n const clientIp = await getClientIpAddress();\r\n const deviceType = detectDeviceType();\r\n\r\n if (clientIp || deviceType) {\r\n await fetch(`/api/auth/update-session-client-info`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({ clientIp, deviceType }),\r\n });\r\n }\r\n } catch (ipError) {\r\n // Non-critical - continue with the flow even if IP update fails\r\n }\r\n\r\n // Fetch user info\r\n const userResponse = await fetch(`/api/auth/me`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!userResponse.ok) {\r\n throw new Error('Failed to fetch user info');\r\n }\r\n\r\n const user = await userResponse.json();\r\n localStorage.setItem('user', JSON.stringify(user));\r\n\r\n // Check if user needs onboarding\r\n try {\r\n const onboardingResponse = await fetch(`/api/onboarding/status`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (onboardingResponse.ok) {\r\n const onboardingData = await onboardingResponse.json();\r\n if (!onboardingData.hasCompletedOnboarding) {\r\n // Redirect to onboarding wizard\r\n setStatus('success');\r\n setTimeout(() => {\r\n window.location.href = '/auth/onboarding';\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Non-critical - continue with normal flow\r\n }\r\n\r\n // Fetch user preferences\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n const themeConfig = {\r\n mode: prefs.theme || 'dark',\r\n accentColorKey: prefs.accentColorKey || 'indigo',\r\n borderRadius: prefs.borderRadius || {},\r\n itemPaletteKey: prefs.itemPaletteKey || 'neutral',\r\n };\r\n localStorage.setItem('smartstack-theme-config', JSON.stringify(themeConfig));\r\n if (prefs.language) {\r\n localStorage.setItem('i18nextLng', prefs.language);\r\n }\r\n } catch {\r\n // Non-critical - continue with defaults\r\n }\r\n\r\n setStatus('success');\r\n\r\n // Clear stale tenant state so TenantContext uses the user's configured default tenant (Priority 3: isDefault)\r\n localStorage.removeItem('currentTenantId');\r\n localStorage.removeItem('currentTenantSlug');\r\n localStorage.removeItem('isGlobalView');\r\n\r\n // Redirect after showing success\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 1500);\r\n } catch (err) {\r\n console.error('Auth callback error:', err);\r\n setStatus('error');\r\n setErrorMessage('Erreur lors de la finalisation de l\\'authentification.');\r\n }\r\n };\r\n\r\n const handleRetry = () => {\r\n navigate('/login');\r\n };\r\n\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 {status === 'processing' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 mx-auto text-[var(--color-accent-500)] animate-spin mb-4\" />\r\n <h2 className=\"text-xl font-semibold mb-2\">Authentification en cours...</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Veuillez patienter pendant que nous finalisons votre connexion.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <CheckCircle className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Connexion réussie !</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Vous allez être redirigé vers votre espace personnel...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Échec de l'authentification</h2>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 rounded-lg p-4 mb-6\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-700 dark:text-red-300\">{errorMessage}</p>\r\n </div>\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"btn btn-primary w-full\"\r\n >\r\n Retourner à la connexion\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["errorMessages","AuthCallbackPage","searchParams","useSearchParams","navigate","useNavigate","status","setStatus","useState","errorMessage","setErrorMessage","useEffect","token","refreshToken","error","handleSuccessfulAuth","clientIp","getClientIpAddress","deviceType","detectDeviceType","userResponse","user","onboardingResponse","prefs","userApi","themeConfig","err","handleRetry","jsx","jsxs","Loader2","CheckCircle","XCircle","AlertCircle"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as o } from "react/jsx-runtime";
2
2
  import { useState as m, useEffect as p } from "react";
3
3
  import { useSearchParams as x, useNavigate as b } from "react-router-dom";
4
4
  import { Loader2 as v, CheckCircle as y, XCircle as N, AlertCircle as w } from "lucide-react";
5
- import { d as k, e as S, f as C } from "./index-CwSaRXXg.js";
5
+ import { d as k, e as S, f as C } from "./index-lpIzhufD.js";
6
6
  const I = {
7
7
  auth_failed: "L'authentification a échoué. Veuillez réessayer.",
8
8
  no_email: "Impossible de récupérer votre adresse email depuis le fournisseur.",
@@ -109,4 +109,4 @@ function V() {
109
109
  export {
110
110
  V as AuthCallbackPage
111
111
  };
112
- //# sourceMappingURL=AuthCallbackPage-BCe_bwJM.js.map
112
+ //# sourceMappingURL=AuthCallbackPage-CDUAoX-N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthCallbackPage-BCe_bwJM.js","sources":["../../src/pages/auth/AuthCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { Loader2, CheckCircle, XCircle, AlertCircle } from 'lucide-react';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { getClientIpAddress } from '@/utils/ipDetection';\r\nimport { detectDeviceType } from '@/utils/deviceDetection';\r\n\r\ntype CallbackStatus = 'processing' | 'success' | 'error';\r\n\r\nconst errorMessages: Record<string, string> = {\r\n auth_failed: 'L\\'authentification a échoué. Veuillez réessayer.',\r\n no_email: 'Impossible de récupérer votre adresse email depuis le fournisseur.',\r\n account_disabled: 'Votre compte est désactivé. Contactez l\\'administrateur.',\r\n account_locked: 'Votre compte est verrouillé. Contactez l\\'administrateur.',\r\n internal_error: 'Une erreur interne est survenue. Veuillez réessayer.',\r\n};\r\n\r\nexport function AuthCallbackPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const [status, setStatus] = useState<CallbackStatus>('processing');\r\n const [errorMessage, setErrorMessage] = useState<string>('');\r\n\r\n useEffect(() => {\r\n const token = searchParams.get('token');\r\n const refreshToken = searchParams.get('refreshToken');\r\n const error = searchParams.get('error');\r\n\r\n if (error) {\r\n setStatus('error');\r\n setErrorMessage(errorMessages[error] || 'Une erreur est survenue lors de l\\'authentification.');\r\n return;\r\n }\r\n\r\n if (token && refreshToken) {\r\n handleSuccessfulAuth(token, refreshToken);\r\n } else {\r\n setStatus('error');\r\n setErrorMessage('Paramètres d\\'authentification manquants.');\r\n }\r\n }, [searchParams]);\r\n\r\n const handleSuccessfulAuth = async (token: string, refreshToken: string) => {\r\n try {\r\n localStorage.setItem('token', token);\r\n localStorage.setItem('refreshToken', refreshToken);\r\n\r\n // Update session with client-side IP address (retrieved via external service like ipify.org)\r\n // This is important for OAuth flows where the server can't reliably get the client IP\r\n try {\r\n const clientIp = await getClientIpAddress();\r\n const deviceType = detectDeviceType();\r\n\r\n if (clientIp || deviceType) {\r\n await fetch(`/api/auth/update-session-client-info`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({ clientIp, deviceType }),\r\n });\r\n }\r\n } catch (ipError) {\r\n // Non-critical - continue with the flow even if IP update fails\r\n }\r\n\r\n // Fetch user info\r\n const userResponse = await fetch(`/api/auth/me`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!userResponse.ok) {\r\n throw new Error('Failed to fetch user info');\r\n }\r\n\r\n const user = await userResponse.json();\r\n localStorage.setItem('user', JSON.stringify(user));\r\n\r\n // Check if user needs onboarding\r\n try {\r\n const onboardingResponse = await fetch(`/api/onboarding/status`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (onboardingResponse.ok) {\r\n const onboardingData = await onboardingResponse.json();\r\n if (!onboardingData.hasCompletedOnboarding) {\r\n // Redirect to onboarding wizard\r\n setStatus('success');\r\n setTimeout(() => {\r\n window.location.href = '/auth/onboarding';\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Non-critical - continue with normal flow\r\n }\r\n\r\n // Fetch user preferences\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n const themeConfig = {\r\n mode: prefs.theme || 'dark',\r\n accentColorKey: prefs.accentColorKey || 'indigo',\r\n borderRadius: prefs.borderRadius || {},\r\n itemPaletteKey: prefs.itemPaletteKey || 'neutral',\r\n };\r\n localStorage.setItem('smartstack-theme-config', JSON.stringify(themeConfig));\r\n if (prefs.language) {\r\n localStorage.setItem('i18nextLng', prefs.language);\r\n }\r\n } catch {\r\n // Non-critical - continue with defaults\r\n }\r\n\r\n setStatus('success');\r\n\r\n // Clear stale tenant state so TenantContext uses the user's configured default tenant (Priority 3: isDefault)\r\n localStorage.removeItem('currentTenantId');\r\n localStorage.removeItem('currentTenantSlug');\r\n localStorage.removeItem('isGlobalView');\r\n\r\n // Redirect after showing success\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 1500);\r\n } catch (err) {\r\n console.error('Auth callback error:', err);\r\n setStatus('error');\r\n setErrorMessage('Erreur lors de la finalisation de l\\'authentification.');\r\n }\r\n };\r\n\r\n const handleRetry = () => {\r\n navigate('/login');\r\n };\r\n\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 {status === 'processing' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 mx-auto text-[var(--color-accent-500)] animate-spin mb-4\" />\r\n <h2 className=\"text-xl font-semibold mb-2\">Authentification en cours...</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Veuillez patienter pendant que nous finalisons votre connexion.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <CheckCircle className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Connexion réussie !</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Vous allez être redirigé vers votre espace personnel...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Échec de l'authentification</h2>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 rounded-lg p-4 mb-6\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-700 dark:text-red-300\">{errorMessage}</p>\r\n </div>\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"btn btn-primary w-full\"\r\n >\r\n Retourner à la connexion\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["errorMessages","AuthCallbackPage","searchParams","useSearchParams","navigate","useNavigate","status","setStatus","useState","errorMessage","setErrorMessage","useEffect","token","refreshToken","error","handleSuccessfulAuth","clientIp","getClientIpAddress","deviceType","detectDeviceType","userResponse","user","onboardingResponse","prefs","userApi","themeConfig","err","jsx","jsxs","Loader2","CheckCircle","XCircle","AlertCircle"],"mappings":"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"}
1
+ {"version":3,"file":"AuthCallbackPage-CDUAoX-N.js","sources":["../../src/pages/auth/AuthCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\nimport { Loader2, CheckCircle, XCircle, AlertCircle } from 'lucide-react';\r\nimport { userApi } from '@/services/api/userApi';\r\nimport { getClientIpAddress } from '@/utils/ipDetection';\r\nimport { detectDeviceType } from '@/utils/deviceDetection';\r\n\r\ntype CallbackStatus = 'processing' | 'success' | 'error';\r\n\r\nconst errorMessages: Record<string, string> = {\r\n auth_failed: 'L\\'authentification a échoué. Veuillez réessayer.',\r\n no_email: 'Impossible de récupérer votre adresse email depuis le fournisseur.',\r\n account_disabled: 'Votre compte est désactivé. Contactez l\\'administrateur.',\r\n account_locked: 'Votre compte est verrouillé. Contactez l\\'administrateur.',\r\n internal_error: 'Une erreur interne est survenue. Veuillez réessayer.',\r\n};\r\n\r\nexport function AuthCallbackPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n const [status, setStatus] = useState<CallbackStatus>('processing');\r\n const [errorMessage, setErrorMessage] = useState<string>('');\r\n\r\n useEffect(() => {\r\n const token = searchParams.get('token');\r\n const refreshToken = searchParams.get('refreshToken');\r\n const error = searchParams.get('error');\r\n\r\n if (error) {\r\n setStatus('error');\r\n setErrorMessage(errorMessages[error] || 'Une erreur est survenue lors de l\\'authentification.');\r\n return;\r\n }\r\n\r\n if (token && refreshToken) {\r\n handleSuccessfulAuth(token, refreshToken);\r\n } else {\r\n setStatus('error');\r\n setErrorMessage('Paramètres d\\'authentification manquants.');\r\n }\r\n }, [searchParams]);\r\n\r\n const handleSuccessfulAuth = async (token: string, refreshToken: string) => {\r\n try {\r\n localStorage.setItem('token', token);\r\n localStorage.setItem('refreshToken', refreshToken);\r\n\r\n // Update session with client-side IP address (retrieved via external service like ipify.org)\r\n // This is important for OAuth flows where the server can't reliably get the client IP\r\n try {\r\n const clientIp = await getClientIpAddress();\r\n const deviceType = detectDeviceType();\r\n\r\n if (clientIp || deviceType) {\r\n await fetch(`/api/auth/update-session-client-info`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({ clientIp, deviceType }),\r\n });\r\n }\r\n } catch (ipError) {\r\n // Non-critical - continue with the flow even if IP update fails\r\n }\r\n\r\n // Fetch user info\r\n const userResponse = await fetch(`/api/auth/me`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!userResponse.ok) {\r\n throw new Error('Failed to fetch user info');\r\n }\r\n\r\n const user = await userResponse.json();\r\n localStorage.setItem('user', JSON.stringify(user));\r\n\r\n // Check if user needs onboarding\r\n try {\r\n const onboardingResponse = await fetch(`/api/onboarding/status`, {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (onboardingResponse.ok) {\r\n const onboardingData = await onboardingResponse.json();\r\n if (!onboardingData.hasCompletedOnboarding) {\r\n // Redirect to onboarding wizard\r\n setStatus('success');\r\n setTimeout(() => {\r\n window.location.href = '/auth/onboarding';\r\n }, 1500);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Non-critical - continue with normal flow\r\n }\r\n\r\n // Fetch user preferences\r\n try {\r\n const prefs = await userApi.preferences.get();\r\n const themeConfig = {\r\n mode: prefs.theme || 'dark',\r\n accentColorKey: prefs.accentColorKey || 'indigo',\r\n borderRadius: prefs.borderRadius || {},\r\n itemPaletteKey: prefs.itemPaletteKey || 'neutral',\r\n };\r\n localStorage.setItem('smartstack-theme-config', JSON.stringify(themeConfig));\r\n if (prefs.language) {\r\n localStorage.setItem('i18nextLng', prefs.language);\r\n }\r\n } catch {\r\n // Non-critical - continue with defaults\r\n }\r\n\r\n setStatus('success');\r\n\r\n // Clear stale tenant state so TenantContext uses the user's configured default tenant (Priority 3: isDefault)\r\n localStorage.removeItem('currentTenantId');\r\n localStorage.removeItem('currentTenantSlug');\r\n localStorage.removeItem('isGlobalView');\r\n\r\n // Redirect after showing success\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 1500);\r\n } catch (err) {\r\n console.error('Auth callback error:', err);\r\n setStatus('error');\r\n setErrorMessage('Erreur lors de la finalisation de l\\'authentification.');\r\n }\r\n };\r\n\r\n const handleRetry = () => {\r\n navigate('/login');\r\n };\r\n\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 {status === 'processing' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 mx-auto text-[var(--color-accent-500)] animate-spin mb-4\" />\r\n <h2 className=\"text-xl font-semibold mb-2\">Authentification en cours...</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Veuillez patienter pendant que nous finalisons votre connexion.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <CheckCircle className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Connexion réussie !</h2>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n Vous allez être redirigé vers votre espace personnel...\r\n </p>\r\n </div>\r\n )}\r\n\r\n {status === 'error' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 mx-auto bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mb-4\">\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-2\">Échec de l'authentification</h2>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 rounded-lg p-4 mb-6\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-700 dark:text-red-300\">{errorMessage}</p>\r\n </div>\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"btn btn-primary w-full\"\r\n >\r\n Retourner à la connexion\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["errorMessages","AuthCallbackPage","searchParams","useSearchParams","navigate","useNavigate","status","setStatus","useState","errorMessage","setErrorMessage","useEffect","token","refreshToken","error","handleSuccessfulAuth","clientIp","getClientIpAddress","deviceType","detectDeviceType","userResponse","user","onboardingResponse","prefs","userApi","themeConfig","err","jsx","jsxs","Loader2","CheckCircle","XCircle","AlertCircle"],"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"),s=require("react"),l=require("react-router-dom"),a=require("lucide-react"),x=require("./index-2wUhd9Lu.js");function w(){const[j]=l.useSearchParams(),c=j.get("token"),[r,n]=s.useState("loading"),[u,o]=s.useState(""),[g,N]=s.useState(""),[d,k]=s.useState(""),[h,f]=s.useState(!1),[b,m]=s.useState("");s.useEffect(()=>{if(!c){n("error"),o("Lien de confirmation invalide. Aucun token fourni.");return}(async()=>{try{const t=await x.authApi.confirmEmail(c);n("success"),o(t.message),N(t.email)}catch(t){const p=t,y=t?.code;n(y==="TOKEN_EXPIRED"?"expired":y==="TOKEN_ALREADY_USED"?"already_used":"error"),o(p?.message||"Une erreur est survenue lors de la confirmation.")}})()},[c]);const v=async i=>{if(i.preventDefault(),!!d){f(!0),m("");try{const t=await x.authApi.resendConfirmation(d);m(t.message)}catch(t){m(t?.message||"Erreur lors de l'envoi.")}finally{f(!1)}}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(x.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[r==="loading"&&e.jsxs("div",{className:"text-center",children:[e.jsx(a.Loader2,{className:"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4"}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Confirmation en cours..."}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Veuillez patienter pendant que nous vérifions votre email."})]}),r==="success"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(a.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Email confirmé !"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:u}),g&&e.jsxs("p",{className:"text-sm text-gray-500 dark:text-gray-400 mb-6",children:["Compte : ",e.jsx("strong",{children:g})]}),e.jsx(l.Link,{to:"/login",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all",children:"Se connecter"})]}),(r==="error"||r==="expired"||r==="already_used")&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${r==="already_used"?"bg-amber-100 dark:bg-amber-900/30":"bg-red-100 dark:bg-red-900/30"}`,children:r==="already_used"?e.jsx(a.CheckCircle2,{className:"w-10 h-10 text-amber-600 dark:text-amber-400"}):e.jsx(a.XCircle,{className:"w-10 h-10 text-red-600 dark:text-red-400"})}),e.jsxs("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:[r==="expired"&&"Lien expiré",r==="already_used"&&"Lien déjà utilisé",r==="error"&&"Erreur de confirmation"]}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:u}),(r==="expired"||r==="error")&&e.jsxs("div",{className:"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6",children:[e.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 mb-4",children:"Demander un nouveau lien de confirmation :"}),e.jsxs("form",{onSubmit:v,className:"space-y-3",children:[e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(a.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{type:"email",value:d,onChange:i=>k(i.target.value),placeholder:"Votre email",className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",required:!0})]}),e.jsxs("button",{type:"submit",disabled:h,className:"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors",children:[h?e.jsx(a.Loader2,{className:"w-5 h-5 animate-spin"}):e.jsx(a.RefreshCw,{className:"w-5 h-5"}),"Renvoyer le lien"]})]}),b&&e.jsx("p",{className:"mt-3 text-sm text-green-600 dark:text-green-400",children:b})]}),r==="already_used"&&e.jsx(l.Link,{to:"/login",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all",children:"Se connecter"})]})]}),e.jsx("p",{className:"text-center text-sm text-gray-500 dark:text-gray-400 mt-6",children:e.jsx(l.Link,{to:"/login",className:"hover:underline",children:"Retour à la connexion"})})]})})}exports.ConfirmEmailPage=w;
2
- //# sourceMappingURL=ConfirmEmailPage-BUfGSqxF.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),s=require("react"),l=require("react-router-dom"),a=require("lucide-react"),x=require("./index-IgLVXPg8.js");function w(){const[j]=l.useSearchParams(),c=j.get("token"),[r,n]=s.useState("loading"),[u,o]=s.useState(""),[g,N]=s.useState(""),[d,k]=s.useState(""),[h,f]=s.useState(!1),[b,m]=s.useState("");s.useEffect(()=>{if(!c){n("error"),o("Lien de confirmation invalide. Aucun token fourni.");return}(async()=>{try{const t=await x.authApi.confirmEmail(c);n("success"),o(t.message),N(t.email)}catch(t){const p=t,y=t?.code;n(y==="TOKEN_EXPIRED"?"expired":y==="TOKEN_ALREADY_USED"?"already_used":"error"),o(p?.message||"Une erreur est survenue lors de la confirmation.")}})()},[c]);const v=async i=>{if(i.preventDefault(),!!d){f(!0),m("");try{const t=await x.authApi.resendConfirmation(d);m(t.message)}catch(t){m(t?.message||"Erreur lors de l'envoi.")}finally{f(!1)}}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(x.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[r==="loading"&&e.jsxs("div",{className:"text-center",children:[e.jsx(a.Loader2,{className:"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4"}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Confirmation en cours..."}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Veuillez patienter pendant que nous vérifions votre email."})]}),r==="success"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(a.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Email confirmé !"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:u}),g&&e.jsxs("p",{className:"text-sm text-gray-500 dark:text-gray-400 mb-6",children:["Compte : ",e.jsx("strong",{children:g})]}),e.jsx(l.Link,{to:"/login",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all",children:"Se connecter"})]}),(r==="error"||r==="expired"||r==="already_used")&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${r==="already_used"?"bg-amber-100 dark:bg-amber-900/30":"bg-red-100 dark:bg-red-900/30"}`,children:r==="already_used"?e.jsx(a.CheckCircle2,{className:"w-10 h-10 text-amber-600 dark:text-amber-400"}):e.jsx(a.XCircle,{className:"w-10 h-10 text-red-600 dark:text-red-400"})}),e.jsxs("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:[r==="expired"&&"Lien expiré",r==="already_used"&&"Lien déjà utilisé",r==="error"&&"Erreur de confirmation"]}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:u}),(r==="expired"||r==="error")&&e.jsxs("div",{className:"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6",children:[e.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 mb-4",children:"Demander un nouveau lien de confirmation :"}),e.jsxs("form",{onSubmit:v,className:"space-y-3",children:[e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(a.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{type:"email",value:d,onChange:i=>k(i.target.value),placeholder:"Votre email",className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",required:!0})]}),e.jsxs("button",{type:"submit",disabled:h,className:"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors",children:[h?e.jsx(a.Loader2,{className:"w-5 h-5 animate-spin"}):e.jsx(a.RefreshCw,{className:"w-5 h-5"}),"Renvoyer le lien"]})]}),b&&e.jsx("p",{className:"mt-3 text-sm text-green-600 dark:text-green-400",children:b})]}),r==="already_used"&&e.jsx(l.Link,{to:"/login",className:"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all",children:"Se connecter"})]})]}),e.jsx("p",{className:"text-center text-sm text-gray-500 dark:text-gray-400 mt-6",children:e.jsx(l.Link,{to:"/login",className:"hover:underline",children:"Retour à la connexion"})})]})})}exports.ConfirmEmailPage=w;
2
+ //# sourceMappingURL=ConfirmEmailPage-BqsILAYH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmEmailPage-BUfGSqxF.js","sources":["../../src/pages/auth/ConfirmEmailPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, Link } from 'react-router-dom';\r\nimport { CheckCircle2, XCircle, Loader2, Mail, RefreshCw } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'loading' | 'success' | 'error' | 'expired' | 'already_used';\r\n\r\nexport function ConfirmEmailPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [status, setStatus] = useState<Status>('loading');\r\n const [message, setMessage] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [resendEmail, setResendEmail] = useState('');\r\n const [isResending, setIsResending] = useState(false);\r\n const [resendMessage, setResendMessage] = useState('');\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('error');\r\n setMessage('Lien de confirmation invalide. Aucun token fourni.');\r\n return;\r\n }\r\n\r\n const confirmEmail = async () => {\r\n try {\r\n const response = await authApi.confirmEmail(token);\r\n setStatus('success');\r\n setMessage(response.message);\r\n setEmail(response.email);\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED') {\r\n setStatus('expired');\r\n } else if (code === 'TOKEN_ALREADY_USED') {\r\n setStatus('already_used');\r\n } else {\r\n setStatus('error');\r\n }\r\n setMessage(error?.message || 'Une erreur est survenue lors de la confirmation.');\r\n }\r\n };\r\n\r\n confirmEmail();\r\n }, [token]);\r\n\r\n const handleResendConfirmation = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!resendEmail) return;\r\n\r\n setIsResending(true);\r\n setResendMessage('');\r\n\r\n try {\r\n const response = await authApi.resendConfirmation(resendEmail);\r\n setResendMessage(response.message);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setResendMessage(error?.message || 'Erreur lors de l\\'envoi.');\r\n } finally {\r\n setIsResending(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Loading State */}\r\n {status === 'loading' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4\" />\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Confirmation en cours...\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Veuillez patienter pendant que nous vérifions votre email.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email confirmé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n {email && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-6\">\r\n Compte : <strong>{email}</strong>\r\n </p>\r\n )}\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error / Expired / Already Used States */}\r\n {(status === 'error' || status === 'expired' || status === 'already_used') && (\r\n <div className=\"text-center\">\r\n <div className={`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${\r\n status === 'already_used'\r\n ? 'bg-amber-100 dark:bg-amber-900/30'\r\n : 'bg-red-100 dark:bg-red-900/30'\r\n }`}>\r\n {status === 'already_used' ? (\r\n <CheckCircle2 className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />\r\n ) : (\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n )}\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {status === 'expired' && 'Lien expiré'}\r\n {status === 'already_used' && 'Lien déjà utilisé'}\r\n {status === 'error' && 'Erreur de confirmation'}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n\r\n {/* Resend Form */}\r\n {(status === 'expired' || status === 'error') && (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-4\">\r\n Demander un nouveau lien de confirmation :\r\n </p>\r\n <form onSubmit={handleResendConfirmation} className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n type=\"email\"\r\n value={resendEmail}\r\n onChange={(e) => setResendEmail(e.target.value)}\r\n placeholder=\"Votre email\"\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n required\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isResending}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors\"\r\n >\r\n {isResending ? (\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n ) : (\r\n <RefreshCw className=\"w-5 h-5\" />\r\n )}\r\n Renvoyer le lien\r\n </button>\r\n </form>\r\n {resendMessage && (\r\n <p className=\"mt-3 text-sm text-green-600 dark:text-green-400\">\r\n {resendMessage}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {status === 'already_used' && (\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\r\n <Link to=\"/login\" className=\"hover:underline\">\r\n Retour à la connexion\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ConfirmEmailPage","searchParams","useSearchParams","token","status","setStatus","useState","message","setMessage","email","setEmail","resendEmail","setResendEmail","isResending","setIsResending","resendMessage","setResendMessage","useEffect","response","authApi","err","error","code","handleResendConfirmation","e","jsxs","jsx","ThemeSwitcher","Loader2","CheckCircle2","Link","XCircle","Mail","RefreshCw"],"mappings":"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"}
1
+ {"version":3,"file":"ConfirmEmailPage-BqsILAYH.js","sources":["../../src/pages/auth/ConfirmEmailPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, Link } from 'react-router-dom';\r\nimport { CheckCircle2, XCircle, Loader2, Mail, RefreshCw } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'loading' | 'success' | 'error' | 'expired' | 'already_used';\r\n\r\nexport function ConfirmEmailPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [status, setStatus] = useState<Status>('loading');\r\n const [message, setMessage] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [resendEmail, setResendEmail] = useState('');\r\n const [isResending, setIsResending] = useState(false);\r\n const [resendMessage, setResendMessage] = useState('');\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('error');\r\n setMessage('Lien de confirmation invalide. Aucun token fourni.');\r\n return;\r\n }\r\n\r\n const confirmEmail = async () => {\r\n try {\r\n const response = await authApi.confirmEmail(token);\r\n setStatus('success');\r\n setMessage(response.message);\r\n setEmail(response.email);\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED') {\r\n setStatus('expired');\r\n } else if (code === 'TOKEN_ALREADY_USED') {\r\n setStatus('already_used');\r\n } else {\r\n setStatus('error');\r\n }\r\n setMessage(error?.message || 'Une erreur est survenue lors de la confirmation.');\r\n }\r\n };\r\n\r\n confirmEmail();\r\n }, [token]);\r\n\r\n const handleResendConfirmation = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!resendEmail) return;\r\n\r\n setIsResending(true);\r\n setResendMessage('');\r\n\r\n try {\r\n const response = await authApi.resendConfirmation(resendEmail);\r\n setResendMessage(response.message);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setResendMessage(error?.message || 'Erreur lors de l\\'envoi.');\r\n } finally {\r\n setIsResending(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Loading State */}\r\n {status === 'loading' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4\" />\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Confirmation en cours...\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Veuillez patienter pendant que nous vérifions votre email.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email confirmé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n {email && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-6\">\r\n Compte : <strong>{email}</strong>\r\n </p>\r\n )}\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error / Expired / Already Used States */}\r\n {(status === 'error' || status === 'expired' || status === 'already_used') && (\r\n <div className=\"text-center\">\r\n <div className={`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${\r\n status === 'already_used'\r\n ? 'bg-amber-100 dark:bg-amber-900/30'\r\n : 'bg-red-100 dark:bg-red-900/30'\r\n }`}>\r\n {status === 'already_used' ? (\r\n <CheckCircle2 className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />\r\n ) : (\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n )}\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {status === 'expired' && 'Lien expiré'}\r\n {status === 'already_used' && 'Lien déjà utilisé'}\r\n {status === 'error' && 'Erreur de confirmation'}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n\r\n {/* Resend Form */}\r\n {(status === 'expired' || status === 'error') && (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-4\">\r\n Demander un nouveau lien de confirmation :\r\n </p>\r\n <form onSubmit={handleResendConfirmation} className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n type=\"email\"\r\n value={resendEmail}\r\n onChange={(e) => setResendEmail(e.target.value)}\r\n placeholder=\"Votre email\"\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n required\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isResending}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors\"\r\n >\r\n {isResending ? (\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n ) : (\r\n <RefreshCw className=\"w-5 h-5\" />\r\n )}\r\n Renvoyer le lien\r\n </button>\r\n </form>\r\n {resendMessage && (\r\n <p className=\"mt-3 text-sm text-green-600 dark:text-green-400\">\r\n {resendMessage}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {status === 'already_used' && (\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\r\n <Link to=\"/login\" className=\"hover:underline\">\r\n Retour à la connexion\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ConfirmEmailPage","searchParams","useSearchParams","token","status","setStatus","useState","message","setMessage","email","setEmail","resendEmail","setResendEmail","isResending","setIsResending","resendMessage","setResendMessage","useEffect","response","authApi","err","error","code","handleResendConfirmation","e","jsxs","jsx","ThemeSwitcher","Loader2","CheckCircle2","Link","XCircle","Mail","RefreshCw"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
2
  import { useState as s, useEffect as C } from "react";
3
3
  import { useSearchParams as R, Link as m } from "react-router-dom";
4
4
  import { Loader2 as y, CheckCircle2 as N, XCircle as j, Mail as _, RefreshCw as S } from "lucide-react";
5
- import { T as L, c as v } from "./index-CwSaRXXg.js";
5
+ import { T as L, c as v } from "./index-lpIzhufD.js";
6
6
  function I() {
7
7
  const [k] = R(), l = k.get("token"), [r, n] = s("loading"), [u, o] = s(""), [g, w] = s(""), [d, E] = s(""), [x, h] = s(!1), [f, c] = s("");
8
8
  return C(() => {
@@ -112,4 +112,4 @@ function I() {
112
112
  export {
113
113
  I as ConfirmEmailPage
114
114
  };
115
- //# sourceMappingURL=ConfirmEmailPage-Buj4x-rx.js.map
115
+ //# sourceMappingURL=ConfirmEmailPage-INeHCuMB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmEmailPage-Buj4x-rx.js","sources":["../../src/pages/auth/ConfirmEmailPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, Link } from 'react-router-dom';\r\nimport { CheckCircle2, XCircle, Loader2, Mail, RefreshCw } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'loading' | 'success' | 'error' | 'expired' | 'already_used';\r\n\r\nexport function ConfirmEmailPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [status, setStatus] = useState<Status>('loading');\r\n const [message, setMessage] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [resendEmail, setResendEmail] = useState('');\r\n const [isResending, setIsResending] = useState(false);\r\n const [resendMessage, setResendMessage] = useState('');\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('error');\r\n setMessage('Lien de confirmation invalide. Aucun token fourni.');\r\n return;\r\n }\r\n\r\n const confirmEmail = async () => {\r\n try {\r\n const response = await authApi.confirmEmail(token);\r\n setStatus('success');\r\n setMessage(response.message);\r\n setEmail(response.email);\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED') {\r\n setStatus('expired');\r\n } else if (code === 'TOKEN_ALREADY_USED') {\r\n setStatus('already_used');\r\n } else {\r\n setStatus('error');\r\n }\r\n setMessage(error?.message || 'Une erreur est survenue lors de la confirmation.');\r\n }\r\n };\r\n\r\n confirmEmail();\r\n }, [token]);\r\n\r\n const handleResendConfirmation = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!resendEmail) return;\r\n\r\n setIsResending(true);\r\n setResendMessage('');\r\n\r\n try {\r\n const response = await authApi.resendConfirmation(resendEmail);\r\n setResendMessage(response.message);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setResendMessage(error?.message || 'Erreur lors de l\\'envoi.');\r\n } finally {\r\n setIsResending(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Loading State */}\r\n {status === 'loading' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4\" />\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Confirmation en cours...\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Veuillez patienter pendant que nous vérifions votre email.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email confirmé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n {email && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-6\">\r\n Compte : <strong>{email}</strong>\r\n </p>\r\n )}\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error / Expired / Already Used States */}\r\n {(status === 'error' || status === 'expired' || status === 'already_used') && (\r\n <div className=\"text-center\">\r\n <div className={`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${\r\n status === 'already_used'\r\n ? 'bg-amber-100 dark:bg-amber-900/30'\r\n : 'bg-red-100 dark:bg-red-900/30'\r\n }`}>\r\n {status === 'already_used' ? (\r\n <CheckCircle2 className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />\r\n ) : (\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n )}\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {status === 'expired' && 'Lien expiré'}\r\n {status === 'already_used' && 'Lien déjà utilisé'}\r\n {status === 'error' && 'Erreur de confirmation'}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n\r\n {/* Resend Form */}\r\n {(status === 'expired' || status === 'error') && (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-4\">\r\n Demander un nouveau lien de confirmation :\r\n </p>\r\n <form onSubmit={handleResendConfirmation} className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n type=\"email\"\r\n value={resendEmail}\r\n onChange={(e) => setResendEmail(e.target.value)}\r\n placeholder=\"Votre email\"\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n required\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isResending}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors\"\r\n >\r\n {isResending ? (\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n ) : (\r\n <RefreshCw className=\"w-5 h-5\" />\r\n )}\r\n Renvoyer le lien\r\n </button>\r\n </form>\r\n {resendMessage && (\r\n <p className=\"mt-3 text-sm text-green-600 dark:text-green-400\">\r\n {resendMessage}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {status === 'already_used' && (\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\r\n <Link to=\"/login\" className=\"hover:underline\">\r\n Retour à la connexion\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ConfirmEmailPage","searchParams","useSearchParams","token","status","setStatus","useState","message","setMessage","email","setEmail","resendEmail","setResendEmail","isResending","setIsResending","resendMessage","setResendMessage","useEffect","response","authApi","err","error","code","jsxs","jsx","ThemeSwitcher","Loader2","CheckCircle2","Link","XCircle","e","Mail","RefreshCw"],"mappings":"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"}
1
+ {"version":3,"file":"ConfirmEmailPage-INeHCuMB.js","sources":["../../src/pages/auth/ConfirmEmailPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useSearchParams, Link } from 'react-router-dom';\r\nimport { CheckCircle2, XCircle, Loader2, Mail, RefreshCw } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\ntype Status = 'loading' | 'success' | 'error' | 'expired' | 'already_used';\r\n\r\nexport function ConfirmEmailPage(): ReactElement {\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [status, setStatus] = useState<Status>('loading');\r\n const [message, setMessage] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [resendEmail, setResendEmail] = useState('');\r\n const [isResending, setIsResending] = useState(false);\r\n const [resendMessage, setResendMessage] = useState('');\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setStatus('error');\r\n setMessage('Lien de confirmation invalide. Aucun token fourni.');\r\n return;\r\n }\r\n\r\n const confirmEmail = async () => {\r\n try {\r\n const response = await authApi.confirmEmail(token);\r\n setStatus('success');\r\n setMessage(response.message);\r\n setEmail(response.email);\r\n } catch (err) {\r\n const error = err as { message?: string; code?: string };\r\n const code = (err as { code?: string })?.code;\r\n\r\n if (code === 'TOKEN_EXPIRED') {\r\n setStatus('expired');\r\n } else if (code === 'TOKEN_ALREADY_USED') {\r\n setStatus('already_used');\r\n } else {\r\n setStatus('error');\r\n }\r\n setMessage(error?.message || 'Une erreur est survenue lors de la confirmation.');\r\n }\r\n };\r\n\r\n confirmEmail();\r\n }, [token]);\r\n\r\n const handleResendConfirmation = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!resendEmail) return;\r\n\r\n setIsResending(true);\r\n setResendMessage('');\r\n\r\n try {\r\n const response = await authApi.resendConfirmation(resendEmail);\r\n setResendMessage(response.message);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setResendMessage(error?.message || 'Erreur lors de l\\'envoi.');\r\n } finally {\r\n setIsResending(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Loading State */}\r\n {status === 'loading' && (\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-16 h-16 text-blue-500 animate-spin mx-auto mb-4\" />\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Confirmation en cours...\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Veuillez patienter pendant que nous vérifions votre email.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Success State */}\r\n {status === 'success' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email confirmé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n {email && (\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-6\">\r\n Compte : <strong>{email}</strong>\r\n </p>\r\n )}\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n </div>\r\n )}\r\n\r\n {/* Error / Expired / Already Used States */}\r\n {(status === 'error' || status === 'expired' || status === 'already_used') && (\r\n <div className=\"text-center\">\r\n <div className={`w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4 ${\r\n status === 'already_used'\r\n ? 'bg-amber-100 dark:bg-amber-900/30'\r\n : 'bg-red-100 dark:bg-red-900/30'\r\n }`}>\r\n {status === 'already_used' ? (\r\n <CheckCircle2 className=\"w-10 h-10 text-amber-600 dark:text-amber-400\" />\r\n ) : (\r\n <XCircle className=\"w-10 h-10 text-red-600 dark:text-red-400\" />\r\n )}\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n {status === 'expired' && 'Lien expiré'}\r\n {status === 'already_used' && 'Lien déjà utilisé'}\r\n {status === 'error' && 'Erreur de confirmation'}\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n {message}\r\n </p>\r\n\r\n {/* Resend Form */}\r\n {(status === 'expired' || status === 'error') && (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 pt-6 mt-6\">\r\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-4\">\r\n Demander un nouveau lien de confirmation :\r\n </p>\r\n <form onSubmit={handleResendConfirmation} className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n type=\"email\"\r\n value={resendEmail}\r\n onChange={(e) => setResendEmail(e.target.value)}\r\n placeholder=\"Votre email\"\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n required\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isResending}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors\"\r\n >\r\n {isResending ? (\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n ) : (\r\n <RefreshCw className=\"w-5 h-5\" />\r\n )}\r\n Renvoyer le lien\r\n </button>\r\n </form>\r\n {resendMessage && (\r\n <p className=\"mt-3 text-sm text-green-600 dark:text-green-400\">\r\n {resendMessage}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {status === 'already_used' && (\r\n <Link\r\n to=\"/login\"\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 transition-all\"\r\n >\r\n Se connecter\r\n </Link>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400 mt-6\">\r\n <Link to=\"/login\" className=\"hover:underline\">\r\n Retour à la connexion\r\n </Link>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ConfirmEmailPage","searchParams","useSearchParams","token","status","setStatus","useState","message","setMessage","email","setEmail","resendEmail","setResendEmail","isResending","setIsResending","resendMessage","setResendMessage","useEffect","response","authApi","err","error","code","jsxs","jsx","ThemeSwitcher","Loader2","CheckCircle2","Link","XCircle","e","Mail","RefreshCw"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("react"),ue=require("react-router-dom"),$e=require("react-i18next"),d=require("./index-2wUhd9Lu.js"),c=require("lucide-react"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),Be=10*1024*1024,xe=[".jpg",".jpeg",".png",".gif",".pdf",".doc",".docx",".xls",".xlsx",".txt",".log",".zip"];function qe({draftId:s,effectiveTenant:g}){const[P,z]=a.useState(null),[v,J]=a.useState(""),[R,Z]=a.useState(""),[y,ee]=a.useState("Medium"),[oe,L]=a.useState(!1),[ie,w]=a.useState(null),[j,k]=a.useState(null),[N,M]=a.useState(!0),[S,m]=a.useState(!0),[C,O]=a.useState(!0),[h,te]=a.useState(null),[T,se]=a.useState(null),[A,B]=a.useState([]),[U,H]=a.useState(!1),u=a.useRef(null),[G,F]=a.useState(!1),[re,D]=a.useState(!1),ae=a.useRef(null),V=a.useRef(!1),ne=a.useRef(!1),I=a.useRef([]),$=a.useCallback(r=>({url:r.url,timestamp:r.timestamp.toISOString(),recentErrors:r.recentErrors.map(o=>({...o,timestamp:o.timestamp.toISOString()})),browserInfo:r.browserInfo}),[]),b=a.useCallback(r=>({url:r.url,timestamp:new Date(r.timestamp),recentErrors:r.recentErrors.map(o=>({...o,timestamp:new Date(o.timestamp)})),browserInfo:r.browserInfo}),[]),Q=a.useCallback(r=>new Promise((o,x)=>{const i=new FileReader;i.onload=()=>{o({name:r.name,type:r.type,size:r.size,data:i.result})},i.onerror=x,i.readAsDataURL(r)}),[]),K=a.useCallback(r=>{const o=r.data.split(","),x=/:(.*?);/.exec(o[0])?.[1]||r.type,i=atob(o[1]);let p=i.length;const E=new Uint8Array(p);for(;p--;)E[p]=i.charCodeAt(p);return new window.File([E],r.name,{type:x})},[]),le=a.useCallback(async r=>Promise.all(r.map(Q)),[Q]),X=a.useCallback(()=>{if(!s)return!1;const r=d.ticketDraftService.updateDraft(s,{type:P,title:v,description:R,priority:y,includeScreenshot:N,includeErrorLogs:S,screenshot:h||void 0,errorContext:j?$(j):void 0,attachments:I.current.length>0?I.current:void 0,tenantId:g?.id,tenantSlug:g?.slug,tenantName:g?.name});return r.success?(ne.current=!1,F(!0),D(!1),setTimeout(()=>F(!1),2e3)):(D(!0),console.error("[CreateSupportTicketPage] Failed to save draft!")),r.success},[s,P,v,R,y,N,S,h,j,$,g]),q=a.useCallback(r=>{const o=[],x=[];r.forEach(i=>{const p="."+i.name.split(".").pop()?.toLowerCase();if(!xe.includes(p)){x.push(`${i.name}: file type not allowed`);return}if(i.size>Be){x.push(`${i.name}: file too large`);return}o.push(i)}),x.length>0?w(x.join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("react"),ue=require("react-router-dom"),$e=require("react-i18next"),d=require("./index-IgLVXPg8.js"),c=require("lucide-react"),Ke=require("./ScreenshotAnnotator-CoRDpHXW.js"),Be=10*1024*1024,xe=[".jpg",".jpeg",".png",".gif",".pdf",".doc",".docx",".xls",".xlsx",".txt",".log",".zip"];function qe({draftId:s,effectiveTenant:g}){const[P,z]=a.useState(null),[v,J]=a.useState(""),[R,Z]=a.useState(""),[y,ee]=a.useState("Medium"),[oe,L]=a.useState(!1),[ie,w]=a.useState(null),[j,k]=a.useState(null),[N,M]=a.useState(!0),[S,m]=a.useState(!0),[C,O]=a.useState(!0),[h,te]=a.useState(null),[T,se]=a.useState(null),[A,B]=a.useState([]),[U,H]=a.useState(!1),u=a.useRef(null),[G,F]=a.useState(!1),[re,D]=a.useState(!1),ae=a.useRef(null),V=a.useRef(!1),ne=a.useRef(!1),I=a.useRef([]),$=a.useCallback(r=>({url:r.url,timestamp:r.timestamp.toISOString(),recentErrors:r.recentErrors.map(o=>({...o,timestamp:o.timestamp.toISOString()})),browserInfo:r.browserInfo}),[]),b=a.useCallback(r=>({url:r.url,timestamp:new Date(r.timestamp),recentErrors:r.recentErrors.map(o=>({...o,timestamp:new Date(o.timestamp)})),browserInfo:r.browserInfo}),[]),Q=a.useCallback(r=>new Promise((o,x)=>{const i=new FileReader;i.onload=()=>{o({name:r.name,type:r.type,size:r.size,data:i.result})},i.onerror=x,i.readAsDataURL(r)}),[]),K=a.useCallback(r=>{const o=r.data.split(","),x=/:(.*?);/.exec(o[0])?.[1]||r.type,i=atob(o[1]);let p=i.length;const E=new Uint8Array(p);for(;p--;)E[p]=i.charCodeAt(p);return new window.File([E],r.name,{type:x})},[]),le=a.useCallback(async r=>Promise.all(r.map(Q)),[Q]),X=a.useCallback(()=>{if(!s)return!1;const r=d.ticketDraftService.updateDraft(s,{type:P,title:v,description:R,priority:y,includeScreenshot:N,includeErrorLogs:S,screenshot:h||void 0,errorContext:j?$(j):void 0,attachments:I.current.length>0?I.current:void 0,tenantId:g?.id,tenantSlug:g?.slug,tenantName:g?.name});return r.success?(ne.current=!1,F(!0),D(!1),setTimeout(()=>F(!1),2e3)):(D(!0),console.error("[CreateSupportTicketPage] Failed to save draft!")),r.success},[s,P,v,R,y,N,S,h,j,$,g]),q=a.useCallback(r=>{const o=[],x=[];r.forEach(i=>{const p="."+i.name.split(".").pop()?.toLowerCase();if(!xe.includes(p)){x.push(`${i.name}: file type not allowed`);return}if(i.size>Be){x.push(`${i.name}: file too large`);return}o.push(i)}),x.length>0?w(x.join(`
2
2
  `)):w(null),o.length>0&&B(i=>[...i,...o])},[]),de=a.useCallback(r=>{B(o=>o.filter((x,i)=>i!==r))},[]),_=a.useCallback(()=>{const r=d.browserInfoService.captureBrowserInfo();return{sourceUrl:window.location.href,browser:{name:r.browser,version:r.browserVersion,language:r.language},os:{name:r.os,version:r.osVersion},device:{type:r.deviceType,screenResolution:r.screenResolution},recentErrors:S?j?.recentErrors.slice(0,5).map(o=>({message:o.message,stack:o.stack,component:o.component,timestamp:o.timestamp.toISOString()}))??[]:[]}},[j,S]),f=a.useCallback(()=>{s&&d.ticketDraftService.deleteDraft(s),d.errorContextService.clearContext()},[s]),W=a.useCallback(async()=>{if(!P||!v.trim()||!R.trim())return null;try{L(!0),w(null);const r=_(),o=g?{"X-Tenant-Slug":g.slug}:{},x=await d.api.post("/api/support/my-tickets",{title:v.trim(),description:R.trim(),type:P,priority:y,clientContext:r},{headers:o});if(H(!0),N&&h)try{const p=await(await fetch(h)).blob(),E=new globalThis.File([p],"screenshot.png",{type:"image/png"}),Y=new FormData;Y.append("file",E),await d.api.post(`/api/support/my-tickets/${x.id}/attachments`,Y,{headers:{"Content-Type":"multipart/form-data",...o}})}catch(i){console.error("Failed to upload screenshot:",i)}for(const i of A)try{const p=new FormData;p.append("file",i),await d.api.post(`/api/support/my-tickets/${x.id}/attachments`,p,{headers:{"Content-Type":"multipart/form-data",...o}})}catch(p){console.error("Failed to upload file:",i.name,p)}return f(),x}catch{return w("An error occurred"),null}finally{L(!1),H(!1)}},[P,v,R,y,_,g,N,h,A,f]);return{selectedType:P,setSelectedType:z,title:v,setTitle:J,description:R,setDescription:Z,priority:y,setPriority:ee,submitting:oe,error:ie,setError:w,errorContext:j,setErrorContext:k,includeScreenshot:N,setIncludeScreenshot:M,includeErrorLogs:S,setIncludeErrorLogs:m,includeBrowserInfo:C,setIncludeBrowserInfo:O,annotatedScreenshot:h,setAnnotatedScreenshot:te,browserInfo:T,setBrowserInfo:se,pendingFiles:A,setPendingFiles:B,uploadingFiles:U,fileInputRef:u,showDraftSaved:G,setShowDraftSaved:F,saveFailed:re,setSaveFailed:D,autoSaveTimerRef:ae,isInitialLoadCompleteRef:V,hasUnsavedChangesRef:ne,draftAttachmentsRef:I,errorContextToDraft:$,draftToErrorContext:b,fileToAttachment:Q,attachmentToFile:K,filesToAttachments:le,saveDraftNow:X,processFiles:q,removeFile:de,buildClientContext:_,cleanupAfterSubmit:f,submitTicket:W}}const me=[{value:"Bug",labelKey:"types.Bug",descriptionKey:"typeDescriptions.Bug",icon:c.Bug},{value:"FeatureRequest",labelKey:"types.FeatureRequest",descriptionKey:"typeDescriptions.FeatureRequest",icon:c.Lightbulb},{value:"Suggestion",labelKey:"types.Suggestion",descriptionKey:"typeDescriptions.Suggestion",icon:c.Sparkles},{value:"ApplicationRequest",labelKey:"types.ApplicationRequest",descriptionKey:"typeDescriptions.ApplicationRequest",icon:c.AppWindow},{value:"Support",labelKey:"types.Support",descriptionKey:"typeDescriptions.Support",icon:c.MessageSquare},{value:"Question",labelKey:"types.Question",descriptionKey:"typeDescriptions.Question",icon:c.HelpCircle}],ze=[{value:"Low",labelKey:"priorities.Low",descriptionKey:"priorityDescriptions.Low"},{value:"Medium",labelKey:"priorities.Medium",descriptionKey:"priorityDescriptions.Medium"},{value:"High",labelKey:"priorities.High",descriptionKey:"priorityDescriptions.High"},{value:"Critical",labelKey:"priorities.Critical",descriptionKey:"priorityDescriptions.Critical"}];function Me(){const{t:s}=$e.useTranslation(["support","common"]),g=ue.useNavigate(),[P]=ue.useSearchParams(),{currentTenant:z,userTenants:v,isGlobalView:J}=d.useTenant(),{isGlpi:R,glpiBaseUrl:Z}=d.useTicketingProvider(),[y,ee]=a.useState(null),[oe,L]=a.useState(!1),[ie,w]=a.useState(!1),j=z??y;a.useEffect(()=>{!z&&J&&v.length>0&&L(!0)},[z,J,v.length]);const[k,N]=a.useState(1),[M,S]=a.useState(!1),m=P.get("draft"),{selectedType:C,setSelectedType:O,title:h,setTitle:te,description:T,setDescription:se,priority:A,setPriority:B,submitting:U,error:H,errorContext:u,setErrorContext:G,includeScreenshot:F,setIncludeScreenshot:re,includeErrorLogs:D,setIncludeErrorLogs:ae,includeBrowserInfo:V,setIncludeBrowserInfo:ne,annotatedScreenshot:I,setAnnotatedScreenshot:$,browserInfo:b,setBrowserInfo:Q,pendingFiles:K,setPendingFiles:le,uploadingFiles:X,fileInputRef:q,showDraftSaved:de,saveFailed:_,autoSaveTimerRef:f,isInitialLoadCompleteRef:W,hasUnsavedChangesRef:r,draftAttachmentsRef:o,draftToErrorContext:x,attachmentToFile:i,filesToAttachments:p,saveDraftNow:E,processFiles:Y,removeFile:pe,submitTicket:he}=qe({draftId:m,effectiveTenant:j}),ge=t=>{if(!t)return{hasType:!1,hasScreenshot:!1,hasErrorContext:!1};if(te(t.title),se(t.description),B(t.priority),re(t.includeScreenshot),ae(t.includeErrorLogs),t.type&&(O(t.type),N(2)),t.screenshot&&$(t.screenshot),t.errorContext&&G(x(t.errorContext)),t.attachments?.length){const n=t.attachments.map(i);le(n),o.current=t.attachments}if(t.tenantId&&t.tenantSlug){const n=v.find(l=>l.id===t.tenantId);n&&ee(n)}return{hasType:!!t.type,hasScreenshot:!!t.screenshot,hasErrorContext:!!t.errorContext}},fe=t=>{const n=d.errorContextService.loadContext();n&&(t.hasErrorContext||G(n),!t.hasScreenshot&&n.screenshot&&$(n.screenshot),n.recentErrors.length>0&&!t.hasType&&(O("Bug"),B("High")))};a.useEffect(()=>{const t=m?ge(d.ticketDraftService.getDraft(m)):{hasType:!1,hasScreenshot:!1,hasErrorContext:!1};fe(t);const n=d.browserInfoService.captureBrowserInfo();return Q(n),requestAnimationFrame(()=>{requestAnimationFrame(()=>{W.current=!0})}),()=>{d.errorContextService.clearContext()}},[m,x,i]),a.useEffect(()=>{if(K.length===0){o.current=[];return}p(K).then(t=>{o.current=t}).catch(t=>{console.error("[CreateSupportTicketPage] Failed to convert files to attachments:",t)})},[K,p]),a.useEffect(()=>{if(!(!W.current||!m))return r.current=!0,f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{E()},1e3),()=>{f.current&&clearTimeout(f.current)}},[C,h,T,A,F,D,V,I,u,K,m,E]),a.useEffect(()=>{const t=()=>{r.current&&m&&E()};return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t),r.current&&m&&W.current&&d.ticketDraftService.updateDraft(m,{type:C,title:h,description:T,priority:A,includeScreenshot:F,includeErrorLogs:D,screenshot:I||void 0,errorContext:u?{url:u.url,timestamp:u.timestamp.toISOString(),recentErrors:u.recentErrors.map(n=>({...n,timestamp:n.timestamp.toISOString()})),browserInfo:u.browserInfo}:void 0,attachments:o.current.length>0?o.current:void 0})}},[m,C,h,T,A,F,D,I,u,E]);const ve=t=>{$(t)},be=async()=>{try{const t=await d.errorContextService.captureContext();t.screenshot&&($(t.screenshot),G(t))}catch(t){console.error("[CreateSupportTicketPage] Error recapturing screenshot:",t)}},ye=()=>{m&&(f.current&&(clearTimeout(f.current),f.current=null),d.ticketDraftService.deleteDraft(m)),g("/support/my-tickets?tab=submitted")},je=t=>{const n=Array.from(t.target.files||[]);Y(n),q.current&&(q.current.value="")},Ne=t=>{t.preventDefault(),t.stopPropagation()},we=t=>{t.preventDefault(),t.stopPropagation(),S(!0)},ke=t=>{t.preventDefault(),t.stopPropagation();const n=t.currentTarget.getBoundingClientRect(),l=t.clientX,ce=t.clientY;(l<n.left||l>n.right||ce<n.top||ce>n.bottom)&&S(!1)},Se=t=>{t.preventDefault(),t.stopPropagation(),S(!1);const n=Array.from(t.dataTransfer.files);n.length>0&&Y(n)},Ce=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,Te=t=>{const n=t.split(".").pop()?.toLowerCase();return["jpg","jpeg","png","gif"].includes(n||"")?c.Image:["pdf","doc","docx","txt"].includes(n||"")?c.FileText:c.File},Fe=async()=>{if(!C||!h.trim()||!T.trim())return;if(!j){L(!0);return}const t=await he();t&&g(`/support/my-tickets/${t.id}?tab=submitted`)},De=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:s("tickets.createFlow.selectType")}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:me.map(t=>e.jsx("button",{onClick:()=>{O(t.value),N(2)},className:`card p-4 text-left hover:shadow-md transition-shadow ${C===t.value?"ring-2 ring-[var(--color-primary-600)]":""}`,children:e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx("div",{className:"p-3 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(t.icon,{className:"w-6 h-6"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-medium",children:s(`tickets.${t.labelKey}`)}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s(`tickets.${t.descriptionKey}`,t.value)})]})]})},t.value))})]}),Ie=()=>b?e.jsxs("div",{className:"card p-4 bg-[var(--bg-secondary)]",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.Monitor,{className:"w-5 h-5 text-[var(--color-primary-600)]"}),s("tickets.create.systemInfo","System Information")]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:V,onChange:t=>ne(t.target.checked),className:"rounded border-[var(--border-color)]"}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:s("tickets.create.includeSystemInfo","Include in ticket")})]})]}),e.jsxs("div",{className:`grid grid-cols-2 md:grid-cols-3 gap-3 text-sm ${V?"":"opacity-50"}`,children:[e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.browser","Browser")}),e.jsxs("span",{className:"font-medium",children:[b.browser," ",b.browserVersion]})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.os","OS")}),e.jsxs("span",{className:"font-medium",children:[b.os," ",b.osVersion]})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.device","Device")}),e.jsx("span",{className:"font-medium",children:b.deviceType})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.screen","Screen")}),e.jsx("span",{className:"font-medium",children:b.screenResolution})]}),e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:s("tickets.create.language","Language")}),e.jsx("span",{className:"font-medium",children:b.language})]}),u&&e.jsxs("div",{className:"p-3 bg-[var(--bg-primary)] rounded-lg",children:[e.jsx("span",{className:"text-xs text-[var(--text-secondary)] block",children:"URL"}),e.jsx("span",{className:"font-medium font-mono text-xs truncate block",children:u.url})]})]})]}):null,Ee=()=>I?e.jsxs("div",{className:"card p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.Camera,{className:"w-5 h-5 text-[var(--color-primary-600)]"}),s("tickets.createFlow.screenshot")]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:F,onChange:t=>re(t.target.checked),className:"rounded border-[var(--border-color)]"}),s("tickets.createFlow.includeScreenshot")]})]}),F?e.jsx(Ke.ScreenshotAnnotator,{screenshot:I,onAnnotatedScreenshot:ve,onReset:be}):e.jsxs("div",{className:"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx(c.Camera,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),e.jsx("p",{className:"text-sm",children:s("tickets.createFlow.screenshotExcluded","Screenshot will not be included")})]})]}):null,Pe=()=>!u||u.recentErrors.length===0?null:e.jsxs("div",{className:"card p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h3",{className:"font-medium flex items-center gap-2",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5 text-[var(--error-text)]"}),s("tickets.createFlow.recentErrors")," (",u.recentErrors.length,")"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:D,onChange:t=>ae(t.target.checked),className:"rounded border-[var(--border-color)]"}),s("tickets.createFlow.includeErrorLogs")]})]}),D?e.jsx("div",{className:"bg-[var(--bg-secondary)] rounded-lg p-4 text-sm font-mono max-h-48 overflow-y-auto space-y-2",children:u.recentErrors.slice(0,10).map((t,n)=>e.jsxs("div",{className:"p-2 bg-[var(--error-bg)]/50 rounded text-[var(--error-text)]",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs opacity-70 mb-1",children:[e.jsx("span",{children:t.timestamp.toLocaleTimeString()}),t.component&&e.jsx("span",{className:"px-1.5 py-0.5 bg-[var(--bg-primary)] rounded",children:t.component})]}),e.jsx("div",{className:"break-words",children:t.message})]},`error-${n}`))}):e.jsx("div",{className:"p-4 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-lg",children:e.jsx("p",{className:"text-sm",children:s("tickets.createFlow.logsExcluded","Error logs will not be included")})})]}),Re=()=>!u&&!b?null:e.jsxs("div",{className:"space-y-6 mb-6",children:[Ie(),Ee(),Pe()]}),Le=()=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.createFlow.attachments")}),e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center transition-colors cursor-pointer ${M?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:border-[var(--color-primary-600)]"}`,onClick:()=>q.current?.click(),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),q.current?.click())},role:"button",tabIndex:0,onDragOver:Ne,onDragEnter:we,onDragLeave:ke,onDrop:Se,children:[e.jsx("input",{ref:q,type:"file",multiple:!0,onChange:je,accept:xe.join(","),className:"hidden"}),e.jsx(c.Paperclip,{className:`w-8 h-8 mx-auto mb-2 ${M?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`}),e.jsx("p",{className:`text-sm ${M?"text-[var(--color-primary-600)] font-medium":"text-[var(--text-secondary)]"}`,children:M?s("tickets.createFlow.dropFilesNow","Drop files here"):s("tickets.createFlow.dropFilesHere")}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:s("tickets.createFlow.maxFileSize",{size:"10 MB"})})]}),K.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:K.map((t,n)=>{const l=Te(t.name);return e.jsxs("div",{className:"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx(l,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:t.name}),e.jsx("p",{className:"text-xs text-[var(--text-secondary)]",children:Ce(t.size)})]}),e.jsx("button",{type:"button",onClick:ce=>{ce.stopPropagation(),pe(n)},className:"p-1 hover:bg-[var(--bg-hover)] rounded",children:e.jsx(c.X,{className:"w-4 h-4 text-[var(--text-secondary)]"})})]},`file-${t.name}-${n}`)})})]}),Ae=()=>{const n=me.find(l=>l.value===C)?.icon||c.Bug;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("button",{onClick:()=>N(1),className:"btn btn-ghost p-2",children:e.jsx(c.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-[var(--bg-secondary)]",children:e.jsx(n,{className:"w-5 h-5"})}),e.jsx("select",{value:C||"",onChange:l=>O(l.target.value),className:"input text-lg font-semibold bg-transparent border-none p-0 pr-8 cursor-pointer hover:text-[var(--color-primary-600)] focus:ring-0",children:me.map(l=>e.jsx("option",{value:l.value,children:s(`tickets.${l.labelKey}`)},l.value))})]}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:s("tickets.createFlow.fillDetails")})]})]}),Re(),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.title")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("input",{type:"text",value:h,onChange:l=>te(l.target.value),placeholder:s("tickets.form.titlePlaceholder"),className:"input w-full",maxLength:200}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[h.length,"/200"]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium mb-2",children:[s("tickets.form.description")," ",e.jsx("span",{className:"text-[var(--error-text)]",children:"*"})]}),e.jsx("textarea",{value:T,onChange:l=>se(l.target.value),placeholder:s("tickets.form.descriptionPlaceholder"),className:"input w-full h-40",maxLength:5e3}),e.jsxs("p",{className:"text-xs text-[var(--text-secondary)] mt-1",children:[T.length,"/5000"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-2",children:s("tickets.form.priority")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-2",children:ze.map(l=>e.jsxs("button",{type:"button",onClick:()=>B(l.value),className:`p-3 rounded-lg border text-center transition-colors ${A===l.value?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)] hover:bg-[var(--bg-hover)]"}`,children:[e.jsx("div",{className:"font-medium",children:s(`tickets.${l.labelKey}`)}),e.jsx("div",{className:"text-xs text-[var(--text-secondary)]",children:s(`tickets.${l.descriptionKey}`,l.value)})]},l.value))})]}),Le(),H&&e.jsxs("div",{className:"p-4 rounded-lg bg-[var(--error-bg)] text-[var(--error-text)] flex items-center gap-2",children:[e.jsx(c.AlertTriangle,{className:"w-5 h-5"}),H]}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t border-[var(--border-color)]",children:[e.jsx("button",{onClick:()=>N(1),className:"btn btn-secondary",children:s("common:actions.back")}),e.jsxs("button",{onClick:Fe,disabled:!h.trim()||!T.trim()||U||X,className:"btn btn-primary",children:[U||X?e.jsx(c.Loader2,{className:"w-4 h-4 animate-spin mr-2"}):e.jsx(c.Send,{className:"w-4 h-4 mr-2"}),s(X?"tickets.createFlow.uploadingFiles":U?"common:actions.submitting":"common:actions.submit")]})]})]})};return e.jsxs("div",{className:"max-w-3xl mx-auto",children:[e.jsx(d.Breadcrumb,{items:[{label:s("title","Support"),href:"/support"},{label:s("list.title","Tickets"),href:"/support/tickets"},{label:s("create.title","Create Ticket")}]}),e.jsxs("div",{className:"flex items-center gap-4 mb-6 mt-6",children:[e.jsx("button",{onClick:()=>g(-1),className:"btn btn-ghost p-2",children:e.jsx(c.ArrowLeft,{className:"w-5 h-5"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[e.jsx(c.Headset,{className:"w-6 h-6"}),s("tickets.createFlow.title")]}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("tickets.createFlow.subtitle")})]}),m&&e.jsxs("button",{onClick:()=>w(!0),className:"btn btn-ghost text-[var(--error-text)] hover:bg-[var(--error-bg)]",title:s("common:drafts.discard"),children:[e.jsx(c.Trash2,{className:"w-4 h-4 mr-2"}),s("common:drafts.discard")]})]}),R?e.jsxs("div",{className:"mb-6 p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)]",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(c.Info,{className:"w-5 h-5 text-[var(--info-text)] flex-shrink-0"}),e.jsx("p",{className:"font-medium text-[var(--info-text)]",children:s("glpi.cannotCreateTicket","Tickets are managed by GLPI. Please create tickets directly in GLPI.")})]}),Z&&e.jsxs("a",{href:Z,target:"_blank",rel:"noopener noreferrer",className:"btn btn-primary inline-flex items-center gap-2",children:[e.jsx(c.ExternalLink,{className:"w-4 h-4"}),s("glpi.openGlpi")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsxs("div",{className:`flex items-center gap-2 ${k>=1?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${k>=1?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"1"}),e.jsx("span",{className:"font-medium",children:s("tickets.createFlow.step1")})]}),e.jsx("div",{className:`flex-1 h-0.5 ${k>=2?"bg-[var(--color-primary-600)]":"bg-[var(--border-color)]"}`}),e.jsxs("div",{className:`flex items-center gap-2 ${k>=2?"text-[var(--color-primary-600)]":"text-[var(--text-secondary)]"}`,children:[e.jsx("div",{className:`w-8 h-8 rounded-full flex items-center justify-center ${k>=2?"bg-[var(--color-primary-600)] text-white":"bg-[var(--bg-secondary)]"}`,children:"2"}),e.jsx("span",{className:"font-medium",children:s("tickets.createFlow.step2")})]}),_?e.jsxs("div",{className:"ml-auto flex items-center gap-1.5 text-xs text-[var(--error-text)]",children:[e.jsx(c.AlertTriangle,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:errors.generic")})]}):e.jsxs("div",{className:`ml-auto flex items-center gap-1.5 text-xs text-[var(--success-text)] transition-opacity duration-300 ${de?"opacity-100":"opacity-0"}`,children:[e.jsx(c.Check,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:s("common:drafts.autoSaved")})]})]}),y&&!z&&e.jsxs("div",{className:"mb-4 p-3 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm text-[var(--info-text)]",children:[e.jsx(c.Building2,{className:"w-4 h-4"}),e.jsx("span",{children:s("support:tickets.tenantPicker.creatingFor")}),e.jsx("span",{className:"font-semibold",children:y.name})]}),e.jsx("button",{onClick:()=>L(!0),className:"text-xs text-[var(--info-text)] underline hover:no-underline",children:s("common:actions.change")})]}),e.jsxs("div",{className:"card p-6",children:[k===1&&De(),k===2&&Ae()]}),oe&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--info-bg)] flex items-center justify-center",children:e.jsx(c.Building2,{className:"w-5 h-5 text-[var(--info-text)]"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-bold",children:s("support:tickets.tenantPicker.title")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:s("support:tickets.tenantPicker.description")})]})]}),e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:v.filter(t=>t.status==="Active").map(t=>e.jsx("button",{onClick:()=>{ee(t),L(!1),m&&d.ticketDraftService.updateDraft(m,{tenantId:t.id,tenantSlug:t.slug,tenantName:t.name})},className:`w-full p-3 rounded-lg border text-left transition-colors hover:bg-[var(--bg-hover)] ${y?.id===t.id?"border-[var(--color-primary-600)] bg-[var(--color-primary-600)]/10":"border-[var(--border-color)]"}`,children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(c.Building2,{className:"w-5 h-5 text-[var(--text-secondary)]"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium truncate",children:t.name}),t.organisationName&&e.jsx("div",{className:"text-xs text-[var(--text-secondary)] truncate",children:t.organisationName})]}),e.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${t.type==="Personal"?"bg-[var(--info-bg)] text-[var(--info-text)]":"bg-[var(--success-bg)] text-[var(--success-text)]"}`,children:t.type==="Personal"?s("common:tenant.personal"):s("common:tenant.business")})]})},t.id))}),e.jsx("div",{className:"flex justify-end gap-3 mt-4 pt-4 border-t border-[var(--border-color)]",children:e.jsx("button",{onClick:()=>{L(!1),j||g(-1)},className:"btn btn-secondary",children:s("common:actions.cancel")})})]})}),ie&&e.jsx("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50 p-4",children:e.jsxs("div",{className:"card w-full max-w-md p-6",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:"w-10 h-10 rounded-full bg-[var(--error-bg)] flex items-center justify-center",children:e.jsx(c.Trash2,{className:"w-5 h-5 text-[var(--error-text)]"})}),e.jsx("h2",{className:"text-xl font-bold",children:s("common:drafts.discardConfirmTitle")})]}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-6",children:s("common:drafts.discardConfirmMessage")}),e.jsxs("div",{className:"flex justify-end gap-3",children:[e.jsx("button",{onClick:()=>w(!1),className:"btn btn-secondary",children:s("common:actions.cancel")}),e.jsxs("button",{onClick:()=>{w(!1),ye()},className:"btn bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90",children:[e.jsx(c.Trash2,{className:"w-4 h-4 mr-2"}),s("common:drafts.discardConfirm")]})]})]})})]})]})}exports.CreateSupportTicketPage=Me;
3
- //# sourceMappingURL=CreateSupportTicketPage-CKDX_HQm.js.map
3
+ //# sourceMappingURL=CreateSupportTicketPage-BWeuV2aU.js.map