fix(desktop): reset social timeline on view change
This commit is contained in:
parent
4e8cf33941
commit
73870a8170
|
|
@ -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(() => {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue