poa-dapps-validators/src/App.js

240 lines
8.7 KiB
JavaScript
Raw Normal View History

2017-12-11 17:35:57 -08:00
import React, { Component } from 'react';
import './stylesheets/application.css';
2018-01-25 01:45:18 -08:00
import PlacesAutocomplete, { geocodeByAddress } from 'react-places-autocomplete';
2017-12-11 17:35:57 -08:00
import moment from 'moment';
import Loading from './Loading';
import { messages } from './messages';
import helpers from './helpers';
import { constants } from "./constants";
2017-12-11 17:35:57 -08:00
class App extends Component {
constructor(props){
super(props);
this.checkValidation = this.checkValidation.bind(this)
this.onClick = this.onClick.bind(this);
this.onChangeFormField = this.onChangeFormField.bind(this);
this.getKeysManager = this.getKeysManager.bind(this);
this.getMetadataContract = this.getMetadataContract.bind(this);
this.getVotingKey = this.getVotingKey.bind(this);
2017-12-11 17:35:57 -08:00
this.onChangeAutoComplete = ((address) => {
const form = this.state.form;
form.fullAddress = address;
this.setState({form})
})
this.onSelect = this.onSelectAutocomplete.bind(this)
this.state = {
web3Config: {},
form: {
fullAddress: '',
expirationDate: '',
postal_code: '',
us_state: '',
firstName: '',
lastName: '',
licenseId: ''
},
hasData: false
2017-12-11 17:35:57 -08:00
}
this.defaultValues = null;
this.setMetadata.call(this);
2017-12-11 17:35:57 -08:00
}
async setMetadata(){
const currentData = await this.getMetadataContract().getValidatorData({votingKey: this.getVotingKey()});
2018-04-11 03:59:50 -07:00
const hasData = currentData.postal_code ? true : false
this.defaultValues = currentData;
2017-12-12 23:27:31 -08:00
const pendingChange = await this.getMetadataContract().getPendingChange({votingKey: this.getVotingKey()});
if(Number(pendingChange.minThreshold) > 0 ) {
var msg = `
First Name: <b>${pendingChange.firstName}</b> <br/>
Last Name: <b>${pendingChange.lastName}</b> <br/>
Full Address: <b>${pendingChange.fullAddress}</b> <br/>
Expiration Date: <b>${pendingChange.expirationDate}</b> <br />
License ID: <b>${pendingChange.licenseId}</b> <br/>
US state: <b>${pendingChange.us_state}</b> <br/>
Zip Code: <b>${pendingChange.postal_code}</b> <br/>
`;
helpers.generateAlert("warning", "You have pending changes!", msg);
2017-12-12 23:27:31 -08:00
}
this.setState({
form: {
2017-12-12 01:25:19 -08:00
fullAddress: currentData.fullAddress,
expirationDate: currentData.expirationDate,
postal_code: currentData.postal_code,
us_state: currentData.us_state,
firstName: currentData.firstName,
lastName: currentData.lastName,
licenseId: currentData.licenseId,
},
hasData
});
}
getKeysManager(){
return this.props.web3Config.keysManager;
}
getMetadataContract(){
return this.props.web3Config.metadataContract;
}
getVotingKey(){
return this.props.web3Config.votingKey;
}
2017-12-11 17:35:57 -08:00
checkValidation() {
const isAfter = moment(this.state.form.expirationDate).isAfter(moment());
let keys = Object.keys(this.state.form);
keys.forEach((key) => {
if(!this.state.form[key]){
this.setState({loading: false})
helpers.generateAlert("warning", "Warning!", `${key} cannot be empty`);
2017-12-11 17:35:57 -08:00
return false;
}
})
if(isAfter){
} else {
this.setState({loading: false})
helpers.generateAlert("warning", "Warning!", "Expiration date should be valid");
2017-12-11 17:35:57 -08:00
return false;
}
return true;
}
async onSelectAutocomplete(data) {
let place = await geocodeByAddress(data)
let address_components = {};
for (var i = 0; i < place[0].address_components.length; i++) {
var addressType = place[0].address_components[i].types[0];
switch(addressType) {
case "postal_code":
2018-04-11 03:59:50 -07:00
address_components.postal_code = place[0].address_components[i].short_name;
2017-12-11 17:35:57 -08:00
break;
case "street_number":
address_components.street_number = place[0].address_components[i].short_name;
break;
case "route":
address_components.route = place[0].address_components[i].short_name;
break;
case "locality":
address_components.locality = place[0].address_components[i].short_name;
break;
case "administrative_area_level_1":
address_components.administrative_area_level_1 = place[0].address_components[i].short_name;
break;
2018-02-26 06:35:10 -08:00
default:
break;
2017-12-11 17:35:57 -08:00
}
let form = this.state.form;
form.fullAddress= `${address_components.street_number} ${address_components.route} ${address_components.locality}`;
form.us_state= address_components.administrative_area_level_1;
form.postal_code= address_components.postal_code;
this.setState({
form
});
}
}
async onClick() {
this.setState({loading:true});
const isFormValid = this.checkValidation();
if(isFormValid){
2017-12-12 01:25:19 -08:00
const votingKey = this.getVotingKey();
console.log('voting', votingKey)
const isValid = await this.getKeysManager().isVotingActive(votingKey);
console.log(isValid);
if(isValid){
// // add loading screen
await this.sendTxToContract()
} else {
2017-12-11 17:35:57 -08:00
this.setState({loading:false});
helpers.generateAlert("warning", "Warning!", messages.invalidaVotingKey);
2017-12-11 17:35:57 -08:00
return;
}
}
}
async sendTxToContract(){
this.getMetadataContract().createMetadata({
2017-12-11 17:35:57 -08:00
firstName: this.state.form.firstName,
lastName: this.state.form.lastName,
licenseId: this.state.form.licenseId,
fullAddress: this.state.form.fullAddress,
state: this.state.form.us_state,
zipcode: this.state.form.postal_code,
expirationDate: moment(this.state.form.expirationDate).unix(),
2017-12-12 01:25:19 -08:00
votingKey: this.getVotingKey(),
2017-12-11 17:35:57 -08:00
hasData: this.state.hasData
}).then((receipt) => {
console.log(receipt);
this.setState({loading: false})
helpers.generateAlert("success", "Congratulations!", "Your metadata was sent!");
2017-12-11 17:35:57 -08:00
}).catch((error) => {
console.error(error.message);
let errDescription
if (error.message.includes(constants.userDeniedTransactionPattern))
errDescription = `Error: User ${constants.userDeniedTransactionPattern}`
else
errDescription = error.message
2017-12-11 17:35:57 -08:00
this.setState({loading: false})
var msg = `
Something went wrong!<br/><br/>
${errDescription}
`;
helpers.generateAlert("error", "Error!", msg);
2017-12-11 17:35:57 -08:00
})
}
onChangeFormField(event) {
const field = event.target.id;
const value = event.target.value;
let form = this.state.form;
form[field] = value;
this.setState({form});
}
render() {
const BtnAction = this.state.hasData ? "Update" : "Set";
const AutocompleteItem = ({ formattedSuggestion }) => (
<div className="custom-container">
<strong>{ formattedSuggestion.mainText }</strong>{' '}
<small>{ formattedSuggestion.secondaryText }</small>
</div>
)
2017-12-11 17:35:57 -08:00
const inputProps = {
value: this.state.form.fullAddress,
onChange: this.onChangeAutoComplete,
id: 'address'
}
2017-12-11 17:35:57 -08:00
let loader = this.state.loading ? <Loading /> : '';
let createKeyBtn = (
<div className="create-keys">
<form className="create-keys-form">
<div className="create-keys-form-i">
<label htmlFor="first-name">First name</label>
<input type="text" id="firstName" value={this.state.form.firstName} onChange={this.onChangeFormField}/>
<label htmlFor="last-name">Last name</label>
<input type="text" id="lastName" value={this.state.form.lastName} onChange={this.onChangeFormField}/>
<label htmlFor="address">Address</label>
<PlacesAutocomplete onSelect={this.onSelect} inputProps={inputProps} autocompleteItem={AutocompleteItem} />
<label htmlFor="state">State</label>
<input type="text" id="us_state" value={this.state.form.us_state} onChange={this.onChangeFormField}/>
</div>
<div className="create-keys-form-i">
<label htmlFor="zip">Zip code</label>
2018-04-11 03:59:50 -07:00
<input type="text" id="postal_code" value={this.state.form.postal_code} onChange={this.onChangeFormField}/>
<label htmlFor="licenseId">License id</label>
<input type="text" id="licenseId" value={this.state.form.licenseId} onChange={this.onChangeFormField}/>
<label htmlFor="expirationDate">License expiration</label>
<input type="date" id="expirationDate" value={this.state.form.expirationDate} onChange={this.onChangeFormField}/>
</div>
</form>
<button onClick={this.onClick} className="create-keys-button">{BtnAction} Metadata</button>
</div>)
2017-12-11 17:35:57 -08:00
let content = createKeyBtn;
return (
<div className="container">
{loader}
{content}
2017-12-11 17:35:57 -08:00
</div>
);
}
}
export default App;