From 25e70cf7492da738dea9b7ab249cbe7a45768a09 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Thu, 30 Jul 2026 01:53:30 +0200 Subject: [PATCH] fix: canAccess + isModuleVisible fallback while permissions loading (contacts + settings link) --- frontend/src/components/layout/Sidebar.tsx | 4 ++-- frontend/src/components/layout/TopBar.tsx | 3 ++- frontend/src/hooks/useWorkspace.ts | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx index eea57cc..45b9f38 100644 --- a/frontend/src/components/layout/Sidebar.tsx +++ b/frontend/src/components/layout/Sidebar.tsx @@ -50,8 +50,8 @@ export function Sidebar() { // Use hasPermission directly — permissions are loaded via useUserPermissions hook const canAccess = (perm?: string): boolean => { if (!perm) return true; - // While permissions are loading, show everything (backend 403 catches errors) - if (!user || (user.permissions?.length === 0 && user.is_system_admin === undefined)) return true; + // While permissions are loading (undefined), show everything; backend 403 catches errors + if (!user?.permissions && user?.is_system_admin === undefined) return true; return hasPermission(perm); }; diff --git a/frontend/src/components/layout/TopBar.tsx b/frontend/src/components/layout/TopBar.tsx index 1c209c4..ccd2e65 100644 --- a/frontend/src/components/layout/TopBar.tsx +++ b/frontend/src/components/layout/TopBar.tsx @@ -23,8 +23,9 @@ export function TopBar() { const logoutMutation = useLogout(); const minimizedWindows = useWindowStore((s) => s.windows.filter((w) => w.state === 'minimized')); const { hasPermission } = usePermission(); - // Use hasPermission directly — permissions are loaded via useUserPermissions hook + // While permissions are loading (undefined), show everything; backend 403 catches errors const canAccess = (perm: string): boolean => { + if (!user?.permissions && user?.is_system_admin === undefined) return true; return hasPermission(perm); }; const restoreWindow = useWindowStore((s) => s.restoreWindow); diff --git a/frontend/src/hooks/useWorkspace.ts b/frontend/src/hooks/useWorkspace.ts index b555d7e..361d802 100644 --- a/frontend/src/hooks/useWorkspace.ts +++ b/frontend/src/hooks/useWorkspace.ts @@ -51,6 +51,8 @@ export function useWorkspace() { // System admins see all modules regardless of workspace const user = useAuthStore.getState().user; if (user?.is_system_admin) return true; + // While permissions are loading (is_system_admin undefined), show everything + if (user && user.is_system_admin === undefined) return true; // If no workspace context, show all (backward compatible) if (!context?.workspace_id || !context?.modules?.length) return true; return visibleModuleKeys.has(moduleKey);