Skip to content

Commit 73870a8

Browse files
committed
fix(desktop): reset social timeline on view change
1 parent 4e8cf33 commit 73870a8

3 files changed

Lines changed: 64 additions & 2 deletions

File tree

apps/desktop/layer/renderer/src/modules/entry-column/index.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ import { useNavigateFirstEntry } from "./hooks/useNavigateFirstEntry"
3535
import { EntryListHeader } from "./layouts/EntryListHeader"
3636
import { EntryEmptyList, EntryList } from "./list"
3737
import { shouldScrollTimelineToTopOnRefreshStateChange } from "./refresh-reset"
38-
import { shouldSuspendMarkReadForScrollReset } from "./scroll-reset"
38+
import {
39+
shouldResetScrollOnTimelineIdentityChange,
40+
shouldSuspendMarkReadForScrollReset,
41+
} from "./scroll-reset"
3942
import { EntryRootStateContext } from "./store/EntryColumnContext"
4043

4144
function EntryColumnContent() {
@@ -126,9 +129,22 @@ function EntryColumnContent() {
126129
timelineIdentity,
127130
)
128131

132+
const previousTimelineIdentityRef = useRef<string>(undefined)
129133
useLayoutEffect(() => {
134+
const previousTimelineIdentity = previousTimelineIdentityRef.current
135+
previousTimelineIdentityRef.current = timelineIdentity
136+
130137
resetScrollInteractionState()
131-
}, [resetScrollInteractionState, timelineIdentity])
138+
if (
139+
shouldResetScrollOnTimelineIdentityChange({
140+
enabled: view === FeedViewType.SocialMedia,
141+
previousTimelineIdentity,
142+
timelineIdentity,
143+
})
144+
) {
145+
scrollTimelineToTop()
146+
}
147+
}, [resetScrollInteractionState, scrollTimelineToTop, timelineIdentity, view])
132148

133149
const wasRefreshingRef = useRef(isRefreshing)
134150
useEffect(() => {

apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { describe, expect, test } from "vitest"
33
import {
44
getInitialScrollOffset,
55
shouldApplyScrollResetSignal,
6+
shouldResetScrollOnTimelineIdentityChange,
67
shouldSuspendMarkReadForScrollReset,
78
} from "./scroll-reset"
89

@@ -56,4 +57,38 @@ describe("shouldApplyScrollResetSignal", () => {
5657
}),
5758
).toBe(false)
5859
})
60+
61+
test("resets scroll for enabled timeline identity changes after initial mount", () => {
62+
expect(
63+
shouldResetScrollOnTimelineIdentityChange({
64+
enabled: true,
65+
previousTimelineIdentity: undefined,
66+
timelineIdentity: "6:",
67+
}),
68+
).toBe(false)
69+
70+
expect(
71+
shouldResetScrollOnTimelineIdentityChange({
72+
enabled: true,
73+
previousTimelineIdentity: "0:",
74+
timelineIdentity: "6:",
75+
}),
76+
).toBe(true)
77+
78+
expect(
79+
shouldResetScrollOnTimelineIdentityChange({
80+
enabled: false,
81+
previousTimelineIdentity: "0:",
82+
timelineIdentity: "6:",
83+
}),
84+
).toBe(false)
85+
86+
expect(
87+
shouldResetScrollOnTimelineIdentityChange({
88+
enabled: true,
89+
previousTimelineIdentity: "6:",
90+
timelineIdentity: "6:",
91+
}),
92+
).toBe(false)
93+
})
5994
})

apps/desktop/layer/renderer/src/modules/entry-column/scroll-reset.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,14 @@ export const getInitialScrollOffset = ({
2323
})
2424
? 0
2525
: (cachedOffset ?? 0)
26+
27+
export const shouldResetScrollOnTimelineIdentityChange = ({
28+
enabled,
29+
previousTimelineIdentity,
30+
timelineIdentity,
31+
}: {
32+
enabled: boolean
33+
previousTimelineIdentity?: string
34+
timelineIdentity: string
35+
}) =>
36+
enabled && previousTimelineIdentity !== undefined && previousTimelineIdentity !== timelineIdentity

0 commit comments

Comments
 (0)