From 41d711e52f622babed0f10f8567558b098d4ccaa Mon Sep 17 00:00:00 2001 From: Elena Makarova Date: Mon, 1 Dec 2025 14:04:10 +0300 Subject: [PATCH] fix(Header): wait for capabilities before show content --- src/containers/App/Content.tsx | 10 ++++------ src/containers/Header/Header.tsx | 15 ++++++++++++--- src/store/reducers/capabilities/hooks.ts | 8 ++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/containers/App/Content.tsx b/src/containers/App/Content.tsx index f56c9dd04..4b5b23745 100644 --- a/src/containers/App/Content.tsx +++ b/src/containers/App/Content.tsx @@ -14,6 +14,7 @@ import routes, {getClusterPath} from '../../routes'; import type {RootState} from '../../store'; import {authenticationApi} from '../../store/reducers/authentication/authentication'; import { + useAllCapabilitiesLoaded, useCapabilitiesQuery, useClusterWithoutAuthInUI, useMetaCapabilitiesLoaded, @@ -235,11 +236,10 @@ function GetNodesList() { } function GetCapabilities({children}: {children: React.ReactNode}) { - const {data, error} = useCapabilitiesQuery(); + const {error} = useCapabilitiesQuery(); useMetaCapabilitiesQuery(); - // It is always true if there is no meta, since request finishes with an error - const metaCapabilitiesLoaded = useMetaCapabilitiesLoaded(); + const capabilitiesLoaded = useAllCapabilitiesLoaded(); //do nothing, authentication is in progress upon redirect if (isRedirectToAuth(error)) { @@ -250,10 +250,8 @@ function GetCapabilities({children}: {children: React.ReactNode}) { return ; } - const capabilitiesLoaded = Boolean(data || error); - return ( - + {children} ); diff --git a/src/containers/Header/Header.tsx b/src/containers/Header/Header.tsx index 4b0cee50c..60e795ec5 100644 --- a/src/containers/Header/Header.tsx +++ b/src/containers/Header/Header.tsx @@ -19,6 +19,7 @@ import {checkIsClustersPage, checkIsTenantPage, getClusterPath} from '../../rout import {environment} from '../../store'; import { useAddClusterFeatureAvailable, + useAllCapabilitiesLoaded, useDatabasesAvailable, useDeleteDatabaseFeatureAvailable, useEditDatabaseFeatureAvailable, @@ -50,6 +51,7 @@ import './Header.scss'; const b = cn('header'); function Header() { + const capabilitiesLoaded = useAllCapabilitiesLoaded(); const {page, pageBreadcrumbsOptions} = useTypedSelector((state) => state.header); const singleClusterMode = useTypedSelector((state) => state.singleClusterMode); const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges(); @@ -242,9 +244,12 @@ function Header() { return null; }; - const renderHeader = () => { + const renderContent = () => { + if (!capabilitiesLoaded) { + return null; + } return ( -
+ {breadcrumbItems.map((item, index) => { const {icon, text, link} = item; @@ -268,9 +273,13 @@ function Header() { {renderRightControls()} -
+ ); }; + + const renderHeader = () => { + return
{renderContent()}
; + }; return renderHeader(); } diff --git a/src/store/reducers/capabilities/hooks.ts b/src/store/reducers/capabilities/hooks.ts index a0506a524..6bd760517 100644 --- a/src/store/reducers/capabilities/hooks.ts +++ b/src/store/reducers/capabilities/hooks.ts @@ -30,6 +30,14 @@ export function useCapabilitiesLoaded() { return Boolean(data || error); } +export function useAllCapabilitiesLoaded() { + // It is always true if there is no meta, since request finishes with an error + const metaCapabilitiesLoaded = useMetaCapabilitiesLoaded(); + const capabilitiesLoaded = useCapabilitiesLoaded(); + + return metaCapabilitiesLoaded && capabilitiesLoaded; +} + const useGetFeatureVersion = (feature: Capability) => { const database = useDatabaseFromQuery();