react-native-screens 4.4.0 → 4.6.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 (53) hide show
  1. package/README.md +7 -14
  2. package/android/build.gradle +9 -8
  3. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +31 -10
  4. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderSubviewViewGroup.kt +51 -0
  5. package/android/src/main/AndroidManifest.xml +1 -2
  6. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +12 -2
  7. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -2
  8. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +0 -26
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +12 -7
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +13 -0
  11. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +3 -2
  12. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +3 -2
  13. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +3 -2
  14. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -2
  15. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -2
  16. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +3 -2
  17. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +3 -2
  18. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +3 -2
  19. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +9 -1
  20. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderSubviewViewGroup.kt +18 -0
  21. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +12 -2
  22. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +12 -0
  23. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +4 -0
  24. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +4 -10
  25. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +15 -9
  26. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +20 -0
  27. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +14 -0
  28. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +2 -0
  29. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +3 -1
  30. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +16 -2
  31. package/ios/RNSScreenStack.mm +11 -7
  32. package/ios/RNSScreenStackHeaderConfig.h +21 -7
  33. package/ios/RNSScreenStackHeaderConfig.mm +74 -15
  34. package/ios/RNSScreenStackHeaderSubview.h +4 -0
  35. package/ios/RNSScreenStackHeaderSubview.mm +26 -1
  36. package/lib/commonjs/components/ScreenStackHeaderConfig.js +0 -1
  37. package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -1
  38. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +12 -0
  39. package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -1
  40. package/lib/commonjs/gesture-handler/defaults.js +1 -2
  41. package/lib/commonjs/gesture-handler/defaults.js.map +1 -1
  42. package/lib/module/components/ScreenStackHeaderConfig.js +0 -1
  43. package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -1
  44. package/lib/module/gesture-handler/ScreenGestureDetector.js +12 -0
  45. package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -1
  46. package/lib/module/gesture-handler/defaults.js +1 -2
  47. package/lib/module/gesture-handler/defaults.js.map +1 -1
  48. package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -1
  49. package/lib/typescript/gesture-handler/defaults.d.ts.map +1 -1
  50. package/package.json +10 -11
  51. package/src/components/ScreenStackHeaderConfig.tsx +0 -1
  52. package/src/gesture-handler/ScreenGestureDetector.tsx +14 -2
  53. package/src/gesture-handler/defaults.ts +0 -1
package/README.md CHANGED
@@ -106,18 +106,17 @@ Screens are already integrated with the React Native's most popular navigation l
106
106
 
107
107
  ## Supported react-native version
108
108
 
109
+ Below we present tables with mapping of the library version to the last supported react-native version. These tables are for the `4.x` line of the library. For compat tables
110
+ of `3.x` line please see consult [readme on the `3.x` branch](https://github.com/software-mansion/react-native-screens/tree/3.x?tab=readme-ov-file#supported-react-native-version).
111
+
109
112
  ### Support for Paper
110
113
 
111
114
  Paper is the default rendering system for React Native versions prior to 0.76.
112
115
 
113
116
  | library version | react-native version |
114
117
  | --------------- | -------------------- |
115
- | 3.33.0+ | 0.72.0+ |
116
- | 3.32.0+ | 0.71.0+ |
117
- | 3.30.0+ | 0.68.0+ |
118
- | 3.14.0+ | 0.64.0+ |
119
- | 3.0.0+ | 0.62.0+ |
120
- | 2.0.0+ | 0.60.0+ |
118
+ | 4.5.0+ | 0.74.0+ |
119
+ | 4.0.0+ | 0.72.0+ |
121
120
 
122
121
  ### Support for Fabric
123
122
 
@@ -127,14 +126,8 @@ Here's a table with summary of supported `react-native` versions when Fabric is
127
126
 
128
127
  | library version | react-native version |
129
128
  | --------------- | -------------------- |
130
- | 3.35.0+ | 0.76.0+ |
131
- | 3.33.0+ | 0.75.0+ |
132
- | 3.32.0+ | 0.74.0+ |
133
- | 3.28.0+ | 0.73.0+ |
134
- | 3.21.0+ | 0.72.0+ |
135
- | 3.19.0+ | 0.71.0+ |
136
- | 3.18.0+ | 0.70.0+ |
137
- | 3.14.0+ | 0.69.0+ |
129
+ | 4.5.0+ | 0.77.0+ |
130
+ | 4.0.0+ | 0.76.0+ |
138
131
 
139
132
  ## Usage with [react-navigation](https://github.com/react-navigation/react-navigation)
140
133
 
@@ -99,13 +99,7 @@ def IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled()
99
99
 
100
100
  android {
101
101
  compileSdkVersion safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion)
102
- def agpVersion = Version.ANDROID_GRADLE_PLUGIN_VERSION
103
- if (agpVersion.tokenize('.')[0].toInteger() >= 7) {
104
- namespace "com.swmansion.rnscreens"
105
- buildFeatures {
106
- buildConfig true
107
- }
108
- }
102
+ namespace "com.swmansion.rnscreens"
109
103
 
110
104
  // Used to override the NDK path/version on internal CI or by allowing
111
105
  // users to customize the NDK path/version from their root project (e.g. for M1 support)
@@ -134,6 +128,7 @@ android {
134
128
  }
135
129
  buildFeatures {
136
130
  prefab true
131
+ buildConfig true
137
132
  }
138
133
  externalNativeBuild {
139
134
  cmake {
@@ -159,7 +154,13 @@ android {
159
154
  "**/libc++_shared.so",
160
155
  "**/libreact_render*.so",
161
156
  "**/libreactnativejni.so",
162
- "**/libreact_performance_timeline.so"
157
+ "**/libreact_performance_timeline.so",
158
+ // In 0.76 multiple react-native's libraries were merged and these are the main new artifacts we're using.
159
+ // Some of above lib* names could be removed after we remove support for 0.76.
160
+ // https://github.com/facebook/react-native/pull/43909
161
+ // https://github.com/facebook/react-native/pull/46059
162
+ "**/libfbjni.so",
163
+ "**/libreactnative.so"
163
164
  ]
164
165
  }
165
166
  sourceSets.main {
@@ -14,6 +14,8 @@ abstract class FabricEnabledHeaderConfigViewGroup(
14
14
  ) : ViewGroup(context) {
15
15
  private var mStateWrapper: StateWrapper? = null
16
16
 
17
+ private var lastWidth = 0f
18
+ private var lastHeight = 0f
17
19
  private var lastPaddingStart = 0f
18
20
  private var lastPaddingEnd = 0f
19
21
 
@@ -21,36 +23,55 @@ abstract class FabricEnabledHeaderConfigViewGroup(
21
23
  mStateWrapper = wrapper
22
24
  }
23
25
 
24
- fun updatePaddingsFabric(
26
+ fun updatePaddings(
25
27
  paddingStart: Int,
26
28
  paddingEnd: Int,
27
29
  ) {
28
- updateState(paddingStart, paddingEnd)
30
+ // Do nothing on Fabric. This method is used only on Paper.
31
+ }
32
+
33
+ fun updateHeaderConfigState(
34
+ width: Int,
35
+ height: Int,
36
+ paddingStart: Int,
37
+ paddingEnd: Int,
38
+ ) {
39
+ updateState(width, height, paddingStart, paddingEnd)
29
40
  }
30
41
 
31
42
  @UiThread
32
43
  fun updateState(
44
+ width: Int,
45
+ height: Int,
33
46
  paddingStart: Int,
34
47
  paddingEnd: Int,
35
48
  ) {
36
- val paddingStartDip: Float = PixelUtil.toDIPFromPixel(paddingStart.toFloat())
37
- val paddingEndDip: Float = PixelUtil.toDIPFromPixel(paddingEnd.toFloat())
49
+ val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat())
50
+ val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat())
51
+ val realPaddingStart: Float = PixelUtil.toDIPFromPixel(paddingStart.toFloat())
52
+ val realPaddingEnd: Float = PixelUtil.toDIPFromPixel(paddingEnd.toFloat())
38
53
 
39
54
  // Check incoming state values. If they're already the correct value, return early to prevent
40
55
  // infinite UpdateState/SetState loop.
41
- if (abs(lastPaddingStart - paddingStart) < DELTA &&
42
- abs(lastPaddingEnd - paddingEnd) < DELTA
56
+ if (abs(lastWidth - realWidth) < DELTA &&
57
+ abs(lastHeight - realHeight) < DELTA &&
58
+ abs(lastPaddingStart - realPaddingStart) < DELTA &&
59
+ abs(lastPaddingEnd - realPaddingEnd) < DELTA
43
60
  ) {
44
61
  return
45
62
  }
46
63
 
47
- lastPaddingStart = paddingStartDip
48
- lastPaddingEnd = paddingEndDip
64
+ lastWidth = realWidth
65
+ lastHeight = realHeight
66
+ lastPaddingStart = realPaddingStart
67
+ lastPaddingEnd = realPaddingEnd
49
68
 
50
69
  val map: WritableMap =
51
70
  WritableNativeMap().apply {
52
- putDouble("paddingStart", paddingStartDip.toDouble())
53
- putDouble("paddingEnd", paddingEndDip.toDouble())
71
+ putDouble("frameWidth", realWidth.toDouble())
72
+ putDouble("frameHeight", realHeight.toDouble())
73
+ putDouble("paddingStart", realPaddingStart.toDouble())
74
+ putDouble("paddingEnd", realPaddingEnd.toDouble())
54
75
  }
55
76
  mStateWrapper?.updateState(map)
56
77
  }
@@ -0,0 +1,51 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.content.Context
4
+ import android.view.ViewGroup
5
+ import androidx.annotation.UiThread
6
+ import com.facebook.react.bridge.WritableMap
7
+ import com.facebook.react.bridge.WritableNativeMap
8
+ import com.facebook.react.uimanager.PixelUtil
9
+ import com.facebook.react.uimanager.StateWrapper
10
+
11
+ abstract class FabricEnabledHeaderSubviewViewGroup(
12
+ context: Context?,
13
+ ) : ViewGroup(context) {
14
+ private var mStateWrapper: StateWrapper? = null
15
+
16
+ fun setStateWrapper(wrapper: StateWrapper?) {
17
+ mStateWrapper = wrapper
18
+ }
19
+
20
+ protected fun updateSubviewFrameState(
21
+ width: Int,
22
+ height: Int,
23
+ offsetX: Int,
24
+ offsetY: Int,
25
+ ) {
26
+ updateState(width, height, offsetX, offsetY)
27
+ }
28
+
29
+ @UiThread
30
+ fun updateState(
31
+ width: Int,
32
+ height: Int,
33
+ offsetX: Int,
34
+ offsetY: Int,
35
+ ) {
36
+ val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat())
37
+ val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat())
38
+ val offsetXDip: Float = PixelUtil.toDIPFromPixel(offsetX.toFloat())
39
+ val offsetYDip: Float = PixelUtil.toDIPFromPixel(offsetY.toFloat())
40
+
41
+ val map: WritableMap =
42
+ WritableNativeMap().apply {
43
+ putDouble("frameWidth", realWidth.toDouble())
44
+ putDouble("frameHeight", realHeight.toDouble())
45
+ putDouble("contentOffsetX", offsetXDip.toDouble())
46
+ putDouble("contentOffsetY", offsetYDip.toDouble())
47
+ }
48
+
49
+ mStateWrapper?.updateState(map)
50
+ }
51
+ }
@@ -1,5 +1,4 @@
1
1
 
2
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
- package="com.swmansion.rnscreens">
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
4
3
 
5
4
  </manifest>
@@ -68,8 +68,18 @@ open class CustomToolbar(
68
68
  ) {
69
69
  super.onLayout(changed, l, t, r, b)
70
70
 
71
- // our children are already laid out
71
+ if (!changed) {
72
+ return
73
+ }
74
+
72
75
  val contentInsetStart = if (navigationIcon != null) contentInsetStartWithNavigation else contentInsetStart
73
- config.updatePaddingsFabric(contentInsetStart, contentInsetEnd)
76
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
77
+ val width = r - l;
78
+ val height = b - t;
79
+ config.updateHeaderConfigState(width, height, contentInsetStart, contentInsetEnd)
80
+ } else {
81
+ // our children are already laid out
82
+ config.updatePaddings(contentInsetStart, contentInsetEnd)
83
+ }
74
84
  }
75
85
  }
@@ -1,6 +1,6 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
- import com.facebook.react.TurboReactPackage
3
+ import com.facebook.react.BaseReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.module.annotations.ReactModuleList
@@ -9,12 +9,14 @@ import com.facebook.react.module.model.ReactModuleInfoProvider
9
9
  import com.facebook.react.uimanager.ViewManager
10
10
  import com.swmansion.rnscreens.utils.ScreenDummyLayoutHelper
11
11
 
12
+ // Fool autolinking for older versions that do not support BaseReactPackage.
13
+ // public class RNScreensPackage implements TurboReactPackage {
12
14
  @ReactModuleList(
13
15
  nativeModules = [
14
16
  ScreensModule::class,
15
17
  ],
16
18
  )
17
- class RNScreensPackage : TurboReactPackage() {
19
+ class RNScreensPackage : BaseReactPackage() {
18
20
  // We just retain it here. This object helps us tackle jumping content when using native header.
19
21
  // See: https://github.com/software-mansion/react-native-screens/pull/2169
20
22
  private var screenDummyLayoutHelper: ScreenDummyLayoutHelper? = null
@@ -17,12 +17,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
17
17
  import com.facebook.react.bridge.GuardedRunnable
18
18
  import com.facebook.react.bridge.ReactContext
19
19
  import com.facebook.react.uimanager.PixelUtil
20
- import com.facebook.react.uimanager.ReactClippingViewGroup
21
20
  import com.facebook.react.uimanager.UIManagerHelper
22
21
  import com.facebook.react.uimanager.UIManagerModule
23
22
  import com.facebook.react.uimanager.events.EventDispatcher
24
- import com.facebook.react.views.scroll.ReactHorizontalScrollView
25
- import com.facebook.react.views.scroll.ReactScrollView
26
23
  import com.google.android.material.bottomsheet.BottomSheetBehavior
27
24
  import com.google.android.material.shape.CornerFamily
28
25
  import com.google.android.material.shape.MaterialShapeDrawable
@@ -404,29 +401,6 @@ class Screen(
404
401
  }
405
402
 
406
403
  if (child is ViewGroup) {
407
- // The children are miscounted when there's removeClippedSubviews prop
408
- // set to true (which is the default for FlatLists).
409
- // Unless the child is a ScrollView it's safe to assume that it's true
410
- // and add a simple view for each possibly clipped item to make it work as expected.
411
- // See https://github.com/software-mansion/react-native-screens/pull/2495
412
-
413
- if (child is ReactClippingViewGroup &&
414
- child.removeClippedSubviews &&
415
- child !is ReactScrollView &&
416
- child !is ReactHorizontalScrollView
417
- ) {
418
- // We need to workaround the issue until our changes land in core.
419
- // Some views do not accept any children or have set amount and they throw
420
- // when we want to brute-forcefully manipulate that.
421
- // Is this ugly? Very. Do we have better option before changes land in core?
422
- // I'm not aware of any.
423
- try {
424
- for (j in 0 until child.childCount) {
425
- child.addView(View(context))
426
- }
427
- } catch (_: Exception) {
428
- }
429
- }
430
404
  startTransitionRecursive(child)
431
405
  }
432
406
  }
@@ -3,12 +3,11 @@ package com.swmansion.rnscreens
3
3
  import android.annotation.SuppressLint
4
4
  import android.view.View
5
5
  import com.facebook.react.bridge.ReactContext
6
- import com.facebook.react.views.view.ReactViewGroup
7
6
 
8
7
  @SuppressLint("ViewConstructor")
9
8
  class ScreenStackHeaderSubview(
10
9
  context: ReactContext?,
11
- ) : ReactViewGroup(context) {
10
+ ) : FabricEnabledHeaderSubviewViewGroup(context) {
12
11
  private var reactWidth = 0
13
12
  private var reactHeight = 0
14
13
  var type = Type.RIGHT
@@ -37,11 +36,17 @@ class ScreenStackHeaderSubview(
37
36
 
38
37
  override fun onLayout(
39
38
  changed: Boolean,
40
- left: Int,
41
- top: Int,
42
- right: Int,
43
- bottom: Int,
44
- ) = Unit
39
+ l: Int,
40
+ t: Int,
41
+ r: Int,
42
+ b: Int,
43
+ ) {
44
+ if (changed && BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
45
+ val width = r - l
46
+ val height = b - t
47
+ updateSubviewFrameState(width, height, l, t)
48
+ }
49
+ }
45
50
 
46
51
  enum class Type {
47
52
  LEFT,
@@ -2,6 +2,8 @@ package com.swmansion.rnscreens
2
2
 
3
3
  import com.facebook.react.bridge.JSApplicationIllegalArgumentException
4
4
  import com.facebook.react.module.annotations.ReactModule
5
+ import com.facebook.react.uimanager.ReactStylesDiffMap
6
+ import com.facebook.react.uimanager.StateWrapper
5
7
  import com.facebook.react.uimanager.ThemedReactContext
6
8
  import com.facebook.react.uimanager.ViewGroupManager
7
9
  import com.facebook.react.uimanager.ViewManagerDelegate
@@ -39,6 +41,17 @@ class ScreenStackHeaderSubviewManager :
39
41
  }
40
42
  }
41
43
 
44
+ override fun updateState(
45
+ view: ScreenStackHeaderSubview,
46
+ props: ReactStylesDiffMap?,
47
+ stateWrapper: StateWrapper?
48
+ ): Any? {
49
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
50
+ view.setStateWrapper(stateWrapper)
51
+ }
52
+ return super.updateState(view, props, stateWrapper)
53
+ }
54
+
42
55
  protected override fun getDelegate(): ViewManagerDelegate<ScreenStackHeaderSubview> = delegate
43
56
 
44
57
  companion object {
@@ -11,10 +11,11 @@ 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.BaseViewManager;
14
15
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
- import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+ import com.facebook.react.uimanager.LayoutShadowNode;
16
17
 
17
- public class RNSScreenContainerManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenContainerManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public class RNSScreenContainerManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenContainerManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
19
  public RNSScreenContainerManagerDelegate(U viewManager) {
19
20
  super(viewManager);
20
21
  }
@@ -11,10 +11,11 @@ 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.BaseViewManager;
14
15
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
- import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+ import com.facebook.react.uimanager.LayoutShadowNode;
16
17
 
17
- public class RNSScreenContentWrapperManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenContentWrapperManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public class RNSScreenContentWrapperManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenContentWrapperManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
19
  public RNSScreenContentWrapperManagerDelegate(U viewManager) {
19
20
  super(viewManager);
20
21
  }
@@ -11,10 +11,11 @@ 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.BaseViewManager;
14
15
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
- import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+ import com.facebook.react.uimanager.LayoutShadowNode;
16
17
 
17
- public class RNSScreenFooterManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenFooterManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public class RNSScreenFooterManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenFooterManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
19
  public RNSScreenFooterManagerDelegate(U viewManager) {
19
20
  super(viewManager);
20
21
  }
@@ -14,10 +14,11 @@ import androidx.annotation.Nullable;
14
14
  import com.facebook.react.bridge.ColorPropConverter;
15
15
  import com.facebook.react.bridge.ReadableArray;
16
16
  import com.facebook.react.bridge.ReadableMap;
17
+ import com.facebook.react.uimanager.BaseViewManager;
17
18
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
18
- import com.facebook.react.uimanager.BaseViewManagerInterface;
19
+ import com.facebook.react.uimanager.LayoutShadowNode;
19
20
 
20
- public class RNSScreenManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
21
+ public class RNSScreenManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
21
22
  public RNSScreenManagerDelegate(U viewManager) {
22
23
  super(viewManager);
23
24
  }
@@ -12,10 +12,11 @@ package com.facebook.react.viewmanagers;
12
12
  import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
14
  import com.facebook.react.bridge.ColorPropConverter;
15
+ import com.facebook.react.uimanager.BaseViewManager;
15
16
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
16
- import com.facebook.react.uimanager.BaseViewManagerInterface;
17
+ import com.facebook.react.uimanager.LayoutShadowNode;
17
18
 
18
- public class RNSScreenStackHeaderConfigManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenStackHeaderConfigManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
19
+ public class RNSScreenStackHeaderConfigManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenStackHeaderConfigManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
19
20
  public RNSScreenStackHeaderConfigManagerDelegate(U viewManager) {
20
21
  super(viewManager);
21
22
  }
@@ -11,10 +11,11 @@ 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.BaseViewManager;
14
15
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
- import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+ import com.facebook.react.uimanager.LayoutShadowNode;
16
17
 
17
- public class RNSScreenStackHeaderSubviewManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenStackHeaderSubviewManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public class RNSScreenStackHeaderSubviewManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenStackHeaderSubviewManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
19
  public RNSScreenStackHeaderSubviewManagerDelegate(U viewManager) {
19
20
  super(viewManager);
20
21
  }
@@ -11,10 +11,11 @@ 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.BaseViewManager;
14
15
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
15
- import com.facebook.react.uimanager.BaseViewManagerInterface;
16
+ import com.facebook.react.uimanager.LayoutShadowNode;
16
17
 
17
- public class RNSScreenStackManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSScreenStackManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
+ public class RNSScreenStackManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSScreenStackManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18
19
  public RNSScreenStackManagerDelegate(U viewManager) {
19
20
  super(viewManager);
20
21
  }
@@ -13,10 +13,11 @@ import android.view.View;
13
13
  import androidx.annotation.Nullable;
14
14
  import com.facebook.react.bridge.ColorPropConverter;
15
15
  import com.facebook.react.bridge.ReadableArray;
16
+ import com.facebook.react.uimanager.BaseViewManager;
16
17
  import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
- import com.facebook.react.uimanager.BaseViewManagerInterface;
18
+ import com.facebook.react.uimanager.LayoutShadowNode;
18
19
 
19
- public class RNSSearchBarManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNSSearchBarManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
+ public class RNSSearchBarManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNSSearchBarManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
21
  public RNSSearchBarManagerDelegate(U viewManager) {
21
22
  super(viewManager);
22
23
  }
@@ -16,7 +16,15 @@ abstract class FabricEnabledHeaderConfigViewGroup(
16
16
 
17
17
  fun setStateWrapper(wrapper: StateWrapper?) = Unit
18
18
 
19
- fun updatePaddingsFabric(
19
+ // Do nothing on Paper. This method is used only on Fabric.
20
+ fun updateHeaderConfigState(
21
+ width: Int,
22
+ height: Int,
23
+ paddingStart: Int,
24
+ paddingEnd: Int,
25
+ ) = Unit
26
+
27
+ fun updatePaddings(
20
28
  paddingStart: Int,
21
29
  paddingEnd: Int,
22
30
  ) {
@@ -0,0 +1,18 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.content.Context
4
+ import android.view.ViewGroup
5
+ import com.facebook.react.uimanager.StateWrapper
6
+
7
+ abstract class FabricEnabledHeaderSubviewViewGroup(context: Context?): ViewGroup(context) {
8
+
9
+ fun setStateWrapper(wrapper: StateWrapper?) = Unit
10
+
11
+ // Fabric only
12
+ protected fun updateSubviewFrameState(
13
+ width: Int,
14
+ height: Int,
15
+ offsetX: Int,
16
+ offsetY: Int
17
+ ) = Unit
18
+ }
@@ -34,8 +34,18 @@ class RNSScreenStackHeaderConfigComponentDescriptor final
34
34
  shadowNode.getState());
35
35
  auto stateData = state->getData();
36
36
 
37
- layoutableShadowNode.setPadding(
38
- {stateData.getPaddingStart(), 0, stateData.getPaddingEnd(), 0});
37
+ if (stateData.frameSize.width != 0 && stateData.frameSize.height != 0) {
38
+ layoutableShadowNode.setSize(
39
+ {stateData.frameSize.width, stateData.frameSize.height});
40
+ #ifdef ANDROID
41
+ layoutableShadowNode.setPadding({
42
+ stateData.paddingStart,
43
+ 0,
44
+ stateData.paddingEnd,
45
+ 0,
46
+ });
47
+ #endif // ANDROID
48
+ }
39
49
 
40
50
  ConcreteComponentDescriptor::adopt(shadowNode);
41
51
  #if !defined(ANDROID) && !defined(NDEBUG)
@@ -5,6 +5,18 @@ namespace facebook::react {
5
5
  extern const char RNSScreenStackHeaderConfigComponentName[] =
6
6
  "RNSScreenStackHeaderConfig";
7
7
 
8
+ void RNSScreenStackHeaderConfigShadowNode::layout(LayoutContext layoutContext) {
9
+ YogaLayoutableShadowNode::layout(layoutContext);
10
+ applyFrameCorrections();
11
+ }
12
+
13
+ void RNSScreenStackHeaderConfigShadowNode::applyFrameCorrections() {
14
+ ensureUnsealed();
15
+
16
+ const auto &stateData = getStateData();
17
+ layoutMetrics_.frame.origin.y = -stateData.frameSize.height;
18
+ }
19
+
8
20
  #if !defined(ANDROID) && !defined(NDEBUG)
9
21
  void RNSScreenStackHeaderConfigShadowNode::setImageLoader(
10
22
  std::weak_ptr<void> imageLoader) {
@@ -25,13 +25,17 @@ class JSI_EXPORT RNSScreenStackHeaderConfigShadowNode final
25
25
  using StateData = ConcreteViewShadowNode::ConcreteStateData;
26
26
 
27
27
  #pragma mark - ShadowNode overrides
28
+ void layout(LayoutContext layoutContext) override;
28
29
 
29
30
  #pragma mark - Custom interface
31
+
30
32
  #if !defined(ANDROID) && !defined(NDEBUG)
31
33
  void setImageLoader(std::weak_ptr<void> imageLoader);
32
34
  #endif // !ANDROID && !NDEBUG
33
35
 
34
36
  private:
37
+ void applyFrameCorrections();
38
+
35
39
  #if !defined(ANDROID) && !defined(NDEBUG)
36
40
  StateData &getStateDataMutable();
37
41
  #endif // !ANDROID && !NDEBUG
@@ -1,3 +1,4 @@
1
+
1
2
  #include "RNSScreenStackHeaderConfigState.h"
2
3
 
3
4
  namespace facebook {
@@ -5,8 +6,9 @@ namespace react {
5
6
 
6
7
  #ifdef ANDROID
7
8
  folly::dynamic RNSScreenStackHeaderConfigState::getDynamic() const {
8
- return folly::dynamic::object("paddingStart", paddingStart_)(
9
- "paddingEnd_", paddingEnd_);
9
+ return folly::dynamic::object("frameWidth", frameSize.width)(
10
+ "frameHeight", frameSize.height)("paddingStart", paddingStart)(
11
+ "paddingEnd", paddingEnd);
10
12
  }
11
13
  #else // ANDROID
12
14
  #ifndef NDEBUG
@@ -22,13 +24,5 @@ std::weak_ptr<void> RNSScreenStackHeaderConfigState::getImageLoader()
22
24
  #endif // !NDEBUG
23
25
  #endif // ANDROID
24
26
 
25
- Float RNSScreenStackHeaderConfigState::getPaddingStart() const noexcept {
26
- return paddingStart_;
27
- }
28
-
29
- Float RNSScreenStackHeaderConfigState::getPaddingEnd() const noexcept {
30
- return paddingEnd_;
31
- }
32
-
33
27
  } // namespace react
34
28
  } // namespace facebook