import { None, Some } from "@sniptt/monads/build"; import { Component } from "inferno"; import { CommentView, GetPersonDetailsResponse, PersonViewSafe, 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: PersonViewSafe[]; page: number; limit: number; sort: SortType; enableDownvotes: boolean; enableNsfw: boolean; view: PersonDetailsView; onPageChange(page: number): number | any; } enum ItemEnum { Comment, Post, } type ItemType = { id: number; type_: ItemEnum; view: CommentView | PostView; published: string; score: number; }; 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 === SortType.New) { combined.sort((a, b) => b.published.localeCompare(a.published)); } else { combined.sort((a, b) => b.score - a.score); } return (
{combined.map(i => [this.renderItemType(i),
])}
); } comments() { return (
); } posts() { return (
{this.props.personRes.posts.map(post => ( <>
))}
); } handlePageChange(val: number) { this.props.onPageChange(val); } }