import {AbstractExternalModalController} from "tc-shared/ui/react-elements/external-modal/Controller"; import {Popout2ControllerMessages, PopoutIPCMessage} from "tc-shared/ui/react-elements/external-modal/IPCMessage"; import {ExternalModal, kIPCChannelExternalModal} from "../shared/ipc/ExternalModal"; import {ObjectProxyClient} from "../shared/proxy/Client"; import * as ipc from "tc-shared/ipc/BrowserIPC"; import {ProxiedClass} from "../shared/proxy/Definitions"; const modalClient = new ObjectProxyClient(kIPCChannelExternalModal); modalClient.initialize(); export class ExternalModalController extends AbstractExternalModalController { private handle: ProxiedClass & ExternalModal; constructor(a, b, c) { super(a, b, c); } protected async spawnWindow(): Promise { if(!this.handle) { this.handle = await modalClient.createNewInstance(); } const parameters = { "loader-target": "manifest", "chunk": "modal-external", "modal-target": this.modalType, "ipc-channel": this.ipcChannel.channelId, "ipc-address": ipc.getInstance().getLocalAddress(), "loader-abort": 0, "animation-short": 1 }; const baseUrl = location.origin + location.pathname + "?"; const url = baseUrl + Object.keys(parameters).map(e => e + "=" + encodeURIComponent(parameters[e])).join("&"); return await this.handle.spawnWindow(this.modalType, url); } protected destroyWindow(): void { this.handle?.destroy(); this.handle = undefined; } protected focusWindow(): void { this.handle?.focus().then(() => {}); } protected handleTypedIPCMessage(type: T, payload: PopoutIPCMessage[T]) { super.handleTypedIPCMessage(type, payload); switch (type) { case "invoke-modal-action": const data = payload as PopoutIPCMessage["invoke-modal-action"]; switch (data.action) { case "close": this.destroy(); break; case "minimize": this.handle?.minimize().then(() => {}); break; } break; case "hello-popout": break; } } }