1 import { commentsToFlatNodes } from "@utils/app";
2 import { Component } from "inferno";
23 GetPersonDetailsResponse,
26 MarkCommentReplyAsRead,
27 MarkPersonMentionAsRead,
39 } from "lemmy-js-client";
40 import { CommentViewType, PersonDetailsView } from "../../interfaces";
41 import { setupTippy } from "../../tippy";
42 import { CommentNodes } from "../comment/comment-nodes";
43 import { Paginator } from "../common/paginator";
44 import { PostListing } from "../post/post-listing";
46 interface PersonDetailsProps {
47 personRes: GetPersonDetailsResponse;
48 finished: Map<CommentId, boolean | undefined>;
50 allLanguages: Language[];
51 siteLanguages: number[];
55 enableDownvotes: boolean;
57 view: PersonDetailsView;
58 onPageChange(page: number): number | any;
59 onSaveComment(form: SaveComment): void;
60 onCommentReplyRead(form: MarkCommentReplyAsRead): void;
61 onPersonMentionRead(form: MarkPersonMentionAsRead): void;
62 onCreateComment(form: CreateComment): void;
63 onEditComment(form: EditComment): void;
64 onCommentVote(form: CreateCommentLike): void;
65 onBlockPerson(form: BlockPerson): void;
66 onDeleteComment(form: DeleteComment): void;
67 onRemoveComment(form: RemoveComment): void;
68 onDistinguishComment(form: DistinguishComment): void;
69 onAddModToCommunity(form: AddModToCommunity): void;
70 onAddAdmin(form: AddAdmin): void;
71 onBanPersonFromCommunity(form: BanFromCommunity): void;
72 onBanPerson(form: BanPerson): void;
73 onTransferCommunity(form: TransferCommunity): void;
74 onFetchChildren?(form: GetComments): void;
75 onCommentReport(form: CreateCommentReport): void;
76 onPurgePerson(form: PurgePerson): void;
77 onPurgeComment(form: PurgeComment): void;
78 onPostEdit(form: EditPost): void;
79 onPostVote(form: CreatePostLike): void;
80 onPostReport(form: CreatePostReport): void;
81 onLockPost(form: LockPost): void;
82 onDeletePost(form: DeletePost): void;
83 onRemovePost(form: RemovePost): void;
84 onSavePost(form: SavePost): void;
85 onFeaturePost(form: FeaturePost): void;
86 onPurgePost(form: PurgePost): void;
96 view: CommentView | PostView;
101 export class PersonDetails extends Component<PersonDetailsProps, any> {
102 constructor(props: any, context: any) {
103 super(props, context);
104 this.handlePageChange = this.handlePageChange.bind(this);
107 componentDidMount() {
113 <div className="person-details">
114 {this.viewSelector(this.props.view)}
116 <Paginator page={this.props.page} onChange={this.handlePageChange} />
121 viewSelector(view: PersonDetailsView) {
123 view === PersonDetailsView.Overview ||
124 view === PersonDetailsView.Saved
126 return this.overview();
127 } else if (view === PersonDetailsView.Comments) {
128 return this.comments();
129 } else if (view === PersonDetailsView.Posts) {
136 renderItemType(i: ItemType) {
138 case ItemEnum.Comment: {
139 const c = i.view as CommentView;
143 nodes={[{ comment_view: c, children: [], depth: 0 }]}
144 viewType={CommentViewType.Flat}
145 finished={this.props.finished}
146 admins={this.props.admins}
150 enableDownvotes={this.props.enableDownvotes}
151 allLanguages={this.props.allLanguages}
152 siteLanguages={this.props.siteLanguages}
153 onCommentReplyRead={this.props.onCommentReplyRead}
154 onPersonMentionRead={this.props.onPersonMentionRead}
155 onCreateComment={this.props.onCreateComment}
156 onEditComment={this.props.onEditComment}
157 onCommentVote={this.props.onCommentVote}
158 onBlockPerson={this.props.onBlockPerson}
159 onSaveComment={this.props.onSaveComment}
160 onDeleteComment={this.props.onDeleteComment}
161 onRemoveComment={this.props.onRemoveComment}
162 onDistinguishComment={this.props.onDistinguishComment}
163 onAddModToCommunity={this.props.onAddModToCommunity}
164 onAddAdmin={this.props.onAddAdmin}
165 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
166 onBanPerson={this.props.onBanPerson}
167 onTransferCommunity={this.props.onTransferCommunity}
168 onFetchChildren={this.props.onFetchChildren}
169 onCommentReport={this.props.onCommentReport}
170 onPurgePerson={this.props.onPurgePerson}
171 onPurgeComment={this.props.onPurgeComment}
175 case ItemEnum.Post: {
176 const p = i.view as PostView;
181 admins={this.props.admins}
183 enableDownvotes={this.props.enableDownvotes}
184 enableNsfw={this.props.enableNsfw}
185 allLanguages={this.props.allLanguages}
186 siteLanguages={this.props.siteLanguages}
187 onPostEdit={this.props.onPostEdit}
188 onPostVote={this.props.onPostVote}
189 onPostReport={this.props.onPostReport}
190 onBlockPerson={this.props.onBlockPerson}
191 onLockPost={this.props.onLockPost}
192 onDeletePost={this.props.onDeletePost}
193 onRemovePost={this.props.onRemovePost}
194 onSavePost={this.props.onSavePost}
195 onFeaturePost={this.props.onFeaturePost}
196 onPurgePerson={this.props.onPurgePerson}
197 onPurgePost={this.props.onPurgePost}
198 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
199 onBanPerson={this.props.onBanPerson}
200 onAddModToCommunity={this.props.onAddModToCommunity}
201 onAddAdmin={this.props.onAddAdmin}
202 onTransferCommunity={this.props.onTransferCommunity}
213 const comments: ItemType[] = this.props.personRes.comments.map(r => ({
215 type_: ItemEnum.Comment,
217 published: r.comment.published,
218 score: r.counts.score,
220 const posts: ItemType[] = this.props.personRes.posts.map(r => ({
222 type_: ItemEnum.Post,
224 published: r.post.published,
225 score: r.counts.score,
228 const combined = [...comments, ...posts];
231 if (this.props.sort === "New") {
232 combined.sort((a, b) => b.published.localeCompare(a.published));
234 combined.sort((a, b) => Number(b.score - a.score));
240 this.renderItemType(i),
241 <hr key={i.type_} className="my-3" />,
251 nodes={commentsToFlatNodes(this.props.personRes.comments)}
252 viewType={CommentViewType.Flat}
253 admins={this.props.admins}
254 finished={this.props.finished}
258 enableDownvotes={this.props.enableDownvotes}
259 allLanguages={this.props.allLanguages}
260 siteLanguages={this.props.siteLanguages}
261 onCommentReplyRead={this.props.onCommentReplyRead}
262 onPersonMentionRead={this.props.onPersonMentionRead}
263 onCreateComment={this.props.onCreateComment}
264 onEditComment={this.props.onEditComment}
265 onCommentVote={this.props.onCommentVote}
266 onBlockPerson={this.props.onBlockPerson}
267 onSaveComment={this.props.onSaveComment}
268 onDeleteComment={this.props.onDeleteComment}
269 onRemoveComment={this.props.onRemoveComment}
270 onDistinguishComment={this.props.onDistinguishComment}
271 onAddModToCommunity={this.props.onAddModToCommunity}
272 onAddAdmin={this.props.onAddAdmin}
273 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
274 onBanPerson={this.props.onBanPerson}
275 onTransferCommunity={this.props.onTransferCommunity}
276 onFetchChildren={this.props.onFetchChildren}
277 onCommentReport={this.props.onCommentReport}
278 onPurgePerson={this.props.onPurgePerson}
279 onPurgeComment={this.props.onPurgeComment}
288 {this.props.personRes.posts.map(post => (
292 admins={this.props.admins}
294 enableDownvotes={this.props.enableDownvotes}
295 enableNsfw={this.props.enableNsfw}
296 allLanguages={this.props.allLanguages}
297 siteLanguages={this.props.siteLanguages}
298 onPostEdit={this.props.onPostEdit}
299 onPostVote={this.props.onPostVote}
300 onPostReport={this.props.onPostReport}
301 onBlockPerson={this.props.onBlockPerson}
302 onLockPost={this.props.onLockPost}
303 onDeletePost={this.props.onDeletePost}
304 onRemovePost={this.props.onRemovePost}
305 onSavePost={this.props.onSavePost}
306 onFeaturePost={this.props.onFeaturePost}
307 onPurgePerson={this.props.onPurgePerson}
308 onPurgePost={this.props.onPurgePost}
309 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
310 onBanPerson={this.props.onBanPerson}
311 onAddModToCommunity={this.props.onAddModToCommunity}
312 onAddAdmin={this.props.onAddAdmin}
313 onTransferCommunity={this.props.onTransferCommunity}
315 <hr className="my-3" />
322 handlePageChange(val: number) {
323 this.props.onPageChange(val);