about summary refs log tree commit diff
path: root/src/state/queries/profile-lists.ts
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-08-02 13:05:33 -0500
committerGitHub <noreply@github.com>2024-08-02 13:05:33 -0500
commitc3d8beee6dc141ced2c41795f90b3309a2bc75a2 (patch)
treee2aa55a6e79616ec989b7426e2c46b4cd56b91e2 /src/state/queries/profile-lists.ts
parent293ac6fab21f26baa8347c998f3a50224112c7c5 (diff)
downloadvoidsky-c3d8beee6dc141ced2c41795f90b3309a2bc75a2.tar.zst
Respect labels on feeds and lists (#4818)
* Prep

* Pass in optional moderation to FeedCard

* Compute moderation decision, filter contentList contexts, pass into card

* Let's go a different route

* Filter from within search queries

* Use same search query for starter packs

* Filter lists from profile tabs

* Cleanup

* Filter from profile feeds

* Moderate post embeds

* Memoize

* Use ScreenHider on lists

* Hide both list types

* Fix crash on iOS in screen hider, fix lineheight

* Memoize renderItem

* Reuse objects to prevent re-renders
Diffstat (limited to 'src/state/queries/profile-lists.ts')
-rw-r--r--src/state/queries/profile-lists.ts37
1 files changed, 27 insertions, 10 deletions
diff --git a/src/state/queries/profile-lists.ts b/src/state/queries/profile-lists.ts
index 112a62c83..75e3dd6e4 100644
--- a/src/state/queries/profile-lists.ts
+++ b/src/state/queries/profile-lists.ts
@@ -1,7 +1,8 @@
-import {AppBskyGraphGetLists} from '@atproto/api'
+import {AppBskyGraphGetLists, moderateUserList} from '@atproto/api'
 import {InfiniteData, QueryKey, useInfiniteQuery} from '@tanstack/react-query'
 
 import {useAgent} from '#/state/session'
+import {useModerationOpts} from '../preferences/moderation-opts'
 
 const PAGE_SIZE = 30
 type RQPageParam = string | undefined
@@ -10,7 +11,8 @@ const RQKEY_ROOT = 'profile-lists'
 export const RQKEY = (did: string) => [RQKEY_ROOT, did]
 
 export function useProfileListsQuery(did: string, opts?: {enabled?: boolean}) {
-  const enabled = opts?.enabled !== false
+  const moderationOpts = useModerationOpts()
+  const enabled = opts?.enabled !== false && Boolean(moderationOpts)
   const agent = useAgent()
   return useInfiniteQuery<
     AppBskyGraphGetLists.OutputSchema,
@@ -27,17 +29,32 @@ export function useProfileListsQuery(did: string, opts?: {enabled?: boolean}) {
         cursor: pageParam,
       })
 
-      // Starter packs use a reference list, which we do not want to show on profiles. At some point we could probably
-      // just filter this out on the backend instead of in the client.
-      return {
-        ...res.data,
-        lists: res.data.lists.filter(
-          l => l.purpose !== 'app.bsky.graph.defs#referencelist',
-        ),
-      }
+      return res.data
     },
     initialPageParam: undefined,
     getNextPageParam: lastPage => lastPage.cursor,
     enabled,
+    select(data) {
+      return {
+        ...data,
+        pages: data.pages.map(page => {
+          return {
+            ...page,
+            lists: page.lists
+              /*
+               * Starter packs use a reference list, which we do not want to
+               * show on profiles. At some point we could probably just filter
+               * this out on the backend instead of in the client.
+               */
+              .filter(l => l.purpose !== 'app.bsky.graph.defs#referencelist')
+              // filter by labels
+              .filter(list => {
+                const decision = moderateUserList(list, moderationOpts!)
+                return !decision.ui('contentList').filter
+              }),
+          }
+        }),
+      }
+    },
   })
 }