1 import { commentsToFlatNodes } from "@utils/app";
2 import { Component } from "inferno";
23 GetPersonDetailsResponse,
26 MarkCommentReplyAsRead,
27 MarkPersonMentionAsRead,
40 } from "lemmy-js-client";
41 import { CommentViewType, PersonDetailsView } from "../../interfaces";
42 import { setupTippy } from "../../tippy";
43 import { CommentNodes } from "../comment/comment-nodes";
44 import { Paginator } from "../common/paginator";
45 import { PostListing } from "../post/post-listing";
47 interface PersonDetailsProps {
48 personRes: GetPersonDetailsResponse;
49 finished: Map<CommentId, boolean | undefined>;
51 allLanguages: Language[];
52 siteLanguages: number[];
56 enableDownvotes: boolean;
58 view: PersonDetailsView;
59 onPageChange(page: number): number | any;
60 onSaveComment(form: SaveComment): void;
61 onCommentReplyRead(form: MarkCommentReplyAsRead): void;
62 onPersonMentionRead(form: MarkPersonMentionAsRead): void;
63 onCreateComment(form: CreateComment): void;
64 onEditComment(form: EditComment): void;
65 onCommentVote(form: CreateCommentLike): void;
66 onBlockPerson(form: BlockPerson): void;
67 onDeleteComment(form: DeleteComment): void;
68 onRemoveComment(form: RemoveComment): void;
69 onDistinguishComment(form: DistinguishComment): void;
70 onAddModToCommunity(form: AddModToCommunity): void;
71 onAddAdmin(form: AddAdmin): void;
72 onBanPersonFromCommunity(form: BanFromCommunity): void;
73 onBanPerson(form: BanPerson): void;
74 onTransferCommunity(form: TransferCommunity): void;
75 onFetchChildren?(form: GetComments): void;
76 onCommentReport(form: CreateCommentReport): void;
77 onPurgePerson(form: PurgePerson): void;
78 onPurgeComment(form: PurgeComment): void;
79 onPostEdit(form: EditPost): void;
80 onPostVote(form: CreatePostLike): void;
81 onPostReport(form: CreatePostReport): void;
82 onLockPost(form: LockPost): void;
83 onDeletePost(form: DeletePost): void;
84 onRemovePost(form: RemovePost): void;
85 onSavePost(form: SavePost): void;
86 onFeaturePost(form: FeaturePost): void;
87 onPurgePost(form: PurgePost): void;
88 onMarkPostAsRead(form: MarkPostAsRead): void;
98 view: CommentView | PostView;
103 export class PersonDetails extends Component<PersonDetailsProps, any> {
104 constructor(props: any, context: any) {
105 super(props, context);
106 this.handlePageChange = this.handlePageChange.bind(this);
109 componentDidMount() {
115 <div className="person-details">
116 {this.viewSelector(this.props.view)}
118 <Paginator page={this.props.page} onChange={this.handlePageChange} />
123 viewSelector(view: PersonDetailsView) {
125 view === PersonDetailsView.Overview ||
126 view === PersonDetailsView.Saved
128 return this.overview();
129 } else if (view === PersonDetailsView.Comments) {
130 return this.comments();
131 } else if (view === PersonDetailsView.Posts) {
138 renderItemType(i: ItemType) {
140 case ItemEnum.Comment: {
141 const c = i.view as CommentView;
145 nodes={[{ comment_view: c, children: [], depth: 0 }]}
146 viewType={CommentViewType.Flat}
147 finished={this.props.finished}
148 admins={this.props.admins}
152 enableDownvotes={this.props.enableDownvotes}
153 allLanguages={this.props.allLanguages}
154 siteLanguages={this.props.siteLanguages}
155 onCommentReplyRead={this.props.onCommentReplyRead}
156 onPersonMentionRead={this.props.onPersonMentionRead}
157 onCreateComment={this.props.onCreateComment}
158 onEditComment={this.props.onEditComment}
159 onCommentVote={this.props.onCommentVote}
160 onBlockPerson={this.props.onBlockPerson}
161 onSaveComment={this.props.onSaveComment}
162 onDeleteComment={this.props.onDeleteComment}
163 onRemoveComment={this.props.onRemoveComment}
164 onDistinguishComment={this.props.onDistinguishComment}
165 onAddModToCommunity={this.props.onAddModToCommunity}
166 onAddAdmin={this.props.onAddAdmin}
167 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
168 onBanPerson={this.props.onBanPerson}
169 onTransferCommunity={this.props.onTransferCommunity}
170 onFetchChildren={this.props.onFetchChildren}
171 onCommentReport={this.props.onCommentReport}
172 onPurgePerson={this.props.onPurgePerson}
173 onPurgeComment={this.props.onPurgeComment}
177 case ItemEnum.Post: {
178 const p = i.view as PostView;
183 admins={this.props.admins}
185 enableDownvotes={this.props.enableDownvotes}
186 enableNsfw={this.props.enableNsfw}
187 allLanguages={this.props.allLanguages}
188 siteLanguages={this.props.siteLanguages}
189 onPostEdit={this.props.onPostEdit}
190 onPostVote={this.props.onPostVote}
191 onPostReport={this.props.onPostReport}
192 onBlockPerson={this.props.onBlockPerson}
193 onLockPost={this.props.onLockPost}
194 onDeletePost={this.props.onDeletePost}
195 onRemovePost={this.props.onRemovePost}
196 onSavePost={this.props.onSavePost}
197 onFeaturePost={this.props.onFeaturePost}
198 onPurgePerson={this.props.onPurgePerson}
199 onPurgePost={this.props.onPurgePost}
200 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
201 onBanPerson={this.props.onBanPerson}
202 onAddModToCommunity={this.props.onAddModToCommunity}
203 onAddAdmin={this.props.onAddAdmin}
204 onTransferCommunity={this.props.onTransferCommunity}
205 onMarkPostAsRead={this.props.onMarkPostAsRead}
216 const comments: ItemType[] = this.props.personRes.comments.map(r => ({
218 type_: ItemEnum.Comment,
220 published: r.comment.published,
221 score: r.counts.score,
223 const posts: ItemType[] = this.props.personRes.posts.map(r => ({
225 type_: ItemEnum.Post,
227 published: r.post.published,
228 score: r.counts.score,
231 const combined = [...comments, ...posts];
234 if (this.props.sort === "New") {
235 combined.sort((a, b) => b.published.localeCompare(a.published));
237 combined.sort((a, b) => Number(b.score - a.score));
243 this.renderItemType(i),
244 <hr key={i.type_} className="my-3" />,
254 nodes={commentsToFlatNodes(this.props.personRes.comments)}
255 viewType={CommentViewType.Flat}
256 admins={this.props.admins}
257 finished={this.props.finished}
261 enableDownvotes={this.props.enableDownvotes}
262 allLanguages={this.props.allLanguages}
263 siteLanguages={this.props.siteLanguages}
264 onCommentReplyRead={this.props.onCommentReplyRead}
265 onPersonMentionRead={this.props.onPersonMentionRead}
266 onCreateComment={this.props.onCreateComment}
267 onEditComment={this.props.onEditComment}
268 onCommentVote={this.props.onCommentVote}
269 onBlockPerson={this.props.onBlockPerson}
270 onSaveComment={this.props.onSaveComment}
271 onDeleteComment={this.props.onDeleteComment}
272 onRemoveComment={this.props.onRemoveComment}
273 onDistinguishComment={this.props.onDistinguishComment}
274 onAddModToCommunity={this.props.onAddModToCommunity}
275 onAddAdmin={this.props.onAddAdmin}
276 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
277 onBanPerson={this.props.onBanPerson}
278 onTransferCommunity={this.props.onTransferCommunity}
279 onFetchChildren={this.props.onFetchChildren}
280 onCommentReport={this.props.onCommentReport}
281 onPurgePerson={this.props.onPurgePerson}
282 onPurgeComment={this.props.onPurgeComment}
291 {this.props.personRes.posts.map(post => (
295 admins={this.props.admins}
297 enableDownvotes={this.props.enableDownvotes}
298 enableNsfw={this.props.enableNsfw}
299 allLanguages={this.props.allLanguages}
300 siteLanguages={this.props.siteLanguages}
301 onPostEdit={this.props.onPostEdit}
302 onPostVote={this.props.onPostVote}
303 onPostReport={this.props.onPostReport}
304 onBlockPerson={this.props.onBlockPerson}
305 onLockPost={this.props.onLockPost}
306 onDeletePost={this.props.onDeletePost}
307 onRemovePost={this.props.onRemovePost}
308 onSavePost={this.props.onSavePost}
309 onFeaturePost={this.props.onFeaturePost}
310 onPurgePerson={this.props.onPurgePerson}
311 onPurgePost={this.props.onPurgePost}
312 onBanPersonFromCommunity={this.props.onBanPersonFromCommunity}
313 onBanPerson={this.props.onBanPerson}
314 onAddModToCommunity={this.props.onAddModToCommunity}
315 onAddAdmin={this.props.onAddAdmin}
316 onTransferCommunity={this.props.onTransferCommunity}
317 onMarkPostAsRead={this.props.onMarkPostAsRead}
319 <hr className="my-3" />
326 handlePageChange(val: number) {
327 this.props.onPageChange(val);