aboutsummaryrefslogblamecommitdiffstats
path: root/ui/app/components/ens-input.js
blob: f5edab9fd3b2aced22d4c5d42d6f37d5c4e34b50 (plain) (tree)


































































































































                                                                             
const Component = require('react').Component
const h = require('react-hyperscript')
const inherits = require('util').inherits
const extend = require('xtend')
const debounce = require('debounce')
const ENS = require('ethereum-ens')
const ensRE = /.+\.eth$/

const networkResolvers = {
  '3': '112234455c3a32fd11230c42e7bccd4a84e02010',
}

module.exports = EnsInput

inherits(EnsInput, Component)
function EnsInput () {
  Component.call(this)
}

EnsInput.prototype.render = function () {
  const props = this.props
  const opts = extend(props, {
    onChange: () => {
      const network = this.props.network
      let resolverAddress = networkResolvers[network]
      if (!resolverAddress) return

      const recipient = document.querySelector('input[name="address"]').value
      if (recipient.match(ensRE) === null) {
        console.dir(recipient)
        return this.setState({
          loadingEns: false,
        })
      }

      this.setState({
        loadingEns: true,
      })
      this.checkName()
    },
  })

  return h('div', {
    style: { width: '100%' },
  }, [
    h('input.large-input', opts),
    this.ensIcon(),
  ])
}

EnsInput.prototype.componentDidMount = function () {
  const network = this.props.network
  let resolverAddress = networkResolvers[network]

  if (resolverAddress) {
    this.ens = new ENS(web3, resolverAddress)
    this.checkName = debounce(this.lookupEnsName.bind(this), 200)
  }
}

EnsInput.prototype.lookupEnsName = function () {
  if (!this.ens) {
    return this.setState({
      loadingEns: false,
      ensFailure: true,
      hoverText: 'ENS is not supported on your current network.',
    })
  }

  const recipient = document.querySelector('input[name="address"]').value
  log.info(`ENS attempting to resolve name: ${recipient}`)
  this.ens.resolver(recipient).addr()
  .then((address) => {
    this.setState({
      loadingEns: false,
      ensResolution: address,
      hoverText: address,
    })
  })
  .catch((reason) => {
    return this.setState({
      loadingEns: false,
      ensFailure: true,
      hoverText: reason.message,
    })
  })
}

EnsInput.prototype.componentDidUpdate = function () {
  const state = this.state || {}
  const { ensResolution } = state
  if (ensResolution && this.props.onChange) {
    this.props.onChange(ensResolution)
  }
}

EnsInput.prototype.ensIcon = function (recipient) {
  const { hoverText } = this.state || {}
  return h('span', {
    title: hoverText,
    style: {
      position: 'absolute',
      padding: '9px',
      transform: 'translatex(-40px)',
    },
  }, this.ensIconContents(recipient))
}

EnsInput.prototype.ensIconContents = function (recipient) {
  const { loadingEns, ensFailure, ensResolution } = this.state || {}

  if (loadingEns) {
    return h('img', {
      src: 'images/loading.svg',
      style: {
        width: '30px',
        height: '30px',
      },
    })
  }

  if (ensFailure) {
    return h('i.fa.fa-warning.fa-lg.warning')
  }

  if (ensResolution) {
    return h('i.fa.fa-check-circle.fa-lg', {
      style: { color: 'green' },
    })
  }
}