/** * This file is part of Threema Web. * * Threema Web is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero * General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Threema Web. If not, see . */ export class VersionService { public static $inject = ['$log', '$http', '$mdDialog', '$translate', '$window']; private logTag: string = '[VersionService]'; private $log: ng.ILogService; private $http: ng.IHttpService; private $mdDialog: ng.material.IDialogService; private $translate: ng.translate.ITranslateService; private $window: ng.IWindowService; private version: string; private dialogShowing = false; constructor($log: ng.ILogService, $http: ng.IHttpService, $mdDialog: ng.material.IDialogService, $translate: ng.translate.ITranslateService, $window: ng.IWindowService) { this.$log = $log; this.$http = $http; this.$mdDialog = $mdDialog; this.$translate = $translate; this.$window = $window; } /** * Set the version by fetching the version.txt file. */ public initVersion(): void { if (this.version !== undefined) { this.checkForUpdate(); return; } this.fetchVersion() .then((version: string) => { this.version = version; this.$log.info(this.logTag, 'Using Threema Web version', this.version); }) .catch((error: string) => { this.$log.error(this.logTag, 'Could not fetch version.txt:', error); }); } /** * Fetch the version.txt file. */ private fetchVersion(): Promise { return new Promise((resolve, reject) => { const cacheBust = Math.floor(Math.random() * 1000000000); this.$http({ method: 'GET', url: 'version.txt?' + cacheBust, cache: false, responseType: 'text', transformResponse: (data: string, headersGetter, statusCode) => { if (statusCode !== 200) { return reject('HTTP ' + statusCode); } return data.trim(); }, }).then( (successResponse: ng.IHttpPromiseCallbackArg) => { return resolve(successResponse.data); }, (error: Error) => { return reject(error); }, ); }); } /** * Check for a version update. If the version was updated, show a dialog. */ public checkForUpdate(): void { this.$log.debug(this.logTag, 'Checking for version update...'); if (this.version === undefined) { this.$log.error(this.logTag, 'Cannot check for update, version is not initialized'); return; } this.fetchVersion() .then((version: string) => { if (version !== this.version) { this.$log.warn(this.logTag, 'A new version of Threema Web is available:', this.version, '->', version); this.notifyNewVersion(version); } }) .catch((error: string) => { this.$log.error('Could not fetch version.txt:', error); }); } /** * A new version is available! */ private notifyNewVersion(version: string): void { if (this.dialogShowing === true) { // Don't show again if dialog is already showing. return; } const confirm = this.$mdDialog.alert() .title(this.$translate.instant('version.NEW_VERSION', {version: version})) .textContent(this.$translate.instant('version.NEW_VERSION_BODY', {version: version})) .ok(this.$translate.instant('common.OK')); this.dialogShowing = true; this.$mdDialog.show(confirm).then(() => { this.$window.location.reload(); }, () => { this.$window.location.reload(); }); } }