diff --git a/ui/app/components/bn-as-decimal-input.js b/ui/app/components/bn-as-decimal-input.js
deleted file mode 100644
index 9a033f893..000000000
--- a/ui/app/components/bn-as-decimal-input.js
+++ /dev/null
@@ -1,188 +0,0 @@
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const ethUtil = require('ethereumjs-util')
-const BN = ethUtil.BN
-const extend = require('xtend')
-const connect = require('react-redux').connect
-
-BnAsDecimalInput.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect()(BnAsDecimalInput)
-
-
-inherits(BnAsDecimalInput, Component)
-function BnAsDecimalInput () {
- this.state = { invalid: null }
- Component.call(this)
-}
-
-/* Bn as Decimal Input
- *
- * A component for allowing easy, decimal editing
- * of a passed in bn string value.
- *
- * On change, calls back its `onChange` function parameter
- * and passes it an updated bn string.
- */
-
-BnAsDecimalInput.prototype.render = function () {
- const props = this.props
- const state = this.state
-
- const { value, scale, precision, onChange, min, max } = props
-
- const suffix = props.suffix
- const style = props.style
- const valueString = value.toString(10)
- const newMin = min && this.downsize(min.toString(10), scale)
- const newMax = max && this.downsize(max.toString(10), scale)
- const newValue = this.downsize(valueString, scale)
-
- return (
- h('.flex-column', [
- h('.flex-row', {
- style: {
- alignItems: 'flex-end',
- lineHeight: '13px',
- fontFamily: 'Montserrat Light',
- textRendering: 'geometricPrecision',
- },
- }, [
- h('input.hex-input', {
- type: 'number',
- step: 'any',
- required: true,
- min: newMin,
- max: newMax,
- style: extend({
- display: 'block',
- textAlign: 'right',
- backgroundColor: 'transparent',
- border: '1px solid #bdbdbd',
-
- }, style),
- value: newValue,
- onBlur: (event) => {
- this.updateValidity(event)
- },
- onChange: (event) => {
- this.updateValidity(event)
- const value = (event.target.value === '') ? '' : event.target.value
-
-
- const scaledNumber = this.upsize(value, scale, precision)
- const precisionBN = new BN(scaledNumber, 10)
- onChange(precisionBN, event.target.checkValidity())
- },
- onInvalid: (event) => {
- const msg = this.constructWarning()
- if (msg === state.invalid) {
- return
- }
- this.setState({ invalid: msg })
- event.preventDefault()
- return false
- },
- }),
- h('div', {
- style: {
- color: ' #AEAEAE',
- fontSize: '12px',
- marginLeft: '5px',
- marginRight: '6px',
- width: '20px',
- },
- }, suffix),
- ]),
-
- state.invalid ? h('span.error', {
- style: {
- position: 'absolute',
- right: '0px',
- textAlign: 'right',
- transform: 'translateY(26px)',
- padding: '3px',
- background: 'rgba(255,255,255,0.85)',
- zIndex: '1',
- textTransform: 'capitalize',
- border: '2px solid #E20202',
- },
- }, state.invalid) : null,
- ])
- )
-}
-
-BnAsDecimalInput.prototype.setValid = function (message) {
- this.setState({ invalid: null })
-}
-
-BnAsDecimalInput.prototype.updateValidity = function (event) {
- const target = event.target
- const value = this.props.value
- const newValue = target.value
-
- if (value === newValue) {
- return
- }
-
- const valid = target.checkValidity()
-
- if (valid) {
- this.setState({ invalid: null })
- }
-}
-
-BnAsDecimalInput.prototype.constructWarning = function () {
- const { name, min, max, scale, suffix } = this.props
- const newMin = min && this.downsize(min.toString(10), scale)
- const newMax = max && this.downsize(max.toString(10), scale)
- let message = name ? name + ' ' : ''
-
- if (min && max) {
- message += this.context.t('betweenMinAndMax', [`${newMin} ${suffix}`, `${newMax} ${suffix}`])
- } else if (min) {
- message += this.context.t('greaterThanMin', [`${newMin} ${suffix}`])
- } else if (max) {
- message += this.context.t('lessThanMax', [`${newMax} ${suffix}`])
- } else {
- message += this.context.t('invalidInput')
- }
-
- return message
-}
-
-
-BnAsDecimalInput.prototype.downsize = function (number, scale) {
- // if there is no scaling, simply return the number
- if (scale === 0) {
- return Number(number)
- } else {
- // if the scale is the same as the precision, account for this edge case.
- var adjustedNumber = number
- while (adjustedNumber.length < scale) {
- adjustedNumber = '0' + adjustedNumber
- }
- return Number(adjustedNumber.slice(0, -scale) + '.' + adjustedNumber.slice(-scale))
- }
-}
-
-BnAsDecimalInput.prototype.upsize = function (number, scale, precision) {
- var stringArray = number.toString().split('.')
- var decimalLength = stringArray[1] ? stringArray[1].length : 0
- var newString = stringArray[0]
-
- // If there is scaling and decimal parts exist, integrate them in.
- if ((scale !== 0) && (decimalLength !== 0)) {
- newString += stringArray[1].slice(0, precision)
- }
-
- // Add 0s to account for the upscaling.
- for (var i = decimalLength; i < scale; i++) {
- newString += '0'
- }
- return newString
-}
diff --git a/ui/app/components/coinbase-form.js b/ui/app/components/coinbase-form.js
deleted file mode 100644
index d5915292e..000000000
--- a/ui/app/components/coinbase-form.js
+++ /dev/null
@@ -1,69 +0,0 @@
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const connect = require('react-redux').connect
-const actions = require('../actions')
-
-CoinbaseForm.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect(mapStateToProps)(CoinbaseForm)
-
-
-function mapStateToProps (state) {
- return {
- warning: state.appState.warning,
- }
-}
-
-inherits(CoinbaseForm, Component)
-
-function CoinbaseForm () {
- Component.call(this)
-}
-
-CoinbaseForm.prototype.render = function () {
- var props = this.props
-
- return h('.flex-column', {
- style: {
- marginTop: '35px',
- padding: '25px',
- width: '100%',
- },
- }, [
- h('.flex-row', {
- style: {
- justifyContent: 'space-around',
- margin: '33px',
- marginTop: '0px',
- },
- }, [
- h('button.btn-green', {
- onClick: this.toCoinbase.bind(this),
- }, this.context.t('continueToCoinbase')),
-
- h('button.btn-red', {
- onClick: () => props.dispatch(actions.goHome()),
- }, this.context.t('cancel')),
- ]),
- ])
-}
-
-CoinbaseForm.prototype.toCoinbase = function () {
- const props = this.props
- const address = props.buyView.buyAddress
- props.dispatch(actions.buyEth({ network: '1', address, amount: 0 }))
-}
-
-CoinbaseForm.prototype.renderLoading = function () {
- return h('img', {
- style: {
- width: '27px',
- marginRight: '-27px',
- },
- src: 'images/loading.svg',
- })
-}
diff --git a/ui/app/components/editable-label.js b/ui/app/components/editable-label.js
deleted file mode 100644
index eb41ec50c..000000000
--- a/ui/app/components/editable-label.js
+++ /dev/null
@@ -1,88 +0,0 @@
-const { Component } = require('react')
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const classnames = require('classnames')
-
-class EditableLabel extends Component {
- constructor (props) {
- super(props)
-
- this.state = {
- isEditing: false,
- value: props.defaultValue || '',
- }
- }
-
- handleSubmit () {
- const { value } = this.state
-
- if (value === '') {
- return
- }
-
- Promise.resolve(this.props.onSubmit(value))
- .then(() => this.setState({ isEditing: false }))
- }
-
- saveIfEnter (event) {
- if (event.key === 'Enter') {
- this.handleSubmit()
- }
- }
-
- renderEditing () {
- const { value } = this.state
-
- return ([
- h('input.large-input.editable-label__input', {
- type: 'text',
- required: true,
- value: this.state.value,
- onKeyPress: (event) => {
- if (event.key === 'Enter') {
- this.handleSubmit()
- }
- },
- onChange: event => this.setState({ value: event.target.value }),
- className: classnames({ 'editable-label__input--error': value === '' }),
- }),
- h('div.editable-label__icon-wrapper', [
- h('i.fa.fa-check.editable-label__icon', {
- onClick: () => this.handleSubmit(),
- }),
- ]),
- ])
- }
-
- renderReadonly () {
- return ([
- h('div.editable-label__value', this.state.value),
- h('div.editable-label__icon-wrapper', [
- h('i.fa.fa-pencil.editable-label__icon', {
- onClick: () => this.setState({ isEditing: true }),
- }),
- ]),
- ])
- }
-
- render () {
- const { isEditing } = this.state
- const { className } = this.props
-
- return (
- h('div.editable-label', { className: classnames(className) },
- isEditing
- ? this.renderEditing()
- : this.renderReadonly()
- )
- )
- }
-}
-
-EditableLabel.propTypes = {
- onSubmit: PropTypes.func.isRequired,
- defaultValue: PropTypes.string,
- className: PropTypes.string,
-}
-
-module.exports = EditableLabel
diff --git a/ui/app/components/ens-input.js b/ui/app/components/ens-input.js
deleted file mode 100644
index f538fd555..000000000
--- a/ui/app/components/ens-input.js
+++ /dev/null
@@ -1,181 +0,0 @@
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const extend = require('xtend')
-const debounce = require('debounce')
-const copyToClipboard = require('copy-to-clipboard')
-const ENS = require('ethjs-ens')
-const networkMap = require('ethjs-ens/lib/network-map.json')
-const ensRE = /.+\..+$/
-const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
-const connect = require('react-redux').connect
-const ToAutoComplete = require('./send/to-autocomplete').default
-const log = require('loglevel')
-const { isValidENSAddress } = require('../util')
-
-EnsInput.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect()(EnsInput)
-
-
-inherits(EnsInput, Component)
-function EnsInput () {
- Component.call(this)
-}
-
-EnsInput.prototype.onChange = function (recipient) {
-
- const network = this.props.network
- const networkHasEnsSupport = getNetworkEnsSupport(network)
-
- this.props.onChange({ toAddress: recipient })
-
- if (!networkHasEnsSupport) return
-
- if (recipient.match(ensRE) === null) {
- return this.setState({
- loadingEns: false,
- ensResolution: null,
- ensFailure: null,
- toError: null,
- })
- }
-
- this.setState({
- loadingEns: true,
- })
- this.checkName(recipient)
-}
-
-EnsInput.prototype.render = function () {
- const props = this.props
- const opts = extend(props, {
- list: 'addresses',
- onChange: this.onChange.bind(this),
- qrScanner: true,
- })
- return h('div', {
- style: { width: '100%', position: 'relative' },
- }, [
- h(ToAutoComplete, { ...opts }),
- this.ensIcon(),
- ])
-}
-
-EnsInput.prototype.componentDidMount = function () {
- const network = this.props.network
- const networkHasEnsSupport = getNetworkEnsSupport(network)
- this.setState({ ensResolution: ZERO_ADDRESS })
-
- if (networkHasEnsSupport) {
- const provider = global.ethereumProvider
- this.ens = new ENS({ provider, network })
- this.checkName = debounce(this.lookupEnsName.bind(this), 200)
- }
-}
-
-EnsInput.prototype.lookupEnsName = function (recipient) {
- const { ensResolution } = this.state
-
- log.info(`ENS attempting to resolve name: ${recipient}`)
- this.ens.lookup(recipient.trim())
- .then((address) => {
- if (address === ZERO_ADDRESS) throw new Error(this.context.t('noAddressForName'))
- if (address !== ensResolution) {
- this.setState({
- loadingEns: false,
- ensResolution: address,
- nickname: recipient.trim(),
- hoverText: address + '\n' + this.context.t('clickCopy'),
- ensFailure: false,
- toError: null,
- })
- }
- })
- .catch((reason) => {
- const setStateObj = {
- loadingEns: false,
- ensResolution: recipient,
- ensFailure: true,
- toError: null,
- }
- if (isValidENSAddress(recipient) && reason.message === 'ENS name not defined.') {
- setStateObj.hoverText = this.context.t('ensNameNotFound')
- setStateObj.toError = 'ensNameNotFound'
- setStateObj.ensFailure = false
- } else {
- log.error(reason)
- setStateObj.hoverText = reason.message
- }
-
- return this.setState(setStateObj)
- })
-}
-
-EnsInput.prototype.componentDidUpdate = function (prevProps, prevState) {
- const state = this.state || {}
- const ensResolution = state.ensResolution
- // If an address is sent without a nickname, meaning not from ENS or from
- // the user's own accounts, a default of a one-space string is used.
- const nickname = state.nickname || ' '
- if (prevProps.network !== this.props.network) {
- const provider = global.ethereumProvider
- this.ens = new ENS({ provider, network: this.props.network })
- this.onChange(ensResolution)
- }
- if (prevState && ensResolution && this.props.onChange &&
- ensResolution !== prevState.ensResolution) {
- this.props.onChange({ toAddress: ensResolution, nickname, toError: state.toError })
- }
-}
-
-EnsInput.prototype.ensIcon = function (recipient) {
- const { hoverText } = this.state || {}
- return h('span.#ensIcon', {
- title: hoverText,
- style: {
- position: 'absolute',
- top: '16px',
- left: '-25px',
- },
- }, this.ensIconContents(recipient))
-}
-
-EnsInput.prototype.ensIconContents = function (recipient) {
- const { loadingEns, ensFailure, ensResolution, toError } = this.state || { ensResolution: ZERO_ADDRESS }
-
- if (toError) return
-
- if (loadingEns) {
- return h('img', {
- src: 'images/loading.svg',
- style: {
- width: '30px',
- height: '30px',
- transform: 'translateY(-6px)',
- },
- })
- }
-
- if (ensFailure) {
- return h('i.fa.fa-warning.fa-lg.warning')
- }
-
- if (ensResolution && (ensResolution !== ZERO_ADDRESS)) {
- return h('i.fa.fa-check-circle.fa-lg.cursor-pointer', {
- style: { color: 'green' },
- onClick: (event) => {
- event.preventDefault()
- event.stopPropagation()
- copyToClipboard(ensResolution)
- },
- })
- }
-}
-
-function getNetworkEnsSupport (network) {
- return Boolean(networkMap[network])
-}
diff --git a/ui/app/components/eth-balance.js b/ui/app/components/eth-balance.js
deleted file mode 100644
index c3d084bdc..000000000
--- a/ui/app/components/eth-balance.js
+++ /dev/null
@@ -1,96 +0,0 @@
-const { Component } = require('react')
-const h = require('react-hyperscript')
-const { inherits } = require('util')
-const {
- formatBalance,
- generateBalanceObject,
-} = require('../util')
-const Tooltip = require('./tooltip.js')
-const FiatValue = require('./fiat-value.js')
-
-module.exports = EthBalanceComponent
-
-inherits(EthBalanceComponent, Component)
-function EthBalanceComponent () {
- Component.call(this)
-}
-
-EthBalanceComponent.prototype.render = function () {
- const props = this.props
- const { value, style, width, needsParse = true } = props
-
- const formattedValue = value ? formatBalance(value, 6, needsParse) : '...'
-
- return (
-
- h('.ether-balance.ether-balance-amount', {
- style,
- }, [
- h('div', {
- style: {
- display: 'inline',
- width,
- },
- }, this.renderBalance(formattedValue)),
- ])
-
- )
-}
-EthBalanceComponent.prototype.renderBalance = function (value) {
- if (value === 'None') return value
- if (value === '...') return value
-
- const {
- conversionRate,
- shorten,
- incoming,
- currentCurrency,
- hideTooltip,
- styleOveride = {},
- showFiat = true,
- } = this.props
- const { fontSize, color, fontFamily, lineHeight } = styleOveride
-
- const { shortBalance, balance, label } = generateBalanceObject(value, shorten ? 1 : 3)
- const balanceToRender = shorten ? shortBalance : balance
-
- const [ethNumber, ethSuffix] = value.split(' ')
- const containerProps = hideTooltip ? {} : {
- position: 'bottom',
- title: `${ethNumber} ${ethSuffix}`,
- }
-
- return (
- h(hideTooltip ? 'div' : Tooltip,
- containerProps,
- h('div.flex-column', [
- h('.flex-row', {
- style: {
- alignItems: 'flex-end',
- lineHeight: lineHeight || '13px',
- fontFamily: fontFamily || 'Montserrat Light',
- textRendering: 'geometricPrecision',
- },
- }, [
- h('div', {
- style: {
- width: '100%',
- textAlign: 'right',
- fontSize: fontSize || 'inherit',
- color: color || 'inherit',
- },
- }, incoming ? `+${balanceToRender}` : balanceToRender),
- h('div', {
- style: {
- color: color || '#AEAEAE',
- fontSize: fontSize || '12px',
- marginLeft: '5px',
- },
- }, label),
- ]),
-
- showFiat ? h(FiatValue, { value: this.props.value, conversionRate, currentCurrency }) : null,
- ])
- )
- )
-}
diff --git a/ui/app/components/export-text-container/export-text-container.component.js b/ui/app/components/export-text-container/export-text-container.component.js
deleted file mode 100644
index c2546fa9b..000000000
--- a/ui/app/components/export-text-container/export-text-container.component.js
+++ /dev/null
@@ -1,45 +0,0 @@
-const { Component } = require('react')
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const copyToClipboard = require('copy-to-clipboard')
-const { exportAsFile } = require('../../util')
-
-class ExportTextContainer extends Component {
- render () {
- const { text = '', filename = '' } = this.props
- const { t } = this.context
-
- return (
- h('.export-text-container', [
- h('.export-text-container__text-container', [
- h('.export-text-container__text', text),
- ]),
- h('.export-text-container__buttons-container', [
- h('.export-text-container__button.export-text-container__button--copy', {
- onClick: () => copyToClipboard(text),
- }, [
- h('img', { src: 'images/copy-to-clipboard.svg' }),
- h('.export-text-container__button-text', t('copyToClipboard')),
- ]),
- h('.export-text-container__button', {
- onClick: () => exportAsFile(filename, text),
- }, [
- h('img', { src: 'images/download.svg' }),
- h('.export-text-container__button-text', t('saveAsCsvFile')),
- ]),
- ]),
- ])
- )
- }
-}
-
-ExportTextContainer.propTypes = {
- text: PropTypes.string,
- filename: PropTypes.string,
-}
-
-ExportTextContainer.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = ExportTextContainer
diff --git a/ui/app/components/export-text-container/index.js b/ui/app/components/export-text-container/index.js
deleted file mode 100644
index b2864a717..000000000
--- a/ui/app/components/export-text-container/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-const ExportTextContainer = require('./export-text-container.component')
-module.exports = ExportTextContainer
diff --git a/ui/app/components/export-text-container/index.scss b/ui/app/components/export-text-container/index.scss
deleted file mode 100644
index 975d62f70..000000000
--- a/ui/app/components/export-text-container/index.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-.export-text-container {
- display: flex;
- justify-content: center;
- flex-direction: column;
- align-items: center;
- border: 1px solid $alto;
- border-radius: 4px;
- font-weight: 400;
-
- &__text-container {
- width: 100%;
- display: flex;
- justify-content: center;
- padding: 20px;
- border-radius: 4px;
- background: $alabaster;
- }
-
- &__text {
- resize: none;
- border: none;
- background: $alabaster;
- font-size: 20px;
- text-align: center;
- }
-
- &__buttons-container {
- display: flex;
- flex-direction: row;
- border-top: 1px solid $alto;
- width: 100%;
- }
-
- &__button {
- padding: 10px;
- flex: 1;
- display: flex;
- justify-content: center;
- align-items: center;
- font-size: 12px;
- cursor: pointer;
- color: $curious-blue;
-
- &--copy {
- border-right: 1px solid $alto;
- }
- }
-
- &__button-text {
- padding-left: 10px;
- }
-}
diff --git a/ui/app/components/fiat-value.js b/ui/app/components/fiat-value.js
deleted file mode 100644
index 56465fc9d..000000000
--- a/ui/app/components/fiat-value.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const Component = require('react').Component
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const formatBalance = require('../util').formatBalance
-
-module.exports = FiatValue
-
-inherits(FiatValue, Component)
-function FiatValue () {
- Component.call(this)
-}
-
-FiatValue.prototype.render = function () {
- const props = this.props
- const { conversionRate, currentCurrency, style } = props
- const renderedCurrency = currentCurrency || ''
-
- const value = formatBalance(props.value, 6)
-
- if (value === 'None') return value
- var fiatDisplayNumber, fiatTooltipNumber
- var splitBalance = value.split(' ')
-
- if (conversionRate !== 0) {
- fiatTooltipNumber = Number(splitBalance[0]) * conversionRate
- fiatDisplayNumber = fiatTooltipNumber.toFixed(2)
- } else {
- fiatDisplayNumber = 'N/A'
- fiatTooltipNumber = 'Unknown'
- }
-
- return fiatDisplay(fiatDisplayNumber, renderedCurrency.toUpperCase(), style)
-}
-
-function fiatDisplay (fiatDisplayNumber, fiatSuffix, styleOveride = {}) {
- const { fontSize, color, fontFamily, lineHeight } = styleOveride
-
- if (fiatDisplayNumber !== 'N/A') {
- return h('.flex-row', {
- style: {
- alignItems: 'flex-end',
- lineHeight: lineHeight || '13px',
- fontFamily: fontFamily || 'Montserrat Light',
- textRendering: 'geometricPrecision',
- },
- }, [
- h('div', {
- style: {
- width: '100%',
- textAlign: 'right',
- fontSize: fontSize || '12px',
- color: color || '#333333',
- },
- }, fiatDisplayNumber),
- h('div', {
- style: {
- color: color || '#AEAEAE',
- marginLeft: '5px',
- fontSize: fontSize || '12px',
- },
- }, fiatSuffix),
- ])
- } else {
- return h('div')
- }
-}
diff --git a/ui/app/components/info-box/index.js b/ui/app/components/info-box/index.js
deleted file mode 100644
index 6110422ed..000000000
--- a/ui/app/components/info-box/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import InfoBox from './info-box.component'
-module.exports = InfoBox
diff --git a/ui/app/components/info-box/index.scss b/ui/app/components/info-box/index.scss
deleted file mode 100644
index 8b5626d79..000000000
--- a/ui/app/components/info-box/index.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-.info-box {
- border-radius: 4px;
- background-color: $alabaster;
- position: relative;
- padding: 16px;
- display: flex;
- flex-flow: column;
- color: $mid-gray;
-
- &__close::after {
- content: '\00D7';
- font-size: 29px;
- font-weight: 200;
- color: $dusty-gray;
- position: absolute;
- right: 12px;
- top: 0;
- cursor: pointer;
- }
-
- &__description {
- font-size: .75rem;
- }
-}
diff --git a/ui/app/components/info-box/info-box.component.js b/ui/app/components/info-box/info-box.component.js
deleted file mode 100644
index 8688b8e8f..000000000
--- a/ui/app/components/info-box/info-box.component.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import React, { Component } from 'react'
-import PropTypes from 'prop-types'
-
-export default class InfoBox extends Component {
- static contextTypes = {
- t: PropTypes.func,
- }
-
- static propTypes = {
- onClose: PropTypes.func,
- title: PropTypes.string,
- description: PropTypes.string,
- }
-
- constructor (props) {
- super(props)
-
- this.state = {
- isShowing: true,
- }
- }
-
- handleClose () {
- const { onClose } = this.props
-
- if (onClose) {
- onClose()
- } else {
- this.setState({ isShowing: false })
- }
- }
-
- render () {
- const { title, description } = this.props
-
- return !this.state.isShowing
- ? null
- : (
-
-
this.handleClose()}
- />
-
{ title }
-
{ description }
-
- )
- }
-}
diff --git a/ui/app/components/menu-droppo.js b/ui/app/components/menu-droppo.js
deleted file mode 100644
index ea4949c80..000000000
--- a/ui/app/components/menu-droppo.js
+++ /dev/null
@@ -1,134 +0,0 @@
-const Component = require('react').Component
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const findDOMNode = require('react-dom').findDOMNode
-import { CSSTransitionGroup } from 'react-transition-group'
-
-module.exports = MenuDroppoComponent
-
-
-inherits(MenuDroppoComponent, Component)
-function MenuDroppoComponent () {
- Component.call(this)
-}
-
-MenuDroppoComponent.prototype.render = function () {
- const { containerClassName = '' } = this.props
- const speed = this.props.speed || '300ms'
- const useCssTransition = this.props.useCssTransition
- const zIndex = ('zIndex' in this.props) ? this.props.zIndex : 0
-
- this.manageListeners()
-
- const style = this.props.style || {}
- if (!('position' in style)) {
- style.position = 'fixed'
- }
- style.zIndex = zIndex
-
- return (
- h('div', {
- style,
- className: `.menu-droppo-container ${containerClassName}`,
- }, [
- h('style', `
- .menu-droppo-enter {
- transition: transform ${speed} ease-in-out;
- transform: translateY(-200%);
- }
-
- .menu-droppo-enter.menu-droppo-enter-active {
- transition: transform ${speed} ease-in-out;
- transform: translateY(0%);
- }
-
- .menu-droppo-leave {
- transition: transform ${speed} ease-in-out;
- transform: translateY(0%);
- }
-
- .menu-droppo-leave.menu-droppo-leave-active {
- transition: transform ${speed} ease-in-out;
- transform: translateY(-200%);
- }
- `),
-
- useCssTransition
- ? h(CSSTransitionGroup, {
- className: 'css-transition-group',
- transitionName: 'menu-droppo',
- transitionEnterTimeout: parseInt(speed),
- transitionLeaveTimeout: parseInt(speed),
- }, this.renderPrimary())
- : this.renderPrimary(),
- ])
- )
-}
-
-MenuDroppoComponent.prototype.renderPrimary = function () {
- const isOpen = this.props.isOpen
- if (!isOpen) {
- return null
- }
-
- const innerStyle = this.props.innerStyle || {}
-
- return (
- h('.menu-droppo', {
- key: 'menu-droppo-drawer',
- style: innerStyle,
- },
- [ this.props.children ])
- )
-}
-
-MenuDroppoComponent.prototype.manageListeners = function () {
- const isOpen = this.props.isOpen
- const onClickOutside = this.props.onClickOutside
-
- if (isOpen) {
- this.outsideClickHandler = onClickOutside
- } else if (isOpen) {
- this.outsideClickHandler = null
- }
-}
-
-MenuDroppoComponent.prototype.componentDidMount = function () {
- if (this && document.body) {
- this.globalClickHandler = this.globalClickOccurred.bind(this)
- document.body.addEventListener('click', this.globalClickHandler)
- // eslint-disable-next-line react/no-find-dom-node
- var container = findDOMNode(this)
- this.container = container
- }
-}
-
-MenuDroppoComponent.prototype.componentWillUnmount = function () {
- if (this && document.body) {
- document.body.removeEventListener('click', this.globalClickHandler)
- }
-}
-
-MenuDroppoComponent.prototype.globalClickOccurred = function (event) {
- const target = event.target
- // eslint-disable-next-line react/no-find-dom-node
- const container = findDOMNode(this)
-
- if (target !== container &&
- !isDescendant(this.container, event.target) &&
- this.outsideClickHandler) {
- this.outsideClickHandler(event)
- }
-}
-
-function isDescendant (parent, child) {
- var node = child.parentNode
- while (node !== null) {
- if (node === parent) {
- return true
- }
- node = node.parentNode
- }
-
- return false
-}
diff --git a/ui/app/components/modals/deposit-ether-modal.js b/ui/app/components/modals/deposit-ether-modal.js
deleted file mode 100644
index 09137d39a..000000000
--- a/ui/app/components/modals/deposit-ether-modal.js
+++ /dev/null
@@ -1,220 +0,0 @@
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const connect = require('react-redux').connect
-const actions = require('../../actions')
-const { getNetworkDisplayName } = require('../../../../app/scripts/controllers/network/util')
-const ShapeshiftForm = require('../shapeshift-form')
-
-import Button from '../button'
-
-let DIRECT_DEPOSIT_ROW_TITLE
-let DIRECT_DEPOSIT_ROW_TEXT
-let COINBASE_ROW_TITLE
-let COINBASE_ROW_TEXT
-let SHAPESHIFT_ROW_TITLE
-let SHAPESHIFT_ROW_TEXT
-let FAUCET_ROW_TITLE
-
-function mapStateToProps (state) {
- return {
- network: state.metamask.network,
- address: state.metamask.selectedAddress,
- }
-}
-
-function mapDispatchToProps (dispatch) {
- return {
- toCoinbase: (address) => {
- dispatch(actions.buyEth({ network: '1', address, amount: 0 }))
- },
- hideModal: () => {
- dispatch(actions.hideModal())
- },
- hideWarning: () => {
- dispatch(actions.hideWarning())
- },
- showAccountDetailModal: () => {
- dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' }))
- },
- toFaucet: network => dispatch(actions.buyEth({ network })),
- }
-}
-
-inherits(DepositEtherModal, Component)
-function DepositEtherModal (props, context) {
- Component.call(this)
-
- // need to set after i18n locale has loaded
- DIRECT_DEPOSIT_ROW_TITLE = context.t('directDepositEther')
- DIRECT_DEPOSIT_ROW_TEXT = context.t('directDepositEtherExplainer')
- COINBASE_ROW_TITLE = context.t('buyCoinbase')
- COINBASE_ROW_TEXT = context.t('buyCoinbaseExplainer')
- SHAPESHIFT_ROW_TITLE = context.t('depositShapeShift')
- SHAPESHIFT_ROW_TEXT = context.t('depositShapeShiftExplainer')
- FAUCET_ROW_TITLE = context.t('testFaucet')
-
- this.state = {
- buyingWithShapeshift: false,
- }
-}
-
-DepositEtherModal.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect(mapStateToProps, mapDispatchToProps)(DepositEtherModal)
-
-
-DepositEtherModal.prototype.facuetRowText = function (networkName) {
- return this.context.t('getEtherFromFaucet', [networkName])
-}
-
-DepositEtherModal.prototype.renderRow = function ({
- logo,
- title,
- text,
- buttonLabel,
- onButtonClick,
- hide,
- className,
- hideButton,
- hideTitle,
- onBackClick,
- showBackButton,
-}) {
- if (hide) {
- return null
- }
-
- return h('div', {
- className: className || 'deposit-ether-modal__buy-row',
- }, [
-
- onBackClick && showBackButton && h('div.deposit-ether-modal__buy-row__back', {
- onClick: onBackClick,
- }, [
-
- h('i.fa.fa-arrow-left.cursor-pointer'),
-
- ]),
-
- h('div.deposit-ether-modal__buy-row__logo-container', [logo]),
-
- h('div.deposit-ether-modal__buy-row__description', [
-
- !hideTitle && h('div.deposit-ether-modal__buy-row__description__title', [title]),
-
- h('div.deposit-ether-modal__buy-row__description__text', [text]),
-
- ]),
-
- !hideButton && h('div.deposit-ether-modal__buy-row__button', [
- h(Button, {
- type: 'primary',
- className: 'deposit-ether-modal__deposit-button',
- large: true,
- onClick: onButtonClick,
- }, [buttonLabel]),
- ]),
-
- ])
-}
-
-DepositEtherModal.prototype.render = function () {
- const { network, toCoinbase, address, toFaucet } = this.props
- const { buyingWithShapeshift } = this.state
-
- const isTestNetwork = ['3', '4', '42'].find(n => n === network)
- const networkName = getNetworkDisplayName(network)
-
- return h('div.page-container.page-container--full-width.page-container--full-height', {}, [
-
- h('div.page-container__header', [
-
- h('div.page-container__title', [this.context.t('depositEther')]),
-
- h('div.page-container__subtitle', [
- this.context.t('needEtherInWallet'),
- ]),
-
- h('div.page-container__header-close', {
- onClick: () => {
- this.setState({ buyingWithShapeshift: false })
- this.props.hideWarning()
- this.props.hideModal()
- },
- }),
-
- ]),
-
- h('.page-container__content', {}, [
-
- h('div.deposit-ether-modal__buy-rows', [
-
- this.renderRow({
- logo: h('img.deposit-ether-modal__logo', {
- src: './images/deposit-eth.svg',
- }),
- title: DIRECT_DEPOSIT_ROW_TITLE,
- text: DIRECT_DEPOSIT_ROW_TEXT,
- buttonLabel: this.context.t('viewAccount'),
- onButtonClick: () => this.goToAccountDetailsModal(),
- hide: buyingWithShapeshift,
- }),
-
- this.renderRow({
- logo: h('i.fa.fa-tint.fa-2x'),
- title: FAUCET_ROW_TITLE,
- text: this.facuetRowText(networkName),
- buttonLabel: this.context.t('getEther'),
- onButtonClick: () => toFaucet(network),
- hide: !isTestNetwork || buyingWithShapeshift,
- }),
-
- this.renderRow({
- logo: h('div.deposit-ether-modal__logo', {
- style: {
- backgroundImage: 'url(\'./images/coinbase logo.png\')',
- height: '40px',
- },
- }),
- title: COINBASE_ROW_TITLE,
- text: COINBASE_ROW_TEXT,
- buttonLabel: this.context.t('continueToCoinbase'),
- onButtonClick: () => toCoinbase(address),
- hide: isTestNetwork || buyingWithShapeshift,
- }),
-
- this.renderRow({
- logo: h('div.deposit-ether-modal__logo', {
- style: {
- backgroundImage: 'url(\'./images/shapeshift logo.png\')',
- },
- }),
- title: SHAPESHIFT_ROW_TITLE,
- text: SHAPESHIFT_ROW_TEXT,
- buttonLabel: this.context.t('shapeshiftBuy'),
- onButtonClick: () => this.setState({ buyingWithShapeshift: true }),
- hide: isTestNetwork,
- hideButton: buyingWithShapeshift,
- hideTitle: buyingWithShapeshift,
- onBackClick: () => this.setState({ buyingWithShapeshift: false }),
- showBackButton: this.state.buyingWithShapeshift,
- className: buyingWithShapeshift && 'deposit-ether-modal__buy-row__shapeshift-buy',
- }),
-
- buyingWithShapeshift && h(ShapeshiftForm),
-
- ]),
-
- ]),
- ])
-}
-
-DepositEtherModal.prototype.goToAccountDetailsModal = function () {
- this.props.hideWarning()
- this.props.hideModal()
- this.props.showAccountDetailModal()
-}
diff --git a/ui/app/components/modals/modal.js b/ui/app/components/modals/modal.js
index 6f17d8fdb..63dc097fd 100644
--- a/ui/app/components/modals/modal.js
+++ b/ui/app/components/modals/modal.js
@@ -10,7 +10,6 @@ const { ENVIRONMENT_TYPE_POPUP } = require('../../../../app/scripts/lib/enums')
// Modal Components
const BuyOptions = require('./buy-options-modal')
-const DepositEtherModal = require('./deposit-ether-modal')
const EditAccountNameModal = require('./edit-account-name-modal')
const ExportPrivateKeyModal = require('./export-private-key-modal')
const NewAccountModal = require('./new-account-modal')
@@ -72,40 +71,6 @@ const MODALS = {
},
},
- DEPOSIT_ETHER: {
- contents: [
- h(DepositEtherModal, {}, []),
- ],
- onHide: (props) => props.hideWarning(),
- mobileModalStyle: {
- width: '100%',
- height: '100%',
- transform: 'none',
- left: '0',
- right: '0',
- margin: '0 auto',
- boxShadow: '0 0 7px 0 rgba(0,0,0,0.08)',
- top: '0',
- display: 'flex',
- },
- laptopModalStyle: {
- width: '850px',
- top: 'calc(10% + 10px)',
- left: '0',
- right: '0',
- margin: '0 auto',
- boxShadow: '0 0 6px 0 rgba(0,0,0,0.3)',
- borderRadius: '7px',
- transform: 'none',
- height: 'calc(80% - 20px)',
- overflowY: 'hidden',
- },
- contentStyle: {
- borderRadius: '7px',
- height: '100%',
- },
- },
-
EDIT_ACCOUNT_NAME: {
contents: [
h(EditAccountNameModal, {}, []),
diff --git a/ui/app/components/notice.js b/ui/app/components/notice.js
deleted file mode 100644
index bb7e0814c..000000000
--- a/ui/app/components/notice.js
+++ /dev/null
@@ -1,138 +0,0 @@
-const inherits = require('util').inherits
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const ReactMarkdown = require('react-markdown')
-const linker = require('extension-link-enabler')
-const findDOMNode = require('react-dom').findDOMNode
-const connect = require('react-redux').connect
-
-Notice.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect()(Notice)
-
-
-inherits(Notice, Component)
-function Notice () {
- Component.call(this)
-}
-
-Notice.prototype.render = function () {
- const { notice, onConfirm } = this.props
- const { title, date, body } = notice
- const state = this.state || { disclaimerDisabled: true }
- const disabled = state.disclaimerDisabled
-
- return (
- h('.flex-column.flex-center.flex-grow', {
- style: {
- width: '100%',
- },
- }, [
- h('h3.flex-center.text-transform-uppercase.terms-header', {
- style: {
- background: '#EBEBEB',
- color: '#AEAEAE',
- width: '100%',
- fontSize: '20px',
- textAlign: 'center',
- padding: 6,
- },
- }, [
- title,
- ]),
-
- h('h5.flex-center.text-transform-uppercase.terms-header', {
- style: {
- background: '#EBEBEB',
- color: '#AEAEAE',
- marginBottom: 24,
- width: '100%',
- fontSize: '20px',
- textAlign: 'center',
- padding: 6,
- },
- }, [
- date,
- ]),
-
- h('style', `
-
- .markdown {
- overflow-x: hidden;
- }
-
- .markdown h1, .markdown h2, .markdown h3 {
- margin: 10px 0;
- font-weight: bold;
- }
-
- .markdown strong {
- font-weight: bold;
- }
- .markdown em {
- font-style: italic;
- }
-
- .markdown p {
- margin: 10px 0;
- }
-
- .markdown a {
- color: #df6b0e;
- }
-
- `),
-
- h('div.markdown', {
- onScroll: (e) => {
- var object = e.currentTarget
- if (object.offsetHeight + object.scrollTop + 100 >= object.scrollHeight) {
- this.setState({disclaimerDisabled: false})
- }
- },
- style: {
- background: 'rgb(235, 235, 235)',
- height: '310px',
- padding: '6px',
- width: '90%',
- overflowY: 'scroll',
- scroll: 'auto',
- },
- }, [
- h(ReactMarkdown, {
- className: 'notice-box',
- source: body,
- skipHtml: true,
- }),
- ]),
-
- h('button.primary', {
- disabled,
- onClick: () => {
- this.setState({disclaimerDisabled: true}, () => onConfirm())
- },
- style: {
- marginTop: '18px',
- },
- }, this.context.t('accept')),
- ])
- )
-}
-
-Notice.prototype.componentDidMount = function () {
- // eslint-disable-next-line react/no-find-dom-node
- var node = findDOMNode(this)
- linker.setupListener(node)
- if (document.getElementsByClassName('notice-box')[0].clientHeight < 310) {
- this.setState({disclaimerDisabled: false})
- }
-}
-
-Notice.prototype.componentWillUnmount = function () {
- // eslint-disable-next-line react/no-find-dom-node
- var node = findDOMNode(this)
- linker.teardownListener(node)
-}
diff --git a/ui/app/components/pages/home/home.component.js b/ui/app/components/pages/home/home.component.js
deleted file mode 100644
index d3c71c4f6..000000000
--- a/ui/app/components/pages/home/home.component.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import React, { PureComponent } from 'react'
-import PropTypes from 'prop-types'
-import Media from 'react-media'
-import { Redirect } from 'react-router-dom'
-import WalletView from '../../wallet-view'
-import TransactionView from '../../transaction-view'
-import {
- INITIALIZE_BACKUP_PHRASE_ROUTE,
- RESTORE_VAULT_ROUTE,
- CONFIRM_TRANSACTION_ROUTE,
- NOTICE_ROUTE,
- CONFIRM_ADD_SUGGESTED_TOKEN_ROUTE,
-} from '../../../routes'
-
-export default class Home extends PureComponent {
- static propTypes = {
- history: PropTypes.object,
- noActiveNotices: PropTypes.bool,
- lostAccounts: PropTypes.array,
- forgottenPassword: PropTypes.bool,
- seedWords: PropTypes.string,
- suggestedTokens: PropTypes.object,
- unconfirmedTransactionsCount: PropTypes.number,
- }
-
- componentDidMount () {
- const {
- history,
- suggestedTokens = {},
- unconfirmedTransactionsCount = 0,
- } = this.props
-
- // suggested new tokens
- if (Object.keys(suggestedTokens).length > 0) {
- history.push(CONFIRM_ADD_SUGGESTED_TOKEN_ROUTE)
- }
-
- if (unconfirmedTransactionsCount > 0) {
- history.push(CONFIRM_TRANSACTION_ROUTE)
- }
- }
-
- render () {
- const {
- noActiveNotices,
- lostAccounts,
- forgottenPassword,
- seedWords,
- } = this.props
-
- // notices
- if (!noActiveNotices || (lostAccounts && lostAccounts.length > 0)) {
- return
- }
-
- // seed words
- if (seedWords) {
- return
- }
-
- if (forgottenPassword) {
- return
- }
-
- return (
-
- )
- }
-}
diff --git a/ui/app/components/pages/home/home.container.js b/ui/app/components/pages/home/home.container.js
deleted file mode 100644
index 58001df6b..000000000
--- a/ui/app/components/pages/home/home.container.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import Home from './home.component'
-import { compose } from 'recompose'
-import { connect } from 'react-redux'
-import { withRouter } from 'react-router-dom'
-import { unconfirmedTransactionsCountSelector } from '../../../selectors/confirm-transaction'
-
-const mapStateToProps = state => {
- const { metamask, appState } = state
- const {
- noActiveNotices,
- lostAccounts,
- seedWords,
- suggestedTokens,
- } = metamask
- const { forgottenPassword } = appState
-
- return {
- noActiveNotices,
- lostAccounts,
- forgottenPassword,
- seedWords,
- suggestedTokens,
- unconfirmedTransactionsCount: unconfirmedTransactionsCountSelector(state),
- }
-}
-
-export default compose(
- withRouter,
- connect(mapStateToProps)
-)(Home)
diff --git a/ui/app/components/pages/home/index.js b/ui/app/components/pages/home/index.js
deleted file mode 100644
index 4474ba5b8..000000000
--- a/ui/app/components/pages/home/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './home.container'
diff --git a/ui/app/components/pages/keychains/restore-vault.js b/ui/app/components/pages/keychains/restore-vault.js
deleted file mode 100644
index d90a33e49..000000000
--- a/ui/app/components/pages/keychains/restore-vault.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import React, { Component } from 'react'
-import PropTypes from 'prop-types'
-import {connect} from 'react-redux'
-import {
- createNewVaultAndRestore,
- unMarkPasswordForgotten,
-} from '../../../actions'
-import { DEFAULT_ROUTE } from '../../../routes'
-import TextField from '../../text-field'
-
-class RestoreVaultPage extends Component {
- static contextTypes = {
- t: PropTypes.func,
- }
-
- static propTypes = {
- warning: PropTypes.string,
- createNewVaultAndRestore: PropTypes.func.isRequired,
- leaveImportSeedScreenState: PropTypes.func,
- history: PropTypes.object,
- isLoading: PropTypes.bool,
- };
-
- state = {
- seedPhrase: '',
- password: '',
- confirmPassword: '',
- seedPhraseError: null,
- passwordError: null,
- confirmPasswordError: null,
- }
-
- parseSeedPhrase = (seedPhrase) => {
- return seedPhrase
- .match(/\w+/g)
- .join(' ')
- }
-
- handleSeedPhraseChange (seedPhrase) {
- let seedPhraseError = null
-
- if (seedPhrase && this.parseSeedPhrase(seedPhrase).split(' ').length !== 12) {
- seedPhraseError = this.context.t('seedPhraseReq')
- }
-
- this.setState({ seedPhrase, seedPhraseError })
- }
-
- handlePasswordChange (password) {
- const { confirmPassword } = this.state
- let confirmPasswordError = null
- let passwordError = null
-
- if (password && password.length < 8) {
- passwordError = this.context.t('passwordNotLongEnough')
- }
-
- if (confirmPassword && password !== confirmPassword) {
- confirmPasswordError = this.context.t('passwordsDontMatch')
- }
-
- this.setState({ password, passwordError, confirmPasswordError })
- }
-
- handleConfirmPasswordChange (confirmPassword) {
- const { password } = this.state
- let confirmPasswordError = null
-
- if (password !== confirmPassword) {
- confirmPasswordError = this.context.t('passwordsDontMatch')
- }
-
- this.setState({ confirmPassword, confirmPasswordError })
- }
-
- onClick = () => {
- const { password, seedPhrase } = this.state
- const {
- createNewVaultAndRestore,
- leaveImportSeedScreenState,
- history,
- } = this.props
-
- leaveImportSeedScreenState()
- createNewVaultAndRestore(password, this.parseSeedPhrase(seedPhrase))
- .then(() => history.push(DEFAULT_ROUTE))
- }
-
- hasError () {
- const { passwordError, confirmPasswordError, seedPhraseError } = this.state
- return passwordError || confirmPasswordError || seedPhraseError
- }
-
- render () {
- const {
- seedPhrase,
- password,
- confirmPassword,
- seedPhraseError,
- passwordError,
- confirmPasswordError,
- } = this.state
- const { t } = this.context
- const { isLoading } = this.props
- const disabled = !seedPhrase || !password || !confirmPassword || isLoading || this.hasError()
-
- return (
-
-
-
-
{
- e.preventDefault()
- this.props.history.goBack()
- }}
- href="#"
- >
- {`< Back`}
-
-
- { this.context.t('restoreAccountWithSeed') }
-
-
- { this.context.t('secretPhrase') }
-
-
-
-
-
- { seedPhraseError }
-
-
this.handlePasswordChange(event.target.value)}
- error={passwordError}
- autoComplete="new-password"
- margin="normal"
- largeLabel
- />
- this.handleConfirmPasswordChange(event.target.value)}
- error={confirmPasswordError}
- autoComplete="confirm-password"
- margin="normal"
- largeLabel
- />
-
-
-
-
- )
- }
-}
-
-RestoreVaultPage.contextTypes = {
- t: PropTypes.func,
-}
-
-export default connect(
- ({ appState: { warning, isLoading } }) => ({ warning, isLoading }),
- dispatch => ({
- leaveImportSeedScreenState: () => {
- dispatch(unMarkPasswordForgotten())
- },
- createNewVaultAndRestore: (pw, seed) => dispatch(createNewVaultAndRestore(pw, seed)),
- })
-)(RestoreVaultPage)
diff --git a/ui/app/components/pages/keychains/reveal-seed.js b/ui/app/components/pages/keychains/reveal-seed.js
deleted file mode 100644
index 32557066f..000000000
--- a/ui/app/components/pages/keychains/reveal-seed.js
+++ /dev/null
@@ -1,177 +0,0 @@
-const { Component } = require('react')
-const { connect } = require('react-redux')
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const classnames = require('classnames')
-
-const { requestRevealSeedWords } = require('../../../actions')
-const { DEFAULT_ROUTE } = require('../../../routes')
-const ExportTextContainer = require('../../export-text-container')
-
-import Button from '../../button'
-
-const PASSWORD_PROMPT_SCREEN = 'PASSWORD_PROMPT_SCREEN'
-const REVEAL_SEED_SCREEN = 'REVEAL_SEED_SCREEN'
-
-class RevealSeedPage extends Component {
- constructor (props) {
- super(props)
-
- this.state = {
- screen: PASSWORD_PROMPT_SCREEN,
- password: '',
- seedWords: null,
- error: null,
- }
- }
-
- componentDidMount () {
- const passwordBox = document.getElementById('password-box')
- if (passwordBox) {
- passwordBox.focus()
- }
- }
-
- handleSubmit (event) {
- event.preventDefault()
- this.setState({ seedWords: null, error: null })
- this.props.requestRevealSeedWords(this.state.password)
- .then(seedWords => this.setState({ seedWords, screen: REVEAL_SEED_SCREEN }))
- .catch(error => this.setState({ error: error.message }))
- }
-
- renderWarning () {
- return (
- h('.page-container__warning-container', [
- h('img.page-container__warning-icon', {
- src: 'images/warning.svg',
- }),
- h('.page-container__warning-message', [
- h('.page-container__warning-title', [this.context.t('revealSeedWordsWarningTitle')]),
- h('div', [this.context.t('revealSeedWordsWarning')]),
- ]),
- ])
- )
- }
-
- renderContent () {
- return this.state.screen === PASSWORD_PROMPT_SCREEN
- ? this.renderPasswordPromptContent()
- : this.renderRevealSeedContent()
- }
-
- renderPasswordPromptContent () {
- const { t } = this.context
-
- return (
- h('form', {
- onSubmit: event => this.handleSubmit(event),
- }, [
- h('label.input-label', {
- htmlFor: 'password-box',
- }, t('enterPasswordContinue')),
- h('.input-group', [
- h('input.form-control', {
- type: 'password',
- placeholder: t('password'),
- id: 'password-box',
- value: this.state.password,
- onChange: event => this.setState({ password: event.target.value }),
- className: classnames({ 'form-control--error': this.state.error }),
- }),
- ]),
- this.state.error && h('.reveal-seed__error', this.state.error),
- ])
- )
- }
-
- renderRevealSeedContent () {
- const { t } = this.context
-
- return (
- h('div', [
- h('label.reveal-seed__label', t('yourPrivateSeedPhrase')),
- h(ExportTextContainer, {
- text: this.state.seedWords,
- filename: t('metamaskSeedWords'),
- }),
- ])
- )
- }
-
- renderFooter () {
- return this.state.screen === PASSWORD_PROMPT_SCREEN
- ? this.renderPasswordPromptFooter()
- : this.renderRevealSeedFooter()
- }
-
- renderPasswordPromptFooter () {
- return (
- h('.page-container__footer', [
- h('header', [
- h(Button, {
- type: 'default',
- large: true,
- className: 'page-container__footer-button',
- onClick: () => this.props.history.push(DEFAULT_ROUTE),
- }, this.context.t('cancel')),
- h(Button, {
- type: 'primary',
- large: true,
- className: 'page-container__footer-button',
- onClick: event => this.handleSubmit(event),
- disabled: this.state.password === '',
- }, this.context.t('next')),
- ]),
- ])
- )
- }
-
- renderRevealSeedFooter () {
- return (
- h('.page-container__footer', [
- h(Button, {
- type: 'default',
- large: true,
- className: 'page-container__footer-button',
- onClick: () => this.props.history.push(DEFAULT_ROUTE),
- }, this.context.t('close')),
- ])
- )
- }
-
- render () {
- return (
- h('.page-container', [
- h('.page-container__header', [
- h('.page-container__title', this.context.t('revealSeedWordsTitle')),
- h('.page-container__subtitle', this.context.t('revealSeedWordsDescription')),
- ]),
- h('.page-container__content', [
- this.renderWarning(),
- h('.reveal-seed__content', [
- this.renderContent(),
- ]),
- ]),
- this.renderFooter(),
- ])
- )
- }
-}
-
-RevealSeedPage.propTypes = {
- requestRevealSeedWords: PropTypes.func,
- history: PropTypes.object,
-}
-
-RevealSeedPage.contextTypes = {
- t: PropTypes.func,
-}
-
-const mapDispatchToProps = dispatch => {
- return {
- requestRevealSeedWords: password => dispatch(requestRevealSeedWords(password)),
- }
-}
-
-module.exports = connect(null, mapDispatchToProps)(RevealSeedPage)
diff --git a/ui/app/components/sender-to-recipient/index.js b/ui/app/components/sender-to-recipient/index.js
deleted file mode 100644
index f515c4ac4..000000000
--- a/ui/app/components/sender-to-recipient/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './sender-to-recipient.component'
diff --git a/ui/app/components/sender-to-recipient/index.scss b/ui/app/components/sender-to-recipient/index.scss
deleted file mode 100644
index 0ab0413be..000000000
--- a/ui/app/components/sender-to-recipient/index.scss
+++ /dev/null
@@ -1,120 +0,0 @@
-.sender-to-recipient {
- &--default {
- width: 100%;
- display: flex;
- flex-direction: row;
- justify-content: center;
- border-bottom: 1px solid $geyser;
- position: relative;
- flex: 0 0 auto;
- height: 42px;
-
- .sender-to-recipient {
- &__tooltip-wrapper {
- min-width: 0;
- }
-
- &__tooltip-container {
- max-width: 100%;
- }
-
- &__party {
- display: flex;
- flex-direction: row;
- align-items: center;
- flex: 1;
- padding: 0 16px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- &--sender {
- padding-right: 30px;
- cursor: pointer;
- }
-
- &--recipient {
- padding-left: 30px;
- border-left: 1px solid $geyser;
-
- &-with-address {
- cursor: pointer;
- }
- }
- }
-
- &__arrow-container {
- position: absolute;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-
- &__arrow-circle {
- background: $white;
- padding: 5px;
- border: 1px solid $geyser;
- border-radius: 20px;
- height: 32px;
- width: 32px;
- display: flex;
- justify-content: center;
- align-items: center;
- }
-
- &__name {
- padding-left: 14px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-size: .875rem;
- }
- }
- }
-
- &--cards {
- width: 100%;
- display: flex;
- flex-direction: row;
- justify-content: center;
- position: relative;
- flex: 0 0 auto;
-
- .sender-to-recipient {
- &__party {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- flex: 1;
- border-radius: 4px;
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08);
- padding: 6px;
- background: $white;
- cursor: pointer;
- min-width: 0;
- color: $dusty-gray;
- }
-
- &__tooltip-wrapper {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- &__name {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-size: .5rem;
- }
-
- &__arrow-container {
- display: flex;
- justify-content: center;
- align-items: center;
- }
- }
- }
-}
diff --git a/ui/app/components/sender-to-recipient/sender-to-recipient.component.js b/ui/app/components/sender-to-recipient/sender-to-recipient.component.js
deleted file mode 100644
index e71bd7406..000000000
--- a/ui/app/components/sender-to-recipient/sender-to-recipient.component.js
+++ /dev/null
@@ -1,177 +0,0 @@
-import React, { PureComponent } from 'react'
-import PropTypes from 'prop-types'
-import classnames from 'classnames'
-import Identicon from '../identicon'
-import Tooltip from '../tooltip-v2'
-import copyToClipboard from 'copy-to-clipboard'
-import { DEFAULT_VARIANT, CARDS_VARIANT } from './sender-to-recipient.constants'
-import { checksumAddress } from '../../util'
-
-const variantHash = {
- [DEFAULT_VARIANT]: 'sender-to-recipient--default',
- [CARDS_VARIANT]: 'sender-to-recipient--cards',
-}
-
-export default class SenderToRecipient extends PureComponent {
- static propTypes = {
- senderName: PropTypes.string,
- senderAddress: PropTypes.string,
- recipientName: PropTypes.string,
- recipientAddress: PropTypes.string,
- t: PropTypes.func,
- variant: PropTypes.oneOf([DEFAULT_VARIANT, CARDS_VARIANT]),
- addressOnly: PropTypes.bool,
- assetImage: PropTypes.string,
- }
-
- static defaultProps = {
- variant: DEFAULT_VARIANT,
- }
-
- static contextTypes = {
- t: PropTypes.func,
- }
-
- state = {
- senderAddressCopied: false,
- recipientAddressCopied: false,
- }
-
- renderSenderIdenticon () {
- return !this.props.addressOnly && (
-
-
-
- )
- }
-
- renderSenderAddress () {
- const { t } = this.context
- const { senderName, senderAddress, addressOnly } = this.props
- const checksummedSenderAddress = checksumAddress(senderAddress)
-
- return (
-
this.setState({ senderAddressCopied: false })}
- >
-
- { addressOnly ? `${t('from')}: ${checksummedSenderAddress}` : senderName }
-
-
- )
- }
-
- renderRecipientIdenticon () {
- const { recipientAddress, assetImage } = this.props
- const checksummedRecipientAddress = checksumAddress(recipientAddress)
-
- return !this.props.addressOnly && (
-
-
-
- )
- }
-
- renderRecipientWithAddress () {
- const { t } = this.context
- const { recipientName, recipientAddress, addressOnly } = this.props
- const checksummedRecipientAddress = checksumAddress(recipientAddress)
-
- return (
-
{
- this.setState({ recipientAddressCopied: true })
- copyToClipboard(checksummedRecipientAddress)
- }}
- >
- { this.renderRecipientIdenticon() }
-
this.setState({ recipientAddressCopied: false })}
- >
-
- {
- addressOnly
- ? `${t('to')}: ${checksummedRecipientAddress}`
- : (recipientName || this.context.t('newContract'))
- }
-
-
-
- )
- }
-
- renderRecipientWithoutAddress () {
- return (
-
- { !this.props.addressOnly &&
}
-
- { this.context.t('newContract') }
-
-
- )
- }
-
- renderArrow () {
- return this.props.variant === CARDS_VARIANT
- ? (
-
-
-
- ) : (
-
-
-
-
-
- )
- }
-
- render () {
- const { senderAddress, recipientAddress, variant } = this.props
- const checksummedSenderAddress = checksumAddress(senderAddress)
-
- return (
-
-
{
- this.setState({ senderAddressCopied: true })
- copyToClipboard(checksummedSenderAddress)
- }}
- >
- { this.renderSenderIdenticon() }
- { this.renderSenderAddress() }
-
- { this.renderArrow() }
- {
- recipientAddress
- ? this.renderRecipientWithAddress()
- : this.renderRecipientWithoutAddress()
- }
-
- )
- }
-}
diff --git a/ui/app/components/sender-to-recipient/sender-to-recipient.constants.js b/ui/app/components/sender-to-recipient/sender-to-recipient.constants.js
deleted file mode 100644
index 166228932..000000000
--- a/ui/app/components/sender-to-recipient/sender-to-recipient.constants.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// Component design variants
-export const DEFAULT_VARIANT = 'DEFAULT_VARIANT'
-export const CARDS_VARIANT = 'CARDS_VARIANT'
diff --git a/ui/app/components/shapeshift-form.js b/ui/app/components/shapeshift-form.js
deleted file mode 100644
index 13e1e28e2..000000000
--- a/ui/app/components/shapeshift-form.js
+++ /dev/null
@@ -1,256 +0,0 @@
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const PropTypes = require('prop-types')
-const Component = require('react').Component
-const connect = require('react-redux').connect
-const classnames = require('classnames')
-const { qrcode } = require('qrcode-npm')
-const { shapeShiftSubview, pairUpdate, buyWithShapeShift } = require('../actions')
-const { isValidAddress } = require('../util')
-const SimpleDropdown = require('./dropdowns/simple-dropdown')
-
-import Button from './button'
-
-function mapStateToProps (state) {
- const {
- coinOptions,
- tokenExchangeRates,
- selectedAddress,
- } = state.metamask
- const { warning } = state.appState
-
- return {
- coinOptions,
- tokenExchangeRates,
- selectedAddress,
- warning,
- }
-}
-
-function mapDispatchToProps (dispatch) {
- return {
- shapeShiftSubview: () => dispatch(shapeShiftSubview()),
- pairUpdate: coin => dispatch(pairUpdate(coin)),
- buyWithShapeShift: data => dispatch(buyWithShapeShift(data)),
- }
-}
-
-ShapeshiftForm.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect(mapStateToProps, mapDispatchToProps)(ShapeshiftForm)
-
-
-inherits(ShapeshiftForm, Component)
-function ShapeshiftForm () {
- Component.call(this)
-
- this.state = {
- depositCoin: 'btc',
- refundAddress: '',
- showQrCode: false,
- depositAddress: '',
- errorMessage: '',
- isLoading: false,
- bought: false,
- }
-}
-
-ShapeshiftForm.prototype.getCoinPair = function () {
- return `${this.state.depositCoin.toUpperCase()}_ETH`
-}
-
-ShapeshiftForm.prototype.componentWillMount = function () {
- this.props.shapeShiftSubview()
-}
-
-ShapeshiftForm.prototype.onCoinChange = function (coin) {
- this.setState({
- depositCoin: coin,
- errorMessage: '',
- })
- this.props.pairUpdate(coin)
-}
-
-ShapeshiftForm.prototype.onBuyWithShapeShift = function () {
- this.setState({
- isLoading: true,
- showQrCode: true,
- })
-
- const {
- buyWithShapeShift,
- selectedAddress: withdrawal,
- } = this.props
- const {
- refundAddress: returnAddress,
- depositCoin,
- } = this.state
- const pair = `${depositCoin}_eth`
- const data = {
- withdrawal,
- pair,
- returnAddress,
- // Public api key
- 'apiKey': '5efdee9e7d3c99e7c7e8a0f788d6e52205bf00a0e24575fe59df86421f63c477d018840c94f6596cf8946990216073c68144394c384b0ddcbe782351d80d61d7',
- }
-
- if (isValidAddress(withdrawal)) {
- buyWithShapeShift(data)
- .then(d => this.setState({
- showQrCode: true,
- depositAddress: d.deposit,
- isLoading: false,
- }))
- .catch(() => this.setState({
- showQrCode: false,
- errorMessage: this.context.t('invalidRequest'),
- isLoading: false,
- }))
- }
-}
-
-ShapeshiftForm.prototype.renderMetadata = function (label, value) {
- return h('div', {className: 'shapeshift-form__metadata-wrapper'}, [
-
- h('div.shapeshift-form__metadata-label', {}, [
- h('span', `${label}:`),
- ]),
-
- h('div.shapeshift-form__metadata-value', {}, [
- h('span', value),
- ]),
-
- ])
-}
-
-ShapeshiftForm.prototype.renderMarketInfo = function () {
- const { tokenExchangeRates } = this.props
- const {
- limit,
- rate,
- minimum,
- } = tokenExchangeRates[this.getCoinPair()] || {}
-
- return h('div.shapeshift-form__metadata', {}, [
-
- this.renderMetadata(this.context.t('status'), limit ? this.context.t('available') : this.context.t('unavailable')),
- this.renderMetadata(this.context.t('limit'), limit),
- this.renderMetadata(this.context.t('exchangeRate'), rate),
- this.renderMetadata(this.context.t('min'), minimum),
-
- ])
-}
-
-ShapeshiftForm.prototype.renderQrCode = function () {
- const { depositAddress, isLoading, depositCoin } = this.state
- const qrImage = qrcode(4, 'M')
- qrImage.addData(depositAddress)
- qrImage.make()
-
- return h('div.shapeshift-form', {}, [
-
- h('div.shapeshift-form__deposit-instruction', [
- this.context.t('depositCoin', [depositCoin.toUpperCase()]),
- ]),
-
- h('div', depositAddress),
-
- h('div.shapeshift-form__qr-code', [
- isLoading
- ? h('img', {
- src: 'images/loading.svg',
- style: { width: '60px'},
- })
- : h('div', {
- dangerouslySetInnerHTML: { __html: qrImage.createTableTag(4) },
- }),
- ]),
-
- this.renderMarketInfo(),
-
- ])
-}
-
-
-ShapeshiftForm.prototype.render = function () {
- const { coinOptions, btnClass, warning } = this.props
- const { errorMessage, showQrCode, depositAddress } = this.state
- const { tokenExchangeRates } = this.props
- const token = tokenExchangeRates[this.getCoinPair()]
-
- return h('div.shapeshift-form-wrapper', [
- showQrCode
- ? this.renderQrCode()
- : h('div.modal-shapeshift-form', [
- h('div.shapeshift-form__selectors', [
-
- h('div.shapeshift-form__selector', [
-
- h('div.shapeshift-form__selector-label', this.context.t('deposit')),
-
- h(SimpleDropdown, {
- selectedOption: this.state.depositCoin,
- onSelect: (coin) => this.onCoinChange(coin),
- options: Object.entries(coinOptions).map(([coin]) => ({
- value: coin.toLowerCase(),
- displayValue: coin,
- })),
- }),
-
- ]),
-
- h('div.icon.shapeshift-form__caret', {
- style: { backgroundImage: 'url(images/caret-right.svg)'},
- }),
-
- h('div.shapeshift-form__selector', [
-
- h('div.shapeshift-form__selector-label', [
- this.context.t('receive'),
- ]),
-
- h('div.shapeshift-form__selector-input', ['ETH']),
-
- ]),
-
- ]),
-
- warning && h('div.shapeshift-form__address-input-label', warning),
-
- !warning && h('div', {
- className: classnames('shapeshift-form__address-input-wrapper', {
- 'shapeshift-form__address-input-wrapper--error': errorMessage,
- }),
- }, [
-
- h('div.shapeshift-form__address-input-label', [
- this.context.t('refundAddress'),
- ]),
-
- h('input.shapeshift-form__address-input', {
- type: 'text',
- onChange: e => this.setState({
- refundAddress: e.target.value,
- errorMessage: '',
- }),
- }),
-
- h('divshapeshift-form__address-input-error-message', [errorMessage]),
- ]),
-
- !warning && this.renderMarketInfo(),
-
- ]),
-
- !depositAddress && h(Button, {
- type: 'primary',
- large: true,
- className: `${btnClass} shapeshift-form__shapeshift-buy-btn`,
- disabled: !token,
- onClick: () => this.onBuyWithShapeShift(),
- }, [this.context.t('buy')]),
-
- ])
-}
diff --git a/ui/app/components/shift-list-item.js b/ui/app/components/shift-list-item.js
deleted file mode 100644
index 7fecdf192..000000000
--- a/ui/app/components/shift-list-item.js
+++ /dev/null
@@ -1,210 +0,0 @@
-const inherits = require('util').inherits
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const connect = require('react-redux').connect
-const vreme = new (require('vreme'))()
-const ethNetProps = require('eth-net-props')
-const actions = require('../actions')
-const addressSummary = require('../util').addressSummary
-
-const CopyButton = require('./copyButton')
-const EthBalance = require('./eth-balance')
-const Tooltip = require('./tooltip')
-
-
-ShiftListItem.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect(mapStateToProps)(ShiftListItem)
-
-
-function mapStateToProps (state) {
- return {
- selectedAddress: state.metamask.selectedAddress,
- conversionRate: state.metamask.conversionRate,
- currentCurrency: state.metamask.currentCurrency,
- }
-}
-
-inherits(ShiftListItem, Component)
-
-function ShiftListItem () {
- Component.call(this)
-}
-
-ShiftListItem.prototype.render = function () {
- return h('div.transaction-list-item.tx-list-clickable', {
- style: {
- paddingTop: '20px',
- paddingBottom: '20px',
- justifyContent: 'space-around',
- alignItems: 'center',
- flexDirection: 'row',
- },
- }, [
- h('div', {
- style: {
- width: '0px',
- position: 'relative',
- bottom: '19px',
- },
- }, [
- h('img', {
- src: './images/shapeshift-logo-only.png',
- style: {
- height: '35px',
- width: '132px',
- position: 'absolute',
- clip: 'rect(0px,23px,34px,0px)',
- },
- }),
- ]),
-
- this.renderInfo(),
- this.renderUtilComponents(),
- ])
-}
-
-function formatDate (date) {
- return vreme.format(new Date(date), 'March 16 2014 14:30')
-}
-
-ShiftListItem.prototype.renderUtilComponents = function () {
- var props = this.props
- const { conversionRate, currentCurrency } = props
-
- switch (props.response.status) {
- case 'no_deposits':
- return h('.flex-row', [
- h(CopyButton, {
- value: this.props.depositAddress,
- }),
- h(Tooltip, {
- title: this.context.t('qrCode'),
- }, [
- h('i.fa.fa-qrcode.pointer.pop-hover', {
- onClick: () => props.dispatch(actions.reshowQrCode(props.depositAddress, props.depositType)),
- style: {
- margin: '5px',
- marginLeft: '23px',
- marginRight: '12px',
- fontSize: '20px',
- color: '#F7861C',
- },
- }),
- ]),
- ])
- case 'received':
- return h('.flex-row')
-
- case 'complete':
- return h('.flex-row', [
- h(CopyButton, {
- value: this.props.response.transaction,
- }),
- h(EthBalance, {
- value: `${props.response.outgoingCoin}`,
- conversionRate,
- currentCurrency,
- width: '55px',
- shorten: true,
- needsParse: false,
- incoming: true,
- style: {
- fontSize: '15px',
- color: '#01888C',
- },
- }),
- ])
-
- case 'failed':
- return ''
- default:
- return ''
- }
-}
-
-ShiftListItem.prototype.renderInfo = function () {
- var props = this.props
- switch (props.response.status) {
- case 'no_deposits':
- return h('.flex-column', {
- style: {
- width: '200px',
- overflow: 'hidden',
- },
- }, [
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, this.context.t('toETHviaShapeShift', [props.depositType])),
- h('div', this.context.t('noDeposits')),
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, formatDate(props.time)),
- ])
- case 'received':
- return h('.flex-column', {
- style: {
- width: '200px',
- overflow: 'hidden',
- },
- }, [
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, this.context.t('toETHviaShapeShift', [props.depositType])),
- h('div', this.context.t('conversionProgress')),
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, formatDate(props.time)),
- ])
- case 'complete':
- var url = ethNetProps.explorerLinks.getExplorerTxLinkFor(props.response.transaction, parseInt('1'))
-
- return h('.flex-column.pointer', {
- style: {
- width: '200px',
- overflow: 'hidden',
- },
- onClick: () => global.platform.openWindow({ url }),
- }, [
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, this.context.t('fromShapeShift')),
- h('div', formatDate(props.time)),
- h('div', {
- style: {
- fontSize: 'x-small',
- color: '#ABA9AA',
- width: '100%',
- },
- }, addressSummary(props.response.transaction)),
- ])
-
- case 'failed':
- return h('span.error', '(' + this.context.t('failed') + ')')
- default:
- return ''
- }
-}
diff --git a/ui/app/components/tab-bar.js b/ui/app/components/tab-bar.js
deleted file mode 100644
index 0016a09c1..000000000
--- a/ui/app/components/tab-bar.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const { Component } = require('react')
-const h = require('react-hyperscript')
-const PropTypes = require('prop-types')
-const classnames = require('classnames')
-
-class TabBar extends Component {
- render () {
- const { tabs = [], onSelect, isActive } = this.props
-
- return (
- h('.tab-bar', {}, [
- tabs.map(({ key, content }) => {
- return h('div', {
- className: classnames('tab-bar__tab pointer', {
- 'tab-bar__tab--active': isActive(key, content),
- }),
- onClick: () => onSelect(key),
- key,
- }, content)
- }),
- h('div.tab-bar__tab.tab-bar__grow-tab'),
- ])
- )
- }
-}
-
-TabBar.propTypes = {
- isActive: PropTypes.func.isRequired,
- tabs: PropTypes.array,
- onSelect: PropTypes.func,
-}
-
-module.exports = TabBar
diff --git a/ui/app/components/token-cell.js b/ui/app/components/token-cell.js
deleted file mode 100644
index edf8b2661..000000000
--- a/ui/app/components/token-cell.js
+++ /dev/null
@@ -1,160 +0,0 @@
-const Component = require('react').Component
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const connect = require('react-redux').connect
-const Identicon = require('./identicon')
-const ethNetProps = require('eth-net-props')
-const selectors = require('../selectors')
-const actions = require('../actions')
-const { conversionUtil, multiplyCurrencies } = require('../conversion-util')
-
-const TokenMenuDropdown = require('./dropdowns/token-menu-dropdown.js')
-
-function mapStateToProps (state) {
- return {
- network: state.metamask.network,
- currentCurrency: state.metamask.currentCurrency,
- selectedTokenAddress: state.metamask.selectedTokenAddress,
- userAddress: selectors.getSelectedAddress(state),
- contractExchangeRates: state.metamask.contractExchangeRates,
- conversionRate: state.metamask.conversionRate,
- sidebarOpen: state.appState.sidebar.isOpen,
- }
-}
-
-function mapDispatchToProps (dispatch) {
- return {
- setSelectedToken: address => dispatch(actions.setSelectedToken(address)),
- hideSidebar: () => dispatch(actions.hideSidebar()),
- }
-}
-
-module.exports = connect(mapStateToProps, mapDispatchToProps)(TokenCell)
-
-inherits(TokenCell, Component)
-function TokenCell () {
- Component.call(this)
-
- this.state = {
- tokenMenuOpen: false,
- }
-}
-
-TokenCell.prototype.render = function () {
- const { tokenMenuOpen } = this.state
- const props = this.props
- const {
- address,
- symbol,
- string,
- network,
- setSelectedToken,
- selectedTokenAddress,
- contractExchangeRates,
- conversionRate,
- hideSidebar,
- sidebarOpen,
- currentCurrency,
- // userAddress,
- image,
- } = props
- let currentTokenToFiatRate
- let currentTokenInFiat
- let formattedFiat = ''
-
- if (contractExchangeRates[address]) {
- currentTokenToFiatRate = multiplyCurrencies(
- contractExchangeRates[address],
- conversionRate
- )
- currentTokenInFiat = conversionUtil(string, {
- fromNumericBase: 'dec',
- fromCurrency: symbol,
- toCurrency: currentCurrency.toUpperCase(),
- numberOfDecimals: 2,
- conversionRate: currentTokenToFiatRate,
- })
- formattedFiat = currentTokenInFiat.toString() === '0'
- ? ''
- : `${currentTokenInFiat} ${currentCurrency.toUpperCase()}`
- }
-
- const showFiat = Boolean(currentTokenInFiat) && currentCurrency.toUpperCase() !== symbol
-
- return (
- h('div.token-list-item', {
- className: `token-list-item ${selectedTokenAddress === address ? 'token-list-item--active' : ''}`,
- // style: { cursor: network === '1' ? 'pointer' : 'default' },
- // onClick: this.view.bind(this, address, userAddress, network),
- onClick: () => {
- setSelectedToken(address)
- selectedTokenAddress !== address && sidebarOpen && hideSidebar()
- },
- }, [
-
- h(Identicon, {
- className: 'token-list-item__identicon',
- diameter: 50,
- address,
- network,
- image,
- }),
-
- h('div.token-list-item__balance-ellipsis', null, [
- h('div.token-list-item__balance-wrapper', null, [
- h('div.token-list-item__token-balance', `${string || 0}`),
- h('div.token-list-item__token-symbol', symbol),
- showFiat && h('div.token-list-item__fiat-amount', {
- style: {},
- }, formattedFiat),
- ]),
-
- h('i.fa.fa-ellipsis-h.fa-lg.token-list-item__ellipsis.cursor-pointer', {
- onClick: (e) => {
- e.stopPropagation()
- this.setState({ tokenMenuOpen: true })
- },
- }),
-
- ]),
-
-
- tokenMenuOpen && h(TokenMenuDropdown, {
- onClose: () => this.setState({ tokenMenuOpen: false }),
- token: { symbol, address },
- }),
-
- /*
- h('button', {
- onClick: this.send.bind(this, address),
- }, 'SEND'),
- */
-
- ])
- )
-}
-
-TokenCell.prototype.send = function (address, event) {
- event.preventDefault()
- event.stopPropagation()
- const url = tokenFactoryFor(address)
- if (url) {
- navigateTo(url)
- }
-}
-
-TokenCell.prototype.view = function (address, userAddress, network, event) {
- const url = ethNetProps.explorerLinks.getExplorerTokenLinkFor(address, userAddress, network)
- if (url) {
- navigateTo(url)
- }
-}
-
-function navigateTo (url) {
- global.platform.openWindow({ url })
-}
-
-function tokenFactoryFor (tokenAddress) {
- return `https://tokenfactory.surge.sh/#/token/${tokenAddress}`
-}
-
diff --git a/ui/app/components/token-list.js b/ui/app/components/token-list.js
deleted file mode 100644
index 5b5976e27..000000000
--- a/ui/app/components/token-list.js
+++ /dev/null
@@ -1,188 +0,0 @@
-const Component = require('react').Component
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const inherits = require('util').inherits
-const TokenTracker = require('eth-token-watcher')
-const TokenCell = require('./token-cell.js')
-const connect = require('react-redux').connect
-const selectors = require('../selectors')
-const log = require('loglevel')
-
-function mapStateToProps (state) {
- return {
- network: state.metamask.network,
- tokens: state.metamask.tokens,
- userAddress: selectors.getSelectedAddress(state),
- assetImages: state.metamask.assetImages,
- }
-}
-
-const defaultTokens = []
-const contracts = require('eth-contract-metadata')
-for (const address in contracts) {
- const contract = contracts[address]
- if (contract.erc20) {
- contract.address = address
- defaultTokens.push(contract)
- }
-}
-
-TokenList.contextTypes = {
- t: PropTypes.func,
-}
-
-module.exports = connect(mapStateToProps)(TokenList)
-
-
-inherits(TokenList, Component)
-function TokenList () {
- this.state = {
- tokens: [],
- isLoading: true,
- network: null,
- }
- Component.call(this)
-}
-
-TokenList.prototype.render = function () {
- const { userAddress, assetImages } = this.props
- const state = this.state
- const { tokens, isLoading, error } = state
- if (isLoading) {
- return this.message(this.context.t('loadingTokens'))
- }
-
- if (error) {
- log.error(error)
- return h('.hotFix', {
- style: {
- padding: '80px',
- },
- }, [
- this.context.t('troubleTokenBalances'),
- h('span.hotFix', {
- style: {
- color: 'rgba(247, 134, 28, 1)',
- cursor: 'pointer',
- },
- onClick: () => {
- global.platform.openWindow({
- url: `https://ethplorer.io/address/${userAddress}`,
- })
- },
- }, this.context.t('here')),
- ])
- }
-
- return h('div', tokens.map((tokenData) => {
- tokenData.image = assetImages[tokenData.address]
- return h(TokenCell, tokenData)
- }))
-
-}
-
-TokenList.prototype.message = function (body) {
- return h('div', {
- style: {
- display: 'flex',
- height: '250px',
- alignItems: 'center',
- justifyContent: 'center',
- padding: '30px',
- },
- }, body)
-}
-
-TokenList.prototype.componentDidMount = function () {
- this.createFreshTokenTracker()
-}
-
-TokenList.prototype.createFreshTokenTracker = function () {
- if (this.tracker) {
- // Clean up old trackers when refreshing:
- this.tracker.stop()
- this.tracker.removeListener('update', this.balanceUpdater)
- this.tracker.removeListener('error', this.showError)
- }
-
- if (!global.ethereumProvider) return
- const { userAddress } = this.props
-
- this.tracker = new TokenTracker({
- userAddress,
- provider: global.ethereumProvider,
- tokens: this.props.tokens,
- pollingInterval: 8000,
- })
-
-
- // Set up listener instances for cleaning up
- this.balanceUpdater = this.updateBalances.bind(this)
- this.showError = (error) => {
- this.setState({ error, isLoading: false })
- }
- this.tracker.on('update', this.balanceUpdater)
- this.tracker.on('error', this.showError)
-
- this.tracker.updateBalances()
- .then(() => {
- this.updateBalances(this.tracker.serialize())
- })
- .catch((reason) => {
- log.error(`Problem updating balances`, reason)
- this.setState({ isLoading: false })
- })
-}
-
-TokenList.prototype.componentDidUpdate = function (nextProps) {
- const {
- network: oldNet,
- userAddress: oldAddress,
- tokens,
- } = this.props
- const {
- network: newNet,
- userAddress: newAddress,
- tokens: newTokens,
- } = nextProps
-
- const isLoading = newNet === 'loading'
- const missingInfo = !oldNet || !newNet || !oldAddress || !newAddress
- const sameUserAndNetwork = oldAddress === newAddress && oldNet === newNet
- const shouldUpdateTokens = isLoading || missingInfo || sameUserAndNetwork
-
- const oldTokensLength = tokens ? tokens.length : 0
- const tokensLengthUnchanged = oldTokensLength === newTokens.length
-
- if (tokensLengthUnchanged && shouldUpdateTokens) return
-
- this.setState({ isLoading: true })
- this.createFreshTokenTracker()
-}
-
-TokenList.prototype.updateBalances = function (tokens) {
- if (!this.tracker.running) {
- return
- }
- this.setState({ tokens, isLoading: false })
-}
-
-TokenList.prototype.componentWillUnmount = function () {
- if (!this.tracker) return
- this.tracker.stop()
- this.tracker.removeListener('update', this.balanceUpdater)
- this.tracker.removeListener('error', this.showError)
-}
-
-// function uniqueMergeTokens (tokensA, tokensB = []) {
-// const uniqueAddresses = []
-// const result = []
-// tokensA.concat(tokensB).forEach((token) => {
-// const normal = normalizeAddress(token.address)
-// if (!uniqueAddresses.includes(normal)) {
-// uniqueAddresses.push(normal)
-// result.push(token)
-// }
-// })
-// return result
-// }
diff --git a/ui/app/img/identicon-tardigrade.png b/ui/app/img/identicon-tardigrade.png
deleted file mode 100644
index 863acc5e4..000000000
Binary files a/ui/app/img/identicon-tardigrade.png and /dev/null differ
diff --git a/ui/app/img/identicon-walrus.png b/ui/app/img/identicon-walrus.png
deleted file mode 100644
index 1268cab17..000000000
Binary files a/ui/app/img/identicon-walrus.png and /dev/null differ
diff --git a/ui/css.js b/ui/css.js
deleted file mode 100644
index 0d97f5a7c..000000000
--- a/ui/css.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const fs = require('fs')
-const path = require('path')
-
-module.exports = bundleCss
-
-var cssFiles = {
- 'index.css': fs.readFileSync(path.join(__dirname, '/app/css/output/index.css'), 'utf8'),
- 'first-time.css': fs.readFileSync(path.join(__dirname, '../mascara/src/app/first-time/index.css'), 'utf8'),
- // 'react-tooltip.css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-tooltip', 'dist', 'style.css'), 'utf8'),
- 'react-css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-select', 'dist', 'react-select.css'), 'utf8'),
-}
-
-function bundleCss () {
- var cssBundle = Object.keys(cssFiles).reduce(function (bundle, fileName) {
- var fileContent = cssFiles[fileName]
- var output = String()
-
- output += '/*========== ' + fileName + ' ==========*/\n\n'
- output += fileContent
- output += '\n\n'
-
- return bundle + output
- }, String())
-
- return cssBundle
-}
diff --git a/ui/design/00-metamask-SignIn.jpg b/ui/design/00-metamask-SignIn.jpg
deleted file mode 100644
index a19fcaeab..000000000
Binary files a/ui/design/00-metamask-SignIn.jpg and /dev/null differ
diff --git a/ui/design/01-metamask-SelectAcc.jpg b/ui/design/01-metamask-SelectAcc.jpg
deleted file mode 100644
index 7e22811d0..000000000
Binary files a/ui/design/01-metamask-SelectAcc.jpg and /dev/null differ
diff --git a/ui/design/02-metamask-AccDetails.jpg b/ui/design/02-metamask-AccDetails.jpg
deleted file mode 100644
index 515b3b7d6..000000000
Binary files a/ui/design/02-metamask-AccDetails.jpg and /dev/null differ
diff --git a/ui/design/02a-metamask-AccDetails-OverToken.jpg b/ui/design/02a-metamask-AccDetails-OverToken.jpg
deleted file mode 100644
index 6cd19e10a..000000000
Binary files a/ui/design/02a-metamask-AccDetails-OverToken.jpg and /dev/null differ
diff --git a/ui/design/02a-metamask-AccDetails-OverTransaction.jpg b/ui/design/02a-metamask-AccDetails-OverTransaction.jpg
deleted file mode 100644
index 78953f387..000000000
Binary files a/ui/design/02a-metamask-AccDetails-OverTransaction.jpg and /dev/null differ
diff --git a/ui/design/02a-metamask-AccDetails.jpg b/ui/design/02a-metamask-AccDetails.jpg
deleted file mode 100644
index 0b0fd4427..000000000
Binary files a/ui/design/02a-metamask-AccDetails.jpg and /dev/null differ
diff --git a/ui/design/02b-metamask-AccDetails-Send.jpg b/ui/design/02b-metamask-AccDetails-Send.jpg
deleted file mode 100644
index 2d77a80fc..000000000
Binary files a/ui/design/02b-metamask-AccDetails-Send.jpg and /dev/null differ
diff --git a/ui/design/03-metamask-Qr.jpg b/ui/design/03-metamask-Qr.jpg
deleted file mode 100644
index fa0dec0f3..000000000
Binary files a/ui/design/03-metamask-Qr.jpg and /dev/null differ
diff --git a/ui/design/05-metamask-Menu.jpg b/ui/design/05-metamask-Menu.jpg
deleted file mode 100644
index a511aeb80..000000000
Binary files a/ui/design/05-metamask-Menu.jpg and /dev/null differ
diff --git a/ui/design/chromeStorePics/final_screen_dao_accounts.png b/ui/design/chromeStorePics/final_screen_dao_accounts.png
deleted file mode 100644
index 6ae3d8b48..000000000
Binary files a/ui/design/chromeStorePics/final_screen_dao_accounts.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/final_screen_dao_locked.png b/ui/design/chromeStorePics/final_screen_dao_locked.png
deleted file mode 100644
index aa7a3f6c1..000000000
Binary files a/ui/design/chromeStorePics/final_screen_dao_locked.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/final_screen_dao_notification.png b/ui/design/chromeStorePics/final_screen_dao_notification.png
deleted file mode 100644
index c9c220fb4..000000000
Binary files a/ui/design/chromeStorePics/final_screen_dao_notification.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/final_screen_wei_account.png b/ui/design/chromeStorePics/final_screen_wei_account.png
deleted file mode 100644
index d604a94a4..000000000
Binary files a/ui/design/chromeStorePics/final_screen_wei_account.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/final_screen_wei_notification.png b/ui/design/chromeStorePics/final_screen_wei_notification.png
deleted file mode 100644
index 4142b13c7..000000000
Binary files a/ui/design/chromeStorePics/final_screen_wei_notification.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/icon-128.png b/ui/design/chromeStorePics/icon-128.png
deleted file mode 100644
index ffeb4563d..000000000
Binary files a/ui/design/chromeStorePics/icon-128.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/icon-64.png b/ui/design/chromeStorePics/icon-64.png
deleted file mode 100644
index 87c21bd68..000000000
Binary files a/ui/design/chromeStorePics/icon-64.png and /dev/null differ
diff --git a/ui/design/chromeStorePics/metamask_icon.ai b/ui/design/chromeStorePics/metamask_icon.ai
deleted file mode 100644
index 27400c5a4..000000000
--- a/ui/design/chromeStorePics/metamask_icon.ai
+++ /dev/null
@@ -1,2383 +0,0 @@
-%PDF-1.5
%
-1 0 obj
<>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
-
-
-
-
- application/pdf
-
-
- metamask_icon
-
-
- Adobe Illustrator CC 2015 (Macintosh)
- 2016-06-15T14:23:12-04:00
- 2016-06-15T14:23:12-04:00
- 2016-06-15T14:23:12-04:00
-
-
-
- 240
- 256
- JPEG
- /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADwAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXnP5r/mvB5Tg/RmnAT6/cJyUMKx28bVAkf+ZjT4U+k7UDYuo1HBsObl6bTce5+l5X+Wf5t6jonm
KZtfu5rzTNVcG+lkZpHilACLOAamgUBWC/sgUrxAzEwakxl6uRczUaYSj6eYfS9vcQXEEdxA6ywT
KskUimqsjCqsCOoIObUG3UkUvxQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXln5rfnHb+X1l0bQnWfXCCs0+zR2tfEGoaTwXoO/hmJqNTw7Dm5mm0plvL6fvfO
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
-
-
-
- proof:pdf
- uuid:65E6390686CF11DBA6E2D887CEACB407
- xmp.did:d4d07395-aa96-47c2-a9e5-d0351947bb0c
- uuid:c63c1031-e157-9748-9c58-86481308e954
-
- uuid:1abccb90-0c26-4942-b156-fd2eb962e3e1
- xmp.did:58fdc1b8-1448-3a44-9e20-282d8ec1cf95
- uuid:65E6390686CF11DBA6E2D887CEACB407
- proof:pdf
-
-
-
-
- saved
- xmp.iid:d4d07395-aa96-47c2-a9e5-d0351947bb0c
- 2016-06-15T14:23:10-04:00
- Adobe Illustrator CC 2015 (Macintosh)
- /
-
-
-
- Web
- Document
- 1
- True
- False
-
- 128.000000
- 128.000000
- Pixels
-
-
-
- Cyan
- Magenta
- Yellow
- Black
-
-
-
-
-
- Default Swatch Group
- 0
-
-
-
- White
- RGB
- PROCESS
- 255
- 255
- 255
-
-
- Black
- RGB
- PROCESS
- 0
- 0
- 0
-
-
- RGB Red
- RGB
- PROCESS
- 255
- 0
- 0
-
-
- RGB Yellow
- RGB
- PROCESS
- 255
- 255
- 0
-
-
- RGB Green
- RGB
- PROCESS
- 0
- 255
- 0
-
-
- RGB Cyan
- RGB
- PROCESS
- 0
- 255
- 255
-
-
- RGB Blue
- RGB
- PROCESS
- 0
- 0
- 255
-
-
- RGB Magenta
- RGB
- PROCESS
- 255
- 0
- 255
-
-
- R=193 G=39 B=45
- RGB
- PROCESS
- 193
- 39
- 45
-
-
- R=237 G=28 B=36
- RGB
- PROCESS
- 237
- 28
- 36
-
-
- R=241 G=90 B=36
- RGB
- PROCESS
- 241
- 90
- 36
-
-
- R=247 G=147 B=30
- RGB
- PROCESS
- 247
- 147
- 30
-
-
- R=251 G=176 B=59
- RGB
- PROCESS
- 251
- 176
- 59
-
-
- R=252 G=238 B=33
- RGB
- PROCESS
- 252
- 238
- 33
-
-
- R=217 G=224 B=33
- RGB
- PROCESS
- 217
- 224
- 33
-
-
- R=140 G=198 B=63
- RGB
- PROCESS
- 140
- 198
- 63
-
-
- R=57 G=181 B=74
- RGB
- PROCESS
- 57
- 181
- 74
-
-
- R=0 G=146 B=69
- RGB
- PROCESS
- 0
- 146
- 69
-
-
- R=0 G=104 B=55
- RGB
- PROCESS
- 0
- 104
- 55
-
-
- R=34 G=181 B=115
- RGB
- PROCESS
- 34
- 181
- 115
-
-
- R=0 G=169 B=157
- RGB
- PROCESS
- 0
- 169
- 157
-
-
- R=41 G=171 B=226
- RGB
- PROCESS
- 41
- 171
- 226
-
-
- R=0 G=113 B=188
- RGB
- PROCESS
- 0
- 113
- 188
-
-
- R=46 G=49 B=146
- RGB
- PROCESS
- 46
- 49
- 146
-
-
- R=27 G=20 B=100
- RGB
- PROCESS
- 27
- 20
- 100
-
-
- R=102 G=45 B=145
- RGB
- PROCESS
- 102
- 45
- 145
-
-
- R=147 G=39 B=143
- RGB
- PROCESS
- 147
- 39
- 143
-
-
- R=158 G=0 B=93
- RGB
- PROCESS
- 158
- 0
- 93
-
-
- R=212 G=20 B=90
- RGB
- PROCESS
- 212
- 20
- 90
-
-
- R=237 G=30 B=121
- RGB
- PROCESS
- 237
- 30
- 121
-
-
- R=199 G=178 B=153
- RGB
- PROCESS
- 199
- 178
- 153
-
-
- R=153 G=134 B=117
- RGB
- PROCESS
- 153
- 134
- 117
-
-
- R=115 G=99 B=87
- RGB
- PROCESS
- 115
- 99
- 87
-
-
- R=83 G=71 B=65
- RGB
- PROCESS
- 83
- 71
- 65
-
-
- R=198 G=156 B=109
- RGB
- PROCESS
- 198
- 156
- 109
-
-
- R=166 G=124 B=82
- RGB
- PROCESS
- 166
- 124
- 82
-
-
- R=140 G=98 B=57
- RGB
- PROCESS
- 140
- 98
- 57
-
-
- R=117 G=76 B=36
- RGB
- PROCESS
- 117
- 76
- 36
-
-
- R=96 G=56 B=19
- RGB
- PROCESS
- 96
- 56
- 19
-
-
- R=66 G=33 B=11
- RGB
- PROCESS
- 66
- 33
- 11
-
-
-
-
-
- Grays
- 1
-
-
-
- R=0 G=0 B=0
- RGB
- PROCESS
- 0
- 0
- 0
-
-
- R=26 G=26 B=26
- RGB
- PROCESS
- 26
- 26
- 26
-
-
- R=51 G=51 B=51
- RGB
- PROCESS
- 51
- 51
- 51
-
-
- R=77 G=77 B=77
- RGB
- PROCESS
- 77
- 77
- 77
-
-
- R=102 G=102 B=102
- RGB
- PROCESS
- 102
- 102
- 102
-
-
- R=128 G=128 B=128
- RGB
- PROCESS
- 128
- 128
- 128
-
-
- R=153 G=153 B=153
- RGB
- PROCESS
- 153
- 153
- 153
-
-
- R=179 G=179 B=179
- RGB
- PROCESS
- 179
- 179
- 179
-
-
- R=204 G=204 B=204
- RGB
- PROCESS
- 204
- 204
- 204
-
-
- R=230 G=230 B=230
- RGB
- PROCESS
- 230
- 230
- 230
-
-
- R=242 G=242 B=242
- RGB
- PROCESS
- 242
- 242
- 242
-
-
-
-
-
- Web Color Group
- 1
-
-
-
- R=63 G=169 B=245
- RGB
- PROCESS
- 63
- 169
- 245
-
-
- R=122 G=201 B=67
- RGB
- PROCESS
- 122
- 201
- 67
-
-
- R=255 G=147 B=30
- RGB
- PROCESS
- 255
- 147
- 30
-
-
- R=255 G=29 B=37
- RGB
- PROCESS
- 255
- 29
- 37
-
-
- R=255 G=123 B=172
- RGB
- PROCESS
- 255
- 123
- 172
-
-
- R=189 G=204 B=212
- RGB
- PROCESS
- 189
- 204
- 212
-
-
-
-
-
-
- Adobe PDF library 15.00
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
endstream
endobj
3 0 obj
<>
endobj
7 0 obj
<>/Resources<>/ExtGState<>/ProcSet[/PDF/ImageC]/Properties<>/XObject<>>>/Thumb 14 0 R/TrimBox[0.0 0.0 128.0 128.0]/Type/Page>>
endobj
8 0 obj
<>stream
-HwVu6PprqV*234R04S32P4ճT(J
-W*w6PH/H+ X)Hwr.gK>W /@. ӊ
endstream
endobj
9 0 obj
<>
endobj
14 0 obj
<>stream
-8;W:dYmnJk$j=`^PKX*GV"-/6MPPhMW4o*
jFegTA5n:ROqi.
-8M?-(/t#IN>re.=TbIMqYWQK1D%b&pOLGa]H?hKs'8Gqa4A/k;[i&\e-=4:h!/H6BW;~>
endstream
endobj
16 0 obj
[/Indexed/DeviceRGB 255 17 0 R]
endobj
17 0 obj
<>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
-b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
-E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn
-6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O(
-l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
13 0 obj
<>/Filter/FlateDecode/Height 947/Intent/RelativeColorimetric/Length 90241/Name/X/SMask 18 0 R/Subtype/Image/Type/XObject/Width 880>>stream
-Hoi@Hy&8_nyA'? 6G3+ZHҥYakOj6gיoUGHII_Ag K/EcF6LrchI 2$҆ԘU4w$5_ 7BQUm"Ť>&k2W$% Nib;Iߓuavտ,HJ
\u.&1ٌ^ @Ǥl_Lrs:#ј,32]IJ 7d+65i1$Lb# d]G>&Y=g답*_/ *:p.uʙcRIf") ˬ#q4Ό=sL&=(P{HJ +b~n+cSFsm0' &&cܼXI=3zER ,D#0)2=r
-I Ә