From 71e63e99dc67bc73c657b9bf700e939b53371583 Mon Sep 17 00:00:00 2001 From: Erik Jan de Wit Date: Tue, 26 May 2026 13:19:08 +0200 Subject: [PATCH] moved AdminEnvironment to seperate file (#48039) * moved AdminEnvironment to seperate file fixes: #48038 Signed-off-by: Erik Jan de Wit * code review Signed-off-by: Erik Jan de Wit --------- Signed-off-by: Erik Jan de Wit --- js/apps/admin-ui/src/App.tsx | 2 +- js/apps/admin-ui/src/PageNav.tsx | 2 +- js/apps/admin-ui/src/admin-client.ts | 2 +- .../admin-ui/src/clients/ClientsSection.tsx | 2 +- js/apps/admin-ui/src/environment-types.ts | 19 +++++++++++++++ js/apps/admin-ui/src/environment.ts | 24 ++----------------- .../add/SamlConnectSettings.tsx | 2 +- .../add/SamlGeneralSettings.tsx | 2 +- js/apps/admin-ui/src/index.ts | 2 +- js/apps/admin-ui/src/main.tsx | 11 +++++++-- .../src/realm-settings/RealmSettingsTabs.tsx | 2 +- .../themes/LoginPreviewWindow.tsx | 2 +- js/apps/admin-ui/src/routes.tsx | 9 +------ js/apps/admin-ui/src/utils/client-url.ts | 2 +- 14 files changed, 41 insertions(+), 42 deletions(-) create mode 100644 js/apps/admin-ui/src/environment-types.ts diff --git a/js/apps/admin-ui/src/App.tsx b/js/apps/admin-ui/src/App.tsx index 2c2bebaa774..eed719ef512 100644 --- a/js/apps/admin-ui/src/App.tsx +++ b/js/apps/admin-ui/src/App.tsx @@ -22,7 +22,7 @@ import { AccessContextProvider } from "./context/access/Access"; import { RealmContextProvider } from "./context/realm-context/RealmContext"; import { ServerInfoProvider } from "./context/server-info/ServerInfoProvider"; import { WhoAmIContextProvider } from "./context/whoami/WhoAmI"; -import type { Environment } from "./environment"; +import type { Environment } from "./environment-types"; import { SubGroups } from "./groups/SubGroupsContext"; import { AuthWall } from "./root/AuthWall"; import { Banners } from "./Banners"; diff --git a/js/apps/admin-ui/src/PageNav.tsx b/js/apps/admin-ui/src/PageNav.tsx index 383354f5668..90712d307f7 100644 --- a/js/apps/admin-ui/src/PageNav.tsx +++ b/js/apps/admin-ui/src/PageNav.tsx @@ -12,7 +12,7 @@ import { NavLink, useNavigate } from "react-router-dom"; import { useAccess } from "./context/access/Access"; import { useRealm } from "./context/realm-context/RealmContext"; import { useServerInfo } from "./context/server-info/ServerInfoProvider"; -import { Environment } from "./environment"; +import type { Environment } from "./environment-types"; import { toPage } from "./page/routes"; import { routes } from "./routes"; import { resolveDisplayName } from "./util"; diff --git a/js/apps/admin-ui/src/admin-client.ts b/js/apps/admin-ui/src/admin-client.ts index df8a116336c..bb27104be9d 100644 --- a/js/apps/admin-ui/src/admin-client.ts +++ b/js/apps/admin-ui/src/admin-client.ts @@ -4,7 +4,7 @@ import { useRequiredContext, } from "@keycloak/keycloak-ui-shared"; import type Keycloak from "keycloak-js"; -import type { Environment } from "./environment"; +import type { Environment } from "./environment-types"; export type AdminClientProps = { keycloak: Keycloak; diff --git a/js/apps/admin-ui/src/clients/ClientsSection.tsx b/js/apps/admin-ui/src/clients/ClientsSection.tsx index c1737a0e5b4..8ff5bfd06cd 100644 --- a/js/apps/admin-ui/src/clients/ClientsSection.tsx +++ b/js/apps/admin-ui/src/clients/ClientsSection.tsx @@ -28,7 +28,7 @@ import { Action, KeycloakDataTable } from "@keycloak/keycloak-ui-shared"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useAccess } from "../context/access/Access"; import { useRealm } from "../context/realm-context/RealmContext"; -import { Environment } from "../environment"; +import { Environment } from "../environment-types"; import helpUrls from "../help-urls"; import { emptyFormatter, exportClient } from "../util"; import { convertClientToUrl } from "../utils/client-url"; diff --git a/js/apps/admin-ui/src/environment-types.ts b/js/apps/admin-ui/src/environment-types.ts new file mode 100644 index 00000000000..0b3a079b09e --- /dev/null +++ b/js/apps/admin-ui/src/environment-types.ts @@ -0,0 +1,19 @@ +import type { BaseEnvironment } from "@keycloak/keycloak-ui-shared"; + +export type Environment = BaseEnvironment & { + /** + * The URL to the root of the Administration Console, including the path if present, this takes into account the configured hostname of the Administration Console. + * For example, the Keycloak server could be hosted on `auth.example.com` and Admin Console may be hosted on `admin.example.com/some/path`. + * + * Note that this URL is normalized not to include a trailing slash, so take this into account when constructing URLs. + * + * @see {@link https://www.keycloak.org/server/hostname#_administration_console} + */ + adminBaseUrl: string; + /** The URL to the base of the Admin Console. */ + consoleBaseUrl: string; + /** The name of the master realm. */ + masterRealm: string; + /** The version hash of the auth server. */ + resourceVersion: string; +}; diff --git a/js/apps/admin-ui/src/environment.ts b/js/apps/admin-ui/src/environment.ts index 1146486930f..59528b03cdd 100644 --- a/js/apps/admin-ui/src/environment.ts +++ b/js/apps/admin-ui/src/environment.ts @@ -1,24 +1,4 @@ -import { - getInjectedEnvironment, - type BaseEnvironment, -} from "@keycloak/keycloak-ui-shared"; - -export type Environment = BaseEnvironment & { - /** - * The URL to the root of the Administration Console, including the path if present, this takes into account the configured hostname of the Administration Console. - * For example, the Keycloak server could be hosted on `auth.example.com` and Admin Console may be hosted on `admin.example.com/some/path`. - * - * Note that this URL is normalized not to include a trailing slash, so take this into account when constructing URLs. - * - * @see {@link https://www.keycloak.org/server/hostname#_administration_console} - */ - adminBaseUrl: string; - /** The URL to the base of the Admin Console. */ - consoleBaseUrl: string; - /** The name of the master realm. */ - masterRealm: string; - /** The version hash of the auth server. */ - resourceVersion: string; -}; +import { getInjectedEnvironment } from "@keycloak/keycloak-ui-shared"; +import type { Environment } from "./environment-types"; export const environment = getInjectedEnvironment(); diff --git a/js/apps/admin-ui/src/identity-providers/add/SamlConnectSettings.tsx b/js/apps/admin-ui/src/identity-providers/add/SamlConnectSettings.tsx index 2af1a193a9e..3681b9483c2 100644 --- a/js/apps/admin-ui/src/identity-providers/add/SamlConnectSettings.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/SamlConnectSettings.tsx @@ -13,7 +13,7 @@ import { useTranslation } from "react-i18next"; import { useAdminClient } from "../../admin-client"; import { FileUploadForm } from "../../components/json-file-upload/FileUploadForm"; import { useRealm } from "../../context/realm-context/RealmContext"; -import type { Environment } from "../../environment"; +import type { Environment } from "../../environment-types"; import { addTrailingSlash } from "../../util"; import { getAuthorizationHeaders } from "../../utils/getAuthorizationHeaders"; import { DiscoveryEndpointField } from "../component/DiscoveryEndpointField"; diff --git a/js/apps/admin-ui/src/identity-providers/add/SamlGeneralSettings.tsx b/js/apps/admin-ui/src/identity-providers/add/SamlGeneralSettings.tsx index 713e1def360..69d89abd0b4 100644 --- a/js/apps/admin-ui/src/identity-providers/add/SamlGeneralSettings.tsx +++ b/js/apps/admin-ui/src/identity-providers/add/SamlGeneralSettings.tsx @@ -9,7 +9,7 @@ import { useTranslation } from "react-i18next"; import { FormattedLink } from "../../components/external-link/FormattedLink"; import { useRealm } from "../../context/realm-context/RealmContext"; -import type { Environment } from "../../environment"; +import type { Environment } from "../../environment-types"; import { DisplayOrder } from "../component/DisplayOrder"; import { RedirectUrl } from "../component/RedirectUrl"; diff --git a/js/apps/admin-ui/src/index.ts b/js/apps/admin-ui/src/index.ts index 840c7932415..ace2fdc0b59 100644 --- a/js/apps/admin-ui/src/index.ts +++ b/js/apps/admin-ui/src/index.ts @@ -322,7 +322,7 @@ export { Header } from "./PageHeader"; export { PageNav } from "./PageNav"; export { PageNotFoundSection } from "./PageNotFoundSection"; export { App as AdminUi } from "./App"; -export type { Environment as AdminEnvironment } from "./environment"; +export type { Environment as AdminEnvironment } from "./environment-types"; export { KeycloakProvider, useEnvironment } from "@keycloak/keycloak-ui-shared"; export { AdminClientContext, initAdminClient } from "./admin-client"; export { AppContexts } from "./App"; diff --git a/js/apps/admin-ui/src/main.tsx b/js/apps/admin-ui/src/main.tsx index 76c6acb3623..119ab93ef95 100644 --- a/js/apps/admin-ui/src/main.tsx +++ b/js/apps/admin-ui/src/main.tsx @@ -5,14 +5,21 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { createHashRouter, RouterProvider } from "react-router-dom"; import { i18n } from "./i18n/i18n"; -import { RootRoute } from "./routes"; +import { Root } from "./Root"; +import { routes } from "./routes"; import "./index.css"; // Initialize required components before rendering app. await i18n.init(); -const router = createHashRouter([RootRoute]); +const router = createHashRouter([ + { + path: "/", + element: , + children: routes, + }, +]); const container = document.getElementById("app"); const root = createRoot(container!); diff --git a/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx b/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx index 5755111ded2..607458e25e6 100644 --- a/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx +++ b/js/apps/admin-ui/src/realm-settings/RealmSettingsTabs.tsx @@ -27,7 +27,7 @@ import { ViewHeader } from "../components/view-header/ViewHeader"; import { useAccess } from "../context/access/Access"; import { useRealm } from "../context/realm-context/RealmContext"; import { toDashboard } from "../dashboard/routes/Dashboard"; -import type { Environment } from "../environment"; +import type { Environment } from "../environment-types"; import helpUrls from "../help-urls"; import { convertFormValuesToObject, diff --git a/js/apps/admin-ui/src/realm-settings/themes/LoginPreviewWindow.tsx b/js/apps/admin-ui/src/realm-settings/themes/LoginPreviewWindow.tsx index 60f565aa51b..3fbda0d4243 100644 --- a/js/apps/admin-ui/src/realm-settings/themes/LoginPreviewWindow.tsx +++ b/js/apps/admin-ui/src/realm-settings/themes/LoginPreviewWindow.tsx @@ -1,7 +1,7 @@ import { loginThemeProperties as properties } from "./LoginThemeProperties"; import { usePreviewLogo } from "./LogoContext"; import { useEnvironment } from "@keycloak/keycloak-ui-shared"; -import { Environment } from "../../environment"; +import { Environment } from "../../environment-types"; import { usePreviewBackground } from "./BackgroundContext"; type LoginPreviewWindowProps = { diff --git a/js/apps/admin-ui/src/routes.tsx b/js/apps/admin-ui/src/routes.tsx index 397a95d0cf7..3527215f6a1 100644 --- a/js/apps/admin-ui/src/routes.tsx +++ b/js/apps/admin-ui/src/routes.tsx @@ -1,9 +1,8 @@ import type { AccessType } from "@keycloak/keycloak-admin-client/lib/defs/whoAmIRepresentation"; import type { TFunction } from "i18next"; import type { ComponentType } from "react"; -import type { NonIndexRouteObject, RouteObject } from "react-router-dom"; +import type { NonIndexRouteObject } from "react-router-dom"; import { PageNotFoundSection } from "./PageNotFoundSection"; -import { Root } from "./Root"; import authenticationRoutes from "./authentication/routes"; import clientScopesRoutes from "./client-scopes/routes"; import clientRoutes from "./clients/routes"; @@ -60,9 +59,3 @@ export const routes: AppRouteObject[] = [ ...pageRoutes, NotFoundRoute, ]; - -export const RootRoute: RouteObject = { - path: "/", - element: , - children: routes, -}; diff --git a/js/apps/admin-ui/src/utils/client-url.ts b/js/apps/admin-ui/src/utils/client-url.ts index 9628ae3b42d..2fa3061ad0d 100644 --- a/js/apps/admin-ui/src/utils/client-url.ts +++ b/js/apps/admin-ui/src/utils/client-url.ts @@ -1,5 +1,5 @@ import ClientRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientRepresentation"; -import type { Environment } from "../environment"; +import type { Environment } from "../environment-types"; import { joinPath } from "./joinPath"; export const convertClientToUrl = (