Files
IdeA/frontend/src/features/web/webSurfaceNavigation.ts

98 lines
2.6 KiB
TypeScript

import {
isWebOpenablePanel,
type WebOpenablePanelId,
} from "./webSurfaceCatalog";
export type WebSurfaceOpenTarget = "tab" | "window";
export type WebSurfaceOpenResult = "tab" | "window" | "blocked";
export interface WebSurfaceWindowParams {
panel: WebOpenablePanelId;
projectId: string;
projectRoot: string;
projectName: string;
focusSprintId?: string | null;
}
export interface OpenWebSurfaceInput extends WebSurfaceWindowParams {
baseHref?: string;
}
export interface OpenWebSurfaceOutcome {
result: WebSurfaceOpenResult;
url: string;
}
type BrowserOpen = Window["open"];
const QUERY_PANEL = "webPanel";
const QUERY_PROJECT_ID = "projectId";
const QUERY_PROJECT_ROOT = "projectRoot";
const QUERY_PROJECT_NAME = "projectName";
const QUERY_FOCUS_SPRINT = "focusSprintId";
export function parseWebSurfaceWindowParams(search: string): WebSurfaceWindowParams | null {
const params = new URLSearchParams(search);
const panel = params.get(QUERY_PANEL);
const projectId = params.get(QUERY_PROJECT_ID);
const projectRoot = params.get(QUERY_PROJECT_ROOT);
const projectName = params.get(QUERY_PROJECT_NAME);
if (!panel || !isWebOpenablePanel(panel) || !projectId || !projectRoot || !projectName) {
return null;
}
return {
panel,
projectId,
projectRoot,
projectName,
focusSprintId: params.get(QUERY_FOCUS_SPRINT),
};
}
export function buildWebSurfaceWindowUrl(input: OpenWebSurfaceInput): string {
const href =
input.baseHref ??
(typeof window !== "undefined" && window.location
? window.location.href
: "http://localhost/");
const url = new URL(href);
url.hash = "";
url.search = "";
url.searchParams.set(QUERY_PANEL, input.panel);
url.searchParams.set(QUERY_PROJECT_ID, input.projectId);
url.searchParams.set(QUERY_PROJECT_ROOT, input.projectRoot);
url.searchParams.set(QUERY_PROJECT_NAME, input.projectName);
if (input.focusSprintId) {
url.searchParams.set(QUERY_FOCUS_SPRINT, input.focusSprintId);
}
return url.toString();
}
export function openWebSurfaceInBrowser(
input: OpenWebSurfaceInput,
target: WebSurfaceOpenTarget,
open: BrowserOpen = window.open.bind(window),
): OpenWebSurfaceOutcome {
const url = buildWebSurfaceWindowUrl(input);
if (target === "tab") {
return {
url,
result: open(url, "_blank", "noopener,noreferrer") ? "tab" : "blocked",
};
}
const popup = open(
url,
`idea-web-${input.panel}`,
"popup,width=1280,height=900,noopener,noreferrer",
);
if (popup) return { url, result: "window" };
return {
url,
result: open(url, "_blank", "noopener,noreferrer") ? "tab" : "blocked",
};
}