2016-08-25 23:19:09 +02:00
|
|
|
const PersistentForm = require('../../lib/persistent-form')
|
2016-08-10 22:43:01 +02:00
|
|
|
const h = require('react-hyperscript')
|
|
|
|
const inherits = require('util').inherits
|
|
|
|
const connect = require('react-redux').connect
|
|
|
|
const actions = require('../actions')
|
2016-08-13 00:41:59 +02:00
|
|
|
const Qr = require('./qr-code')
|
2016-08-10 22:43:01 +02:00
|
|
|
const isValidAddress = require('../util').isValidAddress
|
|
|
|
module.exports = connect(mapStateToProps)(ShapeshiftForm)
|
|
|
|
|
2016-11-11 19:26:12 +01:00
|
|
|
function mapStateToProps (state) {
|
2016-08-10 22:43:01 +02:00
|
|
|
return {
|
|
|
|
warning: state.appState.warning,
|
|
|
|
isSubLoading: state.appState.isSubLoading,
|
2016-08-13 00:41:59 +02:00
|
|
|
qrRequested: state.appState.qrRequested,
|
2016-08-10 22:43:01 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-25 23:19:09 +02:00
|
|
|
inherits(ShapeshiftForm, PersistentForm)
|
2016-08-10 22:43:01 +02:00
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
function ShapeshiftForm () {
|
2016-08-25 23:19:09 +02:00
|
|
|
PersistentForm.call(this)
|
|
|
|
this.persistentFormParentId = 'shapeshift-buy-form'
|
2016-08-10 22:43:01 +02:00
|
|
|
}
|
2016-08-25 23:19:09 +02:00
|
|
|
|
2016-08-10 22:43:01 +02:00
|
|
|
ShapeshiftForm.prototype.render = function () {
|
2017-07-26 03:22:31 +02:00
|
|
|
return this.props.qrRequested ? h(Qr, {key: 'qr'}) : this.renderMain()
|
2016-08-13 00:41:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.renderMain = function () {
|
|
|
|
const marketinfo = this.props.buyView.formView.marketinfo
|
|
|
|
const coinOptions = this.props.buyView.formView.coinOptions
|
2016-08-10 22:43:01 +02:00
|
|
|
var coin = marketinfo.pair.split('_')[0].toUpperCase()
|
|
|
|
|
|
|
|
return h('.flex-column', {
|
|
|
|
style: {
|
2017-08-09 00:17:52 +02:00
|
|
|
position: 'relative',
|
2016-08-13 00:41:59 +02:00
|
|
|
padding: '25px',
|
2017-04-18 18:21:24 +02:00
|
|
|
paddingTop: '5px',
|
2017-08-09 00:17:52 +02:00
|
|
|
width: '90%',
|
2017-04-18 18:21:24 +02:00
|
|
|
minHeight: '215px',
|
2016-08-10 22:43:01 +02:00
|
|
|
alignItems: 'center',
|
2017-04-18 18:21:24 +02:00
|
|
|
overflowY: 'auto',
|
2016-08-10 22:43:01 +02:00
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('.flex-row', {
|
|
|
|
style: {
|
|
|
|
justifyContent: 'center',
|
|
|
|
alignItems: 'baseline',
|
2017-04-18 18:21:24 +02:00
|
|
|
height: '42px',
|
2016-08-10 22:43:01 +02:00
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('img', {
|
|
|
|
src: coinOptions[coin].image,
|
|
|
|
width: '25px',
|
|
|
|
height: '25px',
|
|
|
|
style: {
|
|
|
|
marginRight: '5px',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
h('.input-container', {
|
|
|
|
position: 'relative',
|
|
|
|
}, [
|
2016-08-10 22:43:01 +02:00
|
|
|
h('input#fromCoin.buy-inputs.ex-coins', {
|
|
|
|
type: 'text',
|
|
|
|
list: 'coinList',
|
2017-04-24 12:58:01 +02:00
|
|
|
autoFocus: true,
|
2016-09-12 19:34:06 +02:00
|
|
|
dataset: {
|
2016-08-25 23:19:09 +02:00
|
|
|
persistentFormId: 'input-coin',
|
|
|
|
},
|
2016-08-10 22:43:01 +02:00
|
|
|
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',
|
2017-08-09 00:17:52 +02:00
|
|
|
position: 'absolute',
|
2016-08-10 22:43:01 +02:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
]),
|
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
h('.icon-control', {
|
|
|
|
style: {
|
|
|
|
position: 'relative',
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
// Not visible on the screen, can't see it on master.
|
|
|
|
|
|
|
|
// h('i.fa.fa-refresh.fa-4.orange', {
|
|
|
|
// style: {
|
|
|
|
// bottom: '5px',
|
|
|
|
// left: '5px',
|
|
|
|
// color: '#F7861C',
|
|
|
|
// },
|
|
|
|
// onClick: this.updateCoin.bind(this),
|
|
|
|
// }),
|
2016-08-10 22:43:01 +02:00
|
|
|
h('i.fa.fa-chevron-right.fa-4.orange', {
|
|
|
|
style: {
|
2017-08-09 00:17:52 +02:00
|
|
|
position: 'absolute',
|
|
|
|
bottom: '35%',
|
|
|
|
left: '0%',
|
2016-08-10 22:43:01 +02:00
|
|
|
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',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
]),
|
2017-08-09 00:17:52 +02:00
|
|
|
|
2016-08-10 22:43:01 +02:00
|
|
|
h('.flex-column', {
|
|
|
|
style: {
|
2017-08-09 00:17:52 +02:00
|
|
|
marginTop: '1%',
|
2016-08-10 22:43:01 +02:00
|
|
|
alignItems: 'flex-start',
|
|
|
|
},
|
|
|
|
}, [
|
2017-08-09 00:17:52 +02:00
|
|
|
this.props.warning
|
2017-08-29 16:50:48 +02:00
|
|
|
? this.props.warning &&
|
|
|
|
h('span.error.flex-center', {
|
2017-08-09 00:17:52 +02:00
|
|
|
style: {
|
|
|
|
textAlign: 'center',
|
|
|
|
width: '229px',
|
|
|
|
height: '82px',
|
|
|
|
},
|
|
|
|
}, this.props.warning)
|
|
|
|
: this.renderInfo(),
|
|
|
|
|
|
|
|
this.renderRefundAddressForCoin(coin),
|
2016-08-10 22:43:01 +02:00
|
|
|
]),
|
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
])
|
|
|
|
}
|
2017-04-18 18:21:24 +02:00
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
ShapeshiftForm.prototype.renderRefundAddressForCoin = function (coin) {
|
|
|
|
return h(this.activeToggle('.input-container'), {
|
|
|
|
style: {
|
|
|
|
marginTop: '1%',
|
|
|
|
},
|
|
|
|
}, [
|
2016-08-10 22:43:01 +02:00
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
h('div', `${coin} Address:`),
|
2016-08-10 22:43:01 +02:00
|
|
|
|
2017-08-09 00:17:52 +02:00
|
|
|
h('input#fromCoinAddress.buy-inputs', {
|
|
|
|
type: 'text',
|
|
|
|
placeholder: `Your ${coin} Refund Address`,
|
|
|
|
dataset: {
|
|
|
|
persistentFormId: 'refund-address',
|
|
|
|
|
|
|
|
},
|
|
|
|
style: {
|
|
|
|
boxSizing: 'border-box',
|
|
|
|
width: '227px',
|
|
|
|
height: '30px',
|
|
|
|
padding: ' 5px ',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
|
|
|
h('i.fa.fa-pencil-square-o.edit-text', {
|
|
|
|
style: {
|
|
|
|
fontSize: '12px',
|
|
|
|
color: '#F7861C',
|
|
|
|
position: 'absolute',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
h('div.flex-row', {
|
|
|
|
style: {
|
|
|
|
justifyContent: 'flex-start',
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('button', {
|
|
|
|
onClick: this.shift.bind(this),
|
2016-08-13 00:41:59 +02:00
|
|
|
style: {
|
2017-08-09 00:17:52 +02:00
|
|
|
marginTop: '1%',
|
2016-08-13 00:41:59 +02:00
|
|
|
},
|
2017-08-09 00:17:52 +02:00
|
|
|
},
|
|
|
|
'Submit'),
|
2016-08-10 22:43:01 +02:00
|
|
|
]),
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.shift = function () {
|
2016-08-13 02:43:24 +02:00
|
|
|
var props = this.props
|
2016-08-13 00:41:59 +02:00
|
|
|
var withdrawal = this.props.buyView.buyAddress
|
2016-08-10 22:43:01 +02:00
|
|
|
var returnAddress = document.getElementById('fromCoinAddress').value
|
2016-08-13 00:41:59 +02:00
|
|
|
var pair = this.props.buyView.formView.marketinfo.pair
|
2016-08-10 22:43:01 +02:00
|
|
|
var data = {
|
|
|
|
'withdrawal': withdrawal,
|
|
|
|
'pair': pair,
|
|
|
|
'returnAddress': returnAddress,
|
2016-08-18 21:20:24 +02:00
|
|
|
// Public api key
|
|
|
|
'apiKey': '803d1f5df2ed1b1476e4b9e6bcd089e34d8874595dda6a23b67d93c56ea9cc2445e98a6748b219b2b6ad654d9f075f1f1db139abfa93158c04e825db122c14b6',
|
2016-08-10 22:43:01 +02:00
|
|
|
}
|
2016-08-13 02:43:24 +02:00
|
|
|
var message = [
|
|
|
|
`Deposit Limit: ${props.buyView.formView.marketinfo.limit}`,
|
|
|
|
`Deposit Minimum:${props.buyView.formView.marketinfo.minimum}`,
|
|
|
|
]
|
2016-08-10 22:43:01 +02:00
|
|
|
if (isValidAddress(withdrawal)) {
|
2016-08-13 02:43:24 +02:00
|
|
|
this.props.dispatch(actions.coinShiftRquest(data, message))
|
2016-08-10 22:43:01 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.renderCoinList = function () {
|
2016-08-13 00:41:59 +02:00
|
|
|
var list = Object.keys(this.props.buyView.formView.coinOptions).map((item) => {
|
2016-08-10 22:43:01 +02:00
|
|
|
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
|
2016-08-13 00:41:59 +02:00
|
|
|
var coinOptions = this.props.buyView.formView.coinOptions
|
2016-08-10 22:43:01 +02:00
|
|
|
var coin = document.getElementById('fromCoin').value
|
|
|
|
|
|
|
|
if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') {
|
|
|
|
var message = 'Not a valid coin'
|
2016-11-08 01:02:02 +01:00
|
|
|
return props.dispatch(actions.displayWarning(message))
|
2016-08-10 22:43:01 +02:00
|
|
|
} else {
|
|
|
|
return props.dispatch(actions.pairUpdate(coin))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.handleLiveInput = function () {
|
|
|
|
const props = this.props
|
2016-08-13 00:41:59 +02:00
|
|
|
var coinOptions = this.props.buyView.formView.coinOptions
|
2016-08-10 22:43:01 +02:00
|
|
|
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 () {
|
2016-08-13 00:41:59 +02:00
|
|
|
const marketinfo = this.props.buyView.formView.marketinfo
|
|
|
|
const coinOptions = this.props.buyView.formView.coinOptions
|
2016-08-10 22:43:01 +02:00
|
|
|
var coin = marketinfo.pair.split('_')[0].toUpperCase()
|
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
return h('span', {
|
|
|
|
style: {
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('h3.flex-row.text-transform-uppercase', {
|
2016-08-10 22:43:01 +02:00
|
|
|
style: {
|
2016-09-16 06:18:21 +02:00
|
|
|
color: '#868686',
|
2016-08-13 00:41:59 +02:00
|
|
|
paddingTop: '4px',
|
|
|
|
justifyContent: 'space-around',
|
|
|
|
textAlign: 'center',
|
2016-09-16 06:18:21 +02:00
|
|
|
fontSize: '17px',
|
2016-08-10 22:43:01 +02:00
|
|
|
},
|
2016-08-13 00:41:59 +02:00
|
|
|
}, `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}`]),
|
|
|
|
])
|
2016-08-10 22:43:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.activeToggle = function (elementType) {
|
2016-08-13 00:41:59 +02:00
|
|
|
if (!this.props.buyView.formView.response || this.props.warning) return elementType
|
2016-08-10 22:43:01 +02:00
|
|
|
return `${elementType}.inactive`
|
|
|
|
}
|
|
|
|
|
|
|
|
ShapeshiftForm.prototype.renderLoading = function () {
|
|
|
|
return h('span', {
|
|
|
|
style: {
|
|
|
|
position: 'absolute',
|
|
|
|
left: '70px',
|
2016-08-13 00:41:59 +02:00
|
|
|
bottom: '194px',
|
2016-08-10 22:43:01 +02:00
|
|
|
background: 'transparent',
|
|
|
|
width: '229px',
|
|
|
|
height: '82px',
|
|
|
|
display: 'flex',
|
|
|
|
justifyContent: 'center',
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('img', {
|
|
|
|
style: {
|
|
|
|
width: '60px',
|
|
|
|
},
|
|
|
|
src: 'images/loading.svg',
|
|
|
|
}),
|
|
|
|
])
|
|
|
|
}
|