ProposalDiscussion.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import React from 'react';
  2. import { Divider, Header } from 'semantic-ui-react';
  3. import { useTransport, usePromise } from '@polkadot/joy-utils/react/hooks';
  4. import { ProposalId } from '@joystream/types/proposals';
  5. import { ParsedDiscussion } from '@polkadot/joy-utils/types/proposals';
  6. import PromiseComponent from '@polkadot/joy-utils/react/components/PromiseComponent';
  7. import DiscussionPost from './DiscussionPost';
  8. import DiscussionPostForm from './DiscussionPostForm';
  9. import { MemberId } from '@joystream/types/members';
  10. type ProposalDiscussionProps = {
  11. proposalId: ProposalId;
  12. memberId?: MemberId;
  13. };
  14. export default function ProposalDiscussion ({
  15. proposalId,
  16. memberId
  17. }: ProposalDiscussionProps) {
  18. const transport = useTransport();
  19. const [discussion, error, loading, refreshDiscussion] = usePromise<ParsedDiscussion | null | undefined>(
  20. () => transport.proposals.discussion(proposalId),
  21. undefined
  22. );
  23. const constraints = transport.proposals.discussionContraints();
  24. return (
  25. <PromiseComponent error={error} loading={loading} message={'Fetching discussion posts...'}>
  26. { discussion && (
  27. <>
  28. <Header as='h3'>Discussion ({ discussion.posts.length})</Header>
  29. <Divider />
  30. { discussion.posts.length ? (
  31. discussion.posts.map((post, key) => (
  32. <DiscussionPost
  33. key={post.postId ? post.postId.toNumber() : `k-${key}`}
  34. post={post}
  35. memberId={memberId}
  36. refreshDiscussion={refreshDiscussion}/>
  37. ))
  38. )
  39. : (
  40. <Header as='h4' style={{ margin: '1rem 0' }}>Nothing has been posted here yet!</Header>
  41. )
  42. }
  43. { memberId && (
  44. <DiscussionPostForm
  45. threadId={discussion.threadId}
  46. memberId={memberId}
  47. onSuccess={refreshDiscussion}
  48. constraints={constraints}/>
  49. ) }
  50. </>
  51. ) }
  52. </PromiseComponent>
  53. );
  54. }