From a155b6e8d533f56563cccca96e80d353428053f1 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 24 Dec 2019 14:42:03 +0100 Subject: [PATCH] create separate window for setup and then main window --- electron.js | 97 +++++---------------------------- src/public/javascripts/setup.js | 2 +- src/routes/routes.js | 2 +- src/routes/setup.js | 10 +++- src/services/window.js | 86 +++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 85 deletions(-) create mode 100644 src/services/window.js diff --git a/electron.js b/electron.js index d39bddc77..58e2bd387 100644 --- a/electron.js +++ b/electron.js @@ -1,92 +1,20 @@ 'use strict'; -const {app, globalShortcut, BrowserWindow} = require('electron'); -const path = require('path'); +const {app, globalShortcut} = require('electron'); const log = require('./src/services/log'); const sqlInit = require('./src/services/sql_init'); const cls = require('./src/services/cls'); -const url = require("url"); -const port = require('./src/services/port'); -const optionService = require('./src/services/options'); -const env = require('./src/services/env'); const keyboardActionsService = require('./src/services/keyboard_actions'); const appIconService = require('./src/services/app_icon'); -const windowStateKeeper = require('electron-window-state'); +const windowService = require('./src/services/window'); // Adds debug features like hotkeys for triggering dev tools and reload require('electron-debug')(); appIconService.installLocalAppIcon(); -// Prevent window being garbage collected -let mainWindow; - require('electron-dl')({ saveAs: true }); -function onClosed() { - // Dereference the window - // For multiple windows store them in an array - mainWindow = null; -} - -async function createMainWindow() { - await sqlInit.dbConnection; - - let frame = true; - - // if schema doesn't exist -> setup process - // if schema exists, then we need to wait until the migration process is finished - if (await sqlInit.schemaExists()) { - await sqlInit.dbReady; - - frame = await optionService.getOptionBool('nativeTitleBarVisible') - } - - const mainWindowState = windowStateKeeper({ - // default window width & height so it's usable on 1600 * 900 display (including some extra panels etc.) - defaultWidth: 1200, - defaultHeight: 800 - }); - - const win = new BrowserWindow({ - x: mainWindowState.x, - y: mainWindowState.y, - width: mainWindowState.width, - height: mainWindowState.height, - title: 'Trilium Notes', - webPreferences: { - nodeIntegration: true - }, - frame: frame, - icon: path.join(__dirname, 'images/app-icons/png/256x256' + (env.isDev() ? '-dev' : '') + '.png') - }); - - mainWindowState.manage(win); - - win.setMenuBarVisibility(false); - win.loadURL('http://127.0.0.1:' + await port); - win.on('closed', onClosed); - - win.webContents.on('new-window', (e, url) => { - if (url !== win.webContents.getURL()) { - e.preventDefault(); - require('electron').shell.openExternal(url); - } - }); - - // prevent drag & drop to navigate away from trilium - win.webContents.on('will-navigate', (ev, targetUrl) => { - const parsedUrl = url.parse(targetUrl); - - // we still need to allow internal redirects from setup and migration pages - if (!['localhost', '127.0.0.1'].includes(parsedUrl.hostname) || (parsedUrl.path && parsedUrl.path !== '/')) { - ev.preventDefault(); - } - }); - - return win; -} - app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); @@ -96,12 +24,6 @@ app.on('window-all-closed', () => { } }); -app.on('activate', () => { - if (!mainWindow) { - mainWindow = createMainWindow(); - } -}); - async function registerGlobalShortcuts() { await sqlInit.dbReady; @@ -137,9 +59,20 @@ async function registerGlobalShortcuts() { app.on('ready', async () => { app.setAppUserModelId('com.github.zadam.trilium'); - mainWindow = await createMainWindow(); + await sqlInit.dbConnection; - registerGlobalShortcuts(); + // if schema doesn't exist -> setup process + // if schema exists, then we need to wait until the migration process is finished + if (await sqlInit.schemaExists()) { + await sqlInit.dbReady; + + await windowService.createMainWindow(); + } + else { + await windowService.createSetupWindow(); + } + + await registerGlobalShortcuts(); }); app.on('will-quit', () => { diff --git a/src/public/javascripts/setup.js b/src/public/javascripts/setup.js index e7cf7c7e1..4511679b1 100644 --- a/src/public/javascripts/setup.js +++ b/src/public/javascripts/setup.js @@ -81,7 +81,7 @@ function SetupModel() { password: password1, theme: theme }).then(() => { - window.location.replace("./"); + window.location.replace("./setup"); }); } else if (this.setupType() === 'sync-from-server') { diff --git a/src/routes/routes.js b/src/routes/routes.js index f8237c859..4d3108451 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -114,7 +114,7 @@ function register(app) { route(GET, '/login', [auth.checkAppInitialized], loginRoute.loginPage); route(POST, '/login', [], loginRoute.login); route(POST, '/logout', [csrfMiddleware, auth.checkAuth], loginRoute.logout); - route(GET, '/setup', [auth.checkAppNotInitialized], setupRoute.setupPage); + route(GET, '/setup', [], setupRoute.setupPage); apiRoute(GET, '/api/tree', treeApiRoute.getTree); apiRoute(POST, '/api/tree/load', treeApiRoute.load); diff --git a/src/routes/setup.js b/src/routes/setup.js index 81a30ec38..0d8c4f968 100644 --- a/src/routes/setup.js +++ b/src/routes/setup.js @@ -2,10 +2,18 @@ const sqlInit = require('../services/sql_init'); const setupService = require('../services/setup'); +const utils = require('../services/utils'); +const windowService = require('../services/window'); async function setupPage(req, res) { if (await sqlInit.isDbInitialized()) { - res.redirect('/'); + if (utils.isElectron()) { + await windowService.createMainWindow(); + windowService.closeSetupWindow(); + } + else { + res.redirect('/'); + } } // we got here because DB is not completely initialized so if schema exists diff --git a/src/services/window.js b/src/services/window.js new file mode 100644 index 000000000..955e8c51d --- /dev/null +++ b/src/services/window.js @@ -0,0 +1,86 @@ +const {BrowserWindow} = require('electron'); +const path = require('path'); +const url = require("url"); +const port = require('./port'); +const optionService = require('./options'); +const env = require('./env'); +const windowStateKeeper = require('electron-window-state'); + +// Prevent window being garbage collected +/** @type {Electron.BrowserWindow} */ +let mainWindow; +/** @type {Electron.BrowserWindow} */ +let setupWindow; + +async function createMainWindow() { + const mainWindowState = windowStateKeeper({ + // default window width & height so it's usable on 1600 * 900 display (including some extra panels etc.) + defaultWidth: 1200, + defaultHeight: 800 + }); + + mainWindow = new BrowserWindow({ + x: mainWindowState.x, + y: mainWindowState.y, + width: mainWindowState.width, + height: mainWindowState.height, + title: 'Trilium Notes', + webPreferences: { + nodeIntegration: true + }, + frame: await optionService.getOptionBool('nativeTitleBarVisible'), + icon: getIcon() + }); + + mainWindowState.manage(mainWindow); + + mainWindow.setMenuBarVisibility(false); + mainWindow.loadURL('http://127.0.0.1:' + await port); + mainWindow.on('closed', () => mainWindow = null); + + mainWindow.webContents.on('new-window', (e, url) => { + if (url !== mainWindow.webContents.getURL()) { + e.preventDefault(); + require('electron').shell.openExternal(url); + } + }); + + // prevent drag & drop to navigate away from trilium + mainWindow.webContents.on('will-navigate', (ev, targetUrl) => { + const parsedUrl = url.parse(targetUrl); + + // we still need to allow internal redirects from setup and migration pages + if (!['localhost', '127.0.0.1'].includes(parsedUrl.hostname) || (parsedUrl.path && parsedUrl.path !== '/')) { + ev.preventDefault(); + } + }); +} + +function getIcon() { + return path.join(__dirname, 'images/app-icons/png/256x256' + (env.isDev() ? '-dev' : '') + '.png'); +} + +async function createSetupWindow() { + setupWindow = new BrowserWindow({ + width: 800, + height: 800, + title: 'Trilium Notes Setup', + icon: getIcon() + }); + + setupWindow.setMenuBarVisibility(false); + setupWindow.loadURL('http://127.0.0.1:' + await port); + setupWindow.on('closed', () => setupWindow = null); +} + +function closeSetupWindow() { + if (setupWindow) { + setupWindow.close(); + } +} + +module.exports = { + createMainWindow, + createSetupWindow, + closeSetupWindow +}; \ No newline at end of file