Merge branch 'master' of https://github.com/bitpay/copay into bug/fix-parse-empty-bitpay-account-storage

This commit is contained in:
Andy Phillipson 2016-11-16 10:13:36 -05:00
commit 288170fd33
46 changed files with 1049 additions and 351 deletions

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, platformInfo, configService, storageService) {
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, platformInfo, configService, storageService, lodash) {
$scope.score = parseInt($stateParams.score);
$scope.skipped = $stateParams.skipped == 'false' ? false : true;
$scope.isCordova = platformInfo.isCordova;
@ -31,8 +31,13 @@ angular.module('copayApp.controllers').controller('completeController', function
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
if(window.StatusBar){
$log.debug('Hiding status bar...');
StatusBar.hide();
}
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = JSON.parse(info);
var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null;
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {});
});
@ -78,4 +83,22 @@ angular.module('copayApp.controllers').controller('completeController', function
}
}, 100);
});
$scope.$on("$ionicView.afterLeave", function() {
if(window.StatusBar){
$log.debug('Showing status bar...');
StatusBar.show();
}
});
$scope.close = function() {
$ionicHistory.clearHistory();
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$timeout(function() {
$state.go('tabs.home');
}, 100);
};
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, lodash, externalLinkService, configService, gettextCatalog, platformInfo, feedbackService, ongoingProcess) {
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, lodash, externalLinkService, configService, gettextCatalog, platformInfo, feedbackService, ongoingProcess, popupService) {
$scope.score = parseInt($stateParams.score);
var isAndroid = platformInfo.isAndroid;
var isIOS = platformInfo.isIOS;
@ -22,28 +22,39 @@ angular.module('copayApp.controllers').controller('rateAppController', function(
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send feedback'));
return;
}
$state.go('feedback.complete', {
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: true
});
});
};
$scope.$on("$ionicView.beforeEnter", function() {
if(window.StatusBar){
$log.debug('Hiding status bar...');
StatusBar.hide();
}
});
$scope.$on("$ionicView.afterLeave", function() {
if(window.StatusBar){
$log.debug('Showing status bar...');
StatusBar.show();
}
});
$scope.sendFeedback = function() {
$state.go('feedback.send', {
$state.go('tabs.rate.send', {
score: $scope.score
});
};
$scope.goAppStore = function() {
var defaults = configService.getDefaults();
var url;
if (isAndroid) url = config.rateApp.android;
if (isIOS) url = config.rateApp.ios;
// if (isWP) url = config.rateApp.ios; TODO
var title = gettextCatalog.getString('Rate the app');
var message = gettextCatalog.getString('You must go to the official website of the app to rate it');
var okText = gettextCatalog.getString('Go');
var cancelText = gettextCatalog.getString('Cancel');
externalLinkService.open(url, true, title, message, okText, cancelText);
if (isAndroid) url = defaults.rateApp.android;
if (isIOS) url = defaults.rateApp.ios;
// if (isWP) url = defaults.rateApp.windows; // TODO
externalLinkService.open(url);
};
});

View file

@ -6,16 +6,12 @@ angular.module('copayApp.controllers').controller('rateCardController', function
$scope.score = 0;
$scope.goFeedbackFlow = function() {
if ($scope.isModal) {
$scope.rateModal.hide();
$scope.rateModal.remove();
}
if ($scope.isCordova && $scope.score == 5) {
$state.go('feedback.rateApp', {
$state.go('tabs.rate.rateApp', {
score: $scope.score
});
} else {
$state.go('feedback.send', {
$state.go('tabs.rate.send', {
score: $scope.score
});
}
@ -25,7 +21,7 @@ angular.module('copayApp.controllers').controller('rateCardController', function
$scope.score = score;
switch ($scope.score) {
case 1:
$scope.button_title = gettextCatalog.getString("I think this app is terrible");
$scope.button_title = gettextCatalog.getString("I think this app is terrible.");
break;
case 2:
$scope.button_title = gettextCatalog.getString("I don't like it");
@ -37,7 +33,7 @@ angular.module('copayApp.controllers').controller('rateCardController', function
$scope.button_title = gettextCatalog.getString("I like the app");
break;
case 5:
$scope.button_title = gettextCatalog.getString("This app is fantastic");
$scope.button_title = gettextCatalog.getString("This app is fantastic!");
break;
}
$timeout(function() {
@ -46,21 +42,16 @@ angular.module('copayApp.controllers').controller('rateCardController', function
};
$scope.hideCard = function() {
if ($scope.isModal) {
$scope.rateModal.hide();
$scope.rateModal.remove();
} else {
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = JSON.parse(info);
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
});
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = JSON.parse(info);
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
$timeout(function() {
$scope.$apply();
}, 100);
});
}
$timeout(function() {
$scope.$apply();
}, 100);
});
}
});

View file

@ -1,29 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $stateParams, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess) {
$scope.score = parseInt($stateParams.score);
switch ($scope.score) {
case 1:
$scope.reaction = gettextCatalog.getString("Ouch!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.");
break;
case 2:
$scope.reaction = gettextCatalog.getString("Oh no!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.");
break;
case 3:
$scope.reaction = gettextCatalog.getString("Thanks!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay wallet.");
break;
case 4:
$scope.reaction = gettextCatalog.getString("Thanks!");
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you.");
break;
case 5:
$scope.reaction = gettextCatalog.getString("Feedback!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay wallet.");
break;
}
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess) {
$scope.sendFeedback = function(feedback, skip) {
@ -32,7 +9,7 @@ angular.module('copayApp.controllers').controller('sendController', function($sc
var dataSrc = {
"Email": lodash.values(config.emailFor)[0] || ' ',
"Feedback": skip ? ' ' : feedback,
"Score": $stateParams.score
"Score": $stateParams.score || ' '
};
ongoingProcess.set('sendingFeedback', true);
@ -42,11 +19,63 @@ angular.module('copayApp.controllers').controller('sendController', function($sc
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send feedback'));
return;
}
$state.go('feedback.complete', {
if (!$stateParams.score) {
popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() {
$scope.feedback.value = '';
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$ionicHistory.clearHistory();
$timeout(function() {
$state.go('tabs.settings');
});
});
return;
}
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: skip
});
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
$scope.feedback = {};
if ($scope.score) {
$ionicNavBarDelegate.showBackButton(false);
$ionicConfig.views.swipeBackEnabled(false);
}
else $ionicNavBarDelegate.showBackButton(true);
switch ($scope.score) {
case 1:
$scope.reaction = gettextCatalog.getString("Ouch!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 2:
$scope.reaction = gettextCatalog.getString("Oh no!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 3:
$scope.reaction = gettextCatalog.getString("Hmm...");
$scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 4:
$scope.reaction = gettextCatalog.getString("Thanks!");
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you how could we improve your experience?");
break;
case 5:
$scope.reaction = gettextCatalog.getString("Thank you!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay.") + ' ' + gettextCatalog.getString("Is there anything we could do better?");
break;
default:
$scope.reaction = gettextCatalog.getString("Feedback!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay. How could we improve your experience?");
break;
}
});
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) {
angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) {
var HISTORY_SHOW_LIMIT = 10;
var currentTxHistoryPage = 0;

View file

@ -32,15 +32,4 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
updateConfig();
});
$scope.openRateModal = function() {
$scope.isModal = true;
$ionicModal.fromTemplateUrl('views/feedback/rateCard.html', {
scope: $scope,
backdropClickToClose: false,
hardwareBackButtonClose: false
}).then(function(modal) {
$scope.rateModal = modal;
$scope.rateModal.show();
});
}
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $ionicHistory, $scope, walletService, lodash, gettextCatalog, profileService, configService, externalLinkService, popupService, ongoingProcess) {
angular.module('copayApp.controllers').controller('txDetailsController', function($log, $ionicHistory, $scope, $timeout, walletService, lodash, gettextCatalog, profileService, configService, externalLinkService, popupService, ongoingProcess) {
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.title = gettextCatalog.getString('Transaction');
@ -29,6 +29,9 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
updateMemo();
initActionList();
$timeout(function() {
$scope.$apply();
});
});
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, gettextCatalog, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService) {
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, gettextCatalog, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService, storageService, $ionicScrollDelegate, $window) {
var HISTORY_SHOW_LIMIT = 10;
var currentTxHistoryPage = 0;
@ -10,6 +10,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$scope.openTxpModal = txpModalService.open;
$scope.isCordova = platformInfo.isCordova;
$scope.isAndroid = platformInfo.isAndroid;
$scope.isIOS = platformInfo.isIOS;
$scope.amountIsCollapsible = !$scope.isAndroid;
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
@ -158,6 +161,52 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
}
};
$scope.getDate = function(txCreated) {
var date = new Date(txCreated * 1000);
return date;
};
$scope.isFirstInGroup = function(index) {
if (index === 0) {
return true;
}
var curTx = $scope.txHistory[index];
var prevTx = $scope.txHistory[index - 1];
return !createdDuringSameMonth(curTx, prevTx);
};
$scope.isLastInGroup = function(index) {
if (index === $scope.txHistory.length - 1) {
return true;
}
return $scope.isFirstInGroup(index + 1);
};
function createdDuringSameMonth(tx1, tx2) {
var date1 = new Date(tx1.time * 1000);
var date2 = new Date(tx2.time * 1000);
return getMonthYear(date1) === getMonthYear(date2);
}
$scope.createdWithinPastDay = function(time) {
var now = new Date();
var date = new Date(time * 1000);
return (now.getTime() - date.getTime()) < (1000 * 60 * 60 * 24);
};
$scope.isDateInCurrentMonth = function(date) {
var now = new Date();
return getMonthYear(now) === getMonthYear(date);
};
function getMonthYear(date) {
return date.getMonth() + date.getFullYear();
}
$scope.isUnconfirmed = function(tx) {
return !tx.confirmations || tx.confirmations === 0;
};
$scope.showMore = function() {
$timeout(function() {
currentTxHistoryPage++;
@ -184,9 +233,72 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
var prevPos;
var screenInactive = true;
$scope.wallet = profileService.getWallet(data.stateParams.walletId);
function getScrollPosition() {
var scrollPosition = $ionicScrollDelegate.getScrollPosition();
if (!scrollPosition || screenInactive) {
$window.requestAnimationFrame(function() {
getScrollPosition();
});
return;
}
var pos = scrollPosition.top;
if (pos === prevPos) {
$window.requestAnimationFrame(function() {
getScrollPosition();
});
return;
}
prevPos = pos;
var amountHeight = 180 - pos;
if (amountHeight < 80) {
amountHeight = 80;
}
var contentMargin = amountHeight;
if (contentMargin > 180) {
contentMargin = 180;
}
var amountScale = (amountHeight / 180);
if (amountScale < 0.5) {
amountScale = 0.5;
}
if (amountScale > 1.1) {
amountScale = 1.1;
}
var s = amountScale;
$scope.altAmountOpacity = (amountHeight - 100) / 80;
$window.requestAnimationFrame(function() {
$scope.amountHeight = amountHeight + 'px';
$scope.contentMargin = contentMargin + 'px';
$scope.amountScale = 'scale3d(' + s + ',' + s + ',' + s + ')';
$scope.$digest();
getScrollPosition();
});
}
var scrollWatcherInitialized;
$scope.$on("$ionicView.enter", function(event, data) {
$timeout(function() {
screenInactive = false;
}, 200);
if (scrollWatcherInitialized || !$scope.amountIsCollapsible) {
return;
}
scrollWatcherInitialized = true;
$timeout(function() {
getScrollPosition();
}, 100);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.walletId = data.stateParams.walletId;
$scope.wallet = profileService.getWallet($scope.walletId);
$scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1;
addressbookService.list(function(err, ab) {
@ -209,6 +321,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
});
$scope.$on("$ionicView.leave", function(event, data) {
screenInactive = true;
lodash.each(listeners, function(x) {
x();
});

View file

@ -16,6 +16,6 @@ angular.module('copayApp.directives')
scope.emailHash = md5.createHash(scope.email.toLowerCase() || '');
}
},
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=mm">'
}
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=identicon">'
};
});

View file

@ -151,7 +151,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
*/
.state('tabs.wallet', {
url: '/wallet/{walletId}/{fromOnboarding}',
url: '/wallet/:walletId/:fromOnboarding',
views: {
'tab-home@tabs': {
controller: 'walletDetailsController',
@ -186,6 +186,23 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
}
}
})
.state('tabs.wallet.backupWarning', {
url: '/backupWarning/:from/:walletId',
views: {
'tab-home@tabs': {
templateUrl: 'views/backupWarning.html'
}
}
})
.state('tabs.wallet.backup', {
url: '/backup/:walletId',
views: {
'tab-home@tabs': {
templateUrl: 'views/backup.html',
controller: 'backupController'
}
}
})
/*
*
@ -601,7 +618,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
/*
*
* Back flow from receive
* Init backup flow
*
*/
@ -726,43 +743,52 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
*
*/
.state('feedback', {
.state('tabs.feedback', {
url: '/feedback',
abstract: true,
template: '<ion-nav-view name="feedback"></ion-nav-view>'
})
.state('feedback.send', {
url: '/send/:score',
views: {
'feedback': {
controller: 'sendController',
templateUrl: 'views/feedback/send.html'
'tab-settings@tabs': {
templateUrl: 'views/feedback/send.html',
controller: 'sendController'
}
}
})
.state('feedback.complete', {
.state('tabs.rate', {
url: '/rate',
abstract: true
})
.state('tabs.rate.send', {
url: '/send/:score',
views: {
'tab-home@tabs': {
templateUrl: 'views/feedback/send.html',
controller: 'sendController'
}
}
})
.state('tabs.rate.complete', {
url: '/complete/:score/:skipped',
views: {
'feedback': {
'tab-home@tabs': {
controller: 'completeController',
templateUrl: 'views/feedback/complete.html'
}
}
})
.state('feedback.rateApp', {
.state('tabs.rate.rateApp', {
url: '/rateApp/:score',
views: {
'feedback': {
'tab-home@tabs': {
controller: 'rateAppController',
templateUrl: 'views/feedback/rateApp.html'
}
}
})
/*
*
* Buy or Sell Bitcoin
*
*/
/*
*
* Buy or Sell Bitcoin
*
*/
.state('tabs.buyandsell', {
url: '/buyandsell',

View file

@ -20,7 +20,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer
},
rateApp: {
ios: 'https://itunes.apple.com/app/bitpay-secure-bitcoin-wallet/id1149581638',
ios: 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=1149581638&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8',
android: 'https://play.google.com/store/apps/details?id=com.bitpay.wallet',
wp: ''
},

View file

@ -30,7 +30,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP
var feeLevelValue = lodash.find(levels, {
level: feeLevel
});
if (!feeLevelValue || !feeLevelValue.feePerKB)
if (!feeLevelValue || feeLevelValue.feePerKB == null)
return cb({
message: 'Could not get dynamic fee for level: ' + feeLevel
});

View file

@ -51,12 +51,12 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni
var _cordovaConfirm = function(title, message, okText, cancelText, cb) {
var onConfirm = function(buttonIndex) {
if (buttonIndex == 1) return cb(true);
if (buttonIndex == 2) return cb(true);
else return cb(false);
}
okText = okText || gettextCatalog.getString('OK');
cancelText = cancelText || gettextCatalog.getString('Cancel');
navigator.notification.confirm(message, onConfirm, title, [okText, cancelText]);
navigator.notification.confirm(message, onConfirm, title, [cancelText, okText]);
};
var _cordovaPrompt = function(title, message, opts, cb) {

View file

@ -1,4 +1,5 @@
#bitpayCard {
background: white;
.bar-header {
border: 0;
background: #1e3186;
@ -9,15 +10,35 @@
background-color: transparent;
}
}
.amount-wrapper {
position: relative;
overflow: visible;
.amount-bg {
content: '';
top: -1000px;
left: 0;
position: absolute;
height: 1000px;
width: 100%;
background-color: #1e3186;
}
}
.amount {
width: 100%;
text-align: center;
padding: 2rem 1rem 1.5rem 1rem;
height: 140px;
height: 160px;
border-color: #172565;
background-color: #1e3186;
background-image: linear-gradient(0deg, #172565, #172565 0%, transparent 0%);
color: #fff;
&__balance {
margin-bottom: 25px;
font-weight: 600;
font-size: 34px;
}
}
.wallet-details-wallet-info {
bottom: 5px;
@ -37,4 +58,26 @@
.item-select select {
color: #667;
}
.get-started {
margin-top: 20px;
&__arrow {
font-size: 56px;
opacity: .2;
}
h1 {
font-size: 28px;
color: #4A4A4A;
}
&__text {
font-weight: 300;
color: #8e8e8e;
max-width: 300px;
margin: 0 auto;
}
}
}

View file

@ -1,3 +1,5 @@
#view-confirm {
.tx-details-content > .scroll {
padding-bottom: .25rem;
}
}

View file

@ -19,6 +19,8 @@
}
.subtitle {
padding: 10px 30px 20px 40px;
text-align: center;
color: $mid-gray;
}
.icon-svg > img {
height: 16rem;
@ -40,6 +42,7 @@
bottom: 0;
width: 100%;
position: absolute;
padding: 20px;
background-color: $subtle-gray;
.row {
margin: 20px 0px 20px;

View file

@ -1,9 +1,12 @@
#rate-app {
background-color: #ffffff;
.skip {
margin: 10px;
margin-top: 15px;
color: #667;
}
.skip-rating {
margin-right: 15px;
}
.icon-svg > img {
width: 80px;
height: 80px;
@ -13,20 +16,18 @@
font-size: 20px;
font-weight: bold;
color: $dark-gray;
margin: 40px 50px 10px;
margin: 80px 50px 10px;
text-align: center;
}
.subtitle {
padding: 10px 30px 20px 40px;
color: #667;
}
.buttons {
bottom: 0;
width: 100%;
position: absolute;
background-color: $subtle-gray;
.button {
margin-top: 40px;
margin-bottom: 30px;
}
padding: 50px 0;
}
}

View file

@ -1,14 +1,18 @@
#rate-card {
.item-heading {
font-weight: 700;
}
.row {
border: none;
}
.row.row-margin{
margin: 20px 0px 20px 0px;
}
.item-icon-right {
margin: 0;
}
.feedback-flow-button {
padding: 20px;
margin-bottom: 20px;
}
.icon-svg > img {
height: 1.8rem;
margin-bottom: 5px;
}
}

View file

@ -4,27 +4,34 @@
border: none;
}
.skip {
margin: 20px 20px 10px;
color: #667;
text-decoration: none;
color: rgba(255, 255, 255, 0.3);
}
.feedback-heading {
padding-top: 20px
}
.title {
padding: 20px;
padding-left: 10px;
font-size: 20px;
font-weight: bold;
color: $dark-gray;
}
.rating {
text-align: right;
padding-right: 15px;
}
.comment {
padding: 20px;
padding: 0 20px 20px;
font-size: 1rem;
line-height: 1.5em;
font-weight: 300;
color: $dark-gray;
}
textarea {
padding: 20px;
.user-feedback {
border-top: 1px solid $subtle-gray;
padding: 20px;
width: 100%;
}
.send-feedback-star {
height: 1rem;
margin-left: 5px;
}
}

View file

@ -23,6 +23,8 @@
img {
margin-right: 1rem;
height: 35px;
width: 35px;
}
span {

View file

@ -18,16 +18,18 @@
}
}
.item{
padding: calc(100vh - 99vh) calc(100vw - 93vw) calc(100vh - 97vh) calc(100vw - 95vw);
i{left:auto;}
padding: 3vh 3vw 3vh 3vw;
span{
clear:both;
width: 100%;
display: inline-block;
&.wallet-name{
margin-top:10px;
margin-bottom:5px;
font-size:13px;
font-size:16px;
width: 70%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
font-weight: 600;
}
&.wallet-number{
visibility: hidden;

View file

@ -52,6 +52,15 @@
}
}
}
.wallet-details__item.item {
padding-top: 0;
padding-bottom: 0;
.wallet-details__tx-icon {
background: #fff;
border-radius: 50px;
}
}
.next-step.item {
padding-top: 27px;
padding-bottom: 27px;

View file

@ -13,14 +13,17 @@
.scroll{height:100%;}
#address {
background: #fff;
height: calc(100vh - 34vh);
height: 66vh;
display: flex;
align-items: center;
justify-content: center;
position: relative;
flex-flow: column;
@media(max-height: 600px){
height: calc(100vh - 36vh);
height: 68vh;
}
@media(max-height: 600px) and (-webkit-device-pixel-ratio: 2){
height: 64vh;
}
&-info{
height: 100%;
@ -64,15 +67,27 @@
.item {
border: none;
font-size: .8rem;
z-index: 0;
i {
font-size: 1.3rem;
}
}
#qr-options{
.item{
font-size:.7rem;
@media(min-width:350px){
font-size:.9rem;
}
@media(min-width:450px){
font-size:1rem;
}
}
}
.bit-address {
font-size: .8rem;
// left:10%;
position: absolute;
transition: all .4s ease;
transition: all .15s ease;
width:100%;
height: 100%;
z-index: 0;
@ -100,16 +115,24 @@
padding-bottom: 5px;
display: inline-block;
font-size: .7rem;
@media(min-width:350px){
font-size:.9rem;
}
@media(min-width:450px){
font-size:1rem;
}
color:$light-gray;
}
}
.qr {
padding: calc(100vh - 85vh) 0 calc(100vh - 96vh);
padding: 15vh 0 4vh;
align-self: center;
margin-top: auto;
height: 220px;
position: relative;
justify-content: center;
flex: 1;
z-index: 1;
div{
transition: all .4s ease;
&.current, &.prev, &.next{
@ -131,7 +154,7 @@
}
}
@media(max-height: 700px){
padding: calc(100vh - 90vh) 0 calc(100vh - 96vh);
padding: 10vh 0 4vh;
}
div{
display: flex;
@ -235,7 +258,8 @@
}
.wallets{
position: relative;
height: calc(100vh - 83vh);
height: calc(27vh - 62px);
z-index: 5;
.slides {
.swiper-container{
position: absolute;
@ -244,15 +268,29 @@
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
max-width: 450px;
.swiper-wrapper{
height: auto;
top: 10%;
position:relative;
@media(max-height: 600px){padding-top:.2rem}
@media(min-height: 900px){top:30%;}
}
.swiper-slide{
text-align: center;
.card{
margin-top:2vh;
display: inline-block;
width:80%;
@media(min-height: 1000px) and (max-width: 699px){
.item{
padding: 2vh 3vw 2vh 3vw;
}
}
}
@media(max-width: 500px){
&-next{left:-25%;}
&-prev{left:25%;}
}
&-next{left:-25%;}
&-prev{left:25%;}
}
@media (max-height: 600px){
&{
@ -267,11 +305,17 @@
.wallets{display: none;}
#address{
float:left;
height:90vh;
width:65%;
height:100%;
width:calc(100% - 410px);
@media(max-width: 1000px){
width:65%;
}
&-info{
height: 100%;
}
#qr-options{
.item{font-size:1rem;}
}
.qr{
height: 70%;
div{
@ -292,7 +336,14 @@
.backup, #bit-address{left:0;}
#bit-address{
height: 10%;
padding: calc(100vh - 99vh);
padding: 1vh;
.bit-address{
.item{
top: 40%;
transform: translateY(-40%);
font-size:1rem;
}
}
}
}
#wallets{
@ -302,18 +353,29 @@
display: flex;
flex-direction: column;
overflow: visible;
max-width: 410px;
@media(max-height: 600px){
padding-top:.55rem;
}
@media(max-width: 1000px){
max-width: none;
}
#sidebar-wallet{display: block;}
.list{height: 100%;overflow: visible;}
#wallet-list{
position: absolute;
width: 100%;
overflow-y: scroll;
width: 110%;
overflow-y: auto;
height: 100%;
left: -6%;
}
.wallet{
position: relative;
&.current{
position: relative;
.card{
opacity: 1;
transform: scale(1);
}
&:before {
right: 93%;
top: 50%;
@ -331,24 +393,30 @@
}
.card {
max-width: 350px;
box-shadow:$subtle-box-shadow;
box-shadow: 0 1px 36px rgba(0, 0, 0, 0.07);
padding:0;
border-radius: 6px;
padding:2px;
width: 80%;
position: relative;
margin: 1.5rem auto 0;
position: relative;
opacity: .5;
transform:scale(.85);
transition:transform .2s ease;
.item{
padding: 6% 10% 6% 8%;
i{left:auto;}
span{
clear:both;
width: 100%;
display: inline-block;
&.wallet-name{
margin-top:10px;
margin-bottom:5px;
font-size:13px;
font-size:16px;
width: 70%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
font-weight: 600;
}
&.wallet-number{
visibility: hidden;

View file

@ -6,7 +6,7 @@
font-weight: bold;
}
&--received {
color: #30af6c;
color: #09C286;
}
&--sent {
color: $dark-gray;
@ -14,18 +14,106 @@
}
&__tx-time {
color: $light-gray;
font-size: 12.5px;
}
&__tx-title {
padding-top: 10px;
flex-grow: 1;
color: $dark-gray;
overflow: hidden;
}
&__tx-icon {
float: left;
margin-right: 10px;
margin-right: 25px;
}
&__tx-message {
margin-right: 1rem;
}
&__list {
}
.item {
display: flex;
align-items: center;
background: #fff;
padding-left: 1rem;
}
&__item {
display: flex;
align-items: center;
background: #fff;
padding: 0;
margin: 0;
border: 0;
padding-left: 1rem;
&.proposal {
position: relative;
}
&__marker {
position: absolute;
height: 100%;
width: 3px;
background: #F5A623;
left: 0;
}
}
&__tx-content {
display: flex;
align-items: center;
flex-grow: 1;
padding: 1rem 0;
padding-right: 1rem;
border-bottom: 1px solid rgb(245, 245, 245);
overflow: hidden;
&.no-border {
border: 0;
}
}
&__tx-amount {
white-space: nowrap;
}
&__group-label {
font-size: 14px;
font-weight: 300;
color: #727272;
padding: 2px 1rem;
background: #f8f8f9;
}
}
#walletDetails {
background: #F8F8F9;
.scroll-refresher {
z-index: 1;
margin-top: 3.5rem;
}
.ionic-refresher-content {
color: white !important;
.spinner svg {
stroke: white;
fill: white;
}
}
.bp-content {
position: relative;
height: 100%;
&.status-bar {
margin-top: 20px;
}
}
.bar-header {
border: 0;
background: none;
@ -39,13 +127,66 @@
.nav-bar-block, .bar {
background-color: inherit !important;
}
ion-content {
&.collapsible {
margin-top: 180px;
}
padding-top: 0;
top: 0;
.scroll {
background: rgb(248, 248, 249);
min-height: 300px;
}
}
.amount-wrapper {
position: relative;
overflow: visible;
.amount-bg {
content: '';
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 500px;
transform: translateY(-499px);
&.collapsible {
top: initial;
bottom: 0;
left: 0;
position: absolute;
width: 100%;
height: 200px;
transform: translateY(100px);
}
}
}
.amount {
width: 100%;
text-align: center;
padding: 2rem 1rem 1.5rem 1rem;
color: #fff;
height: 140px;
margin-bottom: 10px;
height: 180px;
padding-top: 40px;
display: flex;
align-items: center;
justify-content: center;
&.collapsible {
margin-bottom: 10px;
}
&__balance {
transform: scale3d(1, 1, 1);
margin-top: 5px;
}
&__updating {
z-index: 999;
margin-top: -2.1rem;
}
&-alternative {
line-height: 36px;
@ -77,3 +218,18 @@
font-size: 20px;
color: #fff;
}
.wallet-not-backed-up-warning {
background: orange;
text-align: center;
color: white;
font-size: 14px;
display: block;
text-decoration: none;
z-index: 9999;
position: relative;
}
a.item {
cursor: pointer;
}