From 269105371b22f2de6e8017862a783aaec340948b Mon Sep 17 00:00:00 2001 From: Francisco Nascimento Date: Wed, 11 Jun 2025 14:21:31 +0100 Subject: [PATCH] Instant Feed Update on Mute or Moderation Action (#8463) * Implemented #2406: Instant Feed Update on Mute or Moderation Action Posts from muted or blocked users are now removed immediately from the feed. This is achieved by extending the usePostShadow hook to check if the post author is muted or blocked and return POST_TOMBSTONE accordingly. A unit test was also added to validate the new logic. Co-authored-by: Pedro Macedo * remove useless tests --------- Co-authored-by: Pedro Macedo Co-authored-by: Samuel Newman --- src/state/cache/post-shadow.ts | 12 ++++++++++-- src/state/queries/profile.ts | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts index 923e5c0000..3f9644879b 100644 --- a/src/state/cache/post-shadow.ts +++ b/src/state/cache/post-shadow.ts @@ -14,6 +14,7 @@ import {findAllPostsInQueryData as findAllPostsInFeedQueryData} from '#/state/qu import {findAllPostsInQueryData as findAllPostsInQuoteQueryData} from '#/state/queries/post-quotes' import {findAllPostsInQueryData as findAllPostsInThreadQueryData} from '#/state/queries/post-thread' import {findAllPostsInQueryData as findAllPostsInSearchQueryData} from '#/state/queries/search-posts' +import {useProfileShadow} from './profile-shadow' import {castAsShadow, type Shadow} from './types' export type {Shadow} from './types' @@ -43,6 +44,10 @@ export function usePostShadow( setShadow(shadows.get(post)) } + const authorShadow = useProfileShadow(post.author) + const wasMuted = !!authorShadow.viewer?.muted + const wasBlocked = !!authorShadow.viewer?.blocking + useEffect(() => { function onUpdate() { setShadow(shadows.get(post)) @@ -54,15 +59,18 @@ export function usePostShadow( }, [post, setShadow]) return useMemo(() => { + if (wasMuted || wasBlocked) { + return POST_TOMBSTONE + } if (shadow) { return mergeShadow(post, shadow) } else { return castAsShadow(post) } - }, [post, shadow]) + }, [post, shadow, wasMuted, wasBlocked]) } -function mergeShadow( +export function mergeShadow( post: AppBskyFeedDefs.PostView, shadow: Partial, ): Shadow | typeof POST_TOMBSTONE { diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index eb65fef7c2..b0af57c4a7 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -499,9 +499,10 @@ function useProfileBlockMutation() { {subject: did, createdAt: new Date().toISOString()}, ) }, - onSuccess(_, {did}) { + onSuccess(data, {did}) { queryClient.invalidateQueries({queryKey: RQKEY_MY_BLOCKED()}) resetProfilePostsQueries(queryClient, did, 1000) + updateProfileShadow(queryClient, did, {blockingUri: data.uri}) }, }) } @@ -523,6 +524,7 @@ function useProfileUnblockMutation() { }, onSuccess(_, {did}) { resetProfilePostsQueries(queryClient, did, 1000) + updateProfileShadow(queryClient, did, {blockingUri: undefined}) }, }) }