converse.rs/main.js
2025-05-16 11:30:48 -07:00

162 lines
4.6 KiB
JavaScript

import { app, BrowserWindow, ipcMain, shell, powerMonitor } from 'electron';
import path from 'path';
import { fileURLToPath } from 'url';
import keytar from 'keytar';
import trayService from './modules/tray-service.js';
import menuService from './modules/menu-service.js';
import settingsService from './modules/settings-service.js';
import setFindBar from "find-bar" // search bar
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export let mainWindow;
let zoom = 1;
const isMac = process.platform === 'darwin';
const isWin = process.platform === 'win32';
function initApp() {
if (!app.requestSingleInstanceLock()) {
app.quit();
}
createWindow();
if (isWin) {
app.setAppUserModelId("com.rscommunity.rs-desktop");
}
}
function createWindow() {
const getSavedWindowBounds = () => {
const winBounds = settingsService.get('winBounds') || { width: 800, height: 600, x: undefined, y: undefined }; winBounds.width = Math.max(winBounds.width, 200);
winBounds.height = Math.max(winBounds.height, 200);
return winBounds;
};
const mainWindowOptions = {
zoomToPageWidth: true,
show: false,
autoHideMenuBar: settingsService.get('hideMenubar') || false,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'preload.cjs'), // this is a commonjs file, because electron doesnt support natively loading esm in preload files, which is retarded, but i cant change that.. so we will just cope :p
},
icon: path.join(__dirname, 'resources', 'images', 'logo-48x48.png'),
...getSavedWindowBounds(),
};
mainWindow = new BrowserWindow(mainWindowOptions);
trayService.initTray(mainWindow);
menuService.createMenu(mainWindow);
mainWindow.on('close', (e) => {
settingsService.set('isMaximized', mainWindow.isMaximized());
if (mainWindow.isFullScreen()) {
mainWindow.setFullScreen(false);
}
if (!app.isQuitting && settingsService.get('minimizeOnClose')) {
e.preventDefault();
mainWindow.hide();
}
return false;
});
mainWindow.on('resized', () => {
settingsService.set('winBounds', mainWindow.getBounds());
});
mainWindow.on('moved', () => {
settingsService.set('winBounds', mainWindow.getBounds());
});
if (isMac) {
powerMonitor.on('shutdown', () => {
app.isQuitting = true;
app.quit();
});
}
ipcMain.on('app-quit', () => {
app.isQuitting = true;
app.quit();
});
ipcMain.on('increaseZoom', () => { // custom zoom for the client
if (zoom >= 2) return;
zoom += 0.1;
mainWindow.webContents.setZoomFactor(zoom);
});
ipcMain.on('decreaseZoom', () => {
if (zoom <= 0.5) return;
zoom -= 0.1;
mainWindow.webContents.setZoomFactor(zoom);
});
mainWindow.webContents.setZoomFactor(1);
mainWindow.on('closed', () => {
mainWindow = null;
});
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url).catch(console.log);
return { action: 'deny' };
});
settingsService.webContents = mainWindow.webContents;
ipcMain.handle('settings', (e, method, ...args) => {
return settingsService[method].apply(settingsService, args);
});
ipcMain.handle('trayService', (e, method, ...args) => {
return trayService[method].apply(trayService, args);
});
ipcMain.handle('keytar', (e, method, ...args) => {
return keytar[method].apply(keytar, args);
});
mainWindow.on('ready-to-show', () => {
if (settingsService.get('isMaximized')) {
mainWindow.maximize();
} else {
mainWindow.show();
}
});
mainWindow.loadFile('index.html').catch((err) => {
console.log(err);
app.isQuitting = true;
app.quit();
});
}
app.on('ready', initApp);
app.on('browser-window-created', (_, win) => {
setFindBar(win); // search bar
});
app.on('window-all-closed', () => {
app.quit();
});
app.on('activate', () => {
if (mainWindow === null) {
createWindow();
} else {
mainWindow.show();
}
});
app.on('second-instance', () => {
mainWindow.show();
});
app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required');