From a06b58e831563d4ec196838d76227df49823a614 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 6 Aug 2025 21:05:38 +0300 Subject: [PATCH] try using downshift --- package.json | 1 + src/view/shell/desktop/Search.tsx | 29 ++++++++++++++++----------- yarn.lock | 33 +++++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index f89c7089c5..1ab2563897 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "bcp-47-match": "^2.0.3", "date-fns": "^2.30.0", "deprecated-react-native-prop-types": "^5.0.0", + "downshift": "^9.0.10", "email-validator": "^2.0.4", "emoji-mart": "^5.5.2", "emoji-regex": "^10.4.0", diff --git a/src/view/shell/desktop/Search.tsx b/src/view/shell/desktop/Search.tsx index 1f7b88d7f2..24499d8b0b 100644 --- a/src/view/shell/desktop/Search.tsx +++ b/src/view/shell/desktop/Search.tsx @@ -1,4 +1,4 @@ -import {useDeferredValue, useRef, useState} from 'react' +import {useDeferredValue, useMemo, useRef, useState} from 'react' import { ActivityIndicator, type StyleProp, @@ -9,6 +9,7 @@ import { import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {StackActions, useNavigation} from '@react-navigation/native' +import {useCombobox} from 'downshift' import {type NavigationProp} from '#/lib/routes/types' import {useModerationOpts} from '#/state/preferences/moderation-opts' @@ -54,9 +55,7 @@ export function DesktopSearch() { const {_} = useLingui() const t = useTheme() const navigation = useNavigation() - const searchInputRef = useRef(null) - const [isFocused, setIsFocused] = useState(false) const [query, setQuery] = useState('') const deferredQuery = useDeferredValue(query) const {data: autocompleteData, isFetching} = useActorAutocompleteQuery( @@ -64,11 +63,18 @@ export function DesktopSearch() { true, ) - const moderationOpts = useModerationOpts() + const items = useMemo(() => { + if (deferredQuery.length === 0) return [] + return ['__TEXT__', ...(autocompleteData || [])] + }, [deferredQuery, autocompleteData]) - const onChangeText = (text: string) => { - setQuery(text) - } + const {getInputProps, isOpen} = useCombobox({ + items, + getItemId: index => + typeof items[index] === 'string' ? items[index] : items[index].did, + }) + + const moderationOpts = useModerationOpts() const onPressCancelSearch = () => { setQuery('') @@ -89,19 +95,18 @@ export function DesktopSearch() { setQuery('') } + console.log(getInputProps()) + return ( setIsFocused(true)} - onBlur={() => setIsFocused(false)} + {...getInputProps()} /> - {(deferredQuery !== '' || isFocused) && moderationOpts && ( + {isOpen && moderationOpts && (