import {Pressable, ScrollView, View} from 'react-native' import {moderateProfile, type ModerationOpts} from '@atproto/api' import {Plural, Trans, useLingui} from '@lingui/react/macro' import {createHitslop, HITSLOP_10} from '#/lib/constants' import {makeProfileLink} from '#/lib/routes/links' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {UserAvatar} from '#/view/com/util/UserAvatar' import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture' import { countActiveFilters, parseHistoryEntry, } from '#/screens/Search/searchParams' import {atoms as a, useTheme} from '#/alf' import {Button, ButtonIcon} from '#/components/Button' import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' import * as Layout from '#/components/Layout' import {Link} from '#/components/Link' import {ProfileBadges} from '#/components/ProfileBadges' import {Text} from '#/components/Typography' import {useAnalytics} from '#/analytics' import type * as bsky from '#/types/bsky' export function SearchHistory({ searchHistory, selectedProfiles, onItemClick, onProfileClick, onRemoveItemClick, onRemoveProfileClick, }: { searchHistory: string[] selectedProfiles: bsky.profile.AnyProfileView[] onItemClick: (item: string) => void onProfileClick: (profile: bsky.profile.AnyProfileView) => void onRemoveItemClick: (item: string) => void onRemoveProfileClick: (profile: bsky.profile.AnyProfileView) => void }) { const ax = useAnalytics() const moderationOpts = useModerationOpts() return ( {(searchHistory.length > 0 || selectedProfiles.length > 0) && ( Recent searches )} {selectedProfiles.length > 0 && ( {moderationOpts && selectedProfiles.map((profile, index) => ( { ax.metric('search:recent:press', { profileDid: profile.did, position: index, }) onProfileClick(profile) }} onRemove={() => onRemoveProfileClick(profile)} /> ))} )} {searchHistory.length > 0 && ( {searchHistory.slice(0, 5).map((historyItem, index) => { const {q, filters} = parseHistoryEntry(historyItem) const filterCount = countActiveFilters(filters) return ( { ax.metric('search:query', { source: 'history', filterCount, }) onItemClick(historyItem) }} onRemove={() => onRemoveItemClick(historyItem)} /> ) })} )} ) } function SearchHistoryItem({ q, filterCount, onPress, onRemove, }: { q: string filterCount: number onPress: () => void onRemove: () => void }) { const t = useTheme() const {t: l} = useLingui() return ( {q} {filterCount > 0 ? ( ) : null} ) } function RecentProfileItem({ profile, moderationOpts, onPress, onRemove, }: { profile: bsky.profile.AnyProfileView moderationOpts: ModerationOpts onPress: () => void onRemove: () => void }) { const {t: l} = useLingui() const width = 80 const moderation = moderateProfile(profile, moderationOpts) const name = sanitizeDisplayName( profile.displayName || sanitizeHandle(profile.handle), moderation.ui('displayName'), ) return ( {name} ) }