diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 48a196fb25..b6c88d7e3e 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -800,6 +800,10 @@ "messageformat": "Failed to send message with endorsements", "description": "An error popup when we attempted and failed to send a message using endorsements, only for internal users." }, + "icu:Toast--FailedToImportBackup": { + "messageformat": "Failed to process some frames during backup import. Please share your logs.", + "description": "[Only shown to internal users] An error popup when we failed to process some parts of a backup import." + }, "icu:cannotSelectPhotosAndVideosAlongWithFiles": { "messageformat": "You can't select photos and videos along with files.", "description": "An error popup when the user has attempted to add an attachment" diff --git a/stylesheets/components/InstallScreenBackupImportStep.scss b/stylesheets/components/InstallScreenBackupImportStep.scss index 2c22706e22..8e1def945b 100644 --- a/stylesheets/components/InstallScreenBackupImportStep.scss +++ b/stylesheets/components/InstallScreenBackupImportStep.scss @@ -17,7 +17,7 @@ flex-direction: column; justify-content: center; text-align: center; - margin-top: 72px; + margin-top: 84px; flex: 1; } diff --git a/ts/components/ToastManager.stories.tsx b/ts/components/ToastManager.stories.tsx index aedefc3a64..73df1860d8 100644 --- a/ts/components/ToastManager.stories.tsx +++ b/ts/components/ToastManager.stories.tsx @@ -105,6 +105,8 @@ function getToast(toastType: ToastType): AnyToast { return { toastType: ToastType.FailedToFetchUsername }; case ToastType.FailedToSendWithEndorsements: return { toastType: ToastType.FailedToSendWithEndorsements }; + case ToastType.FailedToImportBackup: + return { toastType: ToastType.FailedToImportBackup }; case ToastType.FileSaved: return { toastType: ToastType.FileSaved, diff --git a/ts/components/ToastManager.tsx b/ts/components/ToastManager.tsx index 04ffcc2d27..f6b3c727e2 100644 --- a/ts/components/ToastManager.tsx +++ b/ts/components/ToastManager.tsx @@ -309,6 +309,20 @@ export function renderToast({ ); } + if (toastType === ToastType.FailedToImportBackup) { + return ( + + {i18n('icu:Toast--FailedToImportBackup')} + + ); + } + if (toastType === ToastType.FileSaved) { return ( (); + private frameErrorCount: number = 0; private constructor(private readonly backupType: BackupType) { super({ objectMode: true }); @@ -359,6 +362,20 @@ export class BackupImportStream extends Writable { await startBackupMediaDownload(); } + if (this.frameErrorCount > 0) { + log.error( + `${this.logId}: errored while processing ${this.frameErrorCount} frames.` + ); + if (isAlpha(window.getVersion())) { + window.reduxActions.toast.showToast({ + toastType: ToastType.FailedToImportBackup, + }); + } + // TODO (DESKTOP-7934): throw in tests if we cannot process a frame + } else { + log.info(`${this.logId}: successfully processed all frames.`); + } + done(); } catch (error) { done(error); @@ -440,6 +457,7 @@ export class BackupImportStream extends Writable { log.warn(`${this.logId}: unsupported frame item ${frame.item}`); } } catch (error) { + this.frameErrorCount += 1; log.error( `${this.logId}: failed to process a frame ${frame.item}, ` + `${Errors.toLogFormat(error)}` diff --git a/ts/services/backups/index.ts b/ts/services/backups/index.ts index 6c3a67b47c..0a01d2c590 100644 --- a/ts/services/backups/index.ts +++ b/ts/services/backups/index.ts @@ -50,6 +50,8 @@ import { BackupAPI } from './api'; import { validateBackup } from './validator'; import { BackupType } from './types'; import { UnsupportedBackupVersion } from './errors'; +import { ToastType } from '../../types/Toast'; +import { isAlpha } from '../../util/version'; export { BackupType }; @@ -385,6 +387,13 @@ export class BackupsService { log.info('importBackup: finished...'); } catch (error) { log.info(`importBackup: failed, error: ${Errors.toLogFormat(error)}`); + + if (isAlpha(window.getVersion())) { + window.reduxActions.toast.showToast({ + toastType: ToastType.FailedToImportBackup, + }); + } + throw error; } finally { this.isRunning = false; diff --git a/ts/types/Toast.tsx b/ts/types/Toast.tsx index f4e4b1563a..326edbe065 100644 --- a/ts/types/Toast.tsx +++ b/ts/types/Toast.tsx @@ -35,6 +35,7 @@ export enum ToastType { FailedToFetchPhoneNumber = 'FailedToFetchPhoneNumber', FailedToFetchUsername = 'FailedToFetchUsername', FailedToSendWithEndorsements = 'FailedToSendWithEndorsements', + FailedToImportBackup = 'FailedToImportBackup', FileSaved = 'FileSaved', FileSize = 'FileSize', GroupLinkCopied = 'GroupLinkCopied', @@ -113,6 +114,7 @@ export type AnyToast = | { toastType: ToastType.FailedToFetchPhoneNumber } | { toastType: ToastType.FailedToFetchUsername } | { toastType: ToastType.FailedToSendWithEndorsements } + | { toastType: ToastType.FailedToImportBackup } | { toastType: ToastType.FileSaved; parameters: { fullPath: string; countOfFiles?: number };