fix(desktop): reset social timeline on view change

This commit is contained in:
DIYgod 2026-06-05 11:42:37 +08:00
parent 4e8cf33941
commit 73870a8170
3 changed files with 64 additions and 2 deletions

View File

@ -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<string>(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(() => {

View File

@ -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)
})
})

View File

@ -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