ALF search cards (#8210)

This commit is contained in:
Eric Bailey
2025-04-16 18:42:41 -05:00
committed by GitHub
parent fb8ab9f26d
commit faab49bd9e
3 changed files with 78 additions and 85 deletions
@@ -1,12 +1,13 @@
import {memo} from 'react'
import {ActivityIndicator, View} from 'react-native'
import {type AppBskyActorDefs, moderateProfile} from '@atproto/api'
import {type AppBskyActorDefs} from '@atproto/api'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {isNative} from '#/platform/detection'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {SearchLinkCard, SearchProfileCard} from '#/view/shell/desktop/Search'
import {SearchLinkCard} from '#/view/shell/desktop/Search'
import {SearchProfileCard} from '#/screens/Search/components/SearchProfileCard'
import {atoms as a, native} from '#/alf'
import * as Layout from '#/components/Layout'
@@ -25,8 +26,8 @@ let AutocompleteResults = ({
onResultPress: () => void
onProfileClick: (profile: AppBskyActorDefs.ProfileViewBasic) => void
}): React.ReactNode => {
const moderationOpts = useModerationOpts()
const {_} = useLingui()
const moderationOpts = useModerationOpts()
return (
<>
{(isAutocompleteFetching && !autocompleteData?.length) ||
@@ -54,7 +55,7 @@ let AutocompleteResults = ({
<SearchProfileCard
key={item.did}
profile={item}
moderation={moderateProfile(item, moderationOpts)}
moderationOpts={moderationOpts}
onPress={() => {
onProfileClick(item)
onResultPress()
@@ -0,0 +1,62 @@
import {useCallback} from 'react'
import {View} from 'react-native'
import {type AppBskyActorDefs, type ModerationOpts} from '@atproto/api'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query'
import {makeProfileLink} from '#/lib/routes/links'
import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache'
import {atoms as a, useTheme} from '#/alf'
import {Link} from '#/components/Link'
import * as ProfileCard from '#/components/ProfileCard'
export function SearchProfileCard({
profile,
moderationOpts,
onPress: onPressInner,
}: {
profile: AppBskyActorDefs.ProfileViewBasic
moderationOpts: ModerationOpts
onPress?: () => void
}) {
const t = useTheme()
const {_} = useLingui()
const qc = useQueryClient()
const onPress = useCallback(() => {
unstableCacheProfileView(qc, profile)
onPressInner?.()
}, [qc, profile, onPressInner])
return (
<Link
testID={`searchAutoCompleteResult-${profile.handle}`}
to={makeProfileLink(profile)}
label={_(msg`View ${profile.handle}'s profile`)}
onPress={onPress}>
{({hovered, pressed}) => (
<View
style={[
a.flex_1,
a.px_md,
a.py_sm,
(hovered || pressed) && t.atoms.bg_contrast_25,
]}>
<ProfileCard.Outer>
<ProfileCard.Header>
<ProfileCard.Avatar
profile={profile}
moderationOpts={moderationOpts}
/>
<ProfileCard.NameAndHandle
profile={profile}
moderationOpts={moderationOpts}
/>
</ProfileCard.Header>
</ProfileCard.Outer>
</View>
)}
</Link>
)
}