diff --git a/packages/core-api/src/app/App.tsx b/packages/core-api/src/app/App.tsx
index 1923adba0d..6da2b5f1b9 100644
--- a/packages/core-api/src/app/App.tsx
+++ b/packages/core-api/src/app/App.tsx
@@ -45,6 +45,41 @@ type FullAppOptions = {
configLoader?: AppConfigLoader;
};
+function useConfigLoader(
+ configLoader: AppConfigLoader | undefined,
+ components: AppComponents,
+ appThemeApi: AppThemeApi,
+): { api: ConfigApi } | { node: JSX.Element } {
+ // Keeping this synchronous when a config loader isn't set simplifies tests a lot
+ const hasConfig = Boolean(configLoader);
+ const config = useAsync(configLoader || (() => Promise.resolve([])));
+
+ let noConfigNode = undefined;
+
+ if (hasConfig && config.loading) {
+ const { Progress } = components;
+ noConfigNode = ;
+ } else if (config.error) {
+ const { BootErrorPage } = components;
+ noConfigNode = ;
+ }
+
+ // Before the config is loaded we can't use a router, so exit early
+ if (noConfigNode) {
+ return {
+ node: (
+
+ {noConfigNode}
+
+ ),
+ };
+ }
+
+ const configReader = ConfigReader.fromConfigs(config.value ?? []);
+
+ return { api: configReader };
+}
+
export class PrivateAppImpl implements BackstageApp {
private apis?: ApiHolder = undefined;
private readonly icons: SystemIcons;
@@ -151,32 +186,17 @@ export class PrivateAppImpl implements BackstageApp {
[],
);
- // Keeping this synchronous when a config loader isn't set simplifies tests a lot
- const hasConfig = Boolean(this.configLoader);
- const config = useAsync(this.configLoader || (() => Promise.resolve([])));
+ const loadedConfig = useConfigLoader(
+ this.configLoader,
+ this.components,
+ appThemeApi,
+ );
- let noConfigNode = undefined;
-
- if (hasConfig && config.loading) {
- const { Progress } = this.components;
- noConfigNode = ;
- } else if (config.error) {
- const { BootErrorPage } = this.components;
- noConfigNode = (
-
- );
+ if ('node' in loadedConfig) {
+ return loadedConfig.node;
}
+ const configReader = loadedConfig.api;
- // Before the config is loaded we can't use a router, so exit early
- if (noConfigNode) {
- return (
-
- {noConfigNode}
-
- );
- }
-
- const configReader = ConfigReader.fromConfigs(config.value ?? []);
const appApis = ApiRegistry.from([
[appThemeApiRef, AppThemeSelector.createWithStorage(this.themes)],
[configApiRef, configReader],