forked from nutomic/lemmy
Combine duplicate front page posts. Fixes #284
This commit is contained in:
parent
586e8861de
commit
7037506566
5 changed files with 75 additions and 3 deletions
2
ui/src/components/community.tsx
vendored
2
ui/src/components/community.tsx
vendored
|
@ -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">
|
||||
|
|
6
ui/src/components/main.tsx
vendored
6
ui/src/components/main.tsx
vendored
|
@ -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>
|
||||
)}
|
||||
|
|
12
ui/src/components/post-listing.tsx
vendored
12
ui/src/components/post-listing.tsx
vendored
|
@ -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 && (
|
||||
<>
|
||||
|
|
57
ui/src/components/post-listings.tsx
vendored
57
ui/src/components/post-listings.tsx
vendored
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
1
ui/src/interfaces.ts
vendored
1
ui/src/interfaces.ts
vendored
|
@ -172,6 +172,7 @@ export interface Post {
|
|||
saved?: boolean;
|
||||
upvoteLoading?: boolean;
|
||||
downvoteLoading?: boolean;
|
||||
duplicates?: Array<Post>;
|
||||
}
|
||||
|
||||
export interface Comment {
|
||||
|
|
Loading…
Reference in a new issue