mirror of https://github.com/embarklabs/embark.git
130 lines
4.6 KiB
JavaScript
130 lines
4.6 KiB
JavaScript
|
class InstanceSelector extends React.Component {
|
||
|
|
||
|
constructor(props) {
|
||
|
super(props);
|
||
|
this.state = {
|
||
|
showInstances: false,
|
||
|
showCustomAddressField: false,
|
||
|
selectedInstance: props.selectedInstance,
|
||
|
customInstance: "",
|
||
|
error: false,
|
||
|
errorMessage: ""
|
||
|
};
|
||
|
|
||
|
this.handleShowInstances = this.handleShowInstances.bind(this);
|
||
|
this.handleChange = this.handleChange.bind(this);
|
||
|
this.handleClick = this.handleClick.bind(this);
|
||
|
this.handleTextChange = this.handleTextChange.bind(this);
|
||
|
}
|
||
|
|
||
|
handleTextChange(e){
|
||
|
this.setState({customInstance: e.target.value});
|
||
|
}
|
||
|
|
||
|
handleShowInstances(e){
|
||
|
e.preventDefault();
|
||
|
this.setState({
|
||
|
showInstances: !this.state.showInstances
|
||
|
});
|
||
|
}
|
||
|
|
||
|
handleClick(e){
|
||
|
e.preventDefault();
|
||
|
|
||
|
let instance;
|
||
|
if(this.state.selectedInstance == "custom"){
|
||
|
instance = this.state.customInstance;
|
||
|
} else {
|
||
|
instance = this.state.selectedInstance;
|
||
|
}
|
||
|
|
||
|
if(!/^0x[0-9a-f]{40}$/i.test(instance)){
|
||
|
this.setState({error: true, errorMessage: 'Not a valid Ethereum address.'});
|
||
|
console.log(this.state.errorMessage);
|
||
|
return;
|
||
|
} else {
|
||
|
this.setState({error: false});
|
||
|
}
|
||
|
|
||
|
this.props.instanceUpdate(instance);
|
||
|
|
||
|
this.setState({
|
||
|
showInstances: false,
|
||
|
showCustomAddressField: false,
|
||
|
selectedInstance: instance,
|
||
|
customInstance: this.state.selectedInstance == "custom" ? this.state.customInstance : ""
|
||
|
})
|
||
|
}
|
||
|
|
||
|
handleChange(e){
|
||
|
this.setState({
|
||
|
showCustomAddressField: e.target.value == "custom",
|
||
|
selectedInstance: e.target.value
|
||
|
});
|
||
|
}
|
||
|
|
||
|
render(){
|
||
|
|
||
|
return <ContractContext.Consumer>
|
||
|
{ (context) => (<div className="contractSelection">
|
||
|
|
||
|
|
||
|
|
||
|
<div className="card">
|
||
|
<div className="card-header">
|
||
|
<h3 className="card-title">
|
||
|
Instance Selected: <b>{this.props.selectedInstance != null ? this.props.selectedInstance : 'none'}</b>
|
||
|
</h3>
|
||
|
<div className="card-options">
|
||
|
{
|
||
|
!this.state.showInstances
|
||
|
?
|
||
|
<a href="#" className="btn btn-primary btn-sm" onClick={this.handleShowInstances}>Change</a>
|
||
|
:
|
||
|
<a href="#" className="btn btn-secondary btn-sm" onClick={this.handleShowInstances}>Cancel</a>
|
||
|
}
|
||
|
</div>
|
||
|
</div>
|
||
|
{
|
||
|
this.state.showInstances ?
|
||
|
<React.Fragment>
|
||
|
{
|
||
|
this.state.error
|
||
|
?
|
||
|
<div className="card-alert alert alert-danger mb-0">
|
||
|
{this.state.errorMessage}
|
||
|
</div>
|
||
|
:
|
||
|
''
|
||
|
}
|
||
|
<div className="card-body">
|
||
|
<div className="form-group control-group error">
|
||
|
<select className="form-control" id="contracts" value={this.state.selectedInstance} onChange={this.handleChange}>
|
||
|
<option value="custom">Specific contract address</option>
|
||
|
{
|
||
|
context.instances.map(function (item, i) {
|
||
|
return <option key={i} value={item}>{item}</option>;
|
||
|
})
|
||
|
}
|
||
|
</select>
|
||
|
{
|
||
|
this.state.showCustomAddressField ?
|
||
|
<input type="text" className="form-control" id="specificAddress" onChange={this.handleTextChange} placeholder="0x" />
|
||
|
: ''
|
||
|
}
|
||
|
</div>
|
||
|
</div>
|
||
|
<div className="card-footer text-right">
|
||
|
<button className="btn btn-primary" onClick={this.handleClick}>Change</button>
|
||
|
</div>
|
||
|
</React.Fragment>
|
||
|
:
|
||
|
''
|
||
|
}
|
||
|
</div>
|
||
|
</div>
|
||
|
)}
|
||
|
</ContractContext.Consumer>;
|
||
|
}
|
||
|
|
||
|
}
|