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 (
Council Member | Total Votes | {councilVotes.map((c, i: number) => (Round {1 + i} | ))}
---|---|---|
Proposals | {proposals.length} | {councilVotes.map((round, i: number) => ({round.proposalCount} | ))}