on master help sign in
Touch up Senate code & UI
def5e44Fang
src/views/Senate.js+51−40
@@ -75,11 +75,11 @@ export default function Senate() {
75 } = useCastDocumentVote();
75 } = useCastDocumentVote();
76
76
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({});
83
83
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() {
101 }
100 }
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);
107 return;
105 return;
@@ -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 });
130 },
126 },
131 [construct, setVotingOn]
127 [construct, setVotingOn]
132 );
128 );
@@ -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);
133+ setVotingOn({});
137 }, [polls, setPolls, votingOn]);
134 }, [polls, setPolls, votingOn]);
138
135
139 const majorityList = useMemo(() => {
136 const majorityList = useMemo(() => {
140 return majorities.map(doc => {
137 return majorities.map(doc => {
141 return (
138 return (
142− <Text>
139+ <Grid.Item full as={Text}>
143 <a
140 <a
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>↗
148 </a>
145 </a>
149− </Text>
146+ </Grid.Item>
150 );
147 );
151 });
148 });
152 }, [majorities]);
149 }, [majorities]);
@@ -165,10 +162,20 @@ export default function Senate() {
165 'Your vote has been cast.'
162 'Your vote has been cast.'
166 ) : (
163 ) : (
167 <>
164 <>
168− <LinkButton onClick={() => doVote(doc, true)}>aye</LinkButton>
165+ <LinkButton onClick={() => doVote(doc, true)}>
166+ {votingOn.hash === doc && votingOn.accept ? (
167+ <b>support</b>
168+ ) : (
169+ <>support</>
170+ )}
171+ </LinkButton>
169 {' / '}
172 {' / '}
170 <LinkButton onClick={() => doVote(doc, false)}>
173 <LinkButton onClick={() => doVote(doc, false)}>
171− nay
174+ {votingOn.hash === doc && !votingOn.accept ? (
175+ <b>reject</b>
176+ ) : (
177+ <>reject</>
178+ )}
172 </LinkButton>
179 </LinkButton>
173 </>
180 </>
174 )}
181 )}
@@ -178,7 +185,7 @@ export default function Senate() {
178 </>
185 </>
179 );
186 );
180 });
187 });
181− }, [open, polls]);
188+ }, [open, polls, votingOn]);
182
189
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>
198
205
199− <Grid.Item full as={P}>
206+ <Grid.Item full as={Grid}>
207+ <Grid.Item full as={P}>
200− Accepted documents:
208+ Accepted documents:
209+ </Grid.Item>
201 {majorityList}
210 {majorityList}
202 </Grid.Item>
211 </Grid.Item>
203
212
204− <Grid>
213+ <Grid.Divider />
214+
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>
210
221
211 <BridgeForm onValues={onDocumentChange}>
222 <BridgeForm onValues={onDocumentChange}>
212 {({ onSubmit, values }) => (
223 {({ onSubmit, values }) => (
213− <>
224+ // <>
214− <Grid.Item
225+ <Grid.Item
215− full
226+ full
216− as={InlineEthereumTransaction}
227+ as={InlineEthereumTransaction}
217− {...bind}
228+ {...bind}
218− onReturn={didVote}
229+ onReturn={didVote}
219− />
230+ />
220−
231+
221− <Grid.Divider />
232+ // <Grid.Divider />
222−
233+ //
223− <Grid.Item
234+ // <Grid.Item
224− full
235+ // full
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"
230− />
241+ // />
231−
242+ //
232− <Grid.Item full as={CopiableAddress}>
243+ // <Grid.Item full as={CopiableAddress}>
233− {documentHash}
244+ // {documentHash}
234− </Grid.Item>
245+ // </Grid.Item>
235− </>
246+ // </>
236 )}
247 )}
237 </BridgeForm>
248 </BridgeForm>
238 </Grid>
249 </Grid>