Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

web support with expo-sdk >= 48 #136

Open
rchavik opened this issue Jul 7, 2023 · 2 comments
Open

web support with expo-sdk >= 48 #136

rchavik opened this issue Jul 7, 2023 · 2 comments

Comments

@rchavik
Copy link

rchavik commented Jul 7, 2023

Is there a way to support expo-sdk >= 48 with a newer react-native-web that has dropped setNativeProps ?

@rchavik
Copy link
Author

rchavik commented Jul 10, 2023

This seems to work on web + ios:

diff --git a/src/components/SvgMask.tsx b/src/components/SvgMask.tsx
index db7481c..61f353d 100644
--- a/src/components/SvgMask.tsx
+++ b/src/components/SvgMask.tsx
@@ -5,11 +5,11 @@ import {
   Easing,
   LayoutChangeEvent,
   Platform,
+  ScaledSize,
   StyleProp,
+  TouchableWithoutFeedback,
   View,
   ViewStyle,
-  TouchableWithoutFeedback,
-  ScaledSize,
 } from 'react-native'
 import Svg, { PathProps } from 'react-native-svg'
 import { IStep, ValueXY } from '../types'
@@ -37,10 +37,9 @@ interface State {
   animation: Animated.Value
   canvasSize: ValueXY
   previousPath: string
+  d: string
 }
 
-const IS_WEB = Platform.OS !== 'web'
-
 export class SvgMask extends Component<Props, State> {
   static defaultProps = {
     easing: Easing.linear,
@@ -80,6 +79,7 @@ export class SvgMask extends Component<Props, State> {
       opacity: new Animated.Value(0),
       animation: new Animated.Value(0),
       previousPath: this.firstPath,
+      d: this.firstPath,
     }
 
     this.listenerID = this.state.animation.addListener(this.animationListener)
@@ -125,13 +125,9 @@ export class SvgMask extends Component<Props, State> {
     const d = this.getPath()
     this.rafID = requestAnimationFrame(() => {
       if (this.mask && this.mask.current) {
-        if (IS_WEB) {
-          // @ts-ignore
-          this.mask.current.setNativeProps({ d })
-        } else {
-          // @ts-ignore
-          this.mask.current._touchableNode.setAttribute('d', d)
-        }
+        this.setState({
+          d,
+        })
       }
     })
   }
@@ -205,7 +201,7 @@ export class SvgMask extends Component<Props, State> {
             fill={this.props.backdropColor}
             strokeWidth={0}
             fillRule='evenodd'
-            d={this.firstPath}
+            d={this.state.d}
             opacity={this.state.opacity as any}
           />
         </Svg>

@manuthecoder
Copy link

manuthecoder commented Jul 14, 2024

Here's what I did if anyone here is looking for an updated solution!

patches\rn-tourguide+3.3.0.patch

diff --git a/node_modules/rn-tourguide/lib/components/SvgMask.js b/node_modules/rn-tourguide/lib/components/SvgMask.js
index ffb2cb7..39f14fe 100644
--- a/node_modules/rn-tourguide/lib/components/SvgMask.js
+++ b/node_modules/rn-tourguide/lib/components/SvgMask.js
@@ -1,9 +1,8 @@
 import React, { Component } from 'react';
-import { Animated, Dimensions, Easing, Platform, View, TouchableWithoutFeedback, } from 'react-native';
+import { Animated, Dimensions, Easing, Platform, TouchableWithoutFeedback, View, } from 'react-native';
 import Svg from 'react-native-svg';
 import { svgMaskPathMorph } from '../utilities';
 import { AnimatedSvgPath } from './AnimatedPath';
-const IS_WEB = Platform.OS !== 'web';
 export class SvgMask extends Component {
     constructor(props) {
         super(props);
@@ -29,12 +28,7 @@ export class SvgMask extends Component {
             const d = this.getPath();
             this.rafID = requestAnimationFrame(() => {
                 if (this.mask && this.mask.current) {
-                    if (IS_WEB) {
-                        this.mask.current.setNativeProps({ d });
-                    }
-                    else {
-                        this.mask.current._touchableNode.setAttribute('d', d);
-                    }
+                    this.setState({ d })
                 }
             });
         };
@@ -88,6 +82,7 @@ export class SvgMask extends Component {
             opacity: new Animated.Value(0),
             animation: new Animated.Value(0),
             previousPath: this.firstPath,
+            d: this.firstPath,
         };
         this.listenerID = this.state.animation.addListener(this.animationListener);
     }
@@ -113,7 +108,7 @@ export class SvgMask extends Component {
         const Wrapper = dismissOnPress ? TouchableWithoutFeedback : View;
         return (React.createElement(Wrapper, { style: this.props.style, onLayout: this.handleLayout, pointerEvents: 'none', onPress: dismissOnPress ? stop : undefined },
             React.createElement(Svg, { pointerEvents: 'none', width: this.state.canvasSize.x, height: this.state.canvasSize.y },
-                React.createElement(AnimatedSvgPath, { ref: this.mask, fill: this.props.backdropColor, strokeWidth: 0, fillRule: 'evenodd', d: this.firstPath, opacity: this.state.opacity }))));
+                React.createElement(AnimatedSvgPath, { ref: this.mask, fill: this.props.backdropColor, strokeWidth: 0, fillRule: 'evenodd', d: this.state.d, opacity: this.state.opacity }))));
     }
 }
 SvgMask.defaultProps = {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants