diff --git a/ts/updater/common.ts b/ts/updater/common.ts index d4c462d16..c1941eecb 100644 --- a/ts/updater/common.ts +++ b/ts/updater/common.ts @@ -147,10 +147,16 @@ export async function downloadUpdate( } } +let showingUpdateDialog = false; + async function showFallbackUpdateDialog( mainWindow: BrowserWindow, locale: LocaleType -) { +): Promise { + if (showingUpdateDialog) { + return false; + } + const RESTART_BUTTON = 0; const LATER_BUTTON = 1; const options = { @@ -166,8 +172,12 @@ async function showFallbackUpdateDialog( cancelId: LATER_BUTTON, }; + showingUpdateDialog = true; + const { response } = await dialog.showMessageBox(mainWindow, options); + showingUpdateDialog = false; + return response === RESTART_BUTTON; } @@ -188,15 +198,24 @@ export function showUpdateDialog( setTimeout(async () => { if (!ack) { - await showFallbackUpdateDialog(mainWindow, locale); + const shouldUpdate = await showFallbackUpdateDialog(mainWindow, locale); + if (shouldUpdate) { + performUpdateCallback(); + } } }, ACK_RENDER_TIMEOUT); } +let showingCannotUpdateDialog = false; + async function showFallbackCannotUpdateDialog( mainWindow: BrowserWindow, locale: LocaleType -) { +): Promise { + if (showingCannotUpdateDialog) { + return; + } + const options = { type: 'error', buttons: [locale.messages.ok.message], @@ -204,7 +223,11 @@ async function showFallbackCannotUpdateDialog( message: locale.i18n('cannotUpdateDetail', ['https://signal.org/download']), }; + showingCannotUpdateDialog = true; + await dialog.showMessageBox(mainWindow, options); + + showingCannotUpdateDialog = false; } export function showCannotUpdateDialog( diff --git a/ts/updater/macos.ts b/ts/updater/macos.ts index c5d7e15c3..c175c0837 100644 --- a/ts/updater/macos.ts +++ b/ts/updater/macos.ts @@ -24,7 +24,6 @@ import { hexToBinary, verifySignature } from './signature'; import { markShouldQuit } from '../../app/window_state'; import { Dialogs } from '../types/Dialogs'; -let isChecking = false; const SECOND = 1000; const MINUTE = SECOND * 60; const INTERVAL = MINUTE * 30; @@ -60,14 +59,8 @@ async function checkDownloadAndInstall( locale: LocaleType, logger: LoggerType ) { - if (isChecking) { - return; - } - logger.info('checkDownloadAndInstall: checking for update...'); try { - isChecking = true; - const result = await checkForUpdates(logger); if (!result) { return; @@ -121,8 +114,6 @@ async function checkDownloadAndInstall( }); } catch (error) { logger.error('checkDownloadAndInstall: error', getPrintableError(error)); - } finally { - isChecking = false; } } @@ -358,10 +349,16 @@ export function showReadOnlyDialog( }, ACK_RENDER_TIMEOUT); } +let showingReadOnlyDialog = false; + async function showFallbackReadOnlyDialog( mainWindow: BrowserWindow, locale: LocaleType ) { + if (showingReadOnlyDialog) { + return; + } + const options = { type: 'warning', buttons: [locale.messages.ok.message], @@ -369,5 +366,9 @@ async function showFallbackReadOnlyDialog( message: locale.i18n('readOnlyVolume', ['Signal.app', '/Applications']), }; + showingReadOnlyDialog = true; + await dialog.showMessageBox(mainWindow, options); + + showingReadOnlyDialog = false; } diff --git a/ts/updater/windows.ts b/ts/updater/windows.ts index 586d1e933..ca65147d5 100644 --- a/ts/updater/windows.ts +++ b/ts/updater/windows.ts @@ -23,7 +23,6 @@ import { markShouldQuit } from '../../app/window_state'; const readdir = pify(readdirCallback); const unlink = pify(unlinkCallback); -let isChecking = false; const SECOND = 1000; const MINUTE = SECOND * 60; const INTERVAL = MINUTE * 30; @@ -61,13 +60,7 @@ async function checkDownloadAndInstall( locale: LocaleType, logger: LoggerType ) { - if (isChecking) { - return; - } - try { - isChecking = true; - logger.info('checkDownloadAndInstall: checking for update...'); const result = await checkForUpdates(logger); if (!result) { @@ -111,8 +104,6 @@ async function checkDownloadAndInstall( }); } catch (error) { logger.error('checkDownloadAndInstall: error', getPrintableError(error)); - } finally { - isChecking = false; } }