Merge branch 'wallet/sprint/20' into wallet/task/426
|
|
@ -24,9 +24,9 @@
|
|||
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
|
||||
"pushSenderId": "1036948132229",
|
||||
"description": "A Secure Bitcoin Wallet",
|
||||
"version": "4.12.2",
|
||||
"fullVersion": "4.12-rc3",
|
||||
"androidVersion": "412200",
|
||||
"version": "4.13.0",
|
||||
"fullVersion": "4.13-rc1",
|
||||
"androidVersion": "413000",
|
||||
"_extraCSS": "",
|
||||
"_enabledExtensions": {
|
||||
"coinbase": false,
|
||||
|
|
|
|||
|
|
@ -610,10 +610,14 @@ msgstr ""
|
|||
msgid "Connection reset by peer"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:45
|
||||
#: www/views/tab-send.html:85
|
||||
msgid "Contacts"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:86
|
||||
msgid "Saved frequently used addresses"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/onboarding/notifications.html:9
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
|
@ -815,7 +819,7 @@ msgstr ""
|
|||
|
||||
#: www/views/onboarding/tour.html:51
|
||||
#: www/views/tab-home.html:75
|
||||
#: www/views/tab-send.html:36
|
||||
#: www/views/tab-send.html:75
|
||||
msgid "Create bitcoin wallet"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -2525,6 +2529,14 @@ msgstr ""
|
|||
msgid "Search or enter bitcoin address"
|
||||
msgstr ""
|
||||
|
||||
#: src/js/controllers/tab-send.js:28
|
||||
msgid "Clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: src/js/controllers/tab-send.js:29
|
||||
msgid "Your Clipboard is empty"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/modals/search.html:16
|
||||
msgid "Search transactions"
|
||||
msgstr ""
|
||||
|
|
@ -2583,9 +2595,70 @@ msgid "Send by email"
|
|||
msgstr ""
|
||||
|
||||
#: src/js/controllers/confirm.js:177
|
||||
#: src/js/controllers/tab-send.js:94
|
||||
msgid "Send from"
|
||||
msgstr ""
|
||||
|
||||
#: src/js/controllers/tab-send.js:77
|
||||
msgid "Send to"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:20
|
||||
msgid "Paste Clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:21
|
||||
msgid "Paste Address"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:27
|
||||
msgid "Wallet to Wallet Transfer"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:35
|
||||
msgid "Scan QR Code"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:46
|
||||
msgid "Send Bitcoin faster!"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:46
|
||||
msgid "Send Bitcoin faster!"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:50
|
||||
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:55
|
||||
msgid "Add your first contact"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:65
|
||||
msgid "Your Bitcoin wallet is empty"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:69
|
||||
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:70
|
||||
msgid "You can receive bitcoin from any wallet or service."
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:72
|
||||
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:74
|
||||
msgid "Buy Bitcoin now"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/tab-send.html:76
|
||||
msgid "Show my address"
|
||||
msgstr ""
|
||||
|
||||
#: www/views/includes/itemSelector.html:8
|
||||
msgid "Send max amount"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService) {
|
||||
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService, platformInfo) {
|
||||
|
||||
var config = configService.getSync();
|
||||
var defaults = configService.getDefaults();
|
||||
|
|
|
|||
|
|
@ -38,9 +38,11 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
$scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
|
||||
$scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
|
||||
$scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
|
||||
$scope.fromWalletId = data.stateParams.fromWalletId;
|
||||
}
|
||||
|
||||
// To get the wallet from with the new flow
|
||||
$scope.fromWalletId = data.stateParams.fromWalletId;
|
||||
|
||||
if (data.stateParams.noPrefix) {
|
||||
$scope.showWarningMessage = data.stateParams.noPrefix != 0;
|
||||
if ($scope.showWarningMessage) {
|
||||
|
|
@ -458,7 +460,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
amount: $scope.useSendMax ? null : _amount,
|
||||
currency: unit.id.toUpperCase(),
|
||||
coin: coin,
|
||||
useSendMax: $scope.useSendMax
|
||||
useSendMax: $scope.useSendMax,
|
||||
fromWalletId: $scope.fromWalletId
|
||||
});
|
||||
} else {
|
||||
var amount = _amount;
|
||||
|
|
@ -479,6 +482,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
toColor: $scope.toColor,
|
||||
coin: coin,
|
||||
useSendMax: $scope.useSendMax,
|
||||
fromWalletId: $scope.fromWalletId
|
||||
};
|
||||
|
||||
if ($scope.shapeshiftOrderId) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('buyBitcoindotcomController',
|
||||
function($scope, $timeout, $ionicModal, $log, $state, $ionicHistory, lodash, bitcoincomService, externalLinkService, popupService) {
|
||||
function($scope, platformInfo, externalLinkService) {
|
||||
|
||||
$scope.os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
|
||||
|
||||
$scope.openExternalLink = function(url) {
|
||||
externalLinkService.open(url);
|
||||
|
|
|
|||
|
|
@ -1,53 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, $window, lodash, externalLinkService, configService, platformInfo, feedbackService, ongoingProcess, popupService, appConfigService) {
|
||||
$scope.score = parseInt($stateParams.score);
|
||||
$scope.appName = appConfigService.nameCase;
|
||||
var isAndroid = platformInfo.isAndroid;
|
||||
var isIOS = platformInfo.isIOS;
|
||||
|
||||
var config = configService.getSync();
|
||||
|
||||
$scope.skip = function() {
|
||||
var dataSrc = {
|
||||
"Email": lodash.values(config.emailFor)[0] || ' ',
|
||||
"Feedback": ' ',
|
||||
"Score": $stateParams.score,
|
||||
"AppVersion": $window.version,
|
||||
"Platform": ionic.Platform.platform(),
|
||||
"DeviceVersion": ionic.Platform.version()
|
||||
};
|
||||
feedbackService.send(dataSrc, function(err) {
|
||||
if (err) {
|
||||
// try to send, but not essential, since the user didn't add a message
|
||||
$log.warn('Could not send feedback.');
|
||||
}
|
||||
});
|
||||
$state.go('tabs.rate.complete', {
|
||||
score: $stateParams.score,
|
||||
skipped: true
|
||||
});
|
||||
};
|
||||
|
||||
$scope.sendFeedback = function() {
|
||||
$state.go('tabs.rate.send', {
|
||||
score: $scope.score
|
||||
});
|
||||
};
|
||||
|
||||
$scope.goAppStore = function() {
|
||||
var defaults = configService.getDefaults();
|
||||
var url;
|
||||
if (isAndroid)
|
||||
url = defaults.rateApp.bitcoincom.android;
|
||||
if (isIOS)
|
||||
url = defaults.rateApp.bitcoincom.ios;
|
||||
|
||||
externalLinkService.open(url);
|
||||
$state.go('tabs.rate.complete', {
|
||||
score: $stateParams.score,
|
||||
skipped: true,
|
||||
rated: true
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('rateCardController', function($scope, $state, $timeout, $log, gettextCatalog, platformInfo, storageService, appConfigService) {
|
||||
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
$scope.score = 0;
|
||||
$scope.appName = appConfigService.nameCase;
|
||||
|
||||
$scope.goFeedbackFlow = function() {
|
||||
$scope.hideCard();
|
||||
if ($scope.isCordova && $scope.score == 5) {
|
||||
$state.go('tabs.rate.rateApp', {
|
||||
score: $scope.score
|
||||
});
|
||||
} else {
|
||||
$state.go('tabs.rate.send', {
|
||||
score: $scope.score
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
$scope.setScore = function(score) {
|
||||
$scope.score = score;
|
||||
switch ($scope.score) {
|
||||
case 1:
|
||||
$scope.button_title = gettextCatalog.getString("I think this app is terrible.");
|
||||
break;
|
||||
case 2:
|
||||
$scope.button_title = gettextCatalog.getString("I don't like it");
|
||||
break;
|
||||
case 3:
|
||||
$scope.button_title = gettextCatalog.getString("Meh - it's alright");
|
||||
break;
|
||||
case 4:
|
||||
$scope.button_title = gettextCatalog.getString("I like the app");
|
||||
break;
|
||||
case 5:
|
||||
$scope.button_title = gettextCatalog.getString("This app is fantastic!");
|
||||
break;
|
||||
}
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
};
|
||||
|
||||
$scope.hideCard = function() {
|
||||
$log.debug('Feedback card dismissed.')
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, $window, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess, platformInfo, appConfigService) {
|
||||
|
||||
$scope.sendFeedback = function(feedback, goHome) {
|
||||
|
||||
var config = configService.getSync();
|
||||
|
||||
var dataSrc = {
|
||||
"Email": lodash.values(config.emailFor)[0] || ' ',
|
||||
"Feedback": goHome ? ' ' : feedback,
|
||||
"Score": $stateParams.score || ' ',
|
||||
"AppVersion": $window.version,
|
||||
"Platform": ionic.Platform.platform(),
|
||||
"DeviceVersion": ionic.Platform.version()
|
||||
};
|
||||
|
||||
if (!goHome) ongoingProcess.set('sendingFeedback', true);
|
||||
feedbackService.send(dataSrc, function(err) {
|
||||
if (goHome) return;
|
||||
ongoingProcess.set('sendingFeedback', false);
|
||||
if (err) {
|
||||
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Feedback could not be submitted. Please try again later.'));
|
||||
return;
|
||||
}
|
||||
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: false,
|
||||
historyRoot: true
|
||||
});
|
||||
$ionicHistory.goBack();
|
||||
}, gettextCatalog.getString('Finish'));
|
||||
return;
|
||||
}
|
||||
$state.go('tabs.rate.complete', {
|
||||
score: $stateParams.score
|
||||
});
|
||||
});
|
||||
if (goHome) $state.go('tabs.home');
|
||||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeLeave", function(event, data) {
|
||||
$ionicConfig.views.swipeBackEnabled(true);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
if ($scope.score)
|
||||
$ionicConfig.views.swipeBackEnabled(false);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
|
||||
$scope.feedback = {};
|
||||
|
||||
switch ($scope.score) {
|
||||
case 1:
|
||||
$scope.reaction = "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 = "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 {{appName}}.", {
|
||||
appName: appConfigService.nameCase
|
||||
}) + ' ' + gettextCatalog.getString("Is there anything we could do better?");
|
||||
break;
|
||||
default:
|
||||
$scope.justFeedback = true;
|
||||
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}. How could we improve your experience?", {
|
||||
appName: appConfigService.nameCase
|
||||
});
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.afterEnter", function() {
|
||||
$scope.showForm = true;
|
||||
});
|
||||
|
||||
$scope.goBack = function() {
|
||||
$ionicHistory.nextViewOptions({
|
||||
disableAnimate: false,
|
||||
historyRoot: true
|
||||
});
|
||||
$ionicHistory.goBack();
|
||||
};
|
||||
|
||||
});
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
|
||||
angular.module('copayApp.controllers').controller('shareAppController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
$scope.title = gettextCatalog.getString("Share {{appName}}", {
|
||||
appName: appConfigService.nameCase
|
||||
|
|
@ -57,28 +57,8 @@ angular.module('copayApp.controllers').controller('completeController', function
|
|||
$ionicConfig.views.swipeBackEnabled(true);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.enter", function() {
|
||||
if (!$scope.fromSettings)
|
||||
$ionicConfig.views.swipeBackEnabled(false);
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
|
||||
$scope.skipped = (data.stateParams && data.stateParams.skipped) ? true : false;
|
||||
$scope.rated = (data.stateParams && data.stateParams.rated) ? true : false;
|
||||
$scope.fromSettings = (data.stateParams && data.stateParams.fromSettings) ? true : false;
|
||||
|
||||
if (!$scope.fromSettings) {
|
||||
$ionicNavBarDelegate.showBackButton(false);
|
||||
} else {
|
||||
$ionicNavBarDelegate.showBackButton(true);
|
||||
}
|
||||
|
||||
storageService.getFeedbackInfo(function(error, info) {
|
||||
var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null;
|
||||
feedbackInfo.sent = true;
|
||||
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {});
|
||||
});
|
||||
$ionicNavBarDelegate.showBackButton(true);
|
||||
|
||||
if (!$scope.isCordova) return;
|
||||
$scope.animate = true;
|
||||
|
|
@ -133,13 +113,4 @@ angular.module('copayApp.controllers').controller('completeController', function
|
|||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
$scope.close = function() {
|
||||
$ionicHistory.nextViewOptions({
|
||||
disableAnimate: false,
|
||||
historyRoot: true
|
||||
});
|
||||
if ($scope.score == 5) $ionicHistory.goBack(-3);
|
||||
else $ionicHistory.goBack(-2);
|
||||
};
|
||||
});
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('tabHomeController',
|
||||
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
|
||||
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
|
||||
var wallet;
|
||||
var listeners = [];
|
||||
var notifications = [];
|
||||
|
|
@ -14,7 +14,6 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
|||
$scope.isAndroid = platformInfo.isAndroid;
|
||||
$scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
|
||||
$scope.isNW = platformInfo.isNW;
|
||||
$scope.showRateCard = {};
|
||||
$scope.showServices = false;
|
||||
$scope.bannerIsLoading = true;
|
||||
$scope.bannerImageUrl = '';
|
||||
|
|
@ -52,43 +51,6 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
storageService.getFeedbackInfo(function(error, info) {
|
||||
|
||||
if ($scope.isWindowsPhoneApp) {
|
||||
$scope.showRateCard.value = false;
|
||||
return;
|
||||
}
|
||||
if (!info) {
|
||||
initFeedBackInfo();
|
||||
} else {
|
||||
var feedbackInfo = JSON.parse(info);
|
||||
//Check if current version is greater than saved version
|
||||
var currentVersion = $scope.version;
|
||||
var savedVersion = feedbackInfo.version;
|
||||
var isVersionUpdated = feedbackService.isVersionUpdated(currentVersion, savedVersion);
|
||||
if (!isVersionUpdated) {
|
||||
initFeedBackInfo();
|
||||
return;
|
||||
}
|
||||
var now = moment().unix();
|
||||
var timeExceeded = (now - feedbackInfo.time) >= 24 * 7 * 60 * 60;
|
||||
$scope.showRateCard.value = timeExceeded && !feedbackInfo.sent;
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function initFeedBackInfo() {
|
||||
var feedbackInfo = {};
|
||||
feedbackInfo.time = moment().unix();
|
||||
feedbackInfo.version = $scope.version;
|
||||
feedbackInfo.sent = false;
|
||||
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
|
||||
$scope.showRateCard.value = false;
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
|
|
|
|||
|
|
@ -1,32 +1,139 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate) {
|
||||
|
||||
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, $ionicLoading, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) {
|
||||
var clipboardHasAddress = false;
|
||||
var clipboardHasContent = false;
|
||||
var originalList;
|
||||
var CONTACTS_SHOW_LIMIT;
|
||||
var currentContactsPage;
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
$scope.sectionDisplay = {
|
||||
transferToWallet: false
|
||||
$scope.displayBalanceAsFiat = true;
|
||||
$scope.walletSelectorTitleForce = true;
|
||||
|
||||
$scope.addContact = function() {
|
||||
$state.go('tabs.send.addressbook');
|
||||
};
|
||||
|
||||
$scope.pasteClipboard = function() {
|
||||
if ($scope.clipboardHasAddress || $scope.clipboardHasContent) {
|
||||
clipboardService.readFromClipboard(function(text) {
|
||||
$scope.$apply(function() {
|
||||
$scope.formData.search = text;
|
||||
$scope.findContact($scope.formData.search);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
$ionicPopup.alert({
|
||||
title: gettextCatalog.getString('Clipboard'),
|
||||
template: gettextCatalog.getString('Your Clipboard is empty')
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
clipboardService.readFromClipboard(function(text) {
|
||||
if (text.length > 200) {
|
||||
text = text.substring(0, 200);
|
||||
}
|
||||
|
||||
$scope.clipboardHasAddress = false;
|
||||
$scope.clipboardHasContent = false;
|
||||
if ((text.indexOf('bitcoincash:') === 0 || text[0] === 'C' || text[0] === 'H' || text[0] === 'p' || text[0] === 'q') && text.replace('bitcoincash:', '').length === 42) { // CashAddr
|
||||
$scope.clipboardHasAddress = true;
|
||||
} else if ((text[0] === "1" || text[0] === "3" || text.substring(0, 3) === "bc1") && text.length >= 26 && text.length <= 35) { // Legacy Addresses
|
||||
$scope.clipboardHasAddress = true;
|
||||
} else if (text.length > 1) {
|
||||
$scope.clipboardHasContent = true;
|
||||
}
|
||||
});
|
||||
|
||||
$ionicNavBarDelegate.showBar(true);
|
||||
if (!$scope.hasWallets) {
|
||||
$scope.checkingBalance = false;
|
||||
return;
|
||||
}
|
||||
updateHasFunds();
|
||||
updateContactsList(function() {
|
||||
updateList();
|
||||
});
|
||||
});
|
||||
|
||||
var wallets;
|
||||
var walletsBch;
|
||||
var walletsBtc;
|
||||
var walletToWalletFrom = false;
|
||||
|
||||
$scope.onWalletSelect = function(wallet) {
|
||||
if (!$scope.walletToWalletFrom) {
|
||||
$scope.walletToWalletFrom = wallet;
|
||||
if (wallet.coin === 'bch') {
|
||||
$scope.showWalletsBch = true;
|
||||
} else if (wallet.coin === 'btc') {
|
||||
$scope.showWalletsBtc = true;
|
||||
}
|
||||
$scope.walletSelectorTitleTo = gettextCatalog.getString('Send to');
|
||||
} else {
|
||||
$ionicLoading.show();
|
||||
walletService.getAddress(wallet, true, function(err, addr) {
|
||||
$ionicLoading.hide();
|
||||
return $state.transitionTo('tabs.send.amount', {
|
||||
displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr,
|
||||
recipientType: 'wallet',
|
||||
fromWalletId: $scope.walletToWalletFrom.id,
|
||||
toAddress: addr,
|
||||
coin: $scope.walletToWalletFrom.coin
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
$scope.showWalletSelector = function() {
|
||||
$scope.walletToWalletFrom = false;
|
||||
$scope.walletSelectorTitleFrom = gettextCatalog.getString('Send from');
|
||||
$scope.showWallets = true;
|
||||
};
|
||||
|
||||
$scope.findContact = function(search) {
|
||||
|
||||
if (incomingData.redir(search)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!search || search.length < 1) {
|
||||
$scope.list = originalList;
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var result = lodash.filter(originalList, function(item) {
|
||||
var val = item.name;
|
||||
return lodash.startsWith(val.toLowerCase(), search.toLowerCase());
|
||||
});
|
||||
|
||||
$scope.list = result;
|
||||
};
|
||||
|
||||
var hasWallets = function() {
|
||||
$scope.walletsWithFunds = profileService.getWallets({
|
||||
onlyComplete: true,
|
||||
hasFunds: true
|
||||
});
|
||||
$scope.wallets = profileService.getWallets({
|
||||
onlyComplete: true
|
||||
onlyComplete: true,
|
||||
});
|
||||
$scope.walletsBch = profileService.getWallets({
|
||||
onlyComplete: true,
|
||||
coin: 'bch'
|
||||
});
|
||||
$scope.walletsBtc = profileService.getWallets({
|
||||
onlyComplete: true,
|
||||
coin: 'btc'
|
||||
});
|
||||
$scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true;
|
||||
};
|
||||
|
||||
// THIS is ONLY to show the 'buy bitcoins' message
|
||||
// does not has any other function.
|
||||
|
||||
var updateHasFunds = function() {
|
||||
|
||||
if ($rootScope.everHasFunds) {
|
||||
$scope.hasFunds = true;
|
||||
return;
|
||||
}
|
||||
|
||||
$scope.hasFunds = false;
|
||||
var index = 0;
|
||||
lodash.each($scope.wallets, function(w) {
|
||||
|
|
@ -41,10 +148,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
$scope.hasFunds = true;
|
||||
} else if (status.availableBalanceSat > 0) {
|
||||
$scope.hasFunds = true;
|
||||
$rootScope.everHasFunds = true;
|
||||
}
|
||||
|
||||
if (index == $scope.wallets.length) {
|
||||
if (index === $scope.wallets.length) {
|
||||
$scope.checkingBalance = false;
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
|
|
@ -54,52 +160,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
});
|
||||
};
|
||||
|
||||
var updateWalletsList = function() {
|
||||
var config = configService.getSync();
|
||||
var networkResult = lodash.countBy($scope.wallets, 'network');
|
||||
|
||||
$scope.showTransferCard = $scope.hasWallets && (networkResult.livenet > 1 || networkResult.testnet > 1);
|
||||
|
||||
if ($scope.showTransferCard) {
|
||||
var walletsToTransfer = $scope.wallets;
|
||||
if (!(networkResult.livenet > 1)) {
|
||||
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
|
||||
return item.network == 'testnet';
|
||||
});
|
||||
}
|
||||
if (!(networkResult.testnet > 1)) {
|
||||
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
|
||||
return item.network == 'livenet';
|
||||
});
|
||||
}
|
||||
|
||||
var walletList = [];
|
||||
lodash.each(walletsToTransfer, function(v) {
|
||||
var displayBalanceAsFiat =
|
||||
// BD got v.status as undefined here once during development, just
|
||||
// after creating a new wallet.
|
||||
v.status &&
|
||||
v.status.alternativeBalanceAvailable &&
|
||||
config.wallet.settings.priceDisplay === 'fiat';
|
||||
|
||||
walletList.push({
|
||||
color: v.color,
|
||||
name: v.name,
|
||||
recipientType: 'wallet',
|
||||
coin: v.coin,
|
||||
network: v.network,
|
||||
balanceString: displayBalanceAsFiat ?
|
||||
v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode :
|
||||
v.cachedBalance,
|
||||
getAddress: function(cb) {
|
||||
walletService.getAddress(v, false, cb);
|
||||
},
|
||||
});
|
||||
});
|
||||
originalList = originalList.concat(walletList);
|
||||
}
|
||||
}
|
||||
|
||||
var updateContactsList = function(cb) {
|
||||
var config = configService.getSync();
|
||||
var defaults = configService.getDefaults();
|
||||
|
|
@ -118,16 +178,14 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
recipientType: 'contact',
|
||||
coin: v.coin,
|
||||
displayCoin: (v.coin == 'bch'
|
||||
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
|
||||
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(),
|
||||
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
|
||||
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(),
|
||||
getAddress: function(cb) {
|
||||
return cb(null, k);
|
||||
},
|
||||
});
|
||||
});
|
||||
var contacts = completeContacts.slice(0, (currentContactsPage + 1) * CONTACTS_SHOW_LIMIT);
|
||||
$scope.contactsShowMore = completeContacts.length > contacts.length;
|
||||
originalList = originalList.concat(contacts);
|
||||
originalList = completeContacts;
|
||||
return cb();
|
||||
});
|
||||
};
|
||||
|
|
@ -140,28 +198,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
}, 10);
|
||||
};
|
||||
|
||||
$scope.openScanner = function() {
|
||||
var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
|
||||
|
||||
if (!isWindowsPhoneApp) {
|
||||
$state.go('tabs.scan');
|
||||
return;
|
||||
}
|
||||
|
||||
scannerService.useOldScanner(function(err, contents) {
|
||||
if (err) {
|
||||
popupService.showAlert(gettextCatalog.getString('Error'), err);
|
||||
return;
|
||||
}
|
||||
incomingData.redir(contents);
|
||||
});
|
||||
};
|
||||
|
||||
$scope.showMore = function() {
|
||||
currentContactsPage++;
|
||||
updateWalletsList();
|
||||
};
|
||||
|
||||
$scope.searchInFocus = function() {
|
||||
$scope.searchFocus = true;
|
||||
};
|
||||
|
|
@ -172,28 +208,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
}
|
||||
};
|
||||
|
||||
$scope.findContact = function(search) {
|
||||
|
||||
if (incomingData.redir(search)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!search || search.length < 2) {
|
||||
$scope.list = originalList;
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var result = lodash.filter(originalList, function(item) {
|
||||
var val = item.name;
|
||||
return lodash.includes(val.toLowerCase(), search.toLowerCase());
|
||||
});
|
||||
|
||||
$scope.list = result;
|
||||
};
|
||||
|
||||
$scope.goToAmount = function(item) {
|
||||
$timeout(function() {
|
||||
item.getAddress(function(err, addr) {
|
||||
|
|
@ -236,34 +250,19 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
|
|||
};
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
$scope.isIOS = platformInfo.isIOS && platformInfo.isCordova;
|
||||
$scope.showWalletsBch = $scope.showWalletsBtc = $scope.showWallets = false;
|
||||
|
||||
$scope.checkingBalance = true;
|
||||
$scope.formData = {
|
||||
search: null
|
||||
};
|
||||
originalList = [];
|
||||
CONTACTS_SHOW_LIMIT = 10;
|
||||
currentContactsPage = 0;
|
||||
hasWallets();
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
$ionicNavBarDelegate.showBar(true);
|
||||
if (!$scope.hasWallets) {
|
||||
$scope.checkingBalance = false;
|
||||
return;
|
||||
}
|
||||
updateHasFunds();
|
||||
updateWalletsList();
|
||||
updateContactsList(function() {
|
||||
updateList();
|
||||
configService.whenAvailable(function(_config) {
|
||||
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
|
||||
});
|
||||
});
|
||||
|
||||
$scope.toggle = function(section) {
|
||||
$scope.sectionDisplay[section] = !$scope.sectionDisplay[section];
|
||||
$timeout(function() {
|
||||
$ionicScrollDelegate.resize();
|
||||
$scope.$apply();
|
||||
}, 10);
|
||||
};
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -45,6 +45,18 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
|
|||
});
|
||||
};
|
||||
|
||||
$scope.sendFeedback = function() {
|
||||
var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet';
|
||||
if (platformInfo.isNW) {
|
||||
nw.Shell.openExternal(mailToLink);
|
||||
} else if (platformInfo.isCordova) {
|
||||
var mailWindow = window.open(mailToLink, '_system');
|
||||
mailWindow.close(); // XX SP: bugfix for some browsers in cordova to change the view entirely
|
||||
} else {
|
||||
window.location.href = mailToLink;
|
||||
}
|
||||
};
|
||||
|
||||
$scope.openExternalLink = function() {
|
||||
var appName = appConfigService.name;
|
||||
var url = appName == 'copay' ? 'https://github.com/bitcoin-com/wallet/issues' : 'https://www.bitcoin.com/wallet-support';
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.directives')
|
||||
.directive('gravatar', function(md5) {
|
||||
.directive('gravatar', function(md5, $http) {
|
||||
return {
|
||||
restrict: 'AE',
|
||||
replace: true,
|
||||
|
|
@ -9,13 +9,24 @@ angular.module('copayApp.directives')
|
|||
name: '@',
|
||||
height: '@',
|
||||
width: '@',
|
||||
email: '@'
|
||||
email: '@',
|
||||
url: '@'
|
||||
},
|
||||
link: function(scope, el, attr) {
|
||||
if (typeof scope.email === "string") {
|
||||
scope.emailHash = md5.createHash(scope.email.toLowerCase() || '');
|
||||
var req = {
|
||||
method: 'GET',
|
||||
url: 'https://secure.gravatar.com/'+scope.emailHash+'.json',
|
||||
};
|
||||
scope.url = 'img/contact-placeholder.svg';
|
||||
$http(req).then(function (response) {
|
||||
scope.url = 'https://secure.gravatar.com/avatar/'+scope.emailHash+'.jpg?s='+scope.width+'&d=mm';
|
||||
}, function (error) {
|
||||
scope.url = 'img/contact-placeholder.svg';
|
||||
});
|
||||
}
|
||||
},
|
||||
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="{{ url }}">'
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -8,15 +8,21 @@ angular.module('copayApp.directives')
|
|||
transclude: true,
|
||||
scope: {
|
||||
title: '=walletSelectorTitle',
|
||||
forceTitle: '=walletSelectorForceTitle',
|
||||
show: '=walletSelectorShow',
|
||||
wallets: '=walletSelectorWallets',
|
||||
selectedWallet: '=walletSelectorSelectedWallet',
|
||||
onSelect: '=walletSelectorOnSelect',
|
||||
onHide: '=walletSelectorOnHide',
|
||||
displayBalanceAsFiat : '=walletSelectorDisplayBalanceAsFiat'
|
||||
},
|
||||
link: function(scope, element, attrs) {
|
||||
console.log(scope, element, attrs);
|
||||
scope.hide = function() {
|
||||
scope.show = false;
|
||||
if (typeof scope.onHide === "function") {
|
||||
scope.onHide()
|
||||
}
|
||||
};
|
||||
scope.selectWallet = function(wallet) {
|
||||
$timeout(function() {
|
||||
|
|
|
|||
|
|
@ -795,63 +795,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
fromOnboarding: null
|
||||
},
|
||||
})
|
||||
|
||||
/*
|
||||
*
|
||||
* Feedback
|
||||
*
|
||||
*/
|
||||
|
||||
.state('tabs.feedback', {
|
||||
url: '/feedback',
|
||||
views: {
|
||||
'tab-settings@tabs': {
|
||||
templateUrl: 'views/feedback/send.html',
|
||||
controller: 'sendController'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('tabs.shareApp', {
|
||||
url: '/shareApp/:score/:skipped/:fromSettings',
|
||||
url: '/shareApp',
|
||||
views: {
|
||||
'tab-settings@tabs': {
|
||||
controller: 'completeController',
|
||||
templateUrl: 'views/feedback/complete.html'
|
||||
controller: 'shareAppController',
|
||||
templateUrl: 'views/shareApp.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
.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: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'completeController',
|
||||
templateUrl: 'views/feedback/complete.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
.state('tabs.rate.rateApp', {
|
||||
url: '/rateApp/:score',
|
||||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'rateAppController',
|
||||
templateUrl: 'views/feedback/rateApp.html'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/*
|
||||
*
|
||||
* Buy or Sell Bitcoin
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
'use strict';
|
||||
angular.module('copayApp.services').factory('bitcoincomService', function($http, $log, lodash, moment, storageService, configService, platformInfo, nextStepsService, homeIntegrationsService) {
|
||||
angular.module('copayApp.services').factory('bitcoincomService', function(platformInfo, nextStepsService) {
|
||||
var root = {};
|
||||
var credentials = {};
|
||||
|
||||
|
|
@ -7,6 +7,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http,
|
|||
* Development: 'testnet'
|
||||
* Production: 'livenet'
|
||||
*/
|
||||
var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
|
||||
credentials.NETWORK = 'livenet';
|
||||
//credentials.NETWORK = 'testnet';
|
||||
|
||||
|
|
@ -20,28 +21,28 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http,
|
|||
name: 'games',
|
||||
title: 'Bitcoin Cash Games',
|
||||
icon: 'icon-games',
|
||||
href: 'http://cashgames.bitcoin.com'
|
||||
href: 'https://cashgames.bitcoin.com'
|
||||
};
|
||||
|
||||
var newsItem = {
|
||||
name: 'news',
|
||||
title: 'News',
|
||||
icon: 'icon-news',
|
||||
href: 'http://news.bitcoin.com'
|
||||
href: 'https://news.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=News'
|
||||
};
|
||||
|
||||
var poolItem = {
|
||||
name: 'pool',
|
||||
title: 'Mining Pool',
|
||||
icon: 'icon-mining',
|
||||
href: 'http://pool.bitcoin.com'
|
||||
href: 'https://pool.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Pool'
|
||||
};
|
||||
|
||||
var toolsItem = {
|
||||
name: 'tools',
|
||||
title: 'Tools',
|
||||
icon: 'icon-tools',
|
||||
href: 'http://tools.bitcoin.com'
|
||||
href: 'https://tools.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Tools'
|
||||
};
|
||||
|
||||
var priceChartItem = {
|
||||
|
|
@ -55,7 +56,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http,
|
|||
name: 'faucet',
|
||||
title: 'Free Bitcoin Cash',
|
||||
icon: 'icon-faucet',
|
||||
href: 'https://free.bitcoin.com/'
|
||||
href: 'https://free.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Faucet'
|
||||
};
|
||||
|
||||
var _getBitPay = function(endpoint) {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,27 @@ angular.module('copayApp.services').factory('clipboardService', function ($http,
|
|||
// Not supported
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
root.readFromClipboard = function (cb) {
|
||||
$log.debug("Read from clipboard");
|
||||
if (platformInfo.isCordova) {
|
||||
cordova.plugins.clipboard.paste(function(text) {
|
||||
cb(text);
|
||||
})
|
||||
} else if (platformInfo.isNW) {
|
||||
cb(nodeWebkitService.readFromClipboard());
|
||||
} else {
|
||||
navigator.clipboard.readText()
|
||||
.then(function (text) {
|
||||
cb(text);
|
||||
})
|
||||
.catch(function (err) {
|
||||
$log.debug("Clipboard reading is not supported in browser..");
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
return root;
|
||||
|
|
|
|||
|
|
@ -1,59 +0,0 @@
|
|||
'use strict';
|
||||
angular.module('copayApp.services').factory('feedbackService', function($http, $log, $httpParamSerializer, configService) {
|
||||
var root = {};
|
||||
// var URL = "https://script.google.com/macros/s/1pWGRxVSUX9CxPqNAKZTppWHtDvyVtZv9HteY_TRQbWc/exec";
|
||||
var URL = "https://wallet-data.bitcoin.com/feedback.php";
|
||||
|
||||
root.send = function(dataSrc, cb) {
|
||||
$http(_post(dataSrc)).then(function() {
|
||||
$log.info("SUCCESS: Feedback sent");
|
||||
return cb();
|
||||
}, function(err) {
|
||||
$log.info("ERROR: Feedback sent anyway.");
|
||||
return cb(err);
|
||||
});
|
||||
};
|
||||
|
||||
var _post = function(dataSrc) {
|
||||
return {
|
||||
method: 'POST',
|
||||
url: URL,
|
||||
headers: {
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
|
||||
},
|
||||
data: $httpParamSerializer(dataSrc)
|
||||
};
|
||||
};
|
||||
|
||||
root.isVersionUpdated = function(currentVersion, savedVersion) {
|
||||
|
||||
if (!verifyTagFormat(currentVersion))
|
||||
return 'Cannot verify the format of version tag: ' + currentVersion;
|
||||
if (!verifyTagFormat(savedVersion))
|
||||
return 'Cannot verify the format of the saved version tag: ' + savedVersion;
|
||||
|
||||
var current = formatTagNumber(currentVersion);
|
||||
var saved = formatTagNumber(savedVersion);
|
||||
if (saved.major > current.major || (saved.major == current.major && saved.minor > current.minor))
|
||||
return false;
|
||||
|
||||
return 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]
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
return root;
|
||||
});
|
||||
|
|
@ -228,10 +228,12 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
|||
} else if (/^https?:\/\//.test(data)) {
|
||||
payproService.getPayProDetails(data, coin, function(err, details) {
|
||||
if (err) {
|
||||
root.showMenu({
|
||||
data: data,
|
||||
type: 'url'
|
||||
});
|
||||
if ($state.includes('tabs.scan')) {
|
||||
root.showMenu({
|
||||
data: data,
|
||||
type: 'url'
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
handlePayPro(details);
|
||||
|
|
|
|||
|
|
@ -217,14 +217,6 @@ angular.module('copayApp.services')
|
|||
});
|
||||
};
|
||||
|
||||
root.setFeedbackInfo = function(feedbackValues, cb) {
|
||||
storage.set('feedback', feedbackValues, cb);
|
||||
};
|
||||
|
||||
root.getFeedbackInfo = function(cb) {
|
||||
storage.get('feedback', cb);
|
||||
};
|
||||
|
||||
root.storeFocusedWalletId = function(id, cb) {
|
||||
storage.set('focusedWalletId', id || '', cb);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@
|
|||
&.button-primary,
|
||||
&.button-secondary,
|
||||
&.button-light,
|
||||
&.button-white,
|
||||
&.button-green,
|
||||
&.button-assertive {
|
||||
&.button-standard {
|
||||
@extend %button-standard;
|
||||
|
|
@ -33,6 +35,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
@mixin button-shadow() {
|
||||
box-shadow: 0 2px 11px 0 #C1C1C1;;
|
||||
}
|
||||
|
||||
.button {
|
||||
&.button-secondary {
|
||||
@include button-style($v-button-secondary-bg, $v-button-secondary-border, $v-button-secondary-active-bg, $v-button-secondary-active-border, $v-button-secondary-color);
|
||||
|
|
@ -47,7 +53,24 @@
|
|||
}
|
||||
|
||||
.button {
|
||||
border-radius: 6px;
|
||||
&.button-full {
|
||||
display: block;
|
||||
}
|
||||
&-green {
|
||||
@include button-style(#719561, #FFF, #606060, #FFF, #FFF);
|
||||
@include button-clear(#FFF);
|
||||
@include button-outline(#C1C1C1);
|
||||
border: 0px;
|
||||
@include button-shadow();
|
||||
}
|
||||
&-white {
|
||||
@include button-style(#FFF, #C1C1C1, #C1C1C1, #FFF, #606060);
|
||||
@include button-clear(#FFF);
|
||||
@include button-outline(#C1C1C1);
|
||||
@include button-shadow();
|
||||
&.activated {
|
||||
color: #FFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -124,7 +124,6 @@
|
|||
position: relative;
|
||||
height: 70px;
|
||||
border-color: $royal;
|
||||
background-color: $royal;
|
||||
padding-top: 20px;
|
||||
margin-bottom: 50px;
|
||||
text-align: center;
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
#rate-app {
|
||||
background-color: #ffffff;
|
||||
text-align: center;
|
||||
.skip-rating {
|
||||
color: $v-dark-gray;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 10px;
|
||||
padding: 15px;
|
||||
}
|
||||
.icon-svg > img {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.feedback-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $v-dark-gray;
|
||||
margin: 80px 50px 10px;
|
||||
text-align: center;
|
||||
}
|
||||
.share-the-love-illustration {
|
||||
width: 5rem;
|
||||
margin: 1rem;
|
||||
}
|
||||
.subtitle {
|
||||
padding: 10px 30px 20px 40px;
|
||||
color: $v-mid-gray;
|
||||
}
|
||||
.rate-buttons {
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
background-color: $v-subtle-gray;
|
||||
padding: 30px 0 15px;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
#rate-card {
|
||||
.item-heading {
|
||||
font-weight: 700;
|
||||
}
|
||||
.row {
|
||||
border: none;
|
||||
}
|
||||
.item-icon-right {
|
||||
margin: 0;
|
||||
}
|
||||
.feedback-flow-button {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.icon-svg > img {
|
||||
height: 1.8rem;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
#send-feedback {
|
||||
@extend .deflash-blue;
|
||||
background-color: #ffffff;
|
||||
.row {
|
||||
border: none;
|
||||
}
|
||||
.skip {
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
.feedback-heading {
|
||||
padding-top: 20px
|
||||
}
|
||||
.feedback-title {
|
||||
padding-left: 10px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $v-dark-gray;
|
||||
}
|
||||
.rating {
|
||||
text-align: right;
|
||||
padding-right: 15px;
|
||||
}
|
||||
.comment {
|
||||
padding: 0 20px 20px;
|
||||
font-size: 1rem;
|
||||
line-height: 1.5em;
|
||||
font-weight: 300;
|
||||
color: $v-dark-gray;
|
||||
}
|
||||
.user-feedback {
|
||||
border-top: 1px solid $v-subtle-gray;
|
||||
border-bottom: 1px solid $v-subtle-gray;
|
||||
padding: 20px;
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
.send-feedback-star {
|
||||
height: 1rem;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.form-fade-in {
|
||||
opacity: 0;
|
||||
animation-name: fadeIn;
|
||||
animation-duration: .5s;
|
||||
animation-fill-mode: forwards;
|
||||
animation-timing-function: ease-in;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#complete {
|
||||
#share-app {
|
||||
background-color: #fff;
|
||||
.complete-layout {
|
||||
.share-app-layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
|
|
@ -22,17 +22,6 @@
|
|||
width: 5rem;
|
||||
margin: 1rem;
|
||||
}
|
||||
.send-feedback-illustration {
|
||||
height: 16rem;
|
||||
margin: 1rem;
|
||||
}
|
||||
.feedback-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $v-dark-gray;
|
||||
margin: 20px 10px;
|
||||
text-align: center;
|
||||
}
|
||||
.subtitle {
|
||||
padding: 10px 30px 20px;
|
||||
text-align: center;
|
||||
|
|
@ -1,12 +1,28 @@
|
|||
#tab-send {
|
||||
@extend .deflash-blue;
|
||||
|
||||
&-header{
|
||||
height: 300px;
|
||||
width: 100%;
|
||||
}
|
||||
&-contacts {
|
||||
height: calc(100vh - 300px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */
|
||||
&.ios {
|
||||
height: calc(100vh - 300px - 50px - 44px - 18px); // Remove the notification-bar height on iOS
|
||||
}
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
.input {
|
||||
width: 100%;
|
||||
input {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
&.item {
|
||||
height: 55px;
|
||||
height: 57px;
|
||||
background: #FFF;
|
||||
border: 1px #D9D9D9 solid;
|
||||
&::placeholder {
|
||||
color: #DCDCDC;
|
||||
}
|
||||
}
|
||||
i {
|
||||
&.left {
|
||||
|
|
@ -19,45 +35,22 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
.qr-scan-icon {
|
||||
cursor: pointer;
|
||||
cursor: hand;
|
||||
border-left: 1px solid rgb(228, 228, 228);
|
||||
padding-left: 10px;
|
||||
}
|
||||
.qr-icon {
|
||||
line-height: 20px;
|
||||
}
|
||||
.zero-state-cta {
|
||||
padding-bottom: 3vh;
|
||||
left: 0;
|
||||
}
|
||||
.send-heading {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
padding: 0 0 16px 0;
|
||||
border: none;
|
||||
}
|
||||
.send-header-wrapper {
|
||||
padding: 10px;
|
||||
background-color: white;
|
||||
box-shadow: 0px 5px 10px 0px #cccccc;
|
||||
}
|
||||
.search-wrapper {
|
||||
|
||||
.send-wrapper {
|
||||
&:after {
|
||||
display: block;
|
||||
position: relative;
|
||||
height: 1px;
|
||||
background: #DEDEDE;
|
||||
bottom: 0;
|
||||
content: '';
|
||||
margin: 10px 6px 0px;
|
||||
}
|
||||
padding: 18px 9px 9px 9px;
|
||||
background-color: #f2f2f2;
|
||||
border-radius: 3px;
|
||||
border: none;
|
||||
.svg#Bitcoin_Symbol {
|
||||
width: 14px;
|
||||
.st0 {
|
||||
fill: #cccccc;
|
||||
}
|
||||
}
|
||||
&.focus {
|
||||
background: none;
|
||||
.svg#Bitcoin_Symbol {
|
||||
display: none;
|
||||
}
|
||||
.search-input {
|
||||
padding-left: 30px;
|
||||
&:focus::-webkit-input-placeholder {
|
||||
|
|
@ -65,57 +58,88 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
.buttons {
|
||||
margin: auto;
|
||||
margin-top: 18px;
|
||||
.button {
|
||||
&-clipboard-paste {
|
||||
margin-left: 0;
|
||||
.address {
|
||||
display: none;
|
||||
}
|
||||
.icon {
|
||||
background: url(../img/icon-clipboard-paste.svg);
|
||||
width: 15px;
|
||||
height: 19px;
|
||||
display: inline-block;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
&.contains-address, &.contains-content {
|
||||
.address {
|
||||
display: none;
|
||||
}
|
||||
background: #FAB915;
|
||||
color: #FFF !important;
|
||||
border: 0;
|
||||
@include button-shadow();
|
||||
.icon {
|
||||
background: url(../img/icon-clipboard-paste-white.svg);
|
||||
}
|
||||
&.contains-address {
|
||||
.address {
|
||||
display: inline;
|
||||
}
|
||||
.non-address {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
span {
|
||||
font-size: 14px;
|
||||
}
|
||||
img {
|
||||
height: 16px;
|
||||
width: auto;
|
||||
margin: 2px 0 4px;
|
||||
}
|
||||
height: 60px;
|
||||
line-height: 16px;
|
||||
margin-right: 0px;
|
||||
width: 95%;
|
||||
max-width: none;
|
||||
padding: 2px;
|
||||
&-qr {
|
||||
font-weight: bold;
|
||||
max-width: none;
|
||||
width: 100%;
|
||||
height: 95px;
|
||||
margin-top: 20px;
|
||||
img {
|
||||
vertical-align: middle;
|
||||
margin-right: 12px;
|
||||
width: 43px;
|
||||
height: 43px;
|
||||
}
|
||||
span {
|
||||
font-size: 19px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.abs-v-center {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
.search-input {
|
||||
background-color: transparent;
|
||||
padding-left: 30px;
|
||||
}
|
||||
.separator-left {
|
||||
border-left: 1px solid #d9d9df;
|
||||
padding-left: 10px;
|
||||
height: 70%;
|
||||
}
|
||||
.bitcoin-address {
|
||||
border-top: none;
|
||||
padding-bottom: .5rem;
|
||||
@media(max-width: 480px) {
|
||||
input {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
.icon {
|
||||
line-height: 31px;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
}
|
||||
.show-more {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
font-size: 16px;
|
||||
color: #387ef5;
|
||||
font-weight: bold;
|
||||
}
|
||||
.sendTip {
|
||||
padding-top: 5vh;
|
||||
text-align: center;
|
||||
& > .item-heading {
|
||||
margin-top: 10px;
|
||||
background: 0 none;
|
||||
}
|
||||
img {
|
||||
content: $v-tab-send-selected-icon;
|
||||
}
|
||||
.item {
|
||||
border-style: none;
|
||||
}
|
||||
& > .title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: $v-dark-gray;
|
||||
margin: 20px 10px;
|
||||
}
|
||||
|
|
@ -123,34 +147,64 @@
|
|||
font-size: 1rem;
|
||||
line-height: 1.5em;
|
||||
font-weight: 300;
|
||||
color: $v-dark-gray;
|
||||
color: #6F6F70;
|
||||
margin: 20px 1em 2.5em;
|
||||
}
|
||||
.big-icon-svg{
|
||||
.bg.green{
|
||||
.big-icon-svg {
|
||||
.bg.green {
|
||||
padding: 0 10px;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
.buttons {
|
||||
margin-top: 18px;
|
||||
.button {
|
||||
font-weight: bold;
|
||||
font-size: 19px;
|
||||
}
|
||||
}
|
||||
.button-first-contact img {
|
||||
height: 19px;
|
||||
width: 19px;
|
||||
margin-right: 6px;
|
||||
vertical-align: sub;
|
||||
}
|
||||
}
|
||||
.item-heading {
|
||||
line-height: 16px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
.subtitle {
|
||||
color: #B5B2B2;
|
||||
font-size: 12px;
|
||||
font-weight: 300;
|
||||
}
|
||||
}
|
||||
.list {
|
||||
.item {
|
||||
font-weight: 600;
|
||||
p {
|
||||
font-weight: normal;
|
||||
}
|
||||
&.item-icon-left {
|
||||
padding-left: 64px;
|
||||
}
|
||||
color: #444;
|
||||
border-top: none;
|
||||
padding-top: 1.5rem;
|
||||
padding-bottom: 1.5rem;
|
||||
//border-top: none;
|
||||
padding-top: 0.6rem;
|
||||
padding-bottom: 0.6rem;;
|
||||
.big-icon-svg {
|
||||
left:5px;
|
||||
& > .bg{
|
||||
width:30px;
|
||||
height:30px;
|
||||
box-shadow: none;
|
||||
}
|
||||
left: 5px;
|
||||
& > .bg {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
&:before {
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 80%;
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: rgba(221, 221, 221, 0.3);
|
||||
top: 0;
|
||||
|
|
@ -163,7 +217,7 @@
|
|||
&.item-heading {
|
||||
&:before {
|
||||
top: 99%;
|
||||
width:100%;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
&:nth-child(2) {
|
||||
|
|
@ -176,5 +230,40 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
.scroll{height: 100%;}
|
||||
.scroll {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.card.contacts {
|
||||
margin: 4px 4px 16px 4px;
|
||||
|
||||
border-radius: 6px;
|
||||
box-shadow: 0px 2px 1px 0 #C1C1C1;
|
||||
.gravatar {
|
||||
border-radius: 30px;
|
||||
height: 40px;
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///* iPhone 5/SE and other small screen devices */
|
||||
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) {
|
||||
.send-wrapper .buttons .button-qr {
|
||||
height: 60px;
|
||||
span {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
#tab-send-header {
|
||||
height: 270px;
|
||||
}
|
||||
#tab-send-contacts {
|
||||
height: calc(100vh - 270px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */
|
||||
&.ios {
|
||||
height: calc(100vh - 270px - 50px - 44px - 18px); // Remove the notification-bar height on iOS
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,10 +22,7 @@
|
|||
@import "wallet-backup-phrase";
|
||||
@import "zero-state";
|
||||
@import "onboarding/onboarding";
|
||||
@import "feedback/rateCard";
|
||||
@import "feedback/send";
|
||||
@import "feedback/complete";
|
||||
@import "feedback/rateApp";
|
||||
@import "shareApp";
|
||||
@import "includes/actionSheet";
|
||||
@import "export";
|
||||
@import "import";
|
||||
|
|
|
|||
|
|
@ -1,12 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.1;}
|
||||
</style>
|
||||
<path class="st0" d="M17.5,0C7.9,0,0,7.9,0,17.5s7.9,17.5,17.5,17.5S35,27.1,35,17.5S27.1,0,17.5,0L17.5,0z M28.6,26.9
|
||||
c-1-2.3-3.2-3.3-5.4-4.1c-1-0.3-1.6-1.3-1.8-2.2c1.9-1.2,3.4-3.5,3.4-6.1v-1.5c0-4.1-3.2-7.3-7.3-7.3s-7.3,3.2-7.3,7.3v1.5
|
||||
c0,2.6,1.5,4.9,3.5,6.3C13.4,21.7,13,22.5,12,23c-2.2,0.7-4.4,1.7-5.4,4.1c-2.3-2.6-3.6-6-3.6-9.6c0-8,6.6-14.5,14.6-14.5
|
||||
s14.6,6.5,14.6,14.5C32.1,21.1,30.8,24.4,28.6,26.9L28.6,26.9z"/>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="42px" height="42px" viewBox="0 0 42 42" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Artboard</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Artboard">
|
||||
<g id="Group-155">
|
||||
<g id="Rectangle_3-2">
|
||||
<rect id="Rectangle-path" fill="#FFFFFF" fill-rule="nonzero" x="0" y="0" width="42" height="42" rx="21"></rect>
|
||||
<rect id="Rectangle-path" stroke="#DBA00A" stroke-width="2" x="1" y="1" width="40" height="40" rx="20"></rect>
|
||||
</g>
|
||||
<path d="M21,1 C9.954305,1 1,9.954305 1,21 C1,32.045695 9.954305,41 21,41 C32.045695,41 41,32.045695 41,21 C40.9694556,9.96698168 32.0330183,1.03054442 21,1 Z M21,6.99980143 C24.3134695,7.00034975 26.9991741,9.68679509 26.9988085,13.0002647 C26.998443,16.3137342 24.3121458,18.9995869 20.9986763,18.9994042 C17.6852067,18.9992215 14.9992058,16.3130724 14.9992057,12.9996029 C15.0101065,9.69014257 17.6905379,7.01015459 21,6.99980143 Z M21,35.8838364 C16.1880514,35.8617029 11.6973613,33.4651324 9.00039714,29.4799444 C9.09968229,25.4797458 17.0007943,23.2776013 21,23.2776013 C24.9992057,23.2776013 32.9032963,25.4797458 32.9996029,29.4799444 C30.2996632,33.4618263 25.8108583,35.8573907 21,35.8838364 Z" id="_ionicons_svg_md-contact" fill="#FAB915" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 812 B After Width: | Height: | Size: 1.5 KiB |
25
www/img/icon-clipboard-paste-white.svg
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.642 19.367">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1, .cls-3 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-1 {
|
||||
stroke: #fff;
|
||||
stroke-width: 1.5px;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
stroke: none;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Symbol_2_1" data-name="Symbol 2 – 1" transform="translate(-73 -156.957)">
|
||||
<g id="Rectangle_40" data-name="Rectangle 40" class="cls-1" transform="translate(73 160.028)">
|
||||
<rect class="cls-2" width="12.593" height="16.297"/>
|
||||
<rect class="cls-3" x="0.75" y="0.75" width="11.093" height="14.797"/>
|
||||
</g>
|
||||
<path id="Path_75" data-name="Path 75" class="cls-1" d="M1041.164,499.734h10.757v16.023" transform="translate(-964.029 -342.027)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 764 B |
25
www/img/icon-clipboard-paste.svg
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.642 19.367">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1, .cls-3 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-1 {
|
||||
stroke: #707070;
|
||||
stroke-width: 1.5px;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
stroke: none;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Group_72" data-name="Group 72" transform="translate(0 0.75)">
|
||||
<g id="Rectangle_40" data-name="Rectangle 40" class="cls-1" transform="translate(0 2.321)">
|
||||
<rect class="cls-2" width="12.593" height="16.297"/>
|
||||
<rect class="cls-3" x="0.75" y="0.75" width="11.093" height="14.797"/>
|
||||
</g>
|
||||
<path id="Path_75" data-name="Path 75" class="cls-1" d="M1041.164,499.734h10.757v16.023" transform="translate(-1037.029 -499.734)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 751 B |
10
www/img/icon-contact-add.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19 19">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #030303;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<path id="_ionicons_svg_md-contact" class="cls-1" d="M57.5,48A9.5,9.5,0,1,0,67,57.5,9.528,9.528,0,0,0,57.5,48Zm0,2.85a2.85,2.85,0,1,1-2.85,2.85A2.86,2.86,0,0,1,57.5,50.85Zm0,13.72a6.921,6.921,0,0,1-5.7-3.042c.046-1.9,3.8-2.946,5.7-2.946s5.654,1.046,5.7,2.946A6.932,6.932,0,0,1,57.5,64.57Z" transform="translate(-48 -48)"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 483 B |
63
www/img/icon-scan-qr.svg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 43.659 43.771">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #fff;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="QR_Scan" data-name="QR Scan" transform="translate(0 0)">
|
||||
<g id="Group_98" data-name="Group 98">
|
||||
<g id="Group_95" data-name="Group 95">
|
||||
<g id="Group_91" data-name="Group 91" transform="translate(0 0.113)">
|
||||
<path id="Path_77" data-name="Path 77" class="cls-1" d="M2.419,11H0V.2H11.027V2.619H2.419Z" transform="translate(0 -0.2)"/>
|
||||
</g>
|
||||
<g id="Group_92" data-name="Group 92" transform="translate(32.857)">
|
||||
<path id="Path_78" data-name="Path 78" class="cls-1" d="M69.2,11.027H66.783V2.419H58.4V0H69.2Z" transform="translate(-58.4)"/>
|
||||
</g>
|
||||
<g id="Group_93" data-name="Group 93" transform="translate(32.688 32.857)">
|
||||
<path id="Path_79" data-name="Path 79" class="cls-1" d="M69.071,69.2H58.1V66.783h8.552V58.4h2.419Z" transform="translate(-58.1 -58.4)"/>
|
||||
</g>
|
||||
<g id="Group_94" data-name="Group 94" transform="translate(0 32.8)">
|
||||
<path id="Path_80" data-name="Path 80" class="cls-1" d="M10.8,69.271H0V58.3H2.419v8.552H10.8Z" transform="translate(0 -58.3)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="GXLLf9.tif_1_" transform="translate(4.501 4.501)">
|
||||
<g id="Group_96" data-name="Group 96">
|
||||
<path id="Path_81" data-name="Path 81" class="cls-1" d="M49,37.1h3.319v1.632h3.319v1.632a15.783,15.783,0,0,1-1.632,0v1.632H57.27v1.632H54.007v1.632h3.319v1.632h1.632v3.319H57.327c-.056.563,0,1.125,0,1.688H54.007V50.265h1.632V48.634H54.007V47H50.688V45.37H49.056V40.419h1.632V38.788H49.056C49,38.169,49,37.663,49,37.1Zm1.688,6.583h1.632V42.051H50.688Z" transform="translate(-25.834 -20.559)"/>
|
||||
<path id="Path_82" data-name="Path 82" class="cls-1" d="M7.9,7.7H19.434V19.234c-.338.056-10.24.056-11.534,0ZM9.532,9.388v8.27c1.181.056,7.933.056,8.27,0V9.444C15.045,9.388,12.288,9.388,9.532,9.388Z" transform="translate(-7.858 -7.7)"/>
|
||||
<path id="Path_83" data-name="Path 83" class="cls-1" d="M60.572,7.7V19.234H49.038c-.056-.281-.113-10.24-.056-11.534ZM58.884,9.388h-8.27c-.056,1.463-.056,7.933,0,8.27h8.214C58.884,14.845,58.884,12.145,58.884,9.388Z" transform="translate(-25.816 -7.7)"/>
|
||||
<path id="Path_84" data-name="Path 84" class="cls-1" d="M19.4,48.9V60.434H7.867c-.056-.338-.056-10.3,0-11.534ZM9.5,58.8h8.27c.056-1.463.056-7.933,0-8.27H9.555C9.5,53.288,9.5,56.045,9.5,58.8Z" transform="translate(-7.825 -25.72)"/>
|
||||
<path id="Path_85" data-name="Path 85" class="cls-1" d="M40.2,59.751V58.119h1.632V54.8h1.632v3.319h1.688V56.488h1.632v3.319H50.1v1.632a15.783,15.783,0,0,0,1.632,0h1.632V63.07H48.414V61.439H46.783V63.07H41.832V61.439h1.632V59.751Z" transform="translate(-21.985 -28.301)"/>
|
||||
<path id="Path_86" data-name="Path 86" class="cls-1" d="M54.9,34.53V31.267c.338-.056,3.938-.056,4.951,0V34.53h1.632V31.267h1.632V37.85H59.795V36.218H58.163V32.9H56.532V34.53Z" transform="translate(-28.415 -17.99)"/>
|
||||
<path id="Path_87" data-name="Path 87" class="cls-1" d="M36.351,55.483H33.032v4.951H31.4V53.851h1.632V48.9h3.319v1.632H34.719v1.632h1.632Z" transform="translate(-18.136 -25.72)"/>
|
||||
<path id="Path_88" data-name="Path 88" class="cls-1" d="M9.532,37.056v3.263a32.026,32.026,0,0,0,3.319,0V38.688H16.17v3.263H7.9V37A15.274,15.274,0,0,0,9.532,37.056Z" transform="translate(-7.858 -20.515)"/>
|
||||
<path id="Path_89" data-name="Path 89" class="cls-1" d="M36.351,16.963v1.632c-.338.056-2.7.056-4.951.056V13.7h1.632v3.319C34.157,16.963,35.226,16.963,36.351,16.963Z" transform="translate(-18.136 -10.324)"/>
|
||||
<path id="Path_90" data-name="Path 90" class="cls-1" d="M9.532,34.563V32.932H7.9V31.3h6.583v1.632H11.163v1.632Z" transform="translate(-7.858 -18.022)"/>
|
||||
<path id="Path_91" data-name="Path 91" class="cls-1" d="M34.3,43.319V40h1.632v1.632h3.319v3.319H37.619V43.319Z" transform="translate(-19.405 -21.828)"/>
|
||||
<path id="Path_92" data-name="Path 92" class="cls-1" d="M43.1,37.883V32.932h1.632V31.3h1.688v3.319H44.788v3.319C44.169,37.883,43.663,37.883,43.1,37.883Z" transform="translate(-23.254 -18.022)"/>
|
||||
<path id="Path_93" data-name="Path 93" class="cls-1" d="M34.3,27.032h1.632a15.783,15.783,0,0,0,0-1.632h1.632v4.951H35.932V28.719H34.3Z" transform="translate(-19.405 -15.442)"/>
|
||||
<path id="Path_94" data-name="Path 94" class="cls-1" d="M33.032,11.063V9.432a15.783,15.783,0,0,0-1.632,0V7.8h3.319v3.263Z" transform="translate(-18.136 -7.744)"/>
|
||||
<path id="Path_95" data-name="Path 95" class="cls-1" d="M33.032,36.151H31.4V31.2h1.632Z" transform="translate(-18.136 -17.979)"/>
|
||||
<path id="Path_96" data-name="Path 96" class="cls-1" d="M43.1,12.651V7.7h1.632v4.951Z" transform="translate(-23.254 -7.7)"/>
|
||||
<path id="Path_97" data-name="Path 97" class="cls-1" d="M66.7,63.6h1.632v1.632H66.7Z" transform="translate(-33.576 -32.15)"/>
|
||||
<path id="Path_98" data-name="Path 98" class="cls-1" d="M38.932,63.6v1.632H37.3V63.6Z" transform="translate(-20.717 -32.15)"/>
|
||||
<circle id="Ellipse_4" data-name="Ellipse 4" class="cls-1" cx="1.181" cy="1.181" r="1.181" transform="translate(16.189 2.982)"/>
|
||||
<path id="Path_99" data-name="Path 99" class="cls-1" d="M41.832,16.5v1.632H40.2V16.5Z" transform="translate(-21.985 -11.549)"/>
|
||||
<path id="Path_100" data-name="Path 100" class="cls-1" d="M33.032,27.032H31.4V25.4h1.632Z" transform="translate(-18.136 -15.442)"/>
|
||||
<path id="Path_101" data-name="Path 101" class="cls-1" d="M43.1,27.032V25.4h1.632a15.771,15.771,0,0,1,0,1.632Z" transform="translate(-23.254 -15.442)"/>
|
||||
<path id="Path_102" data-name="Path 102" class="cls-1" d="M33.032,47.632H31.4V46h1.632Z" transform="translate(-18.136 -24.452)"/>
|
||||
<path id="Path_103" data-name="Path 103" class="cls-1" d="M27.132,43v1.632H25.5V43Z" transform="translate(-15.556 -23.14)"/>
|
||||
<path id="Path_104" data-name="Path 104" class="cls-1" d="M25.5,32.832V31.2h1.632v1.632Z" transform="translate(-15.556 -17.979)"/>
|
||||
<path id="Path_105" data-name="Path 105" class="cls-1" d="M28.4,40h1.632v1.632H28.4Z" transform="translate(-16.824 -21.828)"/>
|
||||
<path id="Path_106" data-name="Path 106" class="cls-1" d="M24.232,35.832H22.6V34.2h1.632Z" transform="translate(-14.287 -19.291)"/>
|
||||
<circle id="Ellipse_5" data-name="Ellipse 5" class="cls-1" cx="1.181" cy="1.181" r="1.181" transform="translate(9.55 16.203)"/>
|
||||
<circle id="Ellipse_6" data-name="Ellipse 6" class="cls-1" cx="1.181" cy="1.181" r="1.181" transform="translate(21.14 24.474)"/>
|
||||
<path id="Path_107" data-name="Path 107" class="cls-1" d="M13.7,18.551V13.6h4.895c.056.281.056,3.713,0,4.951Z" transform="translate(-10.395 -10.281)"/>
|
||||
<path id="Path_108" data-name="Path 108" class="cls-1" d="M59.851,18.562H54.9V13.667c.281-.056,3.6-.056,4.951,0Z" transform="translate(-28.415 -10.292)"/>
|
||||
<path id="Path_109" data-name="Path 109" class="cls-1" d="M13.7,59.651V54.7h4.895c.056.281.056,3.882,0,4.951Z" transform="translate(-10.395 -28.257)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7 KiB |
26
www/img/icon-w2w.svg
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.562 13.071">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1, .cls-2 {
|
||||
fill: #707070;
|
||||
}
|
||||
|
||||
.cls-2, .cls-3 {
|
||||
stroke: #707070;
|
||||
stroke-width: 2px;
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
fill: none;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Symbol_3_1" data-name="Symbol 3 – 1" transform="translate(-231.248 -160.719)">
|
||||
<path id="Path_45" data-name="Path 45" class="cls-1" d="M12.722,0H1.428A1.422,1.422,0,0,0,0,1.428V11.834a1.239,1.239,0,0,0,1.237,1.237H14.023a1.239,1.239,0,0,0,1.237-1.237V3.426a1.239,1.239,0,0,0-1.237-1.237h-.952V.317A.4.4,0,0,0,12.722,0M1.428.635H12.405V2.189H1.428a.779.779,0,0,1-.793-.761A.806.806,0,0,1,1.428.635M14.594,9.3H9.264a.217.217,0,0,1-.222-.222V6.155a.217.217,0,0,1,.222-.222h5.33Zm-.6-6.472a.6.6,0,0,1,.6.6V5.3H9.264a.853.853,0,0,0-.857.857V9.074a.853.853,0,0,0,.857.857h5.33V11.8a.6.6,0,0,1-.6.6H1.237a.6.6,0,0,1-.6-.6V2.6L.7,2.633a1.446,1.446,0,0,0,.7.19h12.6Z" transform="translate(231.248 160.719)"/>
|
||||
<path id="Path_46" data-name="Path 46" class="cls-1" d="M10.975,16.841h0a1.274,1.274,0,0,0,.666-1.174,1.3,1.3,0,0,0-.73-1.206,2,2,0,0,0-.92-.159H9.8v-.444a.15.15,0,0,0-.159-.159H9.2a.15.15,0,0,0-.159.159V14.3H8.533v-.444a.15.15,0,0,0-.159-.159H7.93c-.063.032-.159.1-.159.19v.444H7.327a.084.084,0,0,0-.1.1v.412a.084.084,0,0,0,.1.1h.444V19H7.327a.136.136,0,0,0-.127.127v.381a.136.136,0,0,0,.127.127h.444v.412a.15.15,0,0,0,.159.159h.444a.15.15,0,0,0,.159-.159v-.412H9.04v.412A.15.15,0,0,0,9.2,20.2h.444a.15.15,0,0,0,.159-.159v-.412h.286a2.182,2.182,0,0,0,.793-.1,1.5,1.5,0,0,0,.984-1.428,1.242,1.242,0,0,0-.888-1.269m-2.443-1.9H9.992a1.264,1.264,0,0,1,.539.1.766.766,0,0,1,.349.7.758.758,0,0,1-.793.825H8.533V14.937Zm2.062,4a1.233,1.233,0,0,1-.476.063H8.533v-1.84h1.65a.85.85,0,0,1,.92.92.9.9,0,0,1-.508.857" transform="translate(226.332 151.366)"/>
|
||||
<path id="Path_45-2" data-name="Path 45" class="cls-1" d="M12.722,0H1.428A1.422,1.422,0,0,0,0,1.428V11.834a1.239,1.239,0,0,0,1.237,1.237H14.023a1.239,1.239,0,0,0,1.237-1.237V3.426a1.239,1.239,0,0,0-1.237-1.237h-.952V.317A.4.4,0,0,0,12.722,0M1.428.635H12.405V2.189H1.428a.779.779,0,0,1-.793-.761A.806.806,0,0,1,1.428.635M14.594,9.3H9.264a.217.217,0,0,1-.222-.222V6.155a.217.217,0,0,1,.222-.222h5.33Zm-.6-6.472a.6.6,0,0,1,.6.6V5.3H9.264a.853.853,0,0,0-.857.857V9.074a.853.853,0,0,0,.857.857h5.33V11.8a.6.6,0,0,1-.6.6H1.237a.6.6,0,0,1-.6-.6V2.6L.7,2.633a1.446,1.446,0,0,0,.7.19h12.6Z" transform="translate(272.55 160.719)"/>
|
||||
<path id="Path_46-2" data-name="Path 46" class="cls-1" d="M10.975,16.841h0a1.274,1.274,0,0,0,.666-1.174,1.3,1.3,0,0,0-.73-1.206,2,2,0,0,0-.92-.159H9.8v-.444a.15.15,0,0,0-.159-.159H9.2a.15.15,0,0,0-.159.159V14.3H8.533v-.444a.15.15,0,0,0-.159-.159H7.93c-.063.032-.159.1-.159.19v.444H7.327a.084.084,0,0,0-.1.1v.412a.084.084,0,0,0,.1.1h.444V19H7.327a.136.136,0,0,0-.127.127v.381a.136.136,0,0,0,.127.127h.444v.412a.15.15,0,0,0,.159.159h.444a.15.15,0,0,0,.159-.159v-.412H9.04v.412A.15.15,0,0,0,9.2,20.2h.444a.15.15,0,0,0,.159-.159v-.412h.286a2.182,2.182,0,0,0,.793-.1,1.5,1.5,0,0,0,.984-1.428,1.242,1.242,0,0,0-.888-1.269m-2.443-1.9H9.992a1.264,1.264,0,0,1,.539.1.766.766,0,0,1,.349.7.758.758,0,0,1-.793.825H8.533V14.937Zm2.062,4a1.233,1.233,0,0,1-.476.063H8.533v-1.84h1.65a.85.85,0,0,1,.92.92.9.9,0,0,1-.508.857" transform="translate(267.634 151.366)"/>
|
||||
<path id="Path_31" data-name="Path 31" class="cls-2" d="M0,0H13.275" transform="translate(265.885 167.457) rotate(180)"/>
|
||||
<path id="arrow" class="cls-3" d="M0,0,4.764,4.866,0,9.732" transform="translate(261.884 162.554)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
|
@ -15,7 +15,7 @@
|
|||
</div>
|
||||
<div class="item item-divider"></div>
|
||||
<div class="bitcoin-com-page-body">
|
||||
<button class="button button-standard button-secondary" ng-click="openExternalLink('https://buy.bitcoin.com')">Buy bitcoin</button>
|
||||
<button class="button button-standard button-secondary" ng-click="openExternalLink('https://buy.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=BuyBitcoin')">Buy bitcoin</button>
|
||||
</div>
|
||||
</div>
|
||||
</ion-content>
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
<ion-view id="rate-app" hide-tabs>
|
||||
<ion-content scroll="false">
|
||||
<a class="skip-rating" ng-click="skip()" translate>Not now</a>
|
||||
<div class="feedback-title" translate>Thank you!</div>
|
||||
<img src="img/ico-positive-feedback.svg" class="share-the-love-illustration"/>
|
||||
<div class="subtitle">
|
||||
<span translate>5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!</span>
|
||||
</div>
|
||||
<div class="subtitle">
|
||||
<span class="text-bold" translate>Would you be willing to rate {{appName}} in the app store?</span>
|
||||
</div>
|
||||
<div class="rate-buttons">
|
||||
<button type="submit" class="button button-standard button-primary" ng-click="goAppStore()">
|
||||
<span translate>Rate on the app store</span>
|
||||
</button>
|
||||
<button type="submit" class="button button-standard button-secondary button-clear" ng-click="sendFeedback()">
|
||||
<span translate>Send us feedback instead</span>
|
||||
</button>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
<div class="card" id="rate-card" ng-controller="rateCardController">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<span translate>How do you like {{appName}}?</span>
|
||||
<a ng-click="hideCard()" ><i class="icon ion-ios-close-empty close-home-tip"></i></a>
|
||||
</div>
|
||||
<div class="row item item-sub" ng-class="{'row-margin': isModal}">
|
||||
<div class="col col-20" ng-click="setScore(1)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="1 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="1 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20" ng-click="setScore(2)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="2 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="2 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20" ng-click="setScore(3)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="3 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="3 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20" ng-click="setScore(4)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="4 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="4 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="col col-20" ng-click="setScore(5)">
|
||||
<i class="icon icon-svg">
|
||||
<img ng-if="5 == score" src="img/ico-star-filled.svg"/>
|
||||
<img ng-if="5 > score" src="img/ico-star.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="feedback-flow-button" ng-if="button_title">
|
||||
<button type="submit" class="button button-standard button-primary" ng-click="goFeedbackFlow()">
|
||||
<span>{{button_title}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
<ion-view id="send-feedback" hide-tabs>
|
||||
<ion-nav-bar class="bar-royal">
|
||||
<ion-nav-title>{{'Send Feedback' | translate}}</ion-nav-title>
|
||||
<ion-nav-buttons side="primary">
|
||||
<button ng-show="score" class="button no-border ng-hide" ng-click="sendFeedback(null, true)" translate>
|
||||
Cancel
|
||||
</button>
|
||||
<button ng-show="!score || fromSettings" class="button back-button button-clear ng-hide" ng-click="goBack()">
|
||||
<i class="icon ion-ios-arrow-thin-left"></i>
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
<ion-nav-buttons side="secondary">
|
||||
<button ng-show="isCordova" ng-disabled="!feedback.value" class="button no-border" type="submit" ng-click="sendFeedback(feedback.value)" translate>
|
||||
Send
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content class="has-header" scroll="false">
|
||||
<div class="row item item-sub feedback-heading">
|
||||
<div class="col col-50">
|
||||
<div class="feedback-title" ng-if="!justFeedback">
|
||||
<span>{{reaction}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-50 rating" ng-if="score">
|
||||
<img class="send-feedback-star" ng-if="1 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="1 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="2 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="2 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="3 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="3 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="4 <= score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="4 > score" src="img/ico-star.svg"/>
|
||||
<img class="send-feedback-star" ng-if="5 == score" src="img/ico-star-filled.svg"/>
|
||||
<img class="send-feedback-star" ng-if="5 > score" src="img/ico-star.svg"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="comment">
|
||||
<span>{{comment}}</span>
|
||||
</div>
|
||||
<div ng-if="showForm" class="form-fade-in">
|
||||
<textarea class="user-feedback" ng-model="feedback.value" rows="5" placeholder="{{'Your ideas, feedback, or comments' | translate}}"></textarea>
|
||||
<button ng-show="!isCordova" ng-disabled="!feedback.value" type="submit" class="button button-standard button-primary" ng-click="sendFeedback(feedback.value)" translate>
|
||||
Send
|
||||
</button>
|
||||
</div>
|
||||
</ion-content>
|
||||
</ion-view>
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
ng-init="wallet.coin == 'btc' ? walletsBtc.push(wallet) : walletsBch.push(wallet)">
|
||||
</span>
|
||||
|
||||
<div class="header" ng-if="!walletsBtc[0] || !walletsBch[0]">{{title}}</div>
|
||||
<div class="header" ng-if="(!walletsBtc[0] || !walletsBch[0]) || forceTitle === true">{{title}}</div>
|
||||
|
||||
<div class="subheader" ng-if="walletsBch[0] && walletsBtc[0]">
|
||||
<div translate>Bitcoin Cash (BCH)</div>
|
||||
|
|
|
|||
|
|
@ -1,32 +1,16 @@
|
|||
<ion-view id="complete" hide-tabs>
|
||||
<ion-view id="share-app" hide-tabs>
|
||||
<ion-nav-bar class="bar-royal">
|
||||
<ion-nav-back-button>
|
||||
</ion-nav-back-button>
|
||||
<ion-nav-title>{{title}}</ion-nav-title>
|
||||
<ion-nav-buttons side="secondary">
|
||||
<button ng-show="!fromSettings" class="button no-border" ng-click="close()" translate>
|
||||
Finish
|
||||
</button>
|
||||
</ion-nav-buttons>
|
||||
</ion-nav-bar>
|
||||
<ion-content scroll="false">
|
||||
<div class="complete-layout">
|
||||
<div class="complete-layout__expand" ng-class="{'fade-in': !animate || socialsharing}">
|
||||
<div ng-show="fromSettings">
|
||||
<img src="img/ico-positive-feedback.svg" class="share-the-love-illustration"/>
|
||||
<div class="subtitle" translate>Share the love by inviting your friends.</div>
|
||||
</div>
|
||||
<div ng-show="!fromSettings">
|
||||
<div class="feedback-title" translate>Thank you!</div>
|
||||
<div class="subtitle" ng-show="!skipped" translate>A member of the team will review your feedback as soon as possible.</div>
|
||||
<div ng-if="score <= 3 || !socialsharing">
|
||||
<div class="subtitle" translate>If you have additional feedback, please let us know by tapping the "Send feedback" option in the Settings tab.</div>
|
||||
<img src="img/illustration-send-feedback.png" class="send-feedback-illustration"/>
|
||||
</div>
|
||||
<div class="subtitle" ng-if="score > 3 && socialsharing" translate>Share the love by inviting your friends.</div>
|
||||
</div>
|
||||
<div class="share-app-layout">
|
||||
<div class="share-app-layout__expand fade-in">
|
||||
<img src="img/ico-positive-feedback.svg" class="share-the-love-illustration"/>
|
||||
<div class="subtitle" translate>Share the love by inviting your friends.</div>
|
||||
</div>
|
||||
<div class="share-buttons" ng-if="score > 3 && socialsharing" ng-class="{'slide-up': socialsharing }">
|
||||
<div class="share-buttons slide-up">
|
||||
<div class="share-buttons__action" ng-show="facebook" ng-click="shareFacebook()">
|
||||
<i class="icon socialsharing-icon">
|
||||
<img src="img/social-icons/ico-social-facebook.svg"/>
|
||||
|
|
@ -22,8 +22,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ng-hide" ng-show="showRateCard.value" ng-include="'views/feedback/rateCard.html'"></div>
|
||||
|
||||
<div class="list card homeTip" ng-if="homeTip">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<div class="title" translate>
|
||||
|
|
|
|||
|
|
@ -3,15 +3,57 @@
|
|||
<ion-nav-title>{{'Send' | translate}}</ion-nav-title>
|
||||
</ion-nav-bar>
|
||||
<ion-content>
|
||||
<div id="tab-send-header" ng-if="hasFunds">
|
||||
<div class="send-wrapper item">
|
||||
<div class="row">
|
||||
<div class="input" ng-class="{'focus': searchFocus}">
|
||||
<input type="text" class="search-input" placeholder="{{'Search or enter bitcoin address' | translate}}"
|
||||
ng-model="formData.search" ng-change="findContact(formData.search)" ng-model-onblur
|
||||
ng-focus="searchInFocus()" ng-blur="searchBlurred()">
|
||||
</div>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<div class="row">
|
||||
<div class="col-40">
|
||||
<button class="button button-standard button-primary button-outline button-clipboard-paste" ng-click="pasteClipboard()" ng-class="{'contains-address': clipboardHasAddress, 'contains-content': clipboardHasContent}">
|
||||
<span class="icon"></span><br/>
|
||||
<span class="non-address" translate>Paste Clipboard</span>
|
||||
<span class="address" translate>Paste Address</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-60">
|
||||
<button class="button button-standard button-primary button-outline" ng-click="showWalletSelector()">
|
||||
<img src="img/icon-w2w.svg"/><br/>
|
||||
<span translate>Wallet to Wallet Transfer</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<button class="button button-standard button-green button-qr" ui-sref="tabs.scan">
|
||||
<span>
|
||||
<img src="img/icon-scan-qr.svg"/>
|
||||
<span translate>Scan QR Code</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-if="hasFunds">
|
||||
<div class="send-header-wrapper">
|
||||
<div class="item item-heading send-heading"><span translate>Recipient</span></div>
|
||||
<div class="item input search-wrapper" ng-class="{'focus': searchFocus}">
|
||||
<i class="icon icon-svg abs-v-center icon-bitcoinlogoplain"></i>
|
||||
<div class="item-icon-right">
|
||||
<input type="text" class="search-input" placeholder="{{'Search or enter bitcoin address' | translate}}" ng-model="formData.search" ng-change="findContact(formData.search)" ng-model-onblur ng-focus="searchInFocus()" ng-blur="searchBlurred()">
|
||||
<i class="icon icon-svg qr abs-v-center separator-left" on-tap="openScanner()"><img src="img/scan-ico.svg"></i>
|
||||
<div ng-if="hasWallets && hasFunds && !hasContacts">
|
||||
<div class="list sendTip">
|
||||
<div class="title" translate>
|
||||
Send Bitcoin faster!
|
||||
</div>
|
||||
<div class="subtitle">
|
||||
<div ng-show="hasWallets">
|
||||
<p translate>Save frequently used addresses and send them Bitcoin in just one tap</p>
|
||||
</div>
|
||||
<div class="padding buttons">
|
||||
<a class="button-first-contact" ng-click="addContact()">
|
||||
<img src="img/icon-contact-add.svg"/>
|
||||
<span translate>Add your first contact</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -19,72 +61,75 @@
|
|||
|
||||
<div ng-if="!checkingBalance && (!hasFunds || !hasWallets)">
|
||||
<div class="list card sendTip">
|
||||
<div class="item item-icon-right item-heading"></div>
|
||||
<div>
|
||||
<i class="icon zero-state-icon">
|
||||
<img src="img/tab-icons/ico-send-selected.svg"/>
|
||||
</i>
|
||||
</div>
|
||||
<div class="title" translate>
|
||||
Start sending bitcoin
|
||||
Your Bitcoin wallet is empty
|
||||
</div>
|
||||
<div class="subtitle">
|
||||
<span ng-show="hasWallets" translate>To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service.</span>
|
||||
<span ng-show="!hasWallets" translate>To get started, you'll need to create a bitcoin wallet and get some bitcoin.</span>
|
||||
<div class="padding">
|
||||
<button class="button button-standard button-primary track_buy_bitcoin_click" id="tab_send_buy_bitcoin" ng-click="buyBitcoin()" ng-show="hasWallets" translate>Buy Bitcoin</button>
|
||||
<button class="button button-standard button-primary" ng-click="createWallet()" ng-show="!hasWallets" translate>Create bitcoin wallet</button>
|
||||
<button class="button button-standard button-secondary" ui-sref="tabs.receive" ng-show="hasWallets" translate>Show bitcoin address</button>
|
||||
<div ng-show="hasWallets">
|
||||
<p translate>To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.</p>
|
||||
<p translate>You can receive bitcoin from any wallet or service.</p>
|
||||
</div>
|
||||
<div ng-show="!hasWallets" translate>To get started, you'll need to create a bitcoin wallet and get some bitcoin.</div>
|
||||
<div class="padding buttons">
|
||||
<button class="button button-standard button-green" ng-click="buyBitcoin()" ng-show="hasWallets" translate>Buy Bitcoin now</button>
|
||||
<button class="button button-standard button-green" ng-click="createWallet()" ng-show="!hasWallets" translate>Create bitcoin wallet</button>
|
||||
<button class="button button-standard button-white" ui-sref="tabs.receive" ng-show="hasWallets" translate>Show my address</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" ng-if="hasContacts && hasWallets && hasFunds">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<span translate>Contacts</span>
|
||||
<a ng-if="hasContacts" ui-sref="tabs.send.addressbook">
|
||||
<i class="icon ion-ios-plus-empty list-add-button"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="list">
|
||||
<a class="item item-icon-left item-icon-right" ng-repeat="item in list" ng-if="!item.isWallet && item.recipientType != 'wallet'" ng-click="goToAmount(item)">
|
||||
<i class="icon big-icon-svg">
|
||||
<img src="img/contact-placeholder.svg" class="bg" ng-if="isChromeApp">
|
||||
<gravatar class="send-gravatar" name="{{item.name}}" width="30" email="{{item.email}}" ng-if="!isChromeApp"></gravatar>
|
||||
</i>
|
||||
{{item.name}}
|
||||
<p>
|
||||
<span>{{item.displayCoin}}</span>
|
||||
</p>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
</a>
|
||||
<div class="show-more" ng-if="contactsShowMore" ng-click="showMore()" translate>
|
||||
Show more
|
||||
<div id="tab-send-contacts" class="row" ng-class="{'ios':isIOS}" ng-if="hasContacts && hasWallets && hasFunds">
|
||||
<div class="col">
|
||||
<div class="card contacts">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<div translate>Contacts</div>
|
||||
<div class="subtitle"><span translate>Saved frequently used addresses</span></div>
|
||||
<a ng-if="hasContacts" ui-sref="tabs.send.addressbook">
|
||||
<i class="icon ion-ios-plus-empty list-add-button"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="list">
|
||||
<a class="item item-icon-left item-icon-right" ng-repeat="item in list"
|
||||
ng-if="!item.isWallet && item.recipientType != 'wallet'" ng-click="goToAmount(item)">
|
||||
<i class="icon big-icon-svg">
|
||||
<gravatar class="send-gravatar" name="{{item.name}}" width="120" email="{{item.email}}"></gravatar>
|
||||
</i>
|
||||
{{item.name}}
|
||||
<p>
|
||||
<span>{{item.displayCoin}}</span>
|
||||
</p>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" ng-if="showTransferCard && hasFunds">
|
||||
<div class="item item-icon-right item-heading" ng-click="toggle('transferToWallet')">
|
||||
<span translate>Transfer to Wallet</span>
|
||||
<i class="icon bp-arrow-up" ng-show="sectionDisplay.transferToWallet"></i>
|
||||
<i class="icon bp-arrow-down" ng-show="!sectionDisplay.transferToWallet"></i>
|
||||
</div>
|
||||
<div class="list" ng-show="sectionDisplay.transferToWallet">
|
||||
<a class="item item-icon-left item-icon-right"
|
||||
ng-repeat="item in list"
|
||||
ng-if="hasWallets && item.recipientType == 'wallet'"
|
||||
ng-click="goToAmount(item)">
|
||||
<i class="icon big-icon-svg" ng-if="item.recipientType == 'wallet'" ng-init="wallet = item" ng-include="'views/includes/walletIcon.html'"></i>
|
||||
{{item.name}}
|
||||
<p>
|
||||
<span>{{item.balanceString}}</span>
|
||||
</p>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</ion-content>
|
||||
<wallet-selector
|
||||
wallet-selector-title="walletSelectorTitleFrom"
|
||||
wallet-selector-force-title="walletSelectorTitleForce"
|
||||
wallet-selector-wallets="walletsWithFunds"
|
||||
wallet-selector-selected-wallet="wallet"
|
||||
wallet-selector-show="showWallets"
|
||||
wallet-selector-on-select="onWalletSelect"
|
||||
wallet-selector-display-balance-as-fiat="displayBalanceAsFiat">
|
||||
</wallet-selector>
|
||||
<wallet-selector
|
||||
wallet-selector-on-hide=""
|
||||
wallet-selector-title="walletSelectorTitleTo"
|
||||
wallet-selector-wallets="walletsBch"
|
||||
wallet-selector-selected-wallet="wallet"
|
||||
wallet-selector-show="showWalletsBch"
|
||||
wallet-selector-on-select="onWalletSelect"
|
||||
wallet-selector-display-balance-as-fiat="displayBalanceAsFiat">
|
||||
</wallet-selector>
|
||||
<wallet-selector
|
||||
wallet-selector-on-hide=""
|
||||
wallet-selector-title="walletSelectorTitleTo"
|
||||
wallet-selector-wallets="walletsBtc"
|
||||
wallet-selector-selected-wallet="wallet"
|
||||
wallet-selector-show="showWalletsBtc"
|
||||
wallet-selector-on-select="onWalletSelect"
|
||||
wallet-selector-display-balance-as-fiat="displayBalanceAsFiat">
|
||||
</wallet-selector>
|
||||
</ion-view>
|
||||
|
|
|
|||
|
|
@ -22,14 +22,14 @@
|
|||
<img src="img/icon-link.svg" class="bg just-a-hint"/>
|
||||
</i>
|
||||
</a>
|
||||
<a class="item item-icon-left item-icon-right" ui-sref="tabs.feedback">
|
||||
<a class="item item-icon-left item-icon-right" ng-click="sendFeedback()">
|
||||
<i class="icon big-icon-svg">
|
||||
<img src="img/icon-send-feedback.svg" class="bg"/>
|
||||
</i>
|
||||
<span>{{'Send Feedback' | translate}}</span>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
</a>
|
||||
<a ng-if="isCordova && !isWindowsPhoneApp" class="item item-icon-left item-icon-right" ui-sref="tabs.shareApp({score: 4, skipped: true, fromSettings: true})">
|
||||
<a ng-if="isCordova && !isWindowsPhoneApp" class="item item-icon-left item-icon-right" ui-sref="tabs.shareApp">
|
||||
<i class="icon big-icon-svg">
|
||||
<img src="img/icon-heart.svg" class="bg"/>
|
||||
</i>
|
||||
|
|
|
|||