wait for storage to become ready

Signed-off-by: Shijun Wang <shijun@shijun.dev>
This commit is contained in:
Shijun Wang
2025-09-08 15:07:15 +03:00
parent 6135c091ed
commit 929c55adbc
3 changed files with 18 additions and 4 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-home': patch
---
Fixed race condition in CustomHomepageGrid by waiting for storage to load before rendering custom layout to prevent
rendering of the default content.
+1 -1
View File
@@ -84,7 +84,7 @@ export const createCardExtension: typeof createCardExtension_2;
// @public
export const CustomHomepageGrid: (
props: CustomHomepageGridProps,
) => JSX_2.Element;
) => JSX_2.Element | null;
// @public
export type CustomHomepageGridProps = {
@@ -90,7 +90,7 @@ const useStyles = makeStyles((theme: Theme) =>
function useHomeStorage(
defaultWidgets: GridWidget[],
): [GridWidget[], (value: GridWidget[]) => void] {
): [GridWidget[], (value: GridWidget[]) => void, boolean] {
const key = 'home';
const storageApi = useApi(storageApiRef).forBucket('home.customHomepage');
// TODO: Support multiple home pages
@@ -110,6 +110,9 @@ function useHomeStorage(
storageApi.observe$<string>(key),
storageApi.snapshot(key),
);
const isStorageLoading = homeSnapshot.presence === 'unknown' || !homeSnapshot;
const widgets: GridWidget[] = useMemo(() => {
if (homeSnapshot.presence === 'absent') {
return defaultWidgets;
@@ -122,7 +125,7 @@ function useHomeStorage(
}
}, [homeSnapshot, defaultWidgets]);
return [widgets, setWidgets];
return [widgets, setWidgets, isStorageLoading];
}
const convertConfigToDefaultWidgets = (
@@ -213,7 +216,7 @@ export const CustomHomepageGrid = (props: CustomHomepageGridProps) => {
? convertConfigToDefaultWidgets(props.config, availableWidgets)
: [];
}, [props.config, availableWidgets]);
const [widgets, setWidgets] = useHomeStorage(defaultLayout);
const [widgets, setWidgets, isStorageLoading] = useHomeStorage(defaultLayout);
const [addWidgetDialogOpen, setAddWidgetDialogOpen] = useState(false);
const editModeOn = widgets.find(w => w.layout.isResizable) !== undefined;
const [editMode, setEditMode] = useState(editModeOn);
@@ -322,6 +325,11 @@ export const CustomHomepageGrid = (props: CustomHomepageGridProps) => {
);
};
// Don't render anything while storage is loading
if (isStorageLoading) {
return null;
}
return (
<>
<ContentHeader title={props.title}>