diff --git a/web/components/filters/search.tsx b/web/components/filters/search.tsx index 87e5af90..1338656f 100644 --- a/web/components/filters/search.tsx +++ b/web/components/filters/search.tsx @@ -2,6 +2,7 @@ import {QuestionMarkCircleIcon} from '@heroicons/react/24/outline' import {DisplayUser} from 'common/api/user-types' import {FilterFields} from 'common/filters' import {Profile} from 'common/profiles/profile' +import {debounce as debounceFn} from 'lodash' import {forwardRef, ReactElement, useEffect, useRef, useState} from 'react' import toast from 'react-hot-toast' import {IoFilterSharp} from 'react-icons/io5' @@ -180,6 +181,22 @@ export const Search = forwardRef< const isClearedFilters = useIsClearedFilters(filters) const choices = useChoicesContext() + const [keywordInput, setKeywordInput] = useState(filters.name ?? '') + + const debouncedUpdateFilter = useRef( + debounceFn((value: string) => { + updateFilter({name: value || undefined}) + }, 500), + ).current + + useEffect(() => { + debouncedUpdateFilter(keywordInput) + }, [keywordInput, debouncedUpdateFilter]) + + useEffect(() => { + setKeywordInput(filters.name ?? '') + }, [filters.name]) + useEffect(() => { if (isHolding) return @@ -214,11 +231,11 @@ export const Search = forwardRef< ) => { - updateFilter({name: e.target.value || undefined}) + setKeywordInput(e.target.value) }} />