mirror of https://github.com/BTCPrivate/copay.git
Merge pull request #6799 from JDonadio/new/latest-release-service
New/latest release service
This commit is contained in:
commit
3d1c60d4d1
|
@ -66,6 +66,7 @@ import { ScanProvider } from '../providers/scan/scan';
|
|||
import { TouchIdProvider } from '../providers/touchid/touchid';
|
||||
import { TxFormatProvider } from '../providers/tx-format/tx-format';
|
||||
import { WalletProvider } from '../providers/wallet/wallet';
|
||||
import { LatestReleaseProvider } from '../providers/latestRelease/latestRelease';
|
||||
|
||||
export function createTranslateLoader(http: Http) {
|
||||
return new TranslatePoHttpLoader(http, 'assets/i18n', '.po');
|
||||
|
@ -115,6 +116,7 @@ let providers: any = [
|
|||
TouchIdProvider,
|
||||
TxFormatProvider,
|
||||
WalletProvider,
|
||||
LatestReleaseProvider,
|
||||
{
|
||||
provide: ErrorHandler,
|
||||
useClass: IonicErrorHandler
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { NavController } from 'ionic-angular';
|
||||
import { ProfileProvider } from '../../providers/profile/profile';
|
||||
import { LatestReleaseProvider } from '../../providers/latestRelease/latestRelease';
|
||||
|
||||
@Component({
|
||||
selector: 'page-home',
|
||||
|
@ -11,13 +12,20 @@ export class HomePage {
|
|||
|
||||
constructor(
|
||||
public navCtrl: NavController,
|
||||
private profile: ProfileProvider
|
||||
private profile: ProfileProvider,
|
||||
private latestRelease: LatestReleaseProvider,
|
||||
) {
|
||||
}
|
||||
|
||||
ionViewDidLoad() {
|
||||
console.log('ionViewDidLoad HomePage');
|
||||
|
||||
this.wallets = this.profile.bind();
|
||||
this.latestRelease.checkLatestRelease().then((response) => {
|
||||
console.log('New release available: ', response);
|
||||
}).catch((error) => {
|
||||
console.log('Latest Release error: ', error);
|
||||
});
|
||||
console.log('[home.ts:20]', this.wallets); //TODO
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
import { LatestReleaseProviderStub } from '../../../test-config/mocks/latestRelease';
|
||||
|
||||
describe('Latest Release Provider', () => {
|
||||
var currentVersion: string;
|
||||
var latestVersion: string;
|
||||
|
||||
beforeEach(() => {
|
||||
// Using the mock => 3.3.3
|
||||
latestVersion = LatestReleaseProviderStub.checkLatestRelease(null, null);
|
||||
});
|
||||
|
||||
it('should check successfully the latest release of the app', () => {
|
||||
expect(latestVersion).toBeDefined();
|
||||
});
|
||||
|
||||
it('should check unsuccessfully the current release format of the app', () => {
|
||||
const result = LatestReleaseProviderStub.checkLatestRelease('V.3.3.3', '3.3.3');
|
||||
expect(result).toMatch('Cannot');
|
||||
expect(result).toMatch('version tag');
|
||||
});
|
||||
|
||||
it('should check unsuccessfully the latest release format of the app', () => {
|
||||
const result = LatestReleaseProviderStub.checkLatestRelease('3.3.3', 'V.3.3.3');
|
||||
expect(result).toMatch('Cannot');
|
||||
expect(result).toMatch('release tag');
|
||||
});
|
||||
|
||||
it('should compare the current and latest version of the app with the same value', () => {
|
||||
currentVersion = '3.3.3';
|
||||
const result = LatestReleaseProviderStub.checkLatestRelease(currentVersion, latestVersion);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('there should be a new version available', () => {
|
||||
currentVersion = '3.2.3';
|
||||
const result = LatestReleaseProviderStub.checkLatestRelease(currentVersion, latestVersion);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('there should not be a new version available', () => {
|
||||
currentVersion = '3.3.2';
|
||||
const result = LatestReleaseProviderStub.checkLatestRelease(currentVersion, latestVersion);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,66 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { Http } from '@angular/http';
|
||||
import 'rxjs/add/operator/map';
|
||||
import 'rxjs/add/operator/toPromise';
|
||||
import { AppProvider } from '../../providers/app/app';
|
||||
|
||||
@Injectable()
|
||||
export class LatestReleaseProvider {
|
||||
private LATEST_RELEASE_URL: string;
|
||||
private appVersion: string;
|
||||
|
||||
constructor(public http: Http, private app: AppProvider) {
|
||||
console.log('Hello LatestRelease Provider');
|
||||
this.LATEST_RELEASE_URL = 'https://api.github.com/repos/bitpay/copay/releases/latest';
|
||||
this.appVersion = this.app.info.version;
|
||||
}
|
||||
|
||||
checkLatestRelease(): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
let self = this;
|
||||
|
||||
self.requestLatestRelease().then((release: any) => {
|
||||
var currentVersion = this.appVersion;
|
||||
var latestVersion = release.tag_name;
|
||||
|
||||
if (!verifyTagFormat(currentVersion))
|
||||
reject('Cannot verify the format of version tag: ' + currentVersion);
|
||||
if (!verifyTagFormat(latestVersion))
|
||||
reject('Cannot verify the format of latest release tag: ' + latestVersion);
|
||||
|
||||
var current = formatTagNumber(currentVersion);
|
||||
var latest = formatTagNumber(latestVersion);
|
||||
|
||||
if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor))
|
||||
resolve(false);
|
||||
else
|
||||
resolve(true);
|
||||
|
||||
function verifyTagFormat(tag: string) {
|
||||
var regex = /^v?\d+\.\d+\.\d+$/i;
|
||||
return regex.exec(tag);
|
||||
};
|
||||
|
||||
function formatTagNumber(tag: string) {
|
||||
var formattedNumber = tag.replace(/^v/i, '').split('.');
|
||||
return {
|
||||
major: +formattedNumber[0],
|
||||
minor: +formattedNumber[1],
|
||||
patch: +formattedNumber[2]
|
||||
};
|
||||
};
|
||||
|
||||
}).catch((error) => {
|
||||
console.log("Error: ", error);
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
requestLatestRelease(): Promise<any> {
|
||||
return this.http.get(this.LATEST_RELEASE_URL)
|
||||
.map((response) => response.json())
|
||||
.toPromise()
|
||||
.catch((error) => console.log("Error", error));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
export let LatestReleaseProviderStub = {
|
||||
checkLatestRelease(currentVersion: string, latestVersion: string) {
|
||||
if (!currentVersion || !latestVersion) return this.requestLatestRelease();
|
||||
|
||||
if (!verifyTagFormat(currentVersion))
|
||||
return ('Cannot verify the format of version tag: ' + currentVersion);
|
||||
if (!verifyTagFormat(latestVersion))
|
||||
return ('Cannot verify the format of latest release tag: ' + latestVersion);
|
||||
|
||||
var current = formatTagNumber(currentVersion);
|
||||
var latest = formatTagNumber(latestVersion);
|
||||
|
||||
if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor))
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
|
||||
function verifyTagFormat(tag: string) {
|
||||
var regex = /^v?\d+\.\d+\.\d+$/i;
|
||||
return regex.exec(tag);
|
||||
};
|
||||
|
||||
function formatTagNumber(tag: string) {
|
||||
var formattedNumber = tag.replace(/^v/i, '').split('.');
|
||||
return {
|
||||
major: +formattedNumber[0],
|
||||
minor: +formattedNumber[1],
|
||||
patch: +formattedNumber[2]
|
||||
};
|
||||
};
|
||||
},
|
||||
|
||||
requestLatestRelease() {
|
||||
return '3.3.3';
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue