Browse Source

Merge pull request #104 from pbca26/redux

Redux
all-modes
pbca26 8 years ago
committed by GitHub
parent
commit
5a95c57ab8
  1. 25
      react/src/actions/actionCreators.js
  2. 16
      react/src/components/addcoin/addcoin.js
  3. 8
      react/src/components/addcoin/addcoinOptionsCrypto.js
  4. 3
      react/src/components/addcoin/payload.js
  5. 95
      react/src/components/dashboard/loginModal.js
  6. 60
      react/src/components/dashboard/sendCoin.js
  7. 9
      react/src/components/dashboard/walletsData.js
  8. 2
      react/src/components/dashboard/walletsNativeTxHistory.js
  9. 3
      react/src/config.js

25
react/src/actions/actionCreators.js

@ -305,7 +305,7 @@ export function dismissToasterMessage() {
}
}
export function addCoin(coin, mode) {
export function addCoin(coin, mode, syncOnly) {
console.log('coin, mode', coin + ' ' + mode);
/*startIguanaInstance(mode, coin)
.then(function(json) {
@ -330,8 +330,18 @@ export function addCoin(coin, mode) {
}
if (checkCoinType(coin) === 'crypto') {
var _acData = startCrypto('', coin, mode);
return dispatch => {
dispatch(iguanaAddCoin(coin, mode, _acData));
if (syncOnly) {
startIguanaInstance(mode + '/sync', coin)
.then(function(json) {
console.log('started ' + coin + ' / ' mode + ' fork', json);
return dispatch => {
dispatch(iguanaAddCoin(coin, mode, _acData));
}
});
} else {
return dispatch => {
dispatch(iguanaAddCoin(coin, mode, _acData));
}
}
}
}
@ -1270,7 +1280,7 @@ export function fetchUtxoCache(_payload) {
_route = _payload.allcoins ? 'cache-all' : 'cache-one',
_coin = '&coin=' + _payload.coin,
_calls = '&calls=' + _payload.calls,
_address = '&address' + _payload.address,
_address = '&address=' + _payload.address,
_iguanaInstancePort = Config.useBasiliskInstance ? '&port=' + Config.basiliskPort : '';
return dispatch => {
@ -1829,6 +1839,13 @@ function sendToAddressState(json, dispatch) {
}
}
export function sendToAddressStateAlt(json) {
return {
type: DASHBOARD_ACTIVE_COIN_SENDTO,
lastSendToResponse: json,
}
}
export function clearLastSendToResponseState() {
return {
type: DASHBOARD_ACTIVE_COIN_SENDTO,

16
react/src/components/addcoin/addcoin.js

@ -25,6 +25,7 @@ class AddCoin extends React.Component {
},
mode: -2,
display: false,
syncOnly: false,
};
this.updateSelectedCoin = this.updateSelectedCoin.bind(this);
this.updateSelectedMode = this.updateSelectedMode.bind(this);
@ -33,6 +34,13 @@ class AddCoin extends React.Component {
this.setFullMode = this.setFullMode.bind(this);
this.activateCoin = this.activateCoin.bind(this);
this.dismiss = this.dismiss.bind(this);
this.toggleSyncOnlyMode = this.toggleSyncOnlyMode.bind(this);
}
toggleSyncOnlyMode() {
this.setState(Object.assign({}, this.state, {
syncOnly: this.state.syncOnly,
}));
}
componentWillReceiveProps(props) {
@ -110,7 +118,7 @@ class AddCoin extends React.Component {
}*/
activateCoin() {
Store.dispatch(addCoin(this.state.selectedCoin.split('|')[0], this.state.mode));
Store.dispatch(addCoin(this.state.selectedCoin.split('|')[0], this.state.mode, syncOnly));
}
dismiss() {
@ -172,6 +180,12 @@ class AddCoin extends React.Component {
</label>
</div>
</div>
<div className={this.state.mode === 1 ? 'col-sm-12' : 'hide'}>
<div className="pull-left margin-right-10">
<input type="checkbox" id="addcoin_sync_only" data-plugin="switchery" data-size="small" />
</div>
<label className="padding-top-3 padding-bottom-10" htmlFor="addcoin_sync_only" onClick={this.toggleSyncOnlyMode}>Sync only</label>
</div>
<div className="col-sm-12">
<p>
<strong>{translate('INDEX.FULL_MODE')}:</strong> {translate('INDEX.FULL_MODE_DESC')}

8
react/src/components/addcoin/addcoinOptionsCrypto.js

@ -3,11 +3,13 @@ import { translate } from '../../translate/translate';
class AddCoinOptionsCrypto extends React.Component {
render() {
//<option value="ANC|full" data-full-mode="true">AnonCoin (ANC)</option>
//<option value="BTCD|full">BitcoinDark (BTCD)</option>
//<option value="MZC|full">MazaCoin (MZC)</option>
//<option value="SYS|full">SysCoin (SYS)</option>
return (
<optgroup label="Crypto Currencies">
<option value="ANC|full" data-full-mode="true">AnonCoin (ANC)</option>
<option value="BTC|full|basilisk">Bitcoin (BTC)</option>
<option value="BTCD|full">BitcoinDark (BTCD)</option>
<option value="BTM|full">Bitmark (BTM)</option>
<option value="CARB|full">Carboncoin (CARB)</option>
<option value="DGB|full">Digibyte (DGB)</option>
@ -16,8 +18,6 @@ class AddCoinOptionsCrypto extends React.Component {
<option value="GAME|full">Gamecredits (GAME)</option>
<option value="KMD|basilisk|native">Komodo (KMD)</option>
<option value="LTC|full">Litecoin (LTC)</option>
<option value="MZC|full">MazaCoin (MZC)</option>
<option value="SYS|full">SysCoin (SYS)</option>
<option value="UNO|full">Unobtanium (UNO)</option>
<option value="ZEC|full">Zcash (ZEC)</option>
<option value="ZET|full">Zetacoin (ZET)</option>

3
react/src/components/addcoin/payload.js

@ -123,7 +123,8 @@ export function checkCoinType(coin) {
coin === 'FRK' ||
coin === 'GAME' ||
coin === 'ZEC' ||
coin === 'KMD') {
coin === 'KMD' ||
coin === 'ZET') {
return 'crypto';
}
}

95
react/src/components/dashboard/loginModal.js

@ -0,0 +1,95 @@
import React from 'react';
import { translate } from '../../translate/translate';
import {
toggleAddcoinModal,
iguanaWalletPassphrase,
iguanaActiveHandle
} from '../../actions/actionCreators';
import Store from '../../store';
class LoginModal extends React.Component {
constructor(props) {
super(props);
this.state = {
display: false,
activeLoginSection: 'activateCoin',
loginPassphrase: null,
seedInputVisibility: false,
};
/*this.toggleActivateCoinForm = this.toggleActivateCoinForm.bind(this);
this.updateInput = this.updateInput.bind(this);
this.loginSeed = this.loginSeed.bind(this);
this.toggleSeedInputVisibility = this.toggleSeedInputVisibility.bind(this);
this.handleRegisterWallet = this.handleRegisterWallet.bind(this);*/
}
toggleSeedInputVisibility() {
this.setState({
seedInputVisibility: !this.state.seedInputVisibility,
});
}
toggleActivateCoinForm() {
Store.dispatch(toggleAddcoinModal(true, false));
}
updateInput(e) {
this.setState({
[e.target.name]: e.target.value,
isSeedConfirmError: false,
});
}
loginSeed() {
Store.dispatch(iguanaWalletPassphrase(this.state.loginPassphrase));
}
render() {
if (this.props.Dashboard.activateLoginModal) {
return (
<div>
<div className={'modal modal-3d-sign add-coin-modal ' + (this.state.display ? 'show in' : 'fade hide')} id="AddCoinDilogModel-login" aria-hidden="true" aria-labelledby="AddCoinDilogModel-login" role="dialog" tabIndex="-1">
<div className="modal-dialog modal-center modal-lg">
<div className="modal-content">
<div className="modal-header bg-orange-a400 wallet-send-header">
<button type="button" className="close white" data-dismiss="modal" aria-label="Close" onClick={this.dismiss}>
<span aria-hidden="true">×</span>
</button>
<h4 className="modal-title white">{translate('INDEX.SELECT_A_COIN')}</h4>
</div>
<div className="modal-body">
<div id="wallet-login">
<div className="page animsition vertical-align text-center fade-in" data-animsition-in="fade-in" data-animsition-out="fade-out">
<div className="page-content vertical-align-middle">
<div className="brand">
<img className="brand-img" src="assets/images/easydex-logo-big.png" alt="SuperNET Iguana" />
</div>
<div id="section-login" className={this.state.activeLoginSection === 'login' ? 'show' : 'hide'}>
<h4 style={{ color: '#fff' }} id="login-welcome">{translate('INDEX.WELCOME_LOGIN')}</h4>
<div className="login-form">
<div className="form-group form-material floating">
<input type={this.state.seedInputVisibility ? 'text' : 'password'} className="form-control" name="loginPassphrase" id="password" onChange={this.updateInput} />
<i className={this.state.seedInputVisibility ? 'seed-toggle fa fa-eye-slash' : 'seed-toggle fa fa-eye'} onClick={this.toggleSeedInputVisibility}></i>
<label className="floating-label" htmlFor="inputPassword">{translate('INDEX.WALLET_SEED')}</label>
</div>
<button type="button" className="btn btn-primary btn-block" id="loginbtn" onClick={this.loginSeed} disabled={!this.state.loginPassphrase || !this.state.loginPassphrase.length}>{translate('INDEX.SIGN_IN')}</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
} else {
return null;
}
}
}
export default LoginModal;

60
react/src/components/dashboard/sendCoin.js

@ -9,7 +9,8 @@ import {
resolveOpenAliasAddress,
triggerToaster,
iguanaUTXORawTX,
clearLastSendToResponseState
clearLastSendToResponseState,
sendToAddressStateAlt
} from '../../actions/actionCreators';
import Store from '../../store';
@ -139,7 +140,7 @@ class SendCoin extends React.Component {
if (step === 2) {
if (!this.state.sendApiType && this.props.ActiveCoin.mode === 'basilisk') {
handleBasiliskSend();
this.handleBasiliskSend();
} else {
Store.dispatch(sendToAddress(this.props.ActiveCoin.coin, this.state));
}
@ -166,7 +167,9 @@ class SendCoin extends React.Component {
}
handleBasiliskSend() {
const utxoSet = this.props.ActiveCoin.cache[this.props.ActiveCoin.coin][this.state.sendFrom].refresh;
const refreshData = this.props.ActiveCoin.cache[this.props.ActiveCoin.coin][this.state.sendFrom].refresh;
const listunspentData = this.props.ActiveCoin.cache[this.props.ActiveCoin.coin][this.state.sendFrom].listunspent;
const utxoSet = refreshData && refreshData.data || listunspentData && listunspentData.data;
const sendData = {
'coin': this.props.ActiveCoin.coin,
'sendfrom': this.state.sendFrom,
@ -181,15 +184,21 @@ class SendCoin extends React.Component {
console.log('sendData', sendData);
console.log('iguanaUTXORawTXJSON', json);
if (json.result === 'success' && json.completed === true) {
Store.dispatch(triggerToaster(true, translate('TOASTR.SIGNED_TX_GENERATED') + '.', translate('TOASTR.WALLET_NOTIFICATION')));
Store.dispatch(triggerToaster(true, translate('TOASTR.SIGNED_TX_GENERATED') + '.', translate('TOASTR.WALLET_NOTIFICATION'), 'success'));
Store.dispatch(sendToAddressStateAlt(json));
if (sendData.sendsig === 1) {
Store.dispatch(triggerToaster(true, translate('TOASTR.SENDING_TX') + '.', translate('TOASTR.WALLET_NOTIFICATION')));
ajax_data_dexrawtx = {
//Store.dispatch(triggerToaster(true, translate('TOASTR.SENDING_TX') + '.', translate('TOASTR.WALLET_NOTIFICATION'), 'success'));
/*ajax_data_dexrawtx = {
'signedtx': json.signedtx,
'coin': sendData.coin
};
};*/
} else {
Store.dispatch(sendToAddressStateAlt(json));
}
} else {
Store.dispatch(sendToAddressStateAlt(json));
Store.dispatch(triggerToaster(true, translate('TOASTR.SIGNED_TX_GENERATED_FAIL') + '.', translate('TOASTR.WALLET_NOTIFICATION'), 'error'));
}
console.log(json);
});
@ -199,14 +208,22 @@ class SendCoin extends React.Component {
}, 1000);*/
}
renderSignedTx(signedtx) {
const substrBlocks = 10;
const substrLength = this.props.ActiveCoin.lastSendToResponse['signedtx'].length / substrBlocks;
renderSignedTx(isRawTx) {
let substrBlocks;
if (this.props.ActiveCoin.mode === 'basilisk') {
substrBlocks = isRawTx ? 3 : 8;
} else {
substrBlocks = 10;
}
const _lastSendToResponse = this.props.ActiveCoin.lastSendToResponse[isRawTx ? 'rawtx' : 'signedtx'];
const substrLength = _lastSendToResponse.length / substrBlocks;
let out = [];
for (let i = 0; i < substrBlocks; i++) {
out.push(
<div key={i}>{this.props.ActiveCoin.lastSendToResponse['signedtx'].substring(i * substrLength, substrLength * i + substrLength)}</div>
<div key={i}>{_lastSendToResponse.substring(i * substrLength, substrLength * i + substrLength)}</div>
);
}
@ -216,20 +233,18 @@ class SendCoin extends React.Component {
renderKey(key) {
if (key === 'signedtx') {
return this.renderSignedTx();
} else if (key === 'complete') {
if (this.props.ActiveCoin.lastSendToResponse[key] === true) {
} else if (key === 'rawtx') {
return this.renderSignedTx(true);
} else if (key === 'complete' || key === 'completed' || key === 'result') {
if (this.props.ActiveCoin.lastSendToResponse[key] === true || this.props.ActiveCoin.lastSendToResponse[key] === 'success') {
return (
<span className="label label-success">true</span>
<span className="label label-success">{this.props.ActiveCoin.lastSendToResponse[key] === true ? 'true' : 'success'}</span>
);
} else {
return (
<span className="label label-danger">false</span>
);
}
} else if (key === 'result') {
return (
<span>{this.props.ActiveCoin.lastSendToResponse[key]}</span>
);
} else if (key === 'error') {
return (
<span className="label label-danger">{this.props.ActiveCoin.lastSendToResponse[key]}</span>
@ -244,11 +259,18 @@ class SendCoin extends React.Component {
<span className="label label-danger">false</span>
);
}
} else if (key === 'txid' || key === 'sent') {
return (
<span>{this.props.ActiveCoin.lastSendToResponse[key]}</span>
);
} else if (key === 'tag') {
return null;
}
}
renderSendCoinResponse() {
if (this.props.ActiveCoin.lastSendToResponse) {
console.log('renderSendCoinResponse', this.props.ActiveCoin.lastSendToResponse);
return Object.keys(this.props.ActiveCoin.lastSendToResponse).map((key, index) =>
<tr key={key}>
<td>{key}</td>
@ -393,7 +415,7 @@ class SendCoin extends React.Component {
</div>
<div className="col-lg-10 margin-top-10">
<div className="pull-left margin-right-10">
<input type="checkbox" id="edexcoin_send_sig" onClick={this.toggleSendSig} data-plugin="switchery" data-size="small" />
<input type="checkbox" id="edexcoin_send_sig" data-plugin="switchery" data-size="small" />
</div>
<label className="padding-top-3" htmlFor="edexcoin_send_sig" onClick={this.toggleSendSig}>{translate('INDEX.DONT_SEND')}</label>
</div>

9
react/src/components/dashboard/walletsData.js

@ -118,6 +118,13 @@ class WalletsData extends React.Component {
'calls': 'refresh',
'address': this.state.currentAddress,
}));
console.log('_fetchUtxoCache', {
'pubkey': this.props.Dashboard.activeHandle.pubkey,
'allcoins': false,
'coin': this.props.ActiveCoin.coin,
'calls': 'refresh',
'address': this.state.currentAddress,
});
}
toggleBasiliskActionsMenu() {
@ -197,7 +204,7 @@ class WalletsData extends React.Component {
renderPaginationItems() {
let items = [];
for (let i=0; i <= Math.floor(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage); i++) {
for (let i=0; i < Math.ceil(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage); i++) {
items.push(
<li className={this.state.activePage === i + 1 ? 'paginate_button active' : 'paginate_button'}>
<a aria-controls="kmd-tx-history-tbl" data-dt-idx="1" tabIndex="0" key={i + '-pagination'} onClick={this.state.activePage !== (i + 1) ? () => this.updateCurrentPage(i + 1) : null}>{i + 1}</a>

2
react/src/components/dashboard/walletsNativeTxHistory.js

@ -105,7 +105,7 @@ class WalletsNativeTxHistory extends React.Component {
renderPaginationItems() {
let items = [];
for (let i=0; i <= Math.floor(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage); i++) {
for (let i=0; i < Math.floor(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage); i++) {
items.push(
<li className={this.state.activePage === i + 1 ? 'paginate_button active' : 'paginate_button'}>
<a aria-controls="kmd-tx-history-tbl" data-dt-idx="1" tabIndex="0" key={i + '-pagination'} onClick={this.state.activePage !== (i + 1) ? () => this.updateCurrentPage(i + 1) : null}>{i + 1}</a>

3
react/src/config.js

@ -4,6 +4,7 @@ module.exports = {
agamaPort: 17777,
enableCacheApi: true,
useBasiliskInstance: true,
openAlias: true,
useForksAll: true,
openAlias: false,
debug: true,
};

Loading…
Cancel
Save