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
|
|
@ -163,7 +163,7 @@ module.exports = function(grunt) {
|
||||||
},
|
},
|
||||||
bitanalytics: {
|
bitanalytics: {
|
||||||
src: [
|
src: [
|
||||||
'bitanalytics/bitanalytics-0.1.0.js'
|
'bitanalytics/bitanalytics.js'
|
||||||
],
|
],
|
||||||
dest: 'www/lib/bitanalytics.js'
|
dest: 'www/lib/bitanalytics.js'
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
<plugin name="cordova-plugin-queries-schemes" spec="~0.1.5" />
|
<plugin name="cordova-plugin-queries-schemes" spec="~0.1.5" />
|
||||||
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase.git" />
|
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase.git" />
|
||||||
<plugin name="cordova-plugin-wkwebview-inputfocusfix" spec="https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix.git" />
|
<plugin name="cordova-plugin-wkwebview-inputfocusfix" spec="https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix.git" />
|
||||||
<plugin name="cordova-plugin-media" spec="~5.0.2">
|
<plugin name="cordova-plugin-media-fork" spec="~5.0.3">
|
||||||
<variable name="KEEP_AVAUDIOSESSION_ALWAYS_ACTIVE" value="NO" />
|
<variable name="KEEP_AVAUDIOSESSION_ALWAYS_ACTIVE" value="NO" />
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- Supported Platforms -->
|
<!-- Supported Platforms -->
|
||||||
|
|
|
||||||
|
|
@ -6276,7 +6276,7 @@ var ClickAction = /** @class */ (function (_super) {
|
||||||
}(action_1.default));
|
}(action_1.default));
|
||||||
exports.default = ClickAction;
|
exports.default = ClickAction;
|
||||||
|
|
||||||
},{"../action":4,"../log-event":15,"../log-event-handlers":14}],6:[function(require,module,exports){
|
},{"../action":4,"../log-event":16,"../log-event-handlers":15}],6:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
|
@ -6315,7 +6315,7 @@ var BitAnalytics = /** @class */ (function () {
|
||||||
exports.default = BitAnalytics;
|
exports.default = BitAnalytics;
|
||||||
BitAnalytics.main();
|
BitAnalytics.main();
|
||||||
|
|
||||||
},{"./action-factory":2,"./action-handlers":3,"./channels/adjust-channel":9,"./channels/mixpanel-channel":12,"./log-event":15,"./log-event-handlers":14}],7:[function(require,module,exports){
|
},{"./action-factory":2,"./action-handlers":3,"./channels/adjust-channel":9,"./channels/mixpanel-channel":12,"./log-event":16,"./log-event-handlers":15}],7:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
|
@ -6560,11 +6560,10 @@ var FirebaseChannel = /** @class */ (function (_super) {
|
||||||
var keys = Object.keys(params);
|
var keys = Object.keys(params);
|
||||||
var keysLength = keys.length;
|
var keysLength = keys.length;
|
||||||
var sanitized = {};
|
var sanitized = {};
|
||||||
for (var i = 0; i < keysLength; i++) {
|
keys.map(function (key) {
|
||||||
var key = keys[i];
|
|
||||||
var cleanKey = key.replace('-', '_').replace(/[\W]+/g, '');
|
var cleanKey = key.replace('-', '_').replace(/[\W]+/g, '');
|
||||||
sanitized[cleanKey] = params[key];
|
sanitized[cleanKey] = params[key];
|
||||||
}
|
});
|
||||||
return sanitized;
|
return sanitized;
|
||||||
};
|
};
|
||||||
return FirebaseChannel;
|
return FirebaseChannel;
|
||||||
|
|
@ -6588,13 +6587,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var channel_1 = __importDefault(require("../channel"));
|
var channel_1 = __importDefault(require("../channel"));
|
||||||
|
var ga_1 = __importDefault(require("../external-libs/ga"));
|
||||||
var GoogleAnalyticsChannel = /** @class */ (function (_super) {
|
var GoogleAnalyticsChannel = /** @class */ (function (_super) {
|
||||||
__extends(GoogleAnalyticsChannel, _super);
|
__extends(GoogleAnalyticsChannel, _super);
|
||||||
function GoogleAnalyticsChannel(name, config) {
|
function GoogleAnalyticsChannel(name, config) {
|
||||||
var _this = _super.call(this, name) || this;
|
var _this = _super.call(this, name) || this;
|
||||||
_this.dataLayer = null;
|
|
||||||
_this.gaInstance = null;
|
_this.gaInstance = null;
|
||||||
_this.trackingId = '';
|
|
||||||
_this.eventLabels = ['id'];
|
_this.eventLabels = ['id'];
|
||||||
if (!config.trackingId) {
|
if (!config.trackingId) {
|
||||||
throw new Error('[BitAnalytics] Google Analytics config is missing tracking ID.');
|
throw new Error('[BitAnalytics] Google Analytics config is missing tracking ID.');
|
||||||
|
|
@ -6602,8 +6600,12 @@ var GoogleAnalyticsChannel = /** @class */ (function (_super) {
|
||||||
if (config.eventLabels) {
|
if (config.eventLabels) {
|
||||||
_this.eventLabels = config.eventLabels;
|
_this.eventLabels = config.eventLabels;
|
||||||
}
|
}
|
||||||
_this.trackingId = config.trackingId;
|
_this.gaInstance = new ga_1.default({
|
||||||
_this.setUpGa();
|
trackID: config.trackingId,
|
||||||
|
appVersion: config.appVersion,
|
||||||
|
appName: config.appName || 'App'
|
||||||
|
});
|
||||||
|
_this.isReady = true;
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
@ -6612,49 +6614,26 @@ var GoogleAnalyticsChannel = /** @class */ (function (_super) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
GoogleAnalyticsChannel.prototype.postEvent = function (name, params) {
|
GoogleAnalyticsChannel.prototype.postEvent = function (name, params) {
|
||||||
// Default Google Analytics Events
|
|
||||||
// https://developers.google.com/analytics/devguides/collection/gtagjs/events
|
|
||||||
// Useful to convert to these, or start with these?
|
|
||||||
if (this.isReady) {
|
if (this.isReady) {
|
||||||
params.event_category = name;
|
var category = name;
|
||||||
|
var action = name;
|
||||||
|
var label = name;
|
||||||
|
var value = params['value'] || '';
|
||||||
for (var _i = 0, _a = this.eventLabels; _i < _a.length; _i++) {
|
for (var _i = 0, _a = this.eventLabels; _i < _a.length; _i++) {
|
||||||
var eventLabel = _a[_i];
|
var eventLabel = _a[_i];
|
||||||
if (params[eventLabel]) {
|
if (params[eventLabel]) {
|
||||||
params.event_label = params[eventLabel];
|
label = params[eventLabel];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.gtag('event', name, params);
|
this.gaInstance.event(category, action, label, value);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Private methods
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Mimics function in the tracking snippet
|
|
||||||
*/
|
|
||||||
GoogleAnalyticsChannel.prototype.gtag = function () {
|
|
||||||
var args = [];
|
|
||||||
for (var _i = 0; _i < arguments.length; _i++) {
|
|
||||||
args[_i] = arguments[_i];
|
|
||||||
}
|
|
||||||
console.log(arguments);
|
|
||||||
window.dataLayer.push(arguments);
|
|
||||||
};
|
|
||||||
GoogleAnalyticsChannel.prototype.setUpGa = function () {
|
|
||||||
// From what GA recommends to insert into page
|
|
||||||
window.dataLayer = window.dataLayer || [];
|
|
||||||
this.gtag('js', new Date());
|
|
||||||
this.gtag('config', this.trackingId);
|
|
||||||
this.isReady = true;
|
|
||||||
};
|
|
||||||
return GoogleAnalyticsChannel;
|
return GoogleAnalyticsChannel;
|
||||||
}(channel_1.default));
|
}(channel_1.default));
|
||||||
exports.default = GoogleAnalyticsChannel;
|
exports.default = GoogleAnalyticsChannel;
|
||||||
|
|
||||||
},{"../channel":8}],12:[function(require,module,exports){
|
},{"../channel":8,"../external-libs/ga":14}],12:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
var __extends = (this && this.__extends) || (function () {
|
var __extends = (this && this.__extends) || (function () {
|
||||||
var extendStatics = Object.setPrototypeOf ||
|
var extendStatics = Object.setPrototypeOf ||
|
||||||
|
|
@ -6746,6 +6725,207 @@ exports.default = MixpanelChannel;
|
||||||
|
|
||||||
},{}],14:[function(require,module,exports){
|
},{}],14:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
|
/*
|
||||||
|
* name: nwjs-analytics -Node-Webkit Google Analytics integration
|
||||||
|
* version: 1.0.2
|
||||||
|
* github: https://github.com/Daaru00/nwjs-analytics
|
||||||
|
*/
|
||||||
|
function GA(opt) {
|
||||||
|
this.apiVersion = opt.apiVersion || '1';
|
||||||
|
this.trackID = opt.trackID || 'UA-XXXXXXXX-X';
|
||||||
|
this.clientID = opt.clientID || null;
|
||||||
|
this.userID = opt.userID || null;
|
||||||
|
this.appName = opt.appName || 'App';
|
||||||
|
this.appVersion = opt.appVersion || '1.0.0';
|
||||||
|
this.debug = opt.debug || false;
|
||||||
|
this.performanceTracking = opt.performanceTracking || true;
|
||||||
|
this.errorTracking = opt.errorTracking || true;
|
||||||
|
this.userLanguage = opt.userLanguage || "en";
|
||||||
|
this.currency = opt.currency || "EUR";
|
||||||
|
this.lastScreenName = opt.lastScreenName || '';
|
||||||
|
}
|
||||||
|
GA.prototype.sendRequest = function (data, callback) {
|
||||||
|
var ga = this;
|
||||||
|
if (!this.clientID || this.clientID == null)
|
||||||
|
this.clientID = this.generateClientID();
|
||||||
|
if (!this.userID || this.userID == null)
|
||||||
|
this.userID = this.generateClientID();
|
||||||
|
var postData = "v=" + this.apiVersion
|
||||||
|
+ "&an=" + this.appName
|
||||||
|
+ "&av=" + this.appVersion
|
||||||
|
+ "&tid=" + this.trackID
|
||||||
|
+ "&cid=" + this.clientID
|
||||||
|
+ "&sr=" + this.getScreenResolution()
|
||||||
|
+ "&vp=" + this.getViewportSize();
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
var val = data[key];
|
||||||
|
if (typeof val != "undefined")
|
||||||
|
postData += "&" + key + "=" + val;
|
||||||
|
});
|
||||||
|
var http = new XMLHttpRequest();
|
||||||
|
var url = "https://www.google-analytics.com";
|
||||||
|
if (!this.debug)
|
||||||
|
url += "/collect";
|
||||||
|
else
|
||||||
|
url += "/debug/collect";
|
||||||
|
http.open("GET", url + "?" + postData, true);
|
||||||
|
http.onreadystatechange = function () {
|
||||||
|
if (ga.debug)
|
||||||
|
console.log(http.response);
|
||||||
|
if (http.readyState == 4 && http.status == 200) {
|
||||||
|
if (callback)
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (callback)
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
http.send();
|
||||||
|
};
|
||||||
|
GA.prototype.generateClientID = function () {
|
||||||
|
var id = "";
|
||||||
|
var possibilities = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
id += possibilities.charAt(Math.floor(Math.random() * possibilities.length));
|
||||||
|
return id;
|
||||||
|
};
|
||||||
|
GA.prototype.getScreenResolution = function () {
|
||||||
|
return screen.width + "x" + screen.height;
|
||||||
|
};
|
||||||
|
GA.prototype.getColorDept = function () {
|
||||||
|
return screen.colorDepth + "-bits";
|
||||||
|
};
|
||||||
|
GA.prototype.getUserAgent = function () {
|
||||||
|
return navigator.userAgent;
|
||||||
|
};
|
||||||
|
GA.prototype.getViewportSize = function () {
|
||||||
|
return window.screen.availWidth + "x" + window.screen.availHeight;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Measurement Protocol
|
||||||
|
* [https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide]
|
||||||
|
*/
|
||||||
|
GA.prototype.screenView = function (screename) {
|
||||||
|
var data = {
|
||||||
|
't': 'screenview',
|
||||||
|
'cd': screename
|
||||||
|
};
|
||||||
|
this.sendRequest(data);
|
||||||
|
this.lastScreenName = screename;
|
||||||
|
};
|
||||||
|
GA.prototype.event = function (category, action, label, value) {
|
||||||
|
var data = {
|
||||||
|
't': 'event',
|
||||||
|
'ec': category,
|
||||||
|
'ea': action,
|
||||||
|
};
|
||||||
|
if (label) {
|
||||||
|
data['el'] = label;
|
||||||
|
}
|
||||||
|
if (value) {
|
||||||
|
data['ev'] = value;
|
||||||
|
}
|
||||||
|
if (this.lastScreenName) {
|
||||||
|
data['cd'] = this.lastScreenName;
|
||||||
|
}
|
||||||
|
this.sendRequest(data);
|
||||||
|
};
|
||||||
|
GA.prototype.exception = function (msg, fatal) {
|
||||||
|
var data = {
|
||||||
|
't': 'exception',
|
||||||
|
'exd': msg,
|
||||||
|
'exf': fatal || 0
|
||||||
|
};
|
||||||
|
this.sendRequest(data);
|
||||||
|
};
|
||||||
|
GA.prototype.timing = function (category, variable, time, label) {
|
||||||
|
var data = {
|
||||||
|
't': 'timing',
|
||||||
|
'utc': category,
|
||||||
|
'utv': variable,
|
||||||
|
'utt': time,
|
||||||
|
'utl': label,
|
||||||
|
};
|
||||||
|
this.sendRequest(data);
|
||||||
|
},
|
||||||
|
GA.prototype.ecommerce = {
|
||||||
|
transactionID: false,
|
||||||
|
generateTransactionID: function () {
|
||||||
|
var id = "";
|
||||||
|
var possibilities = "0123456789";
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
id += possibilities.charAt(Math.floor(Math.random() * possibilities.length));
|
||||||
|
return id;
|
||||||
|
},
|
||||||
|
transaction: function (total, items) {
|
||||||
|
var t_id = "";
|
||||||
|
if (!this.ecommerce.transactionID)
|
||||||
|
t_id = this.ecommerce.generateTransactionID();
|
||||||
|
else
|
||||||
|
t_id = this.ecommerce.transactionID;
|
||||||
|
var data = {
|
||||||
|
't': 'transaction',
|
||||||
|
'ti': t_id,
|
||||||
|
'tr': total,
|
||||||
|
'cu': this.currency,
|
||||||
|
};
|
||||||
|
this.sendRequest(data);
|
||||||
|
items.forEach(function (item) {
|
||||||
|
var data = {
|
||||||
|
't': 'item',
|
||||||
|
'ti': t_id,
|
||||||
|
'in': item.name,
|
||||||
|
'ip': item.price,
|
||||||
|
'iq': item.qty,
|
||||||
|
'ic': item.id,
|
||||||
|
'cu': this.currency
|
||||||
|
};
|
||||||
|
this.sendRequest(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
GA.prototype.custom = function (data) {
|
||||||
|
this.sendRequest(data);
|
||||||
|
};
|
||||||
|
module.exports = GA;
|
||||||
|
/*
|
||||||
|
* Performance Tracking
|
||||||
|
*/
|
||||||
|
/*window.addEventListener("load", function() {
|
||||||
|
|
||||||
|
if(ga.performanceTracking) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var timing = window.performance.timing;
|
||||||
|
var userTime = timing.loadEventEnd - timing.navigationStart;
|
||||||
|
ga.timing("performance", "pageload", userTime);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}, false);*/
|
||||||
|
/*
|
||||||
|
* Error Reporting
|
||||||
|
*/
|
||||||
|
/*window.onerror = function (msg, url, lineNo, columnNo, error) {
|
||||||
|
var message = [
|
||||||
|
'Message: ' + msg,
|
||||||
|
'Line: ' + lineNo,
|
||||||
|
'Column: ' + columnNo,
|
||||||
|
'Error object: ' + JSON.stringify(error)
|
||||||
|
].join(' - ');
|
||||||
|
|
||||||
|
if(ga.errorTracking)
|
||||||
|
{
|
||||||
|
setTimeout(function() {
|
||||||
|
ga.exception(message.toString());
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};*/
|
||||||
|
|
||||||
|
},{}],15:[function(require,module,exports){
|
||||||
|
"use strict";
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
};
|
};
|
||||||
|
|
@ -6865,7 +7045,7 @@ var LogEventHandlers = /** @class */ (function () {
|
||||||
}());
|
}());
|
||||||
exports.default = LogEventHandlers;
|
exports.default = LogEventHandlers;
|
||||||
|
|
||||||
},{"./channel-factory":7}],15:[function(require,module,exports){
|
},{"./channel-factory":7}],16:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var LogEvent = /** @class */ (function () {
|
var LogEvent = /** @class */ (function () {
|
||||||
|
|
@ -197,6 +197,20 @@ msgstr ""
|
||||||
msgid "Alternative Currency"
|
msgid "Alternative Currency"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/tab-settings.html:75
|
||||||
|
msgid "Price Display"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-settings.js:19
|
||||||
|
#: www/views/preferencesPriceDisplay.html:12
|
||||||
|
msgid "Fiat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-settings.js:19
|
||||||
|
#: www/views/preferencesPriceDisplay.html:15
|
||||||
|
msgid "Cryptocurrency"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/controllers/buyAmazon.js:98
|
#: src/js/controllers/buyAmazon.js:98
|
||||||
msgid "Amazon.com is not available at this moment. Please try back later."
|
msgid "Amazon.com is not available at this moment. Please try back later."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -653,6 +667,7 @@ msgstr ""
|
||||||
|
|
||||||
#: src/js/controllers/copayers.js:79
|
#: src/js/controllers/copayers.js:79
|
||||||
#: src/js/controllers/export.js:193
|
#: src/js/controllers/export.js:193
|
||||||
|
#: src/js/controllers/confirm.js:41
|
||||||
#: www/views/includes/copyToClipboard.html:4
|
#: www/views/includes/copyToClipboard.html:4
|
||||||
msgid "Copied to clipboard"
|
msgid "Copied to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -2159,6 +2174,10 @@ msgstr ""
|
||||||
msgid "Payment Sent"
|
msgid "Payment Sent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/slideToAcceptSuccess.html:12
|
||||||
|
msgid "Share this transaction"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/modals/txp-details.html:32
|
#: www/views/modals/txp-details.html:32
|
||||||
msgid "Payment accepted, but not yet broadcasted"
|
msgid "Payment accepted, but not yet broadcasted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3748,3 +3767,7 @@ msgstr ""
|
||||||
#: www/views/tab-home.html:30
|
#: www/views/tab-home.html:30
|
||||||
msgid "Your Bitcoin Wallets are ready!"
|
msgid "Your Bitcoin Wallets are ready!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.js:49
|
||||||
|
msgid "Address doesn\'t contain currency information, please make sure you are sending the correct currency."
|
||||||
|
msgstr ""
|
||||||
|
|
@ -21,6 +21,9 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
var form = addressbookForm;
|
var form = addressbookForm;
|
||||||
if (data && form) {
|
if (data && form) {
|
||||||
|
if (data.result) {
|
||||||
|
data = data.result;
|
||||||
|
}
|
||||||
data = data.replace(/^bitcoin(cash)?:/, '');
|
data = data.replace(/^bitcoin(cash)?:/, '');
|
||||||
form.address.$setViewValue(data);
|
form.address.$setViewValue(data);
|
||||||
form.address.$isValid = true;
|
form.address.$isValid = true;
|
||||||
|
|
@ -36,9 +39,9 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
|
||||||
addressbook.address = translated.legacy;
|
addressbook.address = translated.legacy;
|
||||||
}
|
}
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("contact_created", [{
|
var log = new window.BitAnalytics.LogEvent("contact_created", [{
|
||||||
"coin": $scope.addressbookEntry.coin
|
"coin": $scope.addressbookEntry.coin
|
||||||
|
|
|
||||||
|
|
@ -1,58 +1,174 @@
|
||||||
'use strict';
|
'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_EXPRESSION_LIMIT = 19;
|
||||||
var LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT = 8;
|
var LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT = 8;
|
||||||
var LENGTH_AFTER_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 altUnitIndex = 0;
|
||||||
|
var availableFundsInCrypto = '';
|
||||||
|
var availableFundsInFiat = '';
|
||||||
|
var availableSatoshis = null;
|
||||||
var availableUnits = [];
|
var availableUnits = [];
|
||||||
|
var displayAddress = null;
|
||||||
var fiatCode;
|
var fiatCode;
|
||||||
|
|
||||||
var fixedUnit;
|
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 };
|
function onLeave() {
|
||||||
|
|
||||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
|
||||||
$scope.isAndroid = platformInfo.isAndroid;
|
|
||||||
$scope.isIos = platformInfo.isIOS;
|
|
||||||
|
|
||||||
$scope.$on('$ionicView.leave', function() {
|
|
||||||
angular.element($window).off('keydown');
|
angular.element($window).off('keydown');
|
||||||
});
|
}
|
||||||
|
|
||||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
function onBeforeEnter(event, data) {
|
||||||
|
|
||||||
initCurrencies();
|
initCurrencies();
|
||||||
|
vm.hello = 'greetings';
|
||||||
if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) {
|
if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) {
|
||||||
$scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
|
vm.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
|
||||||
$scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
|
vm.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
|
||||||
$scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
|
vm.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
// To get the wallet from with the new flow
|
// To get the wallet from with the new flow
|
||||||
$scope.fromWalletId = data.stateParams.fromWalletId;
|
vm.fromWalletId = data.stateParams.fromWalletId;
|
||||||
|
|
||||||
if (data.stateParams.noPrefix) {
|
if (data.stateParams.noPrefix) {
|
||||||
$scope.showWarningMessage = data.stateParams.noPrefix != 0;
|
showWarningMessage = data.stateParams.noPrefix != 0;
|
||||||
if ($scope.showWarningMessage) {
|
if (showWarningMessage) {
|
||||||
var message = 'Address doesn\'t contain currency information, please make sure you are sending the correct currency.';
|
var message = 'Address doesn\'t contain currency information, please make sure you are sending the correct currency.';
|
||||||
popupService.showAlert('', message, function() {}, 'Ok');
|
popupService.showAlert('', message, function() {}, 'Ok');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vm.isRequestingSpecificAmount = !!data.stateParams.id;
|
||||||
var config = configService.getSync().wallet.settings;
|
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() {
|
function setAvailableUnits() {
|
||||||
var defaults = configService.getDefaults();
|
var defaults = configService.getDefaults();
|
||||||
var configCache = configService.getSync();
|
var configCache = configService.getSync();
|
||||||
|
|
@ -134,83 +250,16 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
});
|
});
|
||||||
|
|
||||||
altUnitIndex = 0;
|
altUnitIndex = 0;
|
||||||
|
|
||||||
|
if (vm.fromWalletId) {
|
||||||
|
var fromWallet = profileService.getWallet(vm.fromWalletId);
|
||||||
|
updateAvailableFundsFromWallet(fromWallet);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// Go to...
|
function goBack() {
|
||||||
_id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID)
|
if (vm.shapeshiftOrderId) {
|
||||||
$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) {
|
|
||||||
$state.go('tabs.send').then(function() {
|
$state.go('tabs.send').then(function() {
|
||||||
$ionicHistory.clearHistory();
|
$ionicHistory.clearHistory();
|
||||||
$state.go('tabs.home').then(function() {
|
$state.go('tabs.home').then(function() {
|
||||||
|
|
@ -223,8 +272,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
}
|
}
|
||||||
|
|
||||||
function paste(value) {
|
function paste(value) {
|
||||||
$scope.amountModel.amount = value;
|
vm.amount = value;
|
||||||
$scope.processAmount();
|
processAmount();
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
});
|
});
|
||||||
|
|
@ -236,29 +285,22 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
if (value && evaluate(value) > 0) paste(evaluate(value));
|
if (value && evaluate(value) > 0) paste(evaluate(value));
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.sendMax = function() {
|
function sendMax() {
|
||||||
$scope.useSendMax = true;
|
useSendMax = true;
|
||||||
$scope.finish();
|
finish();
|
||||||
};
|
|
||||||
|
|
||||||
$scope.toggleAlternative = function() {
|
|
||||||
if ($scope.amountModel.amount && isExpression($scope.amountModel.amount)) {
|
|
||||||
var amount = evaluate(format($scope.amountModel.amount));
|
|
||||||
$scope.globalResult = '= ' + processResult(amount);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function updateUnitUI() {
|
function updateUnitUI() {
|
||||||
$scope.unit = availableUnits[unitIndex].shortName;
|
vm.unit = availableUnits[unitIndex].shortName;
|
||||||
$scope.alternativeUnit = availableUnits[altUnitIndex].shortName;
|
vm.alternativeUnit = availableUnits[altUnitIndex].shortName;
|
||||||
|
|
||||||
$scope.processAmount();
|
processAmount();
|
||||||
$log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit);
|
$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;
|
if (fixedUnit) return;
|
||||||
|
|
||||||
|
|
@ -275,62 +317,39 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateAvailableFundsStringIfNeeded();
|
||||||
updateUnitUI();
|
updateUnitUI();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function pushDigit(digit) {
|
||||||
$scope.changeAlternativeUnit = function() {
|
if (vm.amount && digit != '.') {
|
||||||
|
var amountSplitByComma = vm.amount.split('.');
|
||||||
// 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('.');
|
|
||||||
if (amountSplitByComma.length > 1 && amountSplitByComma[1].length >= LENGTH_AFTER_COMMA_EXPRESSION_LIMIT) return;
|
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 (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 (vm.amount && vm.amount.length >= LENGTH_EXPRESSION_LIMIT) return;
|
||||||
if ($scope.amountModel.amount.indexOf('.') > -1 && digit == '.') return;
|
if (vm.amount.indexOf('.') > -1 && digit == '.') return;
|
||||||
if ($scope.amountModel.amount == '0' && digit == '0') return;
|
if (vm.amount == '0' && digit == '0') return;
|
||||||
if (availableUnits[unitIndex].isFiat && $scope.amountModel.amount.indexOf('.') > -1 && $scope.amountModel.amount[$scope.amountModel.amount.indexOf('.') + 2]) return;
|
if (availableUnits[unitIndex].isFiat && vm.amount.indexOf('.') > -1 && vm.amount[vm.amount.indexOf('.') + 2]) return;
|
||||||
|
|
||||||
if ($scope.amountModel.amount == '0' && digit != '.') {
|
if (vm.amount == '0' && digit != '.') {
|
||||||
$scope.amountModel.amount = '';
|
vm.amount = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.amountModel.amount == '' && digit == '.') {
|
if (vm.amount == '' && digit == '.') {
|
||||||
$scope.amountModel.amount = '0';
|
vm.amount = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.amountModel.amount = ($scope.amountModel.amount + digit).replace('..', '.');
|
vm.amount = (vm.amount + digit).replace('..', '.');
|
||||||
checkFontSize();
|
processAmount();
|
||||||
$scope.processAmount();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.pushOperator = function(operator) {
|
function pushOperator(operator) {
|
||||||
if (!$scope.amountModel.amount || $scope.amountModel.amount.length == 0) return;
|
if (!vm.amount || vm.amount.length == 0) return;
|
||||||
$scope.amountModel.amount = _pushOperator($scope.amountModel.amount);
|
vm.amount = pushOperator(vm.amount);
|
||||||
|
|
||||||
function _pushOperator(val) {
|
function pushOperator(val) {
|
||||||
if (!isOperator(lodash.last(val))) {
|
if (!isOperator(lodash.last(val))) {
|
||||||
return val + operator;
|
return val + operator;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -349,62 +368,77 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
return regex.test(val);
|
return regex.test(val);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.removeDigit = function() {
|
function removeDigit() {
|
||||||
$scope.amountModel.amount = ($scope.amountModel.amount).toString().slice(0, -1);
|
vm.amount = (vm.amount).toString().slice(0, -1);
|
||||||
$scope.processAmount();
|
processAmount();
|
||||||
checkFontSize();
|
}
|
||||||
};
|
|
||||||
|
|
||||||
$scope.resetAmount = function() {
|
function resetAmount() {
|
||||||
$scope.amountModel.amount = $scope.alternativeAmount = $scope.globalResult = '';
|
vm.amount = vm.alternativeAmount = vm.globalResult = '0';
|
||||||
$scope.allowSend = false;
|
vm.allowSend = false;
|
||||||
checkFontSize();
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
$scope.openPopup = function() {
|
function openPopup() {
|
||||||
$ionicModal.fromTemplateUrl('views/modals/altCurrency.html', {
|
$ionicModal.fromTemplateUrl('views/modals/altCurrency.html', {
|
||||||
scope: $scope
|
scope: $scope
|
||||||
}).then(function(modal) {
|
}).then(function(modal) {
|
||||||
$scope.altCurrencyModal = modal;
|
altCurrencyModal = modal;
|
||||||
$scope.altCurrencyModal.show();
|
altCurrencyModal.show();
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function close() {
|
||||||
|
altCurrencyModal.remove();
|
||||||
|
altCurrencyModal = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.close = function() {
|
function processAmount() {
|
||||||
$scope.altCurrencyModal.remove();
|
var formatedValue = format(vm.amount);
|
||||||
$scope.altCurrencyModal = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.processAmount = function() {
|
|
||||||
var formatedValue = format($scope.amountModel.amount);
|
|
||||||
var result = evaluate(formatedValue);
|
var result = evaluate(formatedValue);
|
||||||
|
|
||||||
if (lodash.isNumber(result)) {
|
if (lodash.isNumber(result)) {
|
||||||
$scope.globalResult = isExpression($scope.amountModel.amount) ? '= ' + processResult(result) : '';
|
vm.globalResult = isExpression(vm.amount) ? '= ' + processResult(result) : '';
|
||||||
|
|
||||||
if (availableUnits[unitIndex].isFiat) {
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
|
|
||||||
var a = fromFiat(result);
|
var a = fromFiat(result);
|
||||||
if (a) {
|
if (a) {
|
||||||
$scope.alternativeAmount = txFormatService.formatAmount(a * unitToSatoshi, true);
|
var amountInSatoshis = a * unitToSatoshi;
|
||||||
$scope.allowSend = lodash.isNumber(a) && a > 0
|
vm.fundsAreInsufficient = !!vm.fromWalletId
|
||||||
&& (!$scope.shapeshiftOrderId
|
&& availableSatoshis !== null
|
||||||
|| (a >= $scope.minShapeshiftAmount && a <= $scope.maxShapeshiftAmount));
|
&& 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 {
|
} else {
|
||||||
if (result) {
|
if (result) {
|
||||||
$scope.alternativeAmount = 'N/A';
|
vm.alternativeAmount = 'N/A';
|
||||||
} else {
|
} else {
|
||||||
$scope.alternativeAmount = null;
|
vm.alternativeAmount = null;
|
||||||
}
|
}
|
||||||
$scope.allowSend = false;
|
vm.fundsAreInsufficient = false;
|
||||||
|
vm.allowSend = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$scope.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
|
vm.fundsAreInsufficient = vm.fromWalletId
|
||||||
$scope.allowSend = lodash.isNumber(result) && result > 0
|
&& availableSatoshis !== null
|
||||||
&& (!$scope.shapeshiftOrderId
|
&& availableSatoshis < result * unitToSatoshi;
|
||||||
|| (result >= $scope.minShapeshiftAmount && result <= $scope.maxShapeshiftAmount));
|
|
||||||
|
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', '*');
|
return result.replace('x', '*');
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.finish = function() {
|
function finish() {
|
||||||
|
|
||||||
function finish() {
|
function finish() {
|
||||||
var unit = availableUnits[unitIndex];
|
var unit = availableUnits[unitIndex];
|
||||||
var _amount = evaluate(format($scope.amountModel.amount));
|
var _amount = evaluate(format(vm.amount));
|
||||||
var coin = unit.id;
|
var coin = unit.id;
|
||||||
if (unit.isFiat) {
|
if (unit.isFiat) {
|
||||||
coin = availableUnits[altUnitIndex].id;
|
coin = availableUnits[altUnitIndex].id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.nextStep) {
|
if (nextStep) {
|
||||||
$state.transitionTo($scope.nextStep, {
|
$state.transitionTo(nextStep, {
|
||||||
id: _id,
|
id: _id,
|
||||||
amount: $scope.useSendMax ? null : _amount,
|
amount: useSendMax ? null : _amount,
|
||||||
currency: unit.id.toUpperCase(),
|
currency: unit.id.toUpperCase(),
|
||||||
coin: coin,
|
coin: coin,
|
||||||
useSendMax: $scope.useSendMax,
|
useSendMax: useSendMax,
|
||||||
fromWalletId: $scope.fromWalletId
|
fromWalletId: vm.fromWalletId
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var amount = _amount;
|
var amount = _amount;
|
||||||
|
|
@ -473,52 +507,52 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
}
|
}
|
||||||
|
|
||||||
var confirmData = {
|
var confirmData = {
|
||||||
recipientType: $scope.recipientType,
|
recipientType: recipientType,
|
||||||
toAmount: amount,
|
toAmount: amount,
|
||||||
toAddress: $scope.toAddress,
|
toAddress: toAddress,
|
||||||
displayAddress: $scope.displayAddress || $scope.toAddress,
|
displayAddress: displayAddress || toAddress,
|
||||||
toName: $scope.toName,
|
toName: toName,
|
||||||
toEmail: $scope.toEmail,
|
toEmail: toEmail,
|
||||||
toColor: $scope.toColor,
|
toColor: toColor,
|
||||||
coin: coin,
|
coin: coin,
|
||||||
useSendMax: $scope.useSendMax,
|
useSendMax: useSendMax,
|
||||||
fromWalletId: $scope.fromWalletId
|
fromWalletId: vm.fromWalletId
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($scope.shapeshiftOrderId) {
|
if (vm.shapeshiftOrderId) {
|
||||||
var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/';
|
var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/';
|
||||||
shapeshiftOrderUrl += $scope.shapeshiftOrderId;
|
shapeshiftOrderUrl += vm.shapeshiftOrderId;
|
||||||
confirmData.description = shapeshiftOrderUrl;
|
confirmData.description = shapeshiftOrderUrl;
|
||||||
confirmData.fromWalletId = $scope.fromWalletId;
|
confirmData.fromWalletId = vm.fromWalletId;
|
||||||
|
|
||||||
if (confirmData.useSendMax) {
|
if (confirmData.useSendMax) {
|
||||||
var wallet = lodash.find(profileService.getWallets({ coin: coin }),
|
var wallet = lodash.find(profileService.getWallets({ coin: coin }),
|
||||||
function(w) {
|
function(w) {
|
||||||
return w.id == $scope.fromWalletId;
|
return w.id == vm.fromWalletId;
|
||||||
});
|
});
|
||||||
|
|
||||||
var balance = parseFloat(wallet.cachedBalance.substring(0, wallet.cachedBalance.length-4));
|
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.useSendMax = false;
|
||||||
confirmData.toAmount = $scope.minShapeshiftAmount * unitToSatoshi;
|
confirmData.toAmount = vm.minShapeshiftAmount * unitToSatoshi;
|
||||||
} else if (balance > $scope.maxShapeshiftAmount) {
|
} else if (balance > vm.maxShapeshiftAmount) {
|
||||||
confirmData.useSendMax = false;
|
confirmData.useSendMax = false;
|
||||||
confirmData.toAmount = $scope.maxShapeshiftAmount * unitToSatoshi * 0.99;
|
confirmData.toAmount = vm.maxShapeshiftAmount * unitToSatoshi * 0.99;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$state.transitionTo('tabs.send.confirm', confirmData);
|
$state.transitionTo('tabs.send.confirm', confirmData);
|
||||||
}
|
}
|
||||||
$scope.useSendMax = null;
|
useSendMax = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.showWarningMessage) {
|
if (showWarningMessage) {
|
||||||
var u = $scope.unit == 'BCH' || $scope.unit == 'BTC' ? $scope.unit : $scope.alternativeUnit;
|
var u = vm.unit == 'BCH' || vm.unit == 'BTC' ? vm.unit : vm.alternativeUnit;
|
||||||
var message = 'Are you sure you want to send ' + u.toUpperCase() + '?';
|
var message = 'Are you sure you want to send ' + u.toUpperCase() + '?';
|
||||||
popupService.showConfirm(message, '', 'Yes', 'No', function(res) {
|
popupService.showConfirm(message, '', 'Yes', 'No', function(res) {
|
||||||
if (!res) {
|
if (!res) {
|
||||||
$scope.useSendMax = null;
|
useSendMax = null;
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
finish();
|
finish();
|
||||||
|
|
@ -562,10 +596,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
}];
|
}];
|
||||||
rateService.whenAvailable(function() {
|
rateService.whenAvailable(function() {
|
||||||
|
|
||||||
$scope.listComplete = false;
|
vm.listComplete = false;
|
||||||
|
|
||||||
var idx = lodash.indexBy(unusedCurrencyList, 'isoCode');
|
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 idx3 = lodash.indexBy(popularCurrencyList, 'isoCode');
|
||||||
var alternatives = rateService.listAlternatives(true);
|
var alternatives = rateService.listAlternatives(true);
|
||||||
|
|
||||||
|
|
@ -578,8 +612,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.altCurrencyList = completeAlternativeList.slice(0, 10);
|
vm.altCurrencyList = completeAlternativeList.slice(0, 10);
|
||||||
$scope.lastUsedPopularList = lodash.unique(lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
|
vm.lastUsedPopularList = lodash.unique(lodash.union(lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
|
||||||
|
|
||||||
|
rateService.updateRates();
|
||||||
|
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
|
|
@ -587,19 +623,19 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.loadMore = function() {
|
function loadMore() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$scope.altCurrencyList = completeAlternativeList.slice(0, next);
|
vm.altCurrencyList = completeAlternativeList.slice(0, next);
|
||||||
next += 10;
|
next += 10;
|
||||||
$scope.listComplete = $scope.altCurrencyList.length >= completeAlternativeList.length;
|
vm.listComplete = vm.altCurrencyList.length >= completeAlternativeList.length;
|
||||||
$scope.$broadcast('scroll.infiniteScrollComplete');
|
$scope.$broadcast('scroll.infiniteScrollComplete');
|
||||||
}, 100);
|
}, 100);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.findCurrency = function(search) {
|
function findCurrency(search) {
|
||||||
if (!search) initCurrencies();
|
if (!search) initCurrencies();
|
||||||
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
|
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union(lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
|
||||||
$scope.altCurrencyList = lodash.filter(list, function(item) {
|
vm.altCurrencyList = lodash.filter(list, function(item) {
|
||||||
var val = item.name
|
var val = item.name
|
||||||
var val2 = item.isoCode;
|
var val2 = item.isoCode;
|
||||||
return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase());
|
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 = {
|
var opts = {
|
||||||
wallet: {
|
wallet: {
|
||||||
settings: {
|
settings: {
|
||||||
|
|
@ -629,8 +665,65 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
availableUnits[altUnitIndex].name = newAltCurrency.isoCode;
|
availableUnits[altUnitIndex].name = newAltCurrency.isoCode;
|
||||||
availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode;
|
availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode;
|
||||||
fiatCode = newAltCurrency.isoCode;
|
fiatCode = newAltCurrency.isoCode;
|
||||||
|
updateAvailableFundsStringIfNeeded();
|
||||||
updateUnitUI();
|
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';
|
'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 countDown = null;
|
||||||
var FEE_TOO_HIGH_LIMIT_PER = 15;
|
var FEE_TOO_HIGH_LIMIT_PER = 15;
|
||||||
|
|
||||||
var tx = {};
|
var tx = {};
|
||||||
|
var lastTxId = "";
|
||||||
|
|
||||||
// Config Related values
|
// Config Related values
|
||||||
var config = configService.getSync();
|
var config = configService.getSync();
|
||||||
|
|
@ -31,6 +32,16 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
}, 10);
|
}, 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.showWalletSelector = function() {
|
||||||
$scope.walletSelector = true;
|
$scope.walletSelector = true;
|
||||||
|
|
@ -612,6 +623,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
txConfirmNotification.subscribe(wallet, {
|
txConfirmNotification.subscribe(wallet, {
|
||||||
txid: txp.txid
|
txid: txp.txid
|
||||||
});
|
});
|
||||||
|
lastTxId = txp.txid;
|
||||||
}
|
}
|
||||||
}, onSendStatusChange);
|
}, onSendStatusChange);
|
||||||
};
|
};
|
||||||
|
|
@ -643,9 +655,9 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
soundService.play('misc/payment_sent.mp3');
|
soundService.play('misc/payment_sent.mp3');
|
||||||
}
|
}
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
||||||
"coin": $scope.wallet.coin,
|
"coin": $scope.wallet.coin,
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,14 @@ angular.module('copayApp.controllers').controller('customAmountController', func
|
||||||
var currency = parsedAmount.currency;
|
var currency = parsedAmount.currency;
|
||||||
$scope.amountUnitStr = parsedAmount.amountUnitStr;
|
$scope.amountUnitStr = parsedAmount.amountUnitStr;
|
||||||
|
|
||||||
|
configService.whenAvailable(function (config) {
|
||||||
|
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
|
||||||
|
|
||||||
|
$timeout(function () {
|
||||||
|
$scope.$apply();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (currency != 'BTC' && currency != 'BCH') {
|
if (currency != 'BTC' && currency != 'BCH') {
|
||||||
// Convert to BTC or BCH
|
// Convert to BTC or BCH
|
||||||
var config = configService.getSync().wallet.settings;
|
var config = configService.getSync().wallet.settings;
|
||||||
|
|
|
||||||
|
|
@ -76,9 +76,9 @@ angular.module('copayApp.controllers').controller('preferencesNotificationsContr
|
||||||
|
|
||||||
emailService.updateEmail(opts);
|
emailService.updateEmail(opts);
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{
|
var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{
|
||||||
"toggle": $scope.emailNotifications.value
|
"toggle": $scope.emailNotifications.value
|
||||||
|
|
|
||||||
|
|
@ -224,6 +224,7 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
||||||
cb();
|
cb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$scope.walletsWithFunds = profileService.getWallets({hasFunds: true});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -145,9 +145,9 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
}
|
}
|
||||||
$scope.paymentReceivedCoin = $scope.wallet.coin;
|
$scope.paymentReceivedCoin = $scope.wallet.coin;
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
|
||||||
"coin": $scope.wallet.coin,
|
"coin": $scope.wallet.coin,
|
||||||
|
|
@ -233,10 +233,14 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
|
|
||||||
if (!$scope.wallets[0]) return;
|
if (!$scope.wallets[0]) return;
|
||||||
|
|
||||||
// select first wallet if no wallet selected previously
|
var selectedWallet = null;
|
||||||
var selectedWallet = checkSelectedWallet($scope.wallet, $scope.wallets);
|
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.onWalletSelect(selectedWallet);
|
||||||
|
|
||||||
$scope.showShareButton = platformInfo.isCordova ? (platformInfo.isIOS ? 'iOS' : 'Android') : null;
|
$scope.showShareButton = platformInfo.isCordova ? (platformInfo.isIOS ? 'iOS' : 'Android') : null;
|
||||||
|
|
||||||
listeners = [
|
listeners = [
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
|
||||||
isoCode: config.wallet.settings.alternativeIsoCode
|
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
|
// TODO move this to a generic service
|
||||||
bitpayAccountService.getAccounts(function(err, data) {
|
bitpayAccountService.getAccounts(function(err, data) {
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
$scope.isAndroid = platformInfo.isAndroid;
|
$scope.isAndroid = platformInfo.isAndroid;
|
||||||
$scope.isIOS = platformInfo.isIOS;
|
$scope.isIOS = platformInfo.isIOS;
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
|
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
|
||||||
window.BitAnalytics.LogEventHandlers.postEvent(log);
|
window.BitAnalytics.LogEventHandlers.postEvent(log);
|
||||||
|
|
@ -342,9 +342,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
top = TOP_BALANCE_BUTTON;
|
top = TOP_BALANCE_BUTTON;
|
||||||
}
|
}
|
||||||
|
|
||||||
var amountTop = ((amountScale - 0.7) / 0.7) * top;
|
var amountTop = ((amountScale - 0.80) / 0.80) * top;
|
||||||
if (amountTop < -10) {
|
if (amountTop < -2) {
|
||||||
amountTop = -10;
|
amountTop = -2;
|
||||||
}
|
}
|
||||||
if (amountTop > top) {
|
if (amountTop > top) {
|
||||||
amountTop = top;
|
amountTop = top;
|
||||||
|
|
@ -353,6 +353,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
var t = amountTop;
|
var t = amountTop;
|
||||||
|
|
||||||
$scope.altAmountOpacity = (amountHeight - 100) / 80;
|
$scope.altAmountOpacity = (amountHeight - 100) / 80;
|
||||||
|
$scope.buttonsOpacity = (amountHeight - 140) / 70;
|
||||||
$window.requestAnimationFrame(function() {
|
$window.requestAnimationFrame(function() {
|
||||||
$scope.amountHeight = amountHeight + 'px';
|
$scope.amountHeight = amountHeight + 'px';
|
||||||
$scope.contentMargin = contentMargin + 'px';
|
$scope.contentMargin = contentMargin + 'px';
|
||||||
|
|
@ -469,4 +470,30 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
function rgbToHex(r, g, b) {
|
function rgbToHex(r, g, b) {
|
||||||
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(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: {
|
scope: {
|
||||||
isShown: '=slideSuccessShow',
|
isShown: '=slideSuccessShow',
|
||||||
onConfirm: '&slideSuccessOnConfirm',
|
onConfirm: '&slideSuccessOnConfirm',
|
||||||
hideOnConfirm: '=slideSuccessHideOnConfirm'
|
hideOnConfirm: '=slideSuccessHideOnConfirm',
|
||||||
|
onShare: '=slideSuccessOnShare',
|
||||||
},
|
},
|
||||||
link: function(scope, element, attrs) {
|
link: function(scope, element, attrs) {
|
||||||
|
scope.isCordova = platformInfo.isCordova;
|
||||||
scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
|
scope.hasShareFunction = typeof scope.onShare === 'function';
|
||||||
|
|
||||||
var elm = element[0];
|
var elm = element[0];
|
||||||
elm.style.display = 'none';
|
elm.style.display = 'none';
|
||||||
scope.$watch('isShown', function() {
|
scope.$watch('isShown', function() {
|
||||||
|
|
@ -32,6 +32,9 @@ angular.module('copayApp.directives')
|
||||||
elm.style.display = 'none';
|
elm.style.display = 'none';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
scope.onShareButtonClick = function() {
|
||||||
|
scope.onShare();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.state('tabs.receive', {
|
.state('tabs.receive', {
|
||||||
url: '/receive',
|
url: '/receive/:walletId',
|
||||||
views: {
|
views: {
|
||||||
'tab-receive': {
|
'tab-receive': {
|
||||||
controller: 'tabReceiveController',
|
controller: 'tabReceiveController',
|
||||||
|
|
@ -291,6 +291,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-send@tabs': {
|
'tab-send@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -699,6 +700,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-receive@tabs': {
|
'tab-receive@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -845,6 +847,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-home@tabs': {
|
'tab-home@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -910,6 +913,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-home@tabs': {
|
'tab-home@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1029,6 +1033,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-home@tabs': {
|
'tab-home@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -1081,6 +1086,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-home@tabs': {
|
'tab-home@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -1137,6 +1143,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
views: {
|
views: {
|
||||||
'tab-home@tabs': {
|
'tab-home@tabs': {
|
||||||
controller: 'amountController',
|
controller: 'amountController',
|
||||||
|
controllerAs: 'vm',
|
||||||
templateUrl: 'views/amount.html'
|
templateUrl: 'views/amount.html'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1184,9 +1191,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send a log to test
|
// Send a log to test
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,15 @@ angular.module('copayApp.services').factory('clipboardService', function ($http,
|
||||||
cordova.plugins.clipboard.copy(data);
|
cordova.plugins.clipboard.copy(data);
|
||||||
} else if (platformInfo.isNW) {
|
} else if (platformInfo.isNW) {
|
||||||
nodeWebkitService.writeToClipboard(data);
|
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) {
|
} else if (clipboard.supported) {
|
||||||
clipboard.copyText(data);
|
clipboard.copyText(data);
|
||||||
} else {
|
} else {
|
||||||
// No supported
|
// Not supported
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -427,9 +427,9 @@ angular.module('copayApp.services')
|
||||||
}, function(err, secret) {
|
}, function(err, secret) {
|
||||||
if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb);
|
if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb);
|
||||||
|
|
||||||
var channel = "firebase";
|
var channel = "ga";
|
||||||
if (platformInfo.isNW) {
|
if (platformInfo.isCordova) {
|
||||||
channel = "ga";
|
channel = "firebase";
|
||||||
}
|
}
|
||||||
var log = new window.BitAnalytics.LogEvent("wallet_created", [{
|
var log = new window.BitAnalytics.LogEvent("wallet_created", [{
|
||||||
"coin": opts.coin
|
"coin": opts.coin
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
describe('secureStorageService in browser', function(){
|
xdescribe('secureStorageService in browser', function(){
|
||||||
var localStorage,
|
var localStorage,
|
||||||
sss;
|
sss;
|
||||||
|
|
||||||
|
|
@ -100,7 +100,7 @@ describe('secureStorageService in browser', function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('secureStorageService on desktop', function(){
|
xdescribe('secureStorageService on desktop', function(){
|
||||||
var desktopSss,
|
var desktopSss,
|
||||||
sss;
|
sss;
|
||||||
|
|
||||||
|
|
@ -202,7 +202,7 @@ describe('secureStorageService on desktop', function(){
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('secureStorageService on mobile', function(){
|
xdescribe('secureStorageService on mobile', function(){
|
||||||
var mobileSss,
|
var mobileSss,
|
||||||
sss;
|
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,
|
var appConfig,
|
||||||
localStorageServiceMock,
|
localStorageServiceMock,
|
||||||
log,
|
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,
|
var appConfig,
|
||||||
expectedOldProfileSavedToSecure,
|
expectedOldProfileSavedToSecure,
|
||||||
expectedOldProfileMergedWithSecure,
|
expectedOldProfileMergedWithSecure,
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter,
|
||||||
var alternativeIsoCode = config.alternativeIsoCode;
|
var alternativeIsoCode = config.alternativeIsoCode;
|
||||||
|
|
||||||
// If fiat currency
|
// 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;
|
amountUnitStr = $filter('formatFiatAmount')(amount) + ' ' + currency;
|
||||||
amountSat = rateService.fromFiat(amount, currency, coin).toFixed(0);
|
amountSat = rateService.fromFiat(amount, currency, coin).toFixed(0);
|
||||||
} else if (currency == 'sat') {
|
} else if (currency == 'sat') {
|
||||||
|
|
|
||||||
|
|
@ -72,5 +72,17 @@
|
||||||
&.activated {
|
&.activated {
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
&-outline {
|
||||||
|
@include button-style(transparent, #FFFFFF, #FAFAFA, #FFF, #FFFFFF);
|
||||||
|
@include button-outline(#FFFFFF);
|
||||||
|
background: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-grey-outline {
|
||||||
|
@include button-style(transparent, #727272, #FAFAFA, #727272, #727272);
|
||||||
|
@include button-outline(#727272);
|
||||||
|
background: none;
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
35
src/sass/components/amount.scss
Normal file
35
src/sass/components/amount.scss
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
.amount {
|
||||||
|
.start,
|
||||||
|
.middle,
|
||||||
|
.end,
|
||||||
|
.currency {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.start {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.middle {
|
||||||
|
font-size: 0.7857em;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.end {
|
||||||
|
font-size: 0.7857em;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.size-equal {
|
||||||
|
.middle,
|
||||||
|
.end {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.currency {
|
||||||
|
font-size: 1em;
|
||||||
|
margin-left: 5px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/sass/components/components.scss
Normal file
1
src/sass/components/components.scss
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
@import "amount.scss";
|
||||||
|
|
@ -9,4 +9,5 @@
|
||||||
@import "mixins/mixins";
|
@import "mixins/mixins";
|
||||||
@import "views/views";
|
@import "views/views";
|
||||||
@import "directives/directives";
|
@import "directives/directives";
|
||||||
|
@import "components/components";
|
||||||
@import "shame";
|
@import "shame";
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ qrcode {
|
||||||
content: "";
|
content: "";
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
display: block;
|
display: block;
|
||||||
left: 88px;
|
left: calc(50% - 22px);
|
||||||
margin-top: 88px;
|
margin-top: calc(50% - 22px);
|
||||||
width: 44px;
|
width: 44px;
|
||||||
height: 44px;
|
height: 44px;
|
||||||
position:absolute;
|
position:absolute;
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,10 @@ input[type=number] {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.size-25 {
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
.size-28 {
|
.size-28 {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ $v-font-family-light: "Roboto-Light", sans-serif-
|
||||||
/* Colors */
|
/* Colors */
|
||||||
$v-bitcoin-orange: #fab915 !default;
|
$v-bitcoin-orange: #fab915 !default;
|
||||||
|
|
||||||
|
$v-off-black: #262424;
|
||||||
$v-dark-gray: #445 !default;
|
$v-dark-gray: #445 !default;
|
||||||
$v-mid-gray: #667 !default;
|
$v-mid-gray: #667 !default;
|
||||||
$v-light-gray: #9b9bab !default;
|
$v-light-gray: #9b9bab !default;
|
||||||
|
|
@ -24,8 +25,11 @@ $v-text-accent-color: #647ce8 !default;
|
||||||
|
|
||||||
$v-success-color: #13e5b6 !default;
|
$v-success-color: #13e5b6 !default;
|
||||||
$v-warning-color: #ffa500 !default;
|
$v-warning-color: #ffa500 !default;
|
||||||
|
$v-warning-color-2: #b7664d;
|
||||||
$v-error-color: #ef473a !default;
|
$v-error-color: #ef473a !default;
|
||||||
|
|
||||||
|
$v-background-under-card: #f2f2f2;
|
||||||
|
|
||||||
$v-wallet-color-map: (
|
$v-wallet-color-map: (
|
||||||
0: (color: #dd4b39, name: 'Cinnabar'),
|
0: (color: #dd4b39, name: 'Cinnabar'),
|
||||||
1: (color: #f38f12, name: 'Carrot Orange'),
|
1: (color: #f38f12, name: 'Carrot Orange'),
|
||||||
|
|
@ -77,6 +81,7 @@ $v-button-primary-active-bg: darken($v-accent-color, 10%
|
||||||
$v-button-primary-active-border: transparent !default;
|
$v-button-primary-active-border: transparent !default;
|
||||||
$v-button-primary-clear-bg: none !default;
|
$v-button-primary-clear-bg: none !default;
|
||||||
$v-button-primary-clear-color: $v-accent-color !default;
|
$v-button-primary-clear-color: $v-accent-color !default;
|
||||||
|
$v-button-primary-disabled-bg: $v-mid-gray;
|
||||||
$v-button-primary-outline-bg: transparent !default;
|
$v-button-primary-outline-bg: transparent !default;
|
||||||
$v-button-primary-outline-border: $v-accent-color !default;
|
$v-button-primary-outline-border: $v-accent-color !default;
|
||||||
$v-button-primary-outline-color: $v-accent-color !default;
|
$v-button-primary-outline-color: $v-accent-color !default;
|
||||||
|
|
|
||||||
|
|
@ -244,6 +244,18 @@
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
|
.send-amount-header-footer {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-height: 20px;
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 0 6px 6px 6px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.send-amount-tool {
|
.send-amount-tool {
|
||||||
flex: 0 1 auto;
|
flex: 0 1 auto;
|
||||||
|
|
||||||
|
|
@ -260,6 +272,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.primary-amount {
|
.primary-amount {
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
input, .unit, .primary-amount-display {
|
input, .unit, .primary-amount-display {
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
|
|
||||||
|
|
@ -329,16 +343,15 @@
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.unit {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.primary-amount-display {
|
.primary-amount-display {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.alternative-amount {
|
||||||
|
color: #6F6F70;
|
||||||
|
}
|
||||||
.switch-currencies {
|
.switch-currencies {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|
@ -351,27 +364,56 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.send-amount-actions {
|
.send-amount-extras {
|
||||||
margin-top: 15px;
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
/* So that if only one item is present, it appears on the right. */
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
font-size: 12px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 0 14px;
|
||||||
|
|
||||||
|
.available-funds {
|
||||||
|
color: #6F6F70;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
color: $v-warning-color-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.extra,
|
||||||
|
button.extra {
|
||||||
|
/*display: flex;*/
|
||||||
|
flex: 0 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.extra {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: #000;
|
||||||
|
font-family: 'ProximaNova';
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: normal;
|
||||||
|
min-height: auto;
|
||||||
|
min-width: auto;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon:before {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.button {
|
||||||
|
span {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
.button {
|
|
||||||
flex: 1 1 auto;
|
|
||||||
line-height: 1.2em;
|
|
||||||
|
|
||||||
+ .button {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -394,38 +436,59 @@
|
||||||
|
|
||||||
.keypad-container {
|
.keypad-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 2em;
|
||||||
//flex: 0 1 196px;
|
//flex: 0 1 196px;
|
||||||
|
|
||||||
|
@media (min-height: 667px) {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-height: 480px) {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (min-height: 667px) {
|
@media (min-height: 667px) {
|
||||||
//flex: 0 1 224px;
|
//flex: 0 1 224px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sendmax {
|
||||||
|
background: $v-off-black;
|
||||||
|
|
||||||
|
.button {
|
||||||
|
color: white;
|
||||||
|
background: black;
|
||||||
|
border: 1px solid $v-off-black;
|
||||||
|
border-radius: 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
line-height: 2em;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.available-funds-amount {
|
||||||
|
color: #C9C9C9;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: $v-dark-gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.keypad {
|
.keypad {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 18px;
|
|
||||||
font-weight: lighter;
|
font-weight: lighter;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
color: $v-mid-gray;
|
color: $v-text-primary-color;
|
||||||
|
|
||||||
|
|
||||||
@media (min-height: 667px) {
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.col {
|
|
||||||
line-height: 38px;
|
|
||||||
|
|
||||||
@media (min-height: 667px) {
|
|
||||||
line-height: 45px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
&:last-child {
|
&:last-child {
|
||||||
.col {
|
.col {
|
||||||
|
|
@ -458,23 +521,34 @@
|
||||||
|
|
||||||
.digit{
|
.digit{
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border-top: 1px solid $v-subtle-gray;
|
background-color: #000;
|
||||||
border-left: 1px solid $v-subtle-gray;
|
border: 1px solid $v-off-black;
|
||||||
transition: all 0.1s ease;
|
transition: all 0.1s ease;
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
background-color: $v-subtle-gray;
|
background-color: $v-dark-gray;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media(max-height: 480px) {
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button-primary {
|
||||||
|
background-color: $v-primary-color;
|
||||||
|
border-radius: 0;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-primary[disabled] {
|
||||||
|
background-color: $v-button-primary-disabled-bg;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
background: #494949;
|
|
||||||
|
.warning {
|
||||||
|
color: $v-warning-color-2;
|
||||||
|
}
|
||||||
|
background: $v-background-under-card;
|
||||||
|
|
||||||
ion-content {
|
ion-content {
|
||||||
margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
|
margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
|
||||||
|
|
|
||||||
|
|
@ -26,16 +26,10 @@
|
||||||
height: 100%;
|
height: 100%;
|
||||||
.qr-code {
|
.qr-code {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 24vh;
|
margin-top: 6px;
|
||||||
margin-bottom: 7vh;
|
qrcode canvas {
|
||||||
@media(max-height: 800px) {
|
height: 30vh;
|
||||||
margin-top: 18vh;
|
max-height: 220px;
|
||||||
}
|
|
||||||
@media(max-height: 700px) {
|
|
||||||
margin-top: 14vh;
|
|
||||||
}
|
|
||||||
@media(max-height: 600px) {
|
|
||||||
margin-top: 8vh;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.info {
|
.info {
|
||||||
|
|
@ -91,5 +85,34 @@
|
||||||
.address-types {
|
.address-types {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.amount {
|
||||||
|
margin-top: 20vh;
|
||||||
|
margin-bottom: 4vh;
|
||||||
|
@media(max-height: 800px) {
|
||||||
|
margin-top: 12vh;
|
||||||
|
margin-bottom: 6vh;
|
||||||
|
}
|
||||||
|
@media(max-height: 700px) {
|
||||||
|
margin-top: 10vh;
|
||||||
|
margin-bottom: 4vh;
|
||||||
|
}
|
||||||
|
@media(max-height: 600px) {
|
||||||
|
margin-top: 6vh;
|
||||||
|
margin-bottom: 2vh;
|
||||||
|
|
||||||
|
}
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
//padding-top: 30px;
|
||||||
|
display: block;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
&-alternative {
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,6 @@ slide-to-accept-success {
|
||||||
|
|
||||||
.slide-success {
|
.slide-success {
|
||||||
$duration: 400ms;
|
$duration: 400ms;
|
||||||
&__windows-background {
|
|
||||||
background: $v-success-bg-color;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
&__background {
|
&__background {
|
||||||
$start-radius: 5;
|
$start-radius: 5;
|
||||||
$scale-factor: 20;
|
$scale-factor: 20;
|
||||||
|
|
@ -40,9 +34,11 @@ slide-to-accept-success {
|
||||||
&__content {
|
&__content {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
margin-top: -20vh;
|
margin-top: -10vh;
|
||||||
|
|
||||||
> img {
|
> img {
|
||||||
|
width: 45vw;
|
||||||
|
max-width: 166px;
|
||||||
margin-bottom: 1.8rem;
|
margin-bottom: 1.8rem;
|
||||||
-webkit-transform: translateY(5rem);
|
-webkit-transform: translateY(5rem);
|
||||||
transform: translateY(5rem);
|
transform: translateY(5rem);
|
||||||
|
|
@ -59,7 +55,7 @@ slide-to-accept-success {
|
||||||
|
|
||||||
&__header {
|
&__header {
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-size: 26px;
|
font-size: 29px;
|
||||||
-webkit-transform: translateY(5rem);
|
-webkit-transform: translateY(5rem);
|
||||||
transform: translateY(5rem);
|
transform: translateY(5rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
@ -72,6 +68,26 @@ slide-to-accept-success {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
&__share {
|
||||||
|
transition: transform $duration ease, opacity $duration ease;
|
||||||
|
transition-delay: 600ms;
|
||||||
|
opacity: 0;
|
||||||
|
margin-top: 15vh;
|
||||||
|
span {
|
||||||
|
color: #FFF;
|
||||||
|
font-size: 22px;
|
||||||
|
height: 28px;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
height: 28px;
|
||||||
|
width: auto;
|
||||||
|
vertical-align: bottom;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
&.reveal {
|
||||||
|
opacity: 0.79;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__footer {
|
&__footer {
|
||||||
|
|
@ -98,11 +114,11 @@ slide-to-accept-success {
|
||||||
&__btn {
|
&__btn {
|
||||||
display: block;
|
display: block;
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-size: 18px;
|
font-size: 22px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 2.86px;
|
letter-spacing: 2.86px;
|
||||||
padding: 1rem 0 1.1rem;
|
padding: 2rem 0 2.1rem;
|
||||||
border-top: 1px solid rgba(255, 255, 255, .45);
|
border-top: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,25 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.buttons {
|
||||||
|
margin: 6px auto -12px;
|
||||||
|
max-width: 600px;
|
||||||
|
>.col {
|
||||||
|
padding: 5px 10px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
border: 2px solid;
|
||||||
|
border-radius: 47px;
|
||||||
|
padding: 0 15px 0 15px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: bolder;
|
||||||
|
min-height: auto;
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
.wallet-coin-logo {
|
.wallet-coin-logo {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
|
|
|
||||||
|
|
@ -135,11 +135,12 @@
|
||||||
|
|
||||||
&.status-bar {
|
&.status-bar {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
|
margin-top: env(safe-area-inset-top);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.bar-header {
|
.bar-header {
|
||||||
border: 0;
|
border: 0;
|
||||||
background: none;
|
background: rgb(238, 182, 64);
|
||||||
.title, .button {
|
.title, .button {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
@ -153,7 +154,7 @@
|
||||||
ion-content {
|
ion-content {
|
||||||
|
|
||||||
&.collapsible {
|
&.collapsible {
|
||||||
margin-top: 210px;
|
margin-top: 230px;
|
||||||
}
|
}
|
||||||
|
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
|
|
@ -190,12 +191,34 @@
|
||||||
transform: translateY(100px);
|
transform: translateY(100px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.send-receive-buttons {
|
||||||
|
max-width: 600px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20px;
|
||||||
|
|
||||||
|
>.col {
|
||||||
|
padding: 5px 10px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
border: 2px solid;
|
||||||
|
border-radius: 47px;
|
||||||
|
padding: 0 15px 0 15px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: bolder;
|
||||||
|
min-height: auto;
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.amount {
|
.amount {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
height: 210px;
|
height: 230px;
|
||||||
padding-top: 40px;
|
padding-top: 40px;
|
||||||
display: block;
|
display: block;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ module.exports = function(config) {
|
||||||
files: [
|
files: [
|
||||||
'node_modules/angular/angular.js',
|
'node_modules/angular/angular.js',
|
||||||
|
|
||||||
|
'bitanalytics/bitanalytics-0.1.0.js',
|
||||||
|
|
||||||
// From Gruntfile.js
|
// From Gruntfile.js
|
||||||
'bower_components/qrcode-generator/js/qrcode.js',
|
'bower_components/qrcode-generator/js/qrcode.js',
|
||||||
'bower_components/qrcode-generator/js/qrcode_UTF8.js',
|
'bower_components/qrcode-generator/js/qrcode_UTF8.js',
|
||||||
|
|
|
||||||
22
www/img/icon-alternative-currency-black.svg
Normal file
22
www/img/icon-alternative-currency-black.svg
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="17px" height="17px" viewBox="0 0 17 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: sketchtool 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>3A719124-019D-470F-908A-5D61F117A295</title>
|
||||||
|
<desc>Created with sketchtool.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="Icons" transform="translate(-324.000000, -770.000000)" stroke="#000000" stroke-width="0.7">
|
||||||
|
<g id="icons/list-items/sync" transform="translate(324.000000, 770.000000)">
|
||||||
|
<g id="Group" transform="translate(0.365217, 0.365217)">
|
||||||
|
<polyline id="Shape" points="10.5913043 11.6869565 0 11.6869565 0 0 16.0695652 0 16.0695652 7.96173913"></polyline>
|
||||||
|
<ellipse id="Oval" cx="8.03478261" cy="5.84347826" rx="1.46086957" ry="1.46086957"></ellipse>
|
||||||
|
<path d="M13.8782609,6.57391304 L13.8782609,4.3826087 C12.6365217,4.3826087 11.6869565,3.43304348 11.6869565,2.19130435 L4.3826087,2.19130435 C4.3826087,3.43304348 3.43304348,4.3826087 2.19130435,4.3826087 L2.19130435,7.30434783 C3.43304348,7.30434783 4.3826087,8.25391304 4.3826087,9.49565217 L10.5913043,9.49565217" id="Shape"></path>
|
||||||
|
<path d="M15.0469565,13.5130435 C15.6313043,13.8052174 16.0695652,14.1704348 16.0695652,14.6086957 C16.0695652,15.4121739 14.7547826,16.0695652 13.1478261,16.0695652 C11.5408696,16.0695652 10.226087,15.4121739 10.226087,14.6086957 C10.226087,14.1704348 10.5913043,13.8052174 11.2486957,13.5130435" id="Shape"></path>
|
||||||
|
<path d="M15.0469565,11.3217391 C15.6313043,11.613913 16.0695652,11.9791304 16.0695652,12.4173913 C16.0695652,13.2208696 14.7547826,13.8782609 13.1478261,13.8782609 C11.5408696,13.8782609 10.226087,13.2208696 10.226087,12.4173913 C10.226087,11.9791304 10.5913043,11.613913 11.1756522,11.3217391" id="Shape"></path>
|
||||||
|
<path d="M15.0469565,9.13043478 C15.6313043,9.4226087 16.0695652,9.78782609 16.0695652,10.226087 C16.0695652,11.0295652 14.7547826,11.6869565 13.1478261,11.6869565 C11.5408696,11.6869565 10.226087,11.0295652 10.226087,10.226087 C10.226087,9.78782609 10.5913043,9.4226087 11.1756522,9.13043478" id="Shape"></path>
|
||||||
|
<ellipse id="Oval" cx="13.1478261" cy="8.03478261" rx="2.92173913" ry="1.46086957"></ellipse>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
10
www/img/icon-sent-successful.svg
Normal file
10
www/img/icon-sent-successful.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 166 166">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<path id="_ionicons_svg_md-checkmark-circle-outline" class="cls-1" d="M96.969,115.231,85.35,126.85,122.7,164.2l83-83L194.081,69.581,122.7,140.544,96.969,115.231ZM197.4,131a66.116,66.116,0,1,1-48.138-63.91l12.863-12.865A77.206,77.206,0,0,0,131,48a83,83,0,1,0,83,83Z" transform="translate(-48 -48)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 458 B |
17
www/img/icon-share-white.svg
Normal file
17
www/img/icon-share-white.svg
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="400px" height="400px" viewBox="56 56 400 400" enable-background="new 56 56 400 400" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M350.833,297.017c-17.517,0-32.967,8.346-43.062,21.124l-93.629-47.881
|
||||||
|
c1.226-4.571,2.106-9.296,2.106-14.267c0-5.412-1.046-10.507-2.506-15.465l93.216-47.661
|
||||||
|
c10.039,13.358,25.889,22.089,43.888,22.089c30.489,0,55.153-24.664,55.153-55.125c0-30.435-24.664-55.112-55.152-55.112
|
||||||
|
c-30.42,0-55.111,24.677-55.111,55.111c0,4.985,0.882,9.723,2.12,14.308l-93.615,47.882
|
||||||
|
c-10.108-12.793-25.587-21.166-43.131-21.166c-30.462,0-55.111,24.691-55.111,55.139c0,30.447,24.65,55.125,55.111,55.125
|
||||||
|
c18.026,0,33.863-8.758,43.943-22.129l93.174,47.66c-1.46,4.943-2.52,10.081-2.52,15.507c0,30.447,24.691,55.125,55.111,55.125
|
||||||
|
c30.489,0,55.152-24.678,55.152-55.125C405.985,321.681,381.322,297.017,350.833,297.017z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -11,9 +11,8 @@
|
||||||
<link rel="stylesheet" type="text/css" href="css/chartist.css">
|
<link rel="stylesheet" type="text/css" href="css/chartist.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/bitcoin.com.css">
|
<link rel="stylesheet" type="text/css" href="css/bitcoin.com.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/icomoon.css">
|
<link rel="stylesheet" type="text/css" href="css/icomoon.css">
|
||||||
<title>Bitcoin.com Wallet - Bitcoin.com Wallet</title>
|
<title>Bitcoin.com Wallet</title>
|
||||||
<link rel="shortcut icon" href="img/app/favicon.ico">
|
<link rel="shortcut icon" href="img/app/favicon.ico">
|
||||||
<script src="https://www.googletagmanager.com/gtag/js?id=UA-59964190-23"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,82 +1,99 @@
|
||||||
<ion-view id="view-amount" hide-tabs>
|
<ion-view id="view-amount" hide-tabs>
|
||||||
<ion-nav-bar class="bar-royal">
|
<ion-nav-bar class="bar-royal">
|
||||||
<ion-nav-title>
|
<ion-nav-title>
|
||||||
{{'Enter amount' | translate}}
|
{{'Enter Amount' | translate}}
|
||||||
</ion-nav-title>
|
</ion-nav-title>
|
||||||
<ion-nav-back-button ng-click="goBack()"></ion-nav-back-button>
|
<ion-nav-back-button ng-click="vm.goBack()"></ion-nav-back-button>
|
||||||
</ion-nav-bar>
|
</ion-nav-bar>
|
||||||
<ion-content scroll="false" style="background: #fff;">
|
<ion-content scroll="false">
|
||||||
|
|
||||||
<div style="order: 0; position: relative;">
|
<div style="order: 0; position: relative;">
|
||||||
|
|
||||||
<div class="item send-amount">
|
<div class="card item send-amount">
|
||||||
<div ng-if="shapeshiftOrderId">
|
<div class="send-amount-header-footer">
|
||||||
Minimum amount: {{minShapeshiftAmount}} <br/>
|
<div ng-if="vm.shapeshiftOrderId">
|
||||||
Maximum amount: {{maxShapeshiftAmount}} <br/>
|
Minimum amount: {{vm.minShapeshiftAmount}} <br/>
|
||||||
|
Maximum amount: {{vm.maxShapeshiftAmount}} <br/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="send-amount-tool">
|
<div class="send-amount-tool">
|
||||||
<div class="send-amount-tool-input amount">
|
<div class="send-amount-tool-input amount">
|
||||||
<div class="primary-amount"
|
<div class="primary-amount"
|
||||||
ng-class="{long: amountModel.amount.length > 5, 'very-long': amountModel.amount.length > 10}">
|
ng-class="{long: vm.amount.length > 5, 'very-long': vm.amount.length > 10}">
|
||||||
<span class="primary-amount-display text-selectable">{{ amountModel.amount || 0 }}</span><span class="unit">{{unit}}</span>
|
<span class="primary-amount-display text-selectable">{{vm.amount}} {{vm.unit}}</span>
|
||||||
</div>
|
</div>
|
||||||
<span ng-show="globalResult">{{globalResult}} {{unit}}</span>
|
<span ng-show="vm.globalResult">{{vm.globalResult}} {{vm.unit}}</span>
|
||||||
<div class="alternative-amount">
|
<div class="alternative-amount">
|
||||||
<span class="text-selectable">{{alternativeAmount || '0.00'}}</span> <span>{{alternativeUnit}}</span>
|
<span class="text-selectable">{{vm.alternativeAmount || '0.00'}}</span> <span>{{vm.alternativeUnit}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="switch-currencies" ng-click="changeUnit()"><img src="img/icon-convert.svg"></div>
|
<div class="switch-currencies" ng-click="vm.changeUnit()"><img src="img/icon-convert.svg"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="send-amount-actions text-center">
|
<div class="send-amount-header-footer">
|
||||||
<button class="button button-sendmax" ng-click="sendMax()">
|
<div class="warning" ng-show="vm.fundsAreInsufficient">
|
||||||
<span>
|
Not enough available funds
|
||||||
<i class="icon ion-ios-speedometer-outline"></i> 
|
</div>
|
||||||
<span translate>Send max amount</span>
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
<button class="button button-sendmax" ng-click="openPopup()">
|
|
||||||
<span>
|
|
||||||
<i class="icon ion-social-usd"></i> 
|
|
||||||
<span translate>Change currency</span>
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="send-amount-extras text-center">
|
||||||
|
<button class="extra button" ng-click="vm.openPopup()">
|
||||||
|
<span>
|
||||||
|
<img src="img/icon-alternative-currency-black.svg"/>
|
||||||
|
 
|
||||||
|
<span translate>Change Currency</span>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
<div class="extra available-funds"
|
||||||
|
ng-class="{warning: vm.fundsAreInsufficient}"
|
||||||
|
ng-if="!vm.isRequestingSpecificAmount" translate>
|
||||||
|
<span>Available Funds:</span> <span>{{vm.availableFunds}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="keypad-container" style="background: #fff; position: absolute; bottom: 0; margin-bottom: 57px; width: 100%;">
|
<div class="keypad-container" style="background: #fff; position: absolute; bottom: 0; margin-bottom: 57px; width: 100%;">
|
||||||
<div class="keypad" style="background: #f2f2f2; position: relative;">
|
<div class="sendmax" ng-if="vm.availableFunds && !vm.isRequestingSpecificAmount">
|
||||||
|
<button class="button button-sendmax" ng-click="vm.sendMax()">
|
||||||
|
<span>
|
||||||
|
<span translate>Use All Available Funds</span> 
|
||||||
|
<span class="available-funds-amount">({{vm.availableFunds}})</span>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="keypad" style="position: relative;">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col digit" ng-click="pushDigit('7')">7</div>
|
<div class="col digit" ng-click="vm.pushDigit('7')">7</div>
|
||||||
<div class="col digit" ng-click="pushDigit('8')">8</div>
|
<div class="col digit" ng-click="vm.pushDigit('8')">8</div>
|
||||||
<div class="col digit" ng-click="pushDigit('9')">9</div>
|
<div class="col digit" ng-click="vm.pushDigit('9')">9</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col digit" ng-click="pushDigit('4')">4</div>
|
<div class="col digit" ng-click="vm.pushDigit('4')">4</div>
|
||||||
<div class="col digit" ng-click="pushDigit('5')">5</div>
|
<div class="col digit" ng-click="vm.pushDigit('5')">5</div>
|
||||||
<div class="col digit" ng-click="pushDigit('6')">6</div>
|
<div class="col digit" ng-click="vm.pushDigit('6')">6</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col digit" ng-click="pushDigit('1')">1</div>
|
<div class="col digit" ng-click="vm.pushDigit('1')">1</div>
|
||||||
<div class="col digit" ng-click="pushDigit('2')">2</div>
|
<div class="col digit" ng-click="vm.pushDigit('2')">2</div>
|
||||||
<div class="col digit" ng-click="pushDigit('3')">3</div>
|
<div class="col digit" ng-click="vm.pushDigit('3')">3</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col digit" ng-click="pushDigit('.')">.</div>
|
<div class="col digit" ng-click="vm.pushDigit('.')">.</div>
|
||||||
<div class="col digit" ng-click="pushDigit('0')">0</div>
|
<div class="col digit" ng-click="vm.pushDigit('0')">0</div>
|
||||||
<div class="col digit icon ion-backspace-outline" ng-click="removeDigit()"></div>
|
<div class="col digit icon ion-backspace-outline" ng-click="vm.removeDigit()"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
class="button button-full button-primary no-margin"
|
class="button button-full button-primary no-margin"
|
||||||
ng-disabled="!allowSend"
|
ng-disabled="!vm.allowSend"
|
||||||
ng-click="finish()"
|
ng-click="vm.finish()"
|
||||||
style="position: absolute; bottom: 0;"
|
style="position: absolute; bottom: 0;"
|
||||||
translate>
|
translate>
|
||||||
Next
|
Next
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,7 @@
|
||||||
<slide-to-accept-success
|
<slide-to-accept-success
|
||||||
slide-success-show="sendStatus === 'success'"
|
slide-success-show="sendStatus === 'success'"
|
||||||
slide-success-on-confirm="onSuccessConfirm()"
|
slide-success-on-confirm="onSuccessConfirm()"
|
||||||
|
slide-success-on-share="shareTransaction"
|
||||||
slide-success-hide-on-confirm="true">
|
slide-success-hide-on-confirm="true">
|
||||||
<span ng-show="wallet.m == 1 && (wallet.canSign() || wallet.isPrivKeyExternal())" translate>Payment Sent</span>
|
<span ng-show="wallet.m == 1 && (wallet.canSign() || wallet.isPrivKeyExternal())" translate>Payment Sent</span>
|
||||||
<span ng-show="wallet.m > 1 && (wallet.canSign() || wallet.isPrivKeyExternal())" translate>Proposal Created</span>
|
<span ng-show="wallet.m > 1 && (wallet.canSign() || wallet.isPrivKeyExternal())" translate>Proposal Created</span>
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,22 @@
|
||||||
<br/>Return To Address<br/>
|
<br/>Return To Address<br/>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-show="!showingPaymentReceived" class="amount">
|
||||||
|
<div ng-show="selectedPriceDisplay=='fiat'">
|
||||||
|
<span class="size-36">{{amountUnitStr}}</span>
|
||||||
|
<div class="size-14 amount-alternative">
|
||||||
|
{{altAmountStr | uppercase}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="selectedPriceDisplay=='crypto'">
|
||||||
|
<span class="size-36">{{altAmountStr | uppercase}}</span>
|
||||||
|
<div class="size-14 amount-alternative">
|
||||||
|
{{amountUnitStr}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div ng-show="!showingPaymentReceived" class="qr-code" copy-to-clipboard="copyToClipboard()">
|
<div ng-show="!showingPaymentReceived" class="qr-code" copy-to-clipboard="copyToClipboard()">
|
||||||
<qrcode size="220" data="{{ protocolHandler }}:{{address + '?amount=' + amountBtc}}" color="#334"></qrcode>
|
<qrcode class="qr-overlay qr-overlay--{{ wallet.coin }}" size="220" data="{{ protocolHandler }}:{{address + '?amount=' + amountBtc}}" color="#334"></qrcode>
|
||||||
</div>
|
</div>
|
||||||
<div ng-show="!showingPaymentReceived" ng-show="address && coin == 'bch'" class="address-types">
|
<div ng-show="!showingPaymentReceived" ng-show="address && coin == 'bch'" class="address-types">
|
||||||
<div>
|
<div>
|
||||||
|
|
@ -57,12 +71,6 @@
|
||||||
{{address}}
|
{{address}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="item single-line">
|
|
||||||
<span class="label" translate>Amount</span>
|
|
||||||
<span class="item-note">
|
|
||||||
{{amountUnitStr}} - {{altAmountStr}}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="item single-line">
|
<div class="item single-line">
|
||||||
<div class="wallet">
|
<div class="wallet">
|
||||||
<i class="icon big-icon-svg" ng-include="'views/includes/walletIcon.html'"></i>
|
<i class="icon big-icon-svg" ng-include="'views/includes/walletIcon.html'"></i>
|
||||||
|
|
|
||||||
4
www/views/includes/amount.html
Normal file
4
www/views/includes/amount.html
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<div class="amount"
|
||||||
|
ng-class="{ 'size-equal': displaySizeEqual }">
|
||||||
|
<span ng-if="start.length > 0" class="start">{{start}}</span><span ng-if="middle.length > 0" class="middle">{{middle}}</span><span ng-if="end.length > 0" class="end">{{end}}</span><span ng-if="currency.length > 0" class="currency">{{currency}}</span>
|
||||||
|
</div>
|
||||||
|
|
@ -1,13 +1,16 @@
|
||||||
<div
|
<div
|
||||||
class="slide-success__background"
|
class="slide-success__background"
|
||||||
ng-class="{'fill-screen': fillScreen, 'slide-success__windows-background': isWindowsPhoneApp}">
|
ng-class="{'fill-screen': fillScreen}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-disabled="wallet" class="slide-success__content">
|
<div ng-disabled="wallet" class="slide-success__content">
|
||||||
<img src="img/onboarding-success.svg" ng-class="{reveal: fillScreen}">
|
<img src="img/icon-sent-successful.svg" ng-class="{reveal: fillScreen}">
|
||||||
<div class="slide-success__content__header" ng-class="{reveal: fillScreen}">
|
<div class="slide-success__content__header" ng-class="{reveal: fillScreen}">
|
||||||
<ng-transclude>Payment Sent</ng-transclude>
|
<ng-transclude>Payment Sent</ng-transclude>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="slide-success__content__share" ng-if="hasShareFunction" ng-class="{reveal: fillScreen}" ng-click="onShareButtonClick()">
|
||||||
|
<span><img src="img/icon-share-white.svg"></span><span translate>Share this transaction</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="slide-success__footer" ng-class="{reveal: fillScreen}">
|
<div class="slide-success__footer" ng-class="{reveal: fillScreen}">
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{'Alternative Currency'|translate}}
|
{{'Alternative Currency'|translate}}
|
||||||
</div>
|
</div>
|
||||||
<button class="button button-clear" ng-click="close()" translate>
|
<button class="button button-clear" ng-click="vm.close()" translate>
|
||||||
{{'Close'|translate}}
|
{{'Close'|translate}}
|
||||||
</button>
|
</button>
|
||||||
</ion-header-bar>
|
</ion-header-bar>
|
||||||
|
|
@ -11,23 +11,23 @@
|
||||||
<div class="bar bar-header item-input-inset m20b">
|
<div class="bar bar-header item-input-inset m20b">
|
||||||
<label class="item-input-wrapper">
|
<label class="item-input-wrapper">
|
||||||
<i class="icon ion-ios-search placeholder-icon"></i>
|
<i class="icon ion-ios-search placeholder-icon"></i>
|
||||||
<input type="search" ng-init="searchedAltCurrency = ''" ng-model="searchedAltCurrency" ng-change="findCurrency(searchedAltCurrency)"
|
<input type="search" ng-init="searchedAltCurrency = ''" ng-model="searchedAltCurrency" ng-change="vm.findCurrency(searchedAltCurrency)"
|
||||||
placeholder="{{'Search your currency' | translate}}">
|
placeholder="{{'Search your currency' | translate}}">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="list" ng-if="lastUsedPopularList[0] && searchedAltCurrency.length == 0">
|
<div class="list" ng-if="vm.lastUsedPopularList[0] && searchedAltCurrency.length == 0">
|
||||||
<ion-radio class="alt-currency-radio" ng-repeat="lastUsedAltCurrency in lastUsedPopularList" ng-value="lastUsedAltCurrency.isoCode" ng-model="currentCurrency"
|
<ion-radio class="alt-currency-radio" ng-repeat="lastUsedAltCurrency in vm.lastUsedPopularList" ng-value="lastUsedAltCurrency.isoCode" ng-model="currentCurrency"
|
||||||
ng-click="save(lastUsedAltCurrency)">{{lastUsedAltCurrency.name}} <span class="item-note">{{lastUsedAltCurrency.isoCode}}</span>
|
ng-click="vm.save(lastUsedAltCurrency)">{{lastUsedAltCurrency.name}} <span class="item-note">{{lastUsedAltCurrency.isoCode}}</span>
|
||||||
</ion-radio>
|
</ion-radio>
|
||||||
</div>
|
</div>
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<div class="item" ng-repeat="altCurrency in altCurrencyList" ng-value="altCurrency.isoCode" ng-model="currentCurrency"
|
<div class="item" ng-repeat="altCurrency in vm.altCurrencyList" ng-value="altCurrency.isoCode" ng-model="currentCurrency"
|
||||||
ng-click="save(altCurrency)">{{altCurrency.name}} <span class="item-note">{{altCurrency.isoCode}}</span>
|
ng-click="vm.save(altCurrency)">{{altCurrency.name}} <span class="item-note">{{altCurrency.isoCode}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ion-infinite-scroll
|
<ion-infinite-scroll
|
||||||
ng-if="!listComplete"
|
ng-if="!vm.listComplete"
|
||||||
on-infinite="loadMore()"
|
on-infinite="vm.loadMore()"
|
||||||
distance="50%">
|
distance="50%">
|
||||||
</ion-infinite-scroll>
|
</ion-infinite-scroll>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
<ion-view id="settings-pricedisplay" class="settings" show-tabs>
|
<ion-view id="settings-pricedisplay" class="settings" show-tabs>
|
||||||
<ion-nav-bar class="bar-royal">
|
<ion-nav-bar class="bar-royal">
|
||||||
<ion-nav-title>
|
<ion-nav-title>
|
||||||
{{'Price display'|translate}}
|
{{'Price Display'|translate}}
|
||||||
</ion-nav-title>
|
</ion-nav-title>
|
||||||
<ion-nav-back-button>
|
<ion-nav-back-button>
|
||||||
</ion-nav-back-button>
|
</ion-nav-back-button>
|
||||||
</ion-nav-bar>
|
</ion-nav-bar>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
<div class="price-display">
|
<div class="price-display">
|
||||||
<ion-radio class="capitalize" ng-value="'fiat'" ng-model="selectedPriceDisplay" ng-click="save(selectedPriceDisplay)">
|
<ion-radio ng-value="'fiat'" ng-model="selectedPriceDisplay" ng-click="save(selectedPriceDisplay)">
|
||||||
fiat
|
<span translate>Fiat</span>
|
||||||
</ion-radio>
|
</ion-radio>
|
||||||
<ion-radio class="capitalize" ng-value="'crypto'" ng-model="selectedPriceDisplay" ng-click="save(selectedPriceDisplay)">
|
<ion-radio ng-value="'crypto'" ng-model="selectedPriceDisplay" ng-click="save(selectedPriceDisplay)">
|
||||||
cryptocurrency
|
<span translate>Cryptocurrency</span>
|
||||||
</ion-radio>
|
</ion-radio>
|
||||||
</div>
|
</div>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,24 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="buttons row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-grey-outline" ui-sref="tabs.receive">
|
||||||
|
<span translate>Receive</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-grey-outline" ng-class="{'ng-hide': walletsWithFunds.length}"
|
||||||
|
ui-sref="tabs.buyandsell">
|
||||||
|
<span translate>Buy Bitcoin</span>
|
||||||
|
</div>
|
||||||
|
<div class="button button-outline button-grey-outline" ng-class="{'ng-hide': !walletsWithFunds.length}"
|
||||||
|
ui-sref="tabs.send">
|
||||||
|
<span translate>Send</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="list card homeTip" ng-if="homeTip">
|
<div class="list card homeTip" ng-if="homeTip">
|
||||||
<div class="item item-icon-right item-heading">
|
<div class="item item-icon-right item-heading">
|
||||||
<div class="title" translate>
|
<div class="title" translate>
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
ng-style="{'transform': amountScale}"
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
ng-class="{amount__balance: amountIsCollapsible}">
|
||||||
<strong class="size-36">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</strong>
|
<strong class="size-25">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-14 amount-alternative"
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
ng-style="{'transform': amountScale}"
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
ng-class="{amount__balance: amountIsCollapsible}">
|
||||||
<strong class="size-36">{{status.totalBalanceStr}}</strong>
|
<strong class="size-25">{{status.totalBalanceStr}}</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-14 amount-alternative"
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
||||||
|
|
@ -91,6 +91,22 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="send-receive-buttons row" ng-if="(status.availableBalanceSat || status.availableBalanceSat === 0) && (buttonsOpacity > 0 || isAndroid)" ng-style="{opacity: buttonsOpacity}">
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-white-outline" ng-click="goToReceive()">
|
||||||
|
<span translate>Receive</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-white-outline" ng-if="!status.availableBalanceSat" ng-click="goToBuy()">
|
||||||
|
<span translate>Buy Bitcoin</span>
|
||||||
|
</div>
|
||||||
|
<div class="button button-outline button-white-outline" ng-if="status.availableBalanceSat>0" ng-click="goToSend()">
|
||||||
|
<span translate>Send</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
||||||
<span ng-include="'views/includes/walletInfo.html'"></span>
|
<span ng-include="'views/includes/walletInfo.html'"></span>
|
||||||
|
|
@ -127,7 +143,7 @@
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
ng-style="{'transform': amountScale}"
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
ng-class="{amount__balance: amountIsCollapsible}">
|
||||||
<strong class="size-36">{{status.totalBalanceStr}}</strong>
|
<strong class="size-25">{{status.totalBalanceStr}}</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-14 amount-alternative"
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
||||||
|
|
@ -142,9 +158,9 @@
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
ng-style="{'transform': amountScale}"
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
ng-class="{amount__balance: amountIsCollapsible}">
|
||||||
<strong class="size-36">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</strong>
|
<strong class="size-25">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-16 amount-alternative"
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
||||||
ng-style="{opacity: altAmountOpacity}">
|
ng-style="{opacity: altAmountOpacity}">
|
||||||
{{status.totalBalanceStr}}
|
{{status.totalBalanceStr}}
|
||||||
|
|
@ -156,7 +172,7 @@
|
||||||
ng-show="!updateStatusError && wallet.balanceHidden && !wallet.scanning"
|
ng-show="!updateStatusError && wallet.balanceHidden && !wallet.scanning"
|
||||||
on-hold="hideToggle()">
|
on-hold="hideToggle()">
|
||||||
<strong class="size-24" translate>[Balance Hidden]</strong>
|
<strong class="size-24" translate>[Balance Hidden]</strong>
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-14 amount-alternative" translate>
|
<div ng-style="{opacity: altAmountOpacity}" class="size-16 amount-alternative" translate>
|
||||||
Tap and hold to show
|
Tap and hold to show
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -166,7 +182,7 @@
|
||||||
class="amount__balance"
|
class="amount__balance"
|
||||||
ng-show="!updateStatusError && wallet.scanning">
|
ng-show="!updateStatusError && wallet.scanning">
|
||||||
<strong class="size-24" translate>[Scanning Funds]</strong>
|
<strong class="size-24" translate>[Scanning Funds]</strong>
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-14 amount-alternative" translate>
|
<div ng-style="{opacity: altAmountOpacity}" class="size-16 amount-alternative" translate>
|
||||||
Please wait
|
Please wait
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -198,6 +214,22 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="send-receive-buttons row" ng-if="(status.availableBalanceSat || status.availableBalanceSat === 0) && (buttonsOpacity > 0 || isAndroid)" ng-style="{opacity: buttonsOpacity}">
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-white-outline" ng-click="goToReceive()">
|
||||||
|
<span translate>Receive</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<div class="button button-outline button-white-outline" ng-if="!status.availableBalanceSat" ng-click="goToBuy()">
|
||||||
|
<span translate>Buy Bitcoin</span>
|
||||||
|
</div>
|
||||||
|
<div class="button button-outline button-white-outline" ng-if="status.availableBalanceSat>0" ng-click="goToSend()">
|
||||||
|
<span translate>Send</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
||||||
<span ng-include="'views/includes/walletInfo.html'"></span>
|
<span ng-include="'views/includes/walletInfo.html'"></span>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue