parent
1a9b217558
commit
449bce5eea
@ -0,0 +1,185 @@ |
|||||||
|
import React, {Component, PropTypes} from 'react' |
||||||
|
import classnames from 'classnames' |
||||||
|
import {importNewAccount} from '../../../../ui/app/actions' |
||||||
|
import {connect} from 'react-redux'; |
||||||
|
|
||||||
|
const Input = ({ label, placeholder, onChange, errorMessage, type = 'text' }) => ( |
||||||
|
<div className="import-account__input-wrapper"> |
||||||
|
<div className="import-account__input-label">{label}</div> |
||||||
|
<input |
||||||
|
type={type} |
||||||
|
placeholder={placeholder} |
||||||
|
className={classnames('first-time-flow__input import-account__input', { |
||||||
|
'first-time-flow__input--error': errorMessage |
||||||
|
})} |
||||||
|
onChange={onChange} |
||||||
|
/> |
||||||
|
<div className="import-account__input-error-message">{errorMessage}</div> |
||||||
|
</div> |
||||||
|
) |
||||||
|
|
||||||
|
class ImportAccountScreen extends Component { |
||||||
|
static OPTIONS = { |
||||||
|
PRIVATE_KEY: 'private_key', |
||||||
|
JSON_FILE: 'json_file', |
||||||
|
}; |
||||||
|
|
||||||
|
static propTypes = { |
||||||
|
warning: PropTypes.string, |
||||||
|
back: PropTypes.func.isRequired, |
||||||
|
next: PropTypes.func.isRequired, |
||||||
|
importNewAccount: PropTypes.func.isRequired, |
||||||
|
}; |
||||||
|
|
||||||
|
state = { |
||||||
|
selectedOption: ImportAccountScreen.OPTIONS.PRIVATE_KEY, |
||||||
|
privateKey: '', |
||||||
|
jsonFile: {}, |
||||||
|
} |
||||||
|
|
||||||
|
isValid() { |
||||||
|
const { OPTIONS } = ImportAccountScreen; |
||||||
|
const { privateKey, jsonFile, password } = this.state; |
||||||
|
|
||||||
|
switch (this.state.selectedOption) { |
||||||
|
case OPTIONS.JSON_FILE: |
||||||
|
return Boolean(jsonFile && password) |
||||||
|
case OPTIONS.PRIVATE_KEY: |
||||||
|
default: |
||||||
|
return Boolean(privateKey) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
onClick = () => { |
||||||
|
const { OPTIONS } = ImportAccountScreen; |
||||||
|
const { importNewAccount, next } = this.props; |
||||||
|
const { privateKey, jsonFile, password } = this.state; |
||||||
|
|
||||||
|
switch (this.state.selectedOption) { |
||||||
|
case OPTIONS.JSON_FILE: |
||||||
|
return importNewAccount('JSON File', [ jsonFile, password ]) |
||||||
|
.then(next) |
||||||
|
case OPTIONS.PRIVATE_KEY: |
||||||
|
default: |
||||||
|
return importNewAccount('Private Key', [ privateKey ]) |
||||||
|
.then(next) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
renderPrivateKey() { |
||||||
|
return Input({ |
||||||
|
label: 'Add Private Key String', |
||||||
|
placeholder: 'Enter private key', |
||||||
|
onChange: e => this.setState({ privateKey: e.target.value }), |
||||||
|
errorMessage: this.props.warning && 'Something went wrong. Please make sure your private key is correct.' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
renderJsonFile() { |
||||||
|
const { jsonFile: { name } } = this.state; |
||||||
|
const { warning } = this.props; |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className=""> |
||||||
|
<div className="import-account__input-wrapper"> |
||||||
|
<div className="import-account__input-label">Upload File</div> |
||||||
|
<div className="import-account__file-picker-wrapper"> |
||||||
|
<input |
||||||
|
type="file" |
||||||
|
id="file" |
||||||
|
className="import-account__file-input" |
||||||
|
onChange={e => this.setState({ jsonFile: e.target.files[0] })} |
||||||
|
/> |
||||||
|
<label |
||||||
|
htmlFor="file" |
||||||
|
className={classnames('import-account__file-input-label', { |
||||||
|
'import-account__file-input-label--error': warning |
||||||
|
})} |
||||||
|
> |
||||||
|
Choose File |
||||||
|
</label> |
||||||
|
<div className="import-account__file-name">{name}</div> |
||||||
|
</div> |
||||||
|
<div className="import-account__input-error-message"> |
||||||
|
{warning && 'Something went wrong. Please make sure your JSON file is properly formatted.'} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{Input({ |
||||||
|
label: 'Enter Password', |
||||||
|
placeholder: 'Enter Password', |
||||||
|
type: 'password', |
||||||
|
onChange: e => this.setState({ password: e.target.value }), |
||||||
|
errorMessage: warning && 'Please make sure your password is correct.' |
||||||
|
})} |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderContent() { |
||||||
|
const { OPTIONS } = ImportAccountScreen; |
||||||
|
|
||||||
|
switch (this.state.selectedOption) { |
||||||
|
case OPTIONS.JSON_FILE: |
||||||
|
return this.renderJsonFile() |
||||||
|
case OPTIONS.PRIVATE_KEY: |
||||||
|
default: |
||||||
|
return this.renderPrivateKey() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
render() { |
||||||
|
const { OPTIONS } = ImportAccountScreen; |
||||||
|
const { selectedOption } = this.state; |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className="import-account"> |
||||||
|
<a |
||||||
|
className="import-account__back-button" |
||||||
|
onClick={e => { |
||||||
|
e.preventDefault() |
||||||
|
this.props.back() |
||||||
|
}} |
||||||
|
href="#" |
||||||
|
> |
||||||
|
{`< Back`} |
||||||
|
</a> |
||||||
|
<div className="import-account__title"> |
||||||
|
Import an Account |
||||||
|
</div> |
||||||
|
<div className="import-account__selector-label"> |
||||||
|
How would you like to import your account? |
||||||
|
</div> |
||||||
|
<select |
||||||
|
className="import-account__dropdown" |
||||||
|
value={selectedOption} |
||||||
|
onChange={e => this.setState({ selectedOption: e.target.value })} |
||||||
|
> |
||||||
|
<option value={OPTIONS.PRIVATE_KEY}>Private Key</option> |
||||||
|
<option value={OPTIONS.JSON_FILE}>JSON File</option> |
||||||
|
</select> |
||||||
|
{this.renderContent()} |
||||||
|
<button |
||||||
|
className="first-time-flow__button" |
||||||
|
disabled={!this.isValid()} |
||||||
|
onClick={this.onClick} |
||||||
|
> |
||||||
|
Import |
||||||
|
</button> |
||||||
|
<a |
||||||
|
href="https://github.com/MetaMask/faq/blob/master/README.md#q-i-cant-use-the-import-feature-for-uploading-a-json-file-the-window-keeps-closing-when-i-try-to-select-a-file" |
||||||
|
className="first-time-flow__link import-account__faq-link" |
||||||
|
target="_blank" |
||||||
|
> |
||||||
|
File import not working? |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default connect( |
||||||
|
({ appState: { isLoading, warning } }) => ({ isLoading, warning }), |
||||||
|
dispatch => ({ |
||||||
|
importNewAccount: (strategy, args) => dispatch(importNewAccount(strategy, args)) |
||||||
|
}) |
||||||
|
)(ImportAccountScreen) |
Loading…
Reference in new issue