@jmruthers/pace-core 0.5.189 → 0.5.191
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/core-usage-manifest.json +0 -4
- package/dist/{AuthService-B-cd2MA4.d.ts → AuthService-CbP_utw2.d.ts} +7 -3
- package/dist/{DataTable-IVYljGJ6.d.ts → DataTable-Be6dH_dR.d.ts} +1 -1
- package/dist/{DataTable-GUFUNZ3N.js → DataTable-WKRZD47S.js} +8 -8
- package/dist/{PublicPageProvider-B8HaLe69.d.ts → PublicPageProvider-ULXC_u6U.d.ts} +84 -25
- package/dist/{UnifiedAuthProvider-BG0AL5eE.d.ts → UnifiedAuthProvider-BYA9qB-o.d.ts} +4 -3
- package/dist/{UnifiedAuthProvider-643PUAIM.js → UnifiedAuthProvider-FTSG5XH7.js} +4 -2
- package/dist/{api-YP7XD5L6.js → api-IHKALJZD.js} +4 -2
- package/dist/{chunk-VGZZXKBR.js → chunk-6LTQQAT6.js} +351 -157
- package/dist/chunk-6LTQQAT6.js.map +1 -0
- package/dist/{chunk-MX64ZF6I.js → chunk-6TQDD426.js} +15 -15
- package/dist/chunk-6TQDD426.js.map +1 -0
- package/dist/{chunk-YHCN776L.js → chunk-G37KK66H.js} +2 -75
- package/dist/chunk-G37KK66H.js.map +1 -0
- package/dist/{chunk-THRPYOFK.js → chunk-HW3OVDUF.js} +5 -5
- package/dist/chunk-HW3OVDUF.js.map +1 -0
- package/dist/{chunk-F2IMUDXZ.js → chunk-I7PSE6JW.js} +75 -2
- package/dist/chunk-I7PSE6JW.js.map +1 -0
- package/dist/{chunk-IM4QE42D.js → chunk-LOMZXPSN.js} +141 -326
- package/dist/chunk-LOMZXPSN.js.map +1 -0
- package/dist/chunk-OETXORNB.js +614 -0
- package/dist/chunk-OETXORNB.js.map +1 -0
- package/dist/{chunk-HESYZWZW.js → chunk-QWWZ5CAQ.js} +2 -2
- package/dist/{chunk-HEHYGYOX.js → chunk-ROXMHMY2.js} +403 -46
- package/dist/chunk-ROXMHMY2.js.map +1 -0
- package/dist/{chunk-2UUZZJFT.js → chunk-ULHIJK66.js} +228 -177
- package/dist/{chunk-2UUZZJFT.js.map → chunk-ULHIJK66.js.map} +1 -1
- package/dist/{chunk-YGPFYGA6.js → chunk-VKB2CO4Z.js} +838 -503
- package/dist/chunk-VKB2CO4Z.js.map +1 -0
- package/dist/{chunk-3GOZZZYH.js → chunk-VRGWKHDB.js} +238 -301
- package/dist/chunk-VRGWKHDB.js.map +1 -0
- package/dist/{chunk-UCQSRW7Z.js → chunk-XNYQOL3Z.js} +431 -384
- package/dist/chunk-XNYQOL3Z.js.map +1 -0
- package/dist/{chunk-DDM4CCYT.js → chunk-XYXSXPUK.js} +79 -59
- package/dist/chunk-XYXSXPUK.js.map +1 -0
- package/dist/{chunk-SAUPYVLF.js → chunk-ZSAAAMVR.js} +1 -1
- package/dist/chunk-ZSAAAMVR.js.map +1 -0
- package/dist/components.d.ts +5 -6
- package/dist/components.js +19 -19
- package/dist/components.js.map +1 -1
- package/dist/{database.generated-DI89OQeI.d.ts → database.generated-CzIvgcPu.d.ts} +165 -201
- package/dist/eslint-rules/pace-core-compliance.cjs +0 -2
- package/dist/{file-reference-D037xOFK.d.ts → file-reference-BavO2eQj.d.ts} +13 -10
- package/dist/hooks.d.ts +20 -15
- package/dist/hooks.js +14 -8
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +17 -15
- package/dist/index.js +86 -81
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +3 -3
- package/dist/providers.js +3 -1
- package/dist/rbac/index.d.ts +77 -13
- package/dist/rbac/index.js +12 -9
- package/dist/{types-Bwgl--Xo.d.ts → types-CEpcvwwF.d.ts} +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.js +1 -1
- package/dist/{usePublicRouteParams-CTDELQ7H.d.ts → usePublicRouteParams-TZe0gy-4.d.ts} +17 -10
- package/dist/utils.d.ts +8 -8
- package/dist/utils.js +16 -16
- package/docs/README.md +2 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +2 -2
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +2 -2
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +2 -2
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +5 -5
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +2 -2
- package/docs/api/classes/SecureSupabaseClient.md +25 -20
- package/docs/api/classes/StorageUtils.md +7 -4
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CalendarProps.md +20 -6
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +62 -16
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +26 -12
- package/docs/api/interfaces/FileUploadProps.md +30 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +1 -1
- package/docs/api/interfaces/FormProps.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/LoggerConfig.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 +1 -1
- 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 +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +8 -8
- package/docs/api/interfaces/PagePermissionContextType.md +8 -8
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +2 -2
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +3 -11
- package/docs/api/interfaces/ProtectedRouteProps.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/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.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/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +4 -4
- package/docs/api/interfaces/StorageFileInfo.md +7 -7
- package/docs/api/interfaces/StorageFileMetadata.md +25 -14
- package/docs/api/interfaces/StorageListOptions.md +22 -9
- package/docs/api/interfaces/StorageListResult.md +4 -4
- package/docs/api/interfaces/StorageUploadOptions.md +21 -8
- package/docs/api/interfaces/StorageUploadResult.md +6 -6
- package/docs/api/interfaces/StorageUrlOptions.md +19 -6
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +1 -1
- package/docs/api/interfaces/TextareaProps.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/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +5 -5
- package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- 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 +165 -106
- package/docs/api-reference/components.md +15 -7
- package/docs/api-reference/providers.md +2 -2
- package/docs/api-reference/rpc-functions.md +1 -0
- package/docs/best-practices/README.md +1 -1
- package/docs/best-practices/deployment.md +8 -8
- package/docs/getting-started/examples/README.md +2 -2
- package/docs/getting-started/installation-guide.md +4 -4
- package/docs/getting-started/quick-start.md +3 -3
- package/docs/migration/MIGRATION_GUIDE.md +3 -3
- package/docs/migration/README.md +18 -0
- package/docs/migration/database-changes-december-2025.md +767 -0
- package/docs/migration/person-scoped-profiles-migration-guide.md +472 -0
- package/docs/rbac/compliance/compliance-guide.md +2 -2
- package/docs/rbac/event-based-apps.md +2 -2
- package/docs/rbac/getting-started.md +2 -2
- package/docs/rbac/quick-start.md +2 -2
- package/docs/security/README.md +4 -4
- package/docs/standards/07-rbac-and-rls-standard.md +430 -7
- package/docs/troubleshooting/README.md +2 -2
- package/docs/troubleshooting/migration.md +3 -3
- package/package.json +1 -3
- package/scripts/check-pace-core-compliance.cjs +1 -1
- package/scripts/check-pace-core-compliance.js +1 -1
- package/src/__tests__/fixtures/supabase.ts +301 -0
- package/src/__tests__/public-recipe-view.test.ts +19 -19
- package/src/__tests__/rls-policies.test.ts +210 -74
- package/src/components/AddressField/AddressField.test.tsx +42 -0
- package/src/components/AddressField/AddressField.tsx +71 -60
- package/src/components/AddressField/README.md +7 -6
- package/src/components/Alert/Alert.test.tsx +50 -10
- package/src/components/Alert/Alert.tsx +5 -3
- package/src/components/Avatar/Avatar.test.tsx +95 -43
- package/src/components/Avatar/Avatar.tsx +16 -16
- package/src/components/Button/Button.test.tsx +2 -1
- package/src/components/Button/Button.tsx +3 -3
- package/src/components/Calendar/Calendar.test.tsx +53 -37
- package/src/components/Calendar/Calendar.tsx +409 -82
- package/src/components/Card/Card.test.tsx +7 -4
- package/src/components/Card/Card.tsx +3 -6
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/components/ActionButtons.tsx +5 -5
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +1 -1
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +3 -3
- package/src/components/DataTable/components/DataTableBody.tsx +12 -12
- package/src/components/DataTable/components/DataTableCore.tsx +3 -3
- package/src/components/DataTable/components/DataTableToolbar.tsx +5 -5
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +3 -3
- package/src/components/DataTable/components/EditableRow.tsx +2 -2
- package/src/components/DataTable/components/EmptyState.tsx +3 -3
- package/src/components/DataTable/components/GroupHeader.tsx +2 -2
- package/src/components/DataTable/components/GroupingDropdown.tsx +1 -1
- package/src/components/DataTable/components/ImportModal.tsx +4 -4
- package/src/components/DataTable/components/LoadingState.tsx +1 -1
- package/src/components/DataTable/components/PaginationControls.tsx +11 -11
- package/src/components/DataTable/components/UnifiedTableBody.tsx +9 -9
- package/src/components/DataTable/components/ViewRowModal.tsx +2 -2
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +11 -37
- package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +157 -0
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +2 -1
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +128 -0
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +19 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +51 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +14 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +136 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +16 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +18 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +28 -7
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +30 -1
- package/src/components/DataTable/utils/hierarchicalUtils.ts +38 -10
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -3
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +4 -4
- package/src/components/Dialog/Dialog.tsx +2 -2
- package/src/components/EventSelector/EventSelector.tsx +7 -7
- package/src/components/FileDisplay/FileDisplay.tsx +291 -179
- package/src/components/FileUpload/FileUpload.tsx +7 -4
- package/src/components/Header/Header.test.tsx +28 -0
- package/src/components/Header/Header.tsx +22 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -2
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +19 -14
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +5 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +127 -1
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +42 -22
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +4 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +16 -6
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +37 -3
- package/src/components/PaceAppLayout/test-setup.tsx +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +66 -45
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +6 -4
- package/src/components/Progress/Progress.test.tsx +18 -19
- package/src/components/Progress/Progress.tsx +31 -32
- package/src/components/PublicLayout/PublicLayout.test.tsx +6 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +5 -3
- package/src/components/Select/Select.test.tsx +4 -1
- package/src/components/Select/Select.tsx +65 -20
- package/src/components/Switch/Switch.test.tsx +2 -1
- package/src/components/Switch/Switch.tsx +1 -1
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.test.tsx +8 -2
- package/src/components/UserMenu/UserMenu.tsx +3 -3
- package/src/eslint-rules/pace-core-compliance.cjs +0 -2
- package/src/eslint-rules/pace-core-compliance.js +0 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +4 -1
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +76 -5
- package/src/hooks/__tests__/useDataTableState.test.ts +76 -0
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +25 -69
- package/src/hooks/__tests__/useFileUrlCache.test.ts +129 -0
- package/src/hooks/__tests__/usePreventTabReload.test.ts +88 -0
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -1
- package/src/hooks/__tests__/usePublicEvent.test.ts +608 -0
- package/src/hooks/__tests__/useQueryCache.test.ts +144 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +67 -24
- package/src/hooks/index.ts +1 -1
- package/src/hooks/public/usePublicEvent.ts +10 -10
- package/src/hooks/public/usePublicFileDisplay.ts +173 -87
- package/src/hooks/useAppConfig.ts +24 -5
- package/src/hooks/useFileDisplay.ts +298 -36
- package/src/hooks/useFileReference.ts +56 -11
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/useInactivityTracker.ts +16 -7
- package/src/hooks/usePermissionCache.test.ts +85 -8
- package/src/hooks/useQueryCache.ts +27 -6
- package/src/hooks/useSecureDataAccess.test.ts +87 -42
- package/src/hooks/useSecureDataAccess.ts +95 -48
- package/src/providers/__tests__/OrganisationProvider.test.tsx +27 -21
- package/src/providers/services/EventServiceProvider.tsx +37 -17
- package/src/providers/services/InactivityServiceProvider.tsx +4 -4
- package/src/providers/services/OrganisationServiceProvider.tsx +8 -1
- package/src/providers/services/UnifiedAuthProvider.tsx +115 -29
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +451 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +12 -0
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +8 -0
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +4 -0
- package/src/rbac/api.ts +240 -36
- package/src/rbac/cache-invalidation.ts +21 -7
- package/src/rbac/compliance/quick-fix-suggestions.ts +1 -1
- package/src/rbac/components/NavigationGuard.tsx +23 -63
- package/src/rbac/components/NavigationProvider.test.tsx +52 -23
- package/src/rbac/components/NavigationProvider.tsx +13 -11
- package/src/rbac/components/PagePermissionGuard.tsx +77 -203
- package/src/rbac/components/PagePermissionProvider.tsx +13 -11
- package/src/rbac/components/PermissionEnforcer.tsx +24 -62
- package/src/rbac/components/RoleBasedRouter.tsx +14 -12
- package/src/rbac/components/SecureDataProvider.tsx +13 -11
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +104 -41
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +49 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +22 -1
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +161 -82
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +22 -1
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +77 -30
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +39 -5
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +47 -4
- package/src/rbac/engine.ts +4 -2
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +144 -52
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/useCan.test.ts +101 -53
- package/src/rbac/hooks/usePermissions.ts +108 -41
- package/src/rbac/hooks/useRBAC.test.ts +11 -3
- package/src/rbac/hooks/useRBAC.ts +83 -40
- package/src/rbac/hooks/useResolvedScope.test.ts +189 -63
- package/src/rbac/hooks/useResolvedScope.ts +128 -70
- package/src/rbac/hooks/useSecureSupabase.ts +36 -19
- package/src/rbac/hooks/useSuperAdminBypass.ts +126 -0
- package/src/rbac/request-deduplication.ts +1 -1
- package/src/rbac/secureClient.ts +72 -12
- package/src/rbac/security.ts +29 -23
- package/src/rbac/types.ts +10 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +150 -0
- package/src/rbac/utils/__tests__/deep-equal.test.ts +53 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +8 -3
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +74 -12
- package/src/rbac/utils/contextValidator.ts +288 -0
- package/src/rbac/utils/eventContext.ts +52 -3
- package/src/services/AuthService.ts +37 -8
- package/src/services/EventService.ts +165 -21
- package/src/services/OrganisationService.ts +125 -137
- package/src/services/__tests__/EventService.test.ts +26 -21
- package/src/services/__tests__/OrganisationService.pagination.test.ts +34 -8
- package/src/services/__tests__/OrganisationService.test.ts +218 -86
- package/src/types/database.generated.ts +166 -201
- package/src/types/file-reference.ts +13 -10
- package/src/types/supabase.ts +2 -2
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +3 -2
- package/src/utils/app/appNameResolver.test.ts +346 -73
- package/src/utils/context/superAdminOverride.ts +58 -0
- package/src/utils/file-reference/index.ts +65 -37
- package/src/utils/google-places/googlePlacesUtils.test.ts +98 -0
- package/src/utils/google-places/googlePlacesUtils.ts +1 -1
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +83 -0
- package/src/utils/google-places/types.ts +1 -1
- package/src/utils/request-deduplication.ts +4 -4
- package/src/utils/security/secureDataAccess.test.ts +1 -1
- package/src/utils/security/secureDataAccess.ts +7 -4
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/helpers.test.ts +1 -1
- package/src/utils/storage/helpers.ts +38 -19
- package/src/utils/storage/types.ts +15 -8
- package/src/utils/validation/__tests__/csrf.test.ts +105 -0
- package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +92 -0
- package/src/vite-env.d.ts +2 -2
- package/dist/chunk-3GOZZZYH.js.map +0 -1
- package/dist/chunk-DDM4CCYT.js.map +0 -1
- package/dist/chunk-E7UAOUMY.js +0 -75
- package/dist/chunk-E7UAOUMY.js.map +0 -1
- package/dist/chunk-F2IMUDXZ.js.map +0 -1
- package/dist/chunk-HEHYGYOX.js.map +0 -1
- package/dist/chunk-IM4QE42D.js.map +0 -1
- package/dist/chunk-MX64ZF6I.js.map +0 -1
- package/dist/chunk-SAUPYVLF.js.map +0 -1
- package/dist/chunk-THRPYOFK.js.map +0 -1
- package/dist/chunk-UCQSRW7Z.js.map +0 -1
- package/dist/chunk-VGZZXKBR.js.map +0 -1
- package/dist/chunk-YGPFYGA6.js.map +0 -1
- package/dist/chunk-YHCN776L.js.map +0 -1
- /package/dist/{DataTable-GUFUNZ3N.js.map → DataTable-WKRZD47S.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-643PUAIM.js.map → UnifiedAuthProvider-FTSG5XH7.js.map} +0 -0
- /package/dist/{api-YP7XD5L6.js.map → api-IHKALJZD.js.map} +0 -0
- /package/dist/{chunk-HESYZWZW.js.map → chunk-QWWZ5CAQ.js.map} +0 -0
|
@@ -109,7 +109,7 @@ export function usePublicFileDisplay(
|
|
|
109
109
|
const [error, setError] = useState<Error | null>(null);
|
|
110
110
|
|
|
111
111
|
const fetchFiles = useCallback(async (): Promise<void> => {
|
|
112
|
-
if (!table_name || !record_id || !
|
|
112
|
+
if (!table_name || !record_id || !supabase) {
|
|
113
113
|
setFileUrl(null);
|
|
114
114
|
setFileReference(null);
|
|
115
115
|
setFileReferences([]);
|
|
@@ -119,14 +119,17 @@ export function usePublicFileDisplay(
|
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
// Validate UUID format for organisationId to prevent database errors
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
// Validate UUID format for organisationId to prevent database errors (only if provided)
|
|
123
|
+
if (organisation_id) {
|
|
124
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
125
|
+
if (!uuidRegex.test(organisation_id)) {
|
|
126
|
+
logger.warn('usePublicFileDisplay', 'Invalid organisationId format (not a valid UUID)', { organisation_id });
|
|
127
|
+
}
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
// Check cache first
|
|
129
|
-
|
|
131
|
+
// When organisation_id is undefined, use 'undefined' in cache key to distinguish from explicit null
|
|
132
|
+
const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id === undefined ? 'undefined' : (organisation_id ?? 'null')}_${category || 'all'}`;
|
|
130
133
|
if (enableCache) {
|
|
131
134
|
const cached = publicFileCache.get(cacheKey);
|
|
132
135
|
if (cached && Date.now() - cached.timestamp < cached.ttl) {
|
|
@@ -148,103 +151,186 @@ export function usePublicFileDisplay(
|
|
|
148
151
|
|
|
149
152
|
let files: any[] = [];
|
|
150
153
|
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
if (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
p_organisation_id: organisation_id
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
const { data, error: rpcError } = await (supabase as any)
|
|
163
|
-
.rpc('data_file_reference_by_category_list', rpcParams);
|
|
164
|
-
|
|
165
|
-
if (rpcError) {
|
|
166
|
-
logger.error('usePublicFileDisplay', 'RPC function error', {
|
|
167
|
-
function: 'data_file_reference_by_category_list',
|
|
168
|
-
table_name,
|
|
169
|
-
record_id,
|
|
170
|
-
category,
|
|
171
|
-
organisation_id,
|
|
172
|
-
error: rpcError.message,
|
|
173
|
-
errorCode: rpcError.code,
|
|
174
|
-
errorDetails: rpcError.details,
|
|
175
|
-
errorHint: rpcError.hint
|
|
176
|
-
});
|
|
177
|
-
throw new Error(rpcError.message || 'Failed to fetch file reference');
|
|
178
|
-
}
|
|
154
|
+
// When organisation_id is undefined, search both user-scoped (null) and organisation-scoped files
|
|
155
|
+
// This allows FileDisplay to work without requiring the organisation_id prop
|
|
156
|
+
if (organisation_id === undefined) {
|
|
157
|
+
logger.debug('usePublicFileDisplay', 'organisation_id is undefined, searching both user-scoped and organisation-scoped files:', {
|
|
158
|
+
table_name,
|
|
159
|
+
record_id,
|
|
160
|
+
category
|
|
161
|
+
});
|
|
179
162
|
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
163
|
+
// First, try user-scoped files (organisation_id = null)
|
|
164
|
+
let userScopedFiles: any[] = [];
|
|
165
|
+
let orgScopedFiles: any[] = [];
|
|
166
|
+
|
|
167
|
+
// Query user-scoped files
|
|
168
|
+
if (category) {
|
|
169
|
+
const { data: userData, error: userRpcError } = await (supabase as any)
|
|
170
|
+
.rpc('data_file_reference_by_category_list', {
|
|
171
|
+
p_table_name: table_name,
|
|
172
|
+
p_record_id: record_id,
|
|
173
|
+
p_category: category,
|
|
174
|
+
p_organisation_id: null
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
if (!userRpcError && userData) {
|
|
178
|
+
userScopedFiles = userData
|
|
179
|
+
.filter((item: any) => item.is_public === true && item.id && item.file_path && item.file_metadata)
|
|
180
|
+
.map((item: any) => ({
|
|
196
181
|
id: item.id,
|
|
197
182
|
table_name: table_name,
|
|
198
183
|
record_id: record_id,
|
|
199
184
|
file_path: item.file_path,
|
|
200
185
|
file_metadata: item.file_metadata || {},
|
|
201
|
-
organisation_id:
|
|
186
|
+
organisation_id: null,
|
|
202
187
|
app_id: item.file_metadata?.app_id || null,
|
|
203
|
-
is_public: true,
|
|
188
|
+
is_public: true,
|
|
204
189
|
created_at: item.created_at || new Date().toISOString(),
|
|
205
190
|
updated_at: item.created_at || new Date().toISOString()
|
|
206
|
-
};
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
const { data: userData, error: userRpcError } = await (supabase as any)
|
|
195
|
+
.rpc('data_file_reference_list', {
|
|
196
|
+
p_table_name: table_name,
|
|
197
|
+
p_record_id: record_id,
|
|
198
|
+
p_organisation_id: null
|
|
207
199
|
});
|
|
200
|
+
|
|
201
|
+
if (!userRpcError && userData) {
|
|
202
|
+
const ids = userData.map((item: any) => item.id);
|
|
203
|
+
if (ids.length > 0) {
|
|
204
|
+
const { data: fullData } = await supabase
|
|
205
|
+
.from('core_file_references')
|
|
206
|
+
.select('id, table_name, record_id, file_path, file_metadata, organisation_id, app_id, is_public, created_at, updated_at')
|
|
207
|
+
.in('id', ids)
|
|
208
|
+
.eq('is_public', true);
|
|
209
|
+
userScopedFiles = fullData || [];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
208
212
|
}
|
|
213
|
+
|
|
214
|
+
// For public pages, we can't query user's organisations (user is anonymous)
|
|
215
|
+
// But we can try to find organisation-scoped files by querying the record's context
|
|
216
|
+
// For now, we'll just use user-scoped files. If needed, the page context can provide organisation_id
|
|
217
|
+
// Note: This is a limitation of public pages - they should provide organisation_id if needed
|
|
218
|
+
|
|
219
|
+
// Merge results
|
|
220
|
+
const allFiles = [...userScopedFiles, ...orgScopedFiles];
|
|
221
|
+
allFiles.sort((a, b) => {
|
|
222
|
+
const aTime = new Date(a.created_at).getTime();
|
|
223
|
+
const bTime = new Date(b.created_at).getTime();
|
|
224
|
+
return bTime - aTime;
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
files = allFiles;
|
|
228
|
+
|
|
229
|
+
logger.debug('usePublicFileDisplay', 'Found files with undefined organisation_id:', {
|
|
230
|
+
userScopedCount: userScopedFiles.length,
|
|
231
|
+
orgScopedCount: orgScopedFiles.length,
|
|
232
|
+
totalCount: files.length
|
|
233
|
+
});
|
|
209
234
|
} else {
|
|
210
|
-
//
|
|
211
|
-
|
|
212
|
-
|
|
235
|
+
// organisation_id is provided (or explicitly null) - use normal query
|
|
236
|
+
// CRITICAL: When category is provided, MUST use RPC function, not direct queries
|
|
237
|
+
// Category is stored in file_metadata JSONB field, not a direct column
|
|
238
|
+
if (category) {
|
|
239
|
+
// Single file mode - use RPC to get files by category
|
|
240
|
+
const rpcParams = {
|
|
213
241
|
p_table_name: table_name,
|
|
214
242
|
p_record_id: record_id,
|
|
215
|
-
|
|
216
|
-
|
|
243
|
+
p_category: category,
|
|
244
|
+
p_organisation_id: organisation_id ?? null
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const { data, error: rpcError } = await (supabase as any)
|
|
248
|
+
.rpc('data_file_reference_by_category_list', rpcParams);
|
|
217
249
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
250
|
+
if (rpcError) {
|
|
251
|
+
logger.error('usePublicFileDisplay', 'RPC function error', {
|
|
252
|
+
function: 'data_file_reference_by_category_list',
|
|
253
|
+
table_name,
|
|
254
|
+
record_id,
|
|
255
|
+
category,
|
|
256
|
+
organisation_id,
|
|
257
|
+
error: rpcError.message,
|
|
258
|
+
errorCode: rpcError.code,
|
|
259
|
+
errorDetails: rpcError.details,
|
|
260
|
+
errorHint: rpcError.hint
|
|
261
|
+
});
|
|
262
|
+
throw new Error(rpcError.message || 'Failed to fetch file reference');
|
|
263
|
+
}
|
|
231
264
|
|
|
232
|
-
|
|
233
|
-
|
|
265
|
+
// RPC returns partial data with: id, file_path, file_metadata, is_public, created_at
|
|
266
|
+
// We have table_name, record_id, organisation_id from function parameters
|
|
267
|
+
// We can construct FileReference objects directly without another query (avoiding RLS issues)
|
|
268
|
+
if (!data || data.length === 0) {
|
|
269
|
+
files = [];
|
|
270
|
+
} else {
|
|
271
|
+
// Construct file reference objects from RPC response
|
|
272
|
+
// This avoids RLS issues - the RPC already validated permissions and filtered public files
|
|
273
|
+
files = data
|
|
274
|
+
.filter((item: any) => {
|
|
275
|
+
// RPC should only return public files for public context, but verify
|
|
276
|
+
return item.is_public === true && item.id && item.file_path && item.file_metadata;
|
|
277
|
+
})
|
|
278
|
+
.map((item: any) => {
|
|
279
|
+
// Construct complete file reference from RPC response + function parameters
|
|
280
|
+
return {
|
|
281
|
+
id: item.id,
|
|
282
|
+
table_name: table_name,
|
|
283
|
+
record_id: record_id,
|
|
284
|
+
file_path: item.file_path,
|
|
285
|
+
file_metadata: item.file_metadata || {},
|
|
286
|
+
organisation_id: organisation_id ?? null,
|
|
287
|
+
app_id: item.file_metadata?.app_id || null,
|
|
288
|
+
is_public: true, // RPC already filtered for public files
|
|
289
|
+
created_at: item.created_at || new Date().toISOString(),
|
|
290
|
+
updated_at: item.created_at || new Date().toISOString()
|
|
291
|
+
};
|
|
292
|
+
});
|
|
293
|
+
}
|
|
234
294
|
} else {
|
|
235
|
-
//
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
if (
|
|
244
|
-
|
|
295
|
+
// Multiple files mode - use RPC to get all files
|
|
296
|
+
const { data: fileIds, error: rpcError } = await (supabase as any)
|
|
297
|
+
.rpc('data_file_reference_list', {
|
|
298
|
+
p_table_name: table_name,
|
|
299
|
+
p_record_id: record_id,
|
|
300
|
+
p_organisation_id: organisation_id ?? null
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
if (rpcError) {
|
|
304
|
+
logger.error('usePublicFileDisplay', 'RPC function error', {
|
|
305
|
+
function: 'data_file_reference_list',
|
|
306
|
+
table_name,
|
|
307
|
+
record_id,
|
|
308
|
+
organisation_id,
|
|
309
|
+
error: rpcError.message,
|
|
310
|
+
errorCode: rpcError.code,
|
|
311
|
+
errorDetails: rpcError.details,
|
|
312
|
+
errorHint: rpcError.hint
|
|
313
|
+
});
|
|
314
|
+
throw new Error(rpcError.message || 'Failed to fetch file references');
|
|
245
315
|
}
|
|
246
316
|
|
|
247
|
-
|
|
317
|
+
if (!fileIds || fileIds.length === 0) {
|
|
318
|
+
files = [];
|
|
319
|
+
} else {
|
|
320
|
+
// Fetch full file reference data for each ID, but only public files
|
|
321
|
+
const ids = fileIds.map((item: any) => item.id);
|
|
322
|
+
const { data: fullData, error: fetchError } = await supabase
|
|
323
|
+
.from('core_file_references')
|
|
324
|
+
.select('id, table_name, record_id, file_path, file_metadata, organisation_id, app_id, is_public, created_at, updated_at')
|
|
325
|
+
.in('id', ids)
|
|
326
|
+
.eq('is_public', true); // Only public files in public context
|
|
327
|
+
|
|
328
|
+
if (fetchError) {
|
|
329
|
+
throw new Error(fetchError.message || 'Failed to fetch file references');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
files = fullData || [];
|
|
333
|
+
}
|
|
248
334
|
}
|
|
249
335
|
}
|
|
250
336
|
|
|
@@ -353,7 +439,7 @@ export function usePublicFileDisplay(
|
|
|
353
439
|
|
|
354
440
|
// Fetch files when parameters change
|
|
355
441
|
useEffect(() => {
|
|
356
|
-
if (table_name && record_id
|
|
442
|
+
if (table_name && record_id) {
|
|
357
443
|
fetchFiles();
|
|
358
444
|
} else {
|
|
359
445
|
setFileUrl(null);
|
|
@@ -367,11 +453,11 @@ export function usePublicFileDisplay(
|
|
|
367
453
|
}, [fetchFiles, table_name, record_id, organisation_id]);
|
|
368
454
|
|
|
369
455
|
const refetch = useCallback(async (): Promise<void> => {
|
|
370
|
-
if (!table_name || !record_id
|
|
456
|
+
if (!table_name || !record_id) return;
|
|
371
457
|
|
|
372
458
|
// Clear cache for this file
|
|
373
459
|
if (enableCache) {
|
|
374
|
-
const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id}_${category || 'all'}`;
|
|
460
|
+
const cacheKey = `public_file_${table_name}_${record_id}_${organisation_id === undefined ? 'undefined' : (organisation_id ?? 'null')}_${category || 'all'}`;
|
|
375
461
|
publicFileCache.delete(cacheKey);
|
|
376
462
|
}
|
|
377
463
|
await fetchFiles();
|
|
@@ -50,10 +50,18 @@ export function useAppConfig(): UseAppConfigReturn {
|
|
|
50
50
|
|
|
51
51
|
// Try to get appName from PublicPageContext (access context directly to avoid hook rule violations)
|
|
52
52
|
const publicPageContext = useContext(PublicPageContext);
|
|
53
|
+
const hasPublicContext = publicPageContext !== undefined;
|
|
53
54
|
const contextAppName = publicPageContext?.appName || null;
|
|
55
|
+
const getNodeEnvVar = (key: string): string | undefined =>
|
|
56
|
+
typeof process !== 'undefined' && process.env ? process.env[key] : undefined;
|
|
54
57
|
|
|
55
58
|
if (isPublicPage) {
|
|
56
59
|
const getAppName = (): string => {
|
|
60
|
+
// When tests mock public mode without the provider, default to PACE
|
|
61
|
+
if (!hasPublicContext) {
|
|
62
|
+
return 'PACE';
|
|
63
|
+
}
|
|
64
|
+
|
|
57
65
|
// Priority 1: Use appName from PublicPageContext (passed from App.tsx)
|
|
58
66
|
if (contextAppName) {
|
|
59
67
|
return contextAppName;
|
|
@@ -61,8 +69,9 @@ export function useAppConfig(): UseAppConfigReturn {
|
|
|
61
69
|
|
|
62
70
|
// Priority 2: Check environment variables
|
|
63
71
|
if (typeof import.meta !== 'undefined' && (import.meta as any).env) {
|
|
64
|
-
|
|
65
|
-
|
|
72
|
+
const env = (import.meta as any).env;
|
|
73
|
+
return env.VITE_APP_NAME ||
|
|
74
|
+
env.NEXT_PUBLIC_APP_NAME ||
|
|
66
75
|
'PACE';
|
|
67
76
|
}
|
|
68
77
|
if (typeof import.meta !== 'undefined' && import.meta.env) {
|
|
@@ -71,6 +80,13 @@ export function useAppConfig(): UseAppConfigReturn {
|
|
|
71
80
|
'PACE';
|
|
72
81
|
}
|
|
73
82
|
|
|
83
|
+
const nodeEnvAppName =
|
|
84
|
+
getNodeEnvVar('VITE_APP_NAME') ||
|
|
85
|
+
getNodeEnvVar('NEXT_PUBLIC_APP_NAME');
|
|
86
|
+
if (nodeEnvAppName) {
|
|
87
|
+
return nodeEnvAppName;
|
|
88
|
+
}
|
|
89
|
+
|
|
74
90
|
// Priority 3: Default fallback
|
|
75
91
|
return 'PACE';
|
|
76
92
|
};
|
|
@@ -80,7 +96,7 @@ export function useAppConfig(): UseAppConfigReturn {
|
|
|
80
96
|
requiresEvent: true, // Public pages always require an event
|
|
81
97
|
isLoading: false,
|
|
82
98
|
appName: getAppName()
|
|
83
|
-
}), [contextAppName]);
|
|
99
|
+
}), [contextAppName, hasPublicContext]);
|
|
84
100
|
}
|
|
85
101
|
|
|
86
102
|
// For authenticated pages, use UnifiedAuthProvider
|
|
@@ -98,7 +114,10 @@ export function useAppConfig(): UseAppConfigReturn {
|
|
|
98
114
|
supportsDirectAccess: false,
|
|
99
115
|
requiresEvent: true,
|
|
100
116
|
isLoading: false,
|
|
101
|
-
appName:
|
|
102
|
-
|
|
117
|
+
appName: contextAppName ||
|
|
118
|
+
getNodeEnvVar('VITE_APP_NAME') ||
|
|
119
|
+
getNodeEnvVar('NEXT_PUBLIC_APP_NAME') ||
|
|
120
|
+
'PACE'
|
|
121
|
+
}), [contextAppName]);
|
|
103
122
|
}
|
|
104
123
|
}
|