parent
667483ac20
commit
9c6dd9ef49
@ -0,0 +1,74 @@ |
||||
const Component = require('react').Component |
||||
const h = require('react-hyperscript') |
||||
const inherits = require('util').inherits |
||||
const connect = require('react-redux').connect |
||||
const actions = require('../actions') |
||||
const CoinbaseForm = require('./coinbase-form') |
||||
const ShapeshiftForm = require('./shapeshift-form') |
||||
|
||||
module.exports = connect(mapStateToProps)(BuyButtonSubview) |
||||
|
||||
function mapStateToProps (state) { |
||||
return { |
||||
selectedAccount: state.selectedAccount, |
||||
warning: state.appState.warning, |
||||
network: state.metamask.network, |
||||
provider: state.metamask.provider, |
||||
} |
||||
} |
||||
|
||||
inherits(BuyButtonSubview, Component) |
||||
function BuyButtonSubview () { |
||||
Component.call(this) |
||||
} |
||||
|
||||
BuyButtonSubview.prototype.render = function () { |
||||
const props = this.props |
||||
const currentForm = props.accountDetail.formView |
||||
|
||||
return ( |
||||
h('span', {key: 'buyForm'}, [ |
||||
h('h3.flex-row.text-transform-uppercase', { |
||||
style: { |
||||
background: '#EBEBEB', |
||||
color: '#AEAEAE', |
||||
paddingTop: '4px', |
||||
justifyContent: 'space-around', |
||||
}, |
||||
}, [ |
||||
h(currentForm.coinbase ? '.activeForm' : '.inactiveForm', { |
||||
onClick: () => props.dispatch(actions.coinBaseSubview()), |
||||
}, 'Coinbase'), |
||||
h(currentForm.shapeshift ? '.activeForm' : '.inactiveForm', { |
||||
onClick: () => props.dispatch(actions.shapeShiftSubview(props.provider.type)), |
||||
}, 'Shapeshift'), |
||||
]), |
||||
this.formVersionSubview(), |
||||
]) |
||||
) |
||||
} |
||||
|
||||
BuyButtonSubview.prototype.formVersionSubview = function () { |
||||
if (this.props.network === '1') { |
||||
if (this.props.accountDetail.formView.coinbase) { |
||||
return h(CoinbaseForm, this.props) |
||||
} else if (this.props.accountDetail.formView.shapeshift) { |
||||
return h(ShapeshiftForm, this.props) |
||||
} |
||||
} else { |
||||
console.log(this.props.network) |
||||
return h('div.flex-column', { |
||||
style: { |
||||
alignItems: 'center', |
||||
margin: '50px', |
||||
}, |
||||
}, [ |
||||
h('h3.text-transform-uppercase', { |
||||
style: { |
||||
width: '225px', |
||||
}, |
||||
}, 'In order to access this feature please switch too the Main Network'), |
||||
]) |
||||
} |
||||
} |
||||
|
@ -0,0 +1,186 @@ |
||||
const Component = require('react').Component |
||||
const h = require('react-hyperscript') |
||||
const inherits = require('util').inherits |
||||
const connect = require('react-redux').connect |
||||
const actions = require('../actions') |
||||
|
||||
const isValidAddress = require('../util').isValidAddress |
||||
module.exports = connect(mapStateToProps)(CoinbaseForm) |
||||
|
||||
function mapStateToProps(state) { |
||||
return { |
||||
selectedAccount: state.selectedAccount, |
||||
warning: state.appState.warning, |
||||
} |
||||
} |
||||
|
||||
inherits(CoinbaseForm, Component) |
||||
|
||||
function CoinbaseForm() { |
||||
Component.call(this) |
||||
} |
||||
|
||||
CoinbaseForm.prototype.render = function () { |
||||
var props = this.props |
||||
var amount = props.accountDetail.amount |
||||
var address = props.accountDetail.buyAddress |
||||
|
||||
return h('.flex-column', { |
||||
style: { |
||||
margin: '10px', |
||||
}, |
||||
}, [ |
||||
h('.flex-column', { |
||||
style: { |
||||
alignItems: 'flex-start', |
||||
}, |
||||
}, [ |
||||
h('.flex-column', [ |
||||
h('div', 'Address:'), |
||||
h('.input-container', { |
||||
style: {}, |
||||
}, [ |
||||
h('input.buy-inputs', { |
||||
type: 'text', |
||||
style: { |
||||
boxSizing: 'border-box', |
||||
width: '317px', |
||||
height: '20px', |
||||
padding: ' 12px 0px 12px 1px ', |
||||
}, |
||||
defaultValue: address, |
||||
onChange: this.handleAddress.bind(this), |
||||
}), |
||||
h('i.fa.fa-pencil-square-o.edit-text', { |
||||
style: { |
||||
fontSize: '12px', |
||||
color: '#F7861C', |
||||
position: 'relative', |
||||
bottom: '8px', |
||||
right: '11px', |
||||
}, |
||||
}), |
||||
|
||||
]), |
||||
]), |
||||
|
||||
h('.flex-row', [ |
||||
h('div', 'Amount: $'), |
||||
h('.input-container', [ |
||||
h('input.buy-inputs', { |
||||
style: { |
||||
width: '3em', |
||||
boxSizing: 'border-box', |
||||
}, |
||||
defaultValue: amount, |
||||
onChange: this.handleAmount.bind(this), |
||||
}), |
||||
h('i.fa.fa-pencil-square-o.edit-text', { |
||||
style: { |
||||
fontSize: '12px', |
||||
color: '#F7861C', |
||||
position: 'relative', |
||||
bottom: '5px', |
||||
right: '11px', |
||||
}, |
||||
}), |
||||
]), |
||||
]), |
||||
]), |
||||
|
||||
h('.info-gray', { |
||||
style: { |
||||
fontSize: '10px', |
||||
fontFamily: 'Montserrat Light', |
||||
margin: '15px', |
||||
lineHeight: '13px', |
||||
}, |
||||
}, |
||||
`there is a USD$ 5 a day max and a USD$ 50
|
||||
dollar limit per the life time of an account without a |
||||
coinbase account. A fee of 3.75% will be aplied to debit/credit cards.`),
|
||||
|
||||
!props.warning ? h('div', { |
||||
style: { |
||||
width: '340px', |
||||
height: '22px', |
||||
}, |
||||
}) : props.warning && h('span.error.flex-center', props.warning), |
||||
|
||||
|
||||
h('.flex-row', { |
||||
style: { |
||||
justifyContent: 'space-around', |
||||
margin: '33px', |
||||
}, |
||||
}, [ |
||||
h('button', { |
||||
onClick: this.toCoinbase.bind(this), |
||||
}, 'Continue to Coinbase'), |
||||
|
||||
h('button', { |
||||
onClick: () => props.dispatch(actions.backToAccountDetail(props.accounts.address)), |
||||
}, 'Cancel'), |
||||
]), |
||||
]) |
||||
} |
||||
CoinbaseForm.prototype.handleAmount = function (event) { |
||||
this.props.dispatch(actions.updateCoinBaseAmount(event.target.value)) |
||||
} |
||||
CoinbaseForm.prototype.handleAddress = function (event) { |
||||
this.props.dispatch(actions.updateBuyAddress(event.target.value)) |
||||
} |
||||
CoinbaseForm.prototype.toCoinbase = function () { |
||||
var props = this.props |
||||
var amount = props.accountDetail.amount |
||||
var address = props.accountDetail.buyAddress |
||||
var message |
||||
|
||||
if (isValidAddress(address) && isValidAmountforCoinBase(amount).valid) { |
||||
props.dispatch(actions.buyEth(address, props.accountDetail.amount)) |
||||
} else if (!isValidAmountforCoinBase(amount).valid) { |
||||
message = isValidAmountforCoinBase(amount).message |
||||
return props.dispatch(actions.showWarning(message)) |
||||
} else { |
||||
message = 'Receiving address is invalid.' |
||||
return props.dispatch(actions.showWarning(message)) |
||||
} |
||||
} |
||||
|
||||
CoinbaseForm.prototype.renderLoading = function () { |
||||
|
||||
return h('img', { |
||||
style: { |
||||
width: '27px', |
||||
marginRight: '-27px', |
||||
}, |
||||
src: 'images/loading.svg', |
||||
}) |
||||
} |
||||
|
||||
function isValidAmountforCoinBase(amount) { |
||||
amount = parseFloat(amount) |
||||
|
||||
if (amount) { |
||||
if (amount <= 5 && amount > 0) { |
||||
return { |
||||
valid: true, |
||||
} |
||||
} else if (amount > 5) { |
||||
return { |
||||
valid: false, |
||||
message: 'The amount can not be greater then $5', |
||||
} |
||||
} else { |
||||
return { |
||||
valid: false, |
||||
message: 'Can not buy amounts less then $0', |
||||
} |
||||
} |
||||
} else { |
||||
return { |
||||
valid: false, |
||||
message: 'The amount entered is not a number', |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,335 @@ |
||||
const Component = require('react').Component |
||||
const h = require('react-hyperscript') |
||||
const inherits = require('util').inherits |
||||
const connect = require('react-redux').connect |
||||
const actions = require('../actions') |
||||
const CopyButton = require('./CopyButton') |
||||
|
||||
const isValidAddress = require('../util').isValidAddress |
||||
module.exports = connect(mapStateToProps)(ShapeshiftForm) |
||||
|
||||
function mapStateToProps(state) { |
||||
return { |
||||
selectedAccount: state.selectedAccount, |
||||
warning: state.appState.warning, |
||||
isSubLoading: state.appState.isSubLoading, |
||||
} |
||||
} |
||||
|
||||
inherits(ShapeshiftForm, Component) |
||||
|
||||
function ShapeshiftForm() { |
||||
Component.call(this) |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.render = function () { |
||||
const marketinfo = this.props.accountDetail.formView.marketinfo |
||||
const coinOptions = this.props.accountDetail.formView.coinOptions |
||||
var coin = marketinfo.pair.split('_')[0].toUpperCase() |
||||
|
||||
return h('.flex-column', { |
||||
style: { |
||||
margin: '10px', |
||||
width: '100%', |
||||
alignItems: 'center', |
||||
}, |
||||
}, [ |
||||
h('.flex-row', { |
||||
style: { |
||||
justifyContent: 'center', |
||||
alignItems: 'baseline', |
||||
}, |
||||
}, [ |
||||
h('img', { |
||||
src: coinOptions[coin].image, |
||||
width: '25px', |
||||
height: '25px', |
||||
style: { |
||||
marginRight: '5px', |
||||
}, |
||||
}), |
||||
|
||||
h('.input-container', [ |
||||
h('input#fromCoin.buy-inputs.ex-coins', { |
||||
type: 'text', |
||||
list: 'coinList', |
||||
style: { |
||||
boxSizing: 'border-box', |
||||
}, |
||||
onChange: this.handleLiveInput.bind(this), |
||||
defaultValue: 'BTC', |
||||
}), |
||||
|
||||
this.renderCoinList(), |
||||
|
||||
h('i.fa.fa-pencil-square-o.edit-text', { |
||||
style: { |
||||
fontSize: '12px', |
||||
color: '#F7861C', |
||||
position: 'relative', |
||||
bottom: '23px', |
||||
right: '11px', |
||||
}, |
||||
}), |
||||
]), |
||||
|
||||
h('.icon-control', [ |
||||
h('i.fa.fa-refresh.fa-4.orange', { |
||||
style: { |
||||
position: 'relative', |
||||
bottom: '5px', |
||||
right: '5px', |
||||
color: '#F7861C', |
||||
}, |
||||
onClick: this.updateCoin.bind(this), |
||||
}), |
||||
h('i.fa.fa-chevron-right.fa-4.orange', { |
||||
style: { |
||||
position: 'relative', |
||||
bottom: '5px', |
||||
right: '15px', |
||||
color: '#F7861C', |
||||
}, |
||||
onClick: this.updateCoin.bind(this), |
||||
}), |
||||
]), |
||||
|
||||
h('#toCoin.ex-coins', marketinfo.pair.split('_')[1].toUpperCase()), |
||||
|
||||
h('img', { |
||||
src: coinOptions[marketinfo.pair.split('_')[1].toUpperCase()].image, |
||||
width: '25px', |
||||
height: '25px', |
||||
style: { |
||||
marginLeft: '5px', |
||||
}, |
||||
}), |
||||
]), |
||||
|
||||
this.props.isSubLoading ? this.renderLoading() : null, |
||||
|
||||
h('.flex-column', { |
||||
style: { |
||||
width: '235px', |
||||
alignItems: 'flex-start', |
||||
}, |
||||
}, [ |
||||
this.props.warning ? this.props.warning && h('span.error.flex-center', { |
||||
style: { |
||||
textAlign: 'center', |
||||
width: '229px', |
||||
height: '82px', |
||||
}, |
||||
}, |
||||
this.props.warning) : this.renderInfo(), |
||||
]), |
||||
|
||||
h(this.activeToggle('.input-container'), { |
||||
style: { |
||||
width: '100%', |
||||
marginTop: '19px', |
||||
}, |
||||
}, [ |
||||
h('div', 'Receiving address:'), |
||||
|
||||
h('input.buy-inputs', { |
||||
type: 'text', |
||||
value: this.props.accountDetail.buyAddress, |
||||
onChange: this.handleAddress.bind(this), |
||||
style: { |
||||
boxSizing: 'border-box', |
||||
width: '325px', |
||||
height: '20px', |
||||
padding: ' 5px ', |
||||
}, |
||||
}), |
||||
|
||||
h('i.fa.fa-pencil-square-o.edit-text', { |
||||
style: { |
||||
fontSize: '12px', |
||||
color: '#F7861C', |
||||
position: 'relative', |
||||
bottom: '5px', |
||||
right: '11px', |
||||
}, |
||||
}), |
||||
]), |
||||
h(this.activeToggle('.input-container'), { |
||||
style: { |
||||
width: '100%', |
||||
}, |
||||
}, [ |
||||
h('div', `${coin} Address:`), |
||||
|
||||
h('input#fromCoinAddress.buy-inputs', { |
||||
type: 'text', |
||||
placeholder: `Your ${coin} Refund Address`, |
||||
style: { |
||||
boxSizing: 'border-box', |
||||
width: '235px', |
||||
height: '20px', |
||||
padding: ' 5px ', |
||||
}, |
||||
}), |
||||
|
||||
h('i.fa.fa-pencil-square-o.edit-text', { |
||||
style: { |
||||
fontSize: '12px', |
||||
color: '#F7861C', |
||||
position: 'relative', |
||||
bottom: '5px', |
||||
right: '11px', |
||||
}, |
||||
}), |
||||
|
||||
h('button', { |
||||
onClick: this.shift.bind(this), |
||||
}, |
||||
'Submit'), |
||||
]), |
||||
]) |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.shift = function () { |
||||
var withdrawal = this.props.accountDetail.buyAddress |
||||
var returnAddress = document.getElementById('fromCoinAddress').value |
||||
var pair = this.props.accountDetail.formView.marketinfo.pair |
||||
var data = { |
||||
'withdrawal': withdrawal, |
||||
'pair': pair, |
||||
'returnAddress': returnAddress, |
||||
} |
||||
|
||||
if (isValidAddress(withdrawal)) { |
||||
this.props.dispatch(actions.coinShiftRquest(data)) |
||||
} |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.renderCoinList = function () { |
||||
var list = Object.keys(this.props.accountDetail.formView.coinOptions).map((item) => { |
||||
return h('option', { |
||||
value: item, |
||||
}, item) |
||||
}) |
||||
|
||||
return h('datalist#coinList', { |
||||
onClick: (event) => { |
||||
event.preventDefault() |
||||
}, |
||||
}, list) |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.updateCoin = function (event) { |
||||
event.preventDefault() |
||||
const props = this.props |
||||
var coinOptions = this.props.accountDetail.formView.coinOptions |
||||
var coin = document.getElementById('fromCoin').value |
||||
|
||||
if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { |
||||
var message = 'Not a valid coin' |
||||
return props.dispatch(actions.showWarning(message)) |
||||
} else { |
||||
return props.dispatch(actions.pairUpdate(coin)) |
||||
} |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.handleLiveInput = function () { |
||||
const props = this.props |
||||
var coinOptions = this.props.accountDetail.formView.coinOptions |
||||
var coin = document.getElementById('fromCoin').value |
||||
|
||||
if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { |
||||
return null |
||||
} else { |
||||
return props.dispatch(actions.pairUpdate(coin)) |
||||
} |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.renderInfo = function () { |
||||
const marketinfo = this.props.accountDetail.formView.marketinfo |
||||
const coinOptions = this.props.accountDetail.formView.coinOptions |
||||
var coin = marketinfo.pair.split('_')[0].toUpperCase() |
||||
const request = this.props.accountDetail.formView.response |
||||
|
||||
if (!request) { |
||||
return h('span', [ |
||||
h('h3.flex-row.text-transform-uppercase', { |
||||
style: { |
||||
color: '#AEAEAE', |
||||
paddingTop: '4px', |
||||
justifyContent: 'space-around', |
||||
textAlign: 'center', |
||||
fontSize: '14px', |
||||
}, |
||||
}, `Market Info for ${marketinfo.pair.replace('_', ' to ').toUpperCase()}:`), |
||||
h('.marketinfo', ['Status : ', `${coinOptions[coin].status}`]), |
||||
h('.marketinfo', ['Exchange Rate: ', `${marketinfo.rate}`]), |
||||
h('.marketinfo', ['Limit: ', `${marketinfo.limit}`]), |
||||
h('.marketinfo', ['Minimum : ', `${marketinfo.minimum}`]), |
||||
]) |
||||
} else { |
||||
return h('.flex-column', { |
||||
style: { |
||||
width: '229px', |
||||
height: '82px', |
||||
}, |
||||
}, [ |
||||
h('.marketinfo', ['Limit: ', `${marketinfo.limit}`]), |
||||
h('.marketinfo', ['Minimum : ', `${marketinfo.minimum}`]), |
||||
h('div', { |
||||
style: { |
||||
fontSize: '12px', |
||||
lineHeight: '16px', |
||||
marginTop: '4px', |
||||
color: '#F7861C', |
||||
}, |
||||
}, `Deposit your ${request.depositType} to the address bellow:`), |
||||
h('.flex-row', { |
||||
style: { |
||||
position: 'relative', |
||||
right: '38px', |
||||
}, |
||||
}, [ |
||||
h('div', { |
||||
style: { |
||||
fontSize: '13px', |
||||
}, |
||||
}, request.deposit), |
||||
h(CopyButton, { |
||||
value: request.deposit, |
||||
}), |
||||
]), |
||||
]) |
||||
} |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.handleAddress = function (event) { |
||||
this.props.dispatch(actions.updateBuyAddress(event.target.value)) |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.activeToggle = function (elementType) { |
||||
if (!this.props.accountDetail.formView.response || this.props.warning) return elementType |
||||
return `${elementType}.inactive` |
||||
} |
||||
|
||||
ShapeshiftForm.prototype.renderLoading = function () { |
||||
return h('span', { |
||||
style: { |
||||
position: 'absolute', |
||||
left: '70px', |
||||
bottom: '138px', |
||||
background: 'transparent', |
||||
width: '229px', |
||||
height: '82px', |
||||
display: 'flex', |
||||
justifyContent: 'center', |
||||
}, |
||||
}, [ |
||||
h('img', { |
||||
style: { |
||||
width: '60px', |
||||
}, |
||||
src: 'images/loading.svg', |
||||
}), |
||||
]) |
||||
} |
Loading…
Reference in new issue