diff --git a/components/layout/TalksFilterBar.tsx b/components/layout/TalksFilterBar.tsx index c05acb1f..467f096b 100644 --- a/components/layout/TalksFilterBar.tsx +++ b/components/layout/TalksFilterBar.tsx @@ -1,7 +1,7 @@ "use client"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; -import { useCallback, useEffect, useState, useTransition } from "react"; +import { useCallback, useEffect, useState, useTransition, useRef } from "react"; import { motion } from "framer-motion"; interface TalksFilterBarProps { @@ -22,6 +22,8 @@ export default function TalksFilterBar({ tracks, year: _year }: TalksFilterBarPr const [selectedTrack, setSelectedTrack] = useState(searchParams.get("track") || ""); const [searchQuery, setSearchQuery] = useState(searchParams.get("q") || ""); + const timeoutRef = useRef | null>(null); + // Update state when URL changes useEffect(() => { setSelectedTrack(searchParams.get("track") || ""); @@ -60,11 +62,15 @@ export default function TalksFilterBar({ tracks, year: _year }: TalksFilterBarPr const handleSearchChange = (e: React.ChangeEvent) => { const newQuery = e.target.value; setSearchQuery(newQuery); + + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + // Debounce the URL update for search - const timeoutId = setTimeout(() => { + timeoutRef.current = setTimeout(() => { updateFilters(selectedTrack, newQuery); }, 300); - return () => clearTimeout(timeoutId); }; return (