zepio/app/containers/receive.js

92 lines
2.5 KiB
JavaScript
Raw Normal View History

2019-01-07 10:06:16 -08:00
// @flow
2019-02-04 20:41:45 -08:00
import eres from 'eres';
2019-01-07 10:06:16 -08:00
import { connect } from 'react-redux';
import { BigNumber } from 'bignumber.js';
2019-01-07 10:06:16 -08:00
import { ReceiveView } from '../views/receive';
import { SAPLING } from '../constants/zcash-network';
2019-01-07 10:06:16 -08:00
import {
loadAddressesSuccess,
loadAddressesError,
getNewAddressSuccess,
getNewAddressError,
type addressType,
} from '../redux/modules/receive';
import { asyncMap } from '../utils/async-map';
import rpc from '../../services/api';
2019-01-07 10:06:16 -08:00
import type { AppState } from '../types/app-state';
import type { Dispatch } from '../types/redux';
export type MapStateToProps = {|
addresses: { address: string, balance: number }[],
|};
const mapStateToProps = ({ receive }: AppState): MapStateToProps => ({
addresses: receive.addresses,
});
export type MapDispatchToProps = {|
loadAddresses: () => Promise<*>,
getNewAddress: ({ type: addressType }) => Promise<*>,
|};
const mapDispatchToProps = (dispatch: Dispatch): MapDispatchToProps => ({
loadAddresses: async () => {
const [zAddressesErr, zAddresses] = await eres(rpc.z_listaddresses());
const [tAddressesErr, transparentAddresses] = await eres(rpc.getaddressesbyaccount(''));
if (zAddressesErr || tAddressesErr) return dispatch(loadAddressesError({ error: 'Something went wrong!' }));
2019-01-07 10:06:16 -08:00
2019-03-20 06:04:34 -07:00
const latestZAddress = zAddresses[0]
? {
address: zAddresses[0],
balance: await rpc.z_getbalance(zAddresses[0]),
}
: null;
2019-03-20 06:04:34 -07:00
const latestTAddress = transparentAddresses[0]
? {
address: transparentAddresses[0],
balance: await rpc.z_getbalance(transparentAddresses[0]),
}
: null;
const allAddresses = await asyncMap(
[...zAddresses.slice(1), ...transparentAddresses.slice(1)],
async (address) => {
const [err, response] = await eres(rpc.z_getbalance(address));
if (!err && new BigNumber(response).isGreaterThan(0)) return { address, balance: response };
return null;
},
);
dispatch(
loadAddressesSuccess({
2019-03-20 06:04:34 -07:00
addresses: [latestZAddress, latestTAddress, ...allAddresses].filter(Boolean),
}),
);
},
getNewAddress: async ({ type }) => {
const [error, address] = await eres(
type === 'shielded' ? rpc.z_getnewaddress(SAPLING) : rpc.getnewaddress(''),
);
2019-01-31 13:26:08 -08:00
if (error || !address) return dispatch(getNewAddressError({ error: 'Unable to generate a new address' }));
2019-01-31 13:26:08 -08:00
dispatch(getNewAddressSuccess({ address }));
},
2019-01-07 10:06:16 -08:00
});
// $FlowFixMe
export const ReceiveContainer = connect(
mapStateToProps,
mapDispatchToProps,
)(ReceiveView);