Autocomplete updates (react-query refactor) (#1911)

* Unify the autocomplete code; drop fuse

* Persist autocomplete results while they're in progress

* Commit lockfile

* Use ReturnType helper

---------

Co-authored-by: Eric Bailey <git@esb.lol>
This commit is contained in:
Paul Frazee 2023-11-15 14:39:22 -08:00 committed by GitHub
parent 839e8e8d0a
commit d5ea31920c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 73 additions and 152 deletions

View file

@ -1,4 +1,4 @@
import React, {useEffect} from 'react'
import React, {useEffect, useRef} from 'react'
import {Animated, TouchableOpacity, StyleSheet, View} from 'react-native'
import {observer} from 'mobx-react-lite'
import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
@ -7,6 +7,8 @@ import {Text} from 'view/com/util/text/Text'
import {UserAvatar} from 'view/com/util/UserAvatar'
import {useGrapheme} from '../hooks/useGrapheme'
import {useActorAutocompleteQuery} from '#/state/queries/actor-autocomplete'
import {Trans} from '@lingui/macro'
import {AppBskyActorDefs} from '@atproto/api'
export const Autocomplete = observer(function AutocompleteImpl({
prefix,
@ -19,7 +21,13 @@ export const Autocomplete = observer(function AutocompleteImpl({
const positionInterp = useAnimatedValue(0)
const {getGraphemeString} = useGrapheme()
const isActive = !!prefix
const {data: suggestions} = useActorAutocompleteQuery(prefix)
const {data: suggestions, isFetching} = useActorAutocompleteQuery(prefix)
const suggestionsRef = useRef<
AppBskyActorDefs.ProfileViewBasic[] | undefined
>(undefined)
if (suggestions) {
suggestionsRef.current = suggestions
}
useEffect(() => {
Animated.timing(positionInterp, {
@ -44,8 +52,8 @@ export const Autocomplete = observer(function AutocompleteImpl({
<Animated.View style={topAnimStyle}>
{isActive ? (
<View style={[pal.view, styles.container, pal.border]}>
{suggestions?.length ? (
suggestions.slice(0, 5).map(item => {
{suggestionsRef.current?.length ? (
suggestionsRef.current.slice(0, 5).map(item => {
// Eventually use an average length
const MAX_CHARS = 40
const MAX_HANDLE_CHARS = 20
@ -84,7 +92,11 @@ export const Autocomplete = observer(function AutocompleteImpl({
})
) : (
<Text type="sm" style={[pal.text, pal.border, styles.noResults]}>
No result
{isFetching ? (
<Trans>Loading...</Trans>
) : (
<Trans>No result</Trans>
)}
</Text>
)}
</View>