From d3a72c51a23be42ed804479b238702e81dd1eea1 Mon Sep 17 00:00:00 2001 From: BOHA Date: Mon, 23 Mar 2026 10:58:56 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20table=20sort=20toggle=20=E2=80=94=20use?= =?UTF-8?q?=20single=20state=20object=20to=20prevent=20lost=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two separate useState calls (sort + order) caused React to skip re-renders when clicking the same column — setSort returned the same value so React bailed out, and the nested setOrder was lost. Single state object guarantees a new reference on every click, so React always re-renders and useListData always refetches. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/admin/hooks/useTableSort.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/admin/hooks/useTableSort.ts b/src/admin/hooks/useTableSort.ts index 9dbbac3..b3ee6b5 100644 --- a/src/admin/hooks/useTableSort.ts +++ b/src/admin/hooks/useTableSort.ts @@ -1,23 +1,25 @@ import { useState, useCallback, useRef } from 'react' +interface SortState { + sort: string + order: 'asc' | 'desc' +} + export default function useTableSort(defaultSort = 'id', defaultOrder: 'asc' | 'desc' = 'desc') { - const [sort, setSort] = useState(defaultSort) - const [order, setOrder] = useState<'asc' | 'desc'>(defaultOrder) + const [state, setState] = useState({ sort: defaultSort, order: defaultOrder }) const userClicked = useRef(false) const handleSort = useCallback((column: string) => { userClicked.current = true - setSort(prev => { - if (prev === column) { - setOrder(o => (o === 'asc' ? 'desc' : 'asc')) - return prev + setState(prev => { + if (prev.sort === column) { + return { sort: column, order: prev.order === 'asc' ? 'desc' : 'asc' } } - setOrder('desc') - return column + return { sort: column, order: 'desc' } }) }, []) - const activeSort = userClicked.current ? sort : null + const activeSort = userClicked.current ? state.sort : null - return { sort, order, handleSort, activeSort } + return { sort: state.sort, order: state.order, handleSort, activeSort } }