Skip to content

Commit a94f564

Browse files
committed
fix(app): scroll issues
1 parent 6ef3af7 commit a94f564

1 file changed

Lines changed: 24 additions & 6 deletions

File tree

packages/app/src/pages/session/review-tab.tsx

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
4949
let scroll: HTMLDivElement | undefined
5050
let restoreFrame: number | undefined
5151
let userInteracted = false
52+
let restored: { x: number; y: number } | undefined
5253

5354
const sdk = useSDK()
5455
const layout = useLayout()
@@ -65,6 +66,11 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
6566

6667
const handleInteraction = () => {
6768
userInteracted = true
69+
70+
if (restoreFrame !== undefined) {
71+
cancelAnimationFrame(restoreFrame)
72+
restoreFrame = undefined
73+
}
6874
}
6975

7076
const doRestore = () => {
@@ -82,8 +88,11 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
8288
const targetY = Math.min(s.y, maxY)
8389
const targetX = Math.min(s.x, maxX)
8490

91+
if (el.scrollTop === targetY && el.scrollLeft === targetX) return
92+
8593
if (el.scrollTop !== targetY) el.scrollTop = targetY
8694
if (el.scrollLeft !== targetX) el.scrollLeft = targetX
95+
restored = { x: el.scrollLeft, y: el.scrollTop }
8796
}
8897

8998
const queueRestore = () => {
@@ -92,9 +101,16 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
92101
}
93102

94103
const handleScroll = (event: Event & { currentTarget: HTMLDivElement }) => {
95-
if (!layout.ready() || !userInteracted) return
96-
97104
const el = event.currentTarget
105+
const prev = restored
106+
if (prev && el.scrollTop === prev.y && el.scrollLeft === prev.x) {
107+
restored = undefined
108+
return
109+
}
110+
111+
restored = undefined
112+
handleInteraction()
113+
if (!layout.ready()) return
98114
if (el.clientHeight === 0 || el.clientWidth === 0) return
99115

100116
props.view().setScroll("review", {
@@ -133,10 +149,11 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
133149
onCleanup(() => {
134150
if (restoreFrame !== undefined) cancelAnimationFrame(restoreFrame)
135151
if (scroll) {
136-
scroll.removeEventListener("wheel", handleInteraction)
137-
scroll.removeEventListener("pointerdown", handleInteraction)
138-
scroll.removeEventListener("touchstart", handleInteraction)
139-
scroll.removeEventListener("keydown", handleInteraction)
152+
scroll.removeEventListener("wheel", handleInteraction, { capture: true })
153+
scroll.removeEventListener("mousewheel", handleInteraction, { capture: true })
154+
scroll.removeEventListener("pointerdown", handleInteraction, { capture: true })
155+
scroll.removeEventListener("touchstart", handleInteraction, { capture: true })
156+
scroll.removeEventListener("keydown", handleInteraction, { capture: true })
140157
}
141158
})
142159

@@ -147,6 +164,7 @@ export function SessionReviewTab(props: SessionReviewTabProps) {
147164
scrollRef={(el) => {
148165
scroll = el
149166
el.addEventListener("wheel", handleInteraction, { passive: true, capture: true })
167+
el.addEventListener("mousewheel", handleInteraction, { passive: true, capture: true })
150168
el.addEventListener("pointerdown", handleInteraction, { passive: true, capture: true })
151169
el.addEventListener("touchstart", handleInteraction, { passive: true, capture: true })
152170
el.addEventListener("keydown", handleInteraction, { passive: true, capture: true })

0 commit comments

Comments
 (0)