Filter accounts in the autocomplete according to mod settings
This commit is contained in:
@@ -1,16 +1,27 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {AppBskyActorDefs} from '@atproto/api'
|
import {AppBskyActorDefs, ModerationOpts, moderateProfile} from '@atproto/api'
|
||||||
import {useQuery, useQueryClient} from '@tanstack/react-query'
|
import {useQuery, useQueryClient} from '@tanstack/react-query'
|
||||||
|
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {getAgent} from '#/state/session'
|
import {getAgent} from '#/state/session'
|
||||||
import {useMyFollowsQuery} from '#/state/queries/my-follows'
|
import {useMyFollowsQuery} from '#/state/queries/my-follows'
|
||||||
import {STALE} from '#/state/queries'
|
import {STALE} from '#/state/queries'
|
||||||
|
import {
|
||||||
|
DEFAULT_LOGGED_OUT_PREFERENCES,
|
||||||
|
getModerationOpts,
|
||||||
|
useModerationOpts,
|
||||||
|
} from './preferences'
|
||||||
|
|
||||||
|
const DEFAULT_MOD_OPTS = getModerationOpts({
|
||||||
|
userDid: '',
|
||||||
|
preferences: DEFAULT_LOGGED_OUT_PREFERENCES,
|
||||||
|
})
|
||||||
|
|
||||||
export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix]
|
export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix]
|
||||||
|
|
||||||
export function useActorAutocompleteQuery(prefix: string) {
|
export function useActorAutocompleteQuery(prefix: string) {
|
||||||
const {data: follows, isFetching} = useMyFollowsQuery()
|
const {data: follows, isFetching} = useMyFollowsQuery()
|
||||||
|
const moderationOpts = useModerationOpts()
|
||||||
|
|
||||||
return useQuery<AppBskyActorDefs.ProfileViewBasic[]>({
|
return useQuery<AppBskyActorDefs.ProfileViewBasic[]>({
|
||||||
staleTime: STALE.MINUTES.ONE,
|
staleTime: STALE.MINUTES.ONE,
|
||||||
@@ -22,9 +33,20 @@ export function useActorAutocompleteQuery(prefix: string) {
|
|||||||
limit: 8,
|
limit: 8,
|
||||||
})
|
})
|
||||||
: undefined
|
: undefined
|
||||||
return computeSuggestions(prefix, follows, res?.data.actors)
|
return res?.data.actors || []
|
||||||
},
|
},
|
||||||
enabled: !isFetching,
|
enabled: !isFetching,
|
||||||
|
select: React.useCallback(
|
||||||
|
(data: AppBskyActorDefs.ProfileViewBasic[]) => {
|
||||||
|
return computeSuggestions(
|
||||||
|
prefix,
|
||||||
|
follows,
|
||||||
|
data,
|
||||||
|
moderationOpts || DEFAULT_MOD_OPTS,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
[prefix, follows, moderationOpts],
|
||||||
|
),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +54,7 @@ export type ActorAutocompleteFn = ReturnType<typeof useActorAutocompleteFn>
|
|||||||
export function useActorAutocompleteFn() {
|
export function useActorAutocompleteFn() {
|
||||||
const queryClient = useQueryClient()
|
const queryClient = useQueryClient()
|
||||||
const {data: follows} = useMyFollowsQuery()
|
const {data: follows} = useMyFollowsQuery()
|
||||||
|
const moderationOpts = useModerationOpts()
|
||||||
|
|
||||||
return React.useCallback(
|
return React.useCallback(
|
||||||
async ({query, limit = 8}: {query: string; limit?: number}) => {
|
async ({query, limit = 8}: {query: string; limit?: number}) => {
|
||||||
@@ -54,9 +77,14 @@ export function useActorAutocompleteFn() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return computeSuggestions(query, follows, res?.data.actors)
|
return computeSuggestions(
|
||||||
|
query,
|
||||||
|
follows,
|
||||||
|
res?.data.actors,
|
||||||
|
moderationOpts || DEFAULT_MOD_OPTS,
|
||||||
|
)
|
||||||
},
|
},
|
||||||
[follows, queryClient],
|
[follows, queryClient, moderationOpts],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +92,7 @@ function computeSuggestions(
|
|||||||
prefix: string,
|
prefix: string,
|
||||||
follows: AppBskyActorDefs.ProfileViewBasic[] | undefined,
|
follows: AppBskyActorDefs.ProfileViewBasic[] | undefined,
|
||||||
searched: AppBskyActorDefs.ProfileViewBasic[] = [],
|
searched: AppBskyActorDefs.ProfileViewBasic[] = [],
|
||||||
|
moderationOpts: ModerationOpts,
|
||||||
) {
|
) {
|
||||||
let items: AppBskyActorDefs.ProfileViewBasic[] = []
|
let items: AppBskyActorDefs.ProfileViewBasic[] = []
|
||||||
if (follows) {
|
if (follows) {
|
||||||
@@ -76,10 +105,14 @@ function computeSuggestions(
|
|||||||
handle: item.handle,
|
handle: item.handle,
|
||||||
displayName: item.displayName,
|
displayName: item.displayName,
|
||||||
avatar: item.avatar,
|
avatar: item.avatar,
|
||||||
|
labels: item.labels,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return items
|
return items.filter(profile => {
|
||||||
|
const mod = moderateProfile(profile, moderationOpts)
|
||||||
|
return !mod.account.filter
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function prefixMatch(
|
function prefixMatch(
|
||||||
|
|||||||
Reference in New Issue
Block a user