import React from "react"; import { Table } from "react-bootstrap"; import { Member, ProposalDetail } from "../../types"; interface CouncilMember { handle: string; votes: number; proposalCount: number; percentage: number; } interface CouncilVotes { proposalCount: number; members: CouncilMember[]; } const LeaderBoard = (props: { proposals: ProposalDetail[]; members: Member[]; councils: number[][]; cycle: number; }) => { const { cycle, councils, proposals } = props; const summarizeVotes = (id: number, propList: ProposalDetail[]) => { let votes = 0; propList.forEach((p) => { if (!p || !p.votesByMemberId) return; const vote = p.votesByMemberId.find((v) => v.memberId === id); if (vote && vote.vote !== `Reject`) votes++; }); return votes; }; let councilMembers: Member[] = []; const councilVotes: CouncilVotes[] = councils.map( (council, i: number): CouncilVotes => { const start = 57601 + i * cycle; const end = 57601 + (i + 1) * cycle; const proposalsRound = proposals.filter( (p) => p && p.createdAt > start && p.createdAt < end ); const proposalCount = proposalsRound.length; const members: CouncilMember[] = council.map( (id: number): CouncilMember => { const member = props.members.find((m) => m.id === id); if (!member) return { handle: ``, votes: 0, proposalCount, percentage: 0 }; councilMembers.find((m) => m.id === id) || councilMembers.push(member); let votes = summarizeVotes(Number(member.id), proposalsRound); const percentage = Math.round((100 * votes) / proposalCount); return { handle: member.handle, votes, proposalCount, percentage }; } ); return { proposalCount, members }; } ); councilMembers = councilMembers .map((m) => { return { ...m, id: summarizeVotes(Number(m.id), props.proposals) }; }) .sort((a, b) => b.id - a.id); return (

Votes per Council Member

{councilVotes.map((c, i: number) => ( ))} {councilMembers.map((member: Member) => ( ))} {councilVotes.map((round, i: number) => ( ))}
Council Member Total VotesRound {1 + i}
Proposals {proposals.length}{round.proposalCount}
); }; const MemberRow = (props: { member: Member; votes: CouncilVotes[] }) => { const { votes } = props; const { handle } = props.member; let totalVotes = 0; let totalProposals = 0; votes.forEach((c) => { const m = c.members.find((member) => member.handle === handle); if (!m) return; totalVotes += m.votes; totalProposals += m.proposalCount; }); const totalPercent = Math.round((100 * totalVotes) / totalProposals); return ( {handle} {totalVotes} / {totalProposals} ({totalPercent}%) {props.votes.map((c, round: number) => ( member.handle === handle)} /> ))} ); }; const RoundVotes = (props: { member?: { handle: string; votes: number; percentage: number }; }) => { if (!props.member || props.member.handle === ``) return ; const { votes, percentage } = props.member; return ( {votes} ({percentage}%) ); }; export default LeaderBoard;