Skip to content

Commit 5b6c30b

Browse files
committed
Debounce search filter updates to improve input handling and performance
1 parent 8da9bd8 commit 5b6c30b

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

web/components/filters/search.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {QuestionMarkCircleIcon} from '@heroicons/react/24/outline'
22
import {DisplayUser} from 'common/api/user-types'
33
import {FilterFields} from 'common/filters'
44
import {Profile} from 'common/profiles/profile'
5+
import {debounce as debounceFn} from 'lodash'
56
import {forwardRef, ReactElement, useEffect, useRef, useState} from 'react'
67
import toast from 'react-hot-toast'
78
import {IoFilterSharp} from 'react-icons/io5'
@@ -180,6 +181,22 @@ export const Search = forwardRef<
180181
const isClearedFilters = useIsClearedFilters(filters)
181182
const choices = useChoicesContext()
182183

184+
const [keywordInput, setKeywordInput] = useState(filters.name ?? '')
185+
186+
const debouncedUpdateFilter = useRef(
187+
debounceFn((value: string) => {
188+
updateFilter({name: value || undefined})
189+
}, 500),
190+
).current
191+
192+
useEffect(() => {
193+
debouncedUpdateFilter(keywordInput)
194+
}, [keywordInput, debouncedUpdateFilter])
195+
196+
useEffect(() => {
197+
setKeywordInput(filters.name ?? '')
198+
}, [filters.name])
199+
183200
useEffect(() => {
184201
if (isHolding) return
185202

@@ -214,11 +231,11 @@ export const Search = forwardRef<
214231
<Row className={'mb-2 justify-between gap-2'}>
215232
<Input
216233
ref={ref}
217-
value={filters.name ?? ''}
234+
value={keywordInput}
218235
placeholder={placeholder}
219236
className={'w-full max-w-xs'}
220237
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
221-
updateFilter({name: e.target.value || undefined})
238+
setKeywordInput(e.target.value)
222239
}}
223240
/>
224241

0 commit comments

Comments
 (0)