Loading proposals, and reorganized code

This commit is contained in:
Richard Ramos 2018-05-29 20:29:40 -04:00
parent 6128390bca
commit 08d5665245
10 changed files with 119 additions and 107 deletions

View File

@ -2,11 +2,11 @@ import EmbarkJS from 'Embark/EmbarkJS';
import ERC20Token from 'Embark/contracts/ERC20Token'; import ERC20Token from 'Embark/contracts/ERC20Token';
import ProposalCuration from 'Embark/contracts/ProposalCuration'; import ProposalCuration from 'Embark/contracts/ProposalCuration';
import SNT from 'Embark/contracts/SNT'; import SNT from 'Embark/contracts/SNT';
import React, { Fragment } from 'react'; import React, { Component, Fragment } from 'react';
import { Form, FormGroup, FormControl, HelpBlock, Button, Alert } from 'react-bootstrap'; import { Form, FormGroup, FormControl, HelpBlock, Button, Alert } from 'react-bootstrap';
import web3 from "Embark/web3" import web3 from "Embark/web3"
class ProposalManager extends React.Component { class ProposalManager extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -51,25 +51,34 @@ class ProposalManager extends React.Component {
"description": this.state.description "description": this.state.description
}; };
let hexDescription = web3.utils.toHex(JSON.stringify(description)); EmbarkJS.Storage.saveText(JSON.stringify(description))
.then(async (hash) => {
let hexHash = web3.utils.toHex(hash);
let receipt = await SNT.methods.approve( let receipt = await SNT.methods.approve(
ProposalCuration.options.address, ProposalCuration.options.address,
this.state.submitPrice) this.state.submitPrice)
.send({from: web3.eth.defaultAccount, gasLimit: 1000000}); .send({from: web3.eth.defaultAccount, gasLimit: 1000000});
console.log(receipt); console.log(receipt);
receipt = await ProposalCuration.methods.submitProposal( receipt = await ProposalCuration.methods.submitProposal(
"0x00", "0x00",
"0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000",
0, 0,
"0x00", "0x00",
hexDescription hexHash
) )
.send({from: web3.eth.defaultAccount, gasLimit: 1000000}); .send({from: web3.eth.defaultAccount, gasLimit: 1000000});
console.log(receipt); console.log(receipt);
})
.catch((err) => {
if(err){
// TODO show error
console.log("Storage saveText Error => " + err.message);
}
});
} }

View File

@ -1,37 +1,25 @@
import web3 from "Embark/web3" import web3 from "Embark/web3"
import EmbarkJS from 'Embark/EmbarkJS'; import EmbarkJS from 'Embark/EmbarkJS';
import React from 'react'; import React, {Fragment} from 'react';
import {Button} from 'react-bootstrap'; import {Button} from 'react-bootstrap';
class Paginator extends React.Component { const Paginator = props => {
let ln = Math.ceil(props.total / props.recordsByPage);
constructor(props) { let btnArray = []
super(props); for(let i = 1; i <= ln; i++){
this.state = { btnArray.push(<Button
bsStyle="link"
}; className={i == props.pageNum ? 'current' : ''}
onClick={(e) => props.pageHandler(e, i)}>{i}</Button>)
} }
render(){ return <div>{
let ln = Math.ceil(this.props.total / this.props.recordsByPage); btnArray.map((component, index) => (
let btnArray = [] <Fragment key={index}>
for(let i = 1; i <= ln; i++){
btnArray.push(<Button bsStyle="link" className={i == this.props.pageNum ? 'current' : ''} onClick={(e) => this.props.pageHandler(e, i)}>{i}</Button>)
}
return <div>
<Button bsStyle="link" onClick={(e) => this.props.pageHandler(e, 1)}>&lt;</Button>
{
btnArray.map((component, index) => (
<React.Fragment key={index}>
{ component } { component }
</React.Fragment> </Fragment>
)) ))
} }</div>;
<Button bsStyle="link" onClick={(e) => this.props.pageHandler(e, ln)}>&gt;</Button> };
</div>;
}
}
export default Paginator; export default Paginator;

View File

@ -1,52 +1,65 @@
import web3 from "Embark/web3" import web3 from "Embark/web3"
import EmbarkJS from 'Embark/EmbarkJS'; import EmbarkJS from 'Embark/EmbarkJS';
import React from 'react'; import React, {Component, Fragment} from 'react';
import ProposalForm from './proposal-form'; import ProposalForm from './proposal-form';
import Proposal from './proposal'; import Proposal from './proposal';
import ProposalList from './proposal-list'; import ProposalList from './proposal-list';
import Paginator from './paginator'; import Paginator from './paginator';
import ProposalManager from 'Embark/contracts/ProposalManager';
import ProposalCuration from 'Embark/contracts/ProposalCuration';
const pageLength = 10; const pageLength = 4;
class ProposalContainer extends React.Component { class ProposalContainer extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
proposals: [], proposals: [],
total: 10, // TODO get total total: 0,
page: 1 page: 1
}; };
window['ProposalCuration'] = ProposalCuration;
} }
componentDidMount(){ componentDidMount(){
this.getProposalsOnPage(this.state.page); __embarkContext.execWhenReady(async () => {
ProposalManager.options.address = await ProposalCuration.methods.proposalManager().call();
await this.getTotalProposals();
await this.getProposalsOnPage(this.state.page);
});
} }
getProposalsOnPage(pageNum){ async getTotalProposals(){
this.fetchProposals((pageNum - 1) * pageLength, pageLength, _p => this.setState({proposals: _p, page: pageNum})); let proposalCount = await ProposalManager.methods.getProposalCount().call();
this.setState({
total: parseInt(proposalCount)
});
}
async getProposalsOnPage(pageNum){
this.fetchProposals((pageNum - 1) * pageLength, pageLength,
_p => {
this.setState({
proposals: _p,
page: pageNum
});
});
} }
fetchProposals(from, qty, cb){ async fetchProposals(from, qty, cb){
let proposalList = [];
console.log("Loading %s records starting from record %s", qty, from); for(let i = from; i < from + qty && i < this.state.total; i++){
let res = await ProposalCuration.methods.proposals(i).call();
// TODO: populate proposals proposalList.push(res);
let proposalList = [ }
{
description: "QmZ4hQ5jKUqtHEXhXDVSz81JexMoDmVfiypECFQZZibyrS",
approved: true
}
]
cb(proposalList); cb(proposalList);
} }
render(){ render(){
return <React.Fragment> return <Fragment>
<ProposalList proposals={this.state.proposals} /> <ProposalList proposals={this.state.proposals} />
<Paginator total={this.state.total} recordsByPage={pageLength} page={this.state.page} pageHandler={(e, pageNum) => this.getProposalsOnPage(pageNum) } /> <Paginator total={this.state.total} recordsByPage={pageLength} page={this.state.page} pageHandler={(e, pageNum) => this.getProposalsOnPage(pageNum) } />
</React.Fragment>; </Fragment>;
} }
} }

View File

@ -12,8 +12,6 @@ class ProposalForm extends React.Component {
handleClick(e){ handleClick(e){
e.preventDefault(); e.preventDefault();
} }
render(){ render(){

View File

@ -1,11 +1,11 @@
import React from 'react'; import React, {Fragment} from 'react';
import Proposal from './proposal'; import Proposal from './proposal';
const ProposalList = props => const ProposalList = props =>
<React.Fragment> <Fragment>
{props.proposals.map((u, i) => ( {props.proposals.map((u, i) => (
<Proposal key={i} data={u} /> <Proposal key={i} data={u} />
))} ))}
</React.Fragment> </Fragment>
export default ProposalList; export default ProposalList;

View File

@ -17,25 +17,35 @@ class Proposal extends React.Component {
}; };
} }
componentDidUpdate(prevProps, prevState, snapshot){
if(prevProps.data.description !== this.props.data.description)
this.getProposalData();
}
componentDidMount(){ componentDidMount(){
__embarkContext.execWhenReady(() => { __embarkContext.execWhenReady(() => {
EmbarkJS.Storage.get(this.props.data.description) this.getProposalData();
.then((content) => {
let jsonObj = JSON.parse(content);
this.setState({
url: jsonObj.url,
title: jsonObj.title,
description: jsonObj.description
})
})
.catch((err) => {
if(err){
console.log("Storage get Error => " + err.message);
}
});
}); });
} }
getProposalData(){
let hash = web3.utils.toAscii(this.props.data.description);
EmbarkJS.Storage.get(hash)
.then((content) => {
let jsonObj = JSON.parse(content);
this.setState({
url: jsonObj.url,
title: jsonObj.title,
description: jsonObj.description
})
})
.catch((err) => {
if(err){
console.log("Storage get Error => " + err.message);
}
});
}
render(){ render(){
return (<div> return (<div>
{ {

View File

@ -1,9 +1,9 @@
import web3 from "Embark/web3" import web3 from "Embark/web3"
import EmbarkJS from 'Embark/EmbarkJS'; import EmbarkJS from 'Embark/EmbarkJS';
import React from 'react'; import React, {Component} from 'react';
import SNT from 'Embark/contracts/SNT'; // TODO change this to SNT import SNT from 'Embark/contracts/SNT'; // TODO change this to SNT
class StatusBar extends React.Component { class StatusBar extends Component {
constructor(props) { constructor(props) {
super(props); super(props);

View File

@ -1,27 +1,14 @@
import web3 from "Embark/web3" import web3 from "Embark/web3"
import EmbarkJS from 'Embark/EmbarkJS'; import EmbarkJS from 'Embark/EmbarkJS';
import React from 'react'; import React from 'react';
import ProposalForm from './proposal-form'; import ProposalForm from './proposal-form';
import ProposalContainer from './proposal-container'; import ProposalContainer from './proposal-container';
import StatusBar from './status-bar'; import StatusBar from './status-bar';
class VotingDapp extends React.Component { const VotingDapp = props =>
<div>
constructor(props) { <StatusBar {...props} />
super(props); <ProposalContainer />
this.state = { </div>;
};
}
render(){
return <div>
<StatusBar {...this.props} />
<ProposalContainer />
</div>;
}
}
export default VotingDapp; export default VotingDapp;

View File

@ -45,15 +45,15 @@ class App extends React.Component {
<Tab eventKey={0} title="VotingDapp"> <Tab eventKey={0} title="VotingDapp">
<VotingDapp /> <VotingDapp />
</Tab> </Tab>
<Tab eventKey={3} title="ProposalManager">
<ProposalManager />
</Tab>
<Tab eventKey={1} title="TestToken"> <Tab eventKey={1} title="TestToken">
<TestTokenUI /> <TestTokenUI />
</Tab> </Tab>
<Tab eventKey={2} title="ERC20Token"> <Tab eventKey={2} title="ERC20Token">
<ERC20TokenUI /> <ERC20TokenUI />
</Tab> </Tab>
<Tab eventKey={3} title="ProposalManager">
<ProposalManager />
</Tab>
</Tabs> </Tabs>
</div>); </div>);
} }

View File

@ -130,6 +130,13 @@ contract ProposalManager is Controlled {
return uint8(proposals[_proposalId].result); return uint8(proposals[_proposalId].result);
} }
function getProposalCount()
external
view
returns (uint256){
return proposals.length;
}
function getProposal(uint _proposalId) function getProposal(uint _proposalId)
external external
view view