diff --git a/packages/desktop-electron/index.ts b/packages/desktop-electron/index.ts index bb75cbf6916efa812cd16c51b4fdf4bfae9c200b..049e79c35bad9e535d0e8d94bc8fa0693c179a0d 100644 --- a/packages/desktop-electron/index.ts +++ b/packages/desktop-electron/index.ts @@ -9,6 +9,7 @@ import { Menu, dialog, shell, + powerMonitor, protocol, utilityProcess, UtilityProcess, @@ -241,7 +242,7 @@ app.on('ready', async () => { // This is mainly to aid debugging Sentry errors - it will add a // breadcrumb - require('electron').powerMonitor.on('suspend', () => { + powerMonitor.on('suspend', () => { console.log('Suspending', new Date()); }); diff --git a/packages/desktop-electron/modules.d.ts b/packages/desktop-electron/modules.d.ts index 509b52346bd8cd834bfa300406d65bf8fbbbeaa8..7341f7749b4c0c23c7f39a6cf0e0882702b84305 100644 --- a/packages/desktop-electron/modules.d.ts +++ b/packages/desktop-electron/modules.d.ts @@ -5,4 +5,5 @@ declare module 'module' { // bundles not available until we build them declare module 'loot-core/lib-dist/bundle.desktop.js' { const initApp: (isDev: boolean) => void; + const lib: { getDataDir: () => string }; } diff --git a/packages/desktop-electron/window-state.js b/packages/desktop-electron/window-state.ts similarity index 67% rename from packages/desktop-electron/window-state.js rename to packages/desktop-electron/window-state.ts index 205c8816217a60b001fed269183440edb166d631..46b1a077129b426409a575fd426cd15db33a94ad 100644 --- a/packages/desktop-electron/window-state.js +++ b/packages/desktop-electron/window-state.ts @@ -1,13 +1,22 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; -const electron = require('electron'); +import electron, { BrowserWindow } from 'electron'; -// eslint-disable-next-line import/extensions -const backend = require('loot-core/lib-dist/bundle.desktop.js'); +const backend = undefined; +const getBackend = async () => + // eslint-disable-next-line import/extensions + backend || (await import('loot-core/lib-dist/bundle.desktop.js')); -function loadState() { - let state = {}; +type WindowState = Electron.Rectangle & { + isMaximized?: boolean; + isFullScreen?: boolean; + displayBounds?: Electron.Rectangle; +}; + +async function loadState() { + let state: WindowState | undefined = undefined; + const backend = await getBackend(); try { state = JSON.parse( fs.readFileSync( @@ -18,24 +27,27 @@ function loadState() { } catch (e) { console.log('Could not load window state'); } + return validateState(state); } -function updateState(win, state) { - const screen = electron.screen || electron.remote.screen; +function updateState(win: BrowserWindow, state: WindowState) { + const screen = electron.screen; const bounds = win.getBounds(); if (!win.isMaximized() && !win.isMinimized() && !win.isFullScreen()) { - state.x = bounds.x; - state.y = bounds.y; state.width = bounds.width; state.height = bounds.height; } + + state.x = bounds.x; + state.y = bounds.y; state.isMaximized = win.isMaximized(); state.isFullScreen = win.isFullScreen(); state.displayBounds = screen.getDisplayMatching(bounds).bounds; } -function saveState(win, state) { +async function saveState(win: BrowserWindow, state: WindowState) { + const backend = await getBackend(); updateState(win, state); fs.writeFileSync( path.join(backend.lib.getDataDir(), 'window.json'), @@ -44,7 +56,7 @@ function saveState(win, state) { ); } -function listen(win, state) { +export function listen(win: BrowserWindow, state: WindowState) { if (state.isMaximized) { win.maximize(); } @@ -61,7 +73,7 @@ function listen(win, state) { }; } -function hasBounds(state) { +function hasBounds(state: WindowState) { return ( Number.isInteger(state.x) && Number.isInteger(state.y) && @@ -72,15 +84,18 @@ function hasBounds(state) { ); } -function validateState(state) { - if (!(hasBounds(state) || state.isMaximized || state.isFullScreen)) { +function validateState(state?: WindowState): Partial<WindowState> { + if ( + !state || + !(hasBounds(state) || state.isMaximized || state.isFullScreen) + ) { return {}; } const newState = Object.assign({}, state); if (hasBounds(state) && state.displayBounds) { - const screen = electron.screen || electron.remote.screen; + const screen = electron.screen; // Check if the display where the window was last open is still available const displayBounds = screen.getDisplayMatching(state).bounds; @@ -116,22 +131,19 @@ function validateState(state) { return newState; } -async function get() { - const screen = electron.screen || electron.remote.screen; +export async function get() { + const screen = electron.screen; const displayBounds = screen.getPrimaryDisplay().bounds; - let state = loadState(); - state = Object.assign( + const state: WindowState = Object.assign( { x: 100, y: 50, width: Math.min(1000, displayBounds.width - 100), height: Math.min(700, displayBounds.width - 50), }, - state, + await loadState(), ); return state; } - -module.exports = { get, listen }; diff --git a/upcoming-release-notes/3027.md b/upcoming-release-notes/3027.md new file mode 100644 index 0000000000000000000000000000000000000000..c32c14123130668f3ebf045f66e356a0255379d9 --- /dev/null +++ b/upcoming-release-notes/3027.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MikesGlitch] +--- + +Updated Electron window-state file to use typescript