diff --git a/apps/desktop/layer/renderer/src/modules/entry-column/index.tsx b/apps/desktop/layer/renderer/src/modules/entry-column/index.tsx index e3e386021..33f9dc1f0 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-column/index.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-column/index.tsx @@ -35,7 +35,10 @@ import { useNavigateFirstEntry } from "./hooks/useNavigateFirstEntry" import { EntryListHeader } from "./layouts/EntryListHeader" import { EntryEmptyList, EntryList } from "./list" import { shouldScrollTimelineToTopOnRefreshStateChange } from "./refresh-reset" -import { shouldSuspendMarkReadForScrollReset } from "./scroll-reset" +import { + shouldResetScrollOnTimelineIdentityChange, + shouldSuspendMarkReadForScrollReset, +} from "./scroll-reset" import { EntryRootStateContext } from "./store/EntryColumnContext" function EntryColumnContent() { @@ -126,9 +129,22 @@ function EntryColumnContent() { timelineIdentity, ) + const previousTimelineIdentityRef = useRef(undefined) useLayoutEffect(() => { + const previousTimelineIdentity = previousTimelineIdentityRef.current + previousTimelineIdentityRef.current = timelineIdentity + resetScrollInteractionState() - }, [resetScrollInteractionState, timelineIdentity]) + if ( + shouldResetScrollOnTimelineIdentityChange({ + enabled: view === FeedViewType.SocialMedia, + previousTimelineIdentity, + timelineIdentity, + }) + ) { + scrollTimelineToTop() + } + }, [resetScrollInteractionState, scrollTimelineToTop, timelineIdentity, view]) const wasRefreshingRef = useRef(isRefreshing) useEffect(() => { diff --git a/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.test.ts b/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.test.ts index 20161efe1..017a34bfb 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.test.ts +++ b/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.test.ts @@ -3,6 +3,7 @@ import { describe, expect, test } from "vitest" import { getInitialScrollOffset, shouldApplyScrollResetSignal, + shouldResetScrollOnTimelineIdentityChange, shouldSuspendMarkReadForScrollReset, } from "./scroll-reset" @@ -56,4 +57,38 @@ describe("shouldApplyScrollResetSignal", () => { }), ).toBe(false) }) + + test("resets scroll for enabled timeline identity changes after initial mount", () => { + expect( + shouldResetScrollOnTimelineIdentityChange({ + enabled: true, + previousTimelineIdentity: undefined, + timelineIdentity: "6:", + }), + ).toBe(false) + + expect( + shouldResetScrollOnTimelineIdentityChange({ + enabled: true, + previousTimelineIdentity: "0:", + timelineIdentity: "6:", + }), + ).toBe(true) + + expect( + shouldResetScrollOnTimelineIdentityChange({ + enabled: false, + previousTimelineIdentity: "0:", + timelineIdentity: "6:", + }), + ).toBe(false) + + expect( + shouldResetScrollOnTimelineIdentityChange({ + enabled: true, + previousTimelineIdentity: "6:", + timelineIdentity: "6:", + }), + ).toBe(false) + }) }) diff --git a/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.ts b/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.ts index a75d9ae1a..28f9f333e 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.ts +++ b/apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.ts @@ -23,3 +23,14 @@ export const getInitialScrollOffset = ({ }) ? 0 : (cachedOffset ?? 0) + +export const shouldResetScrollOnTimelineIdentityChange = ({ + enabled, + previousTimelineIdentity, + timelineIdentity, +}: { + enabled: boolean + previousTimelineIdentity?: string + timelineIdentity: string +}) => + enabled && previousTimelineIdentity !== undefined && previousTimelineIdentity !== timelineIdentity