diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 1fff45ae..6105a4b2 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -8,9 +8,16 @@ import { Fragment } from "hono/jsx"; import { css, Style } from "hono/css"; import { Controller } from "modules/Controller"; import * as SystemPermissions from "modules/permissions"; +import type { TApiUser } from "Api"; const htmlBkndContextReplace = ""; +export type AdminBkndWindowContext = { + user?: TApiUser; + logout_route: string; + admin_basepath: string; +}; + // @todo: add migration to remove admin path from config export type AdminControllerOptions = { basepath?: string; @@ -80,6 +87,7 @@ export class AdminController extends Controller { const obj = { user: c.get("auth")?.user, logout_route: this.withAdminBasePath(authRoutes.logout), + admin_basepath: this.options.adminBasepath, }; const html = await this.getHtml(obj); if (!html) { @@ -142,7 +150,7 @@ export class AdminController extends Controller { return hono; } - private async getHtml(obj: any = {}) { + private async getHtml(obj: AdminBkndWindowContext) { const bknd_context = `window.__BKND__ = JSON.parse('${JSON.stringify(obj)}');`; if (this.options.html) { diff --git a/app/src/ui/Admin.tsx b/app/src/ui/Admin.tsx index d69738ff..1c73a589 100644 --- a/app/src/ui/Admin.tsx +++ b/app/src/ui/Admin.tsx @@ -7,7 +7,6 @@ import { Logo } from "ui/components/display/Logo"; import * as AppShell from "ui/layouts/AppShell/AppShell"; import { ClientProvider, type ClientProviderProps } from "./client"; import { createMantineTheme } from "./lib/mantine/theme"; -import { BkndModalsProvider } from "./modals"; import { Routes } from "./routes"; export type BkndAdminProps = { diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 20eb9a1f..18926eb1 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -1,6 +1,7 @@ import { Api, type ApiOptions, type TApiUser } from "Api"; import { isDebug } from "core"; import { createContext, type ReactNode, useContext } from "react"; +import type { AdminBkndWindowContext } from "modules/server/AdminController"; const ClientContext = createContext<{ baseUrl: string; api: Api }>({ baseUrl: undefined, @@ -68,16 +69,18 @@ export const useBaseUrl = () => { return context.baseUrl; }; -type BkndWindowContext = { - user?: TApiUser; - logout_route: string; -}; -export function useBkndWindowContext(): BkndWindowContext { +export function useBkndWindowContext(): AdminBkndWindowContext { + const defaults = { + logout_route: "/api/auth/logout", + admin_basepath: "", + }; + if (typeof window !== "undefined" && window.__BKND__) { - return window.__BKND__ as any; - } else { return { - logout_route: "/api/auth/logout", + ...defaults, + ...window.__BKND__, }; } + + return defaults; } diff --git a/app/src/ui/routes/index.tsx b/app/src/ui/routes/index.tsx index cedf051f..3cf7e7b6 100644 --- a/app/src/ui/routes/index.tsx +++ b/app/src/ui/routes/index.tsx @@ -11,6 +11,7 @@ import SettingsRoutes from "./settings"; import { FlashMessage } from "ui/modules/server/FlashMessage"; import { AuthRegister } from "ui/routes/auth/auth.register"; import { BkndModalsProvider } from "ui/modals"; +import { useBkndWindowContext } from "ui/client"; // @ts-ignore const TestRoutes = lazy(() => import("./test")); @@ -20,11 +21,13 @@ export function Routes({ basePath = "", }: { BkndWrapper: ComponentType<{ children: ReactNode }>; basePath?: string }) { const { theme } = useTheme(); + const ctx = useBkndWindowContext(); + const actualBasePath = basePath || ctx.admin_basepath; return (