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>
|
</h5>
|
||||||
{this.selects()}
|
{this.selects()}
|
||||||
<PostListings posts={this.state.posts} />
|
<PostListings posts={this.state.posts} removeDuplicates />
|
||||||
{this.paginator()}
|
{this.paginator()}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-4">
|
<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>
|
<div>
|
||||||
{this.selects()}
|
{this.selects()}
|
||||||
<PostListings posts={this.state.posts} showCommunity />
|
<PostListings
|
||||||
|
posts={this.state.posts}
|
||||||
|
showCommunity
|
||||||
|
removeDuplicates
|
||||||
|
/>
|
||||||
{this.paginator()}
|
{this.paginator()}
|
||||||
</div>
|
</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>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</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">
|
<ul class="list-inline mb-1 text-muted small font-weight-bold">
|
||||||
{UserService.Instance.user && (
|
{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 {
|
interface PostListingsProps {
|
||||||
posts: Array<Post>;
|
posts: Array<Post>;
|
||||||
showCommunity?: boolean;
|
showCommunity?: boolean;
|
||||||
|
removeDuplicates?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class PostListings extends Component<PostListingsProps, any> {
|
export class PostListings extends Component<PostListingsProps, any> {
|
||||||
|
@ -18,7 +19,10 @@ export class PostListings extends Component<PostListingsProps, any> {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{this.props.posts.length > 0 ? (
|
{this.props.posts.length > 0 ? (
|
||||||
this.props.posts.map(post => (
|
(this.props.removeDuplicates
|
||||||
|
? this.removeDuplicates(this.props.posts)
|
||||||
|
: this.props.posts
|
||||||
|
).map(post => (
|
||||||
<>
|
<>
|
||||||
<PostListing
|
<PostListing
|
||||||
post={post}
|
post={post}
|
||||||
|
@ -43,4 +47,55 @@ export class PostListings extends Component<PostListingsProps, any> {
|
||||||
</div>
|
</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;
|
saved?: boolean;
|
||||||
upvoteLoading?: boolean;
|
upvoteLoading?: boolean;
|
||||||
downvoteLoading?: boolean;
|
downvoteLoading?: boolean;
|
||||||
|
duplicates?: Array<Post>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Comment {
|
export interface Comment {
|
||||||
|
|
Reference in a new issue