import { WindowAction, WindowCreateResult, WindowManager, WindowManagerEvents, WindowSpawnOptions } from "tc-shared/ui/windows/WindowManager"; import {Registry} from "tc-events"; import {assertMainApplication} from "tc-shared/ui/utils"; import {ObjectProxyClient} from "../shared/proxy/Client"; import {IpcWindowInstance, kIPCChannelWindowManager} from "../shared/ipc/IpcWindowInstance"; import {ProxiedClass} from "../shared/proxy/Definitions"; import {guid} from "tc-shared/crypto/uid"; import {getIpcInstance} from "tc-shared/ipc/BrowserIPC"; assertMainApplication(); const modalClient = new ObjectProxyClient(kIPCChannelWindowManager); modalClient.initialize(); export class NativeWindowManager implements WindowManager { private readonly events: Registry; private readonly windowInstances: { [key: string]: ProxiedClass & IpcWindowInstance }; constructor() { this.windowInstances = {}; this.events = new Registry(); window.onunload = () => { Object.values(this.windowInstances).forEach(window => window.destroy()); }; } getEvents(): Registry { return this.events; } async createWindow(options: WindowSpawnOptions): Promise { const windowHandle = await modalClient.createNewInstance(); const parameters = { "loader-target": "manifest", "loader-chunk": "modal-external", "ipc-address": getIpcInstance().getApplicationChannelId(), "ipc-core-peer": getIpcInstance().getLocalPeerId(), "loader-abort": 0, "animation-short": 1 }; Object.assign(parameters, options.appParameters); const baseUrl = location.origin + location.pathname + "?"; const url = baseUrl + Object.keys(parameters).map(e => e + "=" + encodeURIComponent(parameters[e])).join("&"); const result = await windowHandle.initialize("modal-external", options.uniqueId, url); if(!result) { windowHandle.destroy(); return { status: "error-unknown", message: tr("failed to spawn window") }; } const windowId = guid(); windowHandle.events.onClose = () => this.destroyWindow(windowId); this.windowInstances[windowId] = windowHandle; return { status: "success", windowId: windowId }; } destroyWindow(windowId: string): any { if(!this.windowInstances[windowId]) { return; } this.windowInstances[windowId].destroy(); delete this.windowInstances[windowId]; this.events.fire("notify_window_destroyed", { windowId: windowId }); } getActiveWindowId(): string | undefined { /* TODO! */ return undefined; } async executeAction(windowId: string, action: WindowAction): Promise { if(!this.windowInstances[windowId]) { return; } const window = this.windowInstances[windowId]; switch (action) { case "focus": await window.focus(); break; case "maximize": await window.maximize(); break; case "minimize": await window.minimize(); break; } } isActionSupported(windowId: string, action: WindowAction): boolean { switch (action) { case "minimize": case "focus": case "maximize": return true; default: return false; } } }