Skip to content

Commit

Permalink
Filter mute words from search
Browse files Browse the repository at this point in the history
  • Loading branch information
estrattonbailey committed Oct 3, 2024
1 parent eb3b01d commit 939b071
Showing 1 changed file with 74 additions and 1 deletion.
75 changes: 74 additions & 1 deletion src/state/queries/search-posts.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import React from 'react'
import {
AppBskyActorDefs,
AppBskyFeedDefs,
Expand All @@ -11,6 +12,8 @@ import {
useInfiniteQuery,
} from '@tanstack/react-query'

import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useAgent} from '#/state/session'
import {
didOrHandleUriMatches,
Expand All @@ -35,6 +38,19 @@ export function useSearchPostsQuery({
enabled?: boolean
}) {
const agent = useAgent()
const moderationOpts = useModerationOpts()
const selectArgs = React.useMemo(
() => ({
moderationOpts,
}),
[moderationOpts],
)
const lastRun = React.useRef<{
data: InfiniteData<AppBskyFeedSearchPosts.OutputSchema>
args: typeof selectArgs
result: InfiniteData<AppBskyFeedSearchPosts.OutputSchema>
} | null>(null)

return useInfiniteQuery<
AppBskyFeedSearchPosts.OutputSchema,
Error,
Expand All @@ -54,7 +70,64 @@ export function useSearchPostsQuery({
},
initialPageParam: undefined,
getNextPageParam: lastPage => lastPage.cursor,
enabled,
enabled: enabled ?? !!moderationOpts,
select: React.useCallback(
(data: InfiniteData<AppBskyFeedSearchPosts.OutputSchema>) => {
const {moderationOpts} = selectArgs

// Keep track of the last run and whether we can reuse
// some already selected pages from there.
let reusedPages = []
if (lastRun.current) {
const {
data: lastData,
args: lastArgs,
result: lastResult,
} = lastRun.current
let canReuse = true
for (let key in selectArgs) {
if (selectArgs.hasOwnProperty(key)) {
if ((selectArgs as any)[key] !== (lastArgs as any)[key]) {
// Can't do reuse anything if any input has changed.
canReuse = false
break
}
}
}
if (canReuse) {
for (let i = 0; i < data.pages.length; i++) {
if (data.pages[i] && lastData.pages[i] === data.pages[i]) {
reusedPages.push(lastResult.pages[i])
continue
}
// Stop as soon as pages stop matching up.
break
}
}
}

const result = {
...data,
pages: [
...reusedPages,
...data.pages.slice(reusedPages.length).map(page => {
return {
...page,
posts: page.posts.filter(post => {
const mod = moderatePost(post, moderationOpts!)
return !mod.ui('contentList').filter
}),
}
}),
],
}

lastRun.current = {data, result, args: selectArgs}

return result
},
[selectArgs],
),
})
}

Expand Down

0 comments on commit 939b071

Please sign in to comment.