diff --git a/FabricExample/App.tsx b/FabricExample/App.tsx index d696ada8ea..aeff08afb8 100644 --- a/FabricExample/App.tsx +++ b/FabricExample/App.tsx @@ -1,3 +1,8 @@ import App from '../apps'; +import { featureFlags } from '../src'; + +featureFlags.experiment.synchronousScreenUpdatesEnabled = false +featureFlags.experiment.synchronousHeaderConfigUpdatesEnabled = false +featureFlags.experiment.synchronousHeaderSubviewUpdatesEnabled = false export default App; diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt index 080b79819e..ec09178054 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt @@ -205,6 +205,13 @@ class ScreenStackHeaderConfigViewManager : config.setDirection(direction) } + // synchronousShadowStateUpdatesEnabled is not available on Android atm, + // however we must override their setters + override fun setSynchronousShadowStateUpdatesEnabled( + config: ScreenStackHeaderConfig?, + value: Boolean, + ) = Unit + override fun getExportedCustomDirectEventTypeConstants(): Map = hashMapOf( HeaderAttachedEvent.EVENT_NAME to hashMapOf("registrationName" to "onAttached"), diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt index 73be25fc85..928263a4c0 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt @@ -50,6 +50,13 @@ class ScreenStackHeaderSubviewManager : Log.w("[RNScreens]", "hidesSharedBackground prop is not available on Android") } + // synchronousShadowStateUpdatesEnabled is not available on Android atm, + // however we must override their setters + override fun setSynchronousShadowStateUpdatesEnabled( + view: ScreenStackHeaderSubview?, + value: Boolean, + ) = Unit + override fun updateState( view: ScreenStackHeaderSubview, props: ReactStylesDiffMap?, diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt index 8453188768..67ae075bee 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt @@ -268,6 +268,7 @@ open class ScreenViewManager : view?.sheetElevation = value.toFloat() } + // mark: iOS-only // these props are not available on Android, however we must override their setters override fun setFullScreenSwipeEnabled( view: Screen?, @@ -334,6 +335,13 @@ open class ScreenViewManager : value: String?, ) = Unit + override fun setSynchronousShadowStateUpdatesEnabled( + view: Screen?, + value: Boolean, + ) = Unit + + // END mark: iOS-only + @ReactProp(name = "sheetAllowedDetents") override fun setSheetAllowedDetents( view: Screen, diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java index 1026d0c0d9..c33cb6e318 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java @@ -134,6 +134,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "topScrollEdgeEffect": mViewManager.setTopScrollEdgeEffect(view, (String) value); break; + case "synchronousShadowStateUpdatesEnabled": + mViewManager.setSynchronousShadowStateUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java index 80a3346116..beb5ef140d 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java @@ -52,4 +52,5 @@ public interface RNSScreenManagerInterface { void setLeftScrollEdgeEffect(T view, @Nullable String value); void setRightScrollEdgeEffect(T view, @Nullable String value); void setTopScrollEdgeEffect(T view, @Nullable String value); + void setSynchronousShadowStateUpdatesEnabled(T view, boolean value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java index 3ef1e7a08d..331f711000 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java @@ -115,6 +115,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "headerRightBarButtonItems": mViewManager.setHeaderRightBarButtonItems(view, (ReadableArray) value); break; + case "synchronousShadowStateUpdatesEnabled": + mViewManager.setSynchronousShadowStateUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java index 0f1bc58396..58917121a6 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java @@ -45,4 +45,5 @@ public interface RNSScreenStackHeaderConfigManagerInterface { void setTopInsetEnabled(T view, boolean value); void setHeaderLeftBarButtonItems(T view, @Nullable ReadableArray value); void setHeaderRightBarButtonItems(T view, @Nullable ReadableArray value); + void setSynchronousShadowStateUpdatesEnabled(T view, boolean value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java index 5da63c7dcb..09c3ed1f92 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java @@ -29,6 +29,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "hidesSharedBackground": mViewManager.setHidesSharedBackground(view, value == null ? false : (boolean) value); break; + case "synchronousShadowStateUpdatesEnabled": + mViewManager.setSynchronousShadowStateUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java index 49bf9cadb6..5ad0a1f94e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java @@ -16,4 +16,5 @@ public interface RNSScreenStackHeaderSubviewManagerInterface { void setType(T view, @Nullable String value); void setHidesSharedBackground(T view, boolean value); + void setSynchronousShadowStateUpdatesEnabled(T view, boolean value); } diff --git a/apps/src/tests/Test3282.tsx b/apps/src/tests/Test3282.tsx new file mode 100644 index 0000000000..545753f2b9 --- /dev/null +++ b/apps/src/tests/Test3282.tsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { View, Text, Button, StyleSheet } from 'react-native'; +import { NavigationContainer } from '@react-navigation/native'; +import { createNativeStackNavigator, NativeStackNavigationProp } from '@react-navigation/native-stack'; + +type StackParamList = { + Home: undefined, + FormSheet: undefined, +} + +type RouteProps = { + navigation: NativeStackNavigationProp; +} + +const Stack = createNativeStackNavigator(); + +const HomeScreen = ({ navigation }: RouteProps) => { + return ( + +