diff --git a/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowPagePagination.ts b/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowPagePagination.ts index d20436f744..77f9c8e8c0 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowPagePagination.ts +++ b/packages/twenty-front/src/modules/object-record/record-show/hooks/useRecordShowPagePagination.ts @@ -201,8 +201,6 @@ export const useRecordShowPagePagination = ( }; const navigateToIndexView = () => { - setLastShowPageRecordId(objectRecordId); - navigate( AppPath.RecordIndexPage, { @@ -212,6 +210,8 @@ export const useRecordShowPagePagination = ( viewId: viewIdQueryParam, }, ); + + setLastShowPageRecordId(objectRecordId); }; const rankInView = recordIdsInCache.findIndex((id) => id === objectRecordId); diff --git a/packages/twenty-front/src/modules/object-record/record-table/virtualization/components/RecordTableNoRecordGroupScrollToPreviousRecordEffect.tsx b/packages/twenty-front/src/modules/object-record/record-table/virtualization/components/RecordTableNoRecordGroupScrollToPreviousRecordEffect.tsx index f1d919a99c..d118dc59e3 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/virtualization/components/RecordTableNoRecordGroupScrollToPreviousRecordEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/virtualization/components/RecordTableNoRecordGroupScrollToPreviousRecordEffect.tsx @@ -7,21 +7,19 @@ import { useTriggerFetchPages } from '@/object-record/record-table/virtualizatio import { useTriggerInitialRecordTableDataLoad } from '@/object-record/record-table/virtualization/hooks/useTriggerInitialRecordTableDataLoad'; import { useScrollWrapperHTMLElement } from '@/ui/utilities/scroll/hooks/useScrollWrapperHTMLElement'; import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue'; -import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState'; import { isNonEmptyString } from '@sniptt/guards'; +import { useStore } from 'jotai'; import { useEffect, useState } from 'react'; export const RecordTableNoRecordGroupScrollToPreviousRecordEffect = () => { + const store = useStore(); + const { getScrollWrapperElement } = useScrollWrapperHTMLElement(); const allRecordIds = useAtomComponentSelectorValue( recordIndexAllRecordIdsComponentSelector, ); - const [lastShowPageRecordId, setLastShowPageRecordId] = useAtomState( - lastShowPageRecordIdState, - ); - const [hasInitializedScroll, setHasInitializedScroll] = useState(false); const { scrollTableToPosition } = useScrollTableToPosition(); @@ -34,8 +32,16 @@ export const RecordTableNoRecordGroupScrollToPreviousRecordEffect = () => { const { triggerFetchPagesWithoutDebounce } = useTriggerFetchPages(); useEffect(() => { + // Read directly from the Jotai store to avoid stale values from useAtom's + // internal useReducer, which can desync under high-frequency store updates. + const lastShowPageRecordId = store.get(lastShowPageRecordIdState.atom); + + if (!isNonEmptyString(lastShowPageRecordId)) { + return; + } + const run = async () => { - setLastShowPageRecordId(null); + store.set(lastShowPageRecordIdState.atom, null); const recordPosition = allRecordIds.findIndex( (recordId) => recordId === lastShowPageRecordId, @@ -76,15 +82,12 @@ export const RecordTableNoRecordGroupScrollToPreviousRecordEffect = () => { await triggerFetchPagesWithoutDebounce(); }; - if (isNonEmptyString(lastShowPageRecordId)) { - run(); - } + run(); }, [ + store, hasInitializedScroll, - lastShowPageRecordId, scrollTableToPosition, allRecordIds, - setLastShowPageRecordId, triggerInitialRecordTableDataLoad, processTreadmillScrollTop, getScrollWrapperElement,