import { Component } from "inferno"; import { CommentView, GetPersonDetailsResponse, Language, PersonView, PostView, SortType, } from "lemmy-js-client"; import { CommentViewType, PersonDetailsView } from "../../interfaces"; import { commentsToFlatNodes, setupTippy } from "../../utils"; import { CommentNodes } from "../comment/comment-nodes"; import { Paginator } from "../common/paginator"; import { PostListing } from "../post/post-listing"; interface PersonDetailsProps { personRes: GetPersonDetailsResponse; admins: PersonView[]; allLanguages: Language[]; siteLanguages: number[]; page: bigint; limit: bigint; sort: SortType; enableDownvotes: boolean; enableNsfw: boolean; view: PersonDetailsView; onPageChange(page: bigint): bigint | any; } enum ItemEnum { Comment, Post, } type ItemType = { id: number; type_: ItemEnum; view: CommentView | PostView; published: string; score: bigint; }; export class PersonDetails extends Component { constructor(props: any, context: any) { super(props, context); this.handlePageChange = this.handlePageChange.bind(this); } componentDidMount() { setupTippy(); } // TODO wut? // componentDidUpdate(lastProps: UserDetailsProps) { // for (const key of Object.keys(lastProps)) { // if (lastProps[key] !== this.props[key]) { // this.fetchUserData(); // break; // } // } // } render() { return (
{this.viewSelector(this.props.view)}
); } viewSelector(view: PersonDetailsView) { if ( view === PersonDetailsView.Overview || view === PersonDetailsView.Saved ) { return this.overview(); } else if (view === PersonDetailsView.Comments) { return this.comments(); } else if (view === PersonDetailsView.Posts) { return this.posts(); } else { return null; } } renderItemType(i: ItemType) { switch (i.type_) { case ItemEnum.Comment: { let c = i.view as CommentView; return ( ); } case ItemEnum.Post: { let p = i.view as PostView; return ( ); } default: return
; } } overview() { let id = 0; let comments: ItemType[] = this.props.personRes.comments.map(r => ({ id: id++, type_: ItemEnum.Comment, view: r, published: r.comment.published, score: r.counts.score, })); let posts: ItemType[] = this.props.personRes.posts.map(r => ({ id: id++, type_: ItemEnum.Post, view: r, published: r.post.published, score: r.counts.score, })); let combined = [...comments, ...posts]; // Sort it if (this.props.sort === "New") { combined.sort((a, b) => b.published.localeCompare(a.published)); } else { combined.sort((a, b) => Number(b.score - a.score)); } return (
{combined.map(i => [ this.renderItemType(i),
, ])}
); } comments() { return (
); } posts() { return (
{this.props.personRes.posts.map(post => ( <>
))}
); } handlePageChange(val: bigint) { this.props.onPageChange(val); } }