Skip to content

Commit 4e8cf33

Browse files
committed
fix(mobile): preserve social timeline scroll reset
1 parent 31c10ea commit 4e8cf33

3 files changed

Lines changed: 47 additions & 3 deletions

File tree

apps/mobile/src/modules/entry-list/EntryListContentSocial.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { View } from "react-native"
1111
import { useActionLanguage, useGeneralSettingKey } from "@/src/atoms/settings/general"
1212

1313
import { useEntries } from "../screen/atoms"
14+
import { getResetScrollSignalForContent } from "../screen/scroll-reset"
1415
import { TimelineSelectorList } from "../screen/TimelineSelectorList"
1516
import { EntryListEndScrollSpacer } from "./EntryListEndScrollSpacer"
1617
import { EntryListFooter } from "./EntryListFooter"
@@ -92,14 +93,21 @@ export const EntryListContentSocial = ({
9293
mode: translationMode,
9394
})
9495

96+
const contentResetScrollSignal = getResetScrollSignalForContent({
97+
entryCount: entryIds?.length ?? 0,
98+
hasScrollableSkeleton: true,
99+
isReady,
100+
resetScrollSignal,
101+
})
102+
95103
// Show loading skeleton when entries are not ready and no data yet
96104
if (!isReady && (!entryIds || entryIds.length === 0)) {
97105
return (
98106
<TimelineSelectorList
99107
onRefresh={() => {}}
100108
isRefetching={false}
101109
onResetScrollSignalConsumed={onResetScrollSignalConsumed}
102-
resetScrollSignal={resetScrollSignal}
110+
resetScrollSignal={contentResetScrollSignal}
103111
data={Array.from({ length: 5 }).map((_, index) => `skeleton-${index}`)}
104112
keyExtractor={(id) => id}
105113
renderItem={EntryItemSkeleton}
@@ -116,7 +124,7 @@ export const EntryListContentSocial = ({
116124
}}
117125
isRefetching={isRefetching}
118126
onResetScrollSignalConsumed={onResetScrollSignalConsumed}
119-
resetScrollSignal={resetScrollSignal}
127+
resetScrollSignal={contentResetScrollSignal}
120128
data={entryIds}
121129
extraData={extraData}
122130
keyExtractor={(id) => id}

apps/mobile/src/modules/screen/scroll-reset.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { describe, expect, test } from "vitest"
22

3-
import { shouldApplyScrollResetSignal, shouldSuspendMarkReadForScrollReset } from "./scroll-reset"
3+
import {
4+
getResetScrollSignalForContent,
5+
shouldApplyScrollResetSignal,
6+
shouldSuspendMarkReadForScrollReset,
7+
} from "./scroll-reset"
48

59
describe("shouldApplyScrollResetSignal", () => {
610
test("applies a new reset signal that has not been flushed yet", () => {
@@ -34,4 +38,24 @@ describe("shouldApplyScrollResetSignal", () => {
3438
}),
3539
).toBe(false)
3640
})
41+
42+
test("does not forward reset signal to scrollable loading skeletons", () => {
43+
expect(
44+
getResetScrollSignalForContent({
45+
entryCount: 0,
46+
hasScrollableSkeleton: true,
47+
isReady: false,
48+
resetScrollSignal: 1,
49+
}),
50+
).toBeUndefined()
51+
52+
expect(
53+
getResetScrollSignalForContent({
54+
entryCount: 1,
55+
hasScrollableSkeleton: true,
56+
isReady: true,
57+
resetScrollSignal: 1,
58+
}),
59+
).toBe(1)
60+
})
3761
})

apps/mobile/src/modules/screen/scroll-reset.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,15 @@ export const shouldApplyScrollResetSignal = ({
99
}: ScrollResetSignalState) => resetSignal !== undefined && resetSignal !== appliedResetSignal
1010

1111
export const shouldSuspendMarkReadForScrollReset = shouldApplyScrollResetSignal
12+
13+
export const getResetScrollSignalForContent = ({
14+
entryCount,
15+
hasScrollableSkeleton,
16+
isReady,
17+
resetScrollSignal,
18+
}: {
19+
entryCount: number
20+
hasScrollableSkeleton: boolean
21+
isReady: boolean
22+
resetScrollSignal?: number
23+
}) => (!isReady && entryCount === 0 && hasScrollableSkeleton ? undefined : resetScrollSignal)

0 commit comments

Comments
 (0)