From 60aa9c035a88e2a7bf947e4cc31f6f39956df215 Mon Sep 17 00:00:00 2001 From: Amirhossein Khalili Date: Wed, 29 Apr 2026 13:31:37 +0330 Subject: [PATCH] feat(filters): debounce search input updates --- src/components/FilterBar.tsx | 79 ++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 30 deletions(-) diff --git a/src/components/FilterBar.tsx b/src/components/FilterBar.tsx index 5441f7b..2e218ea 100644 --- a/src/components/FilterBar.tsx +++ b/src/components/FilterBar.tsx @@ -1,5 +1,6 @@ -import { Search, ArrowUpDown } from 'lucide-react'; -import { Select } from './ui/Select'; +import { useEffect, useState } from 'react'; +import { Search, ArrowUpDown } from 'lucide-react'; +import { Select } from './ui/Select'; interface FilterBarProps { searchQuery: string; @@ -10,37 +11,55 @@ interface FilterBarProps { searchPlaceholder: string; } -export default function FilterBar({ - searchQuery, - setSearchQuery, - ordering, - setOrdering, - orderingOptions, - searchPlaceholder -}: FilterBarProps) { - return ( +export default function FilterBar({ + searchQuery, + setSearchQuery, + ordering, + setOrdering, + orderingOptions, + searchPlaceholder +}: FilterBarProps) { + const [inputValue, setInputValue] = useState(searchQuery); + + useEffect(() => { + if (inputValue === searchQuery) return; + + const timeout = setTimeout(() => { + setSearchQuery(inputValue); + }, 1000); + + return () => clearTimeout(timeout); + }, [inputValue, searchQuery, setSearchQuery]); + + useEffect(() => { + setInputValue(searchQuery); + }, [searchQuery]); + + return (
+ setSearchQuery(e.target.value)} - placeholder={searchPlaceholder || "Search..."} - className="w-full pl-10 pr-4 rtl:pl-4 rtl:pr-10 py-2.5 rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-white outline-none focus:ring-2 focus:ring-blue-500 transition-shadow" - /> -
- -
- - +
); -} +} \ No newline at end of file