98 lines
2.6 KiB
TypeScript
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",
|
|
};
|
|
}
|