index.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React from "react";
  2. import { Member, Post, ProposalDetail, Seat } from "../../../types";
  3. import { domain } from "../../../config";
  4. import About from "./About";
  5. import Posts from "./Posts";
  6. import Councils from "./Councils";
  7. import Proposals from "./Proposals";
  8. import moment from "moment";
  9. interface ProposalVote {
  10. proposal: ProposalDetail;
  11. vote: string;
  12. }
  13. const Summary = (props: {
  14. councils: Seat[][];
  15. handle: string;
  16. member: Member;
  17. posts: Post[];
  18. proposals: ProposalDetail[];
  19. startTime: number;
  20. validators: string[];
  21. }) => {
  22. const { councils, handle, member, proposals, startTime } = props;
  23. const onCouncil = councils.filter((c) =>
  24. c && c.find((seat) => seat.member === member.account)
  25. );
  26. let votes: ProposalVote[] = [];
  27. proposals.forEach((p) => {
  28. if (!p || !p.votesByAccount) return;
  29. const vote = p.votesByAccount.find((v) => v.handle === member.handle);
  30. if (vote && vote.vote !== ``) votes.push({ proposal: p, vote: vote.vote });
  31. });
  32. const createdProposals = proposals.filter((p) => p && p.author === handle);
  33. const approved = createdProposals.filter((p) => p.result === "Approved");
  34. const pending = createdProposals.filter((p) => p.result === "Pending");
  35. const posts = props.posts.filter((p) => p.authorId === member.account);
  36. const time = startTime + member.registeredAt * 6000;
  37. const date = moment(time);
  38. const created = date.isValid()
  39. ? date.format("DD/MM/YYYY HH:mm")
  40. : member.registeredAt;
  41. const runsValidator = props.validators.includes(member.account);
  42. return (
  43. <div className="text-left">
  44. <div>
  45. Registered on {created} (id {member.id})
  46. </div>
  47. {runsValidator && (
  48. <div>
  49. This user runs a <a href={`${domain}/#/staking`}>validator node</a>.
  50. </div>
  51. )}
  52. <Councils onCouncil={onCouncil.length} votes={votes.length} />
  53. <Proposals
  54. proposals={createdProposals.length}
  55. approved={approved.length}
  56. pending={pending.length}
  57. />
  58. <Posts posts={posts.length} />
  59. <About about={member.about} />
  60. </div>
  61. );
  62. };
  63. export default Summary;