@jmruthers/pace-core 0.5.67 → 0.5.69

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 (384) hide show
  1. package/README.md +26 -0
  2. package/dist/{DataTable-MFUXNGPR.js → DataTable-MPBSXUC6.js} +5 -6
  3. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  4. package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
  5. package/dist/{chunk-CKNY7HYS.js → chunk-2ARQW6VX.js} +3 -3
  6. package/dist/{chunk-T2MQY57J.js → chunk-6JILXFEA.js} +335 -5
  7. package/dist/chunk-6JILXFEA.js.map +1 -0
  8. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  9. package/dist/chunk-6RBH67W7.js.map +1 -0
  10. package/dist/{chunk-C7GUF747.js → chunk-FJTAWPAQ.js} +3 -5
  11. package/dist/{chunk-C7GUF747.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  12. package/dist/{chunk-4HQ5BOVZ.js → chunk-NO5QHMDX.js} +7 -6
  13. package/dist/chunk-NO5QHMDX.js.map +1 -0
  14. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  15. package/dist/chunk-O3NWNXDY.js.map +1 -0
  16. package/dist/{chunk-BTCA3ENN.js → chunk-Q2UP3ZWQ.js} +4 -4
  17. package/dist/{chunk-QVEOQVD4.js → chunk-RVYGJPOD.js} +173 -20
  18. package/dist/chunk-RVYGJPOD.js.map +1 -0
  19. package/dist/{chunk-FVDOEGGG.js → chunk-UCMHBF7Y.js} +3 -5
  20. package/dist/{chunk-FVDOEGGG.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  21. package/dist/{chunk-T6HVDA24.js → chunk-V3QO3LL7.js} +5 -7
  22. package/dist/chunk-V3QO3LL7.js.map +1 -0
  23. package/dist/{chunk-ZB6AEA7I.js → chunk-ZXJGZLLO.js} +17 -17
  24. package/dist/{chunk-ZB6AEA7I.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  25. package/dist/components.d.ts +2 -2
  26. package/dist/components.js +8 -9
  27. package/dist/components.js.map +1 -1
  28. package/dist/hooks.d.ts +1 -1
  29. package/dist/hooks.js +9 -6
  30. package/dist/hooks.js.map +1 -1
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.js +16 -16
  33. package/dist/index.js.map +1 -1
  34. package/dist/providers.d.ts +1 -1
  35. package/dist/providers.js +5 -7
  36. package/dist/rbac/index.js +5 -6
  37. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  38. package/dist/utils.d.ts +4 -1
  39. package/dist/utils.js +3 -3
  40. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  41. package/docs/README.md +22 -10
  42. package/docs/api/README.md +26 -0
  43. package/docs/api/classes/ColumnFactory.md +1 -1
  44. package/docs/api/classes/ErrorBoundary.md +1 -1
  45. package/docs/api/classes/InvalidScopeError.md +1 -1
  46. package/docs/api/classes/MissingUserContextError.md +1 -1
  47. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  48. package/docs/api/classes/PermissionDeniedError.md +1 -1
  49. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  50. package/docs/api/classes/RBACAuditManager.md +1 -1
  51. package/docs/api/classes/RBACCache.md +1 -1
  52. package/docs/api/classes/RBACEngine.md +1 -1
  53. package/docs/api/classes/RBACError.md +1 -1
  54. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  55. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  56. package/docs/api/classes/StorageUtils.md +1 -1
  57. package/docs/api/interfaces/AggregateConfig.md +1 -1
  58. package/docs/api/interfaces/ButtonProps.md +1 -1
  59. package/docs/api/interfaces/CardProps.md +1 -1
  60. package/docs/api/interfaces/ColorPalette.md +1 -1
  61. package/docs/api/interfaces/ColorShade.md +1 -1
  62. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  63. package/docs/api/interfaces/DataTableAction.md +1 -1
  64. package/docs/api/interfaces/DataTableColumn.md +1 -1
  65. package/docs/api/interfaces/DataTableProps.md +1 -1
  66. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  67. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  68. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  69. package/docs/api/interfaces/EventContextType.md +1 -1
  70. package/docs/api/interfaces/EventLogoProps.md +1 -1
  71. package/docs/api/interfaces/EventProviderProps.md +1 -1
  72. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  73. package/docs/api/interfaces/FileUploadProps.md +1 -1
  74. package/docs/api/interfaces/FooterProps.md +1 -1
  75. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  76. package/docs/api/interfaces/InputProps.md +1 -1
  77. package/docs/api/interfaces/LabelProps.md +1 -1
  78. package/docs/api/interfaces/LoginFormProps.md +1 -1
  79. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  80. package/docs/api/interfaces/NavigationContextType.md +1 -1
  81. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  82. package/docs/api/interfaces/NavigationItem.md +1 -1
  83. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  84. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  85. package/docs/api/interfaces/Organisation.md +1 -1
  86. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  87. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  88. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  89. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  90. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  91. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  92. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  93. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  94. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  95. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  96. package/docs/api/interfaces/PaletteData.md +1 -1
  97. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  98. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  99. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  100. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  101. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  102. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  103. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  104. package/docs/api/interfaces/RBACConfig.md +1 -1
  105. package/docs/api/interfaces/RBACContextType.md +1 -1
  106. package/docs/api/interfaces/RBACLogger.md +1 -1
  107. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  108. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  109. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  110. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  111. package/docs/api/interfaces/RouteConfig.md +1 -1
  112. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  113. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  114. package/docs/api/interfaces/StorageConfig.md +1 -1
  115. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  116. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  117. package/docs/api/interfaces/StorageListOptions.md +1 -1
  118. package/docs/api/interfaces/StorageListResult.md +1 -1
  119. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  120. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  121. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  122. package/docs/api/interfaces/StyleImport.md +1 -1
  123. package/docs/api/interfaces/SwitchProps.md +1 -1
  124. package/docs/api/interfaces/ToastActionElement.md +1 -1
  125. package/docs/api/interfaces/ToastProps.md +1 -1
  126. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  127. package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
  128. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  129. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  131. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  132. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  133. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  134. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  135. package/docs/api/interfaces/UserEventAccess.md +1 -1
  136. package/docs/api/interfaces/UserMenuProps.md +1 -1
  137. package/docs/api/interfaces/UserProfile.md +1 -1
  138. package/docs/api/modules.md +39 -14
  139. package/docs/api-reference/providers.md +16 -7
  140. package/docs/architecture/services.md +374 -0
  141. package/docs/best-practices/README.md +1 -1
  142. package/docs/best-practices/testing.md +1 -1
  143. package/docs/breaking-changes.md +182 -0
  144. package/docs/common-patterns.md +445 -0
  145. package/docs/core-concepts/authentication.md +26 -11
  146. package/docs/core-concepts/events.md +2 -0
  147. package/docs/core-concepts/organisations.md +2 -0
  148. package/docs/core-concepts/permissions.md +2 -0
  149. package/docs/{INDEX.md → documentation-index.md} +26 -38
  150. package/docs/faq.md +286 -0
  151. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  152. package/docs/getting-started/installation-guide.md +284 -0
  153. package/docs/getting-started/quick-start.md +8 -1
  154. package/docs/implementation-guides/app-layout.md +3 -1
  155. package/docs/implementation-guides/data-tables.md +2 -0
  156. package/docs/implementation-guides/dynamic-colors.md +47 -2
  157. package/docs/implementation-guides/event-theming-summary.md +220 -0
  158. package/docs/implementation-guides/forms.md +9 -7
  159. package/docs/implementation-guides/navigation.md +2 -0
  160. package/docs/migration/service-architecture.md +351 -0
  161. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
  162. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  163. package/docs/rbac/README.md +1 -1
  164. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  165. package/docs/rbac/quick-start.md +2 -0
  166. package/docs/rbac/rbac-rls-integration.md +2 -2
  167. package/docs/security/README.md +5 -1
  168. package/docs/style-guide.md +136 -1
  169. package/docs/testing/README.md +1 -1
  170. package/docs/troubleshooting/authentication-issues.md +334 -0
  171. package/docs/troubleshooting/common-issues.md +2 -0
  172. package/docs/troubleshooting/styling-issues.md +199 -144
  173. package/docs/usage.md +23 -2
  174. package/package.json +1 -1
  175. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  176. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  177. package/src/__tests__/fixtures/test-data.ts +90 -0
  178. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  179. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  180. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  181. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  182. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  183. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  184. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  185. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  186. package/src/__tests__/helpers/test-providers.tsx +329 -0
  187. package/src/__tests__/helpers/test-utils.tsx +91 -45
  188. package/src/__tests__/helpers/timer-utils.ts +71 -0
  189. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  190. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  191. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  192. package/src/__tests__/setup.ts +34 -28
  193. package/src/components/Alert/Alert.test.tsx +1 -5
  194. package/src/components/Avatar/Avatar.test.tsx +1 -5
  195. package/src/components/Button/Button.test.tsx +4 -20
  196. package/src/components/Card/Card.test.tsx +1 -5
  197. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  198. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  199. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  200. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  201. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  202. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  203. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  204. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  205. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  206. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  207. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  208. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  209. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  210. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  212. package/src/components/Footer/Footer.test.tsx +1 -5
  213. package/src/components/Form/Form.test.tsx +22 -35
  214. package/src/components/Header/Header.test.tsx +1 -9
  215. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  216. package/src/components/Input/Input.test.tsx +2 -10
  217. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  218. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  219. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  220. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  221. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  222. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  223. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  224. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  225. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  226. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  227. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  228. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  229. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  230. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  231. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  232. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  233. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  234. package/src/components/Select/Select.bug-test.tsx +69 -0
  235. package/src/components/Select/Select.refactored.tsx +497 -0
  236. package/src/components/Select/Select.test.tsx +42 -49
  237. package/src/components/Select/Select.tsx +5 -2
  238. package/src/components/Select/hooks.ts +254 -0
  239. package/src/components/Switch/Switch.test.tsx +1 -5
  240. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  241. package/src/components/Toast/Toast.test.tsx +15 -8
  242. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  243. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  244. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  245. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  246. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  247. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  248. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  249. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  250. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  251. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  252. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  253. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  254. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  255. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  256. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  257. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  258. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  259. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  260. package/src/hooks/index.ts +3 -0
  261. package/src/hooks/public/usePublicEvent.ts +181 -13
  262. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  263. package/src/hooks/services/useAuth.ts +50 -0
  264. package/src/hooks/services/useAuthService.ts +30 -0
  265. package/src/hooks/services/useCurrentEvent.ts +36 -0
  266. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  267. package/src/hooks/services/useEventService.ts +30 -0
  268. package/src/hooks/services/useInactivityService.ts +30 -0
  269. package/src/hooks/services/useOrganisationService.ts +30 -0
  270. package/src/hooks/services/usePermissions.ts +70 -0
  271. package/src/hooks/services/useRBACService.ts +30 -0
  272. package/src/hooks/useCounter.test.ts +1 -5
  273. package/src/hooks/useEventTheme.ts +86 -0
  274. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  275. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  276. package/src/hooks/usePermissionCache.test.ts +1 -5
  277. package/src/hooks/usePermissionCheck.ts +150 -0
  278. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  279. package/src/index.ts +1 -0
  280. package/src/providers/OrganisationProvider.test.tsx +1 -5
  281. package/src/providers/OrganisationProvider.tsx +56 -4
  282. package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
  283. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  284. package/src/providers/UnifiedAuthProvider.tsx +4 -4
  285. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  286. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  287. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  288. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  289. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  290. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  291. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  292. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  293. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  294. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  295. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  296. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  297. package/src/providers/services/EventServiceProvider.tsx +83 -0
  298. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  299. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  300. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  301. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  302. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  303. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  304. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  305. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  306. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  307. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  308. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  309. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  310. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  311. package/src/rbac/api.test.ts +1 -9
  312. package/src/rbac/cache.test.ts +10 -8
  313. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  314. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  315. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  316. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  317. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  318. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  319. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  320. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  321. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  322. package/src/rbac/config.test.ts +1 -5
  323. package/src/rbac/hooks/useCan.test.ts +262 -9
  324. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  325. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  326. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  327. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  328. package/src/services/AuthService.ts +416 -0
  329. package/src/services/EventService.ts +366 -0
  330. package/src/services/InactivityService.ts +388 -0
  331. package/src/services/OrganisationService.ts +592 -0
  332. package/src/services/RBACService.ts +522 -0
  333. package/src/services/__tests__/AuthService.test.ts +356 -0
  334. package/src/services/__tests__/BaseService.test.ts +314 -0
  335. package/src/services/__tests__/EventService.test.ts +489 -0
  336. package/src/services/__tests__/InactivityService.test.ts +403 -0
  337. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  338. package/src/services/__tests__/RBACService.test.ts +492 -0
  339. package/src/services/base/BaseService.ts +87 -0
  340. package/src/services/interfaces/IAuthService.ts +39 -0
  341. package/src/services/interfaces/IEventService.ts +30 -0
  342. package/src/services/interfaces/IInactivityService.ts +31 -0
  343. package/src/services/interfaces/IOrganisationService.ts +41 -0
  344. package/src/services/interfaces/IRBACService.ts +62 -0
  345. package/src/theming/__tests__/runtime.test.ts +540 -0
  346. package/src/types/__tests__/file-reference.test.ts +447 -0
  347. package/src/types/__tests__/organisation.test.ts +1133 -0
  348. package/src/types/__tests__/theme.test.ts +830 -0
  349. package/src/types/__tests__/type-validation.test.ts +527 -0
  350. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  351. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  352. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  353. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  354. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  355. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  356. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  357. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  358. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  359. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  360. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  361. package/src/utils/appIdResolver.test.ts +6 -10
  362. package/src/utils/appNameResolver.simple.test.ts +142 -0
  363. package/src/utils/appNameResolver.test.ts +31 -458
  364. package/src/utils/appNameResolver.test.ts.backup +494 -0
  365. package/src/utils/debugLogger.ts +26 -5
  366. package/src/utils/formatDate.test.ts +1 -5
  367. package/src/utils/organisationContext.test.ts +1 -5
  368. package/src/utils/performanceBudgets.ts +3 -4
  369. package/src/utils/secureDataAccess.test.ts +1 -5
  370. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  371. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  372. package/dist/chunk-4HQ5BOVZ.js.map +0 -1
  373. package/dist/chunk-D7ARGIA3.js.map +0 -1
  374. package/dist/chunk-QVEOQVD4.js.map +0 -1
  375. package/dist/chunk-T2MQY57J.js.map +0 -1
  376. package/dist/chunk-T6HVDA24.js.map +0 -1
  377. package/dist/chunk-VTJ5HCZB.js +0 -315
  378. package/dist/chunk-VTJ5HCZB.js.map +0 -1
  379. package/dist/chunk-ZPK5656W.js.map +0 -1
  380. package/docs/getting-started/installation.md +0 -269
  381. package/src/__tests__/REBUILD_PLAN.md +0 -223
  382. /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  383. /package/dist/{chunk-CKNY7HYS.js.map → chunk-2ARQW6VX.js.map} +0 -0
  384. /package/dist/{chunk-BTCA3ENN.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
package/README.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  Clean, modern React component library with Tailwind v4 styling and native utilities.
4
4
 
5
+ ## ⚠️ Breaking Changes
6
+
7
+ ### Version 0.5.65+ - Mandatory Inactivity Timeouts
8
+
9
+ The `UnifiedAuthProvider` now requires mandatory inactivity timeout configuration for security:
10
+
11
+ ```tsx
12
+ // ❌ Before (will cause TypeScript errors)
13
+ <UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
14
+ <AppContent />
15
+ </UnifiedAuthProvider>
16
+
17
+ // ✅ After (required configuration)
18
+ <UnifiedAuthProvider
19
+ supabaseClient={supabase}
20
+ appName="my-app"
21
+ idleTimeoutMs={30 * 60 * 1000} // Required
22
+ warnBeforeMs={5 * 60 * 1000} // Required
23
+ onIdleLogout={() => navigate('/login')} // Required
24
+ >
25
+ <AppContent />
26
+ </UnifiedAuthProvider>
27
+ ```
28
+
29
+ [📖 Migration Guide](./docs/migration-guides/unified-auth-provider-mandatory-timeouts.md)
30
+
5
31
  ## 🚀 PaceAppLayout Usage
6
32
 
7
33
  **PaceAppLayout uses React Router's nested routing pattern for optimal performance and scalability.**
@@ -32,11 +32,10 @@ import {
32
32
  useDataTableContext,
33
33
  usePluginRegistry,
34
34
  useStateManager
35
- } from "./chunk-4HQ5BOVZ.js";
36
- import "./chunk-C7GUF747.js";
35
+ } from "./chunk-NO5QHMDX.js";
36
+ import "./chunk-FJTAWPAQ.js";
37
37
  import "./chunk-NHR52QAQ.js";
38
38
  import "./chunk-B2WTCLCV.js";
39
- import "./chunk-VTJ5HCZB.js";
40
39
  import {
41
40
  DataChunkManager,
42
41
  SearchIndex,
@@ -48,10 +47,10 @@ import {
48
47
  throttle,
49
48
  useDataTablePerformance
50
49
  } from "./chunk-YNUBMSMV.js";
51
- import "./chunk-T2MQY57J.js";
50
+ import "./chunk-6JILXFEA.js";
52
51
  import "./chunk-ULBI5JGB.js";
53
52
  import "./chunk-5BSLGBYI.js";
54
- import "./chunk-D7ARGIA3.js";
53
+ import "./chunk-6RBH67W7.js";
55
54
  import "./chunk-PLDDJCW6.js";
56
55
  export {
57
56
  ActionButtons,
@@ -97,4 +96,4 @@ export {
97
96
  usePluginRegistry,
98
97
  useStateManager
99
98
  };
100
- //# sourceMappingURL=DataTable-MFUXNGPR.js.map
99
+ //# sourceMappingURL=DataTable-MPBSXUC6.js.map
@@ -3139,7 +3139,7 @@ declare function usePublicPageContext$1(): {
3139
3139
 
3140
3140
  interface PublicPageHeaderProps {
3141
3141
  /** The event data for this public page */
3142
- event: Event;
3142
+ event?: Event;
3143
3143
  /** The event code for this public page */
3144
3144
  eventCode: string;
3145
3145
  /** Optional page title */
@@ -85,9 +85,9 @@ interface UnifiedAuthProviderProps {
85
85
  enablePersistence?: boolean;
86
86
  requireOrganisationContext?: boolean;
87
87
  enableRBAC?: boolean;
88
- idleTimeoutMs?: number;
89
- warnBeforeMs?: number;
90
- onIdleLogout?: (reason: 'inactivity') => void;
88
+ idleTimeoutMs: number;
89
+ warnBeforeMs: number;
90
+ onIdleLogout: (reason: 'inactivity') => void;
91
91
  renderInactivityWarning?: (args: {
92
92
  timeRemaining: number;
93
93
  onStaySignedIn: () => void;
@@ -3,11 +3,11 @@ import {
3
3
  init_UnifiedAuthProvider,
4
4
  useOrganisations,
5
5
  useUnifiedAuth
6
- } from "./chunk-T2MQY57J.js";
6
+ } from "./chunk-6JILXFEA.js";
7
7
  import {
8
8
  init_organisationContext,
9
9
  setOrganisationContext
10
- } from "./chunk-D7ARGIA3.js";
10
+ } from "./chunk-6RBH67W7.js";
11
11
 
12
12
  // src/hooks/useSecureDataAccess.ts
13
13
  init_UnifiedAuthProvider();
@@ -380,4 +380,4 @@ function useSecureDataAccess() {
380
380
  export {
381
381
  useSecureDataAccess
382
382
  };
383
- //# sourceMappingURL=chunk-CKNY7HYS.js.map
383
+ //# sourceMappingURL=chunk-2ARQW6VX.js.map
@@ -9,7 +9,7 @@ import {
9
9
  init_debugLogger,
10
10
  init_organisationContext,
11
11
  setOrganisationContext
12
- } from "./chunk-D7ARGIA3.js";
12
+ } from "./chunk-6RBH67W7.js";
13
13
  import {
14
14
  __commonJS,
15
15
  __esm,
@@ -7304,6 +7304,7 @@ function OrganisationProvider({ children }) {
7304
7304
  const isLoadingRef = useRef2(false);
7305
7305
  const lastLoadTimeRef = useRef2(0);
7306
7306
  const hasFailedRef = useRef2(false);
7307
+ const abortControllerRef = useRef2(null);
7307
7308
  const { user, session, supabase, signOut } = useUnifiedAuth();
7308
7309
  let navigate = null;
7309
7310
  try {
@@ -7368,6 +7369,11 @@ function OrganisationProvider({ children }) {
7368
7369
  console.log("OrganisationProvider", "Too soon since last load, skipping");
7369
7370
  return;
7370
7371
  }
7372
+ if (abortControllerRef.current) {
7373
+ abortControllerRef.current.abort();
7374
+ }
7375
+ abortControllerRef.current = new AbortController();
7376
+ const abortSignal = abortControllerRef.current.signal;
7371
7377
  lastLoadTimeRef.current = now;
7372
7378
  isLoadingRef.current = true;
7373
7379
  setIsLoading(true);
@@ -7383,12 +7389,19 @@ function OrganisationProvider({ children }) {
7383
7389
  try {
7384
7390
  console.log("[OrganisationProvider] Making RPC call to data_user_organisation_roles_get...");
7385
7391
  const timeoutPromise = new Promise((_, reject) => {
7386
- setTimeout(() => reject(new Error("RPC call timeout after 10 seconds")), 1e4);
7392
+ const timeoutId = setTimeout(() => reject(new Error("RPC call timeout after 10 seconds")), 1e4);
7393
+ abortSignal.addEventListener("abort", () => {
7394
+ clearTimeout(timeoutId);
7395
+ reject(new Error("Request aborted"));
7396
+ });
7387
7397
  });
7388
7398
  const rpcPromise = supabase.rpc("data_user_organisation_roles_get", {
7389
7399
  p_user_id: user.id,
7390
7400
  p_organisation_id: null
7391
7401
  });
7402
+ if (abortSignal.aborted) {
7403
+ throw new Error("Request aborted");
7404
+ }
7392
7405
  const result = await Promise.race([rpcPromise, timeoutPromise]);
7393
7406
  console.log("[OrganisationProvider] RPC call completed:", {
7394
7407
  hasData: !!result.data,
@@ -7408,6 +7421,9 @@ function OrganisationProvider({ children }) {
7408
7421
  if (membershipError.message?.includes("timeout")) {
7409
7422
  console.log("[OrganisationProvider] RPC timed out, trying direct database query as fallback...");
7410
7423
  try {
7424
+ if (abortSignal.aborted) {
7425
+ throw new Error("Request aborted");
7426
+ }
7411
7427
  const { data: fallbackData, error: fallbackError } = await supabase.from("rbac_organisation_roles").select(`
7412
7428
  id,
7413
7429
  user_id,
@@ -7537,6 +7553,9 @@ function OrganisationProvider({ children }) {
7537
7553
  lengths: { original: finalOrganisationIds.length, safe: safeOrganisationIds.length }
7538
7554
  });
7539
7555
  console.log("[OrganisationProvider] Using direct table query with manual filtering");
7556
+ if (abortSignal.aborted) {
7557
+ throw new Error("Request aborted");
7558
+ }
7540
7559
  const { data: allOrganisations, error: orgError } = await supabase.from("organisations").select("id, name, display_name, subscription_tier, settings, is_active, parent_id, created_at, updated_at");
7541
7560
  if (orgError) {
7542
7561
  console.error("[OrganisationProvider] Error loading organisations:", orgError);
@@ -7616,6 +7635,7 @@ function OrganisationProvider({ children }) {
7616
7635
  } finally {
7617
7636
  isLoadingRef.current = false;
7618
7637
  setIsLoading(false);
7638
+ abortControllerRef.current = null;
7619
7639
  }
7620
7640
  }, [user, session, supabase, clearAllCachedData]);
7621
7641
  useEffect7(() => {
@@ -7626,6 +7646,10 @@ function OrganisationProvider({ children }) {
7626
7646
  setIsLoading(false);
7627
7647
  return;
7628
7648
  }
7649
+ if (retryCount > 0 && Date.now() - lastLoadTimeRef.current < 5e3) {
7650
+ console.log("[OrganisationProvider] Circuit breaker active - too soon since last attempt");
7651
+ return;
7652
+ }
7629
7653
  console.log("[OrganisationProvider] Authentication stable, loading organizations... (retry:", retryCount, ")");
7630
7654
  loadUserOrganisations();
7631
7655
  } else if (!user && !session) {
@@ -7642,7 +7666,18 @@ function OrganisationProvider({ children }) {
7642
7666
  localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7643
7667
  localStorage.removeItem(STORAGE_KEYS2.ORGANISATION_CONTEXT);
7644
7668
  }
7645
- }, [user, session, supabase, isLoading, retryCount]);
7669
+ }, [user, session, supabase, loadUserOrganisations]);
7670
+ useEffect7(() => {
7671
+ return () => {
7672
+ isLoadingRef.current = false;
7673
+ hasFailedRef.current = false;
7674
+ lastLoadTimeRef.current = 0;
7675
+ if (abortControllerRef.current) {
7676
+ abortControllerRef.current.abort();
7677
+ abortControllerRef.current = null;
7678
+ }
7679
+ };
7680
+ }, []);
7646
7681
  const handleLogoutAndRedirect = useCallback7(async () => {
7647
7682
  try {
7648
7683
  await signOut();
@@ -7835,6 +7870,297 @@ var init_OrganisationProvider = __esm({
7835
7870
  }
7836
7871
  });
7837
7872
 
7873
+ // src/providers/EventProvider.tsx
7874
+ var EventProvider_exports = {};
7875
+ __export(EventProvider_exports, {
7876
+ EventProvider: () => EventProvider,
7877
+ useEvents: () => useEvents
7878
+ });
7879
+ import {
7880
+ createContext as createContext6,
7881
+ useContext as useContext6,
7882
+ useState as useState8,
7883
+ useEffect as useEffect8,
7884
+ useLayoutEffect,
7885
+ useCallback as useCallback8,
7886
+ useRef as useRef3,
7887
+ useMemo as useMemo7
7888
+ } from "react";
7889
+ import { jsx as jsx10 } from "react/jsx-runtime";
7890
+ function getNextEventByDate(events) {
7891
+ if (!events || events.length === 0) {
7892
+ return null;
7893
+ }
7894
+ const now = /* @__PURE__ */ new Date();
7895
+ const futureEvents = events.filter((event) => {
7896
+ if (!event.event_date) return false;
7897
+ const eventDate = new Date(event.event_date);
7898
+ return eventDate >= now;
7899
+ });
7900
+ if (futureEvents.length === 0) {
7901
+ return null;
7902
+ }
7903
+ const sortedFutureEvents = futureEvents.sort((a, b) => {
7904
+ const dateA = new Date(a.event_date);
7905
+ const dateB = new Date(b.event_date);
7906
+ return dateA.getTime() - dateB.getTime();
7907
+ });
7908
+ return sortedFutureEvents[0];
7909
+ }
7910
+ function EventProvider({ children }) {
7911
+ const [events, setEvents] = useState8([]);
7912
+ const [selectedEvent, setSelectedEventState] = useState8(null);
7913
+ const [isLoading, setIsLoading] = useState8(true);
7914
+ const [error, setError] = useState8(null);
7915
+ const { user, session, supabase, appName, setSelectedEventId } = useUnifiedAuth();
7916
+ const isInitializedRef = useRef3(false);
7917
+ const isFetchingRef = useRef3(false);
7918
+ const hasAutoSelectedRef = useRef3(false);
7919
+ const userClearedEventRef = useRef3(false);
7920
+ const setSelectedEventIdRef = useRef3(setSelectedEventId);
7921
+ let selectedOrganisation = null;
7922
+ let ensureOrganisationContext = null;
7923
+ try {
7924
+ const orgContext = useOrganisations();
7925
+ selectedOrganisation = orgContext.selectedOrganisation;
7926
+ ensureOrganisationContext = orgContext.ensureOrganisationContext;
7927
+ } catch (error2) {
7928
+ console.warn("[EventProvider] Organisation context not available:", error2);
7929
+ }
7930
+ const loadPersistedEvent = useCallback8(async (events2) => {
7931
+ try {
7932
+ let persistedEventId = sessionStorage.getItem("pace-core-selected-event");
7933
+ if (!persistedEventId) {
7934
+ persistedEventId = localStorage.getItem("pace-core-selected-event");
7935
+ if (persistedEventId) {
7936
+ sessionStorage.setItem("pace-core-selected-event", persistedEventId);
7937
+ }
7938
+ }
7939
+ if (persistedEventId && events2.length > 0) {
7940
+ const persistedEvent = events2.find((event) => event.event_id === persistedEventId);
7941
+ if (persistedEvent) {
7942
+ DebugLogger.log("EventProvider", "Restoring persisted event:", persistedEvent.event_name);
7943
+ setSelectedEventState(persistedEvent);
7944
+ setSelectedEventId(persistedEventId);
7945
+ return true;
7946
+ } else {
7947
+ DebugLogger.log("EventProvider", "Persisted event not found in current events, clearing storage");
7948
+ sessionStorage.removeItem("pace-core-selected-event");
7949
+ localStorage.removeItem("pace-core-selected-event");
7950
+ }
7951
+ }
7952
+ } catch (error2) {
7953
+ console.warn("[EventProvider] Failed to load persisted event:", error2);
7954
+ }
7955
+ return false;
7956
+ }, [setSelectedEventId]);
7957
+ const persistEventSelection = useCallback8((eventId) => {
7958
+ try {
7959
+ sessionStorage.setItem("pace-core-selected-event", eventId);
7960
+ localStorage.setItem("pace-core-selected-event", eventId);
7961
+ } catch (error2) {
7962
+ console.warn("[EventProvider] Failed to persist event selection:", error2);
7963
+ }
7964
+ }, []);
7965
+ const autoSelectNextEvent = useCallback8((events2) => {
7966
+ const nextEvent = getNextEventByDate(events2);
7967
+ if (nextEvent) {
7968
+ DebugLogger.log("EventProvider", "Auto-selecting next event:", nextEvent.event_name);
7969
+ setSelectedEventState(nextEvent);
7970
+ setSelectedEventId(nextEvent.event_id);
7971
+ persistEventSelection(nextEvent.event_id);
7972
+ }
7973
+ }, [setSelectedEventId, persistEventSelection]);
7974
+ const fetchEvents = useCallback8(async () => {
7975
+ if (!user || !session || !supabase || !appName || !selectedOrganisation) {
7976
+ DebugLogger.log("EventProvider", "Missing required dependencies, skipping fetch");
7977
+ setIsLoading(false);
7978
+ return;
7979
+ }
7980
+ if (isFetchingRef.current) {
7981
+ DebugLogger.log("EventProvider", "Already fetching events, skipping");
7982
+ return;
7983
+ }
7984
+ DebugLogger.log("EventProvider", "User and organisation found, fetching events for:", {
7985
+ userId: user.id,
7986
+ appName,
7987
+ organisationId: selectedOrganisation.id,
7988
+ organisationName: selectedOrganisation.display_name
7989
+ });
7990
+ isFetchingRef.current = true;
7991
+ let isMounted = true;
7992
+ try {
7993
+ if (ensureOrganisationContext) {
7994
+ await ensureOrganisationContext();
7995
+ await setOrganisationContext(supabase, selectedOrganisation.id);
7996
+ }
7997
+ DebugLogger.log("EventProvider", "Calling data_user_events_get RPC with:", {
7998
+ user_id: user.id,
7999
+ organisation_id: selectedOrganisation.id,
8000
+ app_name: appName
8001
+ });
8002
+ const { data, error: rpcError } = await supabase.rpc("data_user_events_get", {
8003
+ p_user_id: user.id,
8004
+ p_organisation_id: selectedOrganisation.id,
8005
+ p_app_name: appName
8006
+ });
8007
+ DebugLogger.log("EventProvider", "RPC response:", {
8008
+ data,
8009
+ error: rpcError,
8010
+ dataLength: data?.length || 0,
8011
+ organisationId: selectedOrganisation.id
8012
+ });
8013
+ if (rpcError) {
8014
+ throw new Error(rpcError.message || "Failed to fetch events");
8015
+ }
8016
+ if (isMounted) {
8017
+ const eventsData = data || [];
8018
+ console.log("[EventProvider] Loaded events:", eventsData.map((event) => ({
8019
+ eventId: event.event_id,
8020
+ eventName: event.event_name,
8021
+ organisationId: event.organisation_id,
8022
+ selectedOrganisationId: selectedOrganisation?.id
8023
+ })));
8024
+ const transformedEvents = eventsData.map((event) => ({
8025
+ id: event.event_id,
8026
+ // Use event_id as the primary id
8027
+ event_id: event.event_id,
8028
+ event_name: event.event_name,
8029
+ event_date: event.event_date,
8030
+ event_venue: event.event_venue,
8031
+ event_participants: event.event_participants,
8032
+ event_colours: event.event_colours,
8033
+ event_logo: "",
8034
+ // No logo field in event table
8035
+ organisation_id: event.organisation_id,
8036
+ is_visible: event.is_visible,
8037
+ // Legacy compatibility
8038
+ name: event.event_name,
8039
+ start_date: event.event_date
8040
+ }));
8041
+ setEvents(transformedEvents);
8042
+ setError(null);
8043
+ hasAutoSelectedRef.current = false;
8044
+ const persistedEventLoaded = await loadPersistedEvent(transformedEvents);
8045
+ if (!persistedEventLoaded) {
8046
+ const nextEvent = getNextEventByDate(transformedEvents);
8047
+ if (nextEvent) {
8048
+ DebugLogger.log("EventProvider", "Auto-selecting next event after no persisted event found:", nextEvent.event_name);
8049
+ hasAutoSelectedRef.current = true;
8050
+ setSelectedEventState(nextEvent);
8051
+ setSelectedEventIdRef.current(nextEvent.event_id);
8052
+ persistEventSelection(nextEvent.event_id);
8053
+ }
8054
+ }
8055
+ }
8056
+ } catch (err) {
8057
+ console.error("[EventProvider] Error fetching events:", err);
8058
+ const _error = err instanceof Error ? err : new Error("Unknown error occurred");
8059
+ if (isMounted) {
8060
+ setError(_error);
8061
+ setEvents([]);
8062
+ }
8063
+ } finally {
8064
+ if (isMounted) {
8065
+ setIsLoading(false);
8066
+ }
8067
+ isFetchingRef.current = false;
8068
+ }
8069
+ return () => {
8070
+ isMounted = false;
8071
+ };
8072
+ }, [user, session, supabase, appName, selectedOrganisation, ensureOrganisationContext, loadPersistedEvent, autoSelectNextEvent]);
8073
+ useEffect8(() => {
8074
+ if (!isInitializedRef.current) {
8075
+ isInitializedRef.current = true;
8076
+ fetchEvents();
8077
+ }
8078
+ }, [fetchEvents]);
8079
+ useEffect8(() => {
8080
+ setSelectedEventIdRef.current = setSelectedEventId;
8081
+ }, [setSelectedEventId]);
8082
+ useLayoutEffect(() => {
8083
+ if (events.length > 0 && !selectedEvent && !hasAutoSelectedRef.current && !userClearedEventRef.current) {
8084
+ const nextEvent = getNextEventByDate(events);
8085
+ if (nextEvent) {
8086
+ DebugLogger.log("EventProvider", "Auto-selecting next event:", nextEvent.event_name);
8087
+ hasAutoSelectedRef.current = true;
8088
+ setSelectedEventState(nextEvent);
8089
+ setSelectedEventIdRef.current(nextEvent.event_id);
8090
+ persistEventSelection(nextEvent.event_id);
8091
+ }
8092
+ }
8093
+ }, [events, selectedEvent]);
8094
+ const setSelectedEvent = useCallback8((event) => {
8095
+ if (event) {
8096
+ try {
8097
+ console.log("[EventProvider] Event selection validation:", {
8098
+ eventId: event.event_id,
8099
+ eventName: event.event_name,
8100
+ eventOrganisationId: event.organisation_id,
8101
+ selectedOrganisationId: selectedOrganisation?.id,
8102
+ selectedOrganisationName: selectedOrganisation?.display_name,
8103
+ match: event.organisation_id === selectedOrganisation?.id
8104
+ });
8105
+ if (selectedOrganisation && event.organisation_id !== selectedOrganisation.id) {
8106
+ console.error("[EventProvider] Event organisation_id does not match selected organisation", {
8107
+ eventOrganisationId: event.organisation_id,
8108
+ selectedOrganisationId: selectedOrganisation.id,
8109
+ eventName: event.event_name
8110
+ });
8111
+ return;
8112
+ }
8113
+ } catch (error2) {
8114
+ console.error("[EventProvider] Error during event validation:", error2);
8115
+ }
8116
+ setSelectedEventState(event);
8117
+ setSelectedEventId(event.event_id);
8118
+ persistEventSelection(event.event_id);
8119
+ userClearedEventRef.current = false;
8120
+ } else {
8121
+ setSelectedEventState(null);
8122
+ setSelectedEventId(null);
8123
+ sessionStorage.removeItem("pace-core-selected-event");
8124
+ localStorage.removeItem("pace-core-selected-event");
8125
+ hasAutoSelectedRef.current = false;
8126
+ userClearedEventRef.current = true;
8127
+ }
8128
+ }, [selectedOrganisation, setSelectedEventId, persistEventSelection]);
8129
+ const refreshEvents = useCallback8(async () => {
8130
+ isInitializedRef.current = false;
8131
+ isFetchingRef.current = false;
8132
+ userClearedEventRef.current = false;
8133
+ await fetchEvents();
8134
+ }, [fetchEvents]);
8135
+ const contextValue = useMemo7(() => ({
8136
+ events,
8137
+ selectedEvent,
8138
+ isLoading,
8139
+ error,
8140
+ setSelectedEvent,
8141
+ refreshEvents
8142
+ }), [events, selectedEvent, isLoading, error, setSelectedEvent, refreshEvents]);
8143
+ return /* @__PURE__ */ jsx10(EventContext.Provider, { value: contextValue, children });
8144
+ }
8145
+ var EventContext, useEvents;
8146
+ var init_EventProvider = __esm({
8147
+ "src/providers/EventProvider.tsx"() {
8148
+ "use strict";
8149
+ init_UnifiedAuthProvider();
8150
+ init_OrganisationProvider();
8151
+ init_organisationContext();
8152
+ init_debugLogger();
8153
+ EventContext = createContext6(void 0);
8154
+ useEvents = () => {
8155
+ const context = useContext6(EventContext);
8156
+ if (context === void 0) {
8157
+ throw new Error("useEvents must be used within an EventProvider");
8158
+ }
8159
+ return context;
8160
+ };
8161
+ }
8162
+ });
8163
+
7838
8164
  export {
7839
8165
  AuthProvider,
7840
8166
  useAuth,
@@ -7877,7 +8203,11 @@ export {
7877
8203
  OrganisationProvider,
7878
8204
  useOrganisations,
7879
8205
  OrganisationProvider_exports,
7880
- init_OrganisationProvider
8206
+ init_OrganisationProvider,
8207
+ useEvents,
8208
+ EventProvider,
8209
+ EventProvider_exports,
8210
+ init_EventProvider
7881
8211
  };
7882
8212
  /*! Bundled license information:
7883
8213
 
@@ -7891,4 +8221,4 @@ lodash/lodash.js:
7891
8221
  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
7892
8222
  *)
7893
8223
  */
7894
- //# sourceMappingURL=chunk-T2MQY57J.js.map
8224
+ //# sourceMappingURL=chunk-6JILXFEA.js.map