react-native-screens 4.7.0 → 4.9.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/android/build.gradle +2 -1
  2. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +15 -2
  3. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +7 -4
  4. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +4 -1
  5. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +2 -2
  6. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +2 -1
  7. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +1 -1
  8. package/android/src/main/jni/CMakeLists.txt +1 -0
  9. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +2 -1
  10. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +2 -1
  11. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +2 -1
  12. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +2 -1
  13. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +2 -1
  14. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +2 -1
  15. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +2 -1
  16. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +2 -1
  17. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +0 -1
  18. package/cpp/RNSScreenRemovalListener.cpp +4 -2
  19. package/ios/RNSScreenStack.mm +1 -1
  20. package/package.json +11 -11
@@ -130,7 +130,8 @@ android {
130
130
  externalNativeBuild {
131
131
  cmake {
132
132
  arguments "-DANDROID_STL=c++_shared",
133
- "-DRNS_NEW_ARCH_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}"
133
+ "-DRNS_NEW_ARCH_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}",
134
+ "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
134
135
  }
135
136
  }
136
137
  }
@@ -41,13 +41,26 @@ class NativeProxy {
41
41
  }
42
42
  }
43
43
 
44
+ // Called from native
44
45
  @DoNotStrip
45
46
  public fun notifyScreenRemoved(screenTag: Int) {
46
- val screen = viewsMap[screenTag]?.get()
47
+ // Since RN 0.78 the screenTag we receive as argument here might not belong to a screen
48
+ // owned by native stack, but e.g. to one parented by plain ScreenContainer, for which we
49
+ // currently do not want to start exiting transitions. Therefore is it left to caller to
50
+ // ensure that NativeProxy.viewsMap is filled only with screens belonging to screen stacks.
51
+
52
+ val weakScreeRef = viewsMap[screenTag]
53
+
54
+ // `screenTag` belongs to not observed screen or screen with such tag no longer exists.
55
+ if (weakScreeRef == null) {
56
+ return
57
+ }
58
+
59
+ val screen = weakScreeRef.get()
47
60
  if (screen is Screen) {
48
61
  screen.startRemovalTransition()
49
62
  } else {
50
- Log.w("[RNScreens]", "Did not find view with tag $screenTag.")
63
+ Log.w("[RNScreens]", "Reference stored in NativeProxy for tag $screenTag no longer points to valid object.")
51
64
  }
52
65
  }
53
66
  }
@@ -371,9 +371,12 @@ class ScreenStackFragment :
371
371
  ScreenAnimationDelegate(
372
372
  this,
373
373
  ScreenEventEmitter(this.screen),
374
- if (enter) ScreenAnimationDelegate.AnimationType.ENTER
375
- else ScreenAnimationDelegate.AnimationType.EXIT
376
- )
374
+ if (enter) {
375
+ ScreenAnimationDelegate.AnimationType.ENTER
376
+ } else {
377
+ ScreenAnimationDelegate.AnimationType.EXIT
378
+ },
379
+ ),
377
380
  )
378
381
  return animatorSet
379
382
  }
@@ -793,7 +796,7 @@ class ScreenStackFragment :
793
796
  // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout
794
797
  // to be target of react gestures and effectively prevent interaction with screens
795
798
  // underneath the current screen (useful in `modal` & `formSheet` presentation).
796
- override fun getPointerEvents(): PointerEvents = PointerEvents.BOX_NONE
799
+ override val pointerEvents: PointerEvents = PointerEvents.BOX_NONE
797
800
  }
798
801
 
799
802
  private class ScreensAnimation(
@@ -11,7 +11,10 @@ internal class ScreensShadowNode(
11
11
  ) : LayoutShadowNode() {
12
12
  override fun onBeforeLayout(nativeViewHierarchyOptimizer: NativeViewHierarchyOptimizer) {
13
13
  super.onBeforeLayout(nativeViewHierarchyOptimizer)
14
- (context.getNativeModule(UIManagerModule::class.java))?.addUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
14
+ (context.getNativeModule(UIManagerModule::class.java))?.addUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager? ->
15
+ if (nativeViewHierarchyManager == null) {
16
+ return@addUIBlock
17
+ }
15
18
  val view = nativeViewHierarchyManager.resolveView(reactTag)
16
19
  if (view is ScreenContainer) {
17
20
  view.performUpdates()
@@ -68,7 +68,7 @@ class BottomSheetDialogRootView(
68
68
  }
69
69
 
70
70
  override fun onChildStartedNativeGesture(
71
- view: View,
71
+ view: View?,
72
72
  event: MotionEvent,
73
73
  ) {
74
74
  jsTouchDispatcher.onChildStartedNativeGesture(event, eventDispatcher)
@@ -92,7 +92,7 @@ class BottomSheetDialogRootView(
92
92
  // need to keep receiving events.
93
93
  }
94
94
 
95
- override fun handleException(throwable: Throwable?) {
95
+ override fun handleException(throwable: Throwable) {
96
96
  // TODO: I need ThemedReactContext here.
97
97
  // TODO: Determine where it is initially created & verify its lifecycle
98
98
  // reactContext?.reactApplicationContext?.handleException(RuntimeException(throwable))
@@ -59,7 +59,8 @@ class DimmingView(
59
59
  y: Float,
60
60
  ) = blockGestures
61
61
 
62
- override fun getPointerEvents(): PointerEvents = if (blockGestures) PointerEvents.AUTO else PointerEvents.NONE
62
+ override val pointerEvents: PointerEvents
63
+ get() = if (blockGestures) PointerEvents.AUTO else PointerEvents.NONE
63
64
 
64
65
  companion object {
65
66
  const val TAG = "DimmingView"
@@ -15,7 +15,7 @@ class GestureTransparentViewGroup(
15
15
  context: Context,
16
16
  ) : FrameLayout(context),
17
17
  ReactPointerEventsView {
18
- override fun getPointerEvents(): PointerEvents = PointerEvents.BOX_NONE
18
+ override val pointerEvents: PointerEvents = PointerEvents.BOX_NONE
19
19
 
20
20
  companion object {
21
21
  const val TAG = "GestureTransparentFrameLayout"
@@ -17,6 +17,7 @@ add_compile_options(
17
17
  -Wall
18
18
  -Wpedantic
19
19
  -Wno-gnu-zero-variadic-macro-arguments
20
+ -Wno-dollar-in-identifier-extension
20
21
  )
21
22
 
22
23
  file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_COMPONENTS_DIR}/*.cpp ${LIB_COMMON_COMPONENTS_DIR}/utils/*.cpp)
@@ -10,7 +10,8 @@
10
10
  package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
13
14
 
14
- public interface RNSScreenContainerManagerInterface<T extends View> {
15
+ public interface RNSScreenContainerManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
15
16
  // No props
16
17
  }
@@ -10,7 +10,8 @@
10
10
  package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
13
14
 
14
- public interface RNSScreenContentWrapperManagerInterface<T extends View> {
15
+ public interface RNSScreenContentWrapperManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
15
16
  // No props
16
17
  }
@@ -10,7 +10,8 @@
10
10
  package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
13
14
 
14
- public interface RNSScreenFooterManagerInterface<T extends View> {
15
+ public interface RNSScreenFooterManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
15
16
  // No props
16
17
  }
@@ -13,8 +13,9 @@ import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
14
  import com.facebook.react.bridge.ReadableArray;
15
15
  import com.facebook.react.bridge.ReadableMap;
16
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
16
17
 
17
- public interface RNSScreenManagerInterface<T extends View> {
18
+ public interface RNSScreenManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
18
19
  void setSheetAllowedDetents(T view, @Nullable ReadableArray value);
19
20
  void setSheetLargestUndimmedDetent(T view, int value);
20
21
  void setSheetGrabberVisible(T view, boolean value);
@@ -11,8 +11,9 @@ package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
14
15
 
15
- public interface RNSScreenStackHeaderConfigManagerInterface<T extends View> {
16
+ public interface RNSScreenStackHeaderConfigManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
16
17
  void setBackgroundColor(T view, @Nullable Integer value);
17
18
  void setBackTitle(T view, @Nullable String value);
18
19
  void setBackTitleFontFamily(T view, @Nullable String value);
@@ -11,7 +11,8 @@ package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
14
15
 
15
- public interface RNSScreenStackHeaderSubviewManagerInterface<T extends View> {
16
+ public interface RNSScreenStackHeaderSubviewManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
16
17
  void setType(T view, @Nullable String value);
17
18
  }
@@ -10,7 +10,8 @@
10
10
  package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
13
14
 
14
- public interface RNSScreenStackManagerInterface<T extends View> {
15
+ public interface RNSScreenStackManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
15
16
  // No props
16
17
  }
@@ -11,8 +11,9 @@ package com.facebook.react.viewmanagers;
11
11
 
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
+ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
14
15
 
15
- public interface RNSSearchBarManagerInterface<T extends View> {
16
+ public interface RNSSearchBarManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
16
17
  void setHideWhenScrolling(T view, boolean value);
17
18
  void setAutoCapitalize(T view, @Nullable String value);
18
19
  void setPlaceholder(T view, @Nullable String value);
@@ -8,7 +8,6 @@
8
8
  #include <react/renderer/components/rnscreens/utils/RectUtil.h>
9
9
  #include <react/renderer/core/ConcreteComponentDescriptor.h>
10
10
  #include "RNSScreenStackHeaderSubviewShadowNode.h"
11
- #include "utils/RectUtil.h"
12
11
 
13
12
  namespace facebook::react {
14
13
 
@@ -10,8 +10,10 @@ std::optional<MountingTransaction> RNSScreenRemovalListener::pullTransaction(
10
10
  for (const ShadowViewMutation &mutation : mutations) {
11
11
  if (mutation.type == ShadowViewMutation::Type::Remove &&
12
12
  mutation.oldChildShadowView.componentName != nullptr &&
13
- strcmp(mutation.parentShadowView.componentName, "RNSScreenStack") ==
14
- 0) {
13
+ strcmp(mutation.oldChildShadowView.componentName, "RNSScreen") == 0) {
14
+ // We call the listener function even if this screen has not been owned
15
+ // by RNSScreenStack as since RN 0.78 we do not have enough information
16
+ // here. This final filter is applied later in NativeProxy.
15
17
  listenerFunction_(mutation.oldChildShadowView.tag);
16
18
  }
17
19
  }
@@ -1232,7 +1232,7 @@ RNS_IGNORE_SUPER_CALL_END
1232
1232
  withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry
1233
1233
  {
1234
1234
  for (const auto &mutation : transaction.getMutations()) {
1235
- if (mutation.parentShadowView.tag == self.tag &&
1235
+ if (mutation.parentTag == self.tag &&
1236
1236
  (mutation.type == react::ShadowViewMutation::Type::Insert ||
1237
1237
  mutation.type == react::ShadowViewMutation::Type::Remove)) {
1238
1238
  // we need to wait until children have their layout set. At this point they don't have the layout
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-screens",
3
- "version": "4.7.0",
3
+ "version": "4.9.0-beta.0",
4
4
  "description": "Native navigation primitives for your React Native app.",
5
5
  "scripts": {
6
6
  "submodules": "git submodule update --init --recursive && (cd react-navigation && yarn && yarn build && cd ../)",
@@ -81,15 +81,15 @@
81
81
  "@react-native-community/cli": "15.0.1",
82
82
  "@react-native-community/cli-platform-android": "15.0.1",
83
83
  "@react-native-community/cli-platform-ios": "15.0.1",
84
- "@react-native/babel-preset": "0.77.0-rc.7",
85
- "@react-native/eslint-config": "0.77.0-rc.7",
86
- "@react-native/metro-config": "0.77.0-rc.7",
87
- "@react-native/typescript-config": "0.77.0-rc.7",
84
+ "@react-native/babel-preset": "0.78.0-rc.5",
85
+ "@react-native/eslint-config": "0.78.0-rc.5",
86
+ "@react-native/metro-config": "0.78.0-rc.5",
87
+ "@react-native/typescript-config": "0.78.0-rc.5",
88
88
  "@react-navigation/native": "^5.8.0",
89
89
  "@react-navigation/stack": "^5.10.0",
90
90
  "@types/jest": "^29.5.13",
91
- "@types/react": "^18.2.72",
92
- "@types/react-test-renderer": "^18.0.0",
91
+ "@types/react": "^19.0.0",
92
+ "@types/react-test-renderer": "^19.0.0",
93
93
  "@typescript-eslint/eslint-plugin": "^6.5.0",
94
94
  "@typescript-eslint/parser": "^6.5.0",
95
95
  "clang-format": "^1.8.0",
@@ -105,15 +105,15 @@
105
105
  "jest": "^29.6.3",
106
106
  "lint-staged": "^14.0.1",
107
107
  "prettier": "^2.8.8",
108
- "react": "18.2.0",
109
- "react-dom": "^18.2.0",
110
- "react-native": "0.77.0-rc.7",
108
+ "react": "^19.0.0",
109
+ "react-dom": "^19.0.0",
110
+ "react-native": "0.78.0-rc.5",
111
111
  "react-native-builder-bob": "^0.23.2",
112
112
  "react-native-gesture-handler": "^2.22.0",
113
113
  "react-native-reanimated": "3.16.7",
114
114
  "react-native-safe-area-context": "5.1.0",
115
115
  "react-native-windows": "^0.64.8",
116
- "react-test-renderer": "^18.2.0",
116
+ "react-test-renderer": "^19.0.0",
117
117
  "release-it": "^15.6.0",
118
118
  "typescript": "5.4.3"
119
119
  },