123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /**
- * 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 <http://www.gnu.org/licenses/>.
- */
- 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<string> {
- 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<string>) => {
- 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();
- });
- }
- }
|