From 1beacf1be23a71c1ae198266127c1245544c7b55 Mon Sep 17 00:00:00 2001 From: Wojciech Lewicki Date: Fri, 30 Sep 2022 14:24:34 +0200 Subject: [PATCH] feat: make pointer events work on both platforms (#1879) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR adding proper handling of pointerEvents in the library. Based on the comment by @RSNara : > For all Android components, static ViewConfigs are generated from the components types + BaseVIewConfig.android.js. The BaseViewConfig for all android components is facebook/react-native@c5217f1/Libraries/NativeComponent/BaseViewConfig.android.js#L288-L297, which doesn't contain the pointerEvents validAttribute. So, React Native SVG components must re-declare the pointerEvents validAttribute. Otherwise, the pointerEvents validAttribute won't be in the static ViewConfig, which means React won't pass that prop to native with Static ViewConfigs. We needed a way to trick codegen since we added our own pointerEvents with string type, and such prop is already present in ViewProps from react-native, but as a union of strings, so their types did not match. As codegen parses string literals, we include changed ViewProps type, without pointerEvents prop, so we satisfy both codegen and TS. As for how pointerEvents are handled now: iOS: Paper: prop is passed in RCTViewManager but it looks like it does not matter what you pass there, since even if you set none, resulting in view.userInteractionEnabled = NO; (facebook/react-native@065db68/React/Views/RCTViewManager.m#L256), custom implementation of hitTest will not take it into account anyhow. Fabric: we don’t use pointerEvents prop but it is not a problem since it is not used in the implementation of neither SvgView and RCTViewComponentView (it is used in hitTest method there, but we override it) Android: Paper: the prop was passed through ReactViewManager and was set on the view directly. But the setter for pointerEvents is not visible outside of ReactViewGroup . After adding Fabric integration for both platforms: BaseViewManager does not implement setter for pointerEvents so we have to add the prop by ourselves. Still, we cannot call the setter from ReactViewGroup since it is not visible, so all the logic for pointerEvents should be migrated to SvgView unfortunately or we should use reflection to get that method. Despite that, it seems that behavior differs on Android and iOS since setting pointerEvents to none on Android makes the view not clickable, whereas on iOS it does not change anything. --- .github/workflows/ios-build-test.yml | 6 ++--- Example/ios/Podfile.lock | 8 +++---- FabricExample/ios/Podfile.lock | 4 ++-- .../java/com/horcrux/svg/SvgViewManager.java | 18 +++++++++++++++ .../RNSVGCircleManagerDelegate.java | 3 +++ .../RNSVGCircleManagerInterface.java | 1 + .../RNSVGClipPathManagerDelegate.java | 3 +++ .../RNSVGClipPathManagerInterface.java | 1 + .../RNSVGDefsManagerDelegate.java | 3 +++ .../RNSVGDefsManagerInterface.java | 1 + .../RNSVGEllipseManagerDelegate.java | 3 +++ .../RNSVGEllipseManagerInterface.java | 1 + .../RNSVGForeignObjectManagerDelegate.java | 3 +++ .../RNSVGForeignObjectManagerInterface.java | 1 + .../RNSVGGroupManagerDelegate.java | 3 +++ .../RNSVGGroupManagerInterface.java | 1 + .../RNSVGImageManagerDelegate.java | 3 +++ .../RNSVGImageManagerInterface.java | 1 + .../RNSVGLineManagerDelegate.java | 3 +++ .../RNSVGLineManagerInterface.java | 1 + .../RNSVGLinearGradientManagerDelegate.java | 3 +++ .../RNSVGLinearGradientManagerInterface.java | 1 + .../RNSVGMarkerManagerDelegate.java | 3 +++ .../RNSVGMarkerManagerInterface.java | 1 + .../RNSVGMaskManagerDelegate.java | 3 +++ .../RNSVGMaskManagerInterface.java | 1 + .../RNSVGPathManagerDelegate.java | 3 +++ .../RNSVGPathManagerInterface.java | 1 + .../RNSVGPatternManagerDelegate.java | 3 +++ .../RNSVGPatternManagerInterface.java | 1 + .../RNSVGRadialGradientManagerDelegate.java | 3 +++ .../RNSVGRadialGradientManagerInterface.java | 1 + .../RNSVGRectManagerDelegate.java | 3 +++ .../RNSVGRectManagerInterface.java | 1 + .../RNSVGSvgViewManagerDelegate.java | 3 +++ .../RNSVGSvgViewManagerInterface.java | 1 + .../RNSVGSymbolManagerDelegate.java | 3 +++ .../RNSVGSymbolManagerInterface.java | 1 + .../RNSVGTSpanManagerDelegate.java | 3 +++ .../RNSVGTSpanManagerInterface.java | 1 + .../RNSVGTextManagerDelegate.java | 3 +++ .../RNSVGTextManagerInterface.java | 1 + .../RNSVGTextPathManagerDelegate.java | 3 +++ .../RNSVGTextPathManagerInterface.java | 1 + .../viewmanagers/RNSVGUseManagerDelegate.java | 3 +++ .../RNSVGUseManagerInterface.java | 1 + apple/Utils/RNSVGFabricConversions.h | 23 ++++++++++--------- src/fabric/CircleNativeComponent.ts | 5 ++-- src/fabric/ClipPathNativeComponent.ts | 5 ++-- src/fabric/DefsNativeComponent.ts | 4 ++-- src/fabric/EllipseNativeComponent.ts | 5 ++-- src/fabric/ForeignObjectNativeComponent.ts | 5 ++-- src/fabric/GroupNativeComponent.ts | 5 ++-- src/fabric/ImageNativeComponent.ts | 4 ++-- src/fabric/LineNativeComponent.ts | 5 ++-- src/fabric/LinearGradientNativeComponent.ts | 4 ++-- src/fabric/MarkerNativeComponent.ts | 5 ++-- src/fabric/MaskNativeComponent.ts | 5 ++-- src/fabric/PathNativeComponent.ts | 5 ++-- src/fabric/PatternNativeComponent.ts | 5 ++-- src/fabric/RadialGradientNativeComponent.ts | 4 ++-- src/fabric/RectNativeComponent.ts | 5 ++-- src/fabric/SvgViewNativeComponent.ts | 4 +++- src/fabric/SymbolNativeComponent.ts | 5 ++-- src/fabric/TSpanNativeComponent.ts | 5 ++-- src/fabric/TextNativeComponent.ts | 5 ++-- src/fabric/TextPathNativeComponent.ts | 5 ++-- src/fabric/UseNativeComponent.ts | 5 ++-- src/fabric/utils.ts | 5 ++++ 69 files changed, 186 insertions(+), 62 deletions(-) create mode 100644 src/fabric/utils.ts diff --git a/.github/workflows/ios-build-test.yml b/.github/workflows/ios-build-test.yml index d99f797b8..c6dd36104 100644 --- a/.github/workflows/ios-build-test.yml +++ b/.github/workflows/ios-build-test.yml @@ -66,10 +66,8 @@ jobs: - name: Restore build artifacts from cache uses: actions/cache@v3 with: - path: | - ${{ matrix.working-directory }}/ios/build - ~/Library/Developer/Xcode/DerivedData - key: ${{ runner.os }}-ios-build-${{ matrix.working-directory }}-${{ hashFiles(format('{0}/ios/Podfile.lock', matrix.working-directory)) }} + path: ~/Library/Developer/Xcode/DerivedData + key: ${{ runner.os }}-ios-derived-data-${{ matrix.working-directory }}-${{ hashFiles(format('{0}/ios/Podfile.lock', matrix.working-directory)) }} - name: Build app working-directory: ${{ matrix.working-directory }} diff --git a/Example/ios/Podfile.lock b/Example/ios/Podfile.lock index 902abe62a..83c077110 100644 --- a/Example/ios/Podfile.lock +++ b/Example/ios/Podfile.lock @@ -368,7 +368,7 @@ PODS: - React-jsi (= 0.70.0) - React-logger (= 0.70.0) - React-perflogger (= 0.70.0) - - RNSVG (13.1.0): + - RNSVG (13.2.0): - React-Core - SocketRocket (0.6.0) - Yoga (1.14.0) @@ -530,7 +530,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: a7c83b31436843459a1961bfd74b96033dc77234 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: 6c76fe46345039d5cf0549e9ddaf5aa169630a4a FBReactNativeSpec: 1a270246542f5c52248cb26a96db119cfe3cb760 Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 @@ -543,7 +543,7 @@ SPEC CHECKSUMS: Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + glog: 476ee3e89abb49e07f822b48323c51c57124b572 hermes-engine: 8e84f1284180801c1a1b241f443ba64f931ff561 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c @@ -574,7 +574,7 @@ SPEC CHECKSUMS: React-RCTVibration: 5499b77c0fd57f346a5f0b36bb79fdb020d17d3e React-runtimeexecutor: 80c195ffcafb190f531fdc849dc2d19cb4bb2b34 ReactCommon: de55f940495d7bf87b5d7bf55b5b15cdd50d7d7b - RNSVG: 1153e8eeb34c788841016c517dba9f57f20b762f + RNSVG: 07037623c36f12e41312730622d5f6b3656227ca SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: 82c9e8f652789f67d98bed5aef9d6653f71b04a9 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/FabricExample/ios/Podfile.lock b/FabricExample/ios/Podfile.lock index ecfd99bbd..42c743fd9 100644 --- a/FabricExample/ios/Podfile.lock +++ b/FabricExample/ios/Podfile.lock @@ -697,7 +697,7 @@ PODS: - React-jsi (= 0.70.0) - React-logger (= 0.70.0) - React-perflogger (= 0.70.0) - - RNSVG (13.1.0): + - RNSVG (13.2.0): - RCT-Folly - RCTRequired - RCTTypeSafety @@ -927,7 +927,7 @@ SPEC CHECKSUMS: React-rncore: 8858fe6b719170c20c197a8fd2dd53507bdae04b React-runtimeexecutor: 80c195ffcafb190f531fdc849dc2d19cb4bb2b34 ReactCommon: de55f940495d7bf87b5d7bf55b5b15cdd50d7d7b - RNSVG: 81cdb77109d5f3e77dcf1dd8045aaaa8144afddf + RNSVG: fa7f6f437c90eea1fbc3d142a40365d561824ab3 SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: 82c9e8f652789f67d98bed5aef9d6653f71b04a9 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/android/src/main/java/com/horcrux/svg/SvgViewManager.java b/android/src/main/java/com/horcrux/svg/SvgViewManager.java index 1af9d2182..c6258854d 100644 --- a/android/src/main/java/com/horcrux/svg/SvgViewManager.java +++ b/android/src/main/java/com/horcrux/svg/SvgViewManager.java @@ -10,13 +10,17 @@ import android.util.SparseArray; import com.facebook.react.bridge.Dynamic; +import com.facebook.react.uimanager.PointerEvents; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewManagerDelegate; +import com.facebook.react.uimanager.ViewProps; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.viewmanagers.RNSVGSvgViewManagerDelegate; import com.facebook.react.viewmanagers.RNSVGSvgViewManagerInterface; import com.facebook.react.views.view.ReactViewGroup; import com.facebook.react.views.view.ReactViewManager; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -162,4 +166,18 @@ public void setBbHeight(SvgView view, @Nullable String value) { public void setBbHeight(SvgView view, @Nullable Double value) { view.setBbHeight(value); } + + @ReactProp(name = ViewProps.POINTER_EVENTS) + public void setPointerEvents(SvgView view, @Nullable String pointerEventsStr) { + try { + Class superclass = view.getClass().getSuperclass(); + if (superclass != null) { + Method method = superclass.getDeclaredMethod("setPointerEvents", PointerEvents.class); + method.setAccessible(true); + method.invoke(view, PointerEvents.parsePointerEvents(pointerEventsStr)); + } + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + } } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerDelegate.java index 35dbc2e99..97aaeb748 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerInterface.java index b60868c75..9172ef6a8 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGCircleManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGCircleManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerDelegate.java index 76dd6d3d0..f79436f0e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerInterface.java index de88f9299..5e68ef414 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGClipPathManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGClipPathManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerDelegate.java index fcb875be5..69c54d3a7 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerDelegate.java @@ -55,6 +55,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerInterface.java index b33a11a12..d405b61a6 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGDefsManagerInterface.java @@ -25,4 +25,5 @@ public interface RNSVGDefsManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerDelegate.java index e15529972..436d4d708 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerInterface.java index 7e2228602..d68c29b3e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGEllipseManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGEllipseManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerDelegate.java index dd0761753..9ab82c2be 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerInterface.java index 85a5b5e55..e4fa3e05b 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGForeignObjectManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGForeignObjectManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerDelegate.java index 57680b65f..4f3ef867f 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerInterface.java index 2c53b766a..c5cadf91e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGGroupManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGGroupManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerDelegate.java index cf1f1bf69..67eb24bdc 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerInterface.java index 0fe925cd3..6b37af518 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGImageManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGImageManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerDelegate.java index 89e42778d..a11172d27 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerInterface.java index 1856f38fd..65fcb9bf5 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLineManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGLineManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerDelegate.java index d81ff7cd2..76004a3d9 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerDelegate.java @@ -55,6 +55,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "x1": if (value instanceof String) { mViewManager.setX1(view, (String) value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerInterface.java index 6b15cb089..8df534875 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGLinearGradientManagerInterface.java @@ -25,6 +25,7 @@ public interface RNSVGLinearGradientManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setX1(T view, @Nullable String value); void setX1(T view, @Nullable Double value); void setY1(T view, @Nullable String value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerDelegate.java index ac53c3b24..c918b7810 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerInterface.java index 22609dcf1..07c4d3cb2 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMarkerManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGMarkerManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerDelegate.java index 7b1fe63c5..849f8ed52 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerInterface.java index 2bc96e7a7..a5627bd44 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGMaskManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGMaskManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerDelegate.java index eea0ff9ef..2d15a9308 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerInterface.java index 31c5d0931..0a3077993 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPathManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGPathManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerDelegate.java index cbba78e90..62e4cc006 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerInterface.java index 978b6658d..c2a9625ff 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGPatternManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGPatternManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerDelegate.java index 809034cac..5726bd78a 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerDelegate.java @@ -55,6 +55,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fx": if (value instanceof String) { mViewManager.setFx(view, (String) value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerInterface.java index 6a7a36019..4cd6a1c65 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRadialGradientManagerInterface.java @@ -25,6 +25,7 @@ public interface RNSVGRadialGradientManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFx(T view, @Nullable String value); void setFx(T view, @Nullable Double value); void setFy(T view, @Nullable String value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerDelegate.java index b756a8ddd..bcaac92d1 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerInterface.java index edac69061..3ffd4094a 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGRectManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGRectManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerDelegate.java index 4b32f9bd5..47ecf6cc0 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerDelegate.java @@ -64,6 +64,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "color": mViewManager.setColor(view, ColorPropConverter.getColor(value, view.getContext())); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerInterface.java index 65197e04d..f70093a5c 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSvgViewManagerInterface.java @@ -25,4 +25,5 @@ public interface RNSVGSvgViewManagerInterface { void setMeetOrSlice(T view, int value); void setTintColor(T view, @Nullable Integer value); void setColor(T view, @Nullable Integer value); + void setPointerEvents(T view, @Nullable String value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerDelegate.java index f2f675c69..eb611e02a 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerInterface.java index 58dd0c418..3283adb30 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGSymbolManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGSymbolManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerDelegate.java index bb2ed2d01..0134c9de6 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerInterface.java index c52a2be3c..2120edaa8 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTSpanManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGTSpanManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerDelegate.java index 430124b60..0801461bd 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerInterface.java index 8d8f52768..6d064987e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGTextManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerDelegate.java index a2b9c3863..a74407195 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerInterface.java index c5c029a49..fb4e285ab 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGTextPathManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGTextPathManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerDelegate.java index c46bce5e0..0bc8e0587 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerDelegate.java @@ -56,6 +56,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "display": mViewManager.setDisplay(view, value == null ? null : (String) value); break; + case "pointerEvents": + mViewManager.setPointerEvents(view, value == null ? null : (String) value); + break; case "fill": mViewManager.setFill(view, (ReadableMap) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerInterface.java index d840d6364..3b196a845 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSVGUseManagerInterface.java @@ -26,6 +26,7 @@ public interface RNSVGUseManagerInterface { void setClipRule(T view, int value); void setResponsible(T view, boolean value); void setDisplay(T view, @Nullable String value); + void setPointerEvents(T view, @Nullable String value); void setFill(T view, @Nullable ReadableMap value); void setFillOpacity(T view, float value); void setFillRule(T view, int value); diff --git a/apple/Utils/RNSVGFabricConversions.h b/apple/Utils/RNSVGFabricConversions.h index 7aae63567..ab4da0a51 100644 --- a/apple/Utils/RNSVGFabricConversions.h +++ b/apple/Utils/RNSVGFabricConversions.h @@ -69,17 +69,18 @@ void setCommonNodeProps(T nodeProps, RNSVGNode *node) node.responsible = nodeProps.responsible; // onLayout node.display = RCTNSStringFromStringNilIfEmpty(nodeProps.display); - switch (nodeProps.pointerEvents) { - case facebook::react::PointerEventsMode::Auto: - node.pointerEvents = RCTPointerEventsUnspecified; - case facebook::react::PointerEventsMode::None: - node.pointerEvents = RCTPointerEventsNone; - case facebook::react::PointerEventsMode::BoxNone: - node.pointerEvents = RCTPointerEventsBoxNone; - case facebook::react::PointerEventsMode::BoxOnly: - node.pointerEvents = RCTPointerEventsBoxOnly; - default: - node.pointerEvents = RCTPointerEventsUnspecified; + std::string pointerEvents = nodeProps.pointerEvents; + NSString *pointerEventsString = RCTNSStringFromStringNilIfEmpty(pointerEvents); + if ([pointerEventsString isEqualToString:@"auto"]) { + node.pointerEvents = RCTPointerEventsUnspecified; + } else if ([pointerEventsString isEqualToString:@"none"]) { + node.pointerEvents = RCTPointerEventsNone; + } else if ([pointerEventsString isEqualToString:@"box-none"]) { + node.pointerEvents = RCTPointerEventsNone; + } else if ([pointerEventsString isEqualToString:@"box-only"]) { + node.pointerEvents = RCTPointerEventsNone; + } else { + node.pointerEvents = RCTPointerEventsUnspecified; } } diff --git a/src/fabric/CircleNativeComponent.ts b/src/fabric/CircleNativeComponent.ts index 1059f2c8b..5fee59ae0 100644 --- a/src/fabric/CircleNativeComponent.ts +++ b/src/fabric/CircleNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/ClipPathNativeComponent.ts b/src/fabric/ClipPathNativeComponent.ts index 005ad315d..04461cc51 100644 --- a/src/fabric/ClipPathNativeComponent.ts +++ b/src/fabric/ClipPathNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ColorValue, ViewProps } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/DefsNativeComponent.ts b/src/fabric/DefsNativeComponent.ts index 8a1a86963..1a4539e77 100644 --- a/src/fabric/DefsNativeComponent.ts +++ b/src/fabric/DefsNativeComponent.ts @@ -1,16 +1,15 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps } from 'react-native'; import { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +18,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } interface NativeProps extends ViewProps, SvgNodeCommonProps {} diff --git a/src/fabric/EllipseNativeComponent.ts b/src/fabric/EllipseNativeComponent.ts index e8962c344..ee0507543 100644 --- a/src/fabric/EllipseNativeComponent.ts +++ b/src/fabric/EllipseNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/ForeignObjectNativeComponent.ts b/src/fabric/ForeignObjectNativeComponent.ts index 303bd64a6..e1cbf01e7 100644 --- a/src/fabric/ForeignObjectNativeComponent.ts +++ b/src/fabric/ForeignObjectNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/GroupNativeComponent.ts b/src/fabric/GroupNativeComponent.ts index 8ce99d694..3ddd11b77 100644 --- a/src/fabric/GroupNativeComponent.ts +++ b/src/fabric/GroupNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/ImageNativeComponent.ts b/src/fabric/ImageNativeComponent.ts index 6c598e576..e6afeaab7 100644 --- a/src/fabric/ImageNativeComponent.ts +++ b/src/fabric/ImageNativeComponent.ts @@ -1,7 +1,6 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; // TODO: import ImageSource from codegen types when it is available import type { - ViewProps, ColorValue, ImageSourcePropType as ImageSource, } from 'react-native'; @@ -10,12 +9,12 @@ import type { Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -24,6 +23,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/LineNativeComponent.ts b/src/fabric/LineNativeComponent.ts index 1bf7277a1..6b2fb88dd 100644 --- a/src/fabric/LineNativeComponent.ts +++ b/src/fabric/LineNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/LinearGradientNativeComponent.ts b/src/fabric/LinearGradientNativeComponent.ts index 1dbd83f93..3aeb447b7 100644 --- a/src/fabric/LinearGradientNativeComponent.ts +++ b/src/fabric/LinearGradientNativeComponent.ts @@ -1,16 +1,15 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +18,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } interface NativeProps extends ViewProps, SvgNodeCommonProps { diff --git a/src/fabric/MarkerNativeComponent.ts b/src/fabric/MarkerNativeComponent.ts index 0cc1f361a..e4aa19c62 100644 --- a/src/fabric/MarkerNativeComponent.ts +++ b/src/fabric/MarkerNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/MaskNativeComponent.ts b/src/fabric/MaskNativeComponent.ts index 0c4287a7f..9a27bc08c 100644 --- a/src/fabric/MaskNativeComponent.ts +++ b/src/fabric/MaskNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/PathNativeComponent.ts b/src/fabric/PathNativeComponent.ts index a6ebecc26..3b8edf918 100644 --- a/src/fabric/PathNativeComponent.ts +++ b/src/fabric/PathNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/PatternNativeComponent.ts b/src/fabric/PatternNativeComponent.ts index 1f69f56cb..77fc0d24a 100644 --- a/src/fabric/PatternNativeComponent.ts +++ b/src/fabric/PatternNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/RadialGradientNativeComponent.ts b/src/fabric/RadialGradientNativeComponent.ts index 33b3d92ac..ee64108ae 100644 --- a/src/fabric/RadialGradientNativeComponent.ts +++ b/src/fabric/RadialGradientNativeComponent.ts @@ -1,16 +1,15 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +18,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } interface NativeProps extends ViewProps, SvgNodeCommonProps { diff --git a/src/fabric/RectNativeComponent.ts b/src/fabric/RectNativeComponent.ts index 80c8e7bc8..8a88ba49d 100644 --- a/src/fabric/RectNativeComponent.ts +++ b/src/fabric/RectNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/SvgViewNativeComponent.ts b/src/fabric/SvgViewNativeComponent.ts index 2e31e7f1c..76ca52082 100644 --- a/src/fabric/SvgViewNativeComponent.ts +++ b/src/fabric/SvgViewNativeComponent.ts @@ -1,6 +1,7 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32 } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface NativeProps extends ViewProps { bbWidth: string; @@ -13,6 +14,7 @@ interface NativeProps extends ViewProps { meetOrSlice: Int32; tintColor: ColorValue; color: ColorValue; + pointerEvents?: string; } export default codegenNativeComponent('RNSVGSvgView'); diff --git a/src/fabric/SymbolNativeComponent.ts b/src/fabric/SymbolNativeComponent.ts index 7e380858a..4694badc6 100644 --- a/src/fabric/SymbolNativeComponent.ts +++ b/src/fabric/SymbolNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/TSpanNativeComponent.ts b/src/fabric/TSpanNativeComponent.ts index b343a0f6c..02a0c7c75 100644 --- a/src/fabric/TSpanNativeComponent.ts +++ b/src/fabric/TSpanNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/TextNativeComponent.ts b/src/fabric/TextNativeComponent.ts index 292e35bcd..eb4476735 100644 --- a/src/fabric/TextNativeComponent.ts +++ b/src/fabric/TextNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/TextPathNativeComponent.ts b/src/fabric/TextPathNativeComponent.ts index c18c6fab0..80a8d5e60 100644 --- a/src/fabric/TextPathNativeComponent.ts +++ b/src/fabric/TextPathNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/UseNativeComponent.ts b/src/fabric/UseNativeComponent.ts index 9af70449e..842498281 100644 --- a/src/fabric/UseNativeComponent.ts +++ b/src/fabric/UseNativeComponent.ts @@ -1,16 +1,16 @@ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -import type { ViewProps, ColorValue } from 'react-native'; +import type { ColorValue } from 'react-native'; import type { Float, Int32, WithDefault, } from 'react-native/Libraries/Types/CodegenTypes'; +import type { ViewProps } from './utils'; interface SvgNodeCommonProps { name?: string; opacity?: WithDefault; matrix?: ReadonlyArray; - // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling mask?: string; markerStart?: string; markerMid?: string; @@ -19,6 +19,7 @@ interface SvgNodeCommonProps { clipRule?: WithDefault; responsible?: boolean; display?: string; + pointerEvents?: string; } type ColorStruct = Readonly<{ diff --git a/src/fabric/utils.ts b/src/fabric/utils.ts new file mode 100644 index 000000000..2f973aa46 --- /dev/null +++ b/src/fabric/utils.ts @@ -0,0 +1,5 @@ +import type { ViewProps as VP } from 'react-native'; + +interface ViewProps extends Omit {} + +export type { ViewProps };