mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-11-08 16:02:00 +00:00
199 lines
4.5 KiB
JavaScript
199 lines
4.5 KiB
JavaScript
'use strict';
|
|
const path = require('path');
|
|
const electron = require('electron');
|
|
const {app, shell} = require('electron');
|
|
const electronLocalshortcut = require('electron-localshortcut');
|
|
const ipc = require('electron').ipcMain;
|
|
const Configstore = require('configstore');
|
|
const JsonDB = require('node-json-db');
|
|
const tray = require('./tray');
|
|
const link = require ('./link_helper');
|
|
const {linkIsInternal} = link;
|
|
|
|
const db = new JsonDB("domain", true, true);
|
|
const data = db.getData("/");
|
|
|
|
// adds debug features like hotkeys for triggering dev tools and reload
|
|
require('electron-debug')();
|
|
require('electron-context-menu')();
|
|
|
|
const conf = new Configstore("Zulip-Desktop");
|
|
|
|
// spellchecker enabled
|
|
const SpellChecker = require('simple-spellchecker');
|
|
let myDictionary = null;
|
|
|
|
// prevent window being garbage collected
|
|
let mainWindow;
|
|
let targetLink;
|
|
|
|
// Load this url in main window
|
|
const targetUrl = 'file://' + path.join(__dirname, '../renderer', 'index.html');
|
|
|
|
function checkWindowURL() {
|
|
if (data["domain"] !== undefined) {
|
|
return data["domain"]
|
|
}
|
|
return targetLink
|
|
}
|
|
|
|
const APP_ICON = path.join(__dirname, '../resources', 'Icon');
|
|
|
|
const iconPath = () => {
|
|
return process.platform === 'win32'
|
|
? APP_ICON + '.ico'
|
|
: APP_ICON + '.png'
|
|
};
|
|
|
|
function onClosed() {
|
|
// dereference the window
|
|
// for multiple windows store them in an array
|
|
mainWindow = null;
|
|
}
|
|
|
|
function createMainWindow() {
|
|
const win = new electron.BrowserWindow({
|
|
// This settings needs to be saved in config
|
|
title: 'Zulip',
|
|
width: conf.get('width') || 1000,
|
|
height: conf.get('height') || 600,
|
|
icon: iconPath(),
|
|
minWidth: 600,
|
|
minHeight: 400,
|
|
webPreferences: {
|
|
preload: path.join(__dirname, 'preload.js'),
|
|
nodeIntegration: true,
|
|
plugins: true
|
|
}
|
|
});
|
|
|
|
win.loadURL(targetUrl);
|
|
win.on('closed', onClosed);
|
|
win.setTitle('Zulip');
|
|
|
|
// Let's save browser window position
|
|
if (conf.get('x') || conf.get('y')) {
|
|
win.setPosition(conf.get('x'), conf.get('y'));
|
|
}
|
|
|
|
if (conf.get('maximize')) {
|
|
win.maximize();
|
|
}
|
|
|
|
// Handle sizing events so we can persist them.
|
|
win.on('maximize', function (event) {
|
|
conf.set('maximize', true);
|
|
});
|
|
|
|
win.on('unmaximize', function (event) {
|
|
conf.set('maximize', false);
|
|
});
|
|
|
|
win.on('resize', function (event) {
|
|
var size = this.getSize();
|
|
conf.set({
|
|
width: size[0],
|
|
height: size[1]
|
|
});
|
|
});
|
|
|
|
// on osx it's 'moved'
|
|
win.on('move', function (event) {
|
|
var pos = this.getPosition();
|
|
conf.set({
|
|
x: pos[0],
|
|
y: pos[1]
|
|
});
|
|
});
|
|
|
|
// stop page to update it's title
|
|
win.on('page-title-updated', (e) => {
|
|
e.preventDefault();
|
|
});
|
|
|
|
|
|
|
|
return win;
|
|
}
|
|
|
|
// TODO
|
|
app.commandLine.appendSwitch('ignore-certificate-errors', 'true');
|
|
|
|
app.on('window-all-closed', () => {
|
|
if (process.platform !== 'darwin') {
|
|
app.quit();
|
|
}
|
|
});
|
|
|
|
app.on('activate', () => {
|
|
if (!mainWindow) {
|
|
mainWindow = createMainWindow();
|
|
}
|
|
});
|
|
|
|
app.on('ready', () => {
|
|
mainWindow = createMainWindow();
|
|
tray.create(mainWindow);
|
|
|
|
const page = mainWindow.webContents;
|
|
|
|
// Add spellcheck dictionary
|
|
SpellChecker.getDictionary("en-US", "./node_modules/simple-spellchecker/dict", function(err, result) {
|
|
if(!err) {
|
|
myDictionary = result;
|
|
}
|
|
});
|
|
|
|
// Define function for consult the dictionary.
|
|
ipc.on('checkspell', function(event, word) {
|
|
var res = null;
|
|
if(myDictionary != null && word != null) {
|
|
res = myDictionary.spellCheck(word);
|
|
}
|
|
event.returnValue = res;
|
|
});
|
|
|
|
|
|
// TODO - use global shortcut instead
|
|
|
|
electronLocalshortcut.register(mainWindow, 'CommandOrControl+R', () => {
|
|
mainWindow.reload();
|
|
});
|
|
|
|
electronLocalshortcut.register(mainWindow, 'Alt+Left', () => {
|
|
if (page.canGoBack()) {
|
|
page.goBack();
|
|
}
|
|
});
|
|
|
|
electronLocalshortcut.register(mainWindow, 'CommandOrControl+=', () => {
|
|
page.executeJavaScript('zoomIn()');
|
|
});
|
|
|
|
electronLocalshortcut.register(mainWindow, 'CommandOrControl+-', () => {
|
|
page.executeJavaScript('zoomOut()');
|
|
});
|
|
|
|
electronLocalshortcut.register(mainWindow, 'CommandOrControl+0', () => {
|
|
page.executeJavaScript('zoomActualSize()');
|
|
});
|
|
|
|
page.on('new-window', (event, url) => {
|
|
if (mainWindow.useDefaultWindowBehaviour) {
|
|
mainWindow.useDefaultWindowBehaviour = false;
|
|
return;
|
|
}
|
|
if (linkIsInternal(checkWindowURL(), url)) {
|
|
event.preventDefault();
|
|
return mainWindow.loadURL(url);
|
|
}
|
|
event.preventDefault();
|
|
electron.shell.openExternal(url);
|
|
});
|
|
});
|
|
|
|
ipc.on('new-domain', function (e, domain) {
|
|
mainWindow.loadURL(domain);
|
|
targetLink = domain;
|
|
});
|