165 lines
5.2 KiB
JavaScript
165 lines
5.2 KiB
JavaScript
'use strict';
|
|
angular.module('copayApp.directives')
|
|
.directive('validAddress', ['$rootScope', 'bitcore',
|
|
function($rootScope, bitcore) {
|
|
return {
|
|
require: 'ngModel',
|
|
link: function(scope, elem, attrs, ctrl) {
|
|
var URI = bitcore.URI;
|
|
var Address = bitcore.Address
|
|
var validator = function(value) {
|
|
|
|
// Regular url
|
|
if (/^https?:\/\//.test(value)) {
|
|
ctrl.$setValidity('validAddress', true);
|
|
return value;
|
|
}
|
|
|
|
// Bip21 uri
|
|
if (/^bitcoin:/.test(value)) {
|
|
var uri, isAddressValidLivenet, isAddressValidTestnet;
|
|
var isUriValid = URI.isValid(value);
|
|
if (isUriValid) {
|
|
uri = new URI(value);
|
|
isAddressValidLivenet = Address.isValid(uri.address.toString(), 'livenet')
|
|
isAddressValidTestnet = Address.isValid(uri.address.toString(), 'testnet')
|
|
}
|
|
ctrl.$setValidity('validAddress', isUriValid && (isAddressValidLivenet || isAddressValidTestnet));
|
|
return value;
|
|
}
|
|
|
|
if (typeof value == 'undefined') {
|
|
ctrl.$pristine = true;
|
|
return;
|
|
}
|
|
|
|
// Regular Address
|
|
var regularAddressLivenet = Address.isValid(value, 'livenet');
|
|
var regularAddressTestnet = Address.isValid(value, 'testnet');
|
|
ctrl.$setValidity('validAddress', (regularAddressLivenet || regularAddressTestnet));
|
|
return value;
|
|
};
|
|
|
|
|
|
ctrl.$parsers.unshift(validator);
|
|
ctrl.$formatters.unshift(validator);
|
|
}
|
|
};
|
|
}
|
|
])
|
|
.directive('validAmount', ['configService',
|
|
function(configService) {
|
|
|
|
return {
|
|
require: 'ngModel',
|
|
link: function(scope, element, attrs, ctrl) {
|
|
var val = function(value) {
|
|
var settings = configService.getSync().wallet.settings;
|
|
var vNum = Number((value * settings.unitToSatoshi).toFixed(0));
|
|
if (typeof value == 'undefined' || value == 0) {
|
|
ctrl.$pristine = true;
|
|
}
|
|
|
|
|
|
|
|
if (typeof vNum == "number" && vNum > 0) {
|
|
if (vNum > Number.MAX_SAFE_INTEGER) {
|
|
ctrl.$setValidity('validAmount', false);
|
|
} else {
|
|
var decimals = Number(settings.unitDecimals);
|
|
var sep_index = ('' + value).indexOf('.');
|
|
var str_value = ('' + value).substring(sep_index + 1);
|
|
if (sep_index >= 0 && str_value.length > decimals) {
|
|
ctrl.$setValidity('validAmount', false);
|
|
return;
|
|
} else {
|
|
ctrl.$setValidity('validAmount', true);
|
|
}
|
|
}
|
|
} else {
|
|
ctrl.$setValidity('validAmount', false);
|
|
}
|
|
return value;
|
|
}
|
|
ctrl.$parsers.unshift(val);
|
|
ctrl.$formatters.unshift(val);
|
|
}
|
|
};
|
|
}
|
|
])
|
|
.directive('walletSecret', function(bitcore) {
|
|
return {
|
|
require: 'ngModel',
|
|
link: function(scope, elem, attrs, ctrl) {
|
|
var validator = function(value) {
|
|
if (value.length > 0) {
|
|
var m = value.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/);
|
|
ctrl.$setValidity('walletSecret', m ? true : false);
|
|
}
|
|
return value;
|
|
};
|
|
|
|
ctrl.$parsers.unshift(validator);
|
|
}
|
|
};
|
|
})
|
|
.directive('ngFileSelect', function() {
|
|
return {
|
|
link: function($scope, el) {
|
|
el.bind('change', function(e) {
|
|
$scope.formData.file = (e.srcElement || e.target).files[0];
|
|
$scope.getFile();
|
|
});
|
|
}
|
|
}
|
|
})
|
|
.directive('contact', ['addressbookService', 'lodash',
|
|
function(addressbookService, lodash) {
|
|
return {
|
|
restrict: 'E',
|
|
link: function(scope, element, attrs) {
|
|
var addr = attrs.address;
|
|
addressbookService.get(addr, function(err, ab) {
|
|
if (ab) {
|
|
var name = lodash.isObject(ab) ? ab.name : ab;
|
|
element.append(name);
|
|
} else {
|
|
element.append(addr);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
}
|
|
])
|
|
.directive('ignoreMouseWheel', function($rootScope, $timeout) {
|
|
return {
|
|
restrict: 'A',
|
|
link: function(scope, element, attrs) {
|
|
element.bind('mousewheel', function(event) {
|
|
element[0].blur();
|
|
$timeout(function() {
|
|
element[0].focus();
|
|
}, 1);
|
|
});
|
|
}
|
|
}
|
|
})
|
|
.directive('wallets', function($log, profileService, walletService, lodash) {
|
|
return {
|
|
restrict: 'E',
|
|
templateUrl: 'views/includes/wallets.html',
|
|
scope: {
|
|
wallets: '=wallets'
|
|
},
|
|
link: function(scope, element, attrs) {
|
|
scope.$on("$ionicSlides.sliderInitialized", function(event, data) {
|
|
scope.slider = data.slider;
|
|
scope.$emit('Wallet/Changed', scope.wallets ? scope.wallets[0] : null);
|
|
});
|
|
|
|
scope.$on("$ionicSlides.slideChangeEnd", function(event, data) {
|
|
scope.$emit('Wallet/Changed', scope.wallets ? scope.wallets[data.slider.activeIndex] : null);
|
|
});
|
|
}
|
|
}
|
|
});
|