getters.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { formatProposalMessage } from "./announcements";
  2. //types
  3. import { Api, ProposalArray, ProposalDetail } from "../types";
  4. import {
  5. ChannelId,
  6. PostId,
  7. ProposalDetailsOf,
  8. ThreadId,
  9. } from "@joystream/types/augment";
  10. import { Category, CategoryId } from "@joystream/types/forum";
  11. import { MemberId, Membership } from "@joystream/types/members";
  12. import { Proposal } from "@joystream/types/proposals";
  13. // channel
  14. export const currentChannelId = async (api: Api): Promise<number> => -1
  15. export const memberHandle = async (api: Api, id: MemberId): Promise<string> => {
  16. const membership: Membership = await api.query.members.membershipById(id);
  17. return membership.handle.toJSON();
  18. };
  19. export const memberHandleByAccount = async (
  20. api: Api,
  21. account: string
  22. ): Promise<string> => {
  23. const id: MemberId = await api.query.members.memberIdsByRootAccountId(
  24. account
  25. );
  26. const handle: string = await memberHandle(api, id);
  27. return handle;
  28. };
  29. // forum
  30. export const categoryById = async (api: Api, id: number): Promise<Category> => {
  31. const category: Category = await api.query.forum.categoryById(id);
  32. return category;
  33. };
  34. export const currentPostId = async (api: Api): Promise<number> => {
  35. const postId: PostId = await api.query.forum.nextPostId();
  36. return postId.toNumber() - 1;
  37. };
  38. export const currentThreadId = async (api: Api): Promise<number> => {
  39. const threadId: ThreadId = await api.query.forum.nextThreadId();
  40. return threadId.toNumber() - 1;
  41. };
  42. export const currentCategoryId = async (api: Api): Promise<number> => {
  43. const categoryId: CategoryId = await api.query.forum.nextCategoryId();
  44. return categoryId.toNumber() - 1;
  45. };
  46. // proposals
  47. export const proposalCount = async (api: Api): Promise<number> =>
  48. Number(await api.query.proposalsEngine.proposalCount());
  49. export const activeProposals = async (
  50. api: Api,
  51. last: number
  52. ): Promise<number[]> => {
  53. const count = Number(await api.query.proposalsEngine.activeProposalCount());
  54. let ids: number[] = [];
  55. for (let id = last; ids.length < count; id--) {
  56. const proposal = await proposalDetail(api, id);
  57. if (proposal.result === "Pending") ids.push(id);
  58. }
  59. return ids;
  60. };
  61. const getProposalType = async (api: Api, id: number): Promise<string> => {
  62. const details: ProposalDetailsOf = await api.query.proposalsCodex.proposalDetailsByProposalId(
  63. id
  64. );
  65. const [type]: string[] = Object.getOwnPropertyNames(details.toJSON());
  66. return type;
  67. };
  68. export const proposalDetail = async (
  69. api: Api,
  70. id: number
  71. ): Promise<ProposalDetail> => {
  72. const proposal: Proposal = await api.query.proposalsEngine.proposals(id);
  73. const status: { [key: string]: any } = proposal.status;
  74. const stage: string = status.isActive ? "Active" : "Finalized";
  75. const { finalizedAt, proposalStatus } = status[`as${stage}`];
  76. const result: string = proposalStatus
  77. ? (proposalStatus.isApproved && "Approved") ||
  78. (proposalStatus.isCanceled && "Canceled") ||
  79. (proposalStatus.isExpired && "Expired") ||
  80. (proposalStatus.isRejected && "Rejected") ||
  81. (proposalStatus.isSlashed && "Slashed") ||
  82. (proposalStatus.isVetoed && "Vetoed")
  83. : "Pending";
  84. const exec = proposalStatus ? proposalStatus["Approved"] : null;
  85. const { parameters, proposerId } = proposal;
  86. const author: string = await memberHandle(api, proposerId);
  87. const title: string = proposal.title.toString();
  88. const type: string = await getProposalType(api, id);
  89. const args: string[] = [String(id), title, type, stage, result, author];
  90. const message: string = formatProposalMessage(args);
  91. const createdAt: number = proposal.createdAt.toNumber();
  92. return { createdAt, finalizedAt, parameters, message, stage, result, exec };
  93. };