1import React, { useCallback, useMemo, useEffect, useState } from 'react';
2import { Grid, Text, P, LinkButton } from 'indigo-react';
3import * as azimuth from 'azimuth-js';
5import { useNetwork } from 'store/network';
6import { usePointCursor } from 'store/pointCursor';
8import * as need from 'lib/need';
9import useEthereumTransaction from 'lib/useEthereumTransaction';
10import { GAS_LIMITS } from 'lib/constants';
11import { useLocalRouter } from 'lib/LocalRouter';
13import ViewHeader from 'components/ViewHeader';
14import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
15import View from 'components/View';
16import BridgeForm from 'form/BridgeForm';
17import { convertToInt } from 'lib/convertToInt';
19function useCastDocumentVote() {
20 const { contracts } = useNetwork();
21 const { pointCursor } = usePointCursor();
23 const _contracts = need.contracts(contracts);
24 const _point = need.point(pointCursor);
26 return useEthereumTransaction(
29 return azimuth.ecliptic.castDocumentVote(
38 useCallback(() => null, []), //TODO update polls[hash].hasVoted ?
39 GAS_LIMITS.DEFAULT //TODO update once we have a decent sample size
43function renderDocumentHash(doc) {
44 return doc.slice(0, 34) + '\n ' + doc.slice(34);
47export default function Documents() {
48 const { pop } = useLocalRouter();
49 const { contracts } = useNetwork();
50 const { pointCursor } = usePointCursor();
52 const _contracts = need.contracts(contracts);
53 const _point = convertToInt(need.point(pointCursor), 10);
55 const { construct, reset, unconstruct, bind } = useCastDocumentVote();
57 // const [documentHash, setDocumentHash] = useState('0x...');
58 const [majorities, setMajorities] = useState([]);
59 const [proposals, setProposals] = useState([]);
60 const [polls, setPolls] = useState({});
61 const [loading, setLoading] = useState(true);
62 const [votingOn, setVotingOn] = useState({});
64 //TODO update every second?
65 const now = Math.round(new Date().getTime() / 1000);
69 let proposals = await azimuth.polls.getDocumentProposals(_contracts);
70 let majorities = await azimuth.polls.getDocumentMajorities(_contracts);
72 for (let doc of proposals) {
73 let poll = await azimuth.polls.getDocumentPoll(_contracts, doc);
74 poll.endTime = convertToInt(poll.start) + convertToInt(poll.duration);
75 poll.hasVoted = await azimuth.polls.hasVotedOnDocumentPoll(
82 setMajorities(majorities);
83 setProposals(proposals);
87 }, [_contracts, _point]);
89 // eslint-disable-next-line
90 const [open, closed] = useMemo(() => {
93 if (loading) return [open, closed];
94 for (let doc of proposals) {
95 if (now > polls[doc].endTime) {
101 return [open, closed];
102 }, [loading, proposals, polls, now]);
104 const doVote = useCallback(
106 construct(hash, accept);
107 setVotingOn({ hash, accept });
112 const didVote = useCallback(() => {
116 polls[votingOn.hash].hasVoted = true;
120 }, [votingOn, reset, unconstruct]);
122 const majorityList = useMemo(() => {
123 return majorities.map(doc => {
125 <Grid.Item full className="mv2" as={P}>
128 rel="noopener noreferrer"
129 href={`https://raw.githubusercontent.com/urbit/azimuth/master/proposals/${doc}.txt`}
130 class="mb4 mono wrap pre">
131 {renderDocumentHash(doc)}↗
138 const openList = useMemo(() => {
139 return open.map(doc => {
140 const hasVoted = polls[doc].hasVoted;
143 <Grid.Item full className="mv2" as={Text}>
144 <P className="m0 mono wrap pre">{renderDocumentHash(doc)}</P>
147 'Your vote has been cast.'
150 <LinkButton onClick={() => doVote(doc, true)}>
151 {votingOn.hash === doc && votingOn.accept ? (
158 <LinkButton onClick={() => doVote(doc, false)}>
159 {votingOn.hash === doc && !votingOn.accept ? (
173 }, [open, polls, votingOn, doVote]);
176 <View pop={pop} inset>
178 <Grid.Item full as={ViewHeader}>
179 Senate: Document Proposals
182 <Grid.Item full as={Grid}>
183 <Grid.Item full as={P}>
189 {openList.length > 0 && (
191 <Grid.Divider className="mv4" />
193 <Grid.Item full as={Grid}>
194 <Grid.Item full as={P}>
201 {({ onSubmit, values }) => (
204 as={InlineEthereumTransaction}
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list