diff --git a/public/views/walletHome.html b/public/views/walletHome.html
index f781c6fab..7781e6865 100644
--- a/public/views/walletHome.html
+++ b/public/views/walletHome.html
@@ -134,6 +134,10 @@
+
+ {{newRelease}}
+
+
Payment Proposals
Unsent transactions
diff --git a/src/css/main.css b/src/css/main.css
index f1d0d8ee0..d0bdf0f90 100644
--- a/src/css/main.css
+++ b/src/css/main.css
@@ -596,6 +596,26 @@ ul.manage li {
padding-top: 0 !important;
}
+.release {
+ cursor: pointer;
+ cursor: hand;
+ background-color: #E9E9EC;
+ margin-top: -30px;
+ margin-bottom: 5px;
+ padding-top: 30px;
+ padding-bottom: 20px;
+ text-align: center;
+ text-color: #444;
+ }
+
+ .release span {
+ margin-left: 15px;
+ }
+
+ .release i {
+ margin-right: 15px;
+ }
+
.tab-bar h1, .tab-bar h2, .tab-bar h3, .tab-bar h4, .tab-bar h5, .tab-bar h6 {
line-height: 2.7rem;
}
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js
index 16afabceb..504637d86 100644
--- a/src/js/controllers/index.js
+++ b/src/js/controllers/index.js
@@ -1,6 +1,6 @@
'use strict';
-angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, bwcService, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, nodeWebkit, addonManager, isChromeApp, bwsError, txFormatService, uxLanguage, $state, glideraService, isMobile, addressbookService) {
+angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, latestReleaseService, bwcService, pushNotificationsService, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, nodeWebkit, addonManager, isChromeApp, bwsError, txFormatService, uxLanguage, $state, glideraService, isMobile, addressbookService) {
var self = this;
var SOFT_CONFIRMATION_LIMIT = 12;
var errors = bwcService.getErrors();
@@ -46,6 +46,18 @@ angular.module('copayApp.controllers').controller('indexController', function($r
ret.tab = 'walletHome';
var vanillaScope = ret;
+ if (nodeWebkit.isDefined()) {
+ latestReleaseService.checkLatestRelease(function(err, newRelease) {
+ if (err) {
+ $log.warn(err);
+ return;
+ }
+
+ if (newRelease)
+ $scope.newRelease = gettext('There is a new version of Copay. Please update');
+ });
+ }
+
function strip(number) {
return (parseFloat(number.toPrecision(12)));
};
diff --git a/src/js/services/configService.js b/src/js/services/configService.js
index ba19f59f5..2af73c109 100644
--- a/src/js/services/configService.js
+++ b/src/js/services/configService.js
@@ -42,6 +42,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer
url: 'https://insight.bitpay.com:443/api/rates',
},
+ release: {
+ url: 'https://api.github.com/repos/bitpay/copay/releases/latest'
+ },
+
pushNotifications: {
enabled: true,
config: {
diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latestReleaseService.js
new file mode 100644
index 000000000..be0527d51
--- /dev/null
+++ b/src/js/services/latestReleaseService.js
@@ -0,0 +1,63 @@
+'use strict';
+angular.module('copayApp.services')
+ .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService, gettext, nodeWebkit) {
+
+ var root = {};
+
+ root.checkLatestRelease = function(cb) {
+ var releaseURL = configService.getDefaults().release.url;
+
+ requestLatestRelease(releaseURL, function(err, release) {
+ if (err) return cb(err);
+ var currentVersion = window.version;
+ var latestVersion = release.data.tag_name;
+
+ if (!verifyTagFormat(currentVersion))
+ return cb('Cannot verify the format of version tag: ' + currentVersion);
+ if (!verifyTagFormat(latestVersion))
+ return cb('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 cb(null, false);
+
+ $log.debug('A new version of Copay is available: ' + latestVersion);
+ return cb(null, true);
+ });
+
+ function verifyTagFormat(tag) {
+ var regex = /^v?\d+\.\d+\.\d+$/i;
+ return regex.exec(tag);
+ };
+
+ function formatTagNumber(tag) {
+ var formattedNumber = tag.replace(/^v/i, '').split('.');
+ return {
+ major: +formattedNumber[0],
+ minor: +formattedNumber[1],
+ patch: +formattedNumber[2]
+ };
+ };
+ };
+
+ function requestLatestRelease(releaseURL, cb) {
+ $log.debug('Retrieving latest relsease information...');
+
+ var request = {
+ url: releaseURL,
+ method: 'GET',
+ json: true
+ };
+
+ $http(request).then(function(release) {
+ $log.debug('Latest release: ' + release.data.name);
+ return cb(null, release);
+ }, function(err) {
+ return cb('Cannot get the release information: ' + err);
+ });
+ };
+
+ return root;
+ });