react-native-screens 3.24.0 → 3.26.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 (140) hide show
  1. package/README.md +1 -1
  2. package/RNScreens.podspec +53 -32
  3. package/android/build.gradle +13 -11
  4. package/android/src/main/java/com/swmansion/rnscreens/FragmentHolder.kt +7 -0
  5. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +41 -10
  6. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +35 -36
  7. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +7 -7
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +21 -0
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +46 -38
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +22 -0
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +40 -39
  12. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +35 -10
  13. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +15 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +6 -4
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +11 -18
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +27 -7
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +1 -1
  18. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +23 -7
  19. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +3 -5
  20. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +3 -5
  21. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +3 -5
  22. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +26 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +3 -5
  24. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +3 -5
  25. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +4 -7
  26. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -8
  27. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +3 -5
  28. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +3 -5
  29. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +3 -5
  30. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +5 -6
  31. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +3 -5
  32. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +3 -5
  33. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +3 -5
  34. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +4 -6
  35. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +3 -5
  36. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +12 -0
  37. package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +1 -1
  38. package/ios/RNSFullWindowOverlay.mm +2 -2
  39. package/ios/RNSScreen.h +5 -0
  40. package/ios/RNSScreen.mm +164 -7
  41. package/ios/RNSScreenStack.mm +18 -0
  42. package/ios/RNSScreenStackHeaderConfig.mm +18 -0
  43. package/ios/events/RNSHeaderHeightChangeEvent.h +8 -0
  44. package/ios/events/RNSHeaderHeightChangeEvent.mm +44 -0
  45. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  46. package/lib/commonjs/index.native.js +11 -11
  47. package/lib/commonjs/index.native.js.map +1 -1
  48. package/lib/commonjs/native-stack/index.js +14 -0
  49. package/lib/commonjs/native-stack/index.js.map +1 -1
  50. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +1 -1
  51. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  52. package/lib/commonjs/native-stack/types.js.map +1 -1
  53. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js +13 -0
  54. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  55. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  56. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js +22 -0
  57. package/lib/commonjs/native-stack/utils/getStatusBarHeight.js.map +1 -0
  58. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js +19 -0
  59. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  60. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +2 -2
  61. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -1
  62. package/lib/commonjs/native-stack/views/HeaderConfig.js +2 -2
  63. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  64. package/lib/commonjs/native-stack/views/NativeStackView.js +39 -21
  65. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  66. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js +13 -0
  67. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  68. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +37 -6
  69. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  70. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +2 -2
  71. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -1
  72. package/lib/commonjs/reanimated/index.js +7 -0
  73. package/lib/commonjs/reanimated/index.js.map +1 -1
  74. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +19 -0
  75. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  76. package/lib/commonjs/types.js.map +1 -1
  77. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  78. package/lib/module/index.native.js +12 -12
  79. package/lib/module/index.native.js.map +1 -1
  80. package/lib/module/native-stack/index.js +2 -0
  81. package/lib/module/native-stack/index.js.map +1 -1
  82. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +1 -1
  83. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
  84. package/lib/module/native-stack/types.js.map +1 -1
  85. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js +4 -0
  86. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  87. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
  88. package/lib/module/native-stack/utils/getStatusBarHeight.js +16 -0
  89. package/lib/module/native-stack/utils/getStatusBarHeight.js.map +1 -0
  90. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js +10 -0
  91. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  92. package/lib/module/native-stack/utils/useBackPressSubscription.js +2 -2
  93. package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -1
  94. package/lib/module/native-stack/views/HeaderConfig.js +2 -2
  95. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  96. package/lib/module/native-stack/views/NativeStackView.js +40 -22
  97. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  98. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js +5 -0
  99. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  100. package/lib/module/reanimated/ReanimatedNativeStackScreen.js +37 -6
  101. package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
  102. package/lib/module/reanimated/ReanimatedScreenProvider.js +2 -2
  103. package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -1
  104. package/lib/module/reanimated/index.js +1 -0
  105. package/lib/module/reanimated/index.js.map +1 -1
  106. package/lib/module/reanimated/useReanimatedHeaderHeight.js +10 -0
  107. package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  108. package/lib/module/types.js.map +1 -1
  109. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +4 -0
  110. package/lib/typescript/native-stack/index.d.ts +2 -0
  111. package/lib/typescript/native-stack/types.d.ts +20 -12
  112. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +4 -0
  113. package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts +2 -0
  114. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -0
  115. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +4 -0
  116. package/lib/typescript/reanimated/index.d.ts +1 -0
  117. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +3 -0
  118. package/lib/typescript/types.d.ts +26 -15
  119. package/native-stack/README.md +16 -1
  120. package/package.json +36 -38
  121. package/src/fabric/ScreenNativeComponent.ts +5 -0
  122. package/src/index.native.tsx +17 -19
  123. package/src/native-stack/index.tsx +3 -0
  124. package/src/native-stack/types.tsx +21 -12
  125. package/src/native-stack/utils/AnimatedHeaderHeightContext.tsx +8 -0
  126. package/src/native-stack/utils/SafeAreaProviderCompat.tsx +1 -1
  127. package/src/native-stack/utils/getStatusBarHeight.tsx +22 -0
  128. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +15 -0
  129. package/src/native-stack/views/HeaderConfig.tsx +1 -2
  130. package/src/native-stack/views/NativeStackView.tsx +78 -44
  131. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +7 -0
  132. package/src/reanimated/ReanimatedNativeStackScreen.tsx +58 -11
  133. package/src/reanimated/index.tsx +1 -0
  134. package/src/reanimated/useReanimatedHeaderHeight.tsx +14 -0
  135. package/src/types.tsx +29 -14
  136. package/windows/RNScreens/RNScreens.vcxproj +6 -3
  137. package/windows/RNScreens/ScreenStack.cpp +16 -0
  138. package/windows/RNScreens/ScreenStack.h +1 -0
  139. /package/ios/{RNSScreenViewEvent.h → events/RNSScreenViewEvent.h} +0 -0
  140. /package/ios/{RNSScreenViewEvent.mm → events/RNSScreenViewEvent.mm} +0 -0
@@ -9,6 +9,7 @@ import android.content.pm.ActivityInfo
9
9
  import android.graphics.Color
10
10
  import android.os.Build
11
11
  import android.view.ViewParent
12
+ import androidx.core.graphics.Insets
12
13
  import androidx.core.view.ViewCompat
13
14
  import androidx.core.view.WindowCompat
14
15
  import androidx.core.view.WindowInsetsCompat
@@ -115,12 +116,31 @@ object ScreenWindowTraits {
115
116
  if (translucent) {
116
117
  ViewCompat.setOnApplyWindowInsetsListener(decorView) { v, insets ->
117
118
  val defaultInsets = ViewCompat.onApplyWindowInsets(v, insets)
118
- defaultInsets.replaceSystemWindowInsets(
119
- defaultInsets.systemWindowInsetLeft,
120
- 0,
121
- defaultInsets.systemWindowInsetRight,
122
- defaultInsets.systemWindowInsetBottom
123
- )
119
+
120
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
121
+ val windowInsets =
122
+ defaultInsets.getInsets(WindowInsetsCompat.Type.statusBars())
123
+
124
+ WindowInsetsCompat
125
+ .Builder()
126
+ .setInsets(
127
+ WindowInsetsCompat.Type.statusBars(),
128
+ Insets.of(
129
+ windowInsets.left,
130
+ 0,
131
+ windowInsets.right,
132
+ windowInsets.bottom
133
+ )
134
+ )
135
+ .build()
136
+ } else {
137
+ defaultInsets.replaceSystemWindowInsets(
138
+ defaultInsets.systemWindowInsetLeft,
139
+ 0,
140
+ defaultInsets.systemWindowInsetRight,
141
+ defaultInsets.systemWindowInsetBottom
142
+ )
143
+ }
124
144
  }
125
145
  } else {
126
146
  ViewCompat.setOnApplyWindowInsetsListener(decorView, null)
@@ -239,7 +259,7 @@ object ScreenWindowTraits {
239
259
  screen: Screen?,
240
260
  trait: WindowTraits
241
261
  ): Screen? {
242
- screen?.fragment?.let {
262
+ screen?.fragmentWrapper?.let {
243
263
  for (sc in it.childScreenContainers) {
244
264
  // we check only the top screen for the trait
245
265
  val topScreen = sc.topScreen
@@ -11,7 +11,7 @@ internal class ScreensShadowNode(private var mContext: ReactContext) : LayoutSha
11
11
  super.onBeforeLayout(nativeViewHierarchyOptimizer)
12
12
  (mContext.getNativeModule(UIManagerModule::class.java))?.addUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
13
13
  val view = nativeViewHierarchyManager.resolveView(reactTag)
14
- if (view is ScreenContainer<*>) {
14
+ if (view is ScreenContainer) {
15
15
  view.performUpdates()
16
16
  }
17
17
  }
@@ -32,15 +32,19 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
32
32
 
33
33
  private var mAreListenersSet: Boolean = false
34
34
 
35
- private val screenStackFragment: ScreenStackFragment?
35
+ private val headerConfig: ScreenStackHeaderConfig?
36
36
  get() {
37
37
  val currentParent = parent
38
38
  if (currentParent is ScreenStackHeaderSubview) {
39
- return currentParent.config?.screenFragment
39
+ return currentParent.config
40
40
  }
41
+
41
42
  return null
42
43
  }
43
44
 
45
+ private val screenStackFragment: ScreenStackFragment?
46
+ get() = headerConfig?.screenFragment
47
+
44
48
  fun onUpdate() {
45
49
  setSearchViewProps()
46
50
  }
@@ -101,23 +105,25 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
101
105
  }
102
106
 
103
107
  private fun handleTextChange(newText: String?) {
104
- sendEvent(SearchBarChangeTextEvent(id, newText))
108
+ sendEvent(SearchBarChangeTextEvent(surfaceId, id, newText))
105
109
  }
106
110
 
107
111
  private fun handleFocusChange(hasFocus: Boolean) {
108
- sendEvent(if (hasFocus) SearchBarFocusEvent(id) else SearchBarBlurEvent(id))
112
+ sendEvent(if (hasFocus) SearchBarFocusEvent(surfaceId, id) else SearchBarBlurEvent(surfaceId, id))
109
113
  }
110
114
 
111
115
  private fun handleClose() {
112
- sendEvent(SearchBarCloseEvent(id))
116
+ sendEvent(SearchBarCloseEvent(surfaceId, id))
117
+ setToolbarElementsVisibility(VISIBLE)
113
118
  }
114
119
 
115
120
  private fun handleOpen() {
116
- sendEvent(SearchBarOpenEvent(id))
121
+ sendEvent(SearchBarOpenEvent(surfaceId, id))
122
+ setToolbarElementsVisibility(GONE)
117
123
  }
118
124
 
119
125
  private fun handleTextSubmit(newText: String?) {
120
- sendEvent(SearchBarSearchButtonPressEvent(id, newText))
126
+ sendEvent(SearchBarSearchButtonPressEvent(surfaceId, id, newText))
121
127
  }
122
128
 
123
129
  private fun sendEvent(event: Event<*>) {
@@ -144,6 +150,16 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
144
150
  text?.let { screenStackFragment?.searchView?.setText(it) }
145
151
  }
146
152
 
153
+ private fun setToolbarElementsVisibility(visibility: Int) {
154
+ for (i in 0..(headerConfig?.configSubviewsCount?.minus(1) ?: 0)) {
155
+ val subview = headerConfig?.getConfigSubview(i)
156
+ if (subview?.type != ScreenStackHeaderSubview.Type.SEARCH_BAR)
157
+ subview?.visibility = visibility
158
+ }
159
+ }
160
+
161
+ private val surfaceId = UIManagerHelper.getSurfaceId(this)
162
+
147
163
  enum class SearchBarAutoCapitalize {
148
164
  NONE, WORDS, SENTENCES, CHARACTERS
149
165
  }
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class HeaderAttachedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class HeaderAttachedEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class HeaderAttachedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topAttached"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class HeaderBackButtonClickedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class HeaderBackButtonClickedEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class HeaderBackButtonClickedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewI
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topHeaderBackButtonClickedEvent"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class HeaderDetachedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class HeaderDetachedEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class HeaderDetachedEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topDetached"
@@ -0,0 +1,26 @@
1
+ package com.swmansion.rnscreens.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.uimanager.events.Event
5
+ import com.facebook.react.uimanager.events.RCTEventEmitter
6
+
7
+ class HeaderHeightChangeEvent(
8
+ viewId: Int,
9
+ private val mHeaderHeight: Double
10
+ ) : Event<HeaderHeightChangeEvent>(viewId) {
11
+
12
+ override fun getEventName() = EVENT_NAME
13
+
14
+ // As the same header height could appear twice, use header height as a coalescing key.
15
+ override fun getCoalescingKey(): Short = mHeaderHeight.toInt().toShort()
16
+
17
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
+ val map = Arguments.createMap()
19
+ map.putDouble("headerHeight", mHeaderHeight)
20
+ rctEventEmitter.receiveEvent(viewTag, eventName, map)
21
+ }
22
+
23
+ companion object {
24
+ const val EVENT_NAME = "topHeaderHeightChange"
25
+ }
26
+ }
@@ -1,18 +1,16 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class ScreenAppearEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class ScreenAppearEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
15
- }
13
+ override fun getEventData(): WritableMap? = Arguments.createMap()
16
14
 
17
15
  companion object {
18
16
  const val EVENT_NAME = "topAppear"
@@ -1,18 +1,16 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class ScreenDisappearEvent(viewId: Int) : Event<ScreenDisappearEvent>(viewId) {
7
+ class ScreenDisappearEvent(surfaceId: Int, viewId: Int) : Event<ScreenDisappearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
15
- }
13
+ override fun getEventData(): WritableMap? = Arguments.createMap()
16
14
 
17
15
  companion object {
18
16
  const val EVENT_NAME = "topDisappear"
@@ -1,20 +1,17 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class ScreenDismissedEvent(viewId: Int) : Event<ScreenDismissedEvent>(viewId) {
7
+ class ScreenDismissedEvent(surfaceId: Int, viewId: Int) : Event<ScreenDismissedEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- val args = Arguments.createMap()
15
- // on Android we always dismiss one screen at a time
16
- args.putInt("dismissCount", 1)
17
- rctEventEmitter.receiveEvent(viewTag, eventName, args)
13
+ override fun getEventData(): WritableMap? = Arguments.createMap().apply {
14
+ putInt("dismissCount", 1)
18
15
  }
19
16
 
20
17
  companion object {
@@ -1,16 +1,17 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
7
  class ScreenTransitionProgressEvent(
8
+ surfaceId: Int,
8
9
  viewId: Int,
9
10
  private val mProgress: Float,
10
11
  private val mClosing: Boolean,
11
12
  private val mGoingForward: Boolean,
12
13
  private val mCoalescingKey: Short
13
- ) : Event<ScreenAppearEvent?>(viewId) {
14
+ ) : Event<ScreenAppearEvent?>(surfaceId, viewId) {
14
15
  override fun getEventName(): String {
15
16
  return EVENT_NAME
16
17
  }
@@ -19,12 +20,10 @@ class ScreenTransitionProgressEvent(
19
20
  return mCoalescingKey
20
21
  }
21
22
 
22
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
23
- val map = Arguments.createMap()
24
- map.putDouble("progress", mProgress.toDouble())
25
- map.putInt("closing", if (mClosing) 1 else 0)
26
- map.putInt("goingForward", if (mGoingForward) 1 else 0)
27
- rctEventEmitter.receiveEvent(viewTag, eventName, map)
23
+ override fun getEventData(): WritableMap? = Arguments.createMap().apply {
24
+ putDouble("progress", mProgress.toDouble())
25
+ putInt("closing", if (mClosing) 1 else 0)
26
+ putInt("goingForward", if (mGoingForward) 1 else 0)
28
27
  }
29
28
 
30
29
  companion object {
@@ -1,18 +1,16 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class ScreenWillAppearEvent(viewId: Int) : Event<ScreenWillAppearEvent>(viewId) {
7
+ class ScreenWillAppearEvent(surfaceId: Int, viewId: Int) : Event<ScreenWillAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
15
- }
13
+ override fun getEventData(): WritableMap? = Arguments.createMap()
16
14
 
17
15
  companion object {
18
16
  const val EVENT_NAME = "topWillAppear"
@@ -1,18 +1,16 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class ScreenWillDisappearEvent(viewId: Int) : Event<ScreenWillDisappearEvent>(viewId) {
7
+ class ScreenWillDisappearEvent(surfaceId: Int, viewId: Int) : Event<ScreenWillDisappearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
15
- }
13
+ override fun getEventData(): WritableMap? = Arguments.createMap()
16
14
 
17
15
  companion object {
18
16
  const val EVENT_NAME = "topWillDisappear"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class SearchBarBlurEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class SearchBarBlurEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class SearchBarBlurEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topBlur"
@@ -1,13 +1,14 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
7
  class SearchBarChangeTextEvent(
8
+ surfaceId: Int,
8
9
  viewId: Int,
9
10
  private val text: String?,
10
- ) : Event<ScreenAppearEvent>(viewId) {
11
+ ) : Event<ScreenAppearEvent>(surfaceId, viewId) {
11
12
  override fun getEventName(): String {
12
13
  return EVENT_NAME
13
14
  }
@@ -17,10 +18,8 @@ class SearchBarChangeTextEvent(
17
18
  return 0
18
19
  }
19
20
 
20
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
21
- val map = Arguments.createMap()
22
- map.putString("text", text)
23
- rctEventEmitter.receiveEvent(viewTag, eventName, map)
21
+ override fun getEventData(): WritableMap? = Arguments.createMap().apply {
22
+ putString("text", text)
24
23
  }
25
24
 
26
25
  companion object {
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class SearchBarCloseEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class SearchBarCloseEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class SearchBarCloseEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topClose"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class SearchBarFocusEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class SearchBarFocusEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class SearchBarFocusEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topFocus"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class SearchBarOpenEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
7
+ class SearchBarOpenEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,9 +14,7 @@ class SearchBarOpenEvent(viewId: Int) : Event<ScreenAppearEvent>(viewId) {
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
19
- }
17
+ override fun getEventData(): WritableMap? = Arguments.createMap()
20
18
 
21
19
  companion object {
22
20
  const val EVENT_NAME = "topOpen"
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class SearchBarSearchButtonPressEvent(viewId: Int, private val text: String?) : Event<ScreenAppearEvent>(viewId) {
7
+ class SearchBarSearchButtonPressEvent(surfaceId: Int, viewId: Int, private val text: String?) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
8
  override fun getEventName(): String {
9
9
  return EVENT_NAME
10
10
  }
@@ -14,10 +14,8 @@ class SearchBarSearchButtonPressEvent(viewId: Int, private val text: String?) :
14
14
  return 0
15
15
  }
16
16
 
17
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
18
- val map = Arguments.createMap()
19
- map.putString("text", text)
20
- rctEventEmitter.receiveEvent(viewTag, eventName, map)
17
+ override fun getEventData(): WritableMap? = Arguments.createMap().apply {
18
+ putString("text", text)
21
19
  }
22
20
 
23
21
  companion object {
@@ -1,18 +1,16 @@
1
1
  package com.swmansion.rnscreens.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
4
5
  import com.facebook.react.uimanager.events.Event
5
- import com.facebook.react.uimanager.events.RCTEventEmitter
6
6
 
7
- class StackFinishTransitioningEvent(viewId: Int) : Event<StackFinishTransitioningEvent>(viewId) {
7
+ class StackFinishTransitioningEvent(surfaceId: Int, viewId: Int) : Event<StackFinishTransitioningEvent>(surfaceId, viewId) {
8
8
  override fun getEventName() = EVENT_NAME
9
9
 
10
10
  // All events for a given view can be coalesced.
11
11
  override fun getCoalescingKey(): Short = 0
12
12
 
13
- override fun dispatch(rctEventEmitter: RCTEventEmitter) {
14
- rctEventEmitter.receiveEvent(viewTag, eventName, Arguments.createMap())
15
- }
13
+ override fun getEventData(): WritableMap? = Arguments.createMap()
16
14
 
17
15
  companion object {
18
16
  const val EVENT_NAME = "topFinishTransitioning"
@@ -0,0 +1,12 @@
1
+ package com.swmansion.rnscreens.utils
2
+
3
+ import android.content.Context
4
+ import android.content.pm.PackageManager
5
+
6
+ object DeviceUtils {
7
+
8
+ fun isPlatformAndroidTV(context: Context?): Boolean {
9
+ return context?.packageManager?.hasSystemFeature(PackageManager.FEATURE_LEANBACK) == true
10
+ }
11
+
12
+ }
@@ -11,7 +11,7 @@
11
11
  android:fillAfter="true"
12
12
  android:interpolator="@anim/rns_standard_accelerate_interpolator"
13
13
  android:startOffset="0"
14
- android:duration="450" />
14
+ android:duration="83" />
15
15
 
16
16
  <translate
17
17
  android:fromXDelta="0"
@@ -127,9 +127,9 @@
127
127
  [window addSubview:_container];
128
128
  }
129
129
 
130
- - (void)didMoveToWindow
130
+ - (void)didMoveToSuperview
131
131
  {
132
- if (self.window == nil) {
132
+ if (self.superview == nil) {
133
133
  if (_container != nil) {
134
134
  [_container removeFromSuperview];
135
135
  [_touchHandler detachFromView:_container];
package/ios/RNSScreen.h CHANGED
@@ -35,6 +35,8 @@ namespace react = facebook::react;
35
35
 
36
36
  - (instancetype)initWithView:(UIView *)view;
37
37
  - (UIViewController *)findChildVCForConfigAndTrait:(RNSWindowTrait)trait includingModals:(BOOL)includingModals;
38
+ - (BOOL)hasNestedStack;
39
+ - (void)calculateAndNotifyHeaderHeightChangeIsModal:(BOOL)isModal;
38
40
  - (void)notifyFinishTransitioning;
39
41
  - (RNSScreenView *)screenView;
40
42
  #ifdef RCT_NEW_ARCH_ENABLED
@@ -100,6 +102,7 @@ namespace react = facebook::react;
100
102
  @property (nonatomic, copy) RCTDirectEventBlock onAppear;
101
103
  @property (nonatomic, copy) RCTDirectEventBlock onDisappear;
102
104
  @property (nonatomic, copy) RCTDirectEventBlock onDismissed;
105
+ @property (nonatomic, copy) RCTDirectEventBlock onHeaderHeightChange;
103
106
  @property (nonatomic, copy) RCTDirectEventBlock onWillAppear;
104
107
  @property (nonatomic, copy) RCTDirectEventBlock onWillDisappear;
105
108
  @property (nonatomic, copy) RCTDirectEventBlock onNativeDismissCancelled;
@@ -108,6 +111,7 @@ namespace react = facebook::react;
108
111
  #endif // RCT_NEW_ARCH_ENABLED
109
112
 
110
113
  - (void)notifyFinishTransitioning;
114
+ - (void)notifyHeaderHeightChange:(double)height;
111
115
 
112
116
  #ifdef RCT_NEW_ARCH_ENABLED
113
117
  - (void)notifyWillAppear;
@@ -122,6 +126,7 @@ namespace react = facebook::react;
122
126
  - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingForward:(BOOL)goingForward;
123
127
  - (void)notifyDismissCancelledWithDismissCount:(int)dismissCount;
124
128
  - (BOOL)isModal;
129
+ - (BOOL)isPresentedAsNativeModal;
125
130
 
126
131
  /// Looks for header configuration in instance's `reactSubviews` and returns it. If not present returns `nil`.
127
132
  - (RNSScreenStackHeaderConfig *_Nullable)findHeaderConfig;