diff options
Diffstat (limited to 'src/screens')
-rw-r--r-- | src/screens/Search/components/AutocompleteResults.tsx | 9 | ||||
-rw-r--r-- | src/screens/Search/components/SearchProfileCard.tsx | 62 |
2 files changed, 67 insertions, 4 deletions
diff --git a/src/screens/Search/components/AutocompleteResults.tsx b/src/screens/Search/components/AutocompleteResults.tsx index 58a0dec77..b3bccd1d4 100644 --- a/src/screens/Search/components/AutocompleteResults.tsx +++ b/src/screens/Search/components/AutocompleteResults.tsx @@ -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() diff --git a/src/screens/Search/components/SearchProfileCard.tsx b/src/screens/Search/components/SearchProfileCard.tsx new file mode 100644 index 000000000..69a12cc0a --- /dev/null +++ b/src/screens/Search/components/SearchProfileCard.tsx @@ -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> + ) +} |