diff --git a/apps/web/src/components/filters/FilterBar.tsx b/apps/web/src/components/filters/FilterBar.tsx index ccb541c..901ece6 100644 --- a/apps/web/src/components/filters/FilterBar.tsx +++ b/apps/web/src/components/filters/FilterBar.tsx @@ -28,6 +28,7 @@ export function FilterBar({ const [searchValue, setSearchValue] = useState(initialFilters.search ?? ""); const [showStatusDropdown, setShowStatusDropdown] = useState(false); const [showPriorityDropdown, setShowPriorityDropdown] = useState(false); + const isFirstRender = useRef(true); // Stable ref for onFilterChange to avoid re-triggering the debounce effect const onFilterChangeRef = useRef(onFilterChange); @@ -37,6 +38,12 @@ export function FilterBar({ // Debounced search useEffect(() => { + // Skip callback on first render to avoid calling with initial empty value + if (isFirstRender.current) { + isFirstRender.current = false; + return; + } + const timer = setTimeout(() => { setFilters((prevFilters) => { if (searchValue !== prevFilters.search) { diff --git a/apps/web/src/components/tasks/TaskList.test.tsx b/apps/web/src/components/tasks/TaskList.test.tsx index 057c714..7319a81 100644 --- a/apps/web/src/components/tasks/TaskList.test.tsx +++ b/apps/web/src/components/tasks/TaskList.test.tsx @@ -140,7 +140,7 @@ describe("TaskList", (): void => { render(); expect(screen.getByRole("main")).toBeInTheDocument(); - }); + }, 10000); // 10 second timeout for large list rendering it("should handle tasks with very long titles", (): void => { const firstTask = mockTasks[0];