Filter from within search queries

This commit is contained in:
Eric Bailey
2024-07-24 11:03:42 -05:00
parent 8412e2ac60
commit d3179db6df
+40 -4
View File
@@ -5,6 +5,7 @@ import {
AppBskyGraphDefs, AppBskyGraphDefs,
AppBskyUnspeccedGetPopularFeedGenerators, AppBskyUnspeccedGetPopularFeedGenerators,
AtUri, AtUri,
moderateFeedGenerator,
RichText, RichText,
} from '@atproto/api' } from '@atproto/api'
import { import {
@@ -26,6 +27,7 @@ import {RQKEY as listQueryKey} from '#/state/queries/list'
import {usePreferencesQuery} from '#/state/queries/preferences' import {usePreferencesQuery} from '#/state/queries/preferences'
import {useAgent, useSession} from '#/state/session' import {useAgent, useSession} from '#/state/session'
import {router} from '#/routes' import {router} from '#/routes'
import {useModerationOpts} from '../preferences/moderation-opts'
import {FeedDescriptor} from './post-feed' import {FeedDescriptor} from './post-feed'
import {precacheResolvedUri} from './resolve-uri' import {precacheResolvedUri} from './resolve-uri'
@@ -207,14 +209,16 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
const limit = options?.limit || 10 const limit = options?.limit || 10
const {data: preferences} = usePreferencesQuery() const {data: preferences} = usePreferencesQuery()
const queryClient = useQueryClient() const queryClient = useQueryClient()
const moderationOpts = useModerationOpts()
// Make sure this doesn't invalidate unless really needed. // Make sure this doesn't invalidate unless really needed.
const selectArgs = useMemo( const selectArgs = useMemo(
() => ({ () => ({
hasSession, hasSession,
savedFeeds: preferences?.savedFeeds || [], savedFeeds: preferences?.savedFeeds || [],
moderationOpts,
}), }),
[hasSession, preferences?.savedFeeds], [hasSession, preferences?.savedFeeds, moderationOpts],
) )
const lastPageCountRef = useRef(0) const lastPageCountRef = useRef(0)
@@ -225,6 +229,7 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
QueryKey, QueryKey,
string | undefined string | undefined
>({ >({
enabled: Boolean(moderationOpts),
queryKey: createGetPopularFeedsQueryKey(options), queryKey: createGetPopularFeedsQueryKey(options),
queryFn: async ({pageParam}) => { queryFn: async ({pageParam}) => {
const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({ const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({
@@ -246,7 +251,11 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
( (
data: InfiniteData<AppBskyUnspeccedGetPopularFeedGenerators.OutputSchema>, data: InfiniteData<AppBskyUnspeccedGetPopularFeedGenerators.OutputSchema>,
) => { ) => {
const {savedFeeds, hasSession: hasSessionInner} = selectArgs const {
savedFeeds,
hasSession: hasSessionInner,
moderationOpts,
} = selectArgs
return { return {
...data, ...data,
pages: data.pages.map(page => { pages: data.pages.map(page => {
@@ -264,7 +273,8 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
return f.value === feed.uri return f.value === feed.uri
}), }),
) )
return !alreadySaved const decision = moderateFeedGenerator(feed, moderationOpts!)
return !alreadySaved && !decision.ui('contentList').filter
}), }),
} }
}), }),
@@ -304,6 +314,8 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
export function useSearchPopularFeedsMutation() { export function useSearchPopularFeedsMutation() {
const agent = useAgent() const agent = useAgent()
const moderationOpts = useModerationOpts()
return useMutation({ return useMutation({
mutationFn: async (query: string) => { mutationFn: async (query: string) => {
const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({ const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({
@@ -311,6 +323,13 @@ export function useSearchPopularFeedsMutation() {
query: query, query: query,
}) })
if (moderationOpts) {
return res.data.feeds.filter(feed => {
const decision = moderateFeedGenerator(feed, moderationOpts)
return !decision.ui('contentList').filter
})
}
return res.data.feeds return res.data.feeds
}, },
}) })
@@ -318,7 +337,9 @@ export function useSearchPopularFeedsMutation() {
export function useSearchPopularFeedsQuery({q}: {q: string}) { export function useSearchPopularFeedsQuery({q}: {q: string}) {
const agent = useAgent() const agent = useAgent()
const moderationOpts = useModerationOpts()
return useQuery({ return useQuery({
enabled: Boolean(moderationOpts),
queryKey: ['searchPopularFeeds', q], queryKey: ['searchPopularFeeds', q],
queryFn: async () => { queryFn: async () => {
const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({ const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({
@@ -329,6 +350,12 @@ export function useSearchPopularFeedsQuery({q}: {q: string}) {
return res.data.feeds return res.data.feeds
}, },
placeholderData: keepPreviousData, placeholderData: keepPreviousData,
select(data) {
return data.filter(feed => {
const decision = moderateFeedGenerator(feed, moderationOpts!)
return !decision.ui('contentList').filter
})
},
}) })
} }
@@ -346,8 +373,11 @@ export function usePopularFeedsSearch({
enabled?: boolean enabled?: boolean
}) { }) {
const agent = useAgent() const agent = useAgent()
const moderationOpts = useModerationOpts()
const enabledInner = enabled ?? Boolean(moderationOpts)
return useQuery({ return useQuery({
enabled, enabled: enabledInner,
queryKey: createPopularFeedsSearchQueryKey(query), queryKey: createPopularFeedsSearchQueryKey(query),
queryFn: async () => { queryFn: async () => {
const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({ const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({
@@ -357,6 +387,12 @@ export function usePopularFeedsSearch({
return res.data.feeds return res.data.feeds
}, },
select(data) {
return data.filter(feed => {
const decision = moderateFeedGenerator(feed, moderationOpts!)
return !decision.ui('contentList').filter
})
},
}) })
} }