From f570e41396b6caf3940c80c83e794952ba3fd4c7 Mon Sep 17 00:00:00 2001 From: Wojciech Lewicki Date: Fri, 15 Mar 2024 17:01:54 +0100 Subject: [PATCH] feat: correct measure with native header (#2028) ## Description PR adding the `getContentOriginOffset` to Screen's `ShadowNode` in order to account for native header on both platforms. It seems like for the different screen orientations don't work correctly on `Android` so it needs to be investigated too. It also adds `ModalScreen` concept for now only to have different shadow node there. We need it for different traits since the non-modal Screen can be placed below some other views, so it should not be treated as the root of the view hierarchy by yoga. ## Changes - Added new prop to `Screen`'s state which is used in `getContentOriginOffset` method which is in turn used by `LayoutableShadowNode` when adding offsets to elements: https://github.com/facebook/react-native/blob/8da1da2e7320e23341e024a855e87c4762b220cc/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp#L54. - Added `ModalScreen` --- FabricTestExample/App.js | 1 + FabricTestExample/src/Test2028.tsx | 54 ++++++++ FabricTestExample/yarn.lock | 124 +++++++++--------- TestsExample/Gemfile.lock | 45 ++++--- TestsExample/ios/Podfile | 15 --- TestsExample/ios/Podfile.lock | 110 +--------------- .../rnscreens/FabricEnabledViewGroup.kt | 8 +- .../rnscreens/ModalScreenViewManager.kt | 12 ++ .../swmansion/rnscreens/RNScreensPackage.kt | 1 + .../java/com/swmansion/rnscreens/Screen.kt | 12 +- .../swmansion/rnscreens/ScreenContainer.kt | 1 - .../swmansion/rnscreens/ScreenViewManager.kt | 2 +- android/src/main/jni/rnscreens.h | 1 + .../rnscreens/FabricEnabledViewGroup.kt | 2 +- .../RNSModalScreenComponentDescriptor.h | 41 ++++++ .../rnscreens/RNSModalScreenShadowNode.cpp | 15 +++ .../rnscreens/RNSModalScreenShadowNode.h | 31 +++++ .../rnscreens/RNSScreenShadowNode.cpp | 6 + .../rnscreens/RNSScreenShadowNode.h | 6 +- .../components/rnscreens/RNSScreenState.cpp | 2 +- .../components/rnscreens/RNSScreenState.h | 11 +- ios/RNSModalScreen.h | 8 ++ ios/RNSModalScreen.mm | 36 +++++ ios/RNSScreen.h | 5 +- ios/RNSScreen.mm | 16 ++- react-native.config.js | 3 +- src/components/Screen.tsx | 23 +++- src/fabric/ModalScreenNativeComponent.ts | 104 +++++++++++++++ 28 files changed, 459 insertions(+), 236 deletions(-) create mode 100644 FabricTestExample/src/Test2028.tsx create mode 100644 android/src/main/java/com/swmansion/rnscreens/ModalScreenViewManager.kt create mode 100644 common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h create mode 100644 common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp create mode 100644 common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h create mode 100644 ios/RNSModalScreen.h create mode 100644 ios/RNSModalScreen.mm create mode 100644 src/fabric/ModalScreenNativeComponent.ts diff --git a/FabricTestExample/App.js b/FabricTestExample/App.js index 49db6e6bdd..055ae2184d 100644 --- a/FabricTestExample/App.js +++ b/FabricTestExample/App.js @@ -93,6 +93,7 @@ import Test1864 from './src/Test1864'; import TestScreenAnimation from './src/TestScreenAnimation'; import Test1981 from './src/Test1981'; import Test2008 from './src/Test2008'; +import Test2028 from './src/Test2028'; enableFreeze(true); diff --git a/FabricTestExample/src/Test2028.tsx b/FabricTestExample/src/Test2028.tsx new file mode 100644 index 0000000000..81c1f1aa3f --- /dev/null +++ b/FabricTestExample/src/Test2028.tsx @@ -0,0 +1,54 @@ + +import React from 'react'; +import { Button, SafeAreaView, View } from 'react-native'; + +import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import { NavigationContainer } from '@react-navigation/native'; + +const Stack = createNativeStackNavigator(); + +const TestScreen = ({ navigation }): React.JSX.Element => { + return ( + +