From 12c7b2d895a1b25234b4ebf089044143b23b1576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Apr 2026 15:29:36 +0200 Subject: [PATCH 1/5] Finally --- .../src/web/handlers/PinchGestureHandler.ts | 6 ++++-- .../src/web/handlers/RotationGestureHandler.ts | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts index 9c9bf1f2c0..dd499b2edd 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts @@ -70,9 +70,11 @@ export default class PinchGestureHandler extends GestureHandler { } protected override transformNativeEvent() { + const rect = this.delegate.measureView(); + return { - focalX: this.scaleGestureDetector.focusX, - focalY: this.scaleGestureDetector.focusY, + focalX: this.scaleGestureDetector.focusX - rect.pageX, + focalY: this.scaleGestureDetector.focusY - rect.pageY, velocity: this.velocity, scale: this.scale, }; diff --git a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts index 6dd8b4dd47..02b421bac4 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts @@ -66,10 +66,12 @@ export default class RotationGestureHandler extends GestureHandler { } protected override transformNativeEvent() { + const rect = this.delegate.measureView(); + return { rotation: this.rotation ? this.rotation : 0, - anchorX: this.getAnchorX(), - anchorY: this.getAnchorY(), + anchorX: this.getAnchorX() - rect.pageX, + anchorY: this.getAnchorY() - rect.pageY, velocity: this.velocity ? this.velocity : 0, }; } From 7e93e131ed8f6b233f6480008ca0d54b145f620c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Apr 2026 16:01:10 +0200 Subject: [PATCH 2/5] Review --- .../web/detectors/RotationGestureDetector.ts | 21 +++++++++++ .../src/web/detectors/ScaleGestureDetector.ts | 17 +++++++++ .../src/web/handlers/PinchGestureHandler.ts | 6 ++-- .../web/handlers/RotationGestureHandler.ts | 36 ++++++++++--------- 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts index 79ffd6936b..fbd3a1b0f1 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts @@ -23,6 +23,9 @@ export default class RotationGestureDetector private _anchorX = 0; private _anchorY = 0; + private _relativeAnchorX = 0; + private _relativeAnchorY = 0; + private isInProgress = false; private keyPointers: number[] = [NaN, NaN]; @@ -41,6 +44,9 @@ export default class RotationGestureDetector const firstPointerCoords = tracker.getLastAbsoluteCoords(firstPointerID); const secondPointerCoords = tracker.getLastAbsoluteCoords(secondPointerID); + const firstPointerRelative = tracker.getLastRelativeCoords(firstPointerID); + const secondPointerRelative = + tracker.getLastRelativeCoords(secondPointerID); if (!firstPointerCoords || !secondPointerCoords) { return; @@ -52,6 +58,13 @@ export default class RotationGestureDetector this._anchorX = (firstPointerCoords.x + secondPointerCoords.x) / 2; this._anchorY = (firstPointerCoords.y + secondPointerCoords.y) / 2; + if (firstPointerRelative && secondPointerRelative) { + this._relativeAnchorX = + (firstPointerRelative.x + secondPointerRelative.x) / 2; + this._relativeAnchorY = + (firstPointerRelative.y + secondPointerRelative.y) / 2; + } + // Angle diff should be positive when rotating in clockwise direction const angle: number = -Math.atan2(vectorY, vectorX); @@ -160,6 +173,14 @@ export default class RotationGestureDetector return this._anchorY; } + public get relativeAnchorX() { + return this._relativeAnchorX; + } + + public get relativeAnchorY() { + return this._relativeAnchorY; + } + public get rotation() { return this._rotation; } diff --git a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts index 9392c133f9..44d23728fe 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts @@ -17,6 +17,9 @@ export default class ScaleGestureDetector implements ScaleGestureListener { private _focusX!: number; private _focusY!: number; + private _relativeFocusX!: number; + private _relativeFocusY!: number; + private _currentSpan!: number; private prevSpan!: number; private initialSpan!: number; @@ -77,10 +80,14 @@ export default class ScaleGestureDetector implements ScaleGestureListener { const div: number = pointerUp ? numOfPointers - 1 : numOfPointers; const coordsSum = tracker.getAbsoluteCoordsSum(); + const relativeCoordsSum = tracker.getRelativeCoordsSum(); const focusX = coordsSum.x / div; const focusY = coordsSum.y / div; + const relativeFocusX = relativeCoordsSum.x / div; + const relativeFocusY = relativeCoordsSum.y / div; + // Determine average deviation from focal point let devSumX = 0; @@ -107,6 +114,8 @@ export default class ScaleGestureDetector implements ScaleGestureListener { const wasInProgress: boolean = this.inProgress; this._focusX = focusX; this._focusY = focusY; + this._relativeFocusX = relativeFocusX; + this._relativeFocusY = relativeFocusY; if (this.inProgress && (span < this.minSpan || configChanged)) { this.onScaleEnd(this); @@ -165,6 +174,14 @@ export default class ScaleGestureDetector implements ScaleGestureListener { return this._focusY; } + public get relativeFocusX() { + return this._relativeFocusX; + } + + public get relativeFocusY() { + return this._relativeFocusY; + } + public get timeDelta() { return this.currentTime - this.prevTime; } diff --git a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts index dd499b2edd..a99cfa11ca 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts @@ -70,11 +70,9 @@ export default class PinchGestureHandler extends GestureHandler { } protected override transformNativeEvent() { - const rect = this.delegate.measureView(); - return { - focalX: this.scaleGestureDetector.focusX - rect.pageX, - focalY: this.scaleGestureDetector.focusY - rect.pageY, + focalX: this.scaleGestureDetector.relativeFocusX, + focalY: this.scaleGestureDetector.relativeFocusY, velocity: this.velocity, scale: this.scale, }; diff --git a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts index 02b421bac4..687aba39e8 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts @@ -66,26 +66,24 @@ export default class RotationGestureHandler extends GestureHandler { } protected override transformNativeEvent() { - const rect = this.delegate.measureView(); - return { rotation: this.rotation ? this.rotation : 0, - anchorX: this.getAnchorX() - rect.pageX, - anchorY: this.getAnchorY() - rect.pageY, + anchorX: this.getAnchorX(), + anchorY: this.getAnchorY(), velocity: this.velocity ? this.velocity : 0, }; } public getAnchorX(): number { - const anchorX = this.rotationGestureDetector.anchorX; + const anchorX = this.rotationGestureDetector.relativeAnchorX; - return anchorX ? anchorX : this.cachedAnchorX; + return anchorX !== undefined ? anchorX : this.cachedAnchorX; } public getAnchorY(): number { - const anchorY = this.rotationGestureDetector.anchorY; + const anchorY = this.rotationGestureDetector.relativeAnchorY; - return anchorY ? anchorY : this.cachedAnchorY; + return anchorY !== undefined ? anchorY : this.cachedAnchorY; } protected override onPointerDown(event: AdaptedEvent): void { @@ -106,11 +104,14 @@ export default class RotationGestureHandler extends GestureHandler { return; } - if (this.getAnchorX()) { - this.cachedAnchorX = this.getAnchorX(); + const anchorX = this.getAnchorX(); + const anchorY = this.getAnchorY(); + + if (anchorX !== undefined) { + this.cachedAnchorX = anchorX; } - if (this.getAnchorY()) { - this.cachedAnchorY = this.getAnchorY(); + if (anchorY !== undefined) { + this.cachedAnchorY = anchorY; } this.tracker.track(event); @@ -125,11 +126,14 @@ export default class RotationGestureHandler extends GestureHandler { return; } - if (this.getAnchorX()) { - this.cachedAnchorX = this.getAnchorX(); + const anchorX = this.getAnchorX(); + const anchorY = this.getAnchorY(); + + if (anchorX !== undefined) { + this.cachedAnchorX = anchorX; } - if (this.getAnchorY()) { - this.cachedAnchorY = this.getAnchorY(); + if (anchorY !== undefined) { + this.cachedAnchorY = anchorY; } this.tracker.track(event); From 3426e1acd2d2fd22f120a2bc823fb98f5b7ec66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Apr 2026 16:29:43 +0200 Subject: [PATCH 3/5] Review v2 --- .../src/web/detectors/ScaleGestureDetector.ts | 4 ++-- .../src/web/handlers/RotationGestureHandler.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts index 44d23728fe..4cf37af816 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts @@ -79,8 +79,8 @@ export default class ScaleGestureDetector implements ScaleGestureListener { const div: number = pointerUp ? numOfPointers - 1 : numOfPointers; - const coordsSum = tracker.getAbsoluteCoordsSum(); - const relativeCoordsSum = tracker.getRelativeCoordsSum(); + const coordsSum = tracker.getAbsoluteCoordsSum(ignoredPointer); + const relativeCoordsSum = tracker.getRelativeCoordsSum(ignoredPointer); const focusX = coordsSum.x / div; const focusY = coordsSum.y / div; diff --git a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts index 687aba39e8..99514c3413 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts @@ -77,13 +77,13 @@ export default class RotationGestureHandler extends GestureHandler { public getAnchorX(): number { const anchorX = this.rotationGestureDetector.relativeAnchorX; - return anchorX !== undefined ? anchorX : this.cachedAnchorX; + return Number.isFinite(anchorX) ? anchorX : this.cachedAnchorX; } public getAnchorY(): number { const anchorY = this.rotationGestureDetector.relativeAnchorY; - return anchorY !== undefined ? anchorY : this.cachedAnchorY; + return Number.isFinite(anchorY) ? anchorY : this.cachedAnchorY; } protected override onPointerDown(event: AdaptedEvent): void { @@ -107,10 +107,10 @@ export default class RotationGestureHandler extends GestureHandler { const anchorX = this.getAnchorX(); const anchorY = this.getAnchorY(); - if (anchorX !== undefined) { + if (Number.isFinite(anchorX)) { this.cachedAnchorX = anchorX; } - if (anchorY !== undefined) { + if (Number.isFinite(anchorY)) { this.cachedAnchorY = anchorY; } @@ -129,10 +129,10 @@ export default class RotationGestureHandler extends GestureHandler { const anchorX = this.getAnchorX(); const anchorY = this.getAnchorY(); - if (anchorX !== undefined) { + if (Number.isFinite(anchorX)) { this.cachedAnchorX = anchorX; } - if (anchorY !== undefined) { + if (Number.isFinite(anchorY)) { this.cachedAnchorY = anchorY; } From 4b6e0773f4de41eff8fac560a59565ad80889cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Wed, 8 Apr 2026 12:16:18 +0200 Subject: [PATCH 4/5] Finally --- .../web/detectors/RotationGestureDetector.ts | 22 --------- .../src/web/detectors/ScaleGestureDetector.ts | 17 ------- .../src/web/handlers/PinchGestureHandler.ts | 9 +++- .../web/handlers/RotationGestureHandler.ts | 45 +++++++------------ .../src/web/tools/GestureHandlerDelegate.ts | 4 ++ .../web/tools/GestureHandlerWebDelegate.ts | 40 +++++++++++++++++ 6 files changed, 68 insertions(+), 69 deletions(-) diff --git a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts index fbd3a1b0f1..ac7af9be1c 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts @@ -23,9 +23,6 @@ export default class RotationGestureDetector private _anchorX = 0; private _anchorY = 0; - private _relativeAnchorX = 0; - private _relativeAnchorY = 0; - private isInProgress = false; private keyPointers: number[] = [NaN, NaN]; @@ -44,10 +41,6 @@ export default class RotationGestureDetector const firstPointerCoords = tracker.getLastAbsoluteCoords(firstPointerID); const secondPointerCoords = tracker.getLastAbsoluteCoords(secondPointerID); - const firstPointerRelative = tracker.getLastRelativeCoords(firstPointerID); - const secondPointerRelative = - tracker.getLastRelativeCoords(secondPointerID); - if (!firstPointerCoords || !secondPointerCoords) { return; } @@ -58,13 +51,6 @@ export default class RotationGestureDetector this._anchorX = (firstPointerCoords.x + secondPointerCoords.x) / 2; this._anchorY = (firstPointerCoords.y + secondPointerCoords.y) / 2; - if (firstPointerRelative && secondPointerRelative) { - this._relativeAnchorX = - (firstPointerRelative.x + secondPointerRelative.x) / 2; - this._relativeAnchorY = - (firstPointerRelative.y + secondPointerRelative.y) / 2; - } - // Angle diff should be positive when rotating in clockwise direction const angle: number = -Math.atan2(vectorY, vectorX); @@ -173,14 +159,6 @@ export default class RotationGestureDetector return this._anchorY; } - public get relativeAnchorX() { - return this._relativeAnchorX; - } - - public get relativeAnchorY() { - return this._relativeAnchorY; - } - public get rotation() { return this._rotation; } diff --git a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts index 4cf37af816..b214213ee6 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/ScaleGestureDetector.ts @@ -17,9 +17,6 @@ export default class ScaleGestureDetector implements ScaleGestureListener { private _focusX!: number; private _focusY!: number; - private _relativeFocusX!: number; - private _relativeFocusY!: number; - private _currentSpan!: number; private prevSpan!: number; private initialSpan!: number; @@ -80,14 +77,10 @@ export default class ScaleGestureDetector implements ScaleGestureListener { const div: number = pointerUp ? numOfPointers - 1 : numOfPointers; const coordsSum = tracker.getAbsoluteCoordsSum(ignoredPointer); - const relativeCoordsSum = tracker.getRelativeCoordsSum(ignoredPointer); const focusX = coordsSum.x / div; const focusY = coordsSum.y / div; - const relativeFocusX = relativeCoordsSum.x / div; - const relativeFocusY = relativeCoordsSum.y / div; - // Determine average deviation from focal point let devSumX = 0; @@ -114,8 +107,6 @@ export default class ScaleGestureDetector implements ScaleGestureListener { const wasInProgress: boolean = this.inProgress; this._focusX = focusX; this._focusY = focusY; - this._relativeFocusX = relativeFocusX; - this._relativeFocusY = relativeFocusY; if (this.inProgress && (span < this.minSpan || configChanged)) { this.onScaleEnd(this); @@ -174,14 +165,6 @@ export default class ScaleGestureDetector implements ScaleGestureListener { return this._focusY; } - public get relativeFocusX() { - return this._relativeFocusX; - } - - public get relativeFocusY() { - return this._relativeFocusY; - } - public get timeDelta() { return this.currentTime - this.prevTime; } diff --git a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts index a99cfa11ca..42462576d9 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/PinchGestureHandler.ts @@ -70,9 +70,14 @@ export default class PinchGestureHandler extends GestureHandler { } protected override transformNativeEvent() { + const focal = this.delegate.absoluteToLocal( + this.scaleGestureDetector.focusX, + this.scaleGestureDetector.focusY + ); + return { - focalX: this.scaleGestureDetector.relativeFocusX, - focalY: this.scaleGestureDetector.relativeFocusY, + focalX: focal.x, + focalY: focal.y, velocity: this.velocity, scale: this.scale, }; diff --git a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts index 99514c3413..3c589cf425 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/RotationGestureHandler.ts @@ -66,24 +66,25 @@ export default class RotationGestureHandler extends GestureHandler { } protected override transformNativeEvent() { + const anchor = this.getAnchor(); + return { rotation: this.rotation ? this.rotation : 0, - anchorX: this.getAnchorX(), - anchorY: this.getAnchorY(), + anchorX: anchor.x, + anchorY: anchor.y, velocity: this.velocity ? this.velocity : 0, }; } - public getAnchorX(): number { - const anchorX = this.rotationGestureDetector.relativeAnchorX; - - return Number.isFinite(anchorX) ? anchorX : this.cachedAnchorX; - } + private getAnchor(): { x: number; y: number } { + const absX = this.rotationGestureDetector.anchorX; + const absY = this.rotationGestureDetector.anchorY; - public getAnchorY(): number { - const anchorY = this.rotationGestureDetector.relativeAnchorY; + if (Number.isFinite(absX) && Number.isFinite(absY)) { + return this.delegate.absoluteToLocal(absX, absY); + } - return Number.isFinite(anchorY) ? anchorY : this.cachedAnchorY; + return { x: this.cachedAnchorX, y: this.cachedAnchorY }; } protected override onPointerDown(event: AdaptedEvent): void { @@ -104,15 +105,9 @@ export default class RotationGestureHandler extends GestureHandler { return; } - const anchorX = this.getAnchorX(); - const anchorY = this.getAnchorY(); - - if (Number.isFinite(anchorX)) { - this.cachedAnchorX = anchorX; - } - if (Number.isFinite(anchorY)) { - this.cachedAnchorY = anchorY; - } + const anchor = this.getAnchor(); + this.cachedAnchorX = anchor.x; + this.cachedAnchorY = anchor.y; this.tracker.track(event); @@ -126,15 +121,9 @@ export default class RotationGestureHandler extends GestureHandler { return; } - const anchorX = this.getAnchorX(); - const anchorY = this.getAnchorY(); - - if (Number.isFinite(anchorX)) { - this.cachedAnchorX = anchorX; - } - if (Number.isFinite(anchorY)) { - this.cachedAnchorY = anchorY; - } + const anchor = this.getAnchor(); + this.cachedAnchorX = anchor.x; + this.cachedAnchorY = anchor.y; this.tracker.track(event); diff --git a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerDelegate.ts b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerDelegate.ts index 087bf04300..d9edf3f634 100644 --- a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerDelegate.ts +++ b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerDelegate.ts @@ -13,6 +13,10 @@ export interface GestureHandlerDelegate { updateDOM(): void; isPointerInBounds({ x, y }: { x: number; y: number }): boolean; measureView(): MeasureResult; + absoluteToLocal( + absoluteX: number, + absoluteY: number + ): { x: number; y: number }; reset(): void; onBegin(): void; diff --git a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts index 39d6cf802b..8bc82f2b2a 100644 --- a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts +++ b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts @@ -123,6 +123,46 @@ export class GestureHandlerWebDelegate }; } + absoluteToLocal( + absoluteX: number, + absoluteY: number + ): { x: number; y: number } { + if (!this.view) { + throw new Error(tagMessage('Cannot convert coords on a null view')); + } + + const rect = getEffectiveBoundingRect(this.view); + const transform = getComputedStyle(this.view).transform; + const matrix = + transform && transform !== 'none' + ? new DOMMatrix(transform) + : new DOMMatrix(); + + // Zero out translation — it's already reflected in the bounding rect + // center, so we only need to invert the rotation+scale part. + matrix.e = 0; + matrix.f = 0; + const inverse = matrix.inverse(); + + // Offset from the visual center of the bounding rect + const rectCenterX = rect.left + rect.width / 2; + const rectCenterY = rect.top + rect.height / 2; + const dx = absoluteX - rectCenterX; + const dy = absoluteY - rectCenterY; + + // Apply inverse rotation+scale to get local-space offset from center + const localOffset = inverse.transformPoint(new DOMPoint(dx, dy)); + + // Add back the local center (untransformed dimensions) + const localCenterX = this.view.offsetWidth / 2; + const localCenterY = this.view.offsetHeight / 2; + + return { + x: localCenterX + localOffset.x, + y: localCenterY + localOffset.y, + }; + } + reset(): void { this.eventManagers.forEach((manager: EventManager) => manager.resetManager() From 2ea9b24629650649dcb09350182aad0c73e019e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Wed, 8 Apr 2026 12:18:03 +0200 Subject: [PATCH 5/5] newline --- .../src/web/detectors/RotationGestureDetector.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts index ac7af9be1c..79ffd6936b 100644 --- a/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts +++ b/packages/react-native-gesture-handler/src/web/detectors/RotationGestureDetector.ts @@ -41,6 +41,7 @@ export default class RotationGestureDetector const firstPointerCoords = tracker.getLastAbsoluteCoords(firstPointerID); const secondPointerCoords = tracker.getLastAbsoluteCoords(secondPointerID); + if (!firstPointerCoords || !secondPointerCoords) { return; }