@jmruthers/pace-core 0.5.150 → 0.5.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/{chunk-NRDKCKSX.js → chunk-UM4TRLQG.js} +70 -5
  2. package/dist/chunk-UM4TRLQG.js.map +1 -0
  3. package/dist/components.js +1 -1
  4. package/dist/index.js +1 -1
  5. package/docs/api/classes/ColumnFactory.md +1 -1
  6. package/docs/api/classes/ErrorBoundary.md +1 -1
  7. package/docs/api/classes/InvalidScopeError.md +1 -1
  8. package/docs/api/classes/MissingUserContextError.md +1 -1
  9. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  10. package/docs/api/classes/PermissionDeniedError.md +1 -1
  11. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  12. package/docs/api/classes/RBACAuditManager.md +1 -1
  13. package/docs/api/classes/RBACCache.md +1 -1
  14. package/docs/api/classes/RBACEngine.md +1 -1
  15. package/docs/api/classes/RBACError.md +1 -1
  16. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  17. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  18. package/docs/api/classes/StorageUtils.md +1 -1
  19. package/docs/api/enums/FileCategory.md +1 -1
  20. package/docs/api/interfaces/AggregateConfig.md +1 -1
  21. package/docs/api/interfaces/BadgeProps.md +1 -1
  22. package/docs/api/interfaces/ButtonProps.md +1 -1
  23. package/docs/api/interfaces/CalendarProps.md +1 -1
  24. package/docs/api/interfaces/CardProps.md +1 -1
  25. package/docs/api/interfaces/ColorPalette.md +1 -1
  26. package/docs/api/interfaces/ColorShade.md +1 -1
  27. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  28. package/docs/api/interfaces/DataRecord.md +1 -1
  29. package/docs/api/interfaces/DataTableAction.md +1 -1
  30. package/docs/api/interfaces/DataTableColumn.md +1 -1
  31. package/docs/api/interfaces/DataTableProps.md +1 -1
  32. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  33. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  34. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  35. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  36. package/docs/api/interfaces/EventLogoProps.md +1 -1
  37. package/docs/api/interfaces/ExportColumn.md +1 -1
  38. package/docs/api/interfaces/ExportOptions.md +1 -1
  39. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  40. package/docs/api/interfaces/FileMetadata.md +1 -1
  41. package/docs/api/interfaces/FileReference.md +1 -1
  42. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  43. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  44. package/docs/api/interfaces/FileUploadProps.md +1 -1
  45. package/docs/api/interfaces/FooterProps.md +1 -1
  46. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  47. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  48. package/docs/api/interfaces/InputProps.md +1 -1
  49. package/docs/api/interfaces/LabelProps.md +1 -1
  50. package/docs/api/interfaces/LoginFormProps.md +1 -1
  51. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  52. package/docs/api/interfaces/NavigationContextType.md +1 -1
  53. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  54. package/docs/api/interfaces/NavigationItem.md +1 -1
  55. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  56. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  57. package/docs/api/interfaces/Organisation.md +1 -1
  58. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  59. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  60. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  61. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  62. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  63. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  64. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  65. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  66. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  67. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  68. package/docs/api/interfaces/PaletteData.md +1 -1
  69. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  70. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  71. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  72. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  73. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  74. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  75. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  76. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  77. package/docs/api/interfaces/RBACConfig.md +1 -1
  78. package/docs/api/interfaces/RBACLogger.md +1 -1
  79. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  80. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  81. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  82. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  83. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  84. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  85. package/docs/api/interfaces/RouteConfig.md +1 -1
  86. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  87. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  88. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  89. package/docs/api/interfaces/StorageConfig.md +1 -1
  90. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  91. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  92. package/docs/api/interfaces/StorageListOptions.md +1 -1
  93. package/docs/api/interfaces/StorageListResult.md +1 -1
  94. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  95. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  96. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  97. package/docs/api/interfaces/StyleImport.md +1 -1
  98. package/docs/api/interfaces/SwitchProps.md +1 -1
  99. package/docs/api/interfaces/TabsContentProps.md +1 -1
  100. package/docs/api/interfaces/TabsListProps.md +1 -1
  101. package/docs/api/interfaces/TabsProps.md +1 -1
  102. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  103. package/docs/api/interfaces/TextareaProps.md +1 -1
  104. package/docs/api/interfaces/ToastActionElement.md +1 -1
  105. package/docs/api/interfaces/ToastProps.md +1 -1
  106. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  107. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  108. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  109. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  110. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  111. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  112. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  113. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  114. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  115. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  116. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  117. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  118. package/docs/api/interfaces/UserEventAccess.md +1 -1
  119. package/docs/api/interfaces/UserMenuProps.md +1 -1
  120. package/docs/api/interfaces/UserProfile.md +1 -1
  121. package/docs/api/modules.md +2 -2
  122. package/package.json +1 -1
  123. package/src/components/NavigationMenu/NavigationMenu.tsx +95 -5
  124. package/dist/chunk-NRDKCKSX.js.map +0 -1
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / RouteConfig
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / RouteConfig
2
2
 
3
3
  # Interface: RouteConfig
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / SecureDataContextType
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / SecureDataContextType
2
2
 
3
3
  # Interface: SecureDataContextType
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / SecureDataProviderProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / SecureDataProviderProps
2
2
 
3
3
  # Interface: SecureDataProviderProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / SessionRestorationLoaderProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / SessionRestorationLoaderProps
2
2
 
3
3
  # Interface: SessionRestorationLoaderProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageConfig
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageConfig
2
2
 
3
3
  # Interface: StorageConfig
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageFileInfo
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageFileInfo
2
2
 
3
3
  # Interface: StorageFileInfo
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageFileMetadata
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageFileMetadata
2
2
 
3
3
  # Interface: StorageFileMetadata
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageListOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageListOptions
2
2
 
3
3
  # Interface: StorageListOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageListResult
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageListResult
2
2
 
3
3
  # Interface: StorageListResult
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageUploadOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageUploadOptions
2
2
 
3
3
  # Interface: StorageUploadOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageUploadResult
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageUploadResult
2
2
 
3
3
  # Interface: StorageUploadResult
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StorageUrlOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StorageUrlOptions
2
2
 
3
3
  # Interface: StorageUrlOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / StyleImport
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / StyleImport
2
2
 
3
3
  # Interface: StyleImport
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / SwitchProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / SwitchProps
2
2
 
3
3
  # Interface: SwitchProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / TabsContentProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / TabsContentProps
2
2
 
3
3
  # Interface: TabsContentProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / TabsListProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / TabsListProps
2
2
 
3
3
  # Interface: TabsListProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / TabsProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / TabsProps
2
2
 
3
3
  # Interface: TabsProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / TabsTriggerProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / TabsTriggerProps
2
2
 
3
3
  # Interface: TabsTriggerProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / TextareaProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / TextareaProps
2
2
 
3
3
  # Interface: TextareaProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / ToastActionElement
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / ToastActionElement
2
2
 
3
3
  # Interface: ToastActionElement
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / ToastProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / ToastProps
2
2
 
3
3
  # Interface: ToastProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UnifiedAuthContextType
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UnifiedAuthContextType
2
2
 
3
3
  # Interface: UnifiedAuthContextType
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UnifiedAuthProviderProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UnifiedAuthProviderProps
2
2
 
3
3
  # Interface: UnifiedAuthProviderProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UseInactivityTrackerOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UseInactivityTrackerOptions
2
2
 
3
3
  # Interface: UseInactivityTrackerOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UseInactivityTrackerReturn
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UseInactivityTrackerReturn
2
2
 
3
3
  # Interface: UseInactivityTrackerReturn
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UsePublicEventOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UsePublicEventOptions
2
2
 
3
3
  # Interface: UsePublicEventOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UsePublicEventReturn
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UsePublicEventReturn
2
2
 
3
3
  # Interface: UsePublicEventReturn
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UsePublicFileDisplayOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UsePublicFileDisplayOptions
2
2
 
3
3
  # Interface: UsePublicFileDisplayOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UsePublicFileDisplayReturn
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UsePublicFileDisplayReturn
2
2
 
3
3
  # Interface: UsePublicFileDisplayReturn
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UsePublicRouteParamsReturn
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UsePublicRouteParamsReturn
2
2
 
3
3
  # Interface: UsePublicRouteParamsReturn
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UseResolvedScopeOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UseResolvedScopeOptions
2
2
 
3
3
  # Interface: UseResolvedScopeOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UseResolvedScopeReturn
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UseResolvedScopeReturn
2
2
 
3
3
  # Interface: UseResolvedScopeReturn
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UseResourcePermissionsOptions
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UseResourcePermissionsOptions
2
2
 
3
3
  # Interface: UseResourcePermissionsOptions
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UserEventAccess
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UserEventAccess
2
2
 
3
3
  # Interface: UserEventAccess
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UserMenuProps
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UserMenuProps
2
2
 
3
3
  # Interface: UserMenuProps
4
4
 
@@ -1,4 +1,4 @@
1
- [@jmruthers/pace-core - v0.5.150](../README.md) / [Exports](../modules.md) / UserProfile
1
+ [@jmruthers/pace-core - v0.5.154](../README.md) / [Exports](../modules.md) / UserProfile
2
2
 
3
3
  # Interface: UserProfile
4
4
 
@@ -1,6 +1,6 @@
1
- [@jmruthers/pace-core - v0.5.150](README.md) / Exports
1
+ [@jmruthers/pace-core - v0.5.154](README.md) / Exports
2
2
 
3
- # @jmruthers/pace-core - v0.5.150
3
+ # @jmruthers/pace-core - v0.5.154
4
4
 
5
5
  **`File`**
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.5.150",
3
+ "version": "0.5.154",
4
4
  "description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -457,23 +457,83 @@ export const NavigationMenu = React.forwardRef<
457
457
  selectedEventId: filterByPermissions ? (selectedEvent?.event_id || null) : null
458
458
  });
459
459
 
460
+ // Resolve appId when useResolvedScope fails but context is ready
461
+ // This is needed because usePermissions requires appId to fetch permissions correctly
462
+ const [resolvedAppId, setResolvedAppId] = React.useState<string | undefined>(undefined);
463
+ React.useEffect(() => {
464
+ // Only resolve appId if:
465
+ // 1. useResolvedScope errored or returned null
466
+ // 2. But we have organisation context ready
467
+ // 3. And we have appName from authContext
468
+ // 4. And we haven't resolved it yet
469
+ if (
470
+ !scopeLoading &&
471
+ !resolvedScope?.appId &&
472
+ selectedOrganisation?.id &&
473
+ authContext?.appName &&
474
+ authContext?.user?.id &&
475
+ !resolvedAppId
476
+ ) {
477
+ // Resolve appId using the same method as useRBAC
478
+ // Double-check user exists (TypeScript narrowing) and capture values
479
+ if (!authContext.user || !authContext.appName) {
480
+ return;
481
+ }
482
+ const userId = authContext.user.id;
483
+ const appName = authContext.appName;
484
+ import('../../rbac/api').then(({ resolveAppContext }) => {
485
+ resolveAppContext({
486
+ userId,
487
+ appName
488
+ }).then((result) => {
489
+ if (result?.appId) {
490
+ setResolvedAppId(result.appId);
491
+ }
492
+ }).catch((error) => {
493
+ // Silently fail - usePermissions will handle it
494
+ logger.debug('NavigationMenu', 'Failed to resolve appId', error);
495
+ });
496
+ });
497
+ }
498
+ }, [scopeLoading, resolvedScope?.appId, selectedOrganisation?.id, authContext?.appName, authContext?.user?.id, resolvedAppId]);
499
+
460
500
  // Build scope from resolvedScope if available, otherwise fall back to context values
461
501
  // This handles the case where useResolvedScope errored initially but context is now ready
502
+ // IMPORTANT: We need appId for usePermissions to work correctly
462
503
  const effectiveScope = React.useMemo(() => {
463
504
  if (!scopeLoading && resolvedScope?.organisationId) {
464
- // Use resolved scope if available
505
+ // Use resolved scope if available (includes appId)
506
+ logger.warn('NavigationMenu', 'Using resolvedScope', {
507
+ organisationId: resolvedScope.organisationId,
508
+ eventId: resolvedScope.eventId,
509
+ appId: resolvedScope.appId
510
+ });
465
511
  return resolvedScope;
466
512
  } else if (!scopeLoading && selectedOrganisation?.id) {
467
513
  // Fall back to building scope from context if resolvedScope is null but context is ready
468
- // This handles the case where useResolvedScope errored but context is now available
469
- return {
514
+ // Use resolvedAppId if we've resolved it, otherwise undefined (usePermissions will try to resolve)
515
+ const fallbackScope = {
470
516
  organisationId: selectedOrganisation.id,
471
517
  eventId: selectedEvent?.event_id || undefined,
472
- appId: undefined // App ID will be resolved by usePermissions if needed
518
+ appId: resolvedAppId
473
519
  };
520
+ logger.warn('NavigationMenu', 'Using fallback scope', {
521
+ organisationId: fallbackScope.organisationId,
522
+ eventId: fallbackScope.eventId,
523
+ appId: fallbackScope.appId,
524
+ resolvedAppId,
525
+ hasResolvedScope: !!resolvedScope,
526
+ scopeLoading
527
+ });
528
+ return fallbackScope;
474
529
  }
530
+ logger.warn('NavigationMenu', 'effectiveScope is null', {
531
+ scopeLoading,
532
+ hasResolvedScope: !!resolvedScope,
533
+ hasSelectedOrganisation: !!selectedOrganisation?.id
534
+ });
475
535
  return null;
476
- }, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id]);
536
+ }, [scopeLoading, resolvedScope, selectedOrganisation?.id, selectedEvent?.event_id, resolvedAppId]);
477
537
 
478
538
  // Create a stable scope object that changes when effectiveScope changes
479
539
  // This ensures usePermissions detects scope changes and re-runs
@@ -496,10 +556,40 @@ export const NavigationMenu = React.forwardRef<
496
556
 
497
557
  // Get permissions map for synchronous permission checks
498
558
  const userId = authContext?.user?.id || '';
559
+
560
+ // Debug logging to understand why usePermissions returns empty map
561
+ React.useEffect(() => {
562
+ if (filterByPermissions && stableScope.organisationId) {
563
+ logger.warn('NavigationMenu', 'usePermissions scope', {
564
+ userId,
565
+ scope: stableScope,
566
+ hasOrganisationId: !!stableScope.organisationId,
567
+ hasEventId: !!stableScope.eventId,
568
+ hasAppId: !!stableScope.appId,
569
+ organisationId: stableScope.organisationId,
570
+ eventId: stableScope.eventId,
571
+ appId: stableScope.appId
572
+ });
573
+ }
574
+ }, [filterByPermissions, stableScope.organisationId, stableScope.eventId, stableScope.appId, userId]);
575
+
499
576
  const { permissions: permissionMap, hasAnyPermission, isLoading: permissionsLoading, error: permissionsError } = usePermissions(
500
577
  userId as any,
501
578
  stableScope as any
502
579
  );
580
+
581
+ // Debug logging for permission map state
582
+ React.useEffect(() => {
583
+ if (filterByPermissions) {
584
+ logger.warn('NavigationMenu', 'usePermissions result', {
585
+ permissionMapSize: permissionMap ? Object.keys(permissionMap).length : 0,
586
+ isLoading: permissionsLoading,
587
+ error: permissionsError?.message,
588
+ hasError: !!permissionsError,
589
+ scope: stableScope
590
+ });
591
+ }
592
+ }, [filterByPermissions, permissionMap, permissionsLoading, permissionsError, stableScope]);
503
593
 
504
594
  // NEW: Phase 2 - Enhanced Security Features
505
595
  // Filter navigation items based on permissions using RBAC hooks