diff --git a/frontend/packages/console-app/src/components/nav/NavHeader.tsx b/frontend/packages/console-app/src/components/nav/NavHeader.tsx index 14641adb0d3..6df73064db4 100644 --- a/frontend/packages/console-app/src/components/nav/NavHeader.tsx +++ b/frontend/packages/console-app/src/components/nav/NavHeader.tsx @@ -1,11 +1,12 @@ import type { FC, MouseEvent, Ref } from 'react'; -import { useMemo, lazy, useState, useCallback, Suspense } from 'react'; +import { useMemo, useState, useCallback } from 'react'; import type { MenuToggleElement } from '@patternfly/react-core'; import { MenuToggle, Select, SelectList, SelectOption, Title } from '@patternfly/react-core'; import { CogsIcon } from '@patternfly/react-icons/dist/esm/icons/cogs-icon'; import { t } from 'i18next'; import type { Perspective } from '@console/dynamic-plugin-sdk'; import { useActivePerspective } from '@console/dynamic-plugin-sdk'; +import { AsyncComponent } from '@console/internal/components/utils/async'; import { usePerspectives } from '@console/shared/src/hooks/usePerspectives'; export type NavHeaderProps = { @@ -19,8 +20,9 @@ type PerspectiveDropdownItemProps = { onClick: (perspective: string) => void; }; +const IconLoadingComponent: FC = () => <> ; + const PerspectiveDropdownItem: FC = ({ perspective, onClick }) => { - const LazyIcon = useMemo(() => lazy(perspective.properties.icon), [perspective.properties.icon]); return ( = ({ perspective onClick(perspective.properties.id); }} icon={ -  }> - - + perspective.properties.icon().then((m) => m.default)} + LoadingComponent={IconLoadingComponent} + /> } > @@ -75,8 +78,6 @@ const NavHeader: FC<NavHeaderProps> = ({ onPerspectiveSelected }) => { [activePerspective, perspectiveExtensions], ); - const LazyIcon = useMemo(() => icon && lazy(icon), [icon]); - return perspectiveDropdownItems.length > 1 ? ( <div className="oc-nav-header" @@ -94,7 +95,14 @@ const NavHeader: FC<NavHeaderProps> = ({ onPerspectiveSelected }) => { isExpanded={isPerspectiveDropdownOpen} ref={toggleRef} onClick={() => togglePerspectiveOpen()} - icon={<LazyIcon />} + icon={ + icon && ( + <AsyncComponent + loader={() => icon().then((m) => m.default)} + LoadingComponent={IconLoadingComponent} + /> + ) + } > {name && ( <Title headingLevel="h2" size="md"> diff --git a/frontend/public/components/app.tsx b/frontend/public/components/app.tsx index 22e7caef504..69a4acadc37 100644 --- a/frontend/public/components/app.tsx +++ b/frontend/public/components/app.tsx @@ -253,7 +253,7 @@ const App: FC<{ }; const content = ( - <> + <Suspense fallback={<LoadingBox blame="App content suspense" />}> <ConsoleNotifier location="BannerTop" /> <QuickStartDrawer> <CloudShellDrawer> @@ -308,7 +308,7 @@ const App: FC<{ </QuickStartDrawer> <ConsoleNotifier location="BannerBottom" /> <FeatureFlagExtensionLoader /> - </> + </Suspense> ); return (