AddressField.tsx
 1  import React from 'react';
 2  import { Result } from 'mycrypto-nano-result';
 3  
 4  import { translateRaw } from 'translations';
 5  import { isValidETHAddress } from 'libs/validators';
 6  import { Input } from 'components/ui';
 7  import { IGenerateAddressLookup } from './AddCustomTokenForm';
 8  
 9  interface OwnProps {
10    addressLookup: IGenerateAddressLookup;
11    onChange(address: Result<string>): void;
12  }
13  
14  enum ErrType {
15    INVALIDADDR = 'Not a valid address',
16    ADDRTAKEN = 'A token with this address already exists'
17  }
18  
19  interface State {
20    address: Result<string>;
21    userInput: string;
22  }
23  
24  export class AddressField extends React.Component<OwnProps, State> {
25    public state: State = {
26      address: Result.from({ res: '' }),
27      userInput: ''
28    };
29  
30    public render() {
31      const { userInput, address } = this.state;
32  
33      return (
34        <label className="AddCustom-field form-group">
35          <div className="input-group-header">{translateRaw('TOKEN_ADDR')}</div>
36          <Input
37            isValid={address.ok()}
38            className="input-group-input-small"
39            type="text"
40            name="Address"
41            value={address.ok() ? address.unwrap() : userInput}
42            onChange={this.handleFieldChange}
43          />
44          {address.err() && <div className="AddCustom-field-error">{address.err()}</div>}
45        </label>
46      );
47    }
48  
49    private handleFieldChange = (e: React.FormEvent<HTMLInputElement>) => {
50      const userInput = e.currentTarget.value;
51      const addrTaken = this.props.addressLookup[userInput];
52      const validAddr = isValidETHAddress(userInput);
53      const err = addrTaken ? ErrType.ADDRTAKEN : !validAddr ? ErrType.INVALIDADDR : undefined;
54      const address: Result<string> = err ? Result.from({ err }) : Result.from({ res: userInput });
55  
56      this.setState({ userInput, address });
57      this.props.onChange(address);
58    };
59  }