1 import { None, Some } from "@sniptt/monads/build";
2 import { Component } from "inferno";
5 GetPersonDetailsResponse,
10 } from "lemmy-js-client";
11 import { CommentViewType, PersonDetailsView } from "../../interfaces";
12 import { commentsToFlatNodes, setupTippy } from "../../utils";
13 import { CommentNodes } from "../comment/comment-nodes";
14 import { Paginator } from "../common/paginator";
15 import { PostListing } from "../post/post-listing";
17 interface PersonDetailsProps {
18 personRes: GetPersonDetailsResponse;
19 admins: PersonViewSafe[];
20 allLanguages: Language[];
21 siteLanguages: number[];
25 enableDownvotes: boolean;
27 view: PersonDetailsView;
28 onPageChange(page: number): number | any;
38 view: CommentView | PostView;
43 export class PersonDetails extends Component<PersonDetailsProps, any> {
44 constructor(props: any, context: any) {
45 super(props, context);
46 this.handlePageChange = this.handlePageChange.bind(this);
54 // componentDidUpdate(lastProps: UserDetailsProps) {
55 // for (const key of Object.keys(lastProps)) {
56 // if (lastProps[key] !== this.props[key]) {
57 // this.fetchUserData();
66 {this.viewSelector(this.props.view)}
68 <Paginator page={this.props.page} onChange={this.handlePageChange} />
73 viewSelector(view: PersonDetailsView) {
75 view === PersonDetailsView.Overview ||
76 view === PersonDetailsView.Saved
78 return this.overview();
79 } else if (view === PersonDetailsView.Comments) {
80 return this.comments();
81 } else if (view === PersonDetailsView.Posts) {
88 renderItemType(i: ItemType) {
90 case ItemEnum.Comment: {
91 let c = i.view as CommentView;
95 nodes={[{ comment_view: c, children: [], depth: 0 }]}
96 viewType={CommentViewType.Flat}
97 admins={Some(this.props.admins)}
99 maxCommentsShown={None}
104 enableDownvotes={this.props.enableDownvotes}
105 allLanguages={this.props.allLanguages}
106 siteLanguages={this.props.siteLanguages}
110 case ItemEnum.Post: {
111 let p = i.view as PostView;
116 admins={Some(this.props.admins)}
120 enableDownvotes={this.props.enableDownvotes}
121 enableNsfw={this.props.enableNsfw}
122 allLanguages={this.props.allLanguages}
123 siteLanguages={this.props.siteLanguages}
134 let comments: ItemType[] = this.props.personRes.comments.map(r => ({
136 type_: ItemEnum.Comment,
138 published: r.comment.published,
139 score: r.counts.score,
141 let posts: ItemType[] = this.props.personRes.posts.map(r => ({
143 type_: ItemEnum.Post,
145 published: r.post.published,
146 score: r.counts.score,
149 let combined = [...comments, ...posts];
152 if (this.props.sort === SortType.New) {
153 combined.sort((a, b) => b.published.localeCompare(a.published));
155 combined.sort((a, b) => b.score - a.score);
161 this.renderItemType(i),
162 <hr key={i.type_} className="my-3" />,
172 nodes={commentsToFlatNodes(this.props.personRes.comments)}
173 viewType={CommentViewType.Flat}
174 admins={Some(this.props.admins)}
176 maxCommentsShown={None}
180 enableDownvotes={this.props.enableDownvotes}
181 allLanguages={this.props.allLanguages}
182 siteLanguages={this.props.siteLanguages}
191 {this.props.personRes.posts.map(post => (
195 admins={Some(this.props.admins)}
199 enableDownvotes={this.props.enableDownvotes}
200 enableNsfw={this.props.enableNsfw}
201 allLanguages={this.props.allLanguages}
202 siteLanguages={this.props.siteLanguages}
204 <hr className="my-3" />
211 handlePageChange(val: number) {
212 this.props.onPageChange(val);