@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.
- package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
- package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
- package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
- package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
- package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
- package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
- package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
- package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
- package/dist/chunk-22WKWKRX.js.map +1 -0
- package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
- package/dist/chunk-4C7EXCAR.js.map +1 -0
- package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
- package/dist/chunk-56XJ3TU6.js.map +1 -0
- package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
- package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
- package/dist/chunk-7QCC6MCP.js.map +1 -0
- package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
- package/dist/chunk-ANBQRTPX.js.map +1 -0
- package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
- package/dist/chunk-BCIBECNB.js.map +1 -0
- package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
- package/dist/chunk-BESYRHQM.js.map +1 -0
- package/dist/chunk-BJPBT3CU.js +21 -0
- package/dist/chunk-BJPBT3CU.js.map +1 -0
- package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
- package/dist/chunk-BLCXZEYF.js.map +1 -0
- package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
- package/dist/chunk-BVYWGZVV.js.map +1 -0
- package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
- package/dist/chunk-ERISIBYU.js.map +1 -0
- package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
- package/dist/chunk-HAWZXGR2.js.map +1 -0
- package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
- package/dist/chunk-JISYG63F.js +70 -0
- package/dist/chunk-JISYG63F.js.map +1 -0
- package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
- package/dist/chunk-KYRHUBIU.js.map +1 -0
- package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
- package/dist/chunk-LS353YLY.js.map +1 -0
- package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
- package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
- package/dist/chunk-OWAG3GSU.js +58 -0
- package/dist/chunk-OWAG3GSU.js.map +1 -0
- package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
- package/dist/chunk-Q5QRDWKI.js.map +1 -0
- package/dist/chunk-S5OFRT4M.js +94 -0
- package/dist/chunk-S5OFRT4M.js.map +1 -0
- package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
- package/dist/chunk-SBVILCCA.js.map +1 -0
- package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
- package/dist/chunk-T6JN6LH6.js.map +1 -0
- package/dist/chunk-XDNLUEXI.js +138 -0
- package/dist/chunk-XDNLUEXI.js.map +1 -0
- package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
- package/dist/chunk-YCWDTTUK.js.map +1 -0
- package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
- package/dist/chunk-ZZ2SS7NI.js.map +1 -0
- package/dist/components.d.ts +7 -287
- package/dist/components.js +27 -157
- package/dist/components.js.map +1 -1
- package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
- package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
- package/dist/hooks.d.ts +3 -3
- package/dist/hooks.js +21 -16
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +101 -9
- package/dist/index.js +44 -31
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/rbac/index.js +12 -12
- package/dist/schema-DTDZQe2u.d.ts +28 -0
- package/dist/styles/index.js +2 -1
- package/dist/theming/runtime.d.ts +2 -19
- package/dist/theming/runtime.js +2 -1
- package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
- package/dist/types.d.ts +153 -4
- package/dist/types.js +51 -16
- package/dist/types.js.map +1 -1
- package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
- package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
- package/dist/utils.d.ts +221 -173
- package/dist/utils.js +185 -225
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +24 -115
- package/dist/validation.js +19 -474
- package/dist/validation.js.map +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +6 -6
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +6 -6
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +7 -7
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/BadgeProps.md +27 -0
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +29 -4
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +18 -18
- package/docs/api/interfaces/DataTableColumn.md +61 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +15 -15
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
- package/docs/api/interfaces/NavigationContextType.md +9 -9
- package/docs/api/interfaces/NavigationGuardProps.md +10 -10
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +7 -7
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +4 -4
- package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
- package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
- package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +10 -10
- package/docs/api/interfaces/RouteConfig.md +10 -10
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UserEventAccess.md +11 -11
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +591 -220
- package/docs/api-reference/components.md +106 -26
- package/docs/architecture/README.md +0 -3
- package/docs/implementation-guides/data-tables.md +277 -13
- package/docs/implementation-guides/forms.md +1 -16
- package/docs/implementation-guides/permission-enforcement.md +8 -2
- package/docs/styles/README.md +0 -2
- package/examples/README.md +30 -14
- package/examples/STRUCTURE.md +125 -0
- package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
- package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
- package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
- package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
- package/examples/components 2/DataTable/index.ts +13 -0
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
- package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
- package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
- package/examples/components 2/Dialog/index.ts +15 -0
- package/examples/components 2/index.ts +11 -0
- package/examples/features/index.ts +12 -0
- package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
- package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
- package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
- package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
- package/examples/features/public-pages/index.ts +14 -0
- package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
- package/examples/features/rbac/EventBasedApp.tsx +239 -0
- package/examples/features/rbac/PermissionExample.tsx +151 -0
- package/examples/features/rbac/index.ts +13 -0
- package/examples/index.ts +11 -3
- package/package.json +30 -19
- package/src/__tests__/TEST_STANDARD.md +92 -0
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Avatar/Avatar.tsx +1 -1
- package/src/components/Badge/Badge.test.tsx +314 -0
- package/src/components/Badge/Badge.tsx +304 -0
- package/src/components/Badge/index.ts +3 -0
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Checkbox/Checkbox.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/DataTable.tsx +1 -30
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
- package/src/components/DataTable/__tests__/styles.test.ts +3 -3
- package/src/components/DataTable/components/ActionButtons.tsx +0 -15
- package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +4 -185
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
- package/src/components/DataTable/components/DataTableModals.tsx +1 -27
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +9 -3
- package/src/components/DataTable/components/ImportModal.tsx +2 -14
- package/src/components/DataTable/components/PaginationControls.tsx +2 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
- package/src/components/DataTable/index.ts +4 -0
- package/src/components/DataTable/styles.ts +28 -7
- package/src/components/DataTable/types.ts +13 -0
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
- package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
- package/src/components/DataTable/utils/columnUtils.ts +40 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.ts +1 -11
- package/src/components/DataTable/utils/index.ts +2 -0
- package/src/components/DataTable/utils/paginationUtils.ts +1 -1
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
- package/src/components/EventSelector/EventSelector.tsx +3 -2
- package/src/components/FileDisplay/FileDisplay.tsx +2 -36
- package/src/components/FileUpload/FileUpload.test.tsx +2 -2
- package/src/components/FileUpload/FileUpload.tsx +2 -2
- package/src/components/Footer/Footer.test.tsx +1 -1
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +5 -510
- package/src/components/Form/Form.tsx +1 -1
- package/src/components/Form/FormField.tsx +1 -1
- package/src/components/Form/index.ts +0 -12
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +1 -1
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
- package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
- package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
- package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
- package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
- package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
- package/src/components/PublicLayout/index.ts +4 -2
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +21 -9
- package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
- package/src/components/SessionRestorationLoader/index.ts +3 -0
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Table/__tests__/Table.test.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/index.ts +7 -10
- package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
- package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
- package/src/hooks/public/usePublicEvent.ts +7 -6
- package/src/hooks/public/usePublicEventLogo.ts +7 -4
- package/src/hooks/public/usePublicFileDisplay.ts +6 -150
- package/src/hooks/useComponentPerformance.ts +4 -1
- package/src/hooks/useDataTablePerformance.ts +4 -3
- package/src/hooks/useEventTheme.test.ts +18 -5
- package/src/hooks/useEventTheme.ts +4 -1
- package/src/hooks/useEvents.ts +2 -0
- package/src/hooks/useFileDisplay.ts +9 -8
- package/src/hooks/useFileReference.ts +4 -1
- package/src/hooks/useFileUrl.ts +4 -1
- package/src/hooks/useInactivityTracker.ts +5 -4
- package/src/hooks/useOrganisationSecurity.test.ts +33 -12
- package/src/hooks/useOrganisationSecurity.ts +8 -7
- package/src/hooks/usePerformanceMonitor.ts +6 -3
- package/src/hooks/usePermissionCache.ts +13 -6
- package/src/hooks/useSecureDataAccess.test.ts +2 -2
- package/src/hooks/useSecureDataAccess.ts +9 -8
- package/src/hooks/useSessionRestoration.ts +4 -1
- package/src/hooks/useStorage.ts +4 -1
- package/src/index.ts +20 -7
- package/src/providers/services/AuthServiceProvider.tsx +3 -2
- package/src/providers/services/EventServiceProvider.tsx +2 -1
- package/src/providers/services/InactivityServiceProvider.tsx +2 -1
- package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
- package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
- package/src/rbac/api.ts +5 -2
- package/src/rbac/audit-enhanced.ts +6 -6
- package/src/rbac/audit.test.ts +60 -38
- package/src/rbac/audit.ts +8 -8
- package/src/rbac/cache-invalidation.ts +7 -4
- package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
- package/src/rbac/components/NavigationGuard.tsx +7 -3
- package/src/rbac/components/NavigationProvider.tsx +6 -3
- package/src/rbac/components/PagePermissionGuard.tsx +28 -16
- package/src/rbac/components/PagePermissionProvider.tsx +4 -1
- package/src/rbac/components/PermissionEnforcer.tsx +9 -3
- package/src/rbac/components/RoleBasedRouter.tsx +3 -1
- package/src/rbac/components/SecureDataProvider.tsx +7 -3
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
- package/src/rbac/engine.ts +15 -7
- package/src/rbac/hooks/usePermissions.ts +7 -3
- package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
- package/src/rbac/hooks/useResolvedScope.ts +10 -7
- package/src/rbac/permissions.ts +5 -2
- package/src/rbac/security.test.ts +27 -16
- package/src/rbac/security.ts +5 -4
- package/src/services/AuthService.ts +22 -21
- package/src/services/EventService.ts +12 -12
- package/src/services/InactivityService.ts +5 -4
- package/src/services/OrganisationService.ts +26 -25
- package/src/services/__tests__/AuthService.test.ts +51 -19
- package/src/services/__tests__/EventService.test.ts +37 -5
- package/src/services/__tests__/InactivityService.test.ts +38 -4
- package/src/services/__tests__/OrganisationService.test.ts +3 -8
- package/src/services/base/BaseService.ts +3 -1
- package/src/styles/core.css +3 -0
- package/src/theming/__tests__/runtime.test.ts +21 -12
- package/src/theming/parseEventColours.ts +5 -19
- package/src/theming/runtime.ts +8 -4
- package/src/types/validation.ts +2 -29
- package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
- package/src/utils/__tests__/audit.unit.test.ts +1 -1
- package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
- package/src/utils/__tests__/cn.unit.test.ts +1 -1
- package/src/utils/__tests__/debugLogger.test.ts +1 -1
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/formatting.unit.test.ts +1 -1
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
- package/src/utils/__tests__/logger.unit.test.ts +1 -1
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
- package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
- package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
- package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
- package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
- package/src/utils/__tests__/security.unit.test.ts +40 -18
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
- package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
- package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
- package/src/utils/app/appConfig.ts +47 -0
- package/src/utils/app/appIdResolver.test.ts +497 -0
- package/src/utils/app/appIdResolver.ts +133 -0
- package/src/utils/app/appNameResolver.simple.test.ts +212 -0
- package/src/utils/app/appNameResolver.test.ts +121 -0
- package/src/utils/app/appNameResolver.ts +195 -0
- package/src/utils/audit/audit.ts +127 -0
- package/src/utils/context/organisationContext.test.ts +322 -0
- package/src/utils/context/organisationContext.ts +156 -0
- package/src/utils/context/sessionTracking.ts +125 -0
- package/src/utils/core/cn.ts +7 -0
- package/src/utils/core/debugLogger.ts +67 -0
- package/src/utils/core/logger.ts +181 -0
- package/src/utils/device/deviceFingerprint.ts +215 -0
- package/src/utils/dynamic/dynamicUtils.ts +105 -0
- package/src/utils/dynamic/lazyLoad.tsx +44 -0
- package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
- package/src/utils/file-reference/index.ts +501 -0
- package/src/utils/formatting/formatDate.test.ts +237 -0
- package/src/utils/formatting/formatting.ts +133 -0
- package/src/utils/index.ts +39 -54
- package/src/utils/performance/bundleAnalysis.ts +129 -0
- package/src/utils/performance/performanceBenchmark.ts +64 -0
- package/src/utils/performance/performanceBudgets.ts +110 -0
- package/src/utils/permissions/permissionTypes.ts +37 -0
- package/src/utils/permissions/permissionUtils.test.ts +393 -0
- package/src/utils/permissions/permissionUtils.ts +34 -0
- package/src/utils/security/auth-utils.ts +96 -0
- package/src/utils/security/secureDataAccess.test.ts +711 -0
- package/src/utils/security/secureDataAccess.ts +377 -0
- package/src/utils/security/secureErrors.ts +82 -0
- package/src/utils/security/secureStorage.ts +244 -0
- package/src/utils/security/security.ts +159 -0
- package/src/utils/security/securityMonitor.ts +45 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
- package/src/utils/storage/helpers.ts +15 -8
- package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
- package/src/{validation → utils/validation}/csrf.ts +1 -1
- package/src/utils/validation/htmlSanitization.ts +184 -0
- package/src/utils/validation/index.ts +79 -0
- package/src/utils/validation/sanitization.ts +333 -0
- package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
- package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
- package/src/utils/validation/validation.ts +111 -0
- package/src/utils/validation/validationUtils.ts +123 -0
- package/src/validation/index.ts +3 -34
- package/dist/chunk-24MKLB7U.js +0 -81
- package/dist/chunk-24MKLB7U.js.map +0 -1
- package/dist/chunk-3CG5L6RN.js.map +0 -1
- package/dist/chunk-3DBFLLLU.js.map +0 -1
- package/dist/chunk-5F3NDPJV.js.map +0 -1
- package/dist/chunk-66C4BSAY.js.map +0 -1
- package/dist/chunk-BDZUMRBD.js +0 -87
- package/dist/chunk-BDZUMRBD.js.map +0 -1
- package/dist/chunk-BYXRHAIF.js.map +0 -1
- package/dist/chunk-CDQ3PX7L.js +0 -18
- package/dist/chunk-CDQ3PX7L.js.map +0 -1
- package/dist/chunk-CQZU6TFE.js.map +0 -1
- package/dist/chunk-F64FFPOZ.js.map +0 -1
- package/dist/chunk-GEVIB2UB.js.map +0 -1
- package/dist/chunk-GKHF54DI.js.map +0 -1
- package/dist/chunk-GVDR7WNV.js.map +0 -1
- package/dist/chunk-HMNOSGVA.js.map +0 -1
- package/dist/chunk-JCQZ6LA7.js.map +0 -1
- package/dist/chunk-M6DDYFUD.js.map +0 -1
- package/dist/chunk-O3NWNXDY.js.map +0 -1
- package/dist/chunk-PYUXFQJ3.js.map +0 -1
- package/dist/chunk-UJI6WSMD.js.map +0 -1
- package/dist/chunk-VZ5OR6HD.js.map +0 -1
- package/dist/chunk-WP5I5GLN.js.map +0 -1
- package/dist/chunk-ZYZCRSBD.js.map +0 -1
- package/dist/validation-DnhrNMju.d.ts +0 -159
- package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -365
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
- package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
- package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
- package/src/validation/__tests__/user.unit.test.ts +0 -440
- package/src/validation/sanitization.ts +0 -96
- /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
- /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
- /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
- /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
- /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
- /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
- /package/src/{validation → utils/validation}/common.ts +0 -0
- /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
280
|
-
|
|
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
|
-
|
|
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
|
package/src/hooks/useEvents.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
277
|
+
logger.debug('useFileDisplay', 'Generated signed URL:', url ? 'URL generated' : 'URL generation failed');
|
|
277
278
|
}
|
|
278
|
-
|
|
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
|
-
|
|
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
|
-
|
|
428
|
+
log.error(`Failed to load URL for file ${fileRef.id}:`, err);
|
|
426
429
|
}
|
|
427
430
|
}
|
|
428
431
|
|
package/src/hooks/useFileUrl.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
306
|
+
logger.warn('PermissionCache', 'Invalid permissions array', { permissions });
|
|
303
307
|
return [];
|
|
304
308
|
}
|
|
305
309
|
|
|
306
310
|
if (!user?.id || !scope.organisationId) {
|
|
307
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
+
log.warn('Session restoration timed out');
|
|
42
45
|
setHasTimedOut(true);
|
|
43
46
|
}, SESSION_RESTORATION_TIMEOUT_MS);
|
|
44
47
|
} else {
|