]> Untitled Git - lemmy-ui.git/blob - src/shared/components/post/post-report.tsx
Removing monads. Fixes #884 (#886)
[lemmy-ui.git] / src / shared / components / post / post-report.tsx
1 import { Component, linkEvent } from "inferno";
2 import { T } from "inferno-i18next-dess";
3 import {
4   PostReportView,
5   PostView,
6   ResolvePostReport,
7   SubscribedType,
8 } from "lemmy-js-client";
9 import { i18n } from "../../i18next";
10 import { WebSocketService } from "../../services";
11 import { myAuth, wsClient } from "../../utils";
12 import { Icon } from "../common/icon";
13 import { PersonListing } from "../person/person-listing";
14 import { PostListing } from "./post-listing";
15
16 interface PostReportProps {
17   report: PostReportView;
18 }
19
20 export class PostReport extends Component<PostReportProps, any> {
21   constructor(props: any, context: any) {
22     super(props, context);
23   }
24
25   render() {
26     let r = this.props.report;
27     let resolver = r.resolver;
28     let post = r.post;
29     let tippyContent = i18n.t(
30       r.post_report.resolved ? "unresolve_report" : "resolve_report"
31     );
32
33     // Set the original post data ( a troll could change it )
34     post.name = r.post_report.original_post_name;
35     post.url = r.post_report.original_post_url;
36     post.body = r.post_report.original_post_body;
37     let pv: PostView = {
38       post,
39       creator: r.post_creator,
40       community: r.community,
41       creator_banned_from_community: r.creator_banned_from_community,
42       counts: r.counts,
43       subscribed: SubscribedType.NotSubscribed,
44       saved: false,
45       read: false,
46       creator_blocked: false,
47       my_vote: r.my_vote,
48       unread_comments: 0,
49     };
50
51     return (
52       <div>
53         <PostListing
54           post_view={pv}
55           showCommunity={true}
56           enableDownvotes={true}
57           enableNsfw={true}
58           viewOnly={true}
59           allLanguages={[]}
60           siteLanguages={[]}
61           hideImage
62         />
63         <div>
64           {i18n.t("reporter")}: <PersonListing person={r.creator} />
65         </div>
66         <div>
67           {i18n.t("reason")}: {r.post_report.reason}
68         </div>
69         {resolver && (
70           <div>
71             {r.post_report.resolved ? (
72               <T i18nKey="resolved_by">
73                 #
74                 <PersonListing person={resolver} />
75               </T>
76             ) : (
77               <T i18nKey="unresolved_by">
78                 #
79                 <PersonListing person={resolver} />
80               </T>
81             )}
82           </div>
83         )}
84         <button
85           className="btn btn-link btn-animate text-muted py-0"
86           onClick={linkEvent(this, this.handleResolveReport)}
87           data-tippy-content={tippyContent}
88           aria-label={tippyContent}
89         >
90           <Icon
91             icon="check"
92             classes={`icon-inline ${
93               r.post_report.resolved ? "text-success" : "text-danger"
94             }`}
95           />
96         </button>
97       </div>
98     );
99   }
100
101   handleResolveReport(i: PostReport) {
102     let auth = myAuth();
103     if (auth) {
104       let form: ResolvePostReport = {
105         report_id: i.props.report.post_report.id,
106         resolved: !i.props.report.post_report.resolved,
107         auth,
108       };
109       WebSocketService.Instance.send(wsClient.resolvePostReport(form));
110     }
111   }
112 }