2018-07-17 14:38:28 -07:00
|
|
|
import 'react-select/dist/react-select.css'
|
2018-07-03 18:54:51 -07:00
|
|
|
import AllValidators from './AllValidators'
|
2018-07-04 16:10:26 -07:00
|
|
|
import App from './App'
|
|
|
|
import Footer from './Footer'
|
|
|
|
import Header from './Header'
|
2017-12-11 17:35:57 -08:00
|
|
|
import KeysManager from './contracts/KeysManager.contract'
|
2017-12-11 23:01:59 -08:00
|
|
|
import Loading from './Loading'
|
2018-07-03 18:54:51 -07:00
|
|
|
import Metadata from './contracts/Metadata.contract'
|
2018-07-04 16:10:26 -07:00
|
|
|
import React, { Component } from 'react'
|
|
|
|
import ReactDOM from 'react-dom'
|
2018-07-03 18:54:51 -07:00
|
|
|
import createBrowserHistory from 'history/createBrowserHistory'
|
|
|
|
import getWeb3, { setWeb3 } from './getWeb3'
|
|
|
|
import helpers from './helpers'
|
2018-07-04 16:10:26 -07:00
|
|
|
import networkAddresses from './contracts/addresses'
|
|
|
|
import registerServiceWorker from './registerServiceWorker'
|
2018-07-04 15:43:37 -07:00
|
|
|
import { Router, Route } from 'react-router-dom'
|
2018-07-17 14:38:28 -07:00
|
|
|
import { messages } from './messages'
|
2018-01-23 13:32:28 -08:00
|
|
|
|
2017-12-11 23:01:59 -08:00
|
|
|
const history = createBrowserHistory()
|
2018-07-17 14:38:28 -07:00
|
|
|
const baseRootPath = '/poa-dapps-validators'
|
2018-07-04 04:40:25 -07:00
|
|
|
const navigationData = [
|
|
|
|
{
|
2018-07-17 14:38:28 -07:00
|
|
|
icon: 'link-icon-all',
|
|
|
|
title: 'All',
|
|
|
|
url: baseRootPath
|
2018-07-04 04:40:25 -07:00
|
|
|
},
|
|
|
|
{
|
2018-07-17 14:38:28 -07:00
|
|
|
icon: 'link-icon-set-metadata',
|
|
|
|
title: 'Set Metadata',
|
|
|
|
url: `${baseRootPath}/set`
|
2018-07-04 04:40:25 -07:00
|
|
|
},
|
|
|
|
{
|
2018-07-17 14:38:28 -07:00
|
|
|
icon: 'link-icon-pending-changes',
|
|
|
|
title: 'Pending Changes',
|
|
|
|
url: `${baseRootPath}/pending-changes`
|
|
|
|
}
|
|
|
|
]
|
2018-07-04 04:40:25 -07:00
|
|
|
|
2017-12-11 23:01:59 -08:00
|
|
|
class AppMainRouter extends Component {
|
2018-07-03 18:54:51 -07:00
|
|
|
constructor(props) {
|
2018-07-17 14:38:28 -07:00
|
|
|
super(props)
|
2018-07-03 18:54:51 -07:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
history.listen(this.onRouteChange.bind(this))
|
2018-07-04 16:10:26 -07:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
this.onSetRender = this.onSetRender.bind(this)
|
|
|
|
this.onPendingChangesRender = this.onPendingChangesRender.bind(this)
|
2017-12-11 23:01:59 -08:00
|
|
|
this.onAllValidatorsRender = this.onAllValidatorsRender.bind(this)
|
2018-07-17 14:38:28 -07:00
|
|
|
this.onConfirmPendingChange = this.onConfirmPendingChange.bind(this)
|
|
|
|
this.onFinalize = this.onFinalize.bind(this)
|
|
|
|
this.onSearch = this.onSearch.bind(this)
|
|
|
|
this.onNetworkChange = this.onNetworkChange.bind(this)
|
|
|
|
this.toggleMobileMenu = this.toggleMobileMenu.bind(this)
|
2018-07-18 11:17:09 -07:00
|
|
|
this.getNetIdClass = this.getNetIdClass.bind(this)
|
2018-07-04 16:10:26 -07:00
|
|
|
|
2017-12-11 23:01:59 -08:00
|
|
|
this.state = {
|
|
|
|
showSearch: true,
|
2018-06-29 00:54:14 -07:00
|
|
|
keysManager: null,
|
2017-12-11 23:01:59 -08:00
|
|
|
metadataContract: null,
|
|
|
|
poaConsensus: null,
|
2018-06-29 00:54:14 -07:00
|
|
|
votingKey: null,
|
2017-12-12 00:29:28 -08:00
|
|
|
loading: true,
|
2017-12-29 22:27:13 -08:00
|
|
|
searchTerm: '',
|
2018-01-25 01:26:29 -08:00
|
|
|
injectedWeb3: true,
|
2018-01-25 00:26:31 -08:00
|
|
|
netId: '',
|
2018-07-03 18:54:51 -07:00
|
|
|
error: false,
|
2018-07-04 09:37:52 -07:00
|
|
|
title: navigationData[0].title,
|
|
|
|
showMobileMenu: false
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
2018-07-17 14:38:28 -07:00
|
|
|
getWeb3()
|
|
|
|
.then(async web3Config => {
|
|
|
|
return networkAddresses(web3Config)
|
2018-02-01 14:48:48 -08:00
|
|
|
})
|
2018-07-17 14:38:28 -07:00
|
|
|
.then(async config => {
|
|
|
|
const { web3Config, addresses } = config
|
|
|
|
const keysManager = new KeysManager()
|
|
|
|
await keysManager.init({
|
|
|
|
web3: web3Config.web3Instance,
|
|
|
|
netId: web3Config.netId,
|
|
|
|
addresses
|
|
|
|
})
|
|
|
|
const metadataContract = new Metadata()
|
|
|
|
await metadataContract.init({
|
|
|
|
web3: web3Config.web3Instance,
|
|
|
|
netId: web3Config.netId,
|
|
|
|
addresses
|
|
|
|
})
|
|
|
|
this.setState({
|
|
|
|
votingKey: web3Config.defaultAccount,
|
|
|
|
keysManager,
|
|
|
|
metadataContract,
|
|
|
|
loading: false,
|
|
|
|
injectedWeb3: web3Config.injectedWeb3,
|
|
|
|
netId: web3Config.netId
|
|
|
|
})
|
2017-12-11 23:01:59 -08:00
|
|
|
})
|
2018-07-17 14:38:28 -07:00
|
|
|
.catch(error => {
|
|
|
|
console.error(error.message)
|
|
|
|
this.setState({ loading: false, error: true })
|
|
|
|
helpers.generateAlert('error', 'Error!', error.message)
|
2017-12-11 23:01:59 -08:00
|
|
|
})
|
|
|
|
}
|
2018-07-03 18:54:51 -07:00
|
|
|
onRouteChange() {
|
2018-07-18 11:17:09 -07:00
|
|
|
const setMetadata = baseRootPath + '/set'
|
2018-07-03 18:54:51 -07:00
|
|
|
|
|
|
|
if (history.location.pathname === setMetadata) {
|
|
|
|
this.setState({ showSearch: false })
|
2018-07-04 04:40:25 -07:00
|
|
|
|
2018-07-03 18:54:51 -07:00
|
|
|
if (this.state.injectedWeb3 === false) {
|
2018-07-17 14:38:28 -07:00
|
|
|
helpers.generateAlert('warning', 'Warning!', 'Metamask was not found')
|
2017-12-29 22:27:13 -08:00
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
} else {
|
2018-07-03 18:54:51 -07:00
|
|
|
this.setState({ showSearch: true })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
checkForVotingKey(cb) {
|
|
|
|
if (this.state.votingKey && !this.state.loading) {
|
2018-07-17 14:38:28 -07:00
|
|
|
return cb()
|
2018-01-23 13:32:28 -08:00
|
|
|
}
|
2018-07-17 14:38:28 -07:00
|
|
|
helpers.generateAlert('warning', 'Warning!', messages.noMetamaskAccount)
|
|
|
|
return ''
|
2018-01-23 13:32:28 -08:00
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
onSetRender() {
|
2018-06-29 00:54:14 -07:00
|
|
|
if (!this.state.netId) {
|
2018-07-17 14:38:28 -07:00
|
|
|
return ''
|
2018-06-29 00:54:14 -07:00
|
|
|
}
|
2018-01-23 13:32:28 -08:00
|
|
|
return this.checkForVotingKey(() => {
|
2018-07-18 11:17:09 -07:00
|
|
|
return <App web3Config={this.state} viewTitle={navigationData[1]['title']} />
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
2018-07-04 09:37:52 -07:00
|
|
|
toggleMobileMenu = () => {
|
|
|
|
this.setState(prevState => ({ showMobileMenu: !prevState.showMobileMenu }))
|
|
|
|
}
|
|
|
|
|
2018-07-03 18:54:51 -07:00
|
|
|
async _onBtnClick({ event, methodToCall, successMsg }) {
|
2018-07-17 14:38:28 -07:00
|
|
|
event.preventDefault()
|
2018-01-23 13:32:28 -08:00
|
|
|
this.checkForVotingKey(async () => {
|
2018-07-03 18:54:51 -07:00
|
|
|
this.setState({ loading: true })
|
2018-07-17 14:38:28 -07:00
|
|
|
const miningKey = event.currentTarget.getAttribute('miningkey')
|
2018-07-03 18:54:51 -07:00
|
|
|
try {
|
2018-01-23 13:32:28 -08:00
|
|
|
let result = await this.state.metadataContract[methodToCall]({
|
|
|
|
miningKeyToConfirm: miningKey,
|
|
|
|
senderVotingKey: this.state.votingKey
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
|
|
|
console.log(result)
|
2018-07-03 18:54:51 -07:00
|
|
|
this.setState({ loading: false })
|
2018-07-17 14:38:28 -07:00
|
|
|
helpers.generateAlert('success', 'Congratulations!', successMsg)
|
2018-07-03 18:54:51 -07:00
|
|
|
} catch (error) {
|
|
|
|
this.setState({ loading: false })
|
2018-07-17 14:38:28 -07:00
|
|
|
console.error(error.message)
|
|
|
|
helpers.generateAlert('error', 'Error!', error.message)
|
2018-01-23 13:32:28 -08:00
|
|
|
}
|
|
|
|
})
|
2017-12-12 23:27:31 -08:00
|
|
|
}
|
2017-12-13 16:39:17 -08:00
|
|
|
async onConfirmPendingChange(event) {
|
|
|
|
await this._onBtnClick({
|
|
|
|
event,
|
|
|
|
methodToCall: 'confirmPendingChange',
|
|
|
|
successMsg: 'You have successfully confirmed the change!'
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
2017-12-13 16:39:17 -08:00
|
|
|
}
|
2018-07-03 18:54:51 -07:00
|
|
|
async onFinalize(event) {
|
2017-12-13 16:39:17 -08:00
|
|
|
await this._onBtnClick({
|
|
|
|
event,
|
|
|
|
methodToCall: 'finalize',
|
|
|
|
successMsg: 'You have successfully finalized the change!'
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
2017-12-13 16:39:17 -08:00
|
|
|
}
|
2017-12-12 23:27:31 -08:00
|
|
|
onPendingChangesRender() {
|
2018-07-17 14:38:28 -07:00
|
|
|
return this.state.loading || this.state.error ? (
|
|
|
|
''
|
|
|
|
) : (
|
|
|
|
<AllValidators
|
|
|
|
ref="AllValidatorsRef"
|
|
|
|
methodToCall="getAllPendingChanges"
|
|
|
|
searchTerm={this.state.searchTerm}
|
|
|
|
web3Config={this.state}
|
2018-07-18 11:17:09 -07:00
|
|
|
viewTitle={navigationData[2]['title']}
|
2018-07-17 14:38:28 -07:00
|
|
|
>
|
|
|
|
<button onClick={this.onFinalize} className="create-keys-button finalize">
|
|
|
|
Finalize
|
|
|
|
</button>
|
|
|
|
<button onClick={this.onConfirmPendingChange} className="create-keys-button">
|
|
|
|
Confirm
|
|
|
|
</button>
|
|
|
|
</AllValidators>
|
|
|
|
)
|
2017-12-12 23:27:31 -08:00
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
onAllValidatorsRender() {
|
2018-07-17 14:38:28 -07:00
|
|
|
return this.state.loading || this.state.error ? (
|
|
|
|
''
|
|
|
|
) : (
|
2018-07-18 11:17:09 -07:00
|
|
|
<AllValidators
|
|
|
|
searchTerm={this.state.searchTerm}
|
|
|
|
methodToCall="getAllValidatorsData"
|
|
|
|
web3Config={this.state}
|
|
|
|
viewTitle={navigationData[0]['title']}
|
|
|
|
/>
|
2018-07-17 14:38:28 -07:00
|
|
|
)
|
2017-12-13 02:01:21 -08:00
|
|
|
}
|
2018-07-18 11:17:09 -07:00
|
|
|
getNetIdClass() {
|
|
|
|
return this.state.netId === '77' ? 'sokol' : ''
|
|
|
|
}
|
2018-07-03 18:54:51 -07:00
|
|
|
onSearch(term) {
|
|
|
|
this.setState({ searchTerm: term.target.value.toLowerCase() })
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
2018-07-03 18:54:51 -07:00
|
|
|
async onNetworkChange(e) {
|
2018-07-17 14:38:28 -07:00
|
|
|
const netId = e.value
|
|
|
|
const web3 = setWeb3(netId)
|
2018-07-04 16:10:26 -07:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
networkAddresses({ netId }).then(async config => {
|
|
|
|
const { addresses } = config
|
|
|
|
const keysManager = new KeysManager()
|
2018-07-04 09:37:52 -07:00
|
|
|
|
2018-02-01 14:48:48 -08:00
|
|
|
await keysManager.init({
|
|
|
|
web3,
|
|
|
|
netId,
|
|
|
|
addresses
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
2018-02-01 14:48:48 -08:00
|
|
|
const metadataContract = new Metadata()
|
|
|
|
await metadataContract.init({
|
|
|
|
web3,
|
|
|
|
netId,
|
|
|
|
addresses
|
2018-07-17 14:38:28 -07:00
|
|
|
})
|
2018-07-03 18:54:51 -07:00
|
|
|
this.setState({ netId: e.value, keysManager, metadataContract })
|
2018-01-25 00:02:25 -08:00
|
|
|
})
|
|
|
|
}
|
2018-07-03 18:54:51 -07:00
|
|
|
render() {
|
2018-03-12 11:41:19 -07:00
|
|
|
console.log('v2.09')
|
2018-07-03 18:54:51 -07:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
const search = this.state.showSearch ? (
|
2018-07-18 11:17:09 -07:00
|
|
|
<div className={`search-container ${this.getNetIdClass()}`}>
|
|
|
|
<div className="container">
|
|
|
|
<input type="search" className="search-input" onChange={this.onSearch} placeholder="Search..." />
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-07-17 14:38:28 -07:00
|
|
|
) : (
|
|
|
|
''
|
|
|
|
)
|
2018-07-03 18:54:51 -07:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
const loading = this.state.loading ? <Loading netId={this.state.netId} /> : ''
|
2018-07-03 18:54:51 -07:00
|
|
|
|
2017-12-11 23:01:59 -08:00
|
|
|
return (
|
2018-07-17 14:38:28 -07:00
|
|
|
<Router history={history}>
|
|
|
|
<section className={`content ${this.state.showMobileMenu ? 'content-menu-open' : ''}`}>
|
|
|
|
{loading}
|
2018-07-04 09:37:52 -07:00
|
|
|
<Header
|
2018-07-18 11:17:09 -07:00
|
|
|
baseRootPath={baseRootPath}
|
|
|
|
injectedWeb3={this.state.injectedWeb3}
|
|
|
|
navigationData={navigationData}
|
2018-07-17 14:38:28 -07:00
|
|
|
netId={this.state.netId}
|
|
|
|
onChange={this.onNetworkChange}
|
|
|
|
onMenuToggle={this.toggleMobileMenu}
|
2018-07-18 11:17:09 -07:00
|
|
|
showMobileMenu={this.state.showMobileMenu}
|
2018-07-04 09:37:52 -07:00
|
|
|
/>
|
2018-07-18 11:17:09 -07:00
|
|
|
{search}
|
2018-07-17 14:38:28 -07:00
|
|
|
<div
|
2018-07-18 11:17:09 -07:00
|
|
|
className={`app-container ${
|
|
|
|
this.state.showMobileMenu ? 'app-container-open-mobile-menu' : ''
|
|
|
|
} ${this.getNetIdClass()}`}
|
2018-07-17 14:38:28 -07:00
|
|
|
>
|
|
|
|
<Route exact path="/" render={this.onAllValidatorsRender} web3Config={this.state} />
|
|
|
|
<Route exact path={`${baseRootPath}/`} render={this.onAllValidatorsRender} web3Config={this.state} />
|
|
|
|
<Route path={`${baseRootPath}/pending-changes`} render={this.onPendingChangesRender} />
|
|
|
|
<Route path={`${baseRootPath}/set`} render={this.onSetRender} />
|
2017-12-11 23:01:59 -08:00
|
|
|
</div>
|
2018-07-03 18:54:51 -07:00
|
|
|
<Footer netId={this.state.netId} />
|
2017-12-11 23:01:59 -08:00
|
|
|
</section>
|
|
|
|
</Router>
|
|
|
|
)
|
|
|
|
}
|
2018-01-31 13:24:52 -08:00
|
|
|
}
|
2017-12-11 17:35:57 -08:00
|
|
|
|
2018-07-17 14:38:28 -07:00
|
|
|
ReactDOM.render(<AppMainRouter />, document.getElementById('root'))
|
|
|
|
registerServiceWorker()
|