Skip to content

Commit

Permalink
Throttle gif search by 500ms (#3622)
Browse files Browse the repository at this point in the history
* debounce gif search by 300ms

* Throttle it instead

---------

Co-authored-by: Dan Abramov <[email protected]>
  • Loading branch information
mozzius and gaearon authored Apr 19, 2024
1 parent 8b33ffd commit edbb18a
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
11 changes: 3 additions & 8 deletions src/components/dialogs/GifSelect.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import React, {
useCallback,
useDeferredValue,
useMemo,
useRef,
useState,
} from 'react'
import React, {useCallback, useMemo, useRef, useState} from 'react'
import {TextInput, View} from 'react-native'
import {Image} from 'expo-image'
import {msg, Trans} from '@lingui/macro'
Expand All @@ -22,6 +16,7 @@ import {Gif, useGifphySearch, useGiphyTrending} from '#/state/queries/giphy'
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
import * as Dialog from '#/components/Dialog'
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 {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2'
import {InlineLinkText} from '#/components/Link'
Expand Down Expand Up @@ -82,7 +77,7 @@ function GifList({
const {gtMobile} = useBreakpoints()
const ref = useRef<TextInput>(null)
const [undeferredSearch, setSearch] = useState('')
const search = useDeferredValue(undeferredSearch)
const search = useThrottledValue(undeferredSearch, 500)

const isSearching = search.length > 0

Expand Down
27 changes: 27 additions & 0 deletions src/components/hooks/useThrottledValue.ts
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit edbb18a

Please sign in to comment.