From 338c89936c7da4cd933a0ea13b89d136bd499c02 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 23 Nov 2025 17:43:19 +0100 Subject: [PATCH] core-plugin-api: avoid adding api context requirement for useApp and useRouteRef Signed-off-by: Patrik Oldsberg --- packages/core-plugin-api/src/app/useApp.tsx | 23 +++++++++++++------ .../src/routing/useRouteRef.tsx | 16 +++++++++---- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/core-plugin-api/src/app/useApp.tsx b/packages/core-plugin-api/src/app/useApp.tsx index 8368ed955f..fde807c317 100644 --- a/packages/core-plugin-api/src/app/useApp.tsx +++ b/packages/core-plugin-api/src/app/useApp.tsx @@ -25,6 +25,7 @@ import { Progress, createFrontendPlugin, FrontendPlugin, + ApiHolder, } from '@backstage/frontend-plugin-api'; import { AppComponents, @@ -75,26 +76,34 @@ function toNewPlugin(plugin: BackstagePlugin): FrontendPlugin { }); } +function useOptionalApiHolder(): ApiHolder | undefined { + try { + return useApiHolder(); + } catch { + return undefined; + } +} + /** * React hook providing {@link AppContext}. * * @public */ export const useApp = (): AppContextV1 => { - const apiHolder = useApiHolder(); - const appTreeApi = apiHolder.get(appTreeApiRef); + const apiHolder = useOptionalApiHolder(); + const appTreeApi = apiHolder?.get(appTreeApiRef); + const iconsApi = apiHolder?.get(iconsApiRef); const versionedContext = useVersionedContext<{ 1: AppContextV1 }>( 'app-context', ); - const newAppContext = useMemo(() => { + const newAppContext = useMemo(() => { if (!appTreeApi) { - return null; + return undefined; } - const iconsApi = apiHolder.get(iconsApiRef); if (!iconsApi) { - return null; + return undefined; } const { tree } = appTreeApi.getTree(); @@ -152,7 +161,7 @@ export const useApp = (): AppContextV1 => { }; }, }; - }, [appTreeApi, apiHolder]); + }, [appTreeApi, iconsApi]); if (newAppContext) { return newAppContext; diff --git a/packages/core-plugin-api/src/routing/useRouteRef.tsx b/packages/core-plugin-api/src/routing/useRouteRef.tsx index a46e96ba9e..48908ada5d 100644 --- a/packages/core-plugin-api/src/routing/useRouteRef.tsx +++ b/packages/core-plugin-api/src/routing/useRouteRef.tsx @@ -18,8 +18,9 @@ import { useMemo } from 'react'; import { matchRoutes, useLocation } from 'react-router-dom'; import { useVersionedContext } from '@backstage/version-bridge'; import { + RouteResolutionApi, routeResolutionApiRef, - useApiHolder, + useApi, } from '@backstage/frontend-plugin-api'; import { AnyParams, @@ -42,6 +43,14 @@ export interface RouteResolver { ): RouteFunc | undefined; } +function useRouteResolutionApi(): RouteResolutionApi | undefined { + try { + return useApi(routeResolutionApiRef); + } catch { + return undefined; + } +} + /** * React hook for constructing URLs to routes. * @@ -90,8 +99,7 @@ export function useRouteRef( | ExternalRouteRef, ): RouteFunc | undefined { const { pathname } = useLocation(); - const apiHolder = useApiHolder(); - const routeResolutionApi = apiHolder.get(routeResolutionApiRef); + const routeResolutionApi = useRouteResolutionApi(); const versionedContext = useVersionedContext<{ 1: RouteResolver }>( 'routing-context', ); @@ -104,7 +112,7 @@ export function useRouteRef( } try { - return routeResolutionApi.resolve(routeRef, { + return routeResolutionApi?.resolve(routeRef, { sourcePath: pathname, }); } catch {