diff options
| -rw-r--r-- | public/css/coinos.css | 6 | ||||
| -rw-r--r-- | public/css/coinos.less | 2 | ||||
| -rw-r--r-- | public/js/wallet.coffee | 45 | ||||
| -rw-r--r-- | public/js/wallet.js | 61 | ||||
| -rw-r--r-- | views/users/wallet.html | 34 |
5 files changed, 104 insertions, 44 deletions
diff --git a/public/css/coinos.css b/public/css/coinos.css index 498aea99..b6375221 100644 --- a/public/css/coinos.css +++ b/public/css/coinos.css @@ -61,6 +61,12 @@ div.container-fluid { .form-group .input-group-addon { color: #000; } +.form-group .input-group-btn { + padding-top: 24px; +} +.form-group .form-control-feedback { + margin-top: 24px; +} div#calculator #amount { width: 5em; } diff --git a/public/css/coinos.less b/public/css/coinos.less index 50dddb23..7f202449 100644 --- a/public/css/coinos.less +++ b/public/css/coinos.less @@ -25,6 +25,8 @@ div.container-fluid { span, label { color: #999; } .form-control { height: auto; padding: 3px; display: inline-block; } .input-group-addon { color: #000; } + .input-group-btn { padding-top: 24px; } + .form-control-feedback { margin-top: 24px; } } div#calculator { diff --git a/public/js/wallet.coffee b/public/js/wallet.coffee index b34aaae1..ebe6826a 100644 --- a/public/js/wallet.coffee +++ b/public/js/wallet.coffee @@ -2,8 +2,29 @@ g = exports ? this g.proceed = false g.api = 'https://api.blockcypher.com/v1/btc/main' +validators = + address: (e) -> + try + bitcoin.address.fromBase58Check(e.val()) + catch + return false + + password: (e) -> + g.master = null + try + g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), e.val()).toString(CryptoJS.enc.Utf8)) + $('#invalid_keys').fadeOut() + catch + return false + + +errors = + address: 'Invalid address' + password: 'Wrong password' + $(-> getToken() + $('form').validator(custom: validators, errors: errors) $('button[data-toggle=tooltip]').tooltip(trigger: 'hover') @@ -26,7 +47,7 @@ $(-> name: g.user.username extended_public_key: $('#pubkey').val() subchain_indexes: [0,1] - + $.post("#{g.api}/wallets/hd?token=#{g.token}", JSON.stringify(data)).always(-> $.post("#{g.api}/wallets/hd/#{g.user.username}/addresses/derive?token=#{g.token}").always(-> getBalance() @@ -76,13 +97,6 @@ $(-> ) $('#password').keyup(-> - g.master = null - try - g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), $(this).val()).toString(CryptoJS.enc.Utf8)) - $(this).parent().removeClass('has-error').addClass('has-success') - $('#invalid_keys').fadeOut() - catch - $(this).parent().addClass('has-error').removeClass('has-success') ) $('#new_password').keyup(-> @@ -90,14 +104,14 @@ $(-> try bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8)) - $(this).parent().removeClass('has-error').addClass('has-success') catch - $(this).parent().addClass('has-error').removeClass('has-success') ) $('#manage').click(-> - $('#keys, #withdrawal').toggle() - $('#withdraw, #manage').toggle() + $('#withdrawal').hide() + $('#keys').show() + $('#withdraw').toggle(g.balance > 0) + $('#manage').hide() $('#privkey').val(g.user.privkey) ) @@ -180,8 +194,13 @@ getBalance = -> $('#balance').html(g.balance) $('#fiat').html("#{fiat} #{g.user.currency}") $('#amount').attr('max', g.balance) - $('#amount').focus() $('.wallet').fadeIn() + + if g.balance > 0 + $('#withdrawal').show() + $('#amount').focus() + else + $('#manage').click() ) sendTransaction = -> diff --git a/public/js/wallet.js b/public/js/wallet.js index 6d880b82..d83b764d 100644 --- a/public/js/wallet.js +++ b/public/js/wallet.js @@ -1,6 +1,6 @@ ;(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0](function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){ (function(){(function() { - var check_address, convertedAmount, createWallet, displayErrors, g, getBalance, getExchangeRate, getToken, getUser, isBip32, multiplier, precision, sendTransaction, + var check_address, convertedAmount, createWallet, displayErrors, errors, g, getBalance, getExchangeRate, getToken, getUser, isBip32, multiplier, precision, sendTransaction, validators, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; g = typeof exports !== "undefined" && exports !== null ? exports : this; @@ -9,8 +9,36 @@ g.api = 'https://api.blockcypher.com/v1/btc/main'; + validators = { + address: function(e) { + try { + return bitcoin.address.fromBase58Check(e.val()); + } catch (_error) { + return false; + } + }, + password: function(e) { + g.master = null; + try { + g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), e.val()).toString(CryptoJS.enc.Utf8)); + return $('#invalid_keys').fadeOut(); + } catch (_error) { + return false; + } + } + }; + + errors = { + address: 'Invalid address', + password: 'Wrong password' + }; + $(function() { getToken(); + $('form').validator({ + custom: validators, + errors: errors + }); $('button[data-toggle=tooltip]').tooltip({ trigger: 'hover' }); @@ -81,28 +109,20 @@ return $(this).val($(this).attr('max')); } }); - $('#password').keyup(function() { - g.master = null; - try { - g.master = bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt($('#privkey').val(), $(this).val()).toString(CryptoJS.enc.Utf8)); - $(this).parent().removeClass('has-error').addClass('has-success'); - return $('#invalid_keys').fadeOut(); - } catch (_error) { - return $(this).parent().addClass('has-error').removeClass('has-success'); - } - }); + $('#password').keyup(function() {}); $('#new_password').keyup(function() { $('#privkey').val(CryptoJS.AES.encrypt(g.privkey, $(this).val())); try { - bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8)); - return $(this).parent().removeClass('has-error').addClass('has-success'); + return bitcoin.HDNode.fromBase58(CryptoJS.AES.decrypt(g.user.privkey, $(this).val()).toString(CryptoJS.enc.Utf8)); } catch (_error) { - return $(this).parent().addClass('has-error').removeClass('has-success'); + } }); $('#manage').click(function() { - $('#keys, #withdrawal').toggle(); - $('#withdraw, #manage').toggle(); + $('#withdrawal').hide(); + $('#keys').show(); + $('#withdraw').toggle(g.balance > 0); + $('#manage').hide(); return $('#privkey').val(g.user.privkey); }); $('#withdraw').click(function() { @@ -189,8 +209,13 @@ $('#balance').html(g.balance); $('#fiat').html("" + fiat + " " + g.user.currency); $('#amount').attr('max', g.balance); - $('#amount').focus(); - return $('.wallet').fadeIn(); + $('.wallet').fadeIn(); + if (g.balance > 0) { + $('#withdrawal').show(); + return $('#amount').focus(); + } else { + return $('#manage').click(); + } }); }; diff --git a/views/users/wallet.html b/views/users/wallet.html index 8219c532..4848eedd 100644 --- a/views/users/wallet.html +++ b/views/users/wallet.html @@ -59,7 +59,7 @@ </form> </div> - <div id="withdrawal"> + <div id="withdrawal" style="display: none"> <h3>Send Payment / Withdrawal</h3> <div id="transaction_sent" class="alert alert-success" style="display: none"> @@ -74,10 +74,10 @@ </div> <form> - <div class="form-group"> - <label for="amount">Amount:</label> + <div class="form-group has-feedback"> <div class="input-group"> - <input type="number" id="amount" name="amount" class="form-control" min="0" /> + <label for="amount">Amount:</label> + <input type="number" id="amount" name="amount" class="form-control" min="0" required /> <span class="input-group-btn"> <button id="currency_toggle" type="button" class="btn btn-primary"></button> </span> @@ -85,29 +85,37 @@ <button id="max" type="button" class="btn btn-primary">Max</button> </span> </div> + <div class="help-block with-errors"></div> </div> - <div class="form-group"> - <label for="amount">To Address:</label> + <div class="form-group has-feedback"> <div class="input-group" style="width: 100%"> - <input type="text" id="recipient" name="recipient" class="form-control" /> + <label for="amount">To Address:</label> + <input type="text" id="recipient" name="recipient" class="form-control" data-address="true" required /> </div> + <span class="glyphicon form-control-feedback" aria-hidden="true"></span> + <div class="help-block with-errors"></div> </div> - <div class="form-group"> - <label for="priority">Fee Priority for Confirmation Time:</label> + <div class="form-group has-feedback"> <div class="input-group" style="width: 100%"> - <select id="priority" name="priority" class="form-control"> + <label for="priority">Fee Priority for Confirmation Time:</label> + <select id="priority" name="priority" class="form-control" required> <option value="low">Low</option> <option value="medium">Medium</option> <option value="high">High</option> </select> </div> + <span class="glyphicon form-control-feedback" aria-hidden="true"></span> </div> - <div class="form-group"> - <label for="password">Password:</label> - <input id="password" name="password" type="password" class="form-control" /> + <div class="form-group has-feedback"> + <div class="input-group" style="width: 100%"> + <label for="password">Password:</label> + <input id="password" name="password" type="password" class="form-control" data-password="true" required /> + </div> + <span class="glyphicon form-control-feedback" aria-hidden="true"></span> + <div class="help-block with-errors"></div> </div> <input id="send" class="btn btn-primary" type="button" value="Calculate Fee and Confirm Transaction" /> |
