forked from olcxjas-softworks/LarpixClient
195 lines
8.6 KiB
JavaScript
195 lines
8.6 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ElectronCapacitorApp = void 0;
|
|
exports.setupReloadWatcher = setupReloadWatcher;
|
|
exports.setupContentSecurityPolicy = setupContentSecurityPolicy;
|
|
const tslib_1 = require("tslib");
|
|
const electron_1 = require("@capacitor-community/electron");
|
|
const chokidar_1 = tslib_1.__importDefault(require("chokidar"));
|
|
const electron_2 = require("electron");
|
|
//import electronIsDev from 'electron-is-dev';
|
|
var electronIsDev = false;
|
|
const electron_serve_1 = tslib_1.__importDefault(require("electron-serve"));
|
|
const electron_window_state_1 = tslib_1.__importDefault(require("electron-window-state"));
|
|
const path_1 = require("path");
|
|
// Define components for a watcher to detect when the webapp is changed so we can reload in Dev mode.
|
|
const reloadWatcher = {
|
|
debouncer: null,
|
|
ready: false,
|
|
watcher: null,
|
|
};
|
|
function setupReloadWatcher(electronCapacitorApp) {
|
|
reloadWatcher.watcher = chokidar_1.default
|
|
.watch((0, path_1.join)(electron_2.app.getAppPath(), 'app'), {
|
|
ignored: /[/\\]\./,
|
|
persistent: true,
|
|
})
|
|
.on('ready', () => {
|
|
reloadWatcher.ready = true;
|
|
})
|
|
.on('all', (_event, _path) => {
|
|
if (reloadWatcher.ready) {
|
|
clearTimeout(reloadWatcher.debouncer);
|
|
reloadWatcher.debouncer = setTimeout(async () => {
|
|
electronCapacitorApp.getMainWindow().webContents.reload();
|
|
reloadWatcher.ready = false;
|
|
clearTimeout(reloadWatcher.debouncer);
|
|
reloadWatcher.debouncer = null;
|
|
reloadWatcher.watcher = null;
|
|
setupReloadWatcher(electronCapacitorApp);
|
|
}, 1500);
|
|
}
|
|
});
|
|
}
|
|
// Define our class to manage our app.
|
|
class ElectronCapacitorApp {
|
|
constructor(capacitorFileConfig, trayMenuTemplate, appMenuBarMenuTemplate) {
|
|
var _a, _b;
|
|
this.MainWindow = null;
|
|
this.SplashScreen = null;
|
|
this.TrayIcon = null;
|
|
this.TrayMenuTemplate = [
|
|
new electron_2.MenuItem({ label: 'Quit App', role: 'quit' }),
|
|
];
|
|
this.AppMenuBarMenuTemplate = [
|
|
{ role: process.platform === 'darwin' ? 'appMenu' : 'fileMenu' },
|
|
{ role: 'viewMenu' },
|
|
];
|
|
this.CapacitorFileConfig = capacitorFileConfig;
|
|
this.customScheme = (_b = (_a = this.CapacitorFileConfig.electron) === null || _a === void 0 ? void 0 : _a.customUrlScheme) !== null && _b !== void 0 ? _b : 'capacitor-electron';
|
|
if (trayMenuTemplate) {
|
|
this.TrayMenuTemplate = trayMenuTemplate;
|
|
}
|
|
if (appMenuBarMenuTemplate) {
|
|
this.AppMenuBarMenuTemplate = appMenuBarMenuTemplate;
|
|
}
|
|
// Setup our web app loader, this lets us load apps like react, vue, and angular without changing their build chains.
|
|
this.loadWebApp = (0, electron_serve_1.default)({
|
|
directory: (0, path_1.join)(electron_2.app.getAppPath(), 'app'),
|
|
scheme: this.customScheme,
|
|
});
|
|
}
|
|
// Helper function to load in the app.
|
|
async loadMainWindow(thisRef) {
|
|
await thisRef.loadWebApp(thisRef.MainWindow);
|
|
}
|
|
// Expose the mainWindow ref for use outside of the class.
|
|
getMainWindow() {
|
|
return this.MainWindow;
|
|
}
|
|
getCustomURLScheme() {
|
|
return this.customScheme;
|
|
}
|
|
async init() {
|
|
var _a;
|
|
const icon = electron_2.nativeImage.createFromPath((0, path_1.join)(electron_2.app.getAppPath(), 'assets', process.platform === 'win32' ? 'icon.ico' : 'icon.png'));
|
|
const appName = "miarven";
|
|
electron_2.app.setName(appName);
|
|
electron_2.app.setAppUserModelId(appName);
|
|
this.mainWindowState = (0, electron_window_state_1.default)({
|
|
defaultWidth: 1000,
|
|
defaultHeight: 800,
|
|
});
|
|
// Setup preload script path and construct our main window.
|
|
const preloadPath = (0, path_1.join)(electron_2.app.getAppPath(), 'build', 'src', 'preload.js');
|
|
this.MainWindow = new electron_2.BrowserWindow({
|
|
icon,
|
|
show: false,
|
|
x: this.mainWindowState.x,
|
|
y: this.mainWindowState.y,
|
|
width: this.mainWindowState.width,
|
|
height: this.mainWindowState.height,
|
|
autoHideMenuBar: true,
|
|
webPreferences: {
|
|
nodeIntegration: true,
|
|
contextIsolation: true,
|
|
// Use preload to inject the electron varriant overrides for capacitor plugins.
|
|
// preload: join(app.getAppPath(), "node_modules", "@capacitor-community", "electron", "dist", "runtime", "electron-rt.js"),
|
|
preload: preloadPath,
|
|
},
|
|
});
|
|
this.mainWindowState.manage(this.MainWindow);
|
|
if (this.CapacitorFileConfig.backgroundColor) {
|
|
this.MainWindow.setBackgroundColor(this.CapacitorFileConfig.electron.backgroundColor);
|
|
}
|
|
// If we close the main window with the splashscreen enabled we need to destory the ref.
|
|
this.MainWindow.on('closed', () => {
|
|
var _a;
|
|
if (((_a = this.SplashScreen) === null || _a === void 0 ? void 0 : _a.getSplashWindow()) && !this.SplashScreen.getSplashWindow().isDestroyed()) {
|
|
this.SplashScreen.getSplashWindow().close();
|
|
}
|
|
});
|
|
// When the tray icon is enabled, setup the options.
|
|
if ((_a = this.CapacitorFileConfig.electron) === null || _a === void 0 ? void 0 : _a.trayIconAndMenuEnabled) {
|
|
this.TrayIcon = new electron_2.Tray(icon);
|
|
this.TrayIcon.on('double-click', () => {
|
|
if (this.MainWindow) {
|
|
if (this.MainWindow.isVisible()) {
|
|
this.MainWindow.hide();
|
|
}
|
|
else {
|
|
this.MainWindow.show();
|
|
this.MainWindow.focus();
|
|
}
|
|
}
|
|
});
|
|
this.TrayIcon.on('click', () => {
|
|
if (this.MainWindow) {
|
|
if (this.MainWindow.isVisible()) {
|
|
this.MainWindow.hide();
|
|
}
|
|
else {
|
|
this.MainWindow.show();
|
|
this.MainWindow.focus();
|
|
}
|
|
}
|
|
});
|
|
this.TrayIcon.setToolTip(electron_2.app.getName());
|
|
this.TrayIcon.setContextMenu(electron_2.Menu.buildFromTemplate(this.TrayMenuTemplate));
|
|
}
|
|
// Setup the main manu bar at the top of our window.
|
|
//Menu.setApplicationMenu(Menu.buildFromTemplate(this.AppMenuBarMenuTemplate));
|
|
electron_2.Menu.setApplicationMenu(null);
|
|
this.loadMainWindow(this);
|
|
// Security
|
|
this.MainWindow.webContents.setWindowOpenHandler((details) => {
|
|
return { action: 'allow' };
|
|
});
|
|
this.MainWindow.webContents.on('will-navigate', (event, _newURL) => {
|
|
if (!this.MainWindow.webContents.getURL().includes(this.customScheme)) {
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
// Link electron plugins into the system.
|
|
(0, electron_1.setupCapacitorElectronPlugins)();
|
|
// When the web app is loaded we hide the splashscreen if needed and show the mainwindow.
|
|
this.MainWindow.webContents.on('dom-ready', () => {
|
|
var _a, _b;
|
|
if ((_a = this.CapacitorFileConfig.electron) === null || _a === void 0 ? void 0 : _a.splashScreenEnabled) {
|
|
this.SplashScreen.getSplashWindow().hide();
|
|
}
|
|
if (!((_b = this.CapacitorFileConfig.electron) === null || _b === void 0 ? void 0 : _b.hideMainWindowOnLaunch)) {
|
|
this.MainWindow.show();
|
|
}
|
|
setTimeout(() => {
|
|
electron_1.CapElectronEventEmitter.emit('CAPELECTRON_DeeplinkListenerInitialized', '');
|
|
}, 400);
|
|
});
|
|
this.MainWindow.setMenu(null);
|
|
this.MainWindow.setAutoHideMenuBar(true);
|
|
this.MainWindow.removeMenu();
|
|
}
|
|
}
|
|
exports.ElectronCapacitorApp = ElectronCapacitorApp;
|
|
// Set a CSP up for our application based on the custom scheme
|
|
function setupContentSecurityPolicy(customScheme) {
|
|
electron_2.session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
|
|
callback({
|
|
responseHeaders: Object.assign(Object.assign({}, details.responseHeaders), { 'Content-Security-Policy': [
|
|
electronIsDev
|
|
? `default-src ${customScheme}://* 'unsafe-inline' devtools://* 'unsafe-eval' data:`
|
|
: `default-src ${customScheme}://* 'unsafe-inline' data:`,
|
|
] }),
|
|
});
|
|
});
|
|
}
|