From 99e41aab78e95a825e00eab48187a14e9ddd767b Mon Sep 17 00:00:00 2001 From: jerick Date: Tue, 21 Apr 2026 21:20:22 -0400 Subject: [PATCH] Fix pagination resetting to page 1 on navigation push() depended on searchParams, causing the search debounce effect to re-fire on every page change and delete the page param. Store searchParams in a ref so push() is stable and only the search value triggers it. Co-Authored-By: Claude Sonnet 4.6 --- src/components/transactions/TransactionFilters.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/transactions/TransactionFilters.tsx b/src/components/transactions/TransactionFilters.tsx index ff5853b..3395468 100644 --- a/src/components/transactions/TransactionFilters.tsx +++ b/src/components/transactions/TransactionFilters.tsx @@ -1,6 +1,6 @@ 'use client' -import { useCallback, useEffect, useState } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { useRouter, useSearchParams, usePathname } from 'next/navigation' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' @@ -20,17 +20,19 @@ export function TransactionFilters({ accounts }: { accounts: AccountOption[] }) const sp = (key: string) => searchParams.get(key) ?? '' const [search, setSearch] = useState(sp('search')) + const searchParamsRef = useRef(searchParams) + useEffect(() => { searchParamsRef.current = searchParams }, [searchParams]) const push = useCallback( (updates: Record) => { - const params = new URLSearchParams(searchParams.toString()) + const params = new URLSearchParams(searchParamsRef.current.toString()) for (const [k, v] of Object.entries(updates)) { if (v) params.set(k, v); else params.delete(k) } params.delete('page') router.replace(`${pathname}?${params.toString()}`) }, - [searchParams, pathname, router], + [pathname, router], ) // Debounce search → URL