TeaSpeak-Client/modules/renderer/ExternalModalHandler.ts
2020-08-23 21:26:27 +02:00

69 lines
2.4 KiB
TypeScript

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<ExternalModal>(kIPCChannelExternalModal);
modalClient.initialize();
export class ExternalModalController extends AbstractExternalModalController {
private handle: ProxiedClass<ExternalModal> & ExternalModal;
constructor(a, b, c) {
super(a, b, c);
}
protected async spawnWindow(): Promise<boolean> {
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<T extends Popout2ControllerMessages>(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;
}
}
}