wait for storage to become ready
Signed-off-by: Shijun Wang <shijun@shijun.dev>
This commit is contained in:
@@ -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.
|
||||
@@ -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}>
|
||||
|
||||
Reference in New Issue
Block a user