You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
6.7 KiB
262 lines
6.7 KiB
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
import {
|
|
copyCoinAddress,
|
|
getNewKMDAddresses,
|
|
dumpPrivKey,
|
|
copyString,
|
|
triggerToaster,
|
|
validateAddress,
|
|
} from '../../../actions/actionCreators';
|
|
import Store from '../../../store';
|
|
import {
|
|
AddressActionsNonBasiliskModeRender,
|
|
AddressItemRender,
|
|
ReceiveCoinRender,
|
|
_ReceiveCoinTableRender,
|
|
} from './receiveCoin.render';
|
|
import { translate } from '../../../translate/translate';
|
|
|
|
// TODO: implement balance/interest sorting
|
|
|
|
class ReceiveCoin extends React.Component {
|
|
constructor() {
|
|
super();
|
|
this.state = {
|
|
openDropMenu: false,
|
|
hideZeroAdresses: false,
|
|
toggledAddressMenu: null,
|
|
toggleIsMine: false,
|
|
};
|
|
this.openDropMenu = this.openDropMenu.bind(this);
|
|
this.handleClickOutside = this.handleClickOutside.bind(this);
|
|
this.toggleVisibleAddress = this.toggleVisibleAddress.bind(this);
|
|
this.checkTotalBalance = this.checkTotalBalance.bind(this);
|
|
this.ReceiveCoinTableRender = _ReceiveCoinTableRender.bind(this);
|
|
this.toggleAddressMenu = this.toggleAddressMenu.bind(this);
|
|
this.toggleIsMine = this.toggleIsMine.bind(this);
|
|
this.validateCoinAddress = this.validateCoinAddress.bind(this);
|
|
}
|
|
|
|
toggleAddressMenu(address) {
|
|
this.setState({
|
|
toggledAddressMenu: this.state.toggledAddressMenu === address ? null : address,
|
|
});
|
|
}
|
|
|
|
ReceiveCoinTableRender() {
|
|
return this._ReceiveCoinTableRender();
|
|
}
|
|
|
|
componentWillMount() {
|
|
document.addEventListener(
|
|
'click',
|
|
this.handleClickOutside,
|
|
false
|
|
);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
document.removeEventListener(
|
|
'click',
|
|
this.handleClickOutside,
|
|
false
|
|
);
|
|
}
|
|
|
|
validateCoinAddress(address, isZaddr) {
|
|
this.toggleAddressMenu(address);
|
|
validateAddress(this.props.coin, address, isZaddr)
|
|
.then((json) => {
|
|
let _items = [];
|
|
|
|
for (let key in json) {
|
|
_items.push(`${key}: ${json[key]}`);
|
|
}
|
|
|
|
Store.dispatch(
|
|
triggerToaster(
|
|
_items,
|
|
translate('TOASTR.COIN_NOTIFICATION'),
|
|
json && json.ismine ? 'info' : 'warning',
|
|
false,
|
|
'toastr--validate-address'
|
|
)
|
|
);
|
|
});
|
|
}
|
|
|
|
dumpPrivKey(address, isZaddr) {
|
|
this.toggleAddressMenu(address);
|
|
dumpPrivKey(this.props.coin, address, isZaddr)
|
|
.then((json) => {
|
|
if (json.length &&
|
|
json.length > 10) {
|
|
Store.dispatch(copyString(json, 'WIF ' + translate('DASHBOARD.RECEIVE_ADDR_COPIED')));
|
|
}
|
|
});
|
|
}
|
|
|
|
handleClickOutside(e) {
|
|
if (e &&
|
|
e.srcElement &&
|
|
e.srcElement.offsetParent &&
|
|
e.srcElement.offsetParent.className.indexOf('dropdown') === -1 &&
|
|
(e.srcElement.offsetParent && e.srcElement.offsetParent.className.indexOf('dropdown') === -1)) {
|
|
this.setState({
|
|
openDropMenu: false,
|
|
toggledAddressMenu:
|
|
e.srcElement.className.indexOf('receive-address-context-menu-trigger') === -1 &&
|
|
e.srcElement.className.indexOf('fa-qrcode') === -1 &&
|
|
e.srcElement.className.indexOf('receive-address-context-menu-get-qr') === -1 &&
|
|
e.srcElement.className.indexOf('qrcode-modal') === -1 ? null : this.state.toggledAddressMenu,
|
|
});
|
|
}
|
|
}
|
|
|
|
openDropMenu() {
|
|
this.setState(Object.assign({}, this.state, {
|
|
openDropMenu: !this.state.openDropMenu,
|
|
}));
|
|
}
|
|
|
|
_copyCoinAddress(address) {
|
|
this.toggleAddressMenu(address);
|
|
Store.dispatch(copyCoinAddress(address));
|
|
}
|
|
|
|
renderAddressActions(address, type) {
|
|
return AddressActionsNonBasiliskModeRender.call(this, address, type);
|
|
}
|
|
|
|
hasNoAmount(address) {
|
|
return address.amount === 'N/A' || address.amount === 0;
|
|
}
|
|
|
|
hasNoInterest(address) {
|
|
return address.interest === 'N/A' || address.interest === 0 || !address.interest;
|
|
}
|
|
|
|
getNewAddress(type) {
|
|
Store.dispatch(getNewKMDAddresses(this.props.coin, type, this.props.mode));
|
|
}
|
|
|
|
toggleVisibleAddress() {
|
|
this.setState(Object.assign({}, this.state, {
|
|
hideZeroAddresses: !this.state.hideZeroAddresses,
|
|
}));
|
|
}
|
|
|
|
toggleIsMine() {
|
|
this.setState(Object.assign({}, this.state, {
|
|
toggleIsMine: !this.state.toggleIsMine,
|
|
}));
|
|
}
|
|
|
|
checkTotalBalance() {
|
|
let _balance = '0';
|
|
|
|
if (this.props.balance &&
|
|
this.props.balance.total) {
|
|
_balance = this.props.balance.total;
|
|
}
|
|
|
|
return _balance;
|
|
}
|
|
|
|
renderAddressList(type) {
|
|
const _addresses = this.props.addresses;
|
|
|
|
if (_addresses &&
|
|
_addresses[type] &&
|
|
_addresses[type].length) {
|
|
let items = [];
|
|
|
|
for (let i = 0; i < _addresses[type].length; i++) {
|
|
let address = _addresses[type][i];
|
|
|
|
if (this.state.hideZeroAddresses) {
|
|
if (!this.hasNoAmount(address)) {
|
|
items.push(
|
|
AddressItemRender.call(this, address, type)
|
|
);
|
|
}
|
|
|
|
if (!this.state.toggleIsMine &&
|
|
!address.canspend &&
|
|
address.address.substring(0, 2) !== 'zc') {
|
|
items.pop();
|
|
}
|
|
} else {
|
|
items.push(
|
|
AddressItemRender.call(this, address, type)
|
|
);
|
|
|
|
if (!this.state.toggleIsMine &&
|
|
!address.canspend &&
|
|
address.address.substring(0, 2) !== 'zc') {
|
|
items.pop();
|
|
}
|
|
}
|
|
}
|
|
|
|
return items;
|
|
} else {
|
|
if (this.props.electrumCoins && this.props.mode === 'spv' &&
|
|
type === 'public') {
|
|
let items = [];
|
|
|
|
items.push(
|
|
AddressItemRender.call(
|
|
this,
|
|
{
|
|
address: this.props.electrumCoins[this.props.coin].pub,
|
|
amount: this.props.balance.balance
|
|
},
|
|
'public'
|
|
)
|
|
);
|
|
|
|
return items;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
render() {
|
|
// TODO activeSection === 'receive' should be removed when native mode is fully merged
|
|
// into the rest of the components
|
|
if (this.props &&
|
|
(this.props.receive || this.props.activeSection === 'receive')) {
|
|
return ReceiveCoinRender.call(this);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
const mapStateToProps = (state, props) => {
|
|
let _mappedProps = {
|
|
coin: state.ActiveCoin.coin,
|
|
mode: state.ActiveCoin.mode,
|
|
receive: state.ActiveCoin.receive,
|
|
balance: state.ActiveCoin.balance,
|
|
cache: state.ActiveCoin.cache,
|
|
activeSection: state.ActiveCoin.activeSection,
|
|
activeAddress: state.ActiveCoin.activeAddress,
|
|
addresses: state.ActiveCoin.addresses,
|
|
electrumCoins: state.Dashboard.electrumCoins,
|
|
};
|
|
|
|
if (props &&
|
|
props.activeSection &&
|
|
props.renderTableOnly) {
|
|
_mappedProps.activeSection = props.activeSection;
|
|
_mappedProps.renderTableOnly = props.renderTableOnly;
|
|
}
|
|
|
|
return _mappedProps;
|
|
};
|
|
|
|
export default connect(mapStateToProps)(ReceiveCoin);
|