diff --git a/js/src/ui/Form/AddressSelect/addressSelect.js b/js/src/ui/Form/AddressSelect/addressSelect.js index ca4e1f524..ba48b6489 100644 --- a/js/src/ui/Form/AddressSelect/addressSelect.js +++ b/js/src/ui/Form/AddressSelect/addressSelect.js @@ -215,8 +215,9 @@ class AddressSelect extends Component { } const { address, addressError } = validateAddress(inputValue); + const { registryValues } = this.store; - if (addressError) { + if (addressError || registryValues.length > 0) { return null; } diff --git a/js/src/ui/Form/AddressSelect/addressSelectStore.js b/js/src/ui/Form/AddressSelect/addressSelectStore.js index b6827b9cc..26f9fe80e 100644 --- a/js/src/ui/Form/AddressSelect/addressSelectStore.js +++ b/js/src/ui/Form/AddressSelect/addressSelectStore.js @@ -22,6 +22,8 @@ import { FormattedMessage } from 'react-intl'; import Contracts from '~/contracts'; import { sha3 } from '~/api/util/sha3'; +const ZERO = /^(0x)?0*$/; + export default class AddressSelectStore { @observable values = []; @@ -38,41 +40,75 @@ export default class AddressSelectStore { registry .getContract('emailverification') .then((emailVerification) => { - this.regLookups.push({ - lookup: (value) => { - return emailVerification - .instance - .reverse.call({}, [ sha3(value) ]); - }, - describe: (value) => ( - - ) + this.regLookups.push((email) => { + return emailVerification + .instance + .reverse + .call({}, [ sha3(email) ]) + .then((address) => { + return { + address, + description: ( + + ) + }; + }); }); }); registry .getInstance() .then((registryInstance) => { - this.regLookups.push({ - lookup: (value) => { - return registryInstance - .getAddress.call({}, [ sha3(value), 'A' ]); - }, - describe: (value) => ( - - ) + this.regLookups.push((name) => { + return registryInstance + .getAddress + .call({}, [ sha3(name), 'A' ]) + .then((address) => { + return { + address, + name, + description: ( + + ) + }; + }); + }); + + this.regLookups.push((address) => { + return registryInstance + .reverse + .call({}, [ address ]) + .then((name) => { + if (!name) { + return null; + } + + return { + address, + name, + description: ( + + ) + }; + }); }); }); } @@ -149,32 +185,30 @@ export default class AddressSelectStore { // Registries Lookup this.registryValues = []; - const lookups = this.regLookups.map((regLookup) => regLookup.lookup(value)); + const lookups = this.regLookups.map((regLookup) => regLookup(value)); Promise .all(lookups) .then((results) => { return results - .map((result, index) => { - if (/^(0x)?0*$/.test(result)) { - return; - } - - const lowercaseResult = result.toLowerCase(); + .filter((result) => result && !ZERO.test(result.address)); + }) + .then((results) => { + this.registryValues = results + .map((result) => { + const lowercaseAddress = result.address.toLowerCase(); const account = flatMap(this.initValues, (cat) => cat.values) - .find((account) => account.address.toLowerCase() === lowercaseResult); + .find((account) => account.address.toLowerCase() === lowercaseAddress); - return { - description: this.regLookups[index].describe(value), - address: result, - name: account && account.name || value - }; - }) - .filter((data) => data); - }) - .then((registryValues) => { - this.registryValues = registryValues; + if (account && account.name) { + result.name = account.name; + } else if (!result.name) { + result.name = value; + } + + return result; + }); }); }