about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrancisco Nascimento <fnascimento1284@gmail.com>2025-06-11 14:21:31 +0100
committerGitHub <noreply@github.com>2025-06-11 06:21:31 -0700
commit269105371b22f2de6e8017862a783aaec340948b (patch)
tree82173e1672fdc3a3015128549a62dee0048da9d2
parent1380c5ac67c937b84dd5d7172fbb660c45d0c87c (diff)
downloadvoidsky-269105371b22f2de6e8017862a783aaec340948b.tar.zst
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 <pedrosantosmacedo@tecnico.ulisboa.pt>

* remove useless tests

---------

Co-authored-by: Pedro Macedo <pedrosantosmacedo@tecnico.ulisboa.pt>
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
-rw-r--r--src/state/cache/post-shadow.ts12
-rw-r--r--src/state/queries/profile.ts4
2 files changed, 13 insertions, 3 deletions
diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts
index 923e5c000..3f9644879 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<PostShadow>,
 ): Shadow<AppBskyFeedDefs.PostView> | typeof POST_TOMBSTONE {
diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts
index eb65fef7c..b0af57c4a 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})
     },
   })
 }