Merge pull request #4715 from BitGuildPlatform/to-autocomplete
fixes #4664feature/default_network_editable
commit
f31e87dcd5
@ -0,0 +1,141 @@ |
||||
import React, {Component} from 'react' |
||||
import PropTypes from 'prop-types' |
||||
import classnames from 'classnames' |
||||
import AccountListItem from '../send_/account-list-item/account-list-item.component' |
||||
|
||||
|
||||
export default class ToAutoComplete extends Component { |
||||
|
||||
static propTypes = { |
||||
dropdownOpen: PropTypes.bool, |
||||
openDropdown: PropTypes.func, |
||||
closeDropdown: PropTypes.func, |
||||
onChange: PropTypes.func, |
||||
to: PropTypes.string, |
||||
accounts: PropTypes.array, |
||||
inError: PropTypes.bool, |
||||
} |
||||
|
||||
static contextTypes = { |
||||
t: PropTypes.func, |
||||
} |
||||
|
||||
state = { |
||||
accountsToRender: [], |
||||
} |
||||
|
||||
getListItemIcon (listItemAddress, toAddress) { |
||||
return toAddress && listItemAddress === toAddress |
||||
? <i className={'fa fa-check fa-lg'} |
||||
style={{ |
||||
color: '#02c9b1', |
||||
}} |
||||
/> |
||||
: null |
||||
} |
||||
|
||||
renderDropdown () { |
||||
const { |
||||
closeDropdown, |
||||
onChange, |
||||
to, |
||||
} = this.props |
||||
const {accountsToRender} = this.state |
||||
|
||||
if (!accountsToRender.length) { |
||||
return null |
||||
} |
||||
|
||||
return ( |
||||
<div> |
||||
<div className={'send-v2__from-dropdown__close-area'} onClick={closeDropdown} /> |
||||
<div className={'send-v2__from-dropdown__list'}> |
||||
{accountsToRender.map((account, i) => ( |
||||
<AccountListItem |
||||
key={i} |
||||
account={account} |
||||
className={'account-list-item__dropdown'} |
||||
handleClick={() => { |
||||
onChange(account.address) |
||||
closeDropdown() |
||||
}} |
||||
icon={this.getListItemIcon(account.address, to)} |
||||
displayBalance={false} |
||||
displayAddress={true} |
||||
/> |
||||
))} |
||||
</div> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
handleInputEvent (event = {}, cb) { |
||||
const { |
||||
to, |
||||
accounts, |
||||
closeDropdown, |
||||
openDropdown, |
||||
} = this.props |
||||
|
||||
const matchingAccounts = accounts.filter(({address}) => address.match(to || '')) |
||||
const matches = matchingAccounts.length |
||||
|
||||
if (!matches || matchingAccounts[0].address === to) { |
||||
this.setState({accountsToRender: []}) |
||||
event.target && event.target.select() |
||||
closeDropdown() |
||||
} else { |
||||
this.setState({accountsToRender: matchingAccounts}) |
||||
openDropdown() |
||||
} |
||||
cb && cb(event.target.value) |
||||
} |
||||
|
||||
componentDidUpdate (nextProps) { |
||||
if (this.props.to !== nextProps.to) { |
||||
this.handleInputEvent() |
||||
} |
||||
} |
||||
|
||||
render () { |
||||
const { |
||||
to, |
||||
dropdownOpen, |
||||
onChange, |
||||
inError, |
||||
} = this.props |
||||
|
||||
return ( |
||||
<div className={'send-v2__to-autocomplete'}> |
||||
<input |
||||
className={classnames('send-v2__to-autocomplete__input', { |
||||
'send-v2__error-border': inError, |
||||
})} |
||||
placeholder={this.context.t('recipientAddress')} |
||||
value={to} |
||||
onChange={event => onChange(event.target.value)} |
||||
onFocus={event => this.handleInputEvent(event)} |
||||
style={{ |
||||
borderColor: inError ? 'red' : null, |
||||
}} |
||||
/> |
||||
{ |
||||
to |
||||
? null |
||||
: <i className={'fa fa-caret-down fa-lg send-v2__to-autocomplete__down-caret'} |
||||
onClick={() => this.handleInputEvent()} |
||||
style={{ |
||||
style: {color: '#dedede'}, |
||||
}} |
||||
/> |
||||
} |
||||
{ |
||||
dropdownOpen |
||||
? this.renderDropdown() |
||||
: null |
||||
} |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
} |
@ -1,120 +0,0 @@ |
||||
const Component = require('react').Component |
||||
const PropTypes = require('prop-types') |
||||
const h = require('react-hyperscript') |
||||
const inherits = require('util').inherits |
||||
const AccountListItem = require('../send_/account-list-item/account-list-item.component').default |
||||
const connect = require('react-redux').connect |
||||
|
||||
ToAutoComplete.contextTypes = { |
||||
t: PropTypes.func, |
||||
} |
||||
|
||||
module.exports = connect()(ToAutoComplete) |
||||
|
||||
|
||||
inherits(ToAutoComplete, Component) |
||||
function ToAutoComplete () { |
||||
Component.call(this) |
||||
|
||||
this.state = { accountsToRender: [] } |
||||
} |
||||
|
||||
ToAutoComplete.prototype.getListItemIcon = function (listItemAddress, toAddress) { |
||||
const listItemIcon = h(`i.fa.fa-check.fa-lg`, { style: { color: '#02c9b1' } }) |
||||
|
||||
return toAddress && listItemAddress === toAddress |
||||
? listItemIcon |
||||
: null |
||||
} |
||||
|
||||
ToAutoComplete.prototype.renderDropdown = function () { |
||||
const { |
||||
closeDropdown, |
||||
onChange, |
||||
to, |
||||
} = this.props |
||||
const { accountsToRender } = this.state |
||||
|
||||
return accountsToRender.length && h('div', {}, [ |
||||
|
||||
h('div.send-v2__from-dropdown__close-area', { |
||||
onClick: closeDropdown, |
||||
}), |
||||
|
||||
h('div.send-v2__from-dropdown__list', {}, [ |
||||
|
||||
...accountsToRender.map(account => h(AccountListItem, { |
||||
account, |
||||
className: 'account-list-item__dropdown', |
||||
handleClick: () => { |
||||
onChange(account.address) |
||||
closeDropdown() |
||||
}, |
||||
icon: this.getListItemIcon(account.address, to), |
||||
displayBalance: false, |
||||
displayAddress: true, |
||||
})), |
||||
|
||||
]), |
||||
|
||||
]) |
||||
} |
||||
|
||||
ToAutoComplete.prototype.handleInputEvent = function (event = {}, cb) { |
||||
const { |
||||
to, |
||||
accounts, |
||||
closeDropdown, |
||||
openDropdown, |
||||
} = this.props |
||||
|
||||
const matchingAccounts = accounts.filter(({ address }) => address.match(to || '')) |
||||
const matches = matchingAccounts.length |
||||
|
||||
if (!matches || matchingAccounts[0].address === to) { |
||||
this.setState({ accountsToRender: [] }) |
||||
event.target && event.target.select() |
||||
closeDropdown() |
||||
} else { |
||||
this.setState({ accountsToRender: matchingAccounts }) |
||||
openDropdown() |
||||
} |
||||
cb && cb(event.target.value) |
||||
} |
||||
|
||||
ToAutoComplete.prototype.componentDidUpdate = function (nextProps, nextState) { |
||||
if (this.props.to !== nextProps.to) { |
||||
this.handleInputEvent() |
||||
} |
||||
} |
||||
|
||||
ToAutoComplete.prototype.render = function () { |
||||
const { |
||||
to, |
||||
dropdownOpen, |
||||
onChange, |
||||
inError, |
||||
} = this.props |
||||
|
||||
return h('div.send-v2__to-autocomplete', {}, [ |
||||
|
||||
h('input.send-v2__to-autocomplete__input', { |
||||
placeholder: this.context.t('recipientAddress'), |
||||
className: inError ? `send-v2__error-border` : '', |
||||
value: to, |
||||
onChange: event => onChange(event.target.value), |
||||
onFocus: event => this.handleInputEvent(event), |
||||
style: { |
||||
borderColor: inError ? 'red' : null, |
||||
}, |
||||
}), |
||||
|
||||
!to && h(`i.fa.fa-caret-down.fa-lg.send-v2__to-autocomplete__down-caret`, { |
||||
style: { color: '#dedede' }, |
||||
onClick: () => this.handleInputEvent(), |
||||
}), |
||||
|
||||
dropdownOpen && this.renderDropdown(), |
||||
|
||||
]) |
||||
} |
Loading…
Reference in new issue