Jelajahi Sumber

member fixes

Joystream Stats 4 tahun lalu
induk
melakukan
0176bc035e

+ 11 - 3
src/App.tsx

@@ -326,10 +326,17 @@ class App extends React.Component<IProps, IState> {
     let { proposals } = this.state;
     const exists = proposals.find((p) => p && p.id === id);
 
-    if (exists && exists.votesByMemberId && exists.stage === "Finalized")
+    if (
+      exists &&
+      exists.votesByMemberId &&
+      exists.votesByMemberId.length &&
+      exists.stage === "Finalized"
+    )
       return;
+    console.log(`Fetching proposal ${id}`);
     const proposal = await get.proposalDetail(api, id);
-    if (!proposal) return;
+
+    if (!proposal) return console.warn(`Empty result (proposal ${id})`);
     proposals[id] = proposal;
     this.save("proposals", proposals);
     this.fetchVotesPerProposal(api, id);
@@ -338,8 +345,9 @@ class App extends React.Component<IProps, IState> {
   async fetchVotesPerProposal(api: Api, proposalId: number) {
     const { councils, proposals } = this.state;
     const proposal = proposals.find((p) => p && p.id === proposalId);
-    if (!proposal) return;
+    if (!proposal) return console.warn(`Proposal ${proposalId} not found.`);
 
+    console.log(`Fetching proposal votes (${proposalId})`);
     let memberIds: { [key: string]: number } = {};
     councils.map((ids: number[]) =>
       ids.map((memberId: number) => memberIds[`${memberId}`]++)

+ 1 - 1
src/components/Forum/Categories.tsx

@@ -1,6 +1,6 @@
 import React from "react";
 import { Button } from "react-bootstrap";
-import { Category, Post, Thread } from "../../types";
+import { Category, Thread } from "../../types";
 
 const Categories = (props: {
   categories: Category[];

+ 38 - 11
src/components/Members/Member.tsx

@@ -2,6 +2,7 @@ import React from "react";
 import { Link } from "react-router-dom";
 import { Member, Post, ProposalDetail } from "../../types";
 import { domain } from "../../config";
+import moment from "moment";
 
 interface Vote {
   proposal: ProposalDetail;
@@ -24,6 +25,7 @@ const MemberBox = (props: {
   councils: number[][];
   proposals: ProposalDetail[];
   posts: Post[];
+  startTime: number;
 }) => {
   const { councils, members, proposals } = props;
   const handle = props.handle
@@ -35,7 +37,9 @@ const MemberBox = (props: {
   if (!member) return <NotFound />;
 
   const id = Number(member.id);
-  const isCouncilMember = councils[councils.length - 1].includes(id);
+  const council = councils[councils.length - 1];
+  if (!council) return <div>Loading..</div>;
+  const isCouncilMember = council.includes(id);
   const onCouncil = councils.filter((c) => c.includes(Number(member.id)));
 
   let votes: Vote[] = [];
@@ -50,6 +54,12 @@ const MemberBox = (props: {
     (p) => p.authorId === String(member.account)
   );
 
+  const time = props.startTime + member.registeredAt * 6000;
+  const date = moment(time);
+  const created = date.isValid()
+    ? date.format("DD/MM/YYYY HH:mm")
+    : member.registeredAt;
+
   return (
     <div className="box">
       {props.match && (
@@ -63,17 +73,12 @@ const MemberBox = (props: {
       </a>
 
       <div className="text-left">
-        <div>Id: {member.id}</div>
-
-        <div>Registered at block: {member.registeredAt}</div>
-        <OnCouncil onCouncil={onCouncil.length} votes={votes.length} />
-        <div>
-          Proposals authored:{" "}
-          <Link to={`/proposals`}>{createdProposals.length}</Link>
-        </div>
         <div>
-          Posts: <Link to={`/forum`}>{posts.length}</Link>
+          Registered on {created} (id {member.id})
         </div>
+        <OnCouncil onCouncil={onCouncil.length} votes={votes.length} />
+        <Proposals proposals={createdProposals.length} />
+        <Posts posts={posts.length} />
 
         <About about={member.about} />
       </div>
@@ -90,6 +95,27 @@ const About = (props: { about: string }) => {
   );
 };
 
+const Proposals = (props: { proposals: number }) => {
+  const { proposals } = props;
+  if (!proposals) return <div />;
+  const count = proposals > 1 ? `proposals` : `proposal`;
+  return (
+    <div>
+      Authored <Link to={`/proposals`}>{proposals}</Link> {count}.
+    </div>
+  );
+};
+
+const Posts = (props: { posts: number }) => {
+  if (!props.posts) return <div />;
+  const count = props.posts > 1 ? `posts` : `post`;
+  return (
+    <div>
+      Wrote <Link to={`/forum`}>{props.posts}</Link> forum {count}.
+    </div>
+  );
+};
+
 const OnCouncil = (props: { onCouncil: number; votes: number }) => {
   const { onCouncil, votes } = props;
   if (!onCouncil) return <div />;
@@ -102,7 +128,8 @@ const OnCouncil = (props: { onCouncil: number; votes: number }) => {
         </Link>
       </div>
       <div>
-        Proposal votes: <Link to={`/councils`}>{votes}</Link>
+        Voted on proposals:{" "}
+        <Link to={`/councils`}>{votes > 1 ? `${votes} times` : "once"}</Link>
       </div>
     </div>
   );

+ 3 - 1
src/components/Members/MemberBox.tsx

@@ -13,6 +13,7 @@ const MemberBox = (props: {
   id: number;
   account: string;
   handle: string;
+  startTime: number;
   placement: "left" | "bottom" | "right" | "top";
 }) => {
   const { councils, handle, members, posts, placement, proposals } = props;
@@ -27,12 +28,13 @@ const MemberBox = (props: {
             councils={councils}
             proposals={proposals}
             posts={posts}
+            startTime={props.startTime}
           />
         </Tooltip>
       }
     >
       <div className="box">
-        <a href={`${domain}/#/memners/`}>{handle}</a>
+        <a href={`${domain}/#/members/${handle}`}>{handle}</a>
       </div>
     </OverlayTrigger>
   );

+ 7 - 0
src/components/Members/index.tsx

@@ -11,6 +11,8 @@ interface IProps {
   handles: Handles;
   proposals: ProposalDetail[];
   posts: Post[];
+  now: number;
+  block: number;
 }
 
 interface IState {
@@ -44,6 +46,8 @@ class Members extends React.Component<IProps, IState> {
     const row2 = uniqueMembers.slice(third + 1, 2 * third + 1);
     const row3 = uniqueMembers.slice(2 * third + 1, members.length);
 
+    const startTime = this.props.now - this.props.block * 6000;
+
     return (
       <div>
         <Back />
@@ -61,6 +65,7 @@ class Members extends React.Component<IProps, IState> {
                 proposals={proposals}
                 placement={"right"}
                 posts={posts}
+                startTime={startTime}
               />
             ))}
           </div>
@@ -76,6 +81,7 @@ class Members extends React.Component<IProps, IState> {
                 placement={"bottom"}
                 proposals={proposals}
                 posts={posts}
+                startTime={startTime}
               />
             ))}
           </div>
@@ -91,6 +97,7 @@ class Members extends React.Component<IProps, IState> {
                 placement={"left"}
                 proposals={proposals}
                 posts={posts}
+                startTime={startTime}
               />
             ))}
           </div>

+ 0 - 4
src/components/Routes/index.tsx

@@ -28,10 +28,6 @@ const Routes = (props: IState) => {
       <Route path="/councils" render={() => <Councils {...props} />} />
       <Route path="/forum" render={() => <Forum {...props} />} />
       <Route path="/mint" render={() => <Mint {...props} />} />
-      <Route
-        path="/members/:handle"
-        render={(routeprops) => <Member {...routeprops} {...props} />}
-      />
       <Route path="/members" render={() => <Members {...props} />} />{" "}
       <Route path="/" render={() => <Dashboard {...props} />} />
     </Switch>