From 03b26fe5bdbaddb2d3b305bf7aaff761a1aba8f8 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Thu, 30 Apr 2026 10:22:18 -0400 Subject: [PATCH] Track selected program by id, not object reference When the programs list reloads (e.g. country switch), the previously selected Program object is no longer in the new array, so the detail panel shows stale data. Hold the id in state and derive the program from the current list via useMemo. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/rules/RulesOverview.tsx | 29 +++++++++++++++----------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/components/rules/RulesOverview.tsx b/src/components/rules/RulesOverview.tsx index 31aa651..6994664 100644 --- a/src/components/rules/RulesOverview.tsx +++ b/src/components/rules/RulesOverview.tsx @@ -404,7 +404,7 @@ function computeStatusCount(programList: Program[]) { export default function RulesOverview({ country = 'us' }: { country?: Country }) { const [viewMode, setViewMode] = useState('programs'); - const [selectedProgram, setSelectedProgram] = useState(null); + const [selectedProgramId, setSelectedProgramId] = useState(null); const [selectedState, setSelectedState] = useState(null); const [search, setSearch] = useState(''); const [yearFilter, setYearFilter] = useState(null); @@ -414,6 +414,11 @@ export default function RulesOverview({ country = 'us' }: { country?: Country }) fetchPrograms(country).then(setPrograms); }, [country]); + const selectedProgram = useMemo( + () => programs.find(program => program.id === selectedProgramId) ?? null, + [programs, selectedProgramId], + ); + const availableYears = useMemo(() => collectAllYears(programs), [programs]); const yearFilteredPrograms = useMemo(() => { @@ -504,7 +509,7 @@ export default function RulesOverview({ country = 'us' }: { country?: Country }) {(['programs', 'states'] as ViewMode[]).map(mode => (