nifty-wallet/old-ui/app/components/buy-button-subview.js

210 lines
5.7 KiB
JavaScript

import React, {Component} from 'react'
import { connect } from 'react-redux'
import actions from '../../../ui/app/actions'
import CoinbaseForm from './coinbase-form'
import ShapeshiftForm from './shapeshift-form'
import Loading from './loading'
import AccountPanel from './account-panel'
import RadioList from './custom-radio-list'
import { getNetworkDisplayName } from '../../../app/scripts/controllers/network/util'
import { getFaucets, getExchanges } from '../../../app/scripts/lib/buy-eth-url'
import ethNetProps from 'eth-net-props'
import PropTypes from 'prop-types'
class BuyButtonSubview extends Component {
render () {
return (
<div style={{ width: '100%' }}>
{ this.headerSubview() }
{ this.primarySubview() }
</div>
)
}
headerSubview () {
const props = this.props
const { network } = props
const isLoading = props.isSubLoading
const coinName = ethNetProps.props.getNetworkCoinName(network)
return (
<div className="flex-column">
{ /* loading indication*/ }
<div>
<Loading isLoading={isLoading} />
</div>
{ /* account panel*/ }
<div>
<AccountPanel {...{
showFullAddress: true,
identity: props.identity,
account: props.account,
network: props.network,
}} />
</div>
{ /* header bar (back button, label)*/ }
<div
className="flex-row section-title"
style={{
alignItems: 'center',
}}
>
<i
className="fa fa-arrow-left fa-lg cursor-pointer"
onClick={() => this.backButtonContext()}
style={{
position: 'absolute',
left: '30px',
}}
/>
<h2 className="flex-center buy-title">{`Buy ${coinName}`}</h2>
</div>
<div>
<h3 className="flex-center select-service">Select Service</h3>
</div>
</div>
)
}
primarySubview () {
const props = this.props
const network = props.network
switch (network) {
case 'loading':
return
case '1':
return this.mainnetSubview()
default:
return (
<div className="flex-column" style={{ margin: '0px 0px 20px 30px' }}>
{ this._getBuyOptionsView(network) }
</div>
)
}
}
_getBuyOptionsView (network) {
const isTestnet = ethNetProps.props.isTestnet(network)
if (isTestnet) {
return this._getFaucetsView(network)
} else {
return this._getExchangesView(network)
}
}
_getExchangesView (network) {
const exchanges = getExchanges({network})
return exchanges.map((exchange, ind) => {
return <p
key={`buy-option${ind}`}
className="buy-option cursor-pointer"
onClick={() => this.props.dispatch(actions.buyEth({ network, ind }))}
>
{ exchange.name }
</p>
})
}
_getFaucetsView (network) {
const faucets = getFaucets(network)
if (faucets.length === 0) {
return <h2 className="error">Unknown network ID</h2>
}
const networkName = getNetworkDisplayName(network)
return faucets.map((faucet, ind) => {
const faucetNum = faucets.length > 1 ? (ind + 1) : ''
const faucetLabel = `${networkName} Test Faucet ${faucetNum}`
return <p
key={`buy-option${ind}`}
className="buy-option cursor-pointer"
onClick={() => this.props.dispatch(actions.buyEth({ network, ind }))}
>
{ faucetLabel }
</p>
})
}
mainnetSubview () {
const props = this.props
return (
<div className="flex-column">
<div className="flex-row selected-exchange">
<RadioList
defaultFocus={props.buyView.subview}
labels={[
'Coinbase',
'ShapeShift',
]}
subtext={{
'Coinbase': 'Crypto/FIAT (USA only)',
'ShapeShift': 'Crypto',
}}
onClick={(event) => this.radioHandler(event)}
/>
</div>
<h3 className="select-service" style={{
borderTop: '1px solid #e2e2e2',
paddingTop: '20px',
}}>
{ props.buyView.subview }
</h3>
{ this.formVersionSubview() }
</div>
)
}
formVersionSubview () {
const network = this.props.network
if (network === '1') {
if (this.props.buyView.formView.coinbase) {
return <CoinbaseForm { ...this.props } />
} else if (this.props.buyView.formView.shapeshift) {
return <ShapeshiftForm { ...this.props } />
}
}
}
backButtonContext () {
if (this.props.context === 'confTx') {
this.props.dispatch(actions.showConfTxPage(false))
} else {
this.props.dispatch(actions.goHome())
}
}
radioHandler (event) {
switch (event.target.title) {
case 'Coinbase':
return this.props.dispatch(actions.coinBaseSubview())
case 'ShapeShift':
return this.props.dispatch(actions.shapeShiftSubview(this.props.provider.type))
}
}
}
BuyButtonSubview.propTypes = {
dispatch: PropTypes.func,
network: PropTypes.string,
buyView: PropTypes.object,
context: PropTypes.string,
provider: PropTypes.object,
}
function mapStateToProps (state) {
return {
identity: state.appState.identity,
account: state.metamask.accounts[state.appState.buyView.buyAddress],
warning: state.appState.warning,
buyView: state.appState.buyView,
network: state.metamask.network,
provider: state.metamask.provider,
context: state.appState.currentView.context,
isSubLoading: state.appState.isSubLoading,
}
}
module.exports = connect(mapStateToProps)(BuyButtonSubview)