From 2c2c21bcdfa71e06fd339f64060604a01791f84b Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 27 Aug 2018 14:06:10 +0200 Subject: [PATCH 1/4] Update notifications now able to parse "rc"'s and also show release notes from GitHub. --- src/js/controllers/tab-home.js | 27 +++++------ src/js/services/latestReleaseService.js | 64 ++++++++++++++++++++----- src/sass/views/tab-home.scss | 5 ++ www/views/tab-home.html | 4 +- 4 files changed, 74 insertions(+), 26 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 318fcece2..a7332cb76 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -43,20 +43,19 @@ angular.module('copayApp.controllers').controller('tabHomeController', }); } - if ($scope.isNW) { - latestReleaseService.checkLatestRelease(function(err, newRelease) { - if (err) { - $log.warn(err); - return; - } - if (newRelease) { - $scope.newRelease = true; - $scope.updateText = gettextCatalog.getString('There is a new version of {{appName}} available', { - appName: $scope.name - }); - } - }); - } + latestReleaseService.checkLatestRelease(function(err, newReleaseData) { + if (err) { + $log.warn(err); + return; + } + if (newReleaseData) { + $scope.newRelease = true; + $scope.newReleaseText = gettextCatalog.getString('There is a new version of {{appName}} available', { + appName: $scope.name + }); + $scope.newReleaseNotes = newReleaseData.releaseNotes; + } + }); }; function onEnter(event, data) { diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latestReleaseService.js index 87aace87f..96614715d 100644 --- a/src/js/services/latestReleaseService.js +++ b/src/js/services/latestReleaseService.js @@ -1,16 +1,16 @@ 'use strict'; angular.module('copayApp.services') - .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService) { + .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService, platformInfo) { var root = {}; root.checkLatestRelease = function(cb) { var releaseURL = configService.getDefaults().release.url; - requestLatestRelease(releaseURL, function(err, release) { + requestLatestRelease(releaseURL, function(err, releaseData) { if (err) return cb(err); var currentVersion = window.version; - var latestVersion = release.data.tag_name; + var latestVersion = releaseData.tag_name; if (!verifyTagFormat(currentVersion)) return cb('Cannot verify the format of version tag: ' + currentVersion); @@ -20,30 +20,72 @@ angular.module('copayApp.services') var current = formatTagNumber(currentVersion); var latest = formatTagNumber(latestVersion); - if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor)) + if (latest.major < current.major || (latest.major === current.major && latest.minor <= current.minor)) { return cb(null, false); + } + + var releaseSearchTerm = ""; + if (platformInfo.isNW) { // XX SP: DESKTOP: Check if the latest release is already available for current OS + var platform = process.platform; + if (platform === "darwin") { + releaseSearchTerm = "osx"; + } else if (platform === "win32") { + releaseSearchTerm = "win"; + } else if (platform === "linux") { + releaseSearchTerm = "linux"; + } + var foundNewVersion = false; + for (var i in releaseData.assets) { + if (releaseData.assets[i].name.indexOf(releaseSearchTerm) !== -1) { + foundNewVersion = true; + break; + } + } + } $log.debug('A new version is available: ' + latestVersion); - return cb(null, true); + + // + var releaseNotes = false; + if (releaseData.body) { + var releaseLines = releaseData.body.split('\n'); + for (var lineNum in releaseLines) { + if (releaseLines[lineNum].substring(0, 2) === "# ") { + releaseLines[lineNum] = ""+releaseLines[lineNum].substring(2)+""; + } else if (releaseLines[lineNum].substring(0, 2) === "- ") { + releaseLines[lineNum] = "• "+releaseLines[lineNum].substring(2); + } + } + releaseNotes = releaseLines.join('\n'); + } + + return cb(null, {latestVersion: latestVersion, releaseNotes: releaseNotes}); }); function verifyTagFormat(tag) { - var regex = /^v?\d+\.\d+\.\d+$/i; + var regex = /^v?\d+\.\d+(\.\d+)?(-rc\d)?$/i; return regex.exec(tag); }; function formatTagNumber(tag) { + var label = false; + if (tag.split("-")[1]) { // Move postfixes like "-rc2" to a variable + label = tag.split("-")[1]; + tag = tag.split("-")[0]; + } + var formattedNumber = tag.replace(/^v/i, '').split('.'); return { - major: +formattedNumber[0], - minor: +formattedNumber[1], - patch: +formattedNumber[2] + major: +(formattedNumber[0]?+formattedNumber[0]:0), + minor: +(formattedNumber[1]?+formattedNumber[1]:0), + patch: +(formattedNumber[2]?+formattedNumber[2]:0), + label: label /* XX SP: we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */ }; }; }; function requestLatestRelease(releaseURL, cb) { - $log.debug('Retrieving latest relsease information...'); + $log.debug('Retrieving latest release information...'); var request = { url: releaseURL, @@ -53,7 +95,7 @@ angular.module('copayApp.services') $http(request).then(function(release) { $log.debug('Latest release: ' + release.data.name); - return cb(null, release); + return cb(null, release.data); }, function(err) { return cb('Cannot get the release information: ' + err); }); diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index 55080ab7b..4cc5ce5ed 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -173,6 +173,11 @@ font-weight: 700; color: #444; } + .release-notes { + white-space: pre; + white-space: pre-line; + text-align: left; + } .button { width: 100%; border: none; diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 8ef922918..01182f09d 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -15,7 +15,9 @@ -
{{updateText}}
+
{{newReleaseText}}
+
+
Download From d65e4401ddb334e39d1749cbce24abe73449e422 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 30 Aug 2018 14:10:46 +0200 Subject: [PATCH 2/4] Update popup --- src/js/controllers/tab-home.js | 18 +++----- src/js/services/latestReleaseService.js | 58 +++++++++++++++++++++++-- src/sass/views/tab-home.scss | 10 +++++ www/views/tab-home.html | 2 +- 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index a7332cb76..825959464 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -56,7 +56,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.newReleaseNotes = newReleaseData.releaseNotes; } }); - }; + } function onEnter(event, data) { $ionicNavBarDelegate.showBar(true); @@ -108,13 +108,13 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.$apply(); }, 10); }); - }; + } function onLeave (event, data) { lodash.each(listeners, function(x) { x(); }); - }; + } $scope.createdWithinPastDay = function(time) { return timeService.withinPastDay(time); @@ -123,16 +123,10 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.startFreshSend = function() { sendFlowService.clear(); $state.go('tabs.send'); - } + }; - $scope.openExternalLink = function() { - var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest'; - var optIn = true; - var title = gettextCatalog.getString('Update Available'); - var message = gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.'); - var okText = gettextCatalog.getString('View Update'); - var cancelText = gettextCatalog.getString('Go Back'); - externalLinkService.open(url, optIn, title, message, okText, cancelText); + $scope.showUpdatePopup = function() { + latestReleaseService.showUpdatePopup(); }; $scope.openBannerUrl = function() { diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latestReleaseService.js index 96614715d..fbcf01ada 100644 --- a/src/js/services/latestReleaseService.js +++ b/src/js/services/latestReleaseService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService, platformInfo) { + .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, $ionicPopup, configService, externalLinkService, gettextCatalog, platformInfo) { var root = {}; @@ -65,7 +65,7 @@ angular.module('copayApp.services') function verifyTagFormat(tag) { var regex = /^v?\d+\.\d+(\.\d+)?(-rc\d)?$/i; return regex.exec(tag); - }; + } function formatTagNumber(tag) { var label = false; @@ -79,9 +79,9 @@ angular.module('copayApp.services') major: +(formattedNumber[0]?+formattedNumber[0]:0), minor: +(formattedNumber[1]?+formattedNumber[1]:0), patch: +(formattedNumber[2]?+formattedNumber[2]:0), - label: label /* XX SP: we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */ + label: label /* XX SP: Maybe we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */ }; - }; + } }; function requestLatestRelease(releaseURL, cb) { @@ -99,6 +99,56 @@ angular.module('copayApp.services') }, function(err) { return cb('Cannot get the release information: ' + err); }); + } + + root.showUpdatePopup = function () { + var buttons = [{ + text: "GitHub", + type: 'button-positive', + onTap: function () { + var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest'; + externalLinkService.open(url, false); + } + }]; + + if (platformInfo.isAndroid) { + buttons.unshift({ + text: "Google Play Store", + type: 'button-positive', + onTap: function () { + var url = 'https://play.google.com/store/apps/details?id=com.bitcoin.mwallet'; + externalLinkService.open(url, false); + } + }); + } + if (platformInfo.isIOS) { + buttons.unshift({ + text: "App Store", + type: 'button-positive', + onTap: function () { + var url = 'https://itunes.apple.com/app/bitcoin-com-wallet/id1383072453'; + externalLinkService.open(url, false); + } + }); + } + + if (buttons.length === 1) { // There is only one source to download (probably on desktop, so open GitHub release page..) + buttons[0].onTap(); + } else { + buttons.push({ + text: gettextCatalog.getString('Go Back'), + type: 'button-positive', + onTap: function () { + return true; + } + }); + $ionicPopup.show({ + title: gettextCatalog.getString('Update Available'), + subTitle: gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.'), + cssClass: 'popup-update', + buttons: buttons + }); + } }; return root; diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index 4cc5ce5ed..c4b3a3ec4 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -195,3 +195,13 @@ top:11px; } } +.popup-update { + .popup-buttons { + display: block; + } + .popup-buttons .button{ + display:block; + min-width: 100% !important; + margin-top: 4px; + } +} \ No newline at end of file diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 01182f09d..7191c1c16 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -19,7 +19,7 @@
-
+
Download
From 274d221af05e682f449c498b570723e170f06983 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 3 Sep 2018 13:45:40 +0200 Subject: [PATCH 3/4] Links changed, app store added and some logic added --- src/js/services/latestReleaseService.js | 32 ++++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latestReleaseService.js index fbcf01ada..d853624a8 100644 --- a/src/js/services/latestReleaseService.js +++ b/src/js/services/latestReleaseService.js @@ -102,15 +102,18 @@ angular.module('copayApp.services') } root.showUpdatePopup = function () { - var buttons = [{ - text: "GitHub", - type: 'button-positive', - onTap: function () { - var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest'; - externalLinkService.open(url, false); - } - }]; + var buttons = []; + if (!platformInfo.isIOS) { // There is no GitHub-release for iPhone + buttons.push({ + text: "GitHub", + type: 'button-positive', + onTap: function () { + var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest'; + externalLinkService.open(url, false); + } + }); + } if (platformInfo.isAndroid) { buttons.unshift({ text: "Google Play Store", @@ -126,10 +129,21 @@ angular.module('copayApp.services') text: "App Store", type: 'button-positive', onTap: function () { - var url = 'https://itunes.apple.com/app/bitcoin-com-wallet/id1383072453'; + var url = 'https://itunes.apple.com/app/id1252903728'; externalLinkService.open(url, false); } }); + } else if (platformInfo.isNW) { + if (process.platform === 'darwin') { + buttons.unshift({ + text: "Mac App Store", + type: 'button-positive', + onTap: function () { + var url = 'https://itunes.apple.com/app/bitcoin-com-wallet/id1383072453'; + externalLinkService.open(url, false); + } + }); + } } if (buttons.length === 1) { // There is only one source to download (probably on desktop, so open GitHub release page..) From 828cb927dc919e76efc1eb5cb370be5dc3826455 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 6 Sep 2018 13:16:32 +0200 Subject: [PATCH 4/4] refactor latestReleaseService to new format --- ...seService.js => latest-release.service.js} | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) rename src/js/services/{latestReleaseService.js => latest-release.service.js} (82%) diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latest-release.service.js similarity index 82% rename from src/js/services/latestReleaseService.js rename to src/js/services/latest-release.service.js index d853624a8..85c50bb03 100644 --- a/src/js/services/latestReleaseService.js +++ b/src/js/services/latest-release.service.js @@ -1,13 +1,26 @@ 'use strict'; -angular.module('copayApp.services') - .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, $ionicPopup, configService, externalLinkService, gettextCatalog, platformInfo) { - var root = {}; +(function() { - root.checkLatestRelease = function(cb) { + angular + .module('bitcoincom.services') + .factory('latestReleaseService', latestReleaseService); + + function latestReleaseService($log, $http, $ionicPopup, configService, externalLinkService, gettextCatalog, platformInfo) { + + var service = { + // Functions + checkLatestRelease: checkLatestRelease, + requestLatestRelease: requestLatestRelease, + showUpdatePopup: showUpdatePopup + }; + + return service; + + function checkLatestRelease(cb) { var releaseURL = configService.getDefaults().release.url; - requestLatestRelease(releaseURL, function(err, releaseData) { + requestLatestRelease(releaseURL, function (err, releaseData) { if (err) return cb(err); var currentVersion = window.version; var latestVersion = releaseData.tag_name; @@ -45,15 +58,14 @@ angular.module('copayApp.services') $log.debug('A new version is available: ' + latestVersion); - // var releaseNotes = false; if (releaseData.body) { var releaseLines = releaseData.body.split('\n'); for (var lineNum in releaseLines) { if (releaseLines[lineNum].substring(0, 2) === "# ") { - releaseLines[lineNum] = ""+releaseLines[lineNum].substring(2)+""; + releaseLines[lineNum] = "" + releaseLines[lineNum].substring(2) + ""; } else if (releaseLines[lineNum].substring(0, 2) === "- ") { - releaseLines[lineNum] = "• "+releaseLines[lineNum].substring(2); + releaseLines[lineNum] = "• " + releaseLines[lineNum].substring(2); } } releaseNotes = releaseLines.join('\n'); @@ -76,13 +88,13 @@ angular.module('copayApp.services') var formattedNumber = tag.replace(/^v/i, '').split('.'); return { - major: +(formattedNumber[0]?+formattedNumber[0]:0), - minor: +(formattedNumber[1]?+formattedNumber[1]:0), - patch: +(formattedNumber[2]?+formattedNumber[2]:0), + major: +(formattedNumber[0] ? +formattedNumber[0] : 0), + minor: +(formattedNumber[1] ? +formattedNumber[1] : 0), + patch: +(formattedNumber[2] ? +formattedNumber[2] : 0), label: label /* XX SP: Maybe we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */ }; } - }; + } function requestLatestRelease(releaseURL, cb) { $log.debug('Retrieving latest release information...'); @@ -93,15 +105,15 @@ angular.module('copayApp.services') json: true }; - $http(request).then(function(release) { + $http(request).then(function (release) { $log.debug('Latest release: ' + release.data.name); return cb(null, release.data); - }, function(err) { + }, function (err) { return cb('Cannot get the release information: ' + err); }); } - root.showUpdatePopup = function () { + function showUpdatePopup() { var buttons = []; if (!platformInfo.isIOS) { // There is no GitHub-release for iPhone @@ -163,7 +175,6 @@ angular.module('copayApp.services') buttons: buttons }); } - }; - - return root; - }); + } + } +})(); \ No newline at end of file