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