TeaSpeak-Client/modules/core/windows/app-loader/controller/AppLoader.ts
2020-12-02 18:08:49 +01:00

114 lines
3.4 KiB
TypeScript

import {loadWindowBounds, startTrackWindowBounds} from "../../../../shared/window";
import {BrowserWindow, dialog} from "electron";
import * as path from "path";
import * as url from "url";
import { screen } from "electron";
let kDeveloperTools = false;
let windowInstance: BrowserWindow;
let windowSpawnPromise: Promise<void>;
let currentStatus: string;
let currentProgress: number;
export async function showAppLoaderWindow() {
while(windowSpawnPromise) {
await windowSpawnPromise;
}
if(windowInstance) {
console.error("Just focus");
windowInstance.focus();
return;
}
windowSpawnPromise = spawnAppLoaderWindow().catch(error => {
console.error("Failed to open the app loader window: %o", error);
dialog.showErrorBox("Failed to open window", "Failed to open the app loader window.\nLookup the console for details.");
hideAppLoaderWindow();
});
/* do this after the assignment so in case the promise resolves instantly we still clear the assignment */
windowSpawnPromise.then(() => windowSpawnPromise = undefined);
await windowSpawnPromise;
}
export function getLoaderWindow() : BrowserWindow {
return windowInstance;
}
async function spawnAppLoaderWindow() {
console.debug("Opening app loader window.");
const kWindowWidth = 340 + (kDeveloperTools ? 1000 : 0);
const kWindowHeight = 400 + (process.platform == "win32" ? 40 : 0);
windowInstance = new BrowserWindow({
width: kWindowWidth,
height: kWindowHeight,
frame: kDeveloperTools,
resizable: kDeveloperTools,
show: false,
autoHideMenuBar: true,
webPreferences: {
nodeIntegration: true,
}
});
windowInstance.setMenu(null);
windowInstance.on('closed', () => {
windowInstance = undefined;
});
if(kDeveloperTools) {
windowInstance.webContents.openDevTools();
}
await windowInstance.loadURL(url.pathToFileURL(path.join(__dirname, "..", "renderer", "index.html")).toString());
setAppLoaderStatus(currentStatus, currentProgress);
windowInstance.show();
try {
let bounds = screen.getPrimaryDisplay()?.bounds;
let x, y;
if(bounds) {
x = (bounds.x | 0) + ((bounds.width | 0) - kWindowWidth) / 2;
y = (bounds.y | 0) + ((bounds.height | 0) - kWindowHeight) / 2;
} else {
x = 0;
y = 0;
}
console.log("Setting app loader ui position to %ox%o", x, y);
if(typeof x === "number" && typeof y === "number") {
windowInstance.setPosition(x, y);
}
} catch (error) {
console.warn("Failed to apply app loader ui position: %o", error);
}
try {
await loadWindowBounds('ui-load-window', windowInstance, undefined, { applySize: false });
startTrackWindowBounds('ui-load-window', windowInstance);
} catch (error) {
console.warn("Failed to load and track window bounds: %o", error);
}
}
export function hideAppLoaderWindow() {
(async () => {
await windowSpawnPromise;
if(windowInstance) {
windowInstance.close();
windowInstance = undefined;
}
})();
}
export function setAppLoaderStatus(status: string, progress: number) {
currentStatus = status;
currentProgress = progress;
windowInstance?.webContents.send("progress-update", status, progress);
}