From 83a3a273093c694650609129c08049ee8e1f84dd Mon Sep 17 00:00:00 2001 From: RenzoMXD <170978465+RenzoMXD@users.noreply.github.com> Date: Tue, 19 May 2026 20:20:19 +0200 Subject: [PATCH] fix(repositories): keep deep-linked ?page=N when search hasn't changed The repositories leaderboard table routes `DebouncedSearchInput`'s `onDebouncedChange` through `useDataTableParams.setFilter('search', ...)`, whose `useCallback` closes over `react-router-dom`'s `setSearchParams`. That ref is recreated on every URL change, so every `setPage(N)` recreates the callback, which re-fires the wrapper's mount-anchored debounce effect. The fired commit deletes `?page` via the filter's default `resetPageOnChange`, snapping the table back to page 1 right after the click. Same root cause #1108 fixed for `MinerPRsTable`. Apply the same callsite gate: keep the latest committed `searchQuery` in a ref and skip `setFilter('search', ...)` when the wrapper hands back the value we already hold. Typing a new search still commits normally and resets `?page` as intended; the mount fire and any re-render driven by an unrelated URL change no longer touches the page slot. Verified locally: - Direct load `/repositories?page=1` retains `?page=1` and renders rows 13-15 of 15. - "Go to next page" / "Go to last page" advance to `?page=1` and stay. - Typing into the search input still commits the filter after the debounce and resets `?page` so the result list starts at page 1. - `npm run build`, `npm run lint`, `npx prettier --check` all clean. --- .../leaderboard/TopRepositoriesTable.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/leaderboard/TopRepositoriesTable.tsx b/src/components/leaderboard/TopRepositoriesTable.tsx index e19410f9..573dacee 100644 --- a/src/components/leaderboard/TopRepositoriesTable.tsx +++ b/src/components/leaderboard/TopRepositoriesTable.tsx @@ -1,4 +1,10 @@ -import React, { useState, useMemo, useCallback } from 'react'; +import React, { + useState, + useMemo, + useCallback, + useRef, + useEffect, +} from 'react'; import { Box, Card, @@ -256,8 +262,17 @@ const TopRepositoriesTable: React.FC = ({ const [showChart, setShowChart] = useState(false); const [useLogScale, setUseLogScale] = useState(true); + const searchQueryRef = useRef(searchQuery); + useEffect(() => { + searchQueryRef.current = searchQuery; + }); + const handleSearchChange = useCallback( - (value: string) => setFilter('search', value), + (value: string) => { + if (value === searchQueryRef.current) return; + searchQueryRef.current = value; + setFilter('search', value); + }, [setFilter], );