From 6d0557c959ed250ff0061605454324cc88775005 Mon Sep 17 00:00:00 2001 From: Mary Date: Tue, 16 Jan 2024 07:31:01 +0700 Subject: feat: better autocomplete view --- src/view/screens/Search/Search.tsx | 43 ++++++++++++++------- src/view/shell/desktop/Search.tsx | 77 +++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx index 8e7e204ad..02a631fa0 100644 --- a/src/view/screens/Search/Search.tsx +++ b/src/view/screens/Search/Search.tsx @@ -42,7 +42,11 @@ import {useSetDrawerOpen} from '#/state/shell' import {useAnalytics} from '#/lib/analytics/analytics' import {MagnifyingGlassIcon} from '#/lib/icons' import {useModerationOpts} from '#/state/queries/preferences' -import {SearchResultCard} from '#/view/shell/desktop/Search' +import { + MATCH_HANDLE, + SearchLinkCard, + SearchProfileCard, +} from '#/view/shell/desktop/Search' import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell' import {isWeb} from '#/platform/detection' import {listenSoftReset} from '#/state/events' @@ -511,6 +515,11 @@ export function SearchScreen( onPressCancelSearch() }, [onPressCancelSearch]) + const queryMaybeHandle = React.useMemo(() => { + const match = MATCH_HANDLE.exec(query) + return match && match[1] + }, [query]) + useFocusEffect( React.useCallback(() => { setMinimalShellMode(false) @@ -617,18 +626,26 @@ export function SearchScreen( dataSet={{stableGutters: '1'}} keyboardShouldPersistTaps="handled" keyboardDismissMode="on-drag"> - {searchResults.length ? ( - searchResults.map((item, i) => ( - - )) - ) : ( - - )} + + + {queryMaybeHandle ? ( + + ) : null} + + {searchResults.map(item => ( + + ))} diff --git a/src/view/shell/desktop/Search.tsx b/src/view/shell/desktop/Search.tsx index df49da55b..c24940b52 100644 --- a/src/view/shell/desktop/Search.tsx +++ b/src/view/shell/desktop/Search.tsx @@ -29,13 +29,41 @@ import {UserAvatar} from '#/view/com/util/UserAvatar' import {useActorAutocompleteFn} from '#/state/queries/actor-autocomplete' import {useModerationOpts} from '#/state/queries/preferences' -export function SearchResultCard({ - profile, +export const MATCH_HANDLE = + /@?([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))/ + +export function SearchLinkCard({ + label, + to, style, +}: { + label: string + to: string + style?: ViewStyle +}) { + const pal = usePalette('default') + + return ( + + + + {label} + + + + ) +} + +export function SearchProfileCard({ + profile, moderation, }: { profile: AppBskyActorDefs.ProfileViewBasic - style: ViewStyle moderation: ProfileModeration }) { const pal = usePalette('default') @@ -50,9 +78,7 @@ export function SearchResultCard({ { + const match = MATCH_HANDLE.exec(query) + return match && match[1] + }, [query]) + return ( ) : ( <> - {searchResults.length ? ( - searchResults.map((item, i) => ( - - )) - ) : ( - - - No results found for {query} - - - )} + + + {queryMaybeHandle ? ( + + ) : null} + + {searchResults.map(item => ( + + ))} )} -- cgit 1.4.1