From c5f84649ddbf058e9dfc162db5e34ae71960a5aa Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 22 Sep 2022 13:13:59 -0400 Subject: [PATCH] Fix posts pushed from blocked users/comms. Fixes #697 (#792) --- src/shared/components/community/community.tsx | 23 ++++++++++---- src/shared/components/home/home.tsx | 18 +++++------ src/shared/utils.ts | 30 +++++++++++++++++++ 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/shared/components/community/community.tsx b/src/shared/components/community/community.tsx index a509df15..82049100 100644 --- a/src/shared/components/community/community.tsx +++ b/src/shared/components/community/community.tsx @@ -49,7 +49,9 @@ import { getDataTypeFromProps, getPageFromProps, getSortTypeFromProps, + isPostBlocked, notifyPost, + nsfwCheck, postToCommentSortType, relTags, restoreScrollPosition, @@ -594,15 +596,24 @@ export class Community extends Component { this.setState(this.state); } else if (op == UserOperation.CreatePost) { let data = wsJsonToRes(msg, PostResponse); - this.state.posts.unshift(data.post_view); + + let showPostNotifs = UserService.Instance.myUserInfo + .map(m => m.local_user_view.local_user.show_new_post_notifs) + .unwrapOr(false); + + // Only push these if you're on the first page, you pass the nsfw check, and it isn't blocked + // if ( - UserService.Instance.myUserInfo - .map(m => m.local_user_view.local_user.show_new_post_notifs) - .unwrapOr(false) + this.state.page == 1 && + nsfwCheck(data.post_view) && + !isPostBlocked(data.post_view) ) { - notifyPost(data.post_view, this.context.router); + this.state.posts.unshift(data.post_view); + if (showPostNotifs) { + notifyPost(data.post_view, this.context.router); + } + this.setState(this.state); } - this.setState(this.state); } else if (op == UserOperation.CreatePostLike) { let data = wsJsonToRes(msg, PostResponse); createPostLikeFindRes(data.post_view, this.state.posts); diff --git a/src/shared/components/home/home.tsx b/src/shared/components/home/home.tsx index 3761998e..3d163197 100644 --- a/src/shared/components/home/home.tsx +++ b/src/shared/components/home/home.tsx @@ -52,7 +52,9 @@ import { getPageFromProps, getSortTypeFromProps, isBrowser, + isPostBlocked, notifyPost, + nsfwCheck, postToCommentSortType, relTags, restoreScrollPosition, @@ -756,21 +758,17 @@ export class Home extends Component { setupTippy(); } else if (op == UserOperation.CreatePost) { let data = wsJsonToRes(msg, PostResponse); - // NSFW check - let nsfw = data.post_view.post.nsfw || data.post_view.community.nsfw; - let nsfwCheck = - !nsfw || - (nsfw && - UserService.Instance.myUserInfo - .map(m => m.local_user_view.local_user.show_nsfw) - .unwrapOr(false)); let showPostNotifs = UserService.Instance.myUserInfo .map(m => m.local_user_view.local_user.show_new_post_notifs) .unwrapOr(false); - // Only push these if you're on the first page, and you pass the nsfw check - if (this.state.page == 1 && nsfwCheck) { + // Only push these if you're on the first page, you pass the nsfw check, and it isn't blocked + if ( + this.state.page == 1 && + nsfwCheck(data.post_view) && + !isPostBlocked(data.post_view) + ) { // If you're on subscribed, only push it if you're subscribed. if (this.state.listingType == ListingType.Subscribed) { if ( diff --git a/src/shared/utils.ts b/src/shared/utils.ts index 6c6db1fd..5fda2e60 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -1487,3 +1487,33 @@ export function canCreateCommunity(siteRes: GetSiteResponse): boolean { .unwrapOr(false); return !adminOnly || amAdmin(Some(siteRes.admins)); } + +export function isPostBlocked( + pv: PostView, + myUserInfo = UserService.Instance.myUserInfo +): boolean { + return myUserInfo + .map( + mui => + mui.community_blocks + .map(c => c.community.id) + .includes(pv.community.id) || + mui.person_blocks.map(p => p.target.id).includes(pv.creator.id) + ) + .unwrapOr(false); +} + +/// Checks to make sure you can view NSFW posts. Returns true if you can. +export function nsfwCheck( + pv: PostView, + myUserInfo = UserService.Instance.myUserInfo +): boolean { + let nsfw = pv.post.nsfw || pv.community.nsfw; + return ( + !nsfw || + (nsfw && + myUserInfo + .map(m => m.local_user_view.local_user.show_nsfw) + .unwrapOr(false)) + ); +}