Merge branch 'wallet/sprint/20' into wallet/task/441
This commit is contained in:
commit
7f0946b390
48 changed files with 1357 additions and 459 deletions
|
|
@ -21,6 +21,9 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
|
|||
$timeout(function() {
|
||||
var form = addressbookForm;
|
||||
if (data && form) {
|
||||
if (data.result) {
|
||||
data = data.result;
|
||||
}
|
||||
data = data.replace(/^bitcoin(cash)?:/, '');
|
||||
form.address.$setViewValue(data);
|
||||
form.address.$isValid = true;
|
||||
|
|
@ -36,9 +39,9 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
|
|||
addressbook.address = translated.legacy;
|
||||
}
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("contact_created", [{
|
||||
"coin": $scope.addressbookEntry.coin
|
||||
|
|
|
|||
|
|
@ -1,58 +1,174 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicModal, $ionicScrollDelegate, $ionicHistory, storageService, walletService, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, popupService, bwcError, payproService, profileService, bitcore, amazonService, nodeWebkitService) {
|
||||
angular.module('copayApp.controllers').controller('amountController', amountController);
|
||||
|
||||
function amountController(configService, $filter, $ionicHistory, $ionicModal, $ionicScrollDelegate, lodash, $log, nodeWebkitService, rateService, $scope, $state, $stateParams, $timeout, txFormatService, platformInfo, popupService, profileService, walletService, $window) {
|
||||
var vm = this;
|
||||
|
||||
vm.allowSend = false;
|
||||
vm.altCurrencyList = [];
|
||||
vm.alternativeAmount = '';
|
||||
vm.alternativeUnit = '';
|
||||
vm.amount = '0';
|
||||
vm.availableFunds = '';
|
||||
vm.fromWalletId = '';
|
||||
// Use insufficient for logic, as when the amount is invalid, funds being
|
||||
// either sufficent or insufficient doesn't make sense.
|
||||
vm.fundsAreInsufficient = false;
|
||||
vm.globalResult = '';
|
||||
vm.hello = 'hi';
|
||||
vm.isRequestingSpecificAmount = false;
|
||||
vm.listComplete = false;
|
||||
vm.lastUsedPopularList = [];
|
||||
vm.maxShapeshiftAmount = 0;
|
||||
vm.minShapeshiftAmount = 0;
|
||||
vm.shapeshiftOrderId = '';
|
||||
vm.unit = '';
|
||||
|
||||
vm.changeUnit = changeUnit;
|
||||
vm.close = close;
|
||||
vm.findCurrency = findCurrency;
|
||||
vm.finish = finish;
|
||||
vm.goBack = goBack;
|
||||
vm.loadMore = loadMore;
|
||||
vm.openPopup = openPopup;
|
||||
vm.pushDigit = pushDigit;
|
||||
vm.removeDigit = removeDigit;
|
||||
vm.save = save;
|
||||
vm.sendMax = sendMax;
|
||||
|
||||
$scope.$on('$ionicView.beforeEnter', onBeforeEnter);
|
||||
$scope.$on('$ionicView.leave', onLeave);
|
||||
|
||||
var _id;
|
||||
var unitToSatoshi;
|
||||
var satToUnit;
|
||||
var unitDecimals;
|
||||
var satToBtc;
|
||||
var SMALL_FONT_SIZE_LIMIT = 10;
|
||||
var LENGTH_EXPRESSION_LIMIT = 19;
|
||||
var LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT = 8;
|
||||
var LENGTH_AFTER_COMMA_EXPRESSION_LIMIT = 8;
|
||||
var isNW = platformInfo.isNW;
|
||||
|
||||
var unitIndex = 0;
|
||||
var _id;
|
||||
var altCurrencyModal = null;
|
||||
var altUnitIndex = 0;
|
||||
var availableFundsInCrypto = '';
|
||||
var availableFundsInFiat = '';
|
||||
var availableSatoshis = null;
|
||||
var availableUnits = [];
|
||||
var displayAddress = null;
|
||||
var fiatCode;
|
||||
|
||||
var fixedUnit;
|
||||
var hasMaxAmount = true;
|
||||
var isNW = platformInfo.isNW;
|
||||
var isAndroid = platformInfo.isAndroid;
|
||||
var isIos = platformInfo.isIOS;
|
||||
var lastUsedAltCurrencyList = [];
|
||||
var nextStep = null;
|
||||
var unitToSatoshi;
|
||||
var recipientType = null;
|
||||
var satToUnit;
|
||||
var showMenu = false;
|
||||
var showWarningMessage = false;
|
||||
var toAddress = '';
|
||||
var toColor = null;
|
||||
var toEmail = null;
|
||||
var toName = null;
|
||||
var unitDecimals;
|
||||
var unitIndex = 0;
|
||||
var useSendMax = false;
|
||||
|
||||
$scope.amountModel = { amount: 0 };
|
||||
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
$scope.isAndroid = platformInfo.isAndroid;
|
||||
$scope.isIos = platformInfo.isIOS;
|
||||
|
||||
$scope.$on('$ionicView.leave', function() {
|
||||
function onLeave() {
|
||||
angular.element($window).off('keydown');
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||
}
|
||||
|
||||
function onBeforeEnter(event, data) {
|
||||
|
||||
initCurrencies();
|
||||
|
||||
vm.hello = 'greetings';
|
||||
if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) {
|
||||
$scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
|
||||
$scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
|
||||
$scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
|
||||
vm.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
|
||||
vm.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
|
||||
vm.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
|
||||
}
|
||||
|
||||
// To get the wallet from with the new flow
|
||||
$scope.fromWalletId = data.stateParams.fromWalletId;
|
||||
vm.fromWalletId = data.stateParams.fromWalletId;
|
||||
|
||||
if (data.stateParams.noPrefix) {
|
||||
$scope.showWarningMessage = data.stateParams.noPrefix != 0;
|
||||
if ($scope.showWarningMessage) {
|
||||
showWarningMessage = data.stateParams.noPrefix != 0;
|
||||
if (showWarningMessage) {
|
||||
var message = 'Address doesn\'t contain currency information, please make sure you are sending the correct currency.';
|
||||
popupService.showAlert('', message, function() {}, 'Ok');
|
||||
}
|
||||
}
|
||||
|
||||
vm.isRequestingSpecificAmount = !!data.stateParams.id;
|
||||
var config = configService.getSync().wallet.settings;
|
||||
|
||||
// Go to...
|
||||
_id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID)
|
||||
nextStep = data.stateParams.nextStep;
|
||||
|
||||
setAvailableUnits();
|
||||
updateUnitUI();
|
||||
|
||||
if ($ionicHistory.backView().stateName == 'tabs.receive') {
|
||||
hasMaxAmount = false;
|
||||
}
|
||||
|
||||
showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard');
|
||||
recipientType = data.stateParams.recipientType || null;
|
||||
toAddress = data.stateParams.toAddress;
|
||||
displayAddress = data.stateParams.displayAddress;
|
||||
toName = data.stateParams.toName;
|
||||
toEmail = data.stateParams.toEmail;
|
||||
toColor = data.stateParams.toColor;
|
||||
|
||||
if (!nextStep && !data.stateParams.toAddress) {
|
||||
$log.error('Bad params at amount')
|
||||
throw ('bad params');
|
||||
}
|
||||
|
||||
var reNr = /^[1234567890\.]$/;
|
||||
var reOp = /^[\*\+\-\/]$/;
|
||||
|
||||
if (!isAndroid && !isIos) {
|
||||
var disableKeys = angular.element($window).on('keydown', function(e) {
|
||||
if (!e.key) return;
|
||||
if (e.which === 8) { // you can add others here inside brackets.
|
||||
if (!altCurrencyModal) {
|
||||
e.preventDefault();
|
||||
vm.removeDigit();
|
||||
}
|
||||
}
|
||||
|
||||
if (e.key.match(reNr)) {
|
||||
vm.pushDigit(e.key);
|
||||
} else if (e.key.match(reOp)) {
|
||||
pushOperator(e.key);
|
||||
} else if (e.keyCode === 86) {
|
||||
if (e.ctrlKey || e.metaKey) processClipboard();
|
||||
} else if (e.keyCode === 13) vm.finish();
|
||||
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
unitToSatoshi = config.unitToSatoshi;
|
||||
satToUnit = 1 / unitToSatoshi;
|
||||
unitDecimals = config.unitDecimals;
|
||||
|
||||
resetAmount();
|
||||
|
||||
// in SAT ALWAYS
|
||||
if ($stateParams.toAmount) {
|
||||
vm.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals);
|
||||
}
|
||||
|
||||
processAmount();
|
||||
|
||||
$timeout(function() {
|
||||
$ionicScrollDelegate.resize();
|
||||
}, 10);
|
||||
|
||||
function setAvailableUnits() {
|
||||
var defaults = configService.getDefaults();
|
||||
var configCache = configService.getSync();
|
||||
|
|
@ -134,83 +250,16 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
});
|
||||
|
||||
altUnitIndex = 0;
|
||||
|
||||
if (vm.fromWalletId) {
|
||||
var fromWallet = profileService.getWallet(vm.fromWalletId);
|
||||
updateAvailableFundsFromWallet(fromWallet);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
// Go to...
|
||||
_id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID)
|
||||
$scope.nextStep = data.stateParams.nextStep;
|
||||
|
||||
setAvailableUnits();
|
||||
updateUnitUI();
|
||||
|
||||
$scope.hasMaxAmount = true;
|
||||
if ($ionicHistory.backView().stateName == 'tabs.receive') {
|
||||
$scope.hasMaxAmount = false;
|
||||
}
|
||||
|
||||
$scope.showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard');
|
||||
$scope.recipientType = data.stateParams.recipientType || null;
|
||||
$scope.toAddress = data.stateParams.toAddress;
|
||||
$scope.displayAddress = data.stateParams.displayAddress;
|
||||
$scope.toName = data.stateParams.toName;
|
||||
$scope.toEmail = data.stateParams.toEmail;
|
||||
$scope.toColor = data.stateParams.toColor;
|
||||
|
||||
if (!$scope.nextStep && !data.stateParams.toAddress) {
|
||||
$log.error('Bad params at amount')
|
||||
throw ('bad params');
|
||||
}
|
||||
|
||||
var reNr = /^[1234567890\.]$/;
|
||||
var reOp = /^[\*\+\-\/]$/;
|
||||
|
||||
if (!$scope.isAndroid && !$scope.isIos) {
|
||||
var disableKeys = angular.element($window).on('keydown', function(e) {
|
||||
if (!e.key) return;
|
||||
if (e.which === 8) { // you can add others here inside brackets.
|
||||
if (!$scope.altCurrencyModal) {
|
||||
e.preventDefault();
|
||||
$scope.removeDigit();
|
||||
}
|
||||
}
|
||||
|
||||
if (e.key.match(reNr)) {
|
||||
$scope.pushDigit(e.key);
|
||||
} else if (e.key.match(reOp)) {
|
||||
$scope.pushOperator(e.key);
|
||||
} else if (e.keyCode === 86) {
|
||||
if (e.ctrlKey || e.metaKey) processClipboard();
|
||||
} else if (e.keyCode === 13) $scope.finish();
|
||||
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$scope.specificAmount = $scope.specificAlternativeAmount = '';
|
||||
$scope.isCordova = platformInfo.isCordova;
|
||||
unitToSatoshi = config.unitToSatoshi;
|
||||
satToUnit = 1 / unitToSatoshi;
|
||||
satToBtc = 1 / 100000000;
|
||||
unitDecimals = config.unitDecimals;
|
||||
|
||||
$scope.resetAmount();
|
||||
|
||||
// in SAT ALWAYS
|
||||
if ($stateParams.toAmount) {
|
||||
$scope.amountModel.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals);
|
||||
}
|
||||
|
||||
$scope.processAmount();
|
||||
|
||||
$timeout(function() {
|
||||
$ionicScrollDelegate.resize();
|
||||
}, 10);
|
||||
});
|
||||
|
||||
$scope.goBack = function() {
|
||||
if ($scope.shapeshiftOrderId) {
|
||||
function goBack() {
|
||||
if (vm.shapeshiftOrderId) {
|
||||
$state.go('tabs.send').then(function() {
|
||||
$ionicHistory.clearHistory();
|
||||
$state.go('tabs.home').then(function() {
|
||||
|
|
@ -223,8 +272,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
}
|
||||
|
||||
function paste(value) {
|
||||
$scope.amountModel.amount = value;
|
||||
$scope.processAmount();
|
||||
vm.amount = value;
|
||||
processAmount();
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
});
|
||||
|
|
@ -236,29 +285,22 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
if (value && evaluate(value) > 0) paste(evaluate(value));
|
||||
};
|
||||
|
||||
$scope.sendMax = function() {
|
||||
$scope.useSendMax = true;
|
||||
$scope.finish();
|
||||
};
|
||||
|
||||
$scope.toggleAlternative = function() {
|
||||
if ($scope.amountModel.amount && isExpression($scope.amountModel.amount)) {
|
||||
var amount = evaluate(format($scope.amountModel.amount));
|
||||
$scope.globalResult = '= ' + processResult(amount);
|
||||
}
|
||||
function sendMax() {
|
||||
useSendMax = true;
|
||||
finish();
|
||||
};
|
||||
|
||||
function updateUnitUI() {
|
||||
$scope.unit = availableUnits[unitIndex].shortName;
|
||||
$scope.alternativeUnit = availableUnits[altUnitIndex].shortName;
|
||||
vm.unit = availableUnits[unitIndex].shortName;
|
||||
vm.alternativeUnit = availableUnits[altUnitIndex].shortName;
|
||||
|
||||
$scope.processAmount();
|
||||
$log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit);
|
||||
processAmount();
|
||||
$log.debug('Update unit coin @amount unit:' + vm.unit + " alternativeUnit:" + vm.alternativeUnit);
|
||||
};
|
||||
|
||||
$scope.changeUnit = function() {
|
||||
function changeUnit() {
|
||||
|
||||
$scope.amountModel.amount = '0';
|
||||
vm.amount = '0';
|
||||
|
||||
if (fixedUnit) return;
|
||||
|
||||
|
|
@ -275,62 +317,39 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
});
|
||||
}
|
||||
|
||||
updateAvailableFundsStringIfNeeded();
|
||||
updateUnitUI();
|
||||
};
|
||||
|
||||
|
||||
$scope.changeAlternativeUnit = function() {
|
||||
|
||||
// Do nothing is fiat is not main unit
|
||||
if (!availableUnits[unitIndex].isFiat) return;
|
||||
|
||||
var nextCoin = lodash.findIndex(availableUnits, function(x) {
|
||||
if (x.isFiat) return false;
|
||||
if (x.id == availableUnits[altUnitIndex].id) return false;
|
||||
return true;
|
||||
});
|
||||
|
||||
if (nextCoin >= 0) {
|
||||
altUnitIndex = nextCoin;
|
||||
updateUnitUI();
|
||||
}
|
||||
};
|
||||
|
||||
function checkFontSize() {
|
||||
if ($scope.amountModel.amount && $scope.amountModel.amount.length >= SMALL_FONT_SIZE_LIMIT) $scope.smallFont = true;
|
||||
else $scope.smallFont = false;
|
||||
};
|
||||
|
||||
$scope.pushDigit = function(digit) {
|
||||
if ($scope.amountModel.amount && digit != '.') {
|
||||
var amountSplitByComma = $scope.amountModel.amount.split('.');
|
||||
function pushDigit(digit) {
|
||||
if (vm.amount && digit != '.') {
|
||||
var amountSplitByComma = vm.amount.split('.');
|
||||
if (amountSplitByComma.length > 1 && amountSplitByComma[1].length >= LENGTH_AFTER_COMMA_EXPRESSION_LIMIT) return;
|
||||
if (amountSplitByComma.length == 1 && amountSplitByComma[0].length >= LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT) return;
|
||||
}
|
||||
|
||||
if ($scope.amountModel.amount && $scope.amountModel.amount.length >= LENGTH_EXPRESSION_LIMIT) return;
|
||||
if ($scope.amountModel.amount.indexOf('.') > -1 && digit == '.') return;
|
||||
if ($scope.amountModel.amount == '0' && digit == '0') return;
|
||||
if (availableUnits[unitIndex].isFiat && $scope.amountModel.amount.indexOf('.') > -1 && $scope.amountModel.amount[$scope.amountModel.amount.indexOf('.') + 2]) return;
|
||||
if (vm.amount && vm.amount.length >= LENGTH_EXPRESSION_LIMIT) return;
|
||||
if (vm.amount.indexOf('.') > -1 && digit == '.') return;
|
||||
if (vm.amount == '0' && digit == '0') return;
|
||||
if (availableUnits[unitIndex].isFiat && vm.amount.indexOf('.') > -1 && vm.amount[vm.amount.indexOf('.') + 2]) return;
|
||||
|
||||
if ($scope.amountModel.amount == '0' && digit != '.') {
|
||||
$scope.amountModel.amount = '';
|
||||
if (vm.amount == '0' && digit != '.') {
|
||||
vm.amount = '';
|
||||
}
|
||||
|
||||
if ($scope.amountModel.amount == '' && digit == '.') {
|
||||
$scope.amountModel.amount = '0';
|
||||
if (vm.amount == '' && digit == '.') {
|
||||
vm.amount = '0';
|
||||
}
|
||||
|
||||
$scope.amountModel.amount = ($scope.amountModel.amount + digit).replace('..', '.');
|
||||
checkFontSize();
|
||||
$scope.processAmount();
|
||||
vm.amount = (vm.amount + digit).replace('..', '.');
|
||||
processAmount();
|
||||
};
|
||||
|
||||
$scope.pushOperator = function(operator) {
|
||||
if (!$scope.amountModel.amount || $scope.amountModel.amount.length == 0) return;
|
||||
$scope.amountModel.amount = _pushOperator($scope.amountModel.amount);
|
||||
function pushOperator(operator) {
|
||||
if (!vm.amount || vm.amount.length == 0) return;
|
||||
vm.amount = pushOperator(vm.amount);
|
||||
|
||||
function _pushOperator(val) {
|
||||
function pushOperator(val) {
|
||||
if (!isOperator(lodash.last(val))) {
|
||||
return val + operator;
|
||||
} else {
|
||||
|
|
@ -349,62 +368,77 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
return regex.test(val);
|
||||
};
|
||||
|
||||
$scope.removeDigit = function() {
|
||||
$scope.amountModel.amount = ($scope.amountModel.amount).toString().slice(0, -1);
|
||||
$scope.processAmount();
|
||||
checkFontSize();
|
||||
};
|
||||
function removeDigit() {
|
||||
vm.amount = (vm.amount).toString().slice(0, -1);
|
||||
processAmount();
|
||||
}
|
||||
|
||||
$scope.resetAmount = function() {
|
||||
$scope.amountModel.amount = $scope.alternativeAmount = $scope.globalResult = '';
|
||||
$scope.allowSend = false;
|
||||
checkFontSize();
|
||||
};
|
||||
function resetAmount() {
|
||||
vm.amount = vm.alternativeAmount = vm.globalResult = '0';
|
||||
vm.allowSend = false;
|
||||
}
|
||||
|
||||
|
||||
$scope.openPopup = function() {
|
||||
function openPopup() {
|
||||
$ionicModal.fromTemplateUrl('views/modals/altCurrency.html', {
|
||||
scope: $scope
|
||||
}).then(function(modal) {
|
||||
$scope.altCurrencyModal = modal;
|
||||
$scope.altCurrencyModal.show();
|
||||
altCurrencyModal = modal;
|
||||
altCurrencyModal.show();
|
||||
});
|
||||
}
|
||||
|
||||
function close() {
|
||||
altCurrencyModal.remove();
|
||||
altCurrencyModal = null;
|
||||
};
|
||||
|
||||
$scope.close = function() {
|
||||
$scope.altCurrencyModal.remove();
|
||||
$scope.altCurrencyModal = false;
|
||||
};
|
||||
|
||||
$scope.processAmount = function() {
|
||||
var formatedValue = format($scope.amountModel.amount);
|
||||
function processAmount() {
|
||||
var formatedValue = format(vm.amount);
|
||||
var result = evaluate(formatedValue);
|
||||
|
||||
if (lodash.isNumber(result)) {
|
||||
$scope.globalResult = isExpression($scope.amountModel.amount) ? '= ' + processResult(result) : '';
|
||||
vm.globalResult = isExpression(vm.amount) ? '= ' + processResult(result) : '';
|
||||
|
||||
if (availableUnits[unitIndex].isFiat) {
|
||||
|
||||
var a = fromFiat(result);
|
||||
if (a) {
|
||||
$scope.alternativeAmount = txFormatService.formatAmount(a * unitToSatoshi, true);
|
||||
$scope.allowSend = lodash.isNumber(a) && a > 0
|
||||
&& (!$scope.shapeshiftOrderId
|
||||
|| (a >= $scope.minShapeshiftAmount && a <= $scope.maxShapeshiftAmount));
|
||||
var amountInSatoshis = a * unitToSatoshi;
|
||||
vm.fundsAreInsufficient = !!vm.fromWalletId
|
||||
&& availableSatoshis !== null
|
||||
&& availableSatoshis < amountInSatoshis;
|
||||
|
||||
vm.alternativeAmount = txFormatService.formatAmount(amountInSatoshis, true);
|
||||
vm.allowSend = lodash.isNumber(a)
|
||||
&& a > 0
|
||||
&& (!vm.shapeshiftOrderId
|
||||
|| (a >= vm.minShapeshiftAmount && a <= vm.maxShapeshiftAmount))
|
||||
&& !vm.fundsAreInsufficient;
|
||||
} else {
|
||||
if (result) {
|
||||
$scope.alternativeAmount = 'N/A';
|
||||
vm.alternativeAmount = 'N/A';
|
||||
} else {
|
||||
$scope.alternativeAmount = null;
|
||||
vm.alternativeAmount = null;
|
||||
}
|
||||
$scope.allowSend = false;
|
||||
vm.fundsAreInsufficient = false;
|
||||
vm.allowSend = false;
|
||||
}
|
||||
} else {
|
||||
$scope.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
|
||||
$scope.allowSend = lodash.isNumber(result) && result > 0
|
||||
&& (!$scope.shapeshiftOrderId
|
||||
|| (result >= $scope.minShapeshiftAmount && result <= $scope.maxShapeshiftAmount));
|
||||
vm.fundsAreInsufficient = vm.fromWalletId
|
||||
&& availableSatoshis !== null
|
||||
&& availableSatoshis < result * unitToSatoshi;
|
||||
|
||||
vm.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
|
||||
vm.allowSend = lodash.isNumber(result)
|
||||
&& result > 0
|
||||
&& (!vm.shapeshiftOrderId
|
||||
|| (result >= vm.minShapeshiftAmount && result <= vm.maxShapeshiftAmount))
|
||||
&& !vm.fundsAreInsufficient;
|
||||
}
|
||||
|
||||
} else {
|
||||
vm.fundsAreInsufficient = false;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -444,24 +478,24 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
return result.replace('x', '*');
|
||||
};
|
||||
|
||||
$scope.finish = function() {
|
||||
function finish() {
|
||||
|
||||
function finish() {
|
||||
var unit = availableUnits[unitIndex];
|
||||
var _amount = evaluate(format($scope.amountModel.amount));
|
||||
var _amount = evaluate(format(vm.amount));
|
||||
var coin = unit.id;
|
||||
if (unit.isFiat) {
|
||||
coin = availableUnits[altUnitIndex].id;
|
||||
}
|
||||
|
||||
if ($scope.nextStep) {
|
||||
$state.transitionTo($scope.nextStep, {
|
||||
if (nextStep) {
|
||||
$state.transitionTo(nextStep, {
|
||||
id: _id,
|
||||
amount: $scope.useSendMax ? null : _amount,
|
||||
amount: useSendMax ? null : _amount,
|
||||
currency: unit.id.toUpperCase(),
|
||||
coin: coin,
|
||||
useSendMax: $scope.useSendMax,
|
||||
fromWalletId: $scope.fromWalletId
|
||||
useSendMax: useSendMax,
|
||||
fromWalletId: vm.fromWalletId
|
||||
});
|
||||
} else {
|
||||
var amount = _amount;
|
||||
|
|
@ -473,52 +507,52 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
}
|
||||
|
||||
var confirmData = {
|
||||
recipientType: $scope.recipientType,
|
||||
recipientType: recipientType,
|
||||
toAmount: amount,
|
||||
toAddress: $scope.toAddress,
|
||||
displayAddress: $scope.displayAddress || $scope.toAddress,
|
||||
toName: $scope.toName,
|
||||
toEmail: $scope.toEmail,
|
||||
toColor: $scope.toColor,
|
||||
toAddress: toAddress,
|
||||
displayAddress: displayAddress || toAddress,
|
||||
toName: toName,
|
||||
toEmail: toEmail,
|
||||
toColor: toColor,
|
||||
coin: coin,
|
||||
useSendMax: $scope.useSendMax,
|
||||
fromWalletId: $scope.fromWalletId
|
||||
useSendMax: useSendMax,
|
||||
fromWalletId: vm.fromWalletId
|
||||
};
|
||||
|
||||
if ($scope.shapeshiftOrderId) {
|
||||
if (vm.shapeshiftOrderId) {
|
||||
var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/';
|
||||
shapeshiftOrderUrl += $scope.shapeshiftOrderId;
|
||||
shapeshiftOrderUrl += vm.shapeshiftOrderId;
|
||||
confirmData.description = shapeshiftOrderUrl;
|
||||
confirmData.fromWalletId = $scope.fromWalletId;
|
||||
confirmData.fromWalletId = vm.fromWalletId;
|
||||
|
||||
if (confirmData.useSendMax) {
|
||||
var wallet = lodash.find(profileService.getWallets({ coin: coin }),
|
||||
function(w) {
|
||||
return w.id == $scope.fromWalletId;
|
||||
return w.id == vm.fromWalletId;
|
||||
});
|
||||
|
||||
var balance = parseFloat(wallet.cachedBalance.substring(0, wallet.cachedBalance.length-4));
|
||||
if (balance < $scope.minShapeshiftAmount * 1.04) {
|
||||
if (balance < vm.minShapeshiftAmount * 1.04) {
|
||||
confirmData.useSendMax = false;
|
||||
confirmData.toAmount = $scope.minShapeshiftAmount * unitToSatoshi;
|
||||
} else if (balance > $scope.maxShapeshiftAmount) {
|
||||
confirmData.toAmount = vm.minShapeshiftAmount * unitToSatoshi;
|
||||
} else if (balance > vm.maxShapeshiftAmount) {
|
||||
confirmData.useSendMax = false;
|
||||
confirmData.toAmount = $scope.maxShapeshiftAmount * unitToSatoshi * 0.99;
|
||||
confirmData.toAmount = vm.maxShapeshiftAmount * unitToSatoshi * 0.99;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$state.transitionTo('tabs.send.confirm', confirmData);
|
||||
}
|
||||
$scope.useSendMax = null;
|
||||
useSendMax = null;
|
||||
}
|
||||
|
||||
if ($scope.showWarningMessage) {
|
||||
var u = $scope.unit == 'BCH' || $scope.unit == 'BTC' ? $scope.unit : $scope.alternativeUnit;
|
||||
if (showWarningMessage) {
|
||||
var u = vm.unit == 'BCH' || vm.unit == 'BTC' ? vm.unit : vm.alternativeUnit;
|
||||
var message = 'Are you sure you want to send ' + u.toUpperCase() + '?';
|
||||
popupService.showConfirm(message, '', 'Yes', 'No', function(res) {
|
||||
if (!res) {
|
||||
$scope.useSendMax = null;
|
||||
useSendMax = null;
|
||||
return;
|
||||
};
|
||||
finish();
|
||||
|
|
@ -562,10 +596,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
}];
|
||||
rateService.whenAvailable(function() {
|
||||
|
||||
$scope.listComplete = false;
|
||||
vm.listComplete = false;
|
||||
|
||||
var idx = lodash.indexBy(unusedCurrencyList, 'isoCode');
|
||||
var idx2 = lodash.indexBy($scope.lastUsedAltCurrencyList, 'isoCode');
|
||||
var idx2 = lodash.indexBy(lastUsedAltCurrencyList, 'isoCode');
|
||||
var idx3 = lodash.indexBy(popularCurrencyList, 'isoCode');
|
||||
var alternatives = rateService.listAlternatives(true);
|
||||
|
||||
|
|
@ -578,8 +612,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
}
|
||||
});
|
||||
|
||||
$scope.altCurrencyList = completeAlternativeList.slice(0, 10);
|
||||
$scope.lastUsedPopularList = lodash.unique(lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
|
||||
vm.altCurrencyList = completeAlternativeList.slice(0, 10);
|
||||
vm.lastUsedPopularList = lodash.unique(lodash.union(lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
|
||||
|
||||
rateService.updateRates();
|
||||
|
||||
$timeout(function() {
|
||||
$scope.$apply();
|
||||
|
|
@ -587,19 +623,19 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
});
|
||||
}
|
||||
|
||||
$scope.loadMore = function() {
|
||||
function loadMore() {
|
||||
$timeout(function() {
|
||||
$scope.altCurrencyList = completeAlternativeList.slice(0, next);
|
||||
vm.altCurrencyList = completeAlternativeList.slice(0, next);
|
||||
next += 10;
|
||||
$scope.listComplete = $scope.altCurrencyList.length >= completeAlternativeList.length;
|
||||
vm.listComplete = vm.altCurrencyList.length >= completeAlternativeList.length;
|
||||
$scope.$broadcast('scroll.infiniteScrollComplete');
|
||||
}, 100);
|
||||
};
|
||||
|
||||
$scope.findCurrency = function(search) {
|
||||
function findCurrency(search) {
|
||||
if (!search) initCurrencies();
|
||||
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
|
||||
$scope.altCurrencyList = lodash.filter(list, function(item) {
|
||||
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union(lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
|
||||
vm.altCurrencyList = lodash.filter(list, function(item) {
|
||||
var val = item.name
|
||||
var val2 = item.isoCode;
|
||||
return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase());
|
||||
|
|
@ -609,7 +645,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
});
|
||||
};
|
||||
|
||||
$scope.save = function(newAltCurrency) {
|
||||
function save(newAltCurrency) {
|
||||
var opts = {
|
||||
wallet: {
|
||||
settings: {
|
||||
|
|
@ -629,8 +665,65 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
availableUnits[altUnitIndex].name = newAltCurrency.isoCode;
|
||||
availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode;
|
||||
fiatCode = newAltCurrency.isoCode;
|
||||
updateAvailableFundsStringIfNeeded();
|
||||
updateUnitUI();
|
||||
$scope.close();
|
||||
close();
|
||||
});
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
function updateAvailableFundsStringIfNeeded() {
|
||||
if (vm.fromWalletId && availableSatoshis !== null) {
|
||||
availableFundsInFiat = '';
|
||||
vm.availableFunds = availableFundsInCrypto;
|
||||
var coin = availableUnits[altUnitIndex].isFiat ? availableUnits[unitIndex].id : availableUnits[altUnitIndex].id;
|
||||
txFormatService.formatAlternativeStr(coin, availableSatoshis, function formatCallback(formatted){
|
||||
if (formatted) {
|
||||
availableFundsInFiat = formatted;
|
||||
|
||||
$scope.$apply(function() {
|
||||
if (availableUnits[unitIndex].isFiat) {
|
||||
vm.availableFunds = availableFundsInFiat;
|
||||
} else {
|
||||
vm.availableFunds = availableFundsInCrypto;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function updateAvailableFundsFromWallet(wallet) {
|
||||
if (wallet.status && wallet.status.isValid) {
|
||||
availableFundsInCrypto = wallet.status.spendableBalanceStr;
|
||||
availableSatoshis = wallet.status.spendableAmount;
|
||||
if (wallet.status.alternativeBalanceAvailable) {
|
||||
availableFundsInFiat = wallet.status.spendableBalanceAlternative + ' ' + wallet.status.alternativeIsoCode;
|
||||
} else {
|
||||
availableFundsInFiat = '';
|
||||
}
|
||||
|
||||
} else if (wallet.cachedStatus && wallet.status.isValid) {
|
||||
|
||||
if (wallet.cachedStatus.alternativeBalanceAvailable) {
|
||||
availableFundsInFiat = wallet.cachedStatus.spendableBalanceAlternative + ' ' + wallet.cachedStatus.alternativeIsoCode;
|
||||
} else {
|
||||
availableFundsInFiat = '';
|
||||
}
|
||||
availableFundsInCrypto = wallet.cachedStatus.spendableBalanceStr;
|
||||
availableSatoshis = wallet.cachedStatus.spendableAmount;
|
||||
|
||||
} else {
|
||||
|
||||
availableFundsInFiat = '';
|
||||
availableFundsInCrypto = '';
|
||||
availableSatoshis = null;
|
||||
}
|
||||
|
||||
if (availableUnits[unitIndex].isFiat) {
|
||||
vm.availableFunds = availableFundsInFiat || availableFundsInCrypto;
|
||||
} else {
|
||||
vm.availableFunds = availableFundsInCrypto;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
101
src/js/controllers/amount.spec.js
Normal file
101
src/js/controllers/amount.spec.js
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
describe('amountController', function(){
|
||||
var configCache,
|
||||
configService,
|
||||
$controller,
|
||||
$ionicHistory,
|
||||
$rootScope,
|
||||
platformInfo,
|
||||
profileService,
|
||||
rateService,
|
||||
$stateParams;
|
||||
|
||||
|
||||
|
||||
beforeEach(function(){
|
||||
module('ngLodash');
|
||||
module('copayApp.controllers');
|
||||
|
||||
configCache = {
|
||||
wallet: {
|
||||
settings: {
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
configService = jasmine.createSpyObj(['getDefaults','getSync']);
|
||||
configService.getDefaults.and.returnValue({
|
||||
bitcoinCashAlias: 'bch',
|
||||
bitcoinAlias: 'btc'
|
||||
});
|
||||
configService.getSync.and.returnValue(configCache);
|
||||
|
||||
$ionicHistory = jasmine.createSpyObj(['backView']);
|
||||
|
||||
platformInfo = {
|
||||
isChromeApp: false,
|
||||
isAndroid: false,
|
||||
isIos: true
|
||||
};
|
||||
|
||||
profileService = jasmine.createSpyObj(['getWallets']);
|
||||
|
||||
rateService = jasmine.createSpyObj(['fromFiat', 'whenAvailable']);
|
||||
|
||||
$stateParams = {};
|
||||
|
||||
inject(function(_$controller_, _$rootScope_){
|
||||
// The injector unwraps the underscores (_) from around the parameter names when matching
|
||||
$controller = _$controller_;
|
||||
$rootScope = _$rootScope_;
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
it('receives fromWalletId and toAddress.', function() {
|
||||
|
||||
var backView = {
|
||||
stateName: 'ignoreme'
|
||||
};
|
||||
$ionicHistory.backView.and.returnValue(backView);
|
||||
profileService.getWallets.and.returnValue([{}]);
|
||||
rateService.fromFiat.and.returnValue(12); // satoshis or coins?
|
||||
|
||||
var $scope = $rootScope.$new();
|
||||
|
||||
|
||||
var amountController = $controller('amountController', {
|
||||
configService: configService,
|
||||
gettextCatalog: {},
|
||||
$ionicHistory: $ionicHistory,
|
||||
$ionicModal: {},
|
||||
$ionicScrollDelegate: {},
|
||||
nodeWebkitService: {},
|
||||
ongoingProcess: {},
|
||||
platformInfo: platformInfo,
|
||||
profileService: profileService,
|
||||
popupService: {},
|
||||
rateService: rateService,
|
||||
$scope: $scope,
|
||||
$state: {},
|
||||
$stateParams: $stateParams,
|
||||
txFormatService: {},
|
||||
walletService: {}
|
||||
});
|
||||
|
||||
var data = {
|
||||
stateParams: {
|
||||
fromWalletId: 'fd56c1e7-e3ac-4fd9-8afc-27b9c1b3718b',
|
||||
toAddress: 'qrup46avn8t466xxwlzs4qelht7cnwvesv2e29wf7s'
|
||||
}
|
||||
};
|
||||
$scope.$emit('$ionicView.beforeEnter', data);
|
||||
|
||||
expect($scope.fromWalletId).toBe('fd56c1e7-e3ac-4fd9-8afc-27b9c1b3718b');
|
||||
expect($scope.toAddress).toBe('qrup46avn8t466xxwlzs4qelht7cnwvesv2e29wf7s');
|
||||
});
|
||||
|
||||
});
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService) {
|
||||
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, ionicToast, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService, clipboardService) {
|
||||
|
||||
var countDown = null;
|
||||
var FEE_TOO_HIGH_LIMIT_PER = 15;
|
||||
|
||||
var tx = {};
|
||||
var lastTxId = "";
|
||||
|
||||
// Config Related values
|
||||
var config = configService.getSync();
|
||||
|
|
@ -31,6 +32,16 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
|||
}, 10);
|
||||
}
|
||||
|
||||
$scope.shareTransaction = function() {
|
||||
var explorerTxUrl = 'https://explorer.bitcoin.com/'+tx.coin+'/tx/'+lastTxId;
|
||||
if (platformInfo.isCordova) {
|
||||
var text = 'Take a look at this Bitcoin transaction here: '+explorerTxUrl;
|
||||
window.plugins.socialsharing.share(text, null, null, null);
|
||||
} else {
|
||||
ionicToast.show(gettextCatalog.getString('Copied to clipboard'), 'bottom', false, 3000);
|
||||
clipboardService.copyToClipboard(explorerTxUrl);
|
||||
}
|
||||
};
|
||||
|
||||
$scope.showWalletSelector = function() {
|
||||
$scope.walletSelector = true;
|
||||
|
|
@ -612,6 +623,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
|||
txConfirmNotification.subscribe(wallet, {
|
||||
txid: txp.txid
|
||||
});
|
||||
lastTxId = txp.txid;
|
||||
}
|
||||
}, onSendStatusChange);
|
||||
};
|
||||
|
|
@ -643,9 +655,9 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
|||
soundService.play('misc/payment_sent.mp3');
|
||||
}
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
||||
"coin": $scope.wallet.coin,
|
||||
|
|
|
|||
|
|
@ -64,6 +64,14 @@ angular.module('copayApp.controllers').controller('customAmountController', func
|
|||
var currency = parsedAmount.currency;
|
||||
$scope.amountUnitStr = parsedAmount.amountUnitStr;
|
||||
|
||||
configService.whenAvailable(function (config) {
|
||||
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
|
||||
|
||||
$timeout(function () {
|
||||
$scope.$apply();
|
||||
});
|
||||
});
|
||||
|
||||
if (currency != 'BTC' && currency != 'BCH') {
|
||||
// Convert to BTC or BCH
|
||||
var config = configService.getSync().wallet.settings;
|
||||
|
|
|
|||
|
|
@ -76,9 +76,9 @@ angular.module('copayApp.controllers').controller('preferencesNotificationsContr
|
|||
|
||||
emailService.updateEmail(opts);
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{
|
||||
"toggle": $scope.emailNotifications.value
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
|||
cb();
|
||||
}
|
||||
}
|
||||
$scope.walletsWithFunds = profileService.getWallets({hasFunds: true});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -145,9 +145,9 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
|||
}
|
||||
$scope.paymentReceivedCoin = $scope.wallet.coin;
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
||||
"coin": $scope.wallet.coin,
|
||||
|
|
@ -233,10 +233,14 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
|||
|
||||
if (!$scope.wallets[0]) return;
|
||||
|
||||
// select first wallet if no wallet selected previously
|
||||
var selectedWallet = checkSelectedWallet($scope.wallet, $scope.wallets);
|
||||
var selectedWallet = null;
|
||||
if (data.stateParams.walletId) { // from walletDetails
|
||||
selectedWallet = checkSelectedWallet(profileService.getWallet(data.stateParams.walletId), $scope.wallets);
|
||||
} else {
|
||||
// select first wallet if no wallet selected previously
|
||||
selectedWallet = checkSelectedWallet($scope.wallet, $scope.wallets);
|
||||
}
|
||||
$scope.onWalletSelect(selectedWallet);
|
||||
|
||||
$scope.showShareButton = platformInfo.isCordova ? (platformInfo.isIOS ? 'iOS' : 'Android') : null;
|
||||
|
||||
listeners = [
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
|
|||
isoCode: config.wallet.settings.alternativeIsoCode
|
||||
};
|
||||
|
||||
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
|
||||
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay === 'crypto' ? gettextCatalog.getString('Cryptocurrency') : gettextCatalog.getString('Fiat');
|
||||
|
||||
// TODO move this to a generic service
|
||||
bitpayAccountService.getAccounts(function(err, data) {
|
||||
|
|
|
|||
|
|
@ -12,9 +12,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
$scope.isAndroid = platformInfo.isAndroid;
|
||||
$scope.isIOS = platformInfo.isIOS;
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
|
||||
window.BitAnalytics.LogEventHandlers.postEvent(log);
|
||||
|
|
@ -342,9 +342,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
top = TOP_BALANCE_BUTTON;
|
||||
}
|
||||
|
||||
var amountTop = ((amountScale - 0.7) / 0.7) * top;
|
||||
if (amountTop < -10) {
|
||||
amountTop = -10;
|
||||
var amountTop = ((amountScale - 0.80) / 0.80) * top;
|
||||
if (amountTop < -2) {
|
||||
amountTop = -2;
|
||||
}
|
||||
if (amountTop > top) {
|
||||
amountTop = top;
|
||||
|
|
@ -353,6 +353,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
var t = amountTop;
|
||||
|
||||
$scope.altAmountOpacity = (amountHeight - 100) / 80;
|
||||
$scope.buttonsOpacity = (amountHeight - 140) / 70;
|
||||
$window.requestAnimationFrame(function() {
|
||||
$scope.amountHeight = amountHeight + 'px';
|
||||
$scope.contentMargin = contentMargin + 'px';
|
||||
|
|
@ -469,4 +470,30 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
|||
function rgbToHex(r, g, b) {
|
||||
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
|
||||
}
|
||||
$scope.goToSend = function() {
|
||||
$state.go('tabs.home', {
|
||||
walletId: $scope.wallet.id
|
||||
}).then(function () {
|
||||
$ionicHistory.clearHistory();
|
||||
$state.go('tabs.send');
|
||||
});
|
||||
};
|
||||
$scope.goToReceive = function() {
|
||||
$state.go('tabs.home', {
|
||||
walletId: $scope.wallet.id
|
||||
}).then(function () {
|
||||
$ionicHistory.clearHistory();
|
||||
$state.go('tabs.receive', {
|
||||
walletId: $scope.wallet.id
|
||||
});
|
||||
});
|
||||
};
|
||||
$scope.goToBuy = function() {
|
||||
$state.go('tabs.home', {
|
||||
walletId: $scope.wallet.id
|
||||
}).then(function () {
|
||||
$ionicHistory.clearHistory();
|
||||
$state.go('tabs.buyandsell');
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
|||
85
src/js/directives/amount.js
Normal file
85
src/js/directives/amount.js
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
'use strict';
|
||||
|
||||
/**
|
||||
* @desc amount directive that can be used to display formatted financial values
|
||||
* size-equal attribute is optional, defaults to false.
|
||||
* @example fee = {
|
||||
* value: 12.49382901,
|
||||
* currency: 'BCH'
|
||||
* }
|
||||
* @example <amount value="fee.value" currency="fee.currency"></amount>
|
||||
* @example <amount value="fee.value" currency="fee.currency" size-equal="true"></amount>
|
||||
*/
|
||||
angular.module('bitcoincom.directives')
|
||||
.directive('amount', [
|
||||
'$timeout',
|
||||
function($timeout) {
|
||||
return {
|
||||
restrict: 'E',
|
||||
scope: {
|
||||
value: '=',
|
||||
currency: '=',
|
||||
sizeEqual: '='
|
||||
},
|
||||
templateUrl: 'views/includes/amount.html',
|
||||
controller: ['$scope', function($scope) {
|
||||
$scope.displaySizeEqual = typeof $scope.sizeEqual == 'undefined' ? false : true;
|
||||
|
||||
var decimalPlaces = {
|
||||
'0': ['BIF', 'CLP', 'DJF', 'GNF', 'ILS', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF'],
|
||||
'3': ['BHD', 'IQD', 'JOD', 'KWD', 'OMR', 'TND'],
|
||||
'8': ['BCH', 'BTC']
|
||||
};
|
||||
|
||||
var numberWithCommas = function(x) {
|
||||
return parseFloat(x).toLocaleString();
|
||||
};
|
||||
|
||||
var buildAmount = function(start, middle, end) {
|
||||
$scope.start = start;
|
||||
$scope.middle = middle;
|
||||
$scope.end = end;
|
||||
};
|
||||
|
||||
var getDecimalPlaces = function(currency) {
|
||||
if (decimalPlaces['0'].indexOf($scope.currency.toUpperCase()) > -1) return '0';
|
||||
if (decimalPlaces['3'].indexOf($scope.currency.toUpperCase()) > -1) return '3';
|
||||
if (decimalPlaces['8'].indexOf($scope.currency.toUpperCase()) > -1) return '8';
|
||||
return '2';
|
||||
};
|
||||
|
||||
switch (getDecimalPlaces($scope.currency)) {
|
||||
case '0':
|
||||
var valueFormatted = numberWithCommas(Math.round(parseFloat($scope.value)));
|
||||
buildAmount(valueFormatted, '', '');
|
||||
break;
|
||||
|
||||
case '2':
|
||||
var valueProcessing = parseFloat(parseFloat($scope.value).toFixed(2));
|
||||
var valueFormatted = numberWithCommas(valueProcessing);
|
||||
buildAmount(valueFormatted, '', '');
|
||||
break;
|
||||
|
||||
case '3':
|
||||
var valueProcessing = parseFloat(parseFloat($scope.value).toFixed(3));
|
||||
var valueFormatted = numberWithCommas(valueProcessing);
|
||||
buildAmount(valueFormatted, '', '');
|
||||
break;
|
||||
|
||||
case '8':
|
||||
var valueFormatted = parseFloat($scope.value).toFixed(8);
|
||||
if (parseFloat($scope.value) == 0) {
|
||||
buildAmount('0', '', '');
|
||||
} else {
|
||||
buildAmount(valueFormatted, '', '');
|
||||
var start = numberWithCommas(valueFormatted.slice(0, -5));
|
||||
var middle = valueFormatted.slice(-5, -2);
|
||||
var end = valueFormatted.substr(valueFormatted.length - 2);
|
||||
buildAmount(start, middle, end);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}]
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
|
@ -9,12 +9,12 @@ angular.module('copayApp.directives')
|
|||
scope: {
|
||||
isShown: '=slideSuccessShow',
|
||||
onConfirm: '&slideSuccessOnConfirm',
|
||||
hideOnConfirm: '=slideSuccessHideOnConfirm'
|
||||
hideOnConfirm: '=slideSuccessHideOnConfirm',
|
||||
onShare: '=slideSuccessOnShare',
|
||||
},
|
||||
link: function(scope, element, attrs) {
|
||||
|
||||
scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
|
||||
|
||||
scope.isCordova = platformInfo.isCordova;
|
||||
scope.hasShareFunction = typeof scope.onShare === 'function';
|
||||
var elm = element[0];
|
||||
elm.style.display = 'none';
|
||||
scope.$watch('isShown', function() {
|
||||
|
|
@ -32,6 +32,9 @@ angular.module('copayApp.directives')
|
|||
elm.style.display = 'none';
|
||||
}
|
||||
};
|
||||
scope.onShareButtonClick = function() {
|
||||
scope.onShare();
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
}
|
||||
})
|
||||
.state('tabs.receive', {
|
||||
url: '/receive',
|
||||
url: '/receive/:walletId',
|
||||
views: {
|
||||
'tab-receive': {
|
||||
controller: 'tabReceiveController',
|
||||
|
|
@ -291,6 +291,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-send@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
}
|
||||
|
|
@ -699,6 +700,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-receive@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
}
|
||||
|
|
@ -845,6 +847,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
}
|
||||
|
|
@ -910,6 +913,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
}
|
||||
|
|
@ -1029,6 +1033,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
},
|
||||
|
|
@ -1081,6 +1086,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
},
|
||||
|
|
@ -1137,6 +1143,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
views: {
|
||||
'tab-home@tabs': {
|
||||
controller: 'amountController',
|
||||
controllerAs: 'vm',
|
||||
templateUrl: 'views/amount.html'
|
||||
}
|
||||
}
|
||||
|
|
@ -1184,9 +1191,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
|||
}
|
||||
});
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
|
||||
// Send a log to test
|
||||
|
|
|
|||
|
|
@ -11,10 +11,15 @@ angular.module('copayApp.services').factory('clipboardService', function ($http,
|
|||
cordova.plugins.clipboard.copy(data);
|
||||
} else if (platformInfo.isNW) {
|
||||
nodeWebkitService.writeToClipboard(data);
|
||||
} else if (navigator && navigator.clipboard) {
|
||||
$log.debug("Use navigator clipboard.")
|
||||
navigator.clipboard.writeText(data).catch(err => {
|
||||
$log.debug("Clipboard writing is not supported in your browser..");
|
||||
});
|
||||
} else if (clipboard.supported) {
|
||||
clipboard.copyText(data);
|
||||
} else {
|
||||
// No supported
|
||||
// Not supported
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -427,9 +427,9 @@ angular.module('copayApp.services')
|
|||
}, function(err, secret) {
|
||||
if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb);
|
||||
|
||||
var channel = "firebase";
|
||||
if (platformInfo.isNW) {
|
||||
channel = "ga";
|
||||
var channel = "ga";
|
||||
if (platformInfo.isCordova) {
|
||||
channel = "firebase";
|
||||
}
|
||||
var log = new window.BitAnalytics.LogEvent("wallet_created", [{
|
||||
"coin": opts.coin
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
describe('secureStorageService in browser', function(){
|
||||
xdescribe('secureStorageService in browser', function(){
|
||||
var localStorage,
|
||||
sss;
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ describe('secureStorageService in browser', function(){
|
|||
});
|
||||
|
||||
|
||||
describe('secureStorageService on desktop', function(){
|
||||
xdescribe('secureStorageService on desktop', function(){
|
||||
var desktopSss,
|
||||
sss;
|
||||
|
||||
|
|
@ -202,7 +202,7 @@ describe('secureStorageService on desktop', function(){
|
|||
|
||||
});
|
||||
|
||||
describe('secureStorageService on mobile', function(){
|
||||
xdescribe('secureStorageService on mobile', function(){
|
||||
var mobileSss,
|
||||
sss;
|
||||
|
||||
|
|
|
|||
|
|
@ -414,7 +414,7 @@ xdescribe('storageService on desktop', function(){
|
|||
|
||||
});
|
||||
|
||||
describe('storageService on desktop using local storage', function(){
|
||||
xdescribe('storageService on desktop using local storage', function(){
|
||||
var appConfig,
|
||||
localStorageServiceMock,
|
||||
log,
|
||||
|
|
@ -614,7 +614,7 @@ describe('storageService on desktop using local storage', function(){
|
|||
|
||||
});
|
||||
|
||||
describe('storageService on mobile', function(){
|
||||
xdescribe('storageService on mobile', function(){
|
||||
var appConfig,
|
||||
expectedOldProfileSavedToSecure,
|
||||
expectedOldProfileMergedWithSecure,
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter,
|
|||
var alternativeIsoCode = config.alternativeIsoCode;
|
||||
|
||||
// If fiat currency
|
||||
if (currency != 'BCH' && currency != 'BTC' && currency != 'sat') {
|
||||
if (currency && currency.toUpperCase() != 'BCH' && currency.toUpperCase() != 'BTC' && currency != 'sat') {
|
||||
amountUnitStr = $filter('formatFiatAmount')(amount) + ' ' + currency;
|
||||
amountSat = rateService.fromFiat(amount, currency, coin).toFixed(0);
|
||||
} else if (currency == 'sat') {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue