@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/chunk-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
@@ -34,6 +34,7 @@ import {
34
34
  DEFAULT_FALLBACK_CONFIG,
35
35
  type FallbackConfig
36
36
  } from '../components/DataTable/utils/errorHandling';
37
+ import { logger } from '../utils/core/logger';
37
38
 
38
39
  export interface UseDataTablePerformanceOptions<TData extends DataRecord> {
39
40
  data: TData[];
@@ -236,7 +237,7 @@ export function useDataTablePerformance<TData extends DataRecord>({
236
237
  const response = await serverSide.fetchData(params);
237
238
  setServerData(response);
238
239
  } catch (error) {
239
- console.error('Failed to fetch server data:', error);
240
+ logger.error('useDataTablePerformance', 'Failed to fetch server data:', error);
240
241
  } finally {
241
242
  setIsLoading(false);
242
243
  }
@@ -310,7 +311,7 @@ export function useDataTablePerformance<TData extends DataRecord>({
310
311
  onError?.(error);
311
312
  return recovery;
312
313
  } catch (recoveryError) {
313
- console.error('Error recovery failed:', recoveryError);
314
+ logger.error('useDataTablePerformance', 'Error recovery failed:', recoveryError);
314
315
  }
315
316
  }
316
317
  throw error;
@@ -323,7 +324,7 @@ export function useDataTablePerformance<TData extends DataRecord>({
323
324
  setLastFailedOperation(null);
324
325
  setErrorState(prev => ({ ...prev, hasErrors: false }));
325
326
  } catch (error) {
326
- console.error('Retry failed:', error);
327
+ logger.error('useDataTablePerformance', 'Retry failed:', error);
327
328
  }
328
329
  }
329
330
  }, [lastFailedOperation]);
@@ -23,6 +23,20 @@ vi.mock('../theming/runtime', () => ({
23
23
  clearPalette: vi.fn()
24
24
  }));
25
25
 
26
+ // Mock the Logger module
27
+ vi.mock('../utils/core/logger', () => {
28
+ const mockLoggerInstance = {
29
+ error: vi.fn(),
30
+ };
31
+ return {
32
+ createLogger: vi.fn(() => mockLoggerInstance),
33
+ };
34
+ });
35
+
36
+ // Get the mock instance after mock is set up
37
+ import { createLogger } from '../utils/core/logger';
38
+ const getMockLogger = () => createLogger('test');
39
+
26
40
  // Mock react-router-dom useLocation
27
41
  vi.mock('react-router-dom', () => ({
28
42
  useLocation: vi.fn(() => ({
@@ -254,7 +268,7 @@ describe('useEventTheme', () => {
254
268
 
255
269
  describe('Error handling', () => {
256
270
  it('handles errors when applying palette', () => {
257
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
271
+ vi.clearAllMocks();
258
272
 
259
273
  mockUseEvents.mockReturnValue({
260
274
  selectedEvent: {
@@ -276,12 +290,11 @@ describe('useEventTheme', () => {
276
290
 
277
291
  renderHook(() => useEventTheme());
278
292
 
279
- expect(consoleSpy).toHaveBeenCalledWith(
280
- '[useEventTheme] Failed to apply event palette:',
293
+ const logger = getMockLogger();
294
+ expect(vi.mocked(logger.error)).toHaveBeenCalledWith(
295
+ 'Failed to apply event palette:',
281
296
  expect.any(Error)
282
297
  );
283
-
284
- consoleSpy.mockRestore();
285
298
  });
286
299
  });
287
300
 
@@ -44,6 +44,9 @@ import { useEvents } from './useEvents';
44
44
  import { applyPalette, clearPalette } from '../theming/runtime';
45
45
  import { parseAndNormalizeEventColours } from '../theming/parseEventColours';
46
46
  import type { Event } from '../types/unified';
47
+ import { createLogger } from '../utils/core/logger';
48
+
49
+ const log = createLogger('useEventTheme');
47
50
 
48
51
  /**
49
52
  * Hook that automatically applies event-specific theming
@@ -147,7 +150,7 @@ export function useEventTheme(event?: Event | null): void {
147
150
  try {
148
151
  applyPalette(normalized);
149
152
  } catch (error) {
150
- console.error('[useEventTheme] Failed to apply event palette:', error);
153
+ log.error('Failed to apply event palette:', error);
151
154
  }
152
155
 
153
156
  // Cleanup function to clear palette when component unmounts or event changes
@@ -21,6 +21,7 @@ export interface EventContextType {
21
21
  error: Error | null;
22
22
  setSelectedEvent: (event: Event | null) => void;
23
23
  refreshEvents: () => Promise<void>;
24
+ clearEventSelection: () => Promise<void>;
24
25
  }
25
26
 
26
27
  /**
@@ -58,6 +59,7 @@ export function useEvents(): EventContextType {
58
59
  error: eventService.getError(),
59
60
  setSelectedEvent: (event: Event | null) => eventService.setSelectedEvent(event),
60
61
  refreshEvents: () => eventService.refreshEvents(),
62
+ clearEventSelection: () => eventService.clearEventSelection(),
61
63
  };
62
64
  }
63
65
 
@@ -39,6 +39,7 @@ import type { SupabaseClient } from '@supabase/supabase-js';
39
39
  import { FileReference, FileCategory } from '../types/file-reference';
40
40
  import { getPublicUrl, getSignedUrl } from '../utils/storage/helpers';
41
41
  import { createFileReferenceService } from '../utils/file-reference';
42
+ import { logger } from '../utils/core/logger';
42
43
 
43
44
  // Simple in-memory cache for authenticated file data
44
45
  const authenticatedFileCache = new Map<string, { data: any; timestamp: number; ttl: number }>();
@@ -147,7 +148,7 @@ export function useFileDisplay(
147
148
  // Validate UUID format for organisationId to prevent database errors
148
149
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
149
150
  if (!uuidRegex.test(organisation_id)) {
150
- console.warn('[useFileDisplay] Invalid organisationId format (not a valid UUID):', organisation_id);
151
+ logger.warn('useFileDisplay', 'Invalid organisationId format (not a valid UUID):', organisation_id);
151
152
  }
152
153
 
153
154
  // Check cache first
@@ -178,7 +179,7 @@ export function useFileDisplay(
178
179
  return;
179
180
  } catch (err) {
180
181
  // If signed URL regeneration fails, fall through to normal fetch
181
- console.warn('[useFileDisplay] Failed to regenerate signed URL from cache, falling back to fetch:', err);
182
+ logger.warn('useFileDisplay', 'Failed to regenerate signed URL from cache, falling back to fetch:', err);
182
183
  }
183
184
  }
184
185
 
@@ -205,7 +206,7 @@ export function useFileDisplay(
205
206
  // Category is stored in file_metadata JSONB field, not a direct column
206
207
  if (category) {
207
208
  // Single file mode - get files by category using RPC
208
- console.log('[useFileDisplay] Using RPC function for category filtering:', {
209
+ logger.debug('useFileDisplay', 'Using RPC function for category filtering:', {
209
210
  table_name,
210
211
  record_id,
211
212
  category,
@@ -251,7 +252,7 @@ export function useFileDisplay(
251
252
  if (category && files.length > 0) {
252
253
  // Single file mode - get first file
253
254
  const firstFile = files[0];
254
- console.log('[useFileDisplay] Processing category files, first file:', {
255
+ logger.debug('useFileDisplay', 'Processing category files, first file:', {
255
256
  id: firstFile.id,
256
257
  file_path: firstFile.file_path,
257
258
  is_public: firstFile.is_public,
@@ -265,7 +266,7 @@ export function useFileDisplay(
265
266
  let url: string | null = null;
266
267
  if (firstFile.is_public) {
267
268
  url = getPublicUrl(supabase, firstFile.file_path, true);
268
- console.log('[useFileDisplay] Generated public URL:', url);
269
+ logger.debug('useFileDisplay', 'Generated public URL:', url);
269
270
  } else {
270
271
  const signedUrlResult = await getSignedUrl(supabase, firstFile.file_path, {
271
272
  appName: 'pace-core',
@@ -273,9 +274,9 @@ export function useFileDisplay(
273
274
  expiresIn: 3600
274
275
  });
275
276
  url = signedUrlResult?.url || null;
276
- console.log('[useFileDisplay] Generated signed URL:', url ? 'URL generated' : 'URL generation failed');
277
+ logger.debug('useFileDisplay', 'Generated signed URL:', url ? 'URL generated' : 'URL generation failed');
277
278
  }
278
- console.log('[useFileDisplay] Setting file URL:', url ? 'URL set' : 'URL is null');
279
+ logger.debug('useFileDisplay', 'Setting file URL:', url ? 'URL set' : 'URL is null');
279
280
  setFileUrl(url);
280
281
  } else {
281
282
  // Multiple files mode - generate URLs for all files
@@ -340,7 +341,7 @@ export function useFileDisplay(
340
341
  }
341
342
 
342
343
  } catch (err) {
343
- console.error('[useFileDisplay] Error fetching files:', err);
344
+ logger.error('useFileDisplay', 'Error fetching files:', err);
344
345
  const error = err instanceof Error ? err : new Error('Unknown error occurred');
345
346
  setError(error);
346
347
  setFileUrl(null);
@@ -12,6 +12,9 @@ import {
12
12
  } from '../types/file-reference';
13
13
  import { createFileReferenceService, uploadFileWithReference } from '../utils/file-reference';
14
14
  import { getPublicUrl, getSignedUrl } from '../utils/storage/helpers';
15
+ import { createLogger } from '../utils/core/logger';
16
+
17
+ const log = createLogger('useFileReference');
15
18
 
16
19
  export function useFileReference(supabase: SupabaseClient) {
17
20
  const [isLoading, setIsLoading] = useState(false);
@@ -422,7 +425,7 @@ export function useFilesByCategory(
422
425
  urlMap.set(fileRef.id, url);
423
426
  }
424
427
  } catch (err) {
425
- console.error(`Failed to load URL for file ${fileRef.id}:`, err);
428
+ log.error(`Failed to load URL for file ${fileRef.id}:`, err);
426
429
  }
427
430
  }
428
431
 
@@ -11,6 +11,9 @@ import { useState, useEffect, useCallback, useRef } from 'react';
11
11
  import { SupabaseClient } from '@supabase/supabase-js';
12
12
  import { FileReference } from '../types/file-reference';
13
13
  import { getPublicUrl, getSignedUrl } from '../utils/storage/helpers';
14
+ import { createLogger } from '../utils/core/logger';
15
+
16
+ const log = createLogger('useFileUrl');
14
17
 
15
18
  export interface UseFileUrlOptions {
16
19
  /** Organisation ID for signed URL generation */
@@ -91,7 +94,7 @@ export function useFileUrl(
91
94
  const error = err instanceof Error ? err : new Error('Failed to generate file URL');
92
95
  setError(error);
93
96
  setUrl(null);
94
- console.error('[useFileUrl] Error generating URL:', error);
97
+ log.error('Error generating URL:', error);
95
98
  } finally {
96
99
  setIsLoading(false);
97
100
  }
@@ -53,6 +53,7 @@
53
53
  */
54
54
 
55
55
  import { useState, useEffect, useCallback, useRef } from 'react';
56
+ import { logger } from '../utils/core/logger';
56
57
 
57
58
  export interface UseInactivityTrackerOptions {
58
59
  /** Timeout in milliseconds before user is considered idle (default: 30 minutes) */
@@ -221,7 +222,7 @@ export function useInactivityTracker({
221
222
  try {
222
223
  localStorage.setItem(storageKey, now.toString());
223
224
  } catch (error) {
224
- console.warn('[useInactivityTracker] Failed to persist activity time:', error);
225
+ logger.warn('useInactivityTracker', 'Failed to persist activity time:', error);
225
226
  }
226
227
 
227
228
  // Broadcast activity to other tabs
@@ -230,7 +231,7 @@ export function useInactivityTracker({
230
231
  channelRef.current.postMessage({ type: 'activity', timestamp: now });
231
232
  }
232
233
  } catch (error) {
233
- console.warn('[useInactivityTracker] Failed to broadcast activity:', error);
234
+ logger.warn('useInactivityTracker', 'Failed to broadcast activity:', error);
234
235
  }
235
236
  }, [enabled, idleTimeoutMs, warnBeforeMs, onIdle, onWarning, onActivity, storageKey, clearTimers]);
236
237
 
@@ -261,7 +262,7 @@ export function useInactivityTracker({
261
262
  };
262
263
  }
263
264
  } catch (error) {
264
- console.warn('[useInactivityTracker] Failed to set up cross-tab communication:', error);
265
+ logger.warn('useInactivityTracker', 'Failed to set up cross-tab communication:', error);
265
266
  }
266
267
 
267
268
  // Check for persisted activity time
@@ -290,7 +291,7 @@ export function useInactivityTracker({
290
291
  }
291
292
  }
292
293
  } catch (error) {
293
- console.warn('[useInactivityTracker] Failed to check persisted activity time:', error);
294
+ logger.warn('useInactivityTracker', 'Failed to check persisted activity time:', error);
294
295
  }
295
296
 
296
297
  // Set up throttled activity handler
@@ -12,6 +12,7 @@ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
12
12
  import { useOrganisationSecurity } from './useOrganisationSecurity';
13
13
  import { useUnifiedAuth } from '../providers';
14
14
  import { useOrganisations } from './useOrganisations';
15
+ import { Logger, LogLevel } from '../utils/core/logger';
15
16
 
16
17
  // Mock the providers
17
18
  vi.mock('../providers', () => ({
@@ -44,6 +45,7 @@ describe('useOrganisationSecurity', () => {
44
45
  const mockIsSuperAdmin = vi.mocked(isSuperAdmin);
45
46
  const mockGetPermissionMap = vi.mocked(getPermissionMap);
46
47
  const mockEmitAuditEvent = vi.mocked(emitAuditEvent);
48
+ let originalMode: string | undefined;
47
49
 
48
50
  const mockUser = {
49
51
  id: 'user-123',
@@ -82,6 +84,17 @@ describe('useOrganisationSecurity', () => {
82
84
  };
83
85
 
84
86
  beforeEach(() => {
87
+ // Ensure logger is enabled by setting MODE to development
88
+ originalMode = import.meta.env.MODE;
89
+ (import.meta.env as any).MODE = 'development';
90
+
91
+ // Configure logger to ensure it logs in test environment
92
+ Logger.configure({
93
+ level: LogLevel.DEBUG,
94
+ includeTimestamp: false,
95
+ includeComponent: true,
96
+ });
97
+
85
98
  // Clear all mocks but preserve the structure
86
99
  mockUseUnifiedAuth.mockClear();
87
100
  mockUseOrganisations.mockClear();
@@ -535,18 +548,18 @@ describe('useOrganisationSecurity', () => {
535
548
  mockIsSuperAdmin.mockResolvedValue(false);
536
549
  mockIsPermitted.mockRejectedValue(new Error('Permission check failed'));
537
550
 
538
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
551
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
539
552
 
540
553
  const { result } = renderHook(() => useOrganisationSecurity());
541
554
 
542
555
  const hasPermission = await result.current.hasPermission('read:users');
543
556
  expect(hasPermission).toBe(false);
544
- expect(consoleSpy).toHaveBeenCalledWith(
545
- expect.stringContaining('Exception checking permission'),
557
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
558
+ expect.stringContaining('[ERROR] [useOrganisationSecurity] Exception checking permission'),
546
559
  expect.any(Error)
547
560
  );
548
561
 
549
- consoleSpy.mockRestore();
562
+ consoleErrorSpy.mockRestore();
550
563
  });
551
564
  });
552
565
 
@@ -611,18 +624,18 @@ describe('useOrganisationSecurity', () => {
611
624
  mockIsSuperAdmin.mockResolvedValue(false);
612
625
  mockIsPermitted.mockRejectedValue(new Error('Permission retrieval failed'));
613
626
 
614
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
627
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
615
628
 
616
629
  const { result } = renderHook(() => useOrganisationSecurity());
617
630
 
618
631
  const permissions = await result.current.getUserPermissions();
619
632
  expect(permissions).toEqual([]);
620
- expect(consoleSpy).toHaveBeenCalledWith(
621
- expect.stringContaining('Exception getting user permissions'),
633
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
634
+ expect.stringContaining('[ERROR] [useOrganisationSecurity] Exception getting user permissions'),
622
635
  expect.any(Error)
623
636
  );
624
637
 
625
- consoleSpy.mockRestore();
638
+ consoleErrorSpy.mockRestore();
626
639
  });
627
640
  });
628
641
 
@@ -719,18 +732,18 @@ describe('useOrganisationSecurity', () => {
719
732
 
720
733
  mockSingle.mockRejectedValue(new Error('Validation failed'));
721
734
 
722
- const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
735
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
723
736
 
724
737
  const { result } = renderHook(() => useOrganisationSecurity());
725
738
 
726
739
  const isValid = await result.current.validateUserAccess('user-123', 'org-123');
727
740
  expect(isValid).toBe(false);
728
- expect(consoleSpy).toHaveBeenCalledWith(
729
- expect.stringContaining('Exception validating organisation access'),
741
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
742
+ expect.stringContaining('[ERROR] [useOrganisationSecurity] Exception validating organisation access'),
730
743
  expect.any(Error)
731
744
  );
732
745
 
733
- consoleSpy.mockRestore();
746
+ consoleErrorSpy.mockRestore();
734
747
  });
735
748
  });
736
749
 
@@ -768,4 +781,12 @@ describe('useOrganisationSecurity', () => {
768
781
  expect(result.current.hasMinimumRole('member')).toBe(false);
769
782
  });
770
783
  });
784
+
785
+ afterEach(() => {
786
+ // Restore original mode
787
+ if (originalMode !== undefined) {
788
+ (import.meta.env as any).MODE = originalMode;
789
+ }
790
+ vi.clearAllMocks();
791
+ });
771
792
  });
@@ -14,6 +14,7 @@ import { useOrganisations } from './useOrganisations';
14
14
  // Legacy useRBAC hook removed - use new RBAC system instead
15
15
  import type { OrganisationSecurityError, SuperAdminContext } from '../types/organisation';
16
16
  import type { Permission } from '../rbac/types';
17
+ import { logger } from '../utils/core/logger';
17
18
 
18
19
  export interface OrganisationSecurityHook {
19
20
  // Super admin context
@@ -66,7 +67,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
66
67
 
67
68
  setIsSuperAdmin(!error && data && data.length > 0);
68
69
  } catch (error) {
69
- console.error('[useOrganisationSecurity] Error checking super admin status:', error);
70
+ logger.error('useOrganisationSecurity', 'Error checking super admin status:', error);
70
71
  setIsSuperAdmin(false);
71
72
  } finally {
72
73
  setIsCheckingSuperAdmin(false);
@@ -107,13 +108,13 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
107
108
  .single();
108
109
 
109
110
  if (error) {
110
- console.error('[useOrganisationSecurity] Error validating organisation access:', error);
111
+ logger.error('useOrganisationSecurity', 'Error validating organisation access:', error);
111
112
  return false;
112
113
  }
113
114
 
114
115
  return !!data;
115
116
  } catch (error) {
116
- console.error('[useOrganisationSecurity] Exception validating organisation access:', error);
117
+ logger.error('useOrganisationSecurity', 'Exception validating organisation access:', error);
117
118
  return false;
118
119
  }
119
120
  }, [user, session, supabase, superAdminContext.isSuperAdmin]);
@@ -177,7 +178,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
177
178
  permission: permission as Permission
178
179
  });
179
180
  } catch (error) {
180
- console.error('[useOrganisationSecurity] Exception checking permission:', error);
181
+ logger.error('useOrganisationSecurity', 'Exception checking permission:', error);
181
182
  return false;
182
183
  }
183
184
  }, [selectedOrganisation, user, superAdminContext.isSuperAdmin]);
@@ -213,7 +214,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
213
214
  .map(([permission]) => permission);
214
215
  return [...new Set(allPermissions)]; // Remove duplicates
215
216
  } catch (error) {
216
- console.error('[useOrganisationSecurity] Exception getting user permissions:', error);
217
+ logger.error('useOrganisationSecurity', 'Exception getting user permissions:', error);
217
218
  return [];
218
219
  }
219
220
  }, [selectedOrganisation, user, getUserRole, superAdminContext.isSuperAdmin]);
@@ -239,7 +240,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
239
240
  });
240
241
  }
241
242
  } catch (error) {
242
- console.error('[useOrganisationSecurity] Error logging organisation access:', error);
243
+ logger.error('useOrganisationSecurity', 'Error logging organisation access:', error);
243
244
  }
244
245
  }, [user, selectedOrganisation]);
245
246
 
@@ -274,7 +275,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
274
275
 
275
276
  return await validateOrganisationAccess(orgId);
276
277
  } catch (error) {
277
- console.error('[useOrganisationSecurity] Exception validating user access:', error);
278
+ logger.error('useOrganisationSecurity', 'Exception validating user access:', error);
278
279
  return false;
279
280
  }
280
281
  }, [supabase, superAdminContext.isSuperAdmin, user, validateOrganisationAccess]);
@@ -1,6 +1,9 @@
1
1
 
2
2
  import { useEffect, useRef, useCallback } from 'react';
3
- import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from '../utils/performanceBudgets';
3
+ import { performanceBudgetMonitor, PERFORMANCE_BUDGETS } from '../utils/performance/performanceBudgets';
4
+ import { createLogger } from '../utils/core/logger';
5
+
6
+ const log = createLogger('usePerformanceMonitor');
4
7
 
5
8
  export interface PerformanceMetrics {
6
9
  renderTime: number;
@@ -54,8 +57,8 @@ export function usePerformanceMonitor(
54
57
 
55
58
  // Log slow renders in development
56
59
  if (!measurement.passed) {
57
- console.warn(
58
- `🐌 Performance budget exceeded in ${componentName}: ${renderTime.toFixed(2)}ms ` +
60
+ log.warn(
61
+ `Performance budget exceeded in ${componentName}: ${renderTime.toFixed(2)}ms ` +
59
62
  `(budget: ${PERFORMANCE_BUDGETS[budgetName]?.threshold}ms)`
60
63
  );
61
64
  }
@@ -59,6 +59,7 @@ import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
59
59
  import { useOrganisations } from './useOrganisations';
60
60
  import { useEvents } from './useEvents';
61
61
  import { isPermittedCached } from '../rbac/api';
62
+ import { logger } from '../utils/core/logger';
62
63
  import type { Operation, Permission, Scope, UUID } from '../rbac/types';
63
64
 
64
65
  // Cache entry interface
@@ -213,12 +214,15 @@ export function usePermissionCache(config: Partial<CacheConfig> = {}) {
213
214
  ): Promise<boolean> => {
214
215
  // Validate parameters
215
216
  if (!operation || !pageId) {
216
- console.warn('[PermissionCache] Invalid parameters: operation and pageId are required');
217
+ logger.warn('PermissionCache', 'Invalid parameters: operation and pageId are required', { operation, pageId });
217
218
  return false;
218
219
  }
219
220
 
220
221
  if (!user?.id || !scope.organisationId) {
221
- console.warn('[PermissionCache] User or organisation context not available - permission check failed');
222
+ logger.warn('PermissionCache', 'User or organisation context not available - permission check failed', {
223
+ hasUserId: !!user?.id,
224
+ hasOrganisationId: !!scope.organisationId
225
+ });
222
226
  return false;
223
227
  }
224
228
 
@@ -278,7 +282,7 @@ export function usePermissionCache(config: Partial<CacheConfig> = {}) {
278
282
  logPermissionCheck(operation, pageId, result, false, responseTime);
279
283
  return result;
280
284
  } catch (error) {
281
- console.error(`[PermissionCache] Error checking permission ${operation}:${pageId}:`, error);
285
+ logger.error('PermissionCache', `Error checking permission ${operation}:${pageId}`, { operation, pageId, error });
282
286
  return false;
283
287
  } finally {
284
288
  // Remove the promise from cache after completion
@@ -299,12 +303,15 @@ export function usePermissionCache(config: Partial<CacheConfig> = {}) {
299
303
  ): Promise<PermissionResult[]> => {
300
304
  // Validate parameters
301
305
  if (!permissions || !Array.isArray(permissions) || permissions.length === 0) {
302
- console.warn('[PermissionCache] Invalid permissions array');
306
+ logger.warn('PermissionCache', 'Invalid permissions array', { permissions });
303
307
  return [];
304
308
  }
305
309
 
306
310
  if (!user?.id || !scope.organisationId) {
307
- console.warn('[PermissionCache] User or organisation context not available - permission checks failed');
311
+ logger.warn('PermissionCache', 'User or organisation context not available - permission checks failed', {
312
+ hasUserId: !!user?.id,
313
+ hasOrganisationId: !!scope.organisationId
314
+ });
308
315
  return permissions.map(([operation, pageId]) => ({
309
316
  operation,
310
317
  pageId,
@@ -388,7 +395,7 @@ export function usePermissionCache(config: Partial<CacheConfig> = {}) {
388
395
 
389
396
  stats.current.cacheMisses++;
390
397
  } catch (error) {
391
- console.error(`[PermissionCache] Error checking permission ${operation}:${pageId}:`, error);
398
+ logger.error('PermissionCache', `Error checking permission ${operation}:${pageId}`, { operation, pageId, error });
392
399
  results[originalIndex] = {
393
400
  operation,
394
401
  pageId,
@@ -12,7 +12,7 @@ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
12
12
  import { useSecureDataAccess } from './useSecureDataAccess';
13
13
  import { useUnifiedAuth } from '../providers';
14
14
  import { useOrganisations } from './useOrganisations';
15
- import { setOrganisationContext } from '../utils/organisationContext';
15
+ import { setOrganisationContext } from '../utils/context/organisationContext';
16
16
  import { createMockSupabaseClient, createMockQueryBuilderWithData } from '../__tests__/helpers/supabaseMock';
17
17
 
18
18
  // Mock the providers
@@ -25,7 +25,7 @@ vi.mock('./useOrganisations', () => ({
25
25
  }));
26
26
 
27
27
  // Mock the organisation context utility
28
- vi.mock('../utils/organisationContext', () => ({
28
+ vi.mock('../utils/context/organisationContext', () => ({
29
29
  setOrganisationContext: vi.fn()
30
30
  }));
31
31
 
@@ -55,7 +55,8 @@ import { useCallback, useState, useContext } from 'react';
55
55
  import { useUnifiedAuth } from '../providers';
56
56
  import { useOrganisations } from './useOrganisations';
57
57
  import { EventServiceContext } from '../providers/services/EventServiceProvider';
58
- import { setOrganisationContext } from '../utils/organisationContext';
58
+ import { setOrganisationContext } from '../utils/context/organisationContext';
59
+ import { logger } from '../utils/core/logger';
59
60
  import type { Permission } from '../rbac/types';
60
61
  import type { OrganisationSecurityError } from '../types/organisation';
61
62
 
@@ -261,7 +262,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
261
262
  const { data, error } = await query;
262
263
 
263
264
  if (error) {
264
- console.error('[useSecureDataAccess] Query failed:', error);
265
+ logger.error('useSecureDataAccess', 'Query failed', { table, columns, filters, error });
265
266
  // NEW: Phase 1 - Record failed data access attempt
266
267
  recordDataAccess(table, 'read', false, `SELECT ${columns} FROM ${table}`, filters);
267
268
  throw error;
@@ -296,7 +297,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
296
297
  .single();
297
298
 
298
299
  if (error) {
299
- console.error('[useSecureDataAccess] Insert failed:', error);
300
+ logger.error('useSecureDataAccess', 'Insert failed', { table, data: secureData, error });
300
301
  throw error;
301
302
  }
302
303
 
@@ -346,7 +347,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
346
347
  const { data: updateData, error } = await query.select();
347
348
 
348
349
  if (error) {
349
- console.error('[useSecureDataAccess] Update failed:', error);
350
+ logger.error('useSecureDataAccess', 'Update failed', { table, data: secureData, filters, error });
350
351
  throw error;
351
352
  }
352
353
 
@@ -402,7 +403,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
402
403
  const { error } = await query;
403
404
 
404
405
  if (error) {
405
- console.error('[useSecureDataAccess] Delete failed:', error);
406
+ logger.error('useSecureDataAccess', 'Delete failed', { table, filters, error });
406
407
  throw error;
407
408
  }
408
409
  }, [validateContext, getCurrentOrganisationId, setOrganisationContextInSession, supabase]);
@@ -499,7 +500,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
499
500
  const { data, error } = await supabase!.rpc(functionName, secureParams);
500
501
 
501
502
  if (error) {
502
- console.error('[useSecureDataAccess] RPC failed:', error);
503
+ logger.error('useSecureDataAccess', 'RPC failed', { functionName, params: secureParams, error });
503
504
  throw error;
504
505
  }
505
506
 
@@ -553,7 +554,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
553
554
  try {
554
555
  validateContext();
555
556
  } catch (error) {
556
- console.error(`[useSecureDataAccess] Organisation context validation failed:`, error);
557
+ logger.error('useSecureDataAccess', 'Organisation context validation failed', { table, operation, error });
557
558
  return false;
558
559
  }
559
560
 
@@ -587,7 +588,7 @@ export function useSecureDataAccess(): SecureDataAccessReturn {
587
588
  });
588
589
 
589
590
  if (isStrictMode && !allowed) {
590
- console.error(`[useSecureDataAccess] STRICT MODE VIOLATION: User attempted data access without permission`, {
591
+ logger.error('useSecureDataAccess', 'STRICT MODE VIOLATION: User attempted data access without permission', {
591
592
  table,
592
593
  operation,
593
594
  userId: user.id,
@@ -12,6 +12,9 @@
12
12
  import { useContext, useMemo, useEffect, useState } from 'react';
13
13
  import { AuthServiceContext } from '../providers/services/AuthServiceProvider';
14
14
  import type { SessionRestorationState } from '../types/auth';
15
+ import { createLogger } from '../utils/core/logger';
16
+
17
+ const log = createLogger('useSessionRestoration');
15
18
 
16
19
  const SESSION_RESTORATION_TIMEOUT_MS = 5000;
17
20
 
@@ -38,7 +41,7 @@ export function useSessionRestoration(): UseSessionRestorationResult {
38
41
  if (sessionRestoration.isRestoring && !sessionRestoration.restorationComplete && !sessionRestoration.restorationError) {
39
42
  setHasTimedOut(false);
40
43
  timeoutHandle = setTimeout(() => {
41
- console.warn('[useSessionRestoration] Session restoration timed out');
44
+ log.warn('Session restoration timed out');
42
45
  setHasTimedOut(true);
43
46
  }, SESSION_RESTORATION_TIMEOUT_MS);
44
47
  } else {