diff options
author | Dessalines <tyhou13@gmx.com> | 2020-02-03 19:52:39 -0500 |
---|---|---|
committer | Dessalines <tyhou13@gmx.com> | 2020-02-03 19:52:39 -0500 |
commit | e4dfa5e52f911a6dbb5df41932a70dd9af3c9753 (patch) | |
tree | 28a97128f786ac758cbe3b2b2507d67565b0995a | |
parent | a28f8c7ac44594fbefb1d170b4e0365d04b6a204 (diff) |
Combine duplicate front page posts. Fixes #284
-rw-r--r-- | ui/src/components/community.tsx | 2 | ||||
-rw-r--r-- | ui/src/components/main.tsx | 6 | ||||
-rw-r--r-- | ui/src/components/post-listing.tsx | 12 | ||||
-rw-r--r-- | ui/src/components/post-listings.tsx | 57 | ||||
-rw-r--r-- | ui/src/interfaces.ts | 1 |
5 files changed, 75 insertions, 3 deletions
diff --git a/ui/src/components/community.tsx b/ui/src/components/community.tsx index 9f96ac51..7e3e2cd7 100644 --- a/ui/src/components/community.tsx +++ b/ui/src/components/community.tsx @@ -145,7 +145,7 @@ export class Community extends Component<any, State> { )} </h5> {this.selects()} - <PostListings posts={this.state.posts} /> + <PostListings posts={this.state.posts} removeDuplicates /> {this.paginator()} </div> <div class="col-12 col-md-4"> diff --git a/ui/src/components/main.tsx b/ui/src/components/main.tsx index ed31fff4..6d3e1815 100644 --- a/ui/src/components/main.tsx +++ b/ui/src/components/main.tsx @@ -392,7 +392,11 @@ export class Main extends Component<any, MainState> { ) : ( <div> {this.selects()} - <PostListings posts={this.state.posts} showCommunity /> + <PostListings + posts={this.state.posts} + showCommunity + removeDuplicates + /> {this.paginator()} </div> )} diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx index ba8e6980..f05adf39 100644 --- a/ui/src/components/post-listing.tsx +++ b/ui/src/components/post-listing.tsx @@ -329,6 +329,18 @@ export class PostListing extends Component<PostListingProps, PostListingState> { </Link> </li> </ul> + <ul class="list-inline mb-1 text-muted small"> + {this.props.post.duplicates && ( + <> + <li className="list-inline-item mr-2">cross-posted to:</li> + {this.props.post.duplicates.map(post => ( + <li className="list-inline-item mr-2"> + <Link to={`/post/${post.id}`}>{post.community_name}</Link> + </li> + ))} + </> + )} + </ul> <ul class="list-inline mb-1 text-muted small font-weight-bold"> {UserService.Instance.user && ( <> diff --git a/ui/src/components/post-listings.tsx b/ui/src/components/post-listings.tsx index df0bac85..65db3727 100644 --- a/ui/src/components/post-listings.tsx +++ b/ui/src/components/post-listings.tsx @@ -7,6 +7,7 @@ import { i18n } from '../i18next'; interface PostListingsProps { posts: Array<Post>; showCommunity?: boolean; + removeDuplicates?: boolean; } export class PostListings extends Component<PostListingsProps, any> { @@ -18,7 +19,10 @@ export class PostListings extends Component<PostListingsProps, any> { return ( <div> {this.props.posts.length > 0 ? ( - this.props.posts.map(post => ( + (this.props.removeDuplicates + ? this.removeDuplicates(this.props.posts) + : this.props.posts + ).map(post => ( <> <PostListing post={post} @@ -43,4 +47,55 @@ export class PostListings extends Component<PostListingsProps, any> { </div> ); } + + removeDuplicates(posts: Array<Post>): Array<Post> { + // A map from post url to list of posts (dupes) + let urlMap = new Map<string, Array<Post>>(); + + // Loop over the posts, find ones with same urls + for (let post of posts) { + if ( + post.url && + !post.deleted && + !post.removed && + !post.community_deleted && + !post.community_removed + ) { + if (!urlMap.get(post.url)) { + urlMap.set(post.url, [post]); + } else { + urlMap.get(post.url).push(post); + } + } + } + + // Sort by oldest + // Remove the ones that have no length + for (let e of urlMap.entries()) { + if (e[1].length == 1) { + urlMap.delete(e[0]); + } else { + e[1].sort((a, b) => a.published.localeCompare(b.published)); + } + } + + for (let i = 0; i < posts.length; i++) { + let post = posts[i]; + if (post.url) { + let found = urlMap.get(post.url); + if (found) { + // If its the oldest, add + if (post.id == found[0].id) { + post.duplicates = found.slice(1); + } + // Otherwise, delete it + else { + posts.splice(i--, 1); + } + } + } + } + + return posts; + } } diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts index 98cdc763..6c87d3e9 100644 --- a/ui/src/interfaces.ts +++ b/ui/src/interfaces.ts @@ -172,6 +172,7 @@ export interface Post { saved?: boolean; upvoteLoading?: boolean; downvoteLoading?: boolean; + duplicates?: Array<Post>; } export interface Comment { |