X-Git-Url: http://these/git/?a=blobdiff_plain;f=src%2Fshared%2Fcomponents%2Fpost%2Fpost-listings.tsx;h=fc77f505a11ff76119bd52658dc4a116bb04603b;hb=afafb777b4be09d70cd8f56f8d236d98ac63ba6e;hp=8bdb5698a334dcce70c79524bfefb718a84dd97e;hpb=9068a6415df4bf50bdb9200ebd17269b9b22e184;p=lemmy-ui.git diff --git a/src/shared/components/post/post-listings.tsx b/src/shared/components/post/post-listings.tsx index 8bdb569..fc77f50 100644 --- a/src/shared/components/post/post-listings.tsx +++ b/src/shared/components/post/post-listings.tsx @@ -1,62 +1,111 @@ import { Component } from "inferno"; import { T } from "inferno-i18next-dess"; import { Link } from "inferno-router"; -import { PostView } from "lemmy-js-client"; -import { i18n } from "../../i18next"; +import { + AddAdmin, + AddModToCommunity, + BanFromCommunity, + BanPerson, + BlockPerson, + CreatePostLike, + CreatePostReport, + DeletePost, + EditPost, + FeaturePost, + Language, + LockPost, + MarkPostAsRead, + PostView, + PurgePerson, + PurgePost, + RemovePost, + SavePost, + TransferCommunity, +} from "lemmy-js-client"; +import { I18NextService } from "../../services"; import { PostListing } from "./post-listing"; interface PostListingsProps { posts: PostView[]; + allLanguages: Language[]; + siteLanguages: number[]; showCommunity?: boolean; removeDuplicates?: boolean; - enableDownvotes: boolean; - enableNsfw: boolean; + enableDownvotes?: boolean; + enableNsfw?: boolean; + viewOnly?: boolean; + onPostEdit(form: EditPost): void; + onPostVote(form: CreatePostLike): void; + onPostReport(form: CreatePostReport): void; + onBlockPerson(form: BlockPerson): void; + onLockPost(form: LockPost): void; + onDeletePost(form: DeletePost): void; + onRemovePost(form: RemovePost): void; + onSavePost(form: SavePost): void; + onFeaturePost(form: FeaturePost): void; + onPurgePerson(form: PurgePerson): void; + onPurgePost(form: PurgePost): void; + onBanPersonFromCommunity(form: BanFromCommunity): void; + onBanPerson(form: BanPerson): void; + onAddModToCommunity(form: AddModToCommunity): void; + onAddAdmin(form: AddAdmin): void; + onTransferCommunity(form: TransferCommunity): void; + onMarkPostAsRead(form: MarkPostAsRead): void; } -interface PostListingsState { - posts: PostView[]; -} - -export class PostListings extends Component< - PostListingsProps, - PostListingsState -> { +export class PostListings extends Component { duplicatesMap = new Map(); - private emptyState: PostListingsState = { - posts: [], - }; - constructor(props: any, context: any) { super(props, context); - this.state = this.emptyState; - if (this.props.removeDuplicates) { - this.state.posts = this.removeDuplicates(); - } else { - this.state.posts = this.props.posts; - } + } + + get posts() { + return this.props.removeDuplicates + ? this.removeDuplicates() + : this.props.posts; } render() { return ( -
- {this.state.posts.length > 0 ? ( - this.state.posts.map(post_view => ( +
+ {this.posts.length > 0 ? ( + this.posts.map((post_view, idx) => ( <> -
+ {idx + 1 !== this.posts.length &&
} )) ) : ( <> -
{i18n.t("no_posts")}
- {this.props.showCommunity !== undefined && ( +
{I18NextService.i18n.t("no_posts")}
+ {this.props.showCommunity && ( ## @@ -69,32 +118,33 @@ export class PostListings extends Component< removeDuplicates(): PostView[] { // Must use a spread to clone the props, because splice will fail below otherwise. - let posts = [...this.props.posts]; + const posts = [...this.props.posts].filter(empty => empty); // A map from post url to list of posts (dupes) - let urlMap = new Map(); + const urlMap = new Map(); // Loop over the posts, find ones with same urls - for (let pv of posts) { + for (const pv of posts) { + const url = pv.post.url; if ( - pv.post.url && !pv.post.deleted && !pv.post.removed && !pv.community.deleted && - !pv.community.removed + !pv.community.removed && + url ) { - if (!urlMap.get(pv.post.url)) { - urlMap.set(pv.post.url, [pv]); + if (!urlMap.get(url)) { + urlMap.set(url, [pv]); } else { - urlMap.get(pv.post.url).push(pv); + urlMap.get(url)?.push(pv); } } } // Sort by oldest // Remove the ones that have no length - for (let e of urlMap.entries()) { - if (e[1].length == 1) { + for (const e of urlMap.entries()) { + if (e[1].length === 1) { urlMap.delete(e[0]); } else { e[1].sort((a, b) => a.post.published.localeCompare(b.post.published)); @@ -102,12 +152,13 @@ export class PostListings extends Component< } for (let i = 0; i < posts.length; i++) { - let pv = posts[i]; - if (pv.post.url) { - let found = urlMap.get(pv.post.url); + const pv = posts[i]; + const url = pv.post.url; + if (url) { + const found = urlMap.get(url); if (found) { // If its the oldest, add - if (pv.post.id == found[0].post.id) { + if (pv.post.id === found[0].post.id) { this.duplicatesMap.set(pv.post.id, found.slice(1)); } // Otherwise, delete it