react-native-screens 4.1.0 → 4.3.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 (40) hide show
  1. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +52 -13
  2. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -0
  3. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +27 -8
  4. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +16 -4
  5. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +0 -1
  6. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +2 -2
  7. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +0 -24
  8. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +1 -1
  9. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +5 -0
  10. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +14 -0
  11. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +8 -0
  12. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +12 -1
  13. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +9 -2
  14. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +1 -1
  15. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +1 -1
  16. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +0 -1
  17. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +1 -1
  18. package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +1 -2
  19. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +1 -1
  20. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +2 -2
  21. package/ios/RNSScreenStack.mm +1 -10
  22. package/ios/RNSScreenStackHeaderConfig.mm +62 -30
  23. package/ios/RNSScreenStackHeaderSubview.h +0 -7
  24. package/ios/RNSScreenStackHeaderSubview.mm +2 -24
  25. package/ios/events/RNSHeaderHeightChangeEvent.h +0 -1
  26. package/ios/events/RNSScreenViewEvent.h +0 -1
  27. package/lib/commonjs/components/ScreenFooter.js +9 -0
  28. package/lib/commonjs/components/ScreenFooter.js.map +1 -1
  29. package/lib/commonjs/components/ScreenStackItem.js +4 -1
  30. package/lib/commonjs/components/ScreenStackItem.js.map +1 -1
  31. package/lib/module/components/ScreenFooter.js +8 -0
  32. package/lib/module/components/ScreenFooter.js.map +1 -1
  33. package/lib/module/components/ScreenStackItem.js +4 -1
  34. package/lib/module/components/ScreenStackItem.js.map +1 -1
  35. package/lib/typescript/components/ScreenFooter.d.ts +4 -0
  36. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -1
  37. package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/src/components/ScreenFooter.tsx +8 -0
  40. package/src/components/ScreenStackItem.tsx +7 -0
@@ -1,12 +1,15 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
+ import android.util.Log
3
4
  import android.view.View
4
5
  import androidx.core.view.OnApplyWindowInsetsListener
5
6
  import androidx.core.view.ViewCompat
6
7
  import androidx.core.view.WindowInsetsCompat
8
+ import com.facebook.react.bridge.LifecycleEventListener
9
+ import com.facebook.react.bridge.ReactApplicationContext
7
10
  import java.lang.ref.WeakReference
8
11
 
9
- object InsetsObserverProxy : OnApplyWindowInsetsListener {
12
+ object InsetsObserverProxy : OnApplyWindowInsetsListener, LifecycleEventListener {
10
13
  private val listeners: ArrayList<OnApplyWindowInsetsListener> = arrayListOf()
11
14
  private var eventSourceView: WeakReference<View> = WeakReference(null)
12
15
 
@@ -15,18 +18,23 @@ object InsetsObserverProxy : OnApplyWindowInsetsListener {
15
18
  // whether this observer has been initially registered.
16
19
  private var hasBeenRegistered: Boolean = false
17
20
 
21
+ // Mainly debug variable to log warnings in case we missed some code path regarding
22
+ // context lifetime handling.
23
+ private var isObservingContextLifetime: Boolean = false
24
+
18
25
  private var shouldForwardInsetsToView = true
19
26
 
27
+ // Allow only when we have not been registered yet or the view we're observing has been
28
+ // invalidated due to some lifecycle we have not observed.
29
+ private val allowRegistration get() = !hasBeenRegistered || eventSourceView.get() == null
30
+
20
31
  override fun onApplyWindowInsets(
21
32
  v: View,
22
33
  insets: WindowInsetsCompat,
23
34
  ): WindowInsetsCompat {
24
35
  var rollingInsets =
25
36
  if (shouldForwardInsetsToView) {
26
- WindowInsetsCompat.toWindowInsetsCompat(
27
- v.onApplyWindowInsets(insets.toWindowInsets()),
28
- v,
29
- )
37
+ ViewCompat.onApplyWindowInsets(v, insets)
30
38
  } else {
31
39
  insets
32
40
  }
@@ -37,6 +45,34 @@ object InsetsObserverProxy : OnApplyWindowInsetsListener {
37
45
  return rollingInsets
38
46
  }
39
47
 
48
+ // Call this method to ensure that the observer proxy is
49
+ // unregistered when apps is destroyed or we change activity.
50
+ fun registerWithContext(context: ReactApplicationContext) {
51
+ if (isObservingContextLifetime) {
52
+ Log.w(
53
+ "[RNScreens]",
54
+ "InsetObserverProxy registers on new context while it has not been invalidated on the old one. Please report this as issue at https://github.com/software-mansion/react-native-screens/issues",
55
+ )
56
+ }
57
+
58
+ isObservingContextLifetime = true
59
+ context.addLifecycleEventListener(this)
60
+ }
61
+
62
+ override fun onHostResume() = Unit
63
+
64
+ override fun onHostPause() = Unit
65
+
66
+ override fun onHostDestroy() {
67
+ val observedView = getObservedView()
68
+ if (hasBeenRegistered && observedView != null) {
69
+ ViewCompat.setOnApplyWindowInsetsListener(observedView, null)
70
+ hasBeenRegistered = false
71
+ eventSourceView.clear()
72
+ }
73
+ isObservingContextLifetime = false
74
+ }
75
+
40
76
  fun addOnApplyWindowInsetsListener(listener: OnApplyWindowInsetsListener) {
41
77
  listeners.add(listener)
42
78
  }
@@ -45,20 +81,23 @@ object InsetsObserverProxy : OnApplyWindowInsetsListener {
45
81
  listeners.remove(listener)
46
82
  }
47
83
 
48
- fun registerOnView(view: View) {
49
- if (!hasBeenRegistered) {
84
+ /**
85
+ * @return boolean whether the proxy registered as a listener on a view
86
+ */
87
+ fun registerOnView(view: View): Boolean {
88
+ if (allowRegistration) {
50
89
  ViewCompat.setOnApplyWindowInsetsListener(view, this)
51
90
  eventSourceView = WeakReference(view)
52
91
  hasBeenRegistered = true
53
- } else if (getObservedView() != view) {
54
- throw IllegalStateException(
55
- "[RNScreens] Attempt to register InsetsObserverProxy on $view while it has been already registered on ${getObservedView()}",
56
- )
92
+ return true
57
93
  }
94
+ return false
58
95
  }
59
96
 
60
- fun unregisterOnView(view: View) {
61
- ViewCompat.setOnApplyWindowInsetsListener(view, null)
97
+ fun unregister() {
98
+ getObservedView()?.takeIf { hasBeenRegistered }?.let {
99
+ ViewCompat.setOnApplyWindowInsetsListener(it, null)
100
+ }
62
101
  }
63
102
 
64
103
  private fun getObservedView(): View? = eventSourceView.get()
@@ -29,6 +29,10 @@ class RNScreensPackage : TurboReactPackage() {
29
29
  screenDummyLayoutHelper = ScreenDummyLayoutHelper(reactContext)
30
30
  }
31
31
 
32
+ // Proxy needs to register for lifecycle events in order to unregister itself
33
+ // on activity restarts.
34
+ InsetsObserverProxy.registerWithContext(reactContext)
35
+
32
36
  return listOf<ViewManager<*, *>>(
33
37
  ScreenContainerViewManager(),
34
38
  ScreenViewManager(),
@@ -17,16 +17,18 @@ 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
20
21
  import com.facebook.react.uimanager.UIManagerHelper
21
22
  import com.facebook.react.uimanager.UIManagerModule
22
23
  import com.facebook.react.uimanager.events.EventDispatcher
24
+ import com.facebook.react.views.scroll.ReactHorizontalScrollView
25
+ import com.facebook.react.views.scroll.ReactScrollView
23
26
  import com.google.android.material.bottomsheet.BottomSheetBehavior
24
27
  import com.google.android.material.shape.CornerFamily
25
28
  import com.google.android.material.shape.MaterialShapeDrawable
26
29
  import com.google.android.material.shape.ShapeAppearanceModel
27
30
  import com.swmansion.rnscreens.events.HeaderHeightChangeEvent
28
31
  import com.swmansion.rnscreens.events.SheetDetentChangedEvent
29
- import com.swmansion.rnscreens.ext.isInsideScrollViewWithRemoveClippedSubviews
30
32
  import java.lang.ref.WeakReference
31
33
 
32
34
  @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
@@ -382,6 +384,7 @@ class Screen(
382
384
  parent?.let {
383
385
  for (i in 0 until it.childCount) {
384
386
  val child = it.getChildAt(i)
387
+
385
388
  if (parent is SwipeRefreshLayout && child is ImageView) {
386
389
  // SwipeRefreshLayout class which has CircleImageView as a child,
387
390
  // does not handle `startViewTransition` properly.
@@ -393,19 +396,35 @@ class Screen(
393
396
  } else {
394
397
  child?.let { view -> it.startViewTransition(view) }
395
398
  }
399
+
396
400
  if (child is ScreenStackHeaderConfig) {
397
401
  // we want to start transition on children of the toolbar too,
398
402
  // which is not a child of ScreenStackHeaderConfig
399
403
  startTransitionRecursive(child.toolbar)
400
404
  }
405
+
401
406
  if (child is ViewGroup) {
402
- // The children are miscounted when there's a FlatList with
403
- // removeClippedSubviews set to true (default).
404
- // We add a simple view for each item in the list to make it work as expected.
405
- // See https://github.com/software-mansion/react-native-screens/pull/2383
406
- if (child.isInsideScrollViewWithRemoveClippedSubviews()) {
407
- for (j in 0 until child.childCount) {
408
- child.addView(View(context))
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) {
409
428
  }
410
429
  }
411
430
  startTransitionRecursive(child)
@@ -35,6 +35,7 @@ class ScreenFooter(
35
35
  private val sheetBehavior
36
36
  get() = requireScreenParent().sheetBehavior
37
37
 
38
+ private val hasReceivedInitialLayoutFromParent get() = lastContainerHeight > 0
38
39
 
39
40
  // Due to Android restrictions on layout flow, particularly
40
41
  // the fact that onMeasure must set `measuredHeight` & `measuredWidth` React calls `measure` on every
@@ -92,9 +93,10 @@ class ScreenFooter(
92
93
  }
93
94
 
94
95
  init {
95
- val rootView = checkNotNull(reactContext.currentActivity) {
96
- "[RNScreens] Context detached from activity while creating ScreenFooter"
97
- }.window.decorView
96
+ val rootView =
97
+ checkNotNull(reactContext.currentActivity) {
98
+ "[RNScreens] Context detached from activity while creating ScreenFooter"
99
+ }.window.decorView
98
100
 
99
101
  // Note that we do override insets animation on given view. I can see it interfering e.g.
100
102
  // with reanimated keyboard or even other places in our code. Need to test this.
@@ -115,6 +117,9 @@ class ScreenFooter(
115
117
  bottom: Int,
116
118
  ) {
117
119
  super.onLayout(changed, left, top, right, bottom)
120
+ if (!hasReceivedInitialLayoutFromParent) {
121
+ return
122
+ }
118
123
  layoutFooterOnYAxis(
119
124
  lastContainerHeight,
120
125
  bottom - top,
@@ -219,11 +224,18 @@ class ScreenFooter(
219
224
  *
220
225
  * This method should not be used for sheet in stable state.
221
226
  *
227
+ * Currently the implementation assumes that the Screen's (sheet's) container starts at y: 0
228
+ * in global coordinates. Then we can use simply sheet's top. If that is for some reason
229
+ * unavailable, then we fallback to interpolation basing on values provided by sheet behaviour.
230
+ *
231
+ * We don't want to primarily rely on interpolation, because due to division rounding errors the footer
232
+ * will "flicker" (jump up / down a single pixel).
233
+ *
222
234
  * @param slideOffset sheet offset as reported by [BottomSheetCallback.onSlide]
223
235
  * @return position of sheet's top **relative to container**
224
236
  */
225
237
  private fun sheetTopWhileDragging(slideOffset: Float): Int =
226
- MathUtils
238
+ screenParent?.top ?: MathUtils
227
239
  .lerp(
228
240
  sheetTopInStableState(STATE_COLLAPSED).toFloat(),
229
241
  sheetTopInStableState(
@@ -163,7 +163,6 @@ object ScreenWindowTraits {
163
163
  InsetsObserverProxy.registerOnView(decorView)
164
164
  InsetsObserverProxy.addOnApplyWindowInsetsListener(windowInsetsListener)
165
165
  } else {
166
- InsetsObserverProxy.unregisterOnView(decorView)
167
166
  InsetsObserverProxy.removeOnApplyWindowInsetsListener(windowInsetsListener)
168
167
  }
169
168
  ViewCompat.requestApplyInsets(decorView)
@@ -208,7 +208,7 @@ class DimmingFragment(
208
208
  override fun onStart() {
209
209
  // This is the earliest we can access child fragment manager & present another fragment
210
210
  super.onStart()
211
- insetsProxy.registerOnView(requireRootView())
211
+ insetsProxy.registerOnView(requireDecorView())
212
212
  presentNestedFragment()
213
213
  }
214
214
 
@@ -307,7 +307,7 @@ class DimmingFragment(
307
307
  }
308
308
  }
309
309
 
310
- private fun requireRootView(): View =
310
+ private fun requireDecorView(): View =
311
311
  checkNotNull(screen.reactContext.currentActivity) { "[RNScreens] Attempt to access activity on detached context" }
312
312
  .window.decorView
313
313
 
@@ -3,9 +3,6 @@ package com.swmansion.rnscreens.ext
3
3
  import android.graphics.drawable.ColorDrawable
4
4
  import android.view.View
5
5
  import android.view.ViewGroup
6
- import com.facebook.react.views.scroll.ReactHorizontalScrollView
7
- import com.facebook.react.views.scroll.ReactScrollView
8
- import com.swmansion.rnscreens.ScreenStack
9
6
 
10
7
  internal fun View.parentAsView() = this.parent as? View
11
8
 
@@ -33,24 +30,3 @@ internal fun View.maybeBgColor(): Int? {
33
30
  }
34
31
  return null
35
32
  }
36
-
37
- internal fun View.isInsideScrollViewWithRemoveClippedSubviews(): Boolean {
38
- if (this is ReactHorizontalScrollView || this is ReactScrollView) {
39
- return false
40
- }
41
- var parentView = this.parent
42
- while (parentView is ViewGroup && parentView !is ScreenStack) {
43
- when (parentView) {
44
- is ReactHorizontalScrollView -> {
45
- return parentView.removeClippedSubviews
46
- }
47
- is ReactScrollView -> {
48
- return parentView.removeClippedSubviews
49
- }
50
- else -> {
51
- parentView = parentView.parent
52
- }
53
- }
54
- }
55
- return false
56
- }
@@ -2,7 +2,7 @@
2
2
 
3
3
  #ifdef ANDROID
4
4
  #include <fbjni/fbjni.h>
5
- #endif
5
+ #endif // ANDROID
6
6
  #include <react/debug/react_native_assert.h>
7
7
  #include <react/renderer/components/rnscreens/Props.h>
8
8
  #include <react/renderer/components/rnscreens/utils/RectUtil.h>
@@ -38,6 +38,11 @@ class RNSScreenStackHeaderConfigComponentDescriptor final
38
38
  {stateData.getPaddingStart(), 0, stateData.getPaddingEnd(), 0});
39
39
 
40
40
  ConcreteComponentDescriptor::adopt(shadowNode);
41
+ #if !defined(ANDROID) && !defined(NDEBUG)
42
+ std::weak_ptr<void> imageLoader =
43
+ contextContainer_->at<std::shared_ptr<void>>("RCTImageLoader");
44
+ configShadowNode.setImageLoader(imageLoader);
45
+ #endif // !ANDROID && !NDEBUG
41
46
  }
42
47
  };
43
48
 
@@ -5,4 +5,18 @@ namespace facebook::react {
5
5
  extern const char RNSScreenStackHeaderConfigComponentName[] =
6
6
  "RNSScreenStackHeaderConfig";
7
7
 
8
+ #if !defined(ANDROID) && !defined(NDEBUG)
9
+ void RNSScreenStackHeaderConfigShadowNode::setImageLoader(
10
+ std::weak_ptr<void> imageLoader) {
11
+ getStateDataMutable().setImageLoader(imageLoader);
8
12
  }
13
+ RNSScreenStackHeaderConfigShadowNode::StateData &
14
+ RNSScreenStackHeaderConfigShadowNode::getStateDataMutable() {
15
+ // We assume that this method is called to mutate the data, so we ensure
16
+ // we're unsealed.
17
+ ensureUnsealed();
18
+ return const_cast<RNSScreenStackHeaderConfigShadowNode::StateData &>(
19
+ getStateData());
20
+ }
21
+ #endif // !ANDROID && !NDEBUG
22
+ } // namespace facebook::react
@@ -27,6 +27,14 @@ class JSI_EXPORT RNSScreenStackHeaderConfigShadowNode final
27
27
  #pragma mark - ShadowNode overrides
28
28
 
29
29
  #pragma mark - Custom interface
30
+ #if !defined(ANDROID) && !defined(NDEBUG)
31
+ void setImageLoader(std::weak_ptr<void> imageLoader);
32
+ #endif // !ANDROID && !NDEBUG
33
+
34
+ private:
35
+ #if !defined(ANDROID) && !defined(NDEBUG)
36
+ StateData &getStateDataMutable();
37
+ #endif // !ANDROID && !NDEBUG
30
38
  };
31
39
 
32
40
  } // namespace facebook::react
@@ -8,8 +8,19 @@ folly::dynamic RNSScreenStackHeaderConfigState::getDynamic() const {
8
8
  return folly::dynamic::object("paddingStart", paddingStart_)(
9
9
  "paddingEnd_", paddingEnd_);
10
10
  }
11
+ #else // ANDROID
12
+ #ifndef NDEBUG
13
+ void RNSScreenStackHeaderConfigState::setImageLoader(
14
+ std::weak_ptr<void> imageLoader) {
15
+ imageLoader_ = imageLoader;
16
+ }
11
17
 
12
- #endif
18
+ std::weak_ptr<void> RNSScreenStackHeaderConfigState::getImageLoader()
19
+ const noexcept {
20
+ return imageLoader_;
21
+ }
22
+ #endif // !NDEBUG
23
+ #endif // ANDROID
13
24
 
14
25
  Float RNSScreenStackHeaderConfigState::getPaddingStart() const noexcept {
15
26
  return paddingStart_;
@@ -33,8 +33,12 @@ class JSI_EXPORT RNSScreenStackHeaderConfigState final {
33
33
  MapBuffer getMapBuffer() const {
34
34
  return MapBufferBuilder::EMPTY();
35
35
  };
36
-
37
- #endif
36
+ #else // ANDROID
37
+ #ifndef NDEBUG
38
+ void setImageLoader(std::weak_ptr<void> imageLoader);
39
+ std::weak_ptr<void> getImageLoader() const noexcept;
40
+ #endif // !NDEBUG
41
+ #endif // ANDROID
38
42
 
39
43
  #pragma mark - Getters
40
44
 
@@ -45,6 +49,9 @@ class JSI_EXPORT RNSScreenStackHeaderConfigState final {
45
49
  private:
46
50
  Float paddingStart_{0.f};
47
51
  Float paddingEnd_{0.f};
52
+ #if !defined(ANDROID) && !defined(NDEBUG)
53
+ std::weak_ptr<void> imageLoader_;
54
+ #endif // !ANDROID && !NDEBUG
48
55
  };
49
56
 
50
57
  } // namespace facebook::react
@@ -2,7 +2,7 @@
2
2
 
3
3
  #ifdef ANDROID
4
4
  #include <fbjni/fbjni.h>
5
- #endif
5
+ #endif // ANDROID
6
6
  #include <react/debug/react_native_assert.h>
7
7
  #include <react/renderer/components/rnscreens/Props.h>
8
8
  #include <react/renderer/components/rnscreens/utils/RectUtil.h>
@@ -5,4 +5,4 @@ namespace facebook::react {
5
5
  extern const char RNSScreenStackHeaderSubviewComponentName[] =
6
6
  "RNSScreenStackHeaderSubview";
7
7
 
8
- }
8
+ } // namespace facebook::react
@@ -23,7 +23,6 @@ class JSI_EXPORT RNSScreenStackHeaderSubviewShadowNode final
23
23
  public:
24
24
  using ConcreteViewShadowNode::ConcreteViewShadowNode;
25
25
  using StateData = ConcreteViewShadowNode::ConcreteStateData;
26
-
27
26
  #pragma mark - ShadowNode overrides
28
27
 
29
28
  #pragma mark - Custom interface
@@ -9,7 +9,7 @@ using namespace rnscreens;
9
9
  folly::dynamic RNSScreenStackHeaderSubviewState::getDynamic() const {
10
10
  return folly::dynamic::object();
11
11
  }
12
- #endif
12
+ #endif // ANDROID
13
13
 
14
14
  } // namespace react
15
15
  } // namespace facebook
@@ -32,8 +32,7 @@ class JSI_EXPORT RNSScreenStackHeaderSubviewState final {
32
32
  MapBuffer getMapBuffer() const {
33
33
  return MapBufferBuilder::EMPTY();
34
34
  };
35
- #endif
36
-
35
+ #endif // ANDROID
37
36
  #pragma mark - Getters
38
37
  };
39
38
 
@@ -29,7 +29,7 @@ const FrameCorrectionModes &RNSScreenState::getHeaderCorrectionModes()
29
29
  return headerCorrectionModes_;
30
30
  }
31
31
 
32
- #endif
32
+ #endif // ANDROID
33
33
 
34
34
  } // namespace react
35
35
  } // namespace facebook
@@ -7,7 +7,7 @@
7
7
  #include <folly/dynamic.h>
8
8
  #include <react/renderer/mapbuffer/MapBuffer.h>
9
9
  #include <react/renderer/mapbuffer/MapBufferBuilder.h>
10
- #endif
10
+ #endif // ANDROID
11
11
 
12
12
  #include "FrameCorrectionModes.h"
13
13
 
@@ -53,7 +53,7 @@ class JSI_EXPORT RNSScreenState final {
53
53
 
54
54
  const FrameCorrectionModes &getHeaderCorrectionModes() const noexcept;
55
55
 
56
- #endif
56
+ #endif // ANDROID
57
57
 
58
58
  private:
59
59
  #ifdef ANDROID
@@ -1183,16 +1183,7 @@ RNS_IGNORE_SUPER_CALL_END
1183
1183
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
1184
1184
  {
1185
1185
  RNSScreenView *screenChildComponent = (RNSScreenView *)childComponentView;
1186
-
1187
- // We should only do a snapshot of a screen that is on the top.
1188
- // We also check `_presentedModals` since if you push 2 modals, second one is not a "child" of _controller.
1189
- // Also, when dissmised with a gesture, the screen already is not under the window, so we don't need to apply
1190
- // snapshot.
1191
- if (screenChildComponent.window != nil &&
1192
- ((screenChildComponent == _controller.visibleViewController.view && _presentedModals.count < 2) ||
1193
- screenChildComponent == [_presentedModals.lastObject view])) {
1194
- [screenChildComponent.controller setViewToSnapshot];
1195
- }
1186
+ [screenChildComponent.controller setViewToSnapshot];
1196
1187
 
1197
1188
  RCTAssert(
1198
1189
  screenChildComponent.reactSuperview == self,
@@ -10,6 +10,9 @@
10
10
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
11
11
  #import <rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h>
12
12
  #import "RCTImageComponentView+RNSScreenStackHeaderConfig.h"
13
+ #ifndef NDEBUG
14
+ #import <react/utils/ManagedObjectWrapper.h>
15
+ #endif // !NDEBUG
13
16
  #else
14
17
  #import <React/RCTImageView.h>
15
18
  #import <React/RCTShadowView.h>
@@ -61,6 +64,9 @@ namespace react = facebook::react;
61
64
  #ifdef RCT_NEW_ARCH_ENABLED
62
65
  BOOL _initialPropsSet;
63
66
  react::RNSScreenStackHeaderConfigShadowNode::ConcreteState::Shared _state;
67
+ #ifndef NDEBUG
68
+ RCTImageLoader *imageLoader;
69
+ #endif // !NDEBUG
64
70
  #else
65
71
  __weak RCTBridge *_bridge;
66
72
  #endif
@@ -338,10 +344,10 @@ RNS_IGNORE_SUPER_CALL_END
338
344
  [button setTitleTextAttributes:attrs forState:UIControlStateFocused];
339
345
  }
340
346
 
341
- + (UIImage *)loadBackButtonImageInViewController:(UIViewController *)vc withConfig:(RNSScreenStackHeaderConfig *)config
347
+ - (UIImage *)loadBackButtonImageInViewController:(UIViewController *)vc
342
348
  {
343
349
  BOOL hasBackButtonImage = NO;
344
- for (RNSScreenStackHeaderSubview *subview in config.reactSubviews) {
350
+ for (RNSScreenStackHeaderSubview *subview in self.reactSubviews) {
345
351
  if (subview.type == RNSScreenStackHeaderSubviewTypeBackButton && subview.subviews.count > 0) {
346
352
  hasBackButtonImage = YES;
347
353
  #ifdef RCT_NEW_ARCH_ENABLED
@@ -367,6 +373,7 @@ RNS_IGNORE_SUPER_CALL_END
367
373
 
368
374
  UIImage *image = imageView.image;
369
375
 
376
+ #ifndef NDEBUG
370
377
  // IMPORTANT!!!
371
378
  // image can be nil in DEV MODE ONLY
372
379
  //
@@ -381,8 +388,9 @@ RNS_IGNORE_SUPER_CALL_END
381
388
  // in DEV MODE we try to load from cache (we use private API for that as it is not exposed
382
389
  // publically in headers).
383
390
  RCTImageSource *imageSource = [RNSScreenStackHeaderConfig imageSourceFromImageView:imageView];
384
- RCTImageLoader *imageLoader = [subview.bridge moduleForClass:[RCTImageLoader class]];
385
-
391
+ #ifndef RCT_NEW_ARCH_ENABLED
392
+ RCTImageLoader *imageLoader = [_bridge moduleForClass:[RCTImageLoader class]];
393
+ #endif // !RCT_NEW_ARCH_ENABLED
386
394
  image = [imageLoader.imageCache
387
395
  imageForUrl:imageSource.request.URL.absoluteString
388
396
  size:imageSource.size
@@ -394,6 +402,7 @@ RNS_IGNORE_SUPER_CALL_END
394
402
  resizeMode:imageView.resizeMode];
395
403
  #endif // RCT_NEW_ARCH_ENABLED
396
404
  }
405
+ #endif // !NDEBUG
397
406
  if (image == nil) {
398
407
  // This will be triggered if the image is not in the cache yet. What we do is we wait until
399
408
  // the end of transition and run header config updates again. We could potentially wait for
@@ -410,7 +419,7 @@ RNS_IGNORE_SUPER_CALL_END
410
419
  #if !TARGET_OS_TV
411
420
  vc.navigationItem.hidesBackButton = YES;
412
421
  #endif
413
- [config updateViewControllerIfNeeded];
422
+ [self updateViewControllerIfNeeded];
414
423
  }];
415
424
  }
416
425
  return [UIImage new];
@@ -442,8 +451,16 @@ RNS_IGNORE_SUPER_CALL_END
442
451
  UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
443
452
 
444
453
  if (config.backgroundColor && CGColorGetAlpha(config.backgroundColor.CGColor) == 0.) {
454
+ // Preserve the shadow properties in case the user wants to show the shadow on scroll.
455
+ UIColor *shadowColor = appearance.shadowColor;
456
+ UIImage *shadowImage = appearance.shadowImage;
445
457
  // transparent background color
446
458
  [appearance configureWithTransparentBackground];
459
+
460
+ if (!config.hideShadow) {
461
+ appearance.shadowColor = shadowColor;
462
+ appearance.shadowImage = shadowImage;
463
+ }
447
464
  } else {
448
465
  [appearance configureWithOpaqueBackground];
449
466
  }
@@ -520,7 +537,7 @@ RNS_IGNORE_SUPER_CALL_END
520
537
  appearance.largeTitleTextAttributes = largeAttrs;
521
538
  }
522
539
 
523
- UIImage *backButtonImage = [self loadBackButtonImageInViewController:vc withConfig:config];
540
+ UIImage *backButtonImage = [config loadBackButtonImageInViewController:vc];
524
541
  if (backButtonImage) {
525
542
  [appearance setBackIndicatorImage:backButtonImage transitionMaskImage:backButtonImage];
526
543
  } else if (appearance.backIndicatorImage) {
@@ -671,7 +688,15 @@ RNS_IGNORE_SUPER_CALL_END
671
688
  UINavigationBarAppearance *scrollEdgeAppearance =
672
689
  [[UINavigationBarAppearance alloc] initWithBarAppearance:appearance];
673
690
  if (config.largeTitleBackgroundColor != nil) {
674
- scrollEdgeAppearance.backgroundColor = config.largeTitleBackgroundColor;
691
+ // Add support for using a fully transparent bar when the backgroundColor is set to transparent.
692
+ if (CGColorGetAlpha(config.largeTitleBackgroundColor.CGColor) == 0.) {
693
+ // This will also remove the background blur effect in the large title which is otherwise inherited from the standard appearance.
694
+ [scrollEdgeAppearance configureWithTransparentBackground];
695
+ // This must be set to nil otherwise a default view will be added to the navigation bar background with an opaque background.
696
+ scrollEdgeAppearance.backgroundColor = nil;
697
+ } else {
698
+ scrollEdgeAppearance.backgroundColor = config.largeTitleBackgroundColor;
699
+ }
675
700
  }
676
701
  if (config.largeTitleHideShadow) {
677
702
  scrollEdgeAppearance.shadowColor = nil;
@@ -683,7 +708,7 @@ RNS_IGNORE_SUPER_CALL_END
683
708
  #if !TARGET_OS_TV
684
709
  // updating backIndicatotImage does not work when called during transition. On iOS pre 13 we need
685
710
  // to update it before the navigation starts.
686
- UIImage *backButtonImage = [self loadBackButtonImageInViewController:vc withConfig:config];
711
+ UIImage *backButtonImage = [config loadBackButtonImageInViewController:vc];
687
712
  if (backButtonImage) {
688
713
  navctr.navigationBar.backIndicatorImage = backButtonImage;
689
714
  navctr.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;
@@ -847,27 +872,29 @@ RNS_IGNORE_SUPER_CALL_BEGIN
847
872
 
848
873
  - (void)replaceNavigationBarViewsWithSnapshotOfSubview:(RNSScreenStackHeaderSubview *)childComponentView
849
874
  {
850
- UINavigationItem *navitem = _screenView.controller.navigationItem;
851
- UIView *snapshot = [childComponentView snapshotViewAfterScreenUpdates:NO];
852
-
853
- // This code should be kept in sync with analogous switch statement in
854
- // `+ [RNSScreenStackHeaderConfig updateViewController: withConfig: animated:]` method.
855
- switch (childComponentView.type) {
856
- case RNSScreenStackHeaderSubviewTypeLeft:
857
- navitem.leftBarButtonItem.customView = snapshot;
858
- break;
859
- case RNSScreenStackHeaderSubviewTypeCenter:
860
- case RNSScreenStackHeaderSubviewTypeTitle:
861
- navitem.titleView = snapshot;
862
- break;
863
- case RNSScreenStackHeaderSubviewTypeRight:
864
- navitem.rightBarButtonItem.customView = snapshot;
865
- break;
866
- case RNSScreenStackHeaderSubviewTypeSearchBar:
867
- case RNSScreenStackHeaderSubviewTypeBackButton:
868
- break;
869
- default:
870
- RCTLogError(@"[RNScreens] Unhandled subview type: %ld", childComponentView.type);
875
+ if (childComponentView.window != nil) {
876
+ UINavigationItem *navitem = _screenView.controller.navigationItem;
877
+ UIView *snapshot = [childComponentView snapshotViewAfterScreenUpdates:NO];
878
+
879
+ // This code should be kept in sync with analogous switch statement in
880
+ // `+ [RNSScreenStackHeaderConfig updateViewController: withConfig: animated:]` method.
881
+ switch (childComponentView.type) {
882
+ case RNSScreenStackHeaderSubviewTypeLeft:
883
+ navitem.leftBarButtonItem.customView = snapshot;
884
+ break;
885
+ case RNSScreenStackHeaderSubviewTypeCenter:
886
+ case RNSScreenStackHeaderSubviewTypeTitle:
887
+ navitem.titleView = snapshot;
888
+ break;
889
+ case RNSScreenStackHeaderSubviewTypeRight:
890
+ navitem.rightBarButtonItem.customView = snapshot;
891
+ break;
892
+ case RNSScreenStackHeaderSubviewTypeSearchBar:
893
+ case RNSScreenStackHeaderSubviewTypeBackButton:
894
+ break;
895
+ default:
896
+ RCTLogError(@"[RNScreens] Unhandled subview type: %ld", childComponentView.type);
897
+ }
871
898
  }
872
899
  }
873
900
 
@@ -965,7 +992,7 @@ static RCTResizeMode resizeModeFromCppEquiv(react::ImageResizeMode resizeMode)
965
992
  _largeTitleFontSize = [self getFontSizePropValue:newScreenProps.largeTitleFontSize];
966
993
  _largeTitleHideShadow = newScreenProps.largeTitleHideShadow;
967
994
  _largeTitleBackgroundColor = RCTUIColorFromSharedColor(newScreenProps.largeTitleBackgroundColor);
968
-
995
+
969
996
  _backTitle = RCTNSStringFromStringNilIfEmpty(newScreenProps.backTitle);
970
997
  if (newScreenProps.backTitleFontFamily != oldScreenProps.backTitleFontFamily) {
971
998
  _backTitleFontFamily = RCTNSStringFromStringNilIfEmpty(newScreenProps.backTitleFontFamily);
@@ -1009,6 +1036,11 @@ static RCTResizeMode resizeModeFromCppEquiv(react::ImageResizeMode resizeMode)
1009
1036
  oldState:(const facebook::react::State::Shared &)oldState
1010
1037
  {
1011
1038
  _state = std::static_pointer_cast<const react::RNSScreenStackHeaderConfigShadowNode::ConcreteState>(state);
1039
+ #ifndef NDEBUG
1040
+ if (auto imgLoaderPtr = _state.get()->getData().getImageLoader().lock()) {
1041
+ imageLoader = react::unwrapManagedObject(imgLoaderPtr);
1042
+ }
1043
+ #endif // !NDEBUG
1012
1044
  }
1013
1045
 
1014
1046
  #else
@@ -20,13 +20,6 @@ NS_ASSUME_NONNULL_BEGIN
20
20
 
21
21
  @property (nonatomic, weak) UIView *reactSuperview;
22
22
 
23
- @property (nonatomic, weak) RCTBridge *bridge;
24
-
25
- #ifdef RCT_NEW_ARCH_ENABLED
26
- #else
27
- - (instancetype)initWithBridge:(RCTBridge *)bridge;
28
- #endif // RCT_NEW_ARCH_ENABLED
29
-
30
23
  @end
31
24
 
32
25
  @interface RNSScreenStackHeaderSubviewManager : RCTViewManager
@@ -18,10 +18,6 @@
18
18
  namespace react = facebook::react;
19
19
  #endif // RCT_NEW_ARCH_ENABLED
20
20
 
21
- @interface RCTBridge (Private)
22
- + (RCTBridge *)currentBridge;
23
- @end
24
-
25
21
  @implementation RNSScreenStackHeaderSubview
26
22
 
27
23
  #pragma mark - Common
@@ -115,17 +111,9 @@ RNS_IGNORE_SUPER_CALL_BEGIN
115
111
  return NO;
116
112
  }
117
113
 
118
- #else
114
+ #else // RCT_NEW_ARCH_ENABLED
119
115
  #pragma mark - Paper specific
120
116
 
121
- - (instancetype)initWithBridge:(RCTBridge *)bridge
122
- {
123
- if (self = [super init]) {
124
- _bridge = bridge;
125
- }
126
- return self;
127
- }
128
-
129
117
  - (void)reactSetFrame:(CGRect)frame
130
118
  {
131
119
  // Block any attempt to set coordinates on RNSScreenStackHeaderSubview. This
@@ -133,18 +121,8 @@ RNS_IGNORE_SUPER_CALL_BEGIN
133
121
  [super reactSetFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
134
122
  [self layoutNavigationBarIfNeeded];
135
123
  }
136
-
137
124
  #endif // RCT_NEW_ARCH_ENABLED
138
125
 
139
- - (RCTBridge *)bridge
140
- {
141
- #ifdef RCT_NEW_ARCH_ENABLED
142
- return [RCTBridge currentBridge];
143
- #else
144
- return _bridge;
145
- #endif // RCT_NEW_ARCH_ENABLED
146
- }
147
-
148
126
  @end
149
127
 
150
128
  @implementation RNSScreenStackHeaderSubviewManager
@@ -157,7 +135,7 @@ RCT_EXPORT_VIEW_PROPERTY(type, RNSScreenStackHeaderSubviewType)
157
135
  #else
158
136
  - (UIView *)view
159
137
  {
160
- return [[RNSScreenStackHeaderSubview alloc] initWithBridge:self.bridge];
138
+ return [RNSScreenStackHeaderSubview new];
161
139
  }
162
140
  #endif
163
141
 
@@ -1,4 +1,3 @@
1
- #import <React/RCTBridge+Private.h>
2
1
  #import <React/RCTEventDispatcherProtocol.h>
3
2
 
4
3
  @interface RNSHeaderHeightChangeEvent : NSObject <RCTEvent>
@@ -1,4 +1,3 @@
1
- #import <React/RCTBridge+Private.h>
2
1
  #import <React/RCTEventDispatcherProtocol.h>
3
2
 
4
3
  @interface RNSScreenViewEvent : NSObject <RCTEvent>
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.FooterComponent = FooterComponent;
6
7
  exports.default = void 0;
7
8
  var _react = _interopRequireDefault(require("react"));
8
9
  var _ScreenFooterNativeComponent = _interopRequireDefault(require("../fabric/ScreenFooterNativeComponent"));
@@ -13,5 +14,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
14
  function ScreenFooter(props) {
14
15
  return /*#__PURE__*/_react.default.createElement(_ScreenFooterNativeComponent.default, props);
15
16
  }
17
+ function FooterComponent(_ref) {
18
+ let {
19
+ children
20
+ } = _ref;
21
+ return /*#__PURE__*/_react.default.createElement(ScreenFooter, {
22
+ collapsable: false
23
+ }, children);
24
+ }
16
25
  var _default = exports.default = ScreenFooter;
17
26
  //# sourceMappingURL=ScreenFooter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_ScreenFooterNativeComponent","obj","__esModule","default","ScreenFooter","props","createElement","_default","exports"],"sourceRoot":"../../../src","sources":["components/ScreenFooter.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,4BAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAgF,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEhF;AACA;AACA;AACA,SAASG,YAAYA,CAACC,KAAgB,EAAE;EACtC,oBAAOR,MAAA,CAAAM,OAAA,CAAAG,aAAA,CAACN,4BAAA,CAAAG,OAA2B,EAAKE,KAAQ,CAAC;AACnD;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAL,OAAA,GAEcC,YAAY"}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_ScreenFooterNativeComponent","obj","__esModule","default","ScreenFooter","props","createElement","FooterComponent","_ref","children","collapsable","_default","exports"],"sourceRoot":"../../../src","sources":["components/ScreenFooter.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,4BAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAgF,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEhF;AACA;AACA;AACA,SAASG,YAAYA,CAACC,KAAgB,EAAE;EACtC,oBAAOR,MAAA,CAAAM,OAAA,CAAAG,aAAA,CAACN,4BAAA,CAAAG,OAA2B,EAAKE,KAAQ,CAAC;AACnD;AAMO,SAASE,eAAeA,CAAAC,IAAA,EAA4B;EAAA,IAA3B;IAAEC;EAAsB,CAAC,GAAAD,IAAA;EACvD,oBAAOX,MAAA,CAAAM,OAAA,CAAAG,aAAA,CAACF,YAAY;IAACM,WAAW,EAAE;EAAM,GAAED,QAAuB,CAAC;AACpE;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAT,OAAA,GAEcC,YAAY"}
@@ -12,6 +12,7 @@ var _ScreenStackHeaderConfig = require("./ScreenStackHeaderConfig");
12
12
  var _Screen = _interopRequireDefault(require("./Screen"));
13
13
  var _ScreenStack = _interopRequireDefault(require("./ScreenStack"));
14
14
  var _contexts = require("../contexts");
15
+ var _ScreenFooter = require("./ScreenFooter");
15
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
17
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
17
18
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -25,6 +26,8 @@ function ScreenStackItem(_ref, ref) {
25
26
  contentStyle,
26
27
  style,
27
28
  screenId,
29
+ // eslint-disable-next-line camelcase
30
+ unstable_sheetFooter,
28
31
  ...rest
29
32
  } = _ref;
30
33
  const currentScreenRef = React.useRef(null);
@@ -39,7 +42,7 @@ function ScreenStackItem(_ref, ref) {
39
42
  const content = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_DebugContainer.default, {
40
43
  style: [stackPresentation === 'formSheet' ? _reactNative.Platform.OS === 'ios' ? styles.absolute : null : styles.container, contentStyle],
41
44
  stackPresentation: stackPresentation ?? 'push'
42
- }, children), /*#__PURE__*/React.createElement(_ScreenStackHeaderConfig.ScreenStackHeaderConfig, headerConfig));
45
+ }, children), /*#__PURE__*/React.createElement(_ScreenStackHeaderConfig.ScreenStackHeaderConfig, headerConfig), stackPresentation === 'formSheet' && unstable_sheetFooter && /*#__PURE__*/React.createElement(_ScreenFooter.FooterComponent, null, unstable_sheetFooter()));
43
46
 
44
47
  // We take backgroundColor from contentStyle and apply it on Screen.
45
48
  // This allows to workaround one issue with truncated
@@ -1 +1 @@
1
- {"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_warnOnce","_interopRequireDefault","_DebugContainer","_ScreenStackHeaderConfig","_Screen","_ScreenStack","_contexts","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","ScreenStackItem","_ref","ref","children","headerConfig","activityState","stackPresentation","contentStyle","style","screenId","rest","currentScreenRef","useRef","screenRefs","useContext","RNSScreensRefContext","useImperativeHandle","current","isHeaderInModal","Platform","OS","hidden","headerHiddenPreviousRef","useEffect","warnOnce","content","createElement","Fragment","styles","absolute","container","ScreenStackHeaderConfig","internalScreenStyle","flattenContentStyles","StyleSheet","flatten","backgroundColor","node","console","warn","currentRefs","enabled","isNativeStack","hasLargeHeader","largeTitle","absoluteFill","_default","exports","forwardRef","create","flex","position","top","start","end"],"sourceRoot":"../../../src","sources":["components/ScreenStackItem.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAOA,IAAAE,SAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,eAAA,GAAAD,sBAAA,CAAAH,OAAA;AAEA,IAAAK,wBAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,YAAA,GAAAJ,sBAAA,CAAAH,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AAAmD,SAAAG,uBAAAM,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAd,wBAAAc,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAH,UAAA,SAAAG,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAF,OAAA,EAAAE,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAJ,CAAA,UAAAG,CAAA,CAAAE,GAAA,CAAAL,CAAA,OAAAM,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAZ,CAAA,oBAAAY,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAY,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAX,CAAA,EAAAY,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAZ,CAAA,CAAAY,CAAA,YAAAN,CAAA,CAAAR,OAAA,GAAAE,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAc,GAAA,CAAAjB,CAAA,EAAAM,CAAA,GAAAA,CAAA;AAAA,SAAAY,SAAA,IAAAA,QAAA,GAAAT,MAAA,CAAAU,MAAA,GAAAV,MAAA,CAAAU,MAAA,CAAAC,IAAA,eAAAC,MAAA,aAAAL,CAAA,MAAAA,CAAA,GAAAM,SAAA,CAAAC,MAAA,EAAAP,CAAA,UAAAQ,MAAA,GAAAF,SAAA,CAAAN,CAAA,YAAAS,GAAA,IAAAD,MAAA,QAAAf,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAS,MAAA,EAAAC,GAAA,KAAAJ,MAAA,CAAAI,GAAA,IAAAD,MAAA,CAAAC,GAAA,gBAAAJ,MAAA,YAAAH,QAAA,CAAAQ,KAAA,OAAAJ,SAAA;AAWnD,SAASK,eAAeA,CAAAC,IAAA,EAWtBC,GAA6B,EAC7B;EAAA,IAXA;IACEC,QAAQ;IACRC,YAAY;IACZC,aAAa;IACbC,iBAAiB;IACjBC,YAAY;IACZC,KAAK;IACLC,QAAQ;IACR,GAAGC;EACE,CAAC,GAAAT,IAAA;EAGR,MAAMU,gBAAgB,GAAGrD,KAAK,CAACsD,MAAM,CAAc,IAAI,CAAC;EACxD,MAAMC,UAAU,GAAGvD,KAAK,CAACwD,UAAU,CAACC,8BAAoB,CAAC;EAEzDzD,KAAK,CAAC0D,mBAAmB,CAACd,GAAG,EAAE,MAAMS,gBAAgB,CAACM,OAAQ,CAAC;EAE/D,MAAMC,eAAe,GACnBC,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrB,KAAK,GACLd,iBAAiB,KAAK,MAAM,IAAIF,YAAY,EAAEiB,MAAM,KAAK,KAAK;EAEpE,MAAMC,uBAAuB,GAAGhE,KAAK,CAACsD,MAAM,CAACR,YAAY,EAAEiB,MAAM,CAAC;EAElE/D,KAAK,CAACiE,SAAS,CAAC,MAAM;IACpB,IAAAC,iBAAQ,EACNL,qBAAQ,CAACC,EAAE,KAAK,SAAS,IACvBd,iBAAiB,KAAK,MAAM,IAC5BgB,uBAAuB,CAACL,OAAO,KAAKb,YAAY,EAAEiB,MAAM,EACzD,qHACH,CAAC;IAEDC,uBAAuB,CAACL,OAAO,GAAGb,YAAY,EAAEiB,MAAM;EACxD,CAAC,EAAE,CAACjB,YAAY,EAAEiB,MAAM,EAAEf,iBAAiB,CAAC,CAAC;EAE7C,MAAMmB,OAAO,gBACXnE,KAAA,CAAAoE,aAAA,CAAApE,KAAA,CAAAqE,QAAA,qBACErE,KAAA,CAAAoE,aAAA,CAAC9D,eAAA,CAAAO,OAAc;IACbqC,KAAK,EAAE,CACLF,iBAAiB,KAAK,WAAW,GAC7Ba,qBAAQ,CAACC,EAAE,KAAK,KAAK,GACnBQ,MAAM,CAACC,QAAQ,GACf,IAAI,GACND,MAAM,CAACE,SAAS,EACpBvB,YAAY,CACZ;IACFD,iBAAiB,EAAEA,iBAAiB,IAAI;EAAO,GAC9CH,QACa,CAAC,eAYjB7C,KAAA,CAAAoE,aAAA,CAAC7D,wBAAA,CAAAkE,uBAAuB,EAAK3B,YAAe,CAC5C,CACH;;EAED;EACA;EACA;EACA,IAAI4B,mBAAmB;EAEvB,IAAI1B,iBAAiB,KAAK,WAAW,IAAIC,YAAY,EAAE;IACrD,MAAM0B,oBAAoB,GAAGC,uBAAU,CAACC,OAAO,CAAC5B,YAAY,CAAC;IAC7DyB,mBAAmB,GAAG;MACpBI,eAAe,EAAEH,oBAAoB,EAAEG;IACzC,CAAC;EACH;EAEA,oBACE9E,KAAA,CAAAoE,aAAA,CAAC5D,OAAA,CAAAK,OAAM,EAAAoB,QAAA;IACLW,GAAG,EAAEmC,IAAI,IAAI;MACX1B,gBAAgB,CAACM,OAAO,GAAGoB,IAAI;MAE/B,IAAIxB,UAAU,KAAK,IAAI,EAAE;QACvByB,OAAO,CAACC,IAAI,CACV,kGACF,CAAC;QACD;MACF;MAEA,MAAMC,WAAW,GAAG3B,UAAU,CAACI,OAAO;MAEtC,IAAIoB,IAAI,KAAK,IAAI,EAAE;QACjB;QACA,OAAOG,WAAW,CAAC/B,QAAQ,CAAC;MAC9B,CAAC,MAAM;QACL+B,WAAW,CAAC/B,QAAQ,CAAC,GAAG;UAAEQ,OAAO,EAAEoB;QAAK,CAAC;MAC3C;IACF,CAAE;IACFI,OAAO;IACPC,aAAa;IACbrC,aAAa,EAAEA,aAAc;IAC7BC,iBAAiB,EAAEA,iBAAkB;IACrCqC,cAAc,EAAEvC,YAAY,EAAEwC,UAAU,IAAI,KAAM;IAClDpC,KAAK,EAAE,CAACA,KAAK,EAAEwB,mBAAmB;EAAE,GAChCtB,IAAI,GACPQ,eAAe,gBACd5D,KAAA,CAAAoE,aAAA,CAAC3D,YAAA,CAAAI,OAAW;IAACqC,KAAK,EAAEoB,MAAM,CAACE;EAAU,gBACnCxE,KAAA,CAAAoE,aAAA,CAAC5D,OAAA,CAAAK,OAAM;IACLsE,OAAO;IACPC,aAAa;IACbrC,aAAa,EAAEA,aAAc;IAC7BsC,cAAc,EAAEvC,YAAY,EAAEwC,UAAU,IAAI,KAAM;IAClDpC,KAAK,EAAE0B,uBAAU,CAACW;EAAa,GAC9BpB,OACK,CACG,CAAC,GAEdA,OAEI,CAAC;AAEb;AAAC,IAAAqB,QAAA,GAAAC,OAAA,CAAA5E,OAAA,gBAEcb,KAAK,CAAC0F,UAAU,CAAChD,eAAe,CAAC;AAEhD,MAAM4B,MAAM,GAAGM,uBAAU,CAACe,MAAM,CAAC;EAC/BnB,SAAS,EAAE;IACToB,IAAI,EAAE;EACR,CAAC;EACDrB,QAAQ,EAAE;IACRsB,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,KAAK,EAAE,CAAC;IACRC,GAAG,EAAE;EACP;AACF,CAAC,CAAC"}
1
+ {"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_warnOnce","_interopRequireDefault","_DebugContainer","_ScreenStackHeaderConfig","_Screen","_ScreenStack","_contexts","_ScreenFooter","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","ScreenStackItem","_ref","ref","children","headerConfig","activityState","stackPresentation","contentStyle","style","screenId","unstable_sheetFooter","rest","currentScreenRef","useRef","screenRefs","useContext","RNSScreensRefContext","useImperativeHandle","current","isHeaderInModal","Platform","OS","hidden","headerHiddenPreviousRef","useEffect","warnOnce","content","createElement","Fragment","styles","absolute","container","ScreenStackHeaderConfig","FooterComponent","internalScreenStyle","flattenContentStyles","StyleSheet","flatten","backgroundColor","node","console","warn","currentRefs","enabled","isNativeStack","hasLargeHeader","largeTitle","absoluteFill","_default","exports","forwardRef","create","flex","position","top","start","end"],"sourceRoot":"../../../src","sources":["components/ScreenStackItem.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAOA,IAAAE,SAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,eAAA,GAAAD,sBAAA,CAAAH,OAAA;AAEA,IAAAK,wBAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,YAAA,GAAAJ,sBAAA,CAAAH,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,aAAA,GAAAT,OAAA;AAAiD,SAAAG,uBAAAO,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAf,wBAAAe,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAH,UAAA,SAAAG,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAF,OAAA,EAAAE,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAJ,CAAA,UAAAG,CAAA,CAAAE,GAAA,CAAAL,CAAA,OAAAM,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAZ,CAAA,oBAAAY,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAY,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAX,CAAA,EAAAY,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAZ,CAAA,CAAAY,CAAA,YAAAN,CAAA,CAAAR,OAAA,GAAAE,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAc,GAAA,CAAAjB,CAAA,EAAAM,CAAA,GAAAA,CAAA;AAAA,SAAAY,SAAA,IAAAA,QAAA,GAAAT,MAAA,CAAAU,MAAA,GAAAV,MAAA,CAAAU,MAAA,CAAAC,IAAA,eAAAC,MAAA,aAAAL,CAAA,MAAAA,CAAA,GAAAM,SAAA,CAAAC,MAAA,EAAAP,CAAA,UAAAQ,MAAA,GAAAF,SAAA,CAAAN,CAAA,YAAAS,GAAA,IAAAD,MAAA,QAAAf,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAS,MAAA,EAAAC,GAAA,KAAAJ,MAAA,CAAAI,GAAA,IAAAD,MAAA,CAAAC,GAAA,gBAAAJ,MAAA,YAAAH,QAAA,CAAAQ,KAAA,OAAAJ,SAAA;AAWjD,SAASK,eAAeA,CAAAC,IAAA,EAatBC,GAA6B,EAC7B;EAAA,IAbA;IACEC,QAAQ;IACRC,YAAY;IACZC,aAAa;IACbC,iBAAiB;IACjBC,YAAY;IACZC,KAAK;IACLC,QAAQ;IACR;IACAC,oBAAoB;IACpB,GAAGC;EACE,CAAC,GAAAV,IAAA;EAGR,MAAMW,gBAAgB,GAAGvD,KAAK,CAACwD,MAAM,CAAc,IAAI,CAAC;EACxD,MAAMC,UAAU,GAAGzD,KAAK,CAAC0D,UAAU,CAACC,8BAAoB,CAAC;EAEzD3D,KAAK,CAAC4D,mBAAmB,CAACf,GAAG,EAAE,MAAMU,gBAAgB,CAACM,OAAQ,CAAC;EAE/D,MAAMC,eAAe,GACnBC,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrB,KAAK,GACLf,iBAAiB,KAAK,MAAM,IAAIF,YAAY,EAAEkB,MAAM,KAAK,KAAK;EAEpE,MAAMC,uBAAuB,GAAGlE,KAAK,CAACwD,MAAM,CAACT,YAAY,EAAEkB,MAAM,CAAC;EAElEjE,KAAK,CAACmE,SAAS,CAAC,MAAM;IACpB,IAAAC,iBAAQ,EACNL,qBAAQ,CAACC,EAAE,KAAK,SAAS,IACvBf,iBAAiB,KAAK,MAAM,IAC5BiB,uBAAuB,CAACL,OAAO,KAAKd,YAAY,EAAEkB,MAAM,EACzD,qHACH,CAAC;IAEDC,uBAAuB,CAACL,OAAO,GAAGd,YAAY,EAAEkB,MAAM;EACxD,CAAC,EAAE,CAAClB,YAAY,EAAEkB,MAAM,EAAEhB,iBAAiB,CAAC,CAAC;EAE7C,MAAMoB,OAAO,gBACXrE,KAAA,CAAAsE,aAAA,CAAAtE,KAAA,CAAAuE,QAAA,qBACEvE,KAAA,CAAAsE,aAAA,CAAChE,eAAA,CAAAQ,OAAc;IACbqC,KAAK,EAAE,CACLF,iBAAiB,KAAK,WAAW,GAC7Bc,qBAAQ,CAACC,EAAE,KAAK,KAAK,GACnBQ,MAAM,CAACC,QAAQ,GACf,IAAI,GACND,MAAM,CAACE,SAAS,EACpBxB,YAAY,CACZ;IACFD,iBAAiB,EAAEA,iBAAiB,IAAI;EAAO,GAC9CH,QACa,CAAC,eAYjB9C,KAAA,CAAAsE,aAAA,CAAC/D,wBAAA,CAAAoE,uBAAuB,EAAK5B,YAAe,CAAC,EAE5CE,iBAAiB,KAAK,WAAW,IAAII,oBAAoB,iBACxDrD,KAAA,CAAAsE,aAAA,CAAC3D,aAAA,CAAAiE,eAAe,QAAEvB,oBAAoB,CAAC,CAAmB,CAE5D,CACH;;EAED;EACA;EACA;EACA,IAAIwB,mBAAmB;EAEvB,IAAI5B,iBAAiB,KAAK,WAAW,IAAIC,YAAY,EAAE;IACrD,MAAM4B,oBAAoB,GAAGC,uBAAU,CAACC,OAAO,CAAC9B,YAAY,CAAC;IAC7D2B,mBAAmB,GAAG;MACpBI,eAAe,EAAEH,oBAAoB,EAAEG;IACzC,CAAC;EACH;EAEA,oBACEjF,KAAA,CAAAsE,aAAA,CAAC9D,OAAA,CAAAM,OAAM,EAAAoB,QAAA;IACLW,GAAG,EAAEqC,IAAI,IAAI;MACX3B,gBAAgB,CAACM,OAAO,GAAGqB,IAAI;MAE/B,IAAIzB,UAAU,KAAK,IAAI,EAAE;QACvB0B,OAAO,CAACC,IAAI,CACV,kGACF,CAAC;QACD;MACF;MAEA,MAAMC,WAAW,GAAG5B,UAAU,CAACI,OAAO;MAEtC,IAAIqB,IAAI,KAAK,IAAI,EAAE;QACjB;QACA,OAAOG,WAAW,CAACjC,QAAQ,CAAC;MAC9B,CAAC,MAAM;QACLiC,WAAW,CAACjC,QAAQ,CAAC,GAAG;UAAES,OAAO,EAAEqB;QAAK,CAAC;MAC3C;IACF,CAAE;IACFI,OAAO;IACPC,aAAa;IACbvC,aAAa,EAAEA,aAAc;IAC7BC,iBAAiB,EAAEA,iBAAkB;IACrCuC,cAAc,EAAEzC,YAAY,EAAE0C,UAAU,IAAI,KAAM;IAClDtC,KAAK,EAAE,CAACA,KAAK,EAAE0B,mBAAmB;EAAE,GAChCvB,IAAI,GACPQ,eAAe,gBACd9D,KAAA,CAAAsE,aAAA,CAAC7D,YAAA,CAAAK,OAAW;IAACqC,KAAK,EAAEqB,MAAM,CAACE;EAAU,gBACnC1E,KAAA,CAAAsE,aAAA,CAAC9D,OAAA,CAAAM,OAAM;IACLwE,OAAO;IACPC,aAAa;IACbvC,aAAa,EAAEA,aAAc;IAC7BwC,cAAc,EAAEzC,YAAY,EAAE0C,UAAU,IAAI,KAAM;IAClDtC,KAAK,EAAE4B,uBAAU,CAACW;EAAa,GAC9BrB,OACK,CACG,CAAC,GAEdA,OAEI,CAAC;AAEb;AAAC,IAAAsB,QAAA,GAAAC,OAAA,CAAA9E,OAAA,gBAEcd,KAAK,CAAC6F,UAAU,CAAClD,eAAe,CAAC;AAEhD,MAAM6B,MAAM,GAAGO,uBAAU,CAACe,MAAM,CAAC;EAC/BpB,SAAS,EAAE;IACTqB,IAAI,EAAE;EACR,CAAC;EACDtB,QAAQ,EAAE;IACRuB,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,KAAK,EAAE,CAAC;IACRC,GAAG,EAAE;EACP;AACF,CAAC,CAAC"}
@@ -7,5 +7,13 @@ import ScreenFooterNativeComponent from '../fabric/ScreenFooterNativeComponent';
7
7
  function ScreenFooter(props) {
8
8
  return /*#__PURE__*/React.createElement(ScreenFooterNativeComponent, props);
9
9
  }
10
+ export function FooterComponent(_ref) {
11
+ let {
12
+ children
13
+ } = _ref;
14
+ return /*#__PURE__*/React.createElement(ScreenFooter, {
15
+ collapsable: false
16
+ }, children);
17
+ }
10
18
  export default ScreenFooter;
11
19
  //# sourceMappingURL=ScreenFooter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","ScreenFooterNativeComponent","ScreenFooter","props","createElement"],"sourceRoot":"../../../src","sources":["components/ScreenFooter.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,OAAOC,2BAA2B,MAAM,uCAAuC;;AAE/E;AACA;AACA;AACA,SAASC,YAAYA,CAACC,KAAgB,EAAE;EACtC,oBAAOH,KAAA,CAAAI,aAAA,CAACH,2BAA2B,EAAKE,KAAQ,CAAC;AACnD;AAEA,eAAeD,YAAY"}
1
+ {"version":3,"names":["React","ScreenFooterNativeComponent","ScreenFooter","props","createElement","FooterComponent","_ref","children","collapsable"],"sourceRoot":"../../../src","sources":["components/ScreenFooter.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,OAAOC,2BAA2B,MAAM,uCAAuC;;AAE/E;AACA;AACA;AACA,SAASC,YAAYA,CAACC,KAAgB,EAAE;EACtC,oBAAOH,KAAA,CAAAI,aAAA,CAACH,2BAA2B,EAAKE,KAAQ,CAAC;AACnD;AAMA,OAAO,SAASE,eAAeA,CAAAC,IAAA,EAA4B;EAAA,IAA3B;IAAEC;EAAsB,CAAC,GAAAD,IAAA;EACvD,oBAAON,KAAA,CAAAI,aAAA,CAACF,YAAY;IAACM,WAAW,EAAE;EAAM,GAAED,QAAuB,CAAC;AACpE;AAEA,eAAeL,YAAY"}
@@ -7,6 +7,7 @@ import { ScreenStackHeaderConfig } from './ScreenStackHeaderConfig';
7
7
  import Screen from './Screen';
8
8
  import ScreenStack from './ScreenStack';
9
9
  import { RNSScreensRefContext } from '../contexts';
10
+ import { FooterComponent } from './ScreenFooter';
10
11
  function ScreenStackItem(_ref, ref) {
11
12
  let {
12
13
  children,
@@ -16,6 +17,8 @@ function ScreenStackItem(_ref, ref) {
16
17
  contentStyle,
17
18
  style,
18
19
  screenId,
20
+ // eslint-disable-next-line camelcase
21
+ unstable_sheetFooter,
19
22
  ...rest
20
23
  } = _ref;
21
24
  const currentScreenRef = React.useRef(null);
@@ -30,7 +33,7 @@ function ScreenStackItem(_ref, ref) {
30
33
  const content = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DebugContainer, {
31
34
  style: [stackPresentation === 'formSheet' ? Platform.OS === 'ios' ? styles.absolute : null : styles.container, contentStyle],
32
35
  stackPresentation: stackPresentation ?? 'push'
33
- }, children), /*#__PURE__*/React.createElement(ScreenStackHeaderConfig, headerConfig));
36
+ }, children), /*#__PURE__*/React.createElement(ScreenStackHeaderConfig, headerConfig), stackPresentation === 'formSheet' && unstable_sheetFooter && /*#__PURE__*/React.createElement(FooterComponent, null, unstable_sheetFooter()));
34
37
 
35
38
  // We take backgroundColor from contentStyle and apply it on Screen.
36
39
  // This allows to workaround one issue with truncated
@@ -1 +1 @@
1
- {"version":3,"names":["React","Platform","StyleSheet","warnOnce","DebugContainer","ScreenStackHeaderConfig","Screen","ScreenStack","RNSScreensRefContext","ScreenStackItem","_ref","ref","children","headerConfig","activityState","stackPresentation","contentStyle","style","screenId","rest","currentScreenRef","useRef","screenRefs","useContext","useImperativeHandle","current","isHeaderInModal","OS","hidden","headerHiddenPreviousRef","useEffect","content","createElement","Fragment","styles","absolute","container","internalScreenStyle","flattenContentStyles","flatten","backgroundColor","_extends","node","console","warn","currentRefs","enabled","isNativeStack","hasLargeHeader","largeTitle","absoluteFill","forwardRef","create","flex","position","top","start","end"],"sourceRoot":"../../../src","sources":["components/ScreenStackItem.tsx"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SACEC,QAAQ,EAERC,UAAU,QAGL,cAAc;AACrB,OAAOC,QAAQ,MAAM,WAAW;AAEhC,OAAOC,cAAc,MAAM,kBAAkB;AAE7C,SAASC,uBAAuB,QAAQ,2BAA2B;AACnE,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAOC,WAAW,MAAM,eAAe;AACvC,SAASC,oBAAoB,QAAQ,aAAa;AAWlD,SAASC,eAAeA,CAAAC,IAAA,EAWtBC,GAA6B,EAC7B;EAAA,IAXA;IACEC,QAAQ;IACRC,YAAY;IACZC,aAAa;IACbC,iBAAiB;IACjBC,YAAY;IACZC,KAAK;IACLC,QAAQ;IACR,GAAGC;EACE,CAAC,GAAAT,IAAA;EAGR,MAAMU,gBAAgB,GAAGpB,KAAK,CAACqB,MAAM,CAAc,IAAI,CAAC;EACxD,MAAMC,UAAU,GAAGtB,KAAK,CAACuB,UAAU,CAACf,oBAAoB,CAAC;EAEzDR,KAAK,CAACwB,mBAAmB,CAACb,GAAG,EAAE,MAAMS,gBAAgB,CAACK,OAAQ,CAAC;EAE/D,MAAMC,eAAe,GACnBzB,QAAQ,CAAC0B,EAAE,KAAK,SAAS,GACrB,KAAK,GACLZ,iBAAiB,KAAK,MAAM,IAAIF,YAAY,EAAEe,MAAM,KAAK,KAAK;EAEpE,MAAMC,uBAAuB,GAAG7B,KAAK,CAACqB,MAAM,CAACR,YAAY,EAAEe,MAAM,CAAC;EAElE5B,KAAK,CAAC8B,SAAS,CAAC,MAAM;IACpB3B,QAAQ,CACNF,QAAQ,CAAC0B,EAAE,KAAK,SAAS,IACvBZ,iBAAiB,KAAK,MAAM,IAC5Bc,uBAAuB,CAACJ,OAAO,KAAKZ,YAAY,EAAEe,MAAM,EACzD,qHACH,CAAC;IAEDC,uBAAuB,CAACJ,OAAO,GAAGZ,YAAY,EAAEe,MAAM;EACxD,CAAC,EAAE,CAACf,YAAY,EAAEe,MAAM,EAAEb,iBAAiB,CAAC,CAAC;EAE7C,MAAMgB,OAAO,gBACX/B,KAAA,CAAAgC,aAAA,CAAAhC,KAAA,CAAAiC,QAAA,qBACEjC,KAAA,CAAAgC,aAAA,CAAC5B,cAAc;IACba,KAAK,EAAE,CACLF,iBAAiB,KAAK,WAAW,GAC7Bd,QAAQ,CAAC0B,EAAE,KAAK,KAAK,GACnBO,MAAM,CAACC,QAAQ,GACf,IAAI,GACND,MAAM,CAACE,SAAS,EACpBpB,YAAY,CACZ;IACFD,iBAAiB,EAAEA,iBAAiB,IAAI;EAAO,GAC9CH,QACa,CAAC,eAYjBZ,KAAA,CAAAgC,aAAA,CAAC3B,uBAAuB,EAAKQ,YAAe,CAC5C,CACH;;EAED;EACA;EACA;EACA,IAAIwB,mBAAmB;EAEvB,IAAItB,iBAAiB,KAAK,WAAW,IAAIC,YAAY,EAAE;IACrD,MAAMsB,oBAAoB,GAAGpC,UAAU,CAACqC,OAAO,CAACvB,YAAY,CAAC;IAC7DqB,mBAAmB,GAAG;MACpBG,eAAe,EAAEF,oBAAoB,EAAEE;IACzC,CAAC;EACH;EAEA,oBACExC,KAAA,CAAAgC,aAAA,CAAC1B,MAAM,EAAAmC,QAAA;IACL9B,GAAG,EAAE+B,IAAI,IAAI;MACXtB,gBAAgB,CAACK,OAAO,GAAGiB,IAAI;MAE/B,IAAIpB,UAAU,KAAK,IAAI,EAAE;QACvBqB,OAAO,CAACC,IAAI,CACV,kGACF,CAAC;QACD;MACF;MAEA,MAAMC,WAAW,GAAGvB,UAAU,CAACG,OAAO;MAEtC,IAAIiB,IAAI,KAAK,IAAI,EAAE;QACjB;QACA,OAAOG,WAAW,CAAC3B,QAAQ,CAAC;MAC9B,CAAC,MAAM;QACL2B,WAAW,CAAC3B,QAAQ,CAAC,GAAG;UAAEO,OAAO,EAAEiB;QAAK,CAAC;MAC3C;IACF,CAAE;IACFI,OAAO;IACPC,aAAa;IACbjC,aAAa,EAAEA,aAAc;IAC7BC,iBAAiB,EAAEA,iBAAkB;IACrCiC,cAAc,EAAEnC,YAAY,EAAEoC,UAAU,IAAI,KAAM;IAClDhC,KAAK,EAAE,CAACA,KAAK,EAAEoB,mBAAmB;EAAE,GAChClB,IAAI,GACPO,eAAe,gBACd1B,KAAA,CAAAgC,aAAA,CAACzB,WAAW;IAACU,KAAK,EAAEiB,MAAM,CAACE;EAAU,gBACnCpC,KAAA,CAAAgC,aAAA,CAAC1B,MAAM;IACLwC,OAAO;IACPC,aAAa;IACbjC,aAAa,EAAEA,aAAc;IAC7BkC,cAAc,EAAEnC,YAAY,EAAEoC,UAAU,IAAI,KAAM;IAClDhC,KAAK,EAAEf,UAAU,CAACgD;EAAa,GAC9BnB,OACK,CACG,CAAC,GAEdA,OAEI,CAAC;AAEb;AAEA,4BAAe/B,KAAK,CAACmD,UAAU,CAAC1C,eAAe,CAAC;AAEhD,MAAMyB,MAAM,GAAGhC,UAAU,CAACkD,MAAM,CAAC;EAC/BhB,SAAS,EAAE;IACTiB,IAAI,EAAE;EACR,CAAC;EACDlB,QAAQ,EAAE;IACRmB,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,KAAK,EAAE,CAAC;IACRC,GAAG,EAAE;EACP;AACF,CAAC,CAAC"}
1
+ {"version":3,"names":["React","Platform","StyleSheet","warnOnce","DebugContainer","ScreenStackHeaderConfig","Screen","ScreenStack","RNSScreensRefContext","FooterComponent","ScreenStackItem","_ref","ref","children","headerConfig","activityState","stackPresentation","contentStyle","style","screenId","unstable_sheetFooter","rest","currentScreenRef","useRef","screenRefs","useContext","useImperativeHandle","current","isHeaderInModal","OS","hidden","headerHiddenPreviousRef","useEffect","content","createElement","Fragment","styles","absolute","container","internalScreenStyle","flattenContentStyles","flatten","backgroundColor","_extends","node","console","warn","currentRefs","enabled","isNativeStack","hasLargeHeader","largeTitle","absoluteFill","forwardRef","create","flex","position","top","start","end"],"sourceRoot":"../../../src","sources":["components/ScreenStackItem.tsx"],"mappings":"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"}
@@ -4,5 +4,9 @@ import { ViewProps } from 'react-native';
4
4
  * Unstable API
5
5
  */
6
6
  declare function ScreenFooter(props: ViewProps): React.JSX.Element;
7
+ type FooterProps = {
8
+ children?: React.ReactNode;
9
+ };
10
+ export declare function FooterComponent({ children }: FooterProps): React.JSX.Element;
7
11
  export default ScreenFooter;
8
12
  //# sourceMappingURL=ScreenFooter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenFooter.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,SAAS,qBAErC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ScreenFooter.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,SAAS,qBAErC;AAED,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,qBAExD;AAED,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenStackItem.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenStackItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,SAAS,EACd,IAAI,EACL,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAMrE,KAAK,KAAK,GAAG,IAAI,CACf,WAAW,EACX,SAAS,GAAG,eAAe,GAAG,gBAAgB,CAC/C,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC;;AA6HF,wBAAiD"}
1
+ {"version":3,"file":"ScreenStackItem.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenStackItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,SAAS,EACd,IAAI,EACL,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAOrE,KAAK,KAAK,GAAG,IAAI,CACf,WAAW,EACX,SAAS,GAAG,eAAe,GAAG,gBAAgB,CAC/C,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACrC,CAAC;;AAmIF,wBAAiD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-screens",
3
- "version": "4.1.0",
3
+ "version": "4.3.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)",
@@ -9,4 +9,12 @@ function ScreenFooter(props: ViewProps) {
9
9
  return <ScreenFooterNativeComponent {...props} />;
10
10
  }
11
11
 
12
+ type FooterProps = {
13
+ children?: React.ReactNode;
14
+ };
15
+
16
+ export function FooterComponent({ children }: FooterProps) {
17
+ return <ScreenFooter collapsable={false}>{children}</ScreenFooter>;
18
+ }
19
+
12
20
  export default ScreenFooter;
@@ -14,6 +14,7 @@ import { ScreenStackHeaderConfig } from './ScreenStackHeaderConfig';
14
14
  import Screen from './Screen';
15
15
  import ScreenStack from './ScreenStack';
16
16
  import { RNSScreensRefContext } from '../contexts';
17
+ import { FooterComponent } from './ScreenFooter';
17
18
 
18
19
  type Props = Omit<
19
20
  ScreenProps,
@@ -33,6 +34,8 @@ function ScreenStackItem(
33
34
  contentStyle,
34
35
  style,
35
36
  screenId,
37
+ // eslint-disable-next-line camelcase
38
+ unstable_sheetFooter,
36
39
  ...rest
37
40
  }: Props,
38
41
  ref: React.ForwardedRef<View>,
@@ -86,6 +89,10 @@ function ScreenStackItem(
86
89
  * for detailed explanation.
87
90
  */}
88
91
  <ScreenStackHeaderConfig {...headerConfig} />
92
+ {/* eslint-disable-next-line camelcase */}
93
+ {stackPresentation === 'formSheet' && unstable_sheetFooter && (
94
+ <FooterComponent>{unstable_sheetFooter()}</FooterComponent>
95
+ )}
89
96
  </>
90
97
  );
91
98