diff --git a/wowup-electron/package.json b/wowup-electron/package.json index e59e4e8b..d79dab2b 100644 --- a/wowup-electron/package.json +++ b/wowup-electron/package.json @@ -146,6 +146,7 @@ "protobufjs": "6.10.2", "rxjs": "6.6.3", "slug": "4.0.2", + "ts-custom-error": "3.2.0", "uuid": "8.3.2" } } diff --git a/wowup-electron/src/app/components/addon-update-button/addon-update-button.component.ts b/wowup-electron/src/app/components/addon-update-button/addon-update-button.component.ts index e5b233a7..06ba2386 100644 --- a/wowup-electron/src/app/components/addon-update-button/addon-update-button.component.ts +++ b/wowup-electron/src/app/components/addon-update-button/addon-update-button.component.ts @@ -57,7 +57,8 @@ export class AddonUpdateButtonComponent implements OnInit, OnDestroy { public getIsButtonActive() { return ( this.listItem?.installState !== AddonInstallState.Unknown && - this.listItem?.installState !== AddonInstallState.Complete + this.listItem?.installState !== AddonInstallState.Complete && + this.listItem?.installState !== AddonInstallState.Error ); } @@ -109,6 +110,8 @@ export class AddonUpdateButtonComponent implements OnInit, OnDestroy { return this._translateService.instant("COMMON.ADDON_STATUS.INSTALLING"); case AddonInstallState.Pending: return this._translateService.instant("COMMON.ADDON_STATUS.PENDING"); + case AddonInstallState.Error: + return this._translateService.instant("COMMON.ADDON_STATUS.ERROR"); default: return ""; } diff --git a/wowup-electron/src/app/errors/index.ts b/wowup-electron/src/app/errors/index.ts new file mode 100644 index 00000000..89847a0f --- /dev/null +++ b/wowup-electron/src/app/errors/index.ts @@ -0,0 +1 @@ +export * from "./install-error"; diff --git a/wowup-electron/src/app/errors/install-error.ts b/wowup-electron/src/app/errors/install-error.ts new file mode 100644 index 00000000..750bcc68 --- /dev/null +++ b/wowup-electron/src/app/errors/install-error.ts @@ -0,0 +1,7 @@ +import { CustomError } from "ts-custom-error"; + +export class InstallError extends CustomError { + public constructor(message?: string, public addonName?: string) { + super(message); + } +} diff --git a/wowup-electron/src/app/models/wowup/addon-install-state.ts b/wowup-electron/src/app/models/wowup/addon-install-state.ts index e76281ba..c638b5fb 100644 --- a/wowup-electron/src/app/models/wowup/addon-install-state.ts +++ b/wowup-electron/src/app/models/wowup/addon-install-state.ts @@ -4,5 +4,6 @@ export enum AddonInstallState { BackingUp, Installing, Complete, + Error, Unknown, } diff --git a/wowup-electron/src/app/services/addons/addon.service.ts b/wowup-electron/src/app/services/addons/addon.service.ts index d9f5b5eb..90f9cceb 100644 --- a/wowup-electron/src/app/services/addons/addon.service.ts +++ b/wowup-electron/src/app/services/addons/addon.service.ts @@ -39,6 +39,7 @@ import { WarcraftService } from "../warcraft/warcraft.service"; import { WowUpService } from "../wowup/wowup.service"; import { AddonProviderFactory } from "./addon.provider.factory"; import { AddonFolder } from "../../models/wowup/addon-folder"; +import { InstallError } from "../../errors"; export enum ScanUpdateType { Start, @@ -71,11 +72,13 @@ export class AddonService { private readonly _addonInstalledSrc = new Subject(); private readonly _addonRemovedSrc = new Subject(); private readonly _scanUpdateSrc = new BehaviorSubject({ type: ScanUpdateType.Unknown }); + private readonly _installErrorSrc = new Subject(); private readonly _installQueue = new Subject(); public readonly addonInstalled$ = this._addonInstalledSrc.asObservable(); public readonly addonRemoved$ = this._addonRemovedSrc.asObservable(); public readonly scanUpdate$ = this._scanUpdateSrc.asObservable(); + public readonly installError$ = this._installErrorSrc.asObservable(); constructor( private _addonStorage: AddonStorageService, @@ -89,8 +92,14 @@ export class AddonService { ) { this._addonProviders = addonProviderFactory.getAll(); - this._installQueue.pipe(mergeMap((item) => from(this.processInstallQueue(item)), 3)).subscribe((addonName) => { - console.log("Install complete", addonName); + this._installQueue.pipe(mergeMap((item) => from(this.processInstallQueue(item)), 3)).subscribe({ + next: (addonName) => { + console.log("Install complete", addonName); + }, + error: (error) => { + console.error(error); + this._installErrorSrc.next(error); + }, }); // Attempt to remove addons for clients that were lost @@ -323,6 +332,7 @@ export class AddonService { let downloadedFilePath = ""; let unzippedDirectory = ""; + try { downloadedFilePath = await this._downloadService.downloadZipFile( addon.downloadUrl, @@ -395,9 +405,23 @@ export class AddonService { this.reconcileExternalIds(addon, queueItem.originalAddon); queueItem.completion.resolve(); + + onUpdate?.call(this, AddonInstallState.Complete, 100); + this._addonInstalledSrc.next({ + addon, + installState: AddonInstallState.Complete, + progress: 100, + }); } catch (err) { console.error(err); queueItem.completion.reject(err); + + onUpdate?.call(this, AddonInstallState.Error, 100); + this._addonInstalledSrc.next({ + addon, + installState: AddonInstallState.Error, + progress: 100, + }); } finally { const unzippedDirectoryExists = await this._fileService.pathExists(unzippedDirectory); @@ -412,13 +436,6 @@ export class AddonService { } } - onUpdate?.call(this, AddonInstallState.Complete, 100); - this._addonInstalledSrc.next({ - addon, - installState: AddonInstallState.Complete, - progress: 100, - }); - return addon.name; }; diff --git a/wowup-electron/src/assets/i18n/de.json b/wowup-electron/src/assets/i18n/de.json index a656b80f..2dad7acf 100644 --- a/wowup-electron/src/assets/i18n/de.json +++ b/wowup-electron/src/assets/i18n/de.json @@ -46,6 +46,7 @@ "BACKINGUP": "Backup wird erstellt", "COMPLETE": "Vollständig", "DOWNLOADING": "Herunterladen...", + "ERROR": "Error", "INSTALLING": "Installieren...", "PENDING": "Ausstehend", "UNINSTALLING": "Deinstallieren...", diff --git a/wowup-electron/src/assets/i18n/en.json b/wowup-electron/src/assets/i18n/en.json index 21ea76f4..10c1dc18 100644 --- a/wowup-electron/src/assets/i18n/en.json +++ b/wowup-electron/src/assets/i18n/en.json @@ -46,6 +46,7 @@ "BACKINGUP": "Backing Up", "COMPLETE": "Installed", "DOWNLOADING": "Downloading", + "ERROR": "Error", "INSTALLING": "Installing", "PENDING": "Pending", "UNINSTALLING": "Uninstalling", diff --git a/wowup-electron/src/assets/i18n/es.json b/wowup-electron/src/assets/i18n/es.json index fcac568a..23a312b2 100644 --- a/wowup-electron/src/assets/i18n/es.json +++ b/wowup-electron/src/assets/i18n/es.json @@ -46,6 +46,7 @@ "BACKINGUP": "Respaldando", "COMPLETE": "Instalado", "DOWNLOADING": "Descargando", + "ERROR": "Error", "INSTALLING": "Instalando", "PENDING": "Pendiente", "UNINSTALLING": "Desinstalando", diff --git a/wowup-electron/src/assets/i18n/fr.json b/wowup-electron/src/assets/i18n/fr.json index 59e4ec6d..fc0f5d58 100644 --- a/wowup-electron/src/assets/i18n/fr.json +++ b/wowup-electron/src/assets/i18n/fr.json @@ -46,6 +46,7 @@ "BACKINGUP": "Sauvegarde", "COMPLETE": "Installé", "DOWNLOADING": "Téléchargement", + "ERROR": "Error", "INSTALLING": "Installation", "PENDING": "En attente", "UNINSTALLING": "Désinstallation", diff --git a/wowup-electron/src/assets/i18n/it.json b/wowup-electron/src/assets/i18n/it.json index 268a1d48..5a579bd1 100644 --- a/wowup-electron/src/assets/i18n/it.json +++ b/wowup-electron/src/assets/i18n/it.json @@ -46,6 +46,7 @@ "BACKINGUP": "Backup in corso", "COMPLETE": "Installato", "DOWNLOADING": "Download in corso", + "ERROR": "Error", "INSTALLING": "Installazione in corso", "PENDING": "In sospeso", "UNINSTALLING": "Disinstallazione in corso", diff --git a/wowup-electron/src/assets/i18n/ko.json b/wowup-electron/src/assets/i18n/ko.json index f1afc4ed..a3b43ebc 100644 --- a/wowup-electron/src/assets/i18n/ko.json +++ b/wowup-electron/src/assets/i18n/ko.json @@ -46,6 +46,7 @@ "BACKINGUP": "백업 중", "COMPLETE": "설치됨", "DOWNLOADING": "다운로드 중", + "ERROR": "Error", "INSTALLING": "설치 중", "PENDING": "일시정지됨", "UNINSTALLING": "삭제 중", diff --git a/wowup-electron/src/assets/i18n/nb.json b/wowup-electron/src/assets/i18n/nb.json index ffaae0fc..3fb84843 100644 --- a/wowup-electron/src/assets/i18n/nb.json +++ b/wowup-electron/src/assets/i18n/nb.json @@ -46,6 +46,7 @@ "BACKINGUP": "Sikkerhetskopierer", "COMPLETE": "Installert", "DOWNLOADING": "Laster Ned", + "ERROR": "Error", "INSTALLING": "Installerer", "PENDING": "Venter", "UNINSTALLING": "Avinstallerer", diff --git a/wowup-electron/src/assets/i18n/pt.json b/wowup-electron/src/assets/i18n/pt.json index 0f207e29..0393476a 100644 --- a/wowup-electron/src/assets/i18n/pt.json +++ b/wowup-electron/src/assets/i18n/pt.json @@ -46,6 +46,7 @@ "BACKINGUP": "Fazendo Backup", "COMPLETE": "Instalado", "DOWNLOADING": "Baixando", + "ERROR": "Error", "INSTALLING": "Instalando", "PENDING": "Pendente", "UNINSTALLING": "Desinstalando", diff --git a/wowup-electron/src/assets/i18n/ru.json b/wowup-electron/src/assets/i18n/ru.json index 7931004b..7ce35a05 100644 --- a/wowup-electron/src/assets/i18n/ru.json +++ b/wowup-electron/src/assets/i18n/ru.json @@ -46,6 +46,7 @@ "BACKINGUP": "Резервное копирование", "COMPLETE": "Установлена", "DOWNLOADING": "Загружается", + "ERROR": "Error", "INSTALLING": "Устанавливается", "PENDING": "В ожидании", "UNINSTALLING": "Удаляется", diff --git a/wowup-electron/src/assets/i18n/zh-TW.json b/wowup-electron/src/assets/i18n/zh-TW.json index e6017e27..8400e2bd 100644 --- a/wowup-electron/src/assets/i18n/zh-TW.json +++ b/wowup-electron/src/assets/i18n/zh-TW.json @@ -46,6 +46,7 @@ "BACKINGUP": "正在備份", "COMPLETE": "已安裝", "DOWNLOADING": "正在下載", + "ERROR": "Error", "INSTALLING": "正在安裝", "PENDING": "等待中", "UNINSTALLING": "正在解除安裝", diff --git a/wowup-electron/src/assets/i18n/zh.json b/wowup-electron/src/assets/i18n/zh.json index 8e19f533..454ad427 100644 --- a/wowup-electron/src/assets/i18n/zh.json +++ b/wowup-electron/src/assets/i18n/zh.json @@ -46,6 +46,7 @@ "BACKINGUP": "正在备份", "COMPLETE": "已安装", "DOWNLOADING": "正在下载", + "ERROR": "Error", "INSTALLING": "正在安装", "PENDING": "等待中", "UNINSTALLING": "正在卸载",