Throttle gif search by 500ms (#3622)
* debounce gif search by 300ms * Throttle it instead --------- Co-authored-by: Dan Abramov <dan.abramov@gmail.com>zio/stable
parent
8b33ffdfb5
commit
edbb18afa4
|
@ -1,10 +1,4 @@
|
||||||
import React, {
|
import React, {useCallback, useMemo, useRef, useState} from 'react'
|
||||||
useCallback,
|
|
||||||
useDeferredValue,
|
|
||||||
useMemo,
|
|
||||||
useRef,
|
|
||||||
useState,
|
|
||||||
} from 'react'
|
|
||||||
import {TextInput, View} from 'react-native'
|
import {TextInput, View} from 'react-native'
|
||||||
import {Image} from 'expo-image'
|
import {Image} from 'expo-image'
|
||||||
import {msg, Trans} from '@lingui/macro'
|
import {msg, Trans} from '@lingui/macro'
|
||||||
|
@ -22,6 +16,7 @@ import {Gif, useGifphySearch, useGiphyTrending} from '#/state/queries/giphy'
|
||||||
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
||||||
import * as Dialog from '#/components/Dialog'
|
import * as Dialog from '#/components/Dialog'
|
||||||
import * as TextField from '#/components/forms/TextField'
|
import * as TextField from '#/components/forms/TextField'
|
||||||
|
import {useThrottledValue} from '#/components/hooks/useThrottledValue'
|
||||||
import {ArrowLeft_Stroke2_Corner0_Rounded as Arrow} from '#/components/icons/Arrow'
|
import {ArrowLeft_Stroke2_Corner0_Rounded as Arrow} from '#/components/icons/Arrow'
|
||||||
import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2'
|
import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2'
|
||||||
import {InlineLinkText} from '#/components/Link'
|
import {InlineLinkText} from '#/components/Link'
|
||||||
|
@ -82,7 +77,7 @@ function GifList({
|
||||||
const {gtMobile} = useBreakpoints()
|
const {gtMobile} = useBreakpoints()
|
||||||
const ref = useRef<TextInput>(null)
|
const ref = useRef<TextInput>(null)
|
||||||
const [undeferredSearch, setSearch] = useState('')
|
const [undeferredSearch, setSearch] = useState('')
|
||||||
const search = useDeferredValue(undeferredSearch)
|
const search = useThrottledValue(undeferredSearch, 500)
|
||||||
|
|
||||||
const isSearching = search.length > 0
|
const isSearching = search.length > 0
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
import {useEffect, useRef, useState} from 'react'
|
||||||
|
|
||||||
|
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
|
||||||
|
|
||||||
|
export function useThrottledValue<T>(value: T, time?: number) {
|
||||||
|
const pendingValueRef = useRef(value)
|
||||||
|
const [throttledValue, setThrottledValue] = useState(value)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
pendingValueRef.current = value
|
||||||
|
}, [value])
|
||||||
|
|
||||||
|
const handleTick = useNonReactiveCallback(() => {
|
||||||
|
if (pendingValueRef.current !== throttledValue) {
|
||||||
|
setThrottledValue(pendingValueRef.current)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const id = setInterval(handleTick, time)
|
||||||
|
return () => {
|
||||||
|
clearInterval(id)
|
||||||
|
}
|
||||||
|
}, [handleTick, time])
|
||||||
|
|
||||||
|
return throttledValue
|
||||||
|
}
|
Loading…
Reference in New Issue