From 7925dded84ce0d88724558112b90cd8fd51f3336 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 22 Apr 2025 12:59:11 +0300 Subject: [PATCH 01/34] Add window names --- src/window-creators/window.names.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/window-creators/window.names.js diff --git a/src/window-creators/window.names.js b/src/window-creators/window.names.js new file mode 100644 index 00000000..c0b26659 --- /dev/null +++ b/src/window-creators/window.names.js @@ -0,0 +1,8 @@ +'use strict' + +module.exports = { + MAIN_WINDOW: 'mainWindow', + STARTUP_LOADING_WINDOW: 'startupLoadingWindow', + LOADING_WINDOW: 'loadingWindow', + ERROR_WINDOW: 'errorWindow' +} From cca576a9e4baae2935e705e944202ac8798ae67d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 22 Apr 2025 13:00:06 +0300 Subject: [PATCH 02/34] Add window names to win storage --- src/window-creators/windows.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/window-creators/windows.js b/src/window-creators/windows.js index 4a1de391..a6e21258 100644 --- a/src/window-creators/windows.js +++ b/src/window-creators/windows.js @@ -1,7 +1,10 @@ 'use strict' +const WINDOW_NAMES = require('./window.names') + module.exports = { - mainWindow: null, - loadingWindow: null, - errorWindow: null + [WINDOW_NAMES.MAIN_WINDOW]: null, + [WINDOW_NAMES.STARTUP_LOADING_WINDOW]: null, + [WINDOW_NAMES.LOADING_WINDOW]: null, + [WINDOW_NAMES.ERROR_WINDOW]: null } From fa249f20198de7ba3e7f58c9a0d3d63416bcb1c2 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 22 Apr 2025 13:02:06 +0300 Subject: [PATCH 03/34] Specify setting parent window for startup --- .../change-loading-win-visibility-state.js | 22 ++++++++++--------- src/window-creators/index.js | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index d686fb77..a3748eca 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -12,6 +12,7 @@ const { const GeneralIpcChannelHandlers = require( './main-renderer-ipc-bridge/general-ipc-channel-handlers' ) +const WINDOW_NAMES = require('./window.names') let intervalMarker @@ -24,7 +25,7 @@ const _closeAllWindows = () => { return Promise.all(promises) } -const setParentToLoadingWindow = (noParent) => { +const setParentToStartupLoadingWindow = (noParent) => { // TODO: The reason for it related to the electronjs issue: // `[Bug]: Wrong main window hidden state on macOS when using 'parent' option` // https://github.com/electron/electron/issues/29732 @@ -32,31 +33,32 @@ const setParentToLoadingWindow = (noParent) => { return } - if (wins.loadingWindow.isFocused()) { + if (wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].isFocused()) { return } const win = BrowserWindow.getFocusedWindow() if (noParent) { - wins.loadingWindow.setParentWindow(null) + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].setParentWindow(null) return } if ( Object.values(wins).every((w) => w !== win) || - win === wins.loadingWindow + win === wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] ) { - const mainWindow = !wins.mainWindow?.isDestroyed() - ? wins.mainWindow + const mainWindow = !wins[WINDOW_NAMES.MAIN_WINDOW]?.isDestroyed() + ? wins[WINDOW_NAMES.MAIN_WINDOW] : null - wins.loadingWindow.setParentWindow(mainWindow) + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] + .setParentWindow(mainWindow) return } - wins.loadingWindow.setParentWindow(win) + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].setParentWindow(win) } const _runProgressLoader = (opts) => { @@ -212,7 +214,7 @@ const showLoadingWindow = async (opts) => { .createLoadingWindow() } - setParentToLoadingWindow(isRequiredToCloseAllWins || noParent) + setParentToStartupLoadingWindow(isRequiredToCloseAllWins || noParent) const _progress = Number.isFinite(progress) ? Math.floor(progress * 100) / 100 @@ -277,5 +279,5 @@ module.exports = { showLoadingWindow, hideLoadingWindow, setLoadingDescription, - setParentToLoadingWindow + setParentToStartupLoadingWindow } diff --git a/src/window-creators/index.js b/src/window-creators/index.js index 835bc188..c9165eee 100644 --- a/src/window-creators/index.js +++ b/src/window-creators/index.js @@ -17,7 +17,7 @@ const createMenu = require('../create-menu') const { showLoadingWindow, hideLoadingWindow, - setParentToLoadingWindow + setParentToStartupLoadingWindow } = require('./change-loading-win-visibility-state') const { showWindow, @@ -190,7 +190,7 @@ const _createWindow = async ( centerWindow(wins[winName]) } - setParentToLoadingWindow() + setParentToStartupLoadingWindow() await showWindow(wins[winName]) return res From a11199cceb4469685564576884bf2c35338d5d27 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:24:37 +0300 Subject: [PATCH 04/34] Add ipc method for startup loading window --- .../general-ipc-channel-handlers.js | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/window-creators/main-renderer-ipc-bridge/general-ipc-channel-handlers.js b/src/window-creators/main-renderer-ipc-bridge/general-ipc-channel-handlers.js index 9fed2eeb..23f0e524 100644 --- a/src/window-creators/main-renderer-ipc-bridge/general-ipc-channel-handlers.js +++ b/src/window-creators/main-renderer-ipc-bridge/general-ipc-channel-handlers.js @@ -3,6 +3,7 @@ const { app } = require('electron') const wins = require('../windows') +const WINDOW_NAMES = require('../window.names') const IpcChannelHandlers = require('./ipc.channel.handlers') class GeneralIpcChannelHandlers extends IpcChannelHandlers { @@ -10,16 +11,16 @@ class GeneralIpcChannelHandlers extends IpcChannelHandlers { return app.exit(args?.code ?? 0) } - async minimizeLoadingWindowHandler (event, args) { - await wins.loadingWindow?.minimize() + async getTitleHandler (event, args) { + return wins[WINDOW_NAMES.MAIN_WINDOW].getTitle() } - async closeLoadingWindowHandler (event, args) { - await wins.loadingWindow?.close() + async minimizeLoadingWindowHandler (event, args) { + await wins[WINDOW_NAMES.LOADING_WINDOW]?.minimize() } - async getTitleHandler (event, args) { - return wins.mainWindow.getTitle() + async closeLoadingWindowHandler (event, args) { + await wins[WINDOW_NAMES.LOADING_WINDOW]?.close() } static onLoadingDescriptionReady (cb) { @@ -33,6 +34,26 @@ class GeneralIpcChannelHandlers extends IpcChannelHandlers { static sendLoadingBtnStates (win, args) { return this.sendToRenderer(this.sendLoadingBtnStates, win, args) } + + async minimizeStartupLoadingWindowHandler (event, args) { + await wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW]?.minimize() + } + + async closeStartupLoadingWindowHandler (event, args) { + await wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW]?.close() + } + + static onStartupLoadingDescriptionReady (cb) { + return this.handleListener(this.onStartupLoadingDescriptionReady, cb) + } + + static sendStartupLoadingDescription (win, args) { + return this.sendToRenderer(this.sendStartupLoadingDescription, win, args) + } + + static sendStartupLoadingBtnStates (win, args) { + return this.sendToRenderer(this.sendStartupLoadingBtnStates, win, args) + } } module.exports = GeneralIpcChannelHandlers From 7b29bcc4d96daffd1541c2cb24b9e217cb002886 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:25:44 +0300 Subject: [PATCH 05/34] Register startup loading window methods to preload script --- src/window-creators/main-renderer-ipc-bridge/preload.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/window-creators/main-renderer-ipc-bridge/preload.js b/src/window-creators/main-renderer-ipc-bridge/preload.js index ae4b010b..aeaa83db 100644 --- a/src/window-creators/main-renderer-ipc-bridge/preload.js +++ b/src/window-creators/main-renderer-ipc-bridge/preload.js @@ -12,14 +12,19 @@ const CHANNEL_NAMES = { const GENERAL_INVOKE_METHOD_NAMES = { EXIT: 'exit', + GET_TITLE: 'getTitle', MINIMIZE_LOADING_WINDOW: 'minimizeLoadingWindow', CLOSE_LOADING_WINDOW: 'closeLoadingWindow', - GET_TITLE: 'getTitle' + MINIMIZE_STARTUP_LOADING_WINDOW: 'minimizeStartupLoadingWindow', + CLOSE_STARTUP_LOADING_WINDOW: 'closeStartupLoadingWindow' } const GENERAL_EVENT_METHOD_NAMES = { ON_LOADING_DESCRIPTION: 'onLoadingDescription', ON_LOADING_BTN_STATES: 'onLoadingBtnStates', - SEND_LOADING_DESCRIPTION_READY: 'sendLoadingDescriptionReady' + SEND_LOADING_DESCRIPTION_READY: 'sendLoadingDescriptionReady', + ON_STARTUP_LOADING_DESCRIPTION: 'onStartupLoadingDescription', + ON_STARTUP_LOADING_BTN_STATES: 'onStartupLoadingBtnStates', + SEND_STARTUP_LOADING_DESCRIPTION_READY: 'sendStartupLoadingDescriptionReady' } const TRANSLATIONS_INVOKE_METHOD_NAMES = { SET_LANGUAGE: 'setLanguage', From 2660ac080e492168b59315ca34484d85a29582ce Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:28:13 +0300 Subject: [PATCH 06/34] Add layout for startup loading window --- src/window-creators/index.js | 2 +- .../layouts/startup-loading-window.html | 348 ++++++++++++++++++ 2 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 src/window-creators/layouts/startup-loading-window.html diff --git a/src/window-creators/index.js b/src/window-creators/index.js index c9165eee..7bf6c6ec 100644 --- a/src/window-creators/index.js +++ b/src/window-creators/index.js @@ -48,7 +48,7 @@ const publicDir = path.join(__dirname, '../../bfx-report-ui/build') const loadURL = serve({ directory: publicDir }) const pathToLayouts = path.join(__dirname, 'layouts') -const pathToLayoutAppInit = path.join(pathToLayouts, 'app-init.html') +const pathToLayoutAppInit = path.join(pathToLayouts, 'startup-loading-window.html') const _getFileURL = (params) => { const { diff --git a/src/window-creators/layouts/startup-loading-window.html b/src/window-creators/layouts/startup-loading-window.html new file mode 100644 index 00000000..72df3f31 --- /dev/null +++ b/src/window-creators/layouts/startup-loading-window.html @@ -0,0 +1,348 @@ + + + + + + + + + + Bitfinex Reports + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + From 1f51e5f2cf56ed341df5689fd980505b7af4b94d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:28:40 +0300 Subject: [PATCH 07/34] Add layout for common loading window --- .../layouts/loading-window.html | 348 ++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 src/window-creators/layouts/loading-window.html diff --git a/src/window-creators/layouts/loading-window.html b/src/window-creators/layouts/loading-window.html new file mode 100644 index 00000000..16134eb6 --- /dev/null +++ b/src/window-creators/layouts/loading-window.html @@ -0,0 +1,348 @@ + + + + + + + + + + Bitfinex Reports + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + From 96e5961fc0bc8a22cb90d1b5c20db047a9504ae3 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:29:11 +0300 Subject: [PATCH 08/34] Clean up app init loading window --- src/window-creators/layouts/app-init.html | 348 ---------------------- 1 file changed, 348 deletions(-) delete mode 100644 src/window-creators/layouts/app-init.html diff --git a/src/window-creators/layouts/app-init.html b/src/window-creators/layouts/app-init.html deleted file mode 100644 index 16134eb6..00000000 --- a/src/window-creators/layouts/app-init.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - - - - - Bitfinex Reports - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - - - From f04baabfb1eeb5913f528ec1843ba6fb52cf8a6b Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:31:02 +0300 Subject: [PATCH 09/34] Provide ability to set loading description for both loading wins --- .../change-loading-win-visibility-state.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index a3748eca..4bad6722 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -143,10 +143,11 @@ const _stopProgressLoader = ( const setLoadingDescription = async (params) => { try { const { - win = wins.loadingWindow, + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW, progress, description = '' } = params ?? {} + const win = wins[windowName] if ( !win || @@ -177,11 +178,17 @@ const setLoadingDescription = async (params) => { : '

' const _description = `${progressChunk}${descriptionChunk}` - const loadingDescReadyPromise = GeneralIpcChannelHandlers - .onLoadingDescriptionReady() + const loadingDescReadyPromise = windowName === WINDOW_NAMES.LOADING_WINDOW + ? GeneralIpcChannelHandlers.onLoadingDescriptionReady() + : GeneralIpcChannelHandlers.onStartupLoadingDescriptionReady() - GeneralIpcChannelHandlers - .sendLoadingDescription(win, { description: _description }) + if (windowName === WINDOW_NAMES.LOADING_WINDOW) { + GeneralIpcChannelHandlers + .sendLoadingDescription(win, { description: _description }) + } else { + GeneralIpcChannelHandlers + .sendStartupLoadingDescription(win, { description: _description }) + } const loadingRes = await loadingDescReadyPromise From c9f62526ecc9654ee576ad0f32dddcfd702737e7 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:32:29 +0300 Subject: [PATCH 10/34] Adjust import db module for new loading win --- src/import-db.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/import-db.js b/src/import-db.js index b6634802..d0fd3f93 100644 --- a/src/import-db.js +++ b/src/import-db.js @@ -13,6 +13,7 @@ const pauseApp = require('./pause-app') const relaunch = require('./relaunch') const { rm, isMainWinAvailable } = require('./helpers') const wins = require('./window-creators/windows') +const WINDOW_NAMES = require('./window-creators/window.names') const { setLoadingDescription } = require('./window-creators/change-loading-win-visibility-state') @@ -44,8 +45,8 @@ module.exports = ({ pathToUserDocuments }) => { return async () => { - const win = isMainWinAvailable(wins.mainWindow) - ? wins.mainWindow + const win = isMainWinAvailable(wins[WINDOW_NAMES.MAIN_WINDOW]) + ? wins[WINDOW_NAMES.MAIN_WINDOW] : BrowserWindow.getFocusedWindow() try { @@ -99,7 +100,11 @@ module.exports = ({ : '' const description = `${_description}${unzipped}` - await setLoadingDescription({ progress, description }) + await setLoadingDescription({ + windowName: WINDOW_NAMES.LOADING_WINDOW, + progress, + description + }) } await pauseApp({ @@ -130,8 +135,8 @@ module.exports = ({ relaunch() } catch (err) { try { - const _win = isMainWinAvailable(wins.loadingWindow) - ? wins.loadingWindow + const _win = isMainWinAvailable(wins[WINDOW_NAMES.LOADING_WINDOW]) + ? wins[WINDOW_NAMES.LOADING_WINDOW] : win await showErrorModalDialog( _win, From 47dbd83d5162fdd755438ef4688f86444e929638 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 23 Apr 2025 11:33:00 +0300 Subject: [PATCH 11/34] Adjust export db module for new loading win --- src/export-db.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/export-db.js b/src/export-db.js index 0f9652d2..c9bb18b5 100644 --- a/src/export-db.js +++ b/src/export-db.js @@ -14,6 +14,7 @@ const { setLoadingDescription } = require('./window-creators/change-loading-win-visibility-state') const wins = require('./window-creators/windows') +const WINDOW_NAMES = require('./window-creators/window.names') const isMainWinAvailable = require('./helpers/is-main-win-available') const { DEFAULT_ARCHIVE_DB_FILE_NAME, @@ -39,8 +40,8 @@ module.exports = ({ const secretKeyPath = path.join(pathToUserData, SECRET_KEY_FILE_NAME) return async () => { - const win = isMainWinAvailable(wins.mainWindow) - ? wins.mainWindow + const win = isMainWinAvailable(wins[WINDOW_NAMES.MAIN_WINDOW]) + ? wins[WINDOW_NAMES.MAIN_WINDOW] : BrowserWindow.getFocusedWindow() try { @@ -90,7 +91,11 @@ module.exports = ({ : '' const description = `${_description}${archived}` - await setLoadingDescription({ progress, description }) + await setLoadingDescription({ + windowName: WINDOW_NAMES.LOADING_WINDOW, + progress, + description + }) } await zip(filePath, [ From fcfadbc28a28f8b48c3866374790b73dc7486f6e Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 24 Apr 2025 12:31:55 +0300 Subject: [PATCH 12/34] Provide ability to show loading window for both loading wins --- .../change-loading-win-visibility-state.js | 111 ++++++++++++------ 1 file changed, 76 insertions(+), 35 deletions(-) diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index 4bad6722..b2737d29 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -14,18 +14,25 @@ const GeneralIpcChannelHandlers = require( ) const WINDOW_NAMES = require('./window.names') -let intervalMarker +const intervalMap = new Map() -const _closeAllWindows = () => { +const _closeAllWindows = (opts) => { + const excepedWindowName = opts?.excepedWindowName ?? WINDOW_NAMES.STARTUP_LOADING_WINDOW + const excepedWin = wins[excepedWindowName] const _wins = BrowserWindow.getAllWindows() - .filter((win) => win !== wins.loadingWindow) + .filter((win) => win !== excepedWin) const promises = _wins.map((win) => hideWindow(win)) return Promise.all(promises) } -const setParentToStartupLoadingWindow = (noParent) => { +const setParentToLoadingWindow = (opts) => { + const { + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW, + noParent + } = opts ?? {} + // TODO: The reason for it related to the electronjs issue: // `[Bug]: Wrong main window hidden state on macOS when using 'parent' option` // https://github.com/electron/electron/issues/29732 @@ -33,40 +40,41 @@ const setParentToStartupLoadingWindow = (noParent) => { return } - if (wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].isFocused()) { + if (wins[windowName].isFocused()) { return } const win = BrowserWindow.getFocusedWindow() if (noParent) { - wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].setParentWindow(null) + wins[windowName].setParentWindow(null) return } if ( Object.values(wins).every((w) => w !== win) || - win === wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] + win === wins[windowName] ) { const mainWindow = !wins[WINDOW_NAMES.MAIN_WINDOW]?.isDestroyed() ? wins[WINDOW_NAMES.MAIN_WINDOW] : null - wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] + wins[windowName] .setParentWindow(mainWindow) return } - wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].setParentWindow(win) + wins[windowName].setParentWindow(win) } const _runProgressLoader = (opts) => { const { - win = wins.loadingWindow, + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW, isIndeterminateMode = false, progress } = opts ?? {} + const win = wins[windowName] if ( !win || @@ -102,7 +110,7 @@ const _runProgressLoader = (opts) => { const step = 1 / (duration / interval) let _progress = 0 - intervalMarker = setInterval(() => { + const intervalMarker = setInterval(() => { if (_progress >= 1) { _progress = 0 } @@ -114,6 +122,7 @@ const _runProgressLoader = (opts) => { typeof win !== 'object' || win.isDestroyed() ) { + const intervalMarker = intervalMap.get(windowName) clearInterval(intervalMarker) return @@ -121,11 +130,17 @@ const _runProgressLoader = (opts) => { win.setProgressBar(_progress) }, interval).unref() + + intervalMap.set(windowName, intervalMarker) } -const _stopProgressLoader = ( - win = wins.loadingWindow -) => { +const _stopProgressLoader = (opts) => { + const { + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW + } = opts ?? {} + const win = wins[windowName] + const intervalMarker = intervalMap.get(windowName) + clearInterval(intervalMarker) if ( @@ -185,7 +200,8 @@ const setLoadingDescription = async (params) => { if (windowName === WINDOW_NAMES.LOADING_WINDOW) { GeneralIpcChannelHandlers .sendLoadingDescription(win, { description: _description }) - } else { + } + if (windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { GeneralIpcChannelHandlers .sendStartupLoadingDescription(win, { description: _description }) } @@ -209,19 +225,29 @@ const showLoadingWindow = async (opts) => { isIndeterminateMode = false, noParent = false, shouldCloseBtnBeShown, - shouldMinimizeBtnBeShown + shouldMinimizeBtnBeShown, + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW } = opts ?? {} + const win = wins[windowName] if ( - !wins.loadingWindow || - typeof wins.loadingWindow !== 'object' || - wins.loadingWindow.isDestroyed() + !win || + typeof win !== 'object' || + win.isDestroyed() ) { - await require('.') - .createLoadingWindow() + if (windowName === WINDOW_NAMES.LOADING_WINDOW) { + await require('.').createLoadingWindow() + } + if (windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { + await require('.').createStartupLoadingWindow() + } + } + if (windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { + setParentToLoadingWindow({ + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW, + noParent: isRequiredToCloseAllWins || noParent + }) } - - setParentToStartupLoadingWindow(isRequiredToCloseAllWins || noParent) const _progress = Number.isFinite(progress) ? Math.floor(progress * 100) / 100 @@ -231,26 +257,41 @@ const showLoadingWindow = async (opts) => { !isNotRunProgressLoaderRequired || Number.isFinite(progress) ) { - _runProgressLoader({ progress: _progress, isIndeterminateMode }) + _runProgressLoader({ + windowName, + progress: _progress, + isIndeterminateMode + }) } - GeneralIpcChannelHandlers - .sendLoadingBtnStates(wins.loadingWindow, { - shouldCloseBtnBeShown: shouldCloseBtnBeShown ?? false, - shouldMinimizeBtnBeShown: shouldMinimizeBtnBeShown ?? false - }) - await setLoadingDescription({ progress: _progress, description }) + const btnOpts = { + shouldCloseBtnBeShown: shouldCloseBtnBeShown ?? false, + shouldMinimizeBtnBeShown: shouldMinimizeBtnBeShown ?? false + } + + if (windowName === WINDOW_NAMES.LOADING_WINDOW) { + GeneralIpcChannelHandlers.sendLoadingBtnStates(win, btnOpts) + } + if (windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { + GeneralIpcChannelHandlers.sendStartupLoadingBtnStates(win, btnOpts) + } + + await setLoadingDescription({ + windowName, + progress: _progress, + description + }) - if (!wins.loadingWindow.isVisible()) { - centerWindow(wins.loadingWindow) + if (!win.isVisible()) { + centerWindow(win) - await showWindow(wins.loadingWindow) + await showWindow(win) } if (!isRequiredToCloseAllWins) { return } - await _closeAllWindows() + await _closeAllWindows({ excepedWindowName: windowName }) } const hideLoadingWindow = async (opts) => { @@ -286,5 +327,5 @@ module.exports = { showLoadingWindow, hideLoadingWindow, setLoadingDescription, - setParentToStartupLoadingWindow + setParentToLoadingWindow } From b2f7298e24b1ea0c6f934f0e43452578c3127703 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 24 Apr 2025 12:34:33 +0300 Subject: [PATCH 13/34] Add ability to create both loading windows --- src/initialize-app.js | 6 +-- src/window-creators/index.js | 91 +++++++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/initialize-app.js b/src/initialize-app.js index 42cd9160..b5396c8f 100644 --- a/src/initialize-app.js +++ b/src/initialize-app.js @@ -53,10 +53,6 @@ const manageWorkerMessages = require( ) const printToPDF = require('./print-to-pdf') -const pathToLayouts = path.join(__dirname, 'window-creators/layouts') -const pathToLayoutAppInitErr = path - .join(pathToLayouts, 'app-init-error.html') - const { rule: schedulerRule } = require( '../bfx-reports-framework/config/schedule.json' ) @@ -225,7 +221,7 @@ module.exports = async () => { printToPDF() } catch (err) { await app.whenReady() - await createErrorWindow(pathToLayoutAppInitErr) + await createErrorWindow() throw err } diff --git a/src/window-creators/index.js b/src/window-creators/index.js index 7bf6c6ec..7784736e 100644 --- a/src/window-creators/index.js +++ b/src/window-creators/index.js @@ -8,6 +8,7 @@ const { BrowserWindow } = electron const isDevEnv = process.env.NODE_ENV === 'development' const isMac = process.platform === 'darwin' +const WINDOW_NAMES = require('./window.names') const wins = require('./windows') const ipcs = require('../ipcs') const serve = require('../serve') @@ -17,7 +18,7 @@ const createMenu = require('../create-menu') const { showLoadingWindow, hideLoadingWindow, - setParentToStartupLoadingWindow + setParentToLoadingWindow } = require('./change-loading-win-visibility-state') const { showWindow, @@ -48,7 +49,12 @@ const publicDir = path.join(__dirname, '../../bfx-report-ui/build') const loadURL = serve({ directory: publicDir }) const pathToLayouts = path.join(__dirname, 'layouts') -const pathToLayoutAppInit = path.join(pathToLayouts, 'startup-loading-window.html') +const pathToLoadingLayout = path + .join(pathToLayouts, 'loading-window.html') +const pathToStartupLoadingLayout = path + .join(pathToLayouts, 'startup-loading-window.html') +const pathToAppInitErrorLayout = path + .join(pathToLayouts, 'app-init-error.html') const _getFileURL = (params) => { const { @@ -95,7 +101,7 @@ const _createWindow = async ( ) => { const { pathname = null, - winName = 'mainWindow' + winName = WINDOW_NAMES.MAIN_WINDOW } = params ?? {} const point = electron.screen.getCursorScreenPoint() @@ -107,7 +113,7 @@ const _createWindow = async ( width: defaultWidth, height: defaultHeight } = workAreaSize - const isMainWindow = winName === 'mainWindow' + const isMainWindow = winName === WINDOW_NAMES.MAIN_WINDOW const { width = defaultWidth, height = defaultHeight, @@ -176,21 +182,26 @@ const _createWindow = async ( win: wins[winName] } - if (!pathname) { + if (isMainWindow) { await showLoadingWindow({ shouldCloseBtnBeShown: true, shouldMinimizeBtnBeShown: true, - noParent: true + noParent: true, + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW }) - wins.loadingWindow.setAlwaysOnTop(true) + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].setAlwaysOnTop(true) return res } if (props.center) { centerWindow(wins[winName]) } + if (winName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { + setParentToLoadingWindow({ + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW + }) + } - setParentToStartupLoadingWindow() await showWindow(wins[winName]) return res @@ -236,7 +247,7 @@ const _createChildWindow = async ( noParent ) ? null - : wins.mainWindow, + : wins[WINDOW_NAMES.MAIN_WINDOW], alwaysOnTop: isMac, ...opts @@ -245,10 +256,10 @@ const _createChildWindow = async ( winProps.win.on('closed', () => { if (wins.mainWindow) { - wins.mainWindow.close() + wins[WINDOW_NAMES.MAIN_WINDOW].close() } - wins.mainWindow = null + wins[WINDOW_NAMES.MAIN_WINDOW] = null }) return winProps @@ -285,14 +296,22 @@ const createMainWindow = async ({ win.on('closed', () => { if ( - wins.loadingWindow && - typeof wins.loadingWindow === 'object' && - !wins.loadingWindow.isDestroyed() + wins[WINDOW_NAMES.LOADING_WINDOW] && + typeof wins[WINDOW_NAMES.LOADING_WINDOW] === 'object' && + !wins[WINDOW_NAMES.LOADING_WINDOW].isDestroyed() ) { - wins.loadingWindow.close() + wins[WINDOW_NAMES.LOADING_WINDOW].close() + } + if ( + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] && + typeof wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] === 'object' && + !wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].isDestroyed() + ) { + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW].close() } - wins.loadingWindow = null + wins[WINDOW_NAMES.LOADING_WINDOW] = null + wins[WINDOW_NAMES.STARTUP_LOADING_WINDOW] = null }) if ( @@ -310,12 +329,14 @@ const createMainWindow = async ({ } if (isDevEnv) { - wins.mainWindow.webContents.openDevTools({ mode: 'right' }) + wins[WINDOW_NAMES.MAIN_WINDOW].webContents + .openDevTools({ mode: 'right' }) } if (isBfxApiStaging()) { - const title = wins.mainWindow.getTitle() + const title = wins[WINDOW_NAMES.MAIN_WINDOW].getTitle() - wins.mainWindow.setTitle(`${title} - BFX API STAGING USED`) + wins[WINDOW_NAMES.MAIN_WINDOW] + .setTitle(`${title} - BFX API STAGING USED`) } createMenu({ pathToUserData, pathToUserDocuments }) @@ -330,8 +351,25 @@ const createMainWindow = async ({ const createLoadingWindow = async () => { const winProps = await _createChildWindow( - pathToLayoutAppInit, - 'loadingWindow', + pathToLoadingLayout, + WINDOW_NAMES.LOADING_WINDOW, + { + width: 350, + height: 350, + maximizable: false, + fullscreenable: false, + parent: wins[WINDOW_NAMES.MAIN_WINDOW], + modal: true + } + ) + + return winProps +} + +const createStartupLoadingWindow = async () => { + const winProps = await _createChildWindow( + pathToStartupLoadingLayout, + WINDOW_NAMES.STARTUP_LOADING_WINDOW, { width: 350, height: 350, @@ -344,10 +382,10 @@ const createLoadingWindow = async () => { return winProps } -const createErrorWindow = async (pathname) => { +const createErrorWindow = async () => { const winProps = await _createChildWindow( - pathname, - 'errorWindow', + pathToAppInitErrorLayout, + WINDOW_NAMES.ERROR_WINDOW, { height: 300, frame: false @@ -355,7 +393,7 @@ const createErrorWindow = async (pathname) => { ) await hideLoadingWindow() - await hideWindow(wins.mainWindow) + await hideWindow(wins[WINDOW_NAMES.MAIN_WINDOW]) return winProps } @@ -363,5 +401,6 @@ const createErrorWindow = async (pathname) => { module.exports = { createMainWindow, createErrorWindow, - createLoadingWindow + createLoadingWindow, + createStartupLoadingWindow } From 6b03fc220d4bd95aed9bcbc7b8481f7df300718b Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 24 Apr 2025 12:47:50 +0300 Subject: [PATCH 14/34] Provide ability to hide loading window for both loading wins --- .../change-loading-win-visibility-state.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index b2737d29..505b1a2b 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -296,29 +296,31 @@ const showLoadingWindow = async (opts) => { const hideLoadingWindow = async (opts) => { const { + windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW, isRequiredToShowMainWin = false } = opts ?? {} + const win = wins[windowName] // need to empty description - await setLoadingDescription({ description: '' }) - _stopProgressLoader() + await setLoadingDescription({ windowName, description: '' }) + _stopProgressLoader({ windowName }) if (isRequiredToShowMainWin) { await showWindow( - wins.mainWindow, + wins[WINDOW_NAMES.MAIN_WINDOW], { shouldWinBeFocused: true } ) if (appStates.isMainWinMaximized) { - wins.mainWindow.maximize() + wins[WINDOW_NAMES.MAIN_WINDOW].maximize() } if (appStates.isMainWinFullScreen) { - wins.mainWindow.setFullScreen(true) + wins[WINDOW_NAMES.MAIN_WINDOW].setFullScreen(true) } } return hideWindow( - wins.loadingWindow, + win, { shouldWinBeBlurred: true } ) } From 1c331aacf05b1b165fdd14ff4e64884f86b2b2b6 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 24 Apr 2025 12:48:06 +0300 Subject: [PATCH 15/34] Hide both loading wins in case error win creation --- src/window-creators/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/window-creators/index.js b/src/window-creators/index.js index 7784736e..08353445 100644 --- a/src/window-creators/index.js +++ b/src/window-creators/index.js @@ -392,7 +392,8 @@ const createErrorWindow = async () => { } ) - await hideLoadingWindow() + await hideLoadingWindow({ windowName: WINDOW_NAMES.LOADING_WINDOW }) + await hideLoadingWindow({ windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW }) await hideWindow(wins[WINDOW_NAMES.MAIN_WINDOW]) return winProps From 9d199c422f6a71d6d8e41f2aca718715624e6929 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:05:37 +0300 Subject: [PATCH 16/34] Adjust showing loading win for enforce-macos-app-location module --- src/enforce-macos-app-location.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/enforce-macos-app-location.js b/src/enforce-macos-app-location.js index 807fd992..4415a130 100644 --- a/src/enforce-macos-app-location.js +++ b/src/enforce-macos-app-location.js @@ -8,6 +8,7 @@ const { showLoadingWindow, hideLoadingWindow } = require('./window-creators/change-loading-win-visibility-state') +const WINDOW_NAMES = require('./window-creators/window.names') module.exports = async () => { if ( @@ -47,6 +48,7 @@ module.exports = async () => { } await showLoadingWindow({ + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW, description: i18next .t('enforceMacOSAppLocation.loadingWindow.description'), isRequiredToCloseAllWins: true, From ecfe0281efec9a43b3338615cab7e0384edea2a9 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:07:12 +0300 Subject: [PATCH 17/34] Adjust showing loading win for auto-updater module --- src/auto-updater/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/auto-updater/index.js b/src/auto-updater/index.js index a1632b3d..0bfa92f4 100644 --- a/src/auto-updater/index.js +++ b/src/auto-updater/index.js @@ -18,6 +18,7 @@ const isMac = process.platform === 'darwin' const log = require('../error-manager/log') const BfxMacUpdater = require('./bfx.mac.updater') const wins = require('../window-creators/windows') +const WINDOW_NAMES = require('../window-creators/window.names') const { showLoadingWindow, hideLoadingWindow @@ -291,6 +292,7 @@ const _autoUpdaterFactory = () => { autoUpdater.addInstallingUpdateEventHandler(() => { return showLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW, description: i18next.t('autoUpdater.loadingWindow.description'), isRequiredToCloseAllWins: true }) From 84bd97d55d34628a8973420feabb348b7d23f1f4 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:09:02 +0300 Subject: [PATCH 18/34] Adjust showing loading win for export-db module --- src/export-db.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/export-db.js b/src/export-db.js index c9bb18b5..950f4d0f 100644 --- a/src/export-db.js +++ b/src/export-db.js @@ -70,6 +70,7 @@ module.exports = ({ } await showLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW, description: i18next .t('exportDB.loadingWindow.description') }) From 7d90b6c686b46465bb3a64c0e59d0ea4b00de5a6 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:09:46 +0300 Subject: [PATCH 19/34] Adjust showing loading win for pause-app module --- src/pause-app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pause-app.js b/src/pause-app.js index 96d513b2..6df5831b 100644 --- a/src/pause-app.js +++ b/src/pause-app.js @@ -4,6 +4,7 @@ const ipcs = require('./ipcs') const { showLoadingWindow } = require('./window-creators/change-loading-win-visibility-state') +const WINDOW_NAMES = require('./window-creators/window.names') const _closeServer = () => { return new Promise((resolve, reject) => { @@ -35,6 +36,7 @@ module.exports = async (opts) => { } = opts ?? {} await showLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW, isRequiredToCloseAllWins: true, ...loadingWinParams }) From 89fbb4530536721aa56154fc04ce90ab75cde863 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:11:00 +0300 Subject: [PATCH 20/34] Fix showing loading window --- .../change-loading-win-visibility-state.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index 505b1a2b..1d9395b2 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -228,12 +228,11 @@ const showLoadingWindow = async (opts) => { shouldMinimizeBtnBeShown, windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW } = opts ?? {} - const win = wins[windowName] if ( - !win || - typeof win !== 'object' || - win.isDestroyed() + !wins[windowName] || + typeof wins[windowName] !== 'object' || + wins[windowName].isDestroyed() ) { if (windowName === WINDOW_NAMES.LOADING_WINDOW) { await require('.').createLoadingWindow() @@ -249,6 +248,7 @@ const showLoadingWindow = async (opts) => { }) } + const win = wins[windowName] const _progress = Number.isFinite(progress) ? Math.floor(progress * 100) / 100 : progress From 454d01d7cf77aeb8a9ec33e3945e62cf77a9ad17 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:14:17 +0300 Subject: [PATCH 21/34] Adjust hiding loading win for initialize-app module --- src/initialize-app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/initialize-app.js b/src/initialize-app.js index b5396c8f..b02020e0 100644 --- a/src/initialize-app.js +++ b/src/initialize-app.js @@ -28,6 +28,7 @@ const { const { hideLoadingWindow } = require('./window-creators/change-loading-win-visibility-state') +const WINDOW_NAMES = require('./window-creators/window.names') const makeOrReadSecretKey = require('./make-or-read-secret-key') const { configsKeeperFactory @@ -214,7 +215,10 @@ module.exports = async () => { manageWorkerMessages(ipc) await isServerReadyPromise await triggerSyncAfterUpdates() - await hideLoadingWindow({ isRequiredToShowMainWin: true }) + await hideLoadingWindow({ + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW, + isRequiredToShowMainWin: true + }) await triggerElectronLoad(portsMap) await checkForUpdatesAndNotify() From 2e0fc0446821ac94c80fee488febcd85cf80e1e4 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:18:55 +0300 Subject: [PATCH 22/34] Adjust hiding loading win for enforce-macos-app-location module --- src/enforce-macos-app-location.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/enforce-macos-app-location.js b/src/enforce-macos-app-location.js index 4415a130..b593130a 100644 --- a/src/enforce-macos-app-location.js +++ b/src/enforce-macos-app-location.js @@ -78,5 +78,7 @@ module.exports = async () => { } }) - await hideLoadingWindow() + await hideLoadingWindow({ + windowName: WINDOW_NAMES.STARTUP_LOADING_WINDOW + }) } From 6256f3d5788672f4d44355e77dfe256f342ef81a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:19:43 +0300 Subject: [PATCH 23/34] Adjust hiding loading win for export-db module --- src/export-db.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/export-db.js b/src/export-db.js index 950f4d0f..63df4091 100644 --- a/src/export-db.js +++ b/src/export-db.js @@ -105,7 +105,9 @@ module.exports = ({ dbWalPath, secretKeyPath ], { progressHandler }) - await hideLoadingWindow() + await hideLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW + }) await showMessageModalDialog(win, { buttons: [ @@ -117,7 +119,9 @@ module.exports = ({ }) } catch (err) { try { - await hideLoadingWindow() + await hideLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW + }) await showErrorModalDialog( win, i18next.t('exportDB.modalDialog.title'), From 48d314e76ef1be7c38a2ae36b91493c8eae94d97 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 25 Apr 2025 13:20:42 +0300 Subject: [PATCH 24/34] Adjust hiding loading win for auto-updater module --- src/auto-updater/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/auto-updater/index.js b/src/auto-updater/index.js index 0bfa92f4..7b518671 100644 --- a/src/auto-updater/index.js +++ b/src/auto-updater/index.js @@ -332,7 +332,10 @@ const _autoUpdaterFactory = () => { isProgressToastEnabled = false - await hideLoadingWindow({ isRequiredToShowMainWin: false }) + await hideLoadingWindow({ + windowName: WINDOW_NAMES.LOADING_WINDOW, + isRequiredToShowMainWin: false + }) _switchMenuItem({ isCheckMenuItemDisabled: false, From 96b355b22cc8495fe7a951b8d645c2a27b671353 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:48:53 +0300 Subject: [PATCH 25/34] Add loading win styles into separate file --- .../layouts/loading-window.css | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 src/window-creators/layouts/loading-window.css diff --git a/src/window-creators/layouts/loading-window.css b/src/window-creators/layouts/loading-window.css new file mode 100644 index 00000000..861f22ed --- /dev/null +++ b/src/window-creators/layouts/loading-window.css @@ -0,0 +1,245 @@ +html { + height: 100%; + background-color: var(--bgColor, #172d3e); +} + +body { + position: relative; + height: 100%; + padding: 0; + margin: 0; + text-align: center; + background-color: var(--bgColor, #172d3e); + font-family: "Inter", sans-serif; + font-feature-settings: 'tnum'; +} + +.win-control-btn { + position: absolute; + top: 0; + right: 0; + display: block; + min-height: 30px; + margin: 0; + padding: 5px; +} + +.window-btn { + position: relative; + display: inline-block; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: var(--bgColor, #172d3e); + transition: background-color .3s; + cursor: pointer; +} + +.window-btn__minimize::after { + content: ""; + display: block; + position: absolute; + width: 12px; + height: 1px; + background-color: var(--btnWindowAfterBg, #9b9a9a); + bottom: 9px; + left: calc((30px - 12px) / 2); +} + +.window-btn__close::before, .window-btn__close::after { + content: ""; + display: block; + position: absolute; + width: 17px; /* sqrt(12^2 + 12^2) where 12px width */ + height: 1px; + background-color: var(--btnWindowAfterBg, #9b9a9a); + bottom: calc((11px / 2) + 9px); + left: calc((30px - 17px) / 2); +} + +.window-btn__close::before { + transform: rotate(45deg); +} + +.window-btn__close::after { + transform: rotate(-45deg); +} + +.window-btn:hover, +.window-btn:active, +.window-btn:focus { + background-color: var(--btnWindowHoverBg, #9b9a9a); +} + +.window-btn--disabled { + display: none; +} + +.lds-roller { + display: inline-block; + position: absolute; + width: 128px; + height: 128px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: 0; + transition: opacity .5s ease-in-out; +} + +.show-roller { + opacity: 1; +} + +.lds-roller div { + animation: lds-roller 2.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + transform-origin: 64px 64px; +} + +.lds-roller div:after { + content: " "; + display: block; + position: absolute; + width: 6px; + height: 6px; + border-radius: 50%; + background-color: var(--color, #ffffff); + margin: -3px 0 0 -3px; +} + +.lds-roller div:nth-child(1) { + animation-delay: -0.036s; +} + +.lds-roller div:nth-child(1):after { + top: 100px; + left: 100px; +} + +.lds-roller div:nth-child(2) { + animation-delay: -0.072s; +} + +.lds-roller div:nth-child(2):after { + top: 108px; + left: 90px; +} + +.lds-roller div:nth-child(3) { + animation-delay: -0.108s; +} + +.lds-roller div:nth-child(3):after { + top: 113px; + left: 77px; +} + +.lds-roller div:nth-child(4) { + animation-delay: -0.144s; +} + +.lds-roller div:nth-child(4):after { + top: 115px; + left: 64px; +} + +.lds-roller div:nth-child(5) { + animation-delay: -0.18s; +} + +.lds-roller div:nth-child(5):after { + top: 113px; + left: 51px; +} + +.lds-roller div:nth-child(6) { + animation-delay: -0.216s; +} + +.lds-roller div:nth-child(6):after { + top: 108px; + left: 38px; +} + +.lds-roller div:nth-child(7) { + animation-delay: -0.252s; +} + +.lds-roller div:nth-child(7):after { + top: 100px; + left: 28px; +} + +.lds-roller div:nth-child(8) { + animation-delay: -0.288s; +} + +.lds-roller div:nth-child(8):after { + top: 90px; + left: 20px; +} + +.logo-img { + width: 40px; + height: 40px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.logo { + display: inline-block; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: 0; + animation: logo-shower 3s ease-in-out; + width: 200px; + height: 200px; + background-color: var(--bgColor, #172d3e); +} + +.description { + display: none; + color: var(--color, #172d3e); + position: fixed; + text-align: center; + margin: 0; + width: 100%; + padding: 20px 0; + bottom: 0; +} + +.description small { + color: var(--color2, #808B93); +} + +@keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +@keyframes logo-shower { + 0% { + opacity: 0; + } + + 40% { + opacity: 1; + } + + 60% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} From ef2014090d4db4a6b85115fa229187b13773eea2 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:50:08 +0300 Subject: [PATCH 26/34] Add loading win styles to startup loading win layout --- .../layouts/startup-loading-window.html | 248 +----------------- 1 file changed, 1 insertion(+), 247 deletions(-) diff --git a/src/window-creators/layouts/startup-loading-window.html b/src/window-creators/layouts/startup-loading-window.html index 72df3f31..12c1a7e8 100644 --- a/src/window-creators/layouts/startup-loading-window.html +++ b/src/window-creators/layouts/startup-loading-window.html @@ -7,254 +7,8 @@ + Bitfinex Reports - From 08066fcca978b7bec46429e0c39f1136de30ec3a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:50:40 +0300 Subject: [PATCH 27/34] Add loading win styles to common loading win layout --- .../layouts/loading-window.html | 248 +----------------- 1 file changed, 1 insertion(+), 247 deletions(-) diff --git a/src/window-creators/layouts/loading-window.html b/src/window-creators/layouts/loading-window.html index 16134eb6..5fc4c04a 100644 --- a/src/window-creators/layouts/loading-window.html +++ b/src/window-creators/layouts/loading-window.html @@ -7,254 +7,8 @@ + Bitfinex Reports - From bc2844ff73f5006bb85c83a7d3949f9290e48b10 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:51:21 +0300 Subject: [PATCH 28/34] Add loading win script into separate file --- src/window-creators/layouts/loading-window.js | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/window-creators/layouts/loading-window.js diff --git a/src/window-creators/layouts/loading-window.js b/src/window-creators/layouts/loading-window.js new file mode 100644 index 00000000..b5a7aaa1 --- /dev/null +++ b/src/window-creators/layouts/loading-window.js @@ -0,0 +1,67 @@ +window.initLoadingWindow = (opts) => { + const apiMethodPrefix = opts?.apiMethodPrefix ?? '' + + const rollers = document.getElementsByClassName('lds-roller') + const descriptionElem = document.getElementById('description') + const minBtnElem = document.getElementById('minBtn') + const closeBtnElem = document.getElementById('closeBtn') + + minBtnElem.onclick = async () => { + try { + await window.bfxReportElectronApi?.[`minimize${apiMethodPrefix}LoadingWindow`]() + } catch (err) { + console.error(err) + } + } + closeBtnElem.onclick = async () => { + try { + await window.bfxReportElectronApi?.[`close${apiMethodPrefix}LoadingWindow`]() + } catch (err) { + console.error(err) + } + } + + setTimeout(() => { + for (const roller of rollers) { + roller.classList.add('show-roller') + } + }, 2500) + + window.bfxReportElectronApi?.[`on${apiMethodPrefix}LoadingBtnStates`]((args) => { + try { + if (args?.shouldMinimizeBtnBeShown) { + minBtnElem.classList.remove('window-btn--disabled') + } else { + minBtnElem.classList.add('window-btn--disabled') + } + if (args?.shouldCloseBtnBeShown) { + closeBtnElem.classList.remove('window-btn--disabled') + } else { + closeBtnElem.classList.add('window-btn--disabled') + } + } catch (err) { + console.debug(err) + } + }) + window.bfxReportElectronApi?.[`on${apiMethodPrefix}LoadingDescription`]((args) => { + try { + if (typeof args?.description !== 'string') { + window.bfxReportElectronApi?.[`send${apiMethodPrefix}LoadingDescriptionReady`]() + + return + } + + descriptionElem.innerHTML = args.description + + descriptionElem.style.display = args.description + ? 'block' + : 'none' + + window.bfxReportElectronApi?.[`send${apiMethodPrefix}LoadingDescriptionReady`]() + } catch (err) { + console.error(err) + + window.bfxReportElectronApi?.[`send${apiMethodPrefix}LoadingDescriptionReady`]({ err }) + } + }) +} From 2b5a88dcb178e2fcc04a17bb1c7bdfc1489b6518 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:53:01 +0300 Subject: [PATCH 29/34] Add loading win script to startup loading win layout --- .../layouts/startup-loading-window.html | 65 +------------------ 1 file changed, 2 insertions(+), 63 deletions(-) diff --git a/src/window-creators/layouts/startup-loading-window.html b/src/window-creators/layouts/startup-loading-window.html index 12c1a7e8..1fa021e8 100644 --- a/src/window-creators/layouts/startup-loading-window.html +++ b/src/window-creators/layouts/startup-loading-window.html @@ -4,6 +4,7 @@ + @@ -34,69 +35,7 @@ From 8d05eeebc47eee9c8f659fc5250f3b2191bec576 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 28 Apr 2025 10:53:29 +0300 Subject: [PATCH 30/34] Add loading win script to common loading win layout --- .../layouts/loading-window.html | 65 +------------------ 1 file changed, 2 insertions(+), 63 deletions(-) diff --git a/src/window-creators/layouts/loading-window.html b/src/window-creators/layouts/loading-window.html index 5fc4c04a..ed995bc6 100644 --- a/src/window-creators/layouts/loading-window.html +++ b/src/window-creators/layouts/loading-window.html @@ -4,6 +4,7 @@ + @@ -34,69 +35,7 @@ From d05bf61fbb4d3092691b5d32191ed44aeda3690d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 29 Apr 2025 14:13:18 +0300 Subject: [PATCH 31/34] Fix loading win for enforcing macos app location --- src/enforce-macos-app-location.js | 4 +-- .../change-loading-win-visibility-state.js | 35 ++++++++++++++----- .../layouts/loading-window.css | 5 +++ .../layouts/loading-window.html | 2 +- src/window-creators/layouts/loading-window.js | 15 +++++++- .../layouts/startup-loading-window.html | 2 +- 6 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/enforce-macos-app-location.js b/src/enforce-macos-app-location.js index b593130a..335c85d7 100644 --- a/src/enforce-macos-app-location.js +++ b/src/enforce-macos-app-location.js @@ -52,9 +52,7 @@ module.exports = async () => { description: i18next .t('enforceMacOSAppLocation.loadingWindow.description'), isRequiredToCloseAllWins: true, - isIndeterminateMode: true, - shouldCloseBtnBeShown: true, - shouldMinimizeBtnBeShown: true + isIndeterminateMode: true }) app.moveToApplicationsFolder({ diff --git a/src/window-creators/change-loading-win-visibility-state.js b/src/window-creators/change-loading-win-visibility-state.js index 1d9395b2..cf02d74a 100644 --- a/src/window-creators/change-loading-win-visibility-state.js +++ b/src/window-creators/change-loading-win-visibility-state.js @@ -160,7 +160,8 @@ const setLoadingDescription = async (params) => { const { windowName = WINDOW_NAMES.STARTUP_LOADING_WINDOW, progress, - description = '' + description = '', + isIndeterminateMode = false } = params ?? {} const win = wins[windowName] @@ -193,24 +194,41 @@ const setLoadingDescription = async (params) => { : '

' const _description = `${progressChunk}${descriptionChunk}` - const loadingDescReadyPromise = windowName === WINDOW_NAMES.LOADING_WINDOW + const loadingDescReadyPromise = ( + !isIndeterminateMode && + windowName === WINDOW_NAMES.LOADING_WINDOW + ) ? GeneralIpcChannelHandlers.onLoadingDescriptionReady() - : GeneralIpcChannelHandlers.onStartupLoadingDescriptionReady() + : null + const startupLoadingDescReadyPromise = ( + !isIndeterminateMode && + windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW + ) + ? GeneralIpcChannelHandlers.onStartupLoadingDescriptionReady() + : null if (windowName === WINDOW_NAMES.LOADING_WINDOW) { - GeneralIpcChannelHandlers - .sendLoadingDescription(win, { description: _description }) + GeneralIpcChannelHandlers.sendLoadingDescription(win, { + description: _description, + isIndeterminateMode + }) } if (windowName === WINDOW_NAMES.STARTUP_LOADING_WINDOW) { - GeneralIpcChannelHandlers - .sendStartupLoadingDescription(win, { description: _description }) + GeneralIpcChannelHandlers.sendStartupLoadingDescription(win, { + description: _description, + isIndeterminateMode + }) } const loadingRes = await loadingDescReadyPromise + const startupLoadingRes = await startupLoadingDescReadyPromise if (loadingRes?.err) { console.error(loadingRes?.err) } + if (startupLoadingRes?.err) { + console.error(loadingRes?.err) + } } catch (err) { console.error(err) } @@ -279,7 +297,8 @@ const showLoadingWindow = async (opts) => { await setLoadingDescription({ windowName, progress: _progress, - description + description, + isIndeterminateMode }) if (!win.isVisible()) { diff --git a/src/window-creators/layouts/loading-window.css b/src/window-creators/layouts/loading-window.css index 861f22ed..e3a3b2f6 100644 --- a/src/window-creators/layouts/loading-window.css +++ b/src/window-creators/layouts/loading-window.css @@ -201,6 +201,11 @@ body { background-color: var(--bgColor, #172d3e); } +.logo--show-constantly { + animation: none; + opacity: 1; +} + .description { display: none; color: var(--color, #172d3e); diff --git a/src/window-creators/layouts/loading-window.html b/src/window-creators/layouts/loading-window.html index ed995bc6..6b81256a 100644 --- a/src/window-creators/layouts/loading-window.html +++ b/src/window-creators/layouts/loading-window.html @@ -27,7 +27,7 @@
- -