From 830b560b8928c5a5487b157676d30f07a0da9aca Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 22 Oct 2024 16:09:36 -0500 Subject: [PATCH] Revise autocomplete usage --- .../Composer/OutlineTags/index.web.tsx | 82 +++++++------------ .../text-input/tagsAutocompleteState.ts | 1 + 2 files changed, 30 insertions(+), 53 deletions(-) diff --git a/src/components/Composer/OutlineTags/index.web.tsx b/src/components/Composer/OutlineTags/index.web.tsx index 2181e3c255..29f8f58c45 100644 --- a/src/components/Composer/OutlineTags/index.web.tsx +++ b/src/components/Composer/OutlineTags/index.web.tsx @@ -12,10 +12,9 @@ import {TextInputFocusEventData} from 'react-native' import {Pin} from 'pind' import {isWeb} from '#/platform/detection' -import {useSession} from '#/state/session' -import {tagAutocompleteModel} from '#/view/com/composer/text-input/tagsAutocompleteState' +import {useTagAutocomplete} from '#/view/com/composer/text-input/tagsAutocompleteState' import {atoms as a, useTheme} from '#/alf' -import {Button, ButtonIcon, ButtonProps,ButtonText} from '#/components/Button' +import {Button, ButtonIcon, ButtonProps, ButtonText} from '#/components/Button' import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' import {Text} from '#/components/Typography' @@ -57,32 +56,23 @@ export function OutlineTags({ onChangeTags: (tags: string[]) => void }) { const t = useTheme() - const {currentAccount} = useSession() const dropdown = React.useRef(null) const input = React.useRef(null) const inputWidth = input.current ? input.current.getBoundingClientRect().width : 200 - const model = React.useMemo( - () => tagAutocompleteModel({currentDid: currentAccount?.did!}), - [currentAccount], - ) + const {query, suggestions, setQuery, saveRecentTag} = useTagAutocomplete() const containerRef = React.useRef(null) - const [value, setValue] = React.useState('') const [tags, setTags] = React.useState(initialTags) - const [dropdownItems, setDropdownItems] = React.useState< - {value: string; label: string}[] - >([]) const [selectedItemIndex, setSelectedItemIndex] = React.useState(0) - const dropdownIsActive = Boolean(value.length) + const dropdownIsActive = Boolean(query.length) const closeDropdownAndReset = React.useCallback(() => { - setValue('') + setQuery('') setSelectedItemIndex(0) - setDropdownItems([]) - }, [setSelectedItemIndex, setDropdownItems]) + }, [setQuery, setSelectedItemIndex]) const addTags = React.useCallback( (_tags: string[]) => { @@ -109,29 +99,29 @@ export function OutlineTags({ addTags(Array.from(new Set([...tags, tag])).slice(0, max)) } - model.save(tag) - setValue('') + saveRecentTag(tag) + setQuery('') input.current?.focus() closeDropdownAndReset() }, - [max, tags, closeDropdownAndReset, setValue, addTags, model], + [max, tags, closeDropdownAndReset, setQuery, addTags, saveRecentTag], ) const onSubmitEditing = React.useCallback(() => { - const item = dropdownItems[selectedItemIndex] - addTagAndReset(item?.value || value) - }, [value, dropdownItems, selectedItemIndex, addTagAndReset]) + const item = suggestions[selectedItemIndex] + addTagAndReset(item?.value || query) + }, [query, suggestions, selectedItemIndex, addTagAndReset]) const onKeyPress = React.useCallback( (e: NativeSyntheticEvent) => { const {key} = e.nativeEvent - if (key === 'Backspace' && value === '') { + if (key === 'Backspace' && query === '') { addTags(tags.slice(0, -1)) closeDropdownAndReset() } else if (key === ' ') { e.preventDefault() // prevents an additional space on web - addTagAndReset(value) + addTagAndReset(query) } if (dropdownIsActive) { @@ -140,12 +130,11 @@ export function OutlineTags({ } else if (key === 'ArrowUp') { e.preventDefault() setSelectedItemIndex( - (selectedItemIndex + dropdownItems.length - 1) % - dropdownItems.length, + (selectedItemIndex + suggestions.length - 1) % suggestions.length, ) } else if (key === 'ArrowDown') { e.preventDefault() - setSelectedItemIndex((selectedItemIndex + 1) % dropdownItems.length) + setSelectedItemIndex((selectedItemIndex + 1) % suggestions.length) } else if ( isWeb && key === 'Tab' && @@ -158,11 +147,11 @@ export function OutlineTags({ } }, [ - value, + query, tags, dropdownIsActive, selectedItemIndex, - dropdownItems.length, + suggestions.length, closeDropdownAndReset, setSelectedItemIndex, addTags, @@ -171,32 +160,19 @@ export function OutlineTags({ ], ) - const search = React.useCallback( - async (value: string) => { - await model.search(value) - setDropdownItems( - model.suggestions.map(s => ({ - value: s.value, - label: s.value, - })), - ) - }, - [model, setDropdownItems], - ) - const onChangeText = React.useCallback( async (value: string) => { const tag = sanitizeHashtagOnChange(value) - setValue(tag) + setQuery(tag) if (tag.length) { - search(tag) + setQuery(tag) } else { - closeDropdownAndReset() + setSelectedItemIndex(0) } }, - [setValue, closeDropdownAndReset, search], + [setSelectedItemIndex, setQuery], ) const onBlur = React.useCallback( @@ -208,10 +184,10 @@ export function OutlineTags({ !tags.length && (!target || !target.id.includes('tag_autocomplete_option')) ) { - setValue('') + setQuery('') } }, - [tags, setValue], + [tags, setQuery], ) React.useEffect(() => { @@ -257,7 +233,7 @@ export function OutlineTags({ aria-controls="tags-autocomplete-dropdown" aria-haspopup="listbox" aria-expanded={dropdownIsActive} - value={value} + value={query} onBlur={onBlur} onKeyPress={onKeyPress} onSubmitEditing={onSubmitEditing} @@ -283,7 +259,7 @@ export function OutlineTags({ - {dropdownItems.map((item, index) => { + {suggestions.map((item, index) => { const isFirst = index === 0 - const isLast = index === dropdownItems.length - 1 + const isLast = index === suggestions.length - 1 return ( - {item.label} + {item.value} ) })} diff --git a/src/view/com/composer/text-input/tagsAutocompleteState.ts b/src/view/com/composer/text-input/tagsAutocompleteState.ts index 5ce70da21f..2aeabecb02 100644 --- a/src/view/com/composer/text-input/tagsAutocompleteState.ts +++ b/src/view/com/composer/text-input/tagsAutocompleteState.ts @@ -66,6 +66,7 @@ export function useTagAutocomplete() { }, [currentAccount, query, searchSuggestions]) return { + query, suggestions, setQuery: onSetQuery, saveRecentTag,