snt-voting/app/dapp.js

282 lines
8.3 KiB
JavaScript
Raw Normal View History

import React, { Fragment } from 'react';
2018-05-13 01:31:01 -03:00
import ReactDOM from 'react-dom';
2018-06-28 16:24:28 -04:00
import web3 from "Embark/web3"
2018-05-13 01:31:01 -03:00
import EmbarkJS from 'Embark/EmbarkJS';
2018-06-27 10:27:16 -04:00
import PollManager from 'Embark/contracts/PollManager';
import Voting from './components/Voting';
import DappToken from 'Embark/contracts/DappToken';
import { VotingContext } from './context';
2018-07-12 15:31:47 -04:00
import Web3Render from './components/standard/Web3Render';
2018-07-16 09:20:42 -04:00
import { getPolls, omitPolls } from './utils/polls';
2018-10-27 13:12:35 -04:00
import { HashRouter as Router, Route, Link, Switch } from "react-router-dom";
import OtherWallets from './components/flow/wallet/OtherWallets';
import Typography from '@material-ui/core/Typography'
2018-12-06 09:50:11 -04:00
import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
2018-05-13 01:31:01 -03:00
import './dapp.css';
2018-12-06 09:50:11 -04:00
const muiTheme = createMuiTheme({
typography: {
fontFamily: 'Inter UI'
},
overrides: {
MuiButton: {
root: {
height: '44px',
fontSize: '15px',
lineHeight: '22px',
},
label: {
fontSize: '15px',
lineHeight: '22px',
}
}
2018-12-06 09:50:11 -04:00
}
});
2018-10-29 02:51:25 -04:00
window.PollManager = PollManager;
2018-07-05 14:31:51 -04:00
const MAINNET = 1;
2018-09-27 10:51:40 -04:00
const TESTNET = 3;
2018-07-05 14:31:51 -04:00
2018-11-06 13:49:25 -04:00
// #38
setTimeout(() => {
if(!(window.web3 || window.ethereum)){
window.location.reload(true);
}
}, 5000);
2018-11-29 16:02:31 -04:00
const pollsPerLoad = 3;
2018-11-06 13:49:25 -04:00
2018-05-13 01:31:01 -03:00
class App extends React.Component {
constructor(props) {
super(props);
}
2018-12-07 19:16:59 -04:00
state = { admin: false, pollOrder: 'NEWEST_ADDED', web3Provider: true, loading: true, name: '----', symbol: "", decimals: "18", networkName: "" , rawPolls: [], pollsRequested: [], start: 0,
2018-11-29 16:02:31 -04:00
end: pollsPerLoad};
2018-05-13 01:31:01 -03:00
2018-05-21 14:29:57 -04:00
componentDidMount(){
2018-07-04 14:46:52 -04:00
EmbarkJS.onReady((err) => {
if (err) this.setState({ web3Provider: false });
else {
2018-10-30 16:53:53 -04:00
if(!web3.eth.defaultAccount){
web3.eth.defaultAccount = "0x0000000000000000000000000000000000000000";
}
2018-12-05 19:10:40 -04:00
DappToken.methods.symbol().call({from: web3.eth.defaultAccount}).then(symbol => {
2018-12-05 10:59:34 -04:00
this.setState({symbol});
});
2018-12-05 19:10:40 -04:00
DappToken.methods.decimals().call({from: web3.eth.defaultAccount}).then(decimals => {
2018-12-05 10:59:34 -04:00
this.setState({decimals});
});
2018-12-05 19:10:40 -04:00
DappToken.methods.name().call({from: web3.eth.defaultAccount}).then(name => {
2018-12-05 10:59:34 -04:00
this.setState({name});
})
2018-07-04 14:46:52 -04:00
this._getPolls();
}
2018-07-05 14:31:51 -04:00
web3.eth.net.getId((err, netId) => {
if(EmbarkJS.environment == 'testnet' && netId !== TESTNET){
this.setState({web3Provider: false, networkName: "Ropsten"});
} else if(EmbarkJS.environment == 'livenet' && netId !== MAINNET){
this.setState({web3Provider: false, networkName: "Mainnet"});
}
2018-07-05 14:31:51 -04:00
})
2018-07-04 14:46:52 -04:00
})
2018-05-13 01:31:01 -03:00
}
2018-05-22 09:49:22 -04:00
setAccount(_account){
this.setState({account: _account});
}
2018-05-13 01:31:01 -03:00
_loadIPFSContent = async (polls) => {
2018-11-06 14:08:33 -04:00
for(let i = 0; i < polls.length; i++){
2018-11-06 14:08:33 -04:00
try {
let ipfsContent = await EmbarkJS.Storage.get(web3.utils.toAscii(polls[i]._description));
polls[i].content = JSON.parse(ipfsContent);
} catch(err){
console.log(err);
}
}
2018-11-06 13:49:25 -04:00
let oPolls = {};
for(let i = 0; i < polls.length; i++){
oPolls[polls[i].idPoll] = polls[i];
}
this.setState({ rawPolls: oPolls, loading: false });
}
_getPolls = async () => {
this.setState({ loading: true })
2018-06-27 10:27:16 -04:00
const { nPolls, poll } = PollManager.methods;
2018-10-30 16:53:53 -04:00
const polls = await nPolls().call({from: web3.eth.defaultAccount});
2018-11-06 13:49:25 -04:00
if (polls)
getPolls(polls, poll)
.then(omitPolls)
.then(rawPolls => {
// this._loadIPFSContent(rawPolls);
2018-11-29 12:08:12 -04:00
rawPolls = rawPolls.sort((a,b) => {
if(a.idPoll > b.idPoll) return -1; else if(a.idPoll < b.idPoll) return 1; else return 0;
});
this.setState({rawPolls, loading: false});
2018-11-06 13:49:25 -04:00
});
else
this.setState({ rawPolls: [], loading: false });
2018-06-27 10:27:16 -04:00
}
updatePoll = async (idPoll) => {
const { poll, nPolls } = PollManager.methods;
const { rawPolls } = this.state;
const npolls = await nPolls().call();
// This check needs to be done because of a bug in web3
if (npolls !== rawPolls.length) return this._getPolls();
const newPolls = [...rawPolls];
const updatedPoll = await poll(idPoll).call();
newPolls[idPoll] = { ...updatedPoll };
this.setState({ rawPolls: newPolls });
}
2018-06-29 15:06:23 -04:00
appendToPoll = (idPoll, data) => {
const { rawPolls } = this.state;
const newPolls = [...rawPolls];
newPolls[idPoll] = { ...newPolls[idPoll], ...data }
this.setState({ rawPolls: newPolls });
}
2018-06-29 13:51:49 -04:00
setPollOrder = pollOrder => { this.setState({ pollOrder }) }
2018-05-17 16:53:23 -03:00
_renderStatus(title, available) {
2018-05-13 01:31:01 -03:00
let className = available ? 'pull-right status-online' : 'pull-right status-offline';
return <Fragment>
2018-05-21 14:29:57 -04:00
{title}
2018-05-13 01:31:01 -03:00
<span className={className}></span>
</Fragment>;
2018-05-13 01:31:01 -03:00
}
replacePoll = (poll) => {
let rawPolls = this.state.rawPolls;
for(let i = 0; i < rawPolls.length; i++){
if(rawPolls[i].idPoll == poll.idPoll){
rawPolls[i] = poll;
2018-11-29 12:08:12 -04:00
this.setState({rawPolls, t: new Date().getTime()});
break;
}
}
}
loadPollContent = async (poll) => {
2018-11-29 09:11:22 -04:00
if(!poll) return;
2018-11-29 16:02:31 -04:00
let pollsRequested = this.state.pollsRequested;
if(!pollsRequested.includes(poll.idPoll)) pollsRequested.push(poll.idPoll);
this.setState({pollsRequested});
let ipfsContent = await EmbarkJS.Storage.get(web3.utils.toAscii(poll._description));
poll.content = JSON.parse(ipfsContent);
this.replacePoll(poll);
}
2018-11-29 16:02:31 -04:00
loadMorePolls = async (filterFn) => {
let start = this.state.start + pollsPerLoad;
let end = this.state.end + pollsPerLoad;
this.setState({start, end});
this.loadPollRange(filterFn, start, end);
}
resetPollCounter = () => {
this.setState({start: 0, end: pollsPerLoad});
}
loadPollRange = async (filterFn, start, end) => {
let rawPolls = this.state.rawPolls;
let polls = rawPolls.filter(filterFn).slice(start, end);
if(!polls.length) return;
let pollsRequested = this.state.pollsRequested;
if(!pollsRequested) return;
for(let i = 0; i < polls.length; i++){11
if(pollsRequested.includes(polls[i].idPoll)) continue;
pollsRequested.push(polls[i].idPoll);
let ipfsContent = await EmbarkJS.Storage.get(web3.utils.toAscii(polls[i]._description));
polls[i].content = JSON.parse(ipfsContent);
for(let i = 0; i < rawPolls.length; i++){
for(let j = 0; j < polls.length; j++){
if(rawPolls[i].idPoll == polls[j].idPoll){
rawPolls[i] = polls[j];
break;
}
}
}
this.setState({rawPolls, pollsRequested});
}
}
2018-05-13 01:31:01 -03:00
render(){
2018-12-05 10:59:34 -04:00
let { web3Provider, networkName, decimals, symbol, name} = this.state;
2018-11-29 16:02:31 -04:00
const { _getPolls, updatePoll, setPollOrder, appendToPoll, replacePoll, loadPollContent, resetPollCounter, loadPollRange, loadMorePolls } = this;
const votingContext = { getPolls: _getPolls, updatePoll, appendToPoll, setPollOrder, resetPollCounter, replacePoll, loadPollContent, loadPollRange, loadMorePolls, ...this.state };
2018-10-27 13:12:35 -04:00
if(web3Provider){
return <MuiThemeProvider theme={muiTheme}>
<Router>
2018-10-27 13:12:35 -04:00
<Web3Render ready={web3Provider}>
<VotingContext.Provider value={votingContext}>
<Voting />
</VotingContext.Provider>
</Web3Render>
</Router>
</MuiThemeProvider>
2018-10-27 13:12:35 -04:00
} else {
if(networkName){
2018-12-06 09:50:11 -04:00
return <MuiThemeProvider theme={muiTheme}>
<div>
<Typography variant="body1" style={{marginTop: "40vh", textAlign:"center"}}><img src="images/warning.svg" width="24" /><br /><br />Please connect to {networkName} to continue.</Typography>
2018-12-06 09:50:11 -04:00
</div></MuiThemeProvider>
} else {
2018-12-06 09:50:11 -04:00
return <MuiThemeProvider theme={muiTheme}>
<Router>
2018-10-27 13:12:35 -04:00
<Fragment>
<Switch>
<Route exact path="/" render={() => {
return <Web3Render ready={web3Provider}>
<VotingContext.Provider value={votingContext}>
<Voting />
</VotingContext.Provider>
</Web3Render>
}
} />
<Route path="/connectOtherWallet" render={() => <div id="votingDapp"><OtherWallets noWeb3Provider={true} /></div>} />
</Switch>
</Fragment>
2018-10-16 16:20:54 -04:00
</Router>
2018-12-06 09:50:11 -04:00
</MuiThemeProvider>
}
2018-10-27 13:12:35 -04:00
}
2018-05-13 01:31:01 -03:00
}
}
ReactDOM.render(<App></App>, document.getElementById('app'));