@@ -75,11 +75,11 @@ export default function Senate() {
75 } = useCastDocumentVote();
75 } = useCastDocumentVote();
77 const [documentHash, setDocumentHash] = useState('0x...');
77 const [documentHash, setDocumentHash] = useState('0x...');
78− const [majorities, setMajorities] = useState([]); //TODO gh.com/proposals/doc.txt
78+ const [majorities, setMajorities] = useState([]);
79 const [proposals, setProposals] = useState([]);
79 const [proposals, setProposals] = useState([]);
80 const [polls, setPolls] = useState({});
80 const [polls, setPolls] = useState({});
81 const [loading, setLoading] = useState(true);
81 const [loading, setLoading] = useState(true);
82− const [votingOn, setVotingOn] = useState(null);
82+ const [votingOn, setVotingOn] = useState({});
84 //TODO update every second?
84 //TODO update every second?
85 const now = Math.round(new Date().getTime() / 1000);
85 const now = Math.round(new Date().getTime() / 1000);
@@ -90,7 +90,6 @@ export default function Senate() {
90 let polls = {};
90 let polls = {};
91 for (let doc of proposals) {
91 for (let doc of proposals) {
92 let poll = await azimuth.polls.getDocumentPoll(_contracts, doc);
92 let poll = await azimuth.polls.getDocumentPoll(_contracts, doc);
93− console.log('got poll', doc, poll);
94 poll.endTime = polls.start + poll.duration;
93 poll.endTime = polls.start + poll.duration;
95 poll.hasVoted = await azimuth.polls.hasVotedOnDocumentPoll(
94 poll.hasVoted = await azimuth.polls.hasVotedOnDocumentPoll(
96 _contracts,
95 _contracts,
@@ -101,7 +100,6 @@ export default function Senate() {
102 setMajorities(majorities);
101 setMajorities(majorities);
103 setProposals(proposals);
102 setProposals(proposals);
104− console.log('setting polls', polls);
105 setPolls(polls);
103 setPolls(polls);
106 setLoading(false);
104 setLoading(false);
@@ -111,8 +109,6 @@ export default function Senate() {
111 let open = [];
109 let open = [];
112 let closed = [];
110 let closed = [];
113 if (loading) return [open, closed];
111 if (loading) return [open, closed];
114− console.log('proposals', proposals);
115− console.log('polls', polls);
116 for (let doc of proposals) {
112 for (let doc of proposals) {
117 if (now > polls[doc].endTime) {
113 if (now > polls[doc].endTime) {
118 closed.push(doc);
114 closed.push(doc);
@@ -126,7 +122,7 @@ export default function Senate() {
126 const doVote = useCallback(
122 const doVote = useCallback(
127 (hash, accept) => {
123 (hash, accept) => {
128 construct(hash, accept);
124 construct(hash, accept);
129− setVotingOn(hash);
125+ setVotingOn({ hash, accept });
131 [construct, setVotingOn]
127 [construct, setVotingOn]
@@ -134,19 +130,20 @@ export default function Senate() {
134 const didVote = useCallback(() => {
130 const didVote = useCallback(() => {
135 polls[votingOn].hasVoted = true;
131 polls[votingOn].hasVoted = true;
136 setPolls(polls);
132 setPolls(polls);
137 }, [polls, setPolls, votingOn]);
134 }, [polls, setPolls, votingOn]);
139 const majorityList = useMemo(() => {
136 const majorityList = useMemo(() => {
140 return majorities.map(doc => {
137 return majorities.map(doc => {
142− <Text>
139+ <Grid.Item full as={Text}>
144 target="_blank"
141 target="_blank"
145 rel="noopener noreferrer"
142 rel="noopener noreferrer"
146 href={`https://github.com/urbit/azimuth/blob/master/proposals/${doc}.txt`}>
143 href={`https://github.com/urbit/azimuth/blob/master/proposals/${doc}.txt`}>
147− <code>{doc}</code>
144+ <code>{doc}</code>↗
149− </Text>
146+ </Grid.Item>
152 }, [majorities]);
149 }, [majorities]);
@@ -165,10 +162,20 @@ export default function Senate() {
165 'Your vote has been cast.'
162 'Your vote has been cast.'
168− <LinkButton onClick={() => doVote(doc, true)}>aye</LinkButton>
165+ <LinkButton onClick={() => doVote(doc, true)}>
166+ {votingOn.hash === doc && votingOn.accept ? (
170 <LinkButton onClick={() => doVote(doc, false)}>
173 <LinkButton onClick={() => doVote(doc, false)}>
171− nay
174+ {votingOn.hash === doc && !votingOn.accept ? (
172 </LinkButton>
179 </LinkButton>
@@ -178,7 +185,7 @@ export default function Senate() {
181− }, [open, polls]);
188+ }, [open, polls, votingOn]);
183 const onDocumentChange = useCallback(({ valid, values }) => {
190 const onDocumentChange = useCallback(({ valid, values }) => {
184 if (values.document) {
191 if (values.document) {
@@ -196,43 +203,47 @@ export default function Senate() {
196 Senate: Document Proposals
203 Senate: Document Proposals
197 </Grid.Item>
204 </Grid.Item>
199− <Grid.Item full as={P}>
206+ <Grid.Item full as={Grid}>
207+ <Grid.Item full as={P}>
200− Accepted documents:
208+ Accepted documents:
201 {majorityList}
210 {majorityList}
202 </Grid.Item>
211 </Grid.Item>
204− <Grid>
213+ <Grid.Divider />
215+ <Grid.Item full as={Grid}>
205 <Grid.Item full as={P}>
216 <Grid.Item full as={P}>
206 Open document polls:
217 Open document polls:
207 </Grid.Item>
218 </Grid.Item>
208 {openList}
219 {openList}
209− </Grid>
220+ </Grid.Item>
211 <BridgeForm onValues={onDocumentChange}>
222 <BridgeForm onValues={onDocumentChange}>
212 {({ onSubmit, values }) => (
223 {({ onSubmit, values }) => (
214− <Grid.Item
225+ <Grid.Item
216− as={InlineEthereumTransaction}
227+ as={InlineEthereumTransaction}
217− {...bind}
228+ {...bind}
218− onReturn={didVote}
229+ onReturn={didVote}
221− <Grid.Divider />
232+ // <Grid.Divider />
223− <Grid.Item
234+ // <Grid.Item
225− as={Input}
236+ // as={Input}
226− type="textarea"
237+ // type="textarea"
227− placeholder="Input some text to find its hash..."
238+ // placeholder="Input some text to find its hash..."
228− name="document"
239+ // name="document"
229− className="mt4"
240+ // className="mt4"
232− <Grid.Item full as={CopiableAddress}>
243+ // <Grid.Item full as={CopiableAddress}>
233− {documentHash}
244+ // {documentHash}
234− </Grid.Item>
245+ // </Grid.Item>
237 </BridgeForm>
248 </BridgeForm>