react-native-screens 3.31.1 → 3.33.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 (203) hide show
  1. package/README.md +21 -11
  2. package/RNScreens.podspec +11 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +16 -9
  5. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
  6. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  7. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  8. package/android/src/main/cpp/NativeProxy.h +35 -0
  9. package/android/src/main/cpp/OnLoad.cpp +8 -0
  10. package/android/src/main/cpp/jni-adapter.cpp +86 -93
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +7 -2
  12. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +6 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  14. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  15. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +150 -40
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +63 -39
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +88 -57
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +131 -36
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +177 -77
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +77 -25
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +31 -9
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -54
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  35. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  39. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -6
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +5 -2
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +5 -2
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  52. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  54. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +214 -0
  55. package/android/src/main/jni/CMakeLists.txt +5 -4
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
  57. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
  58. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +6 -0
  59. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +2 -0
  60. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -0
  61. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +1 -0
  62. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
  63. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
  64. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  65. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  66. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  67. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  68. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +8 -9
  69. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  70. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +9 -8
  71. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +147 -10
  72. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  73. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +29 -7
  74. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +22 -1
  75. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +30 -10
  76. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  77. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  78. package/cpp/RNSScreenRemovalListener.h +20 -0
  79. package/cpp/RNScreensTurboModule.cpp +31 -23
  80. package/cpp/RNScreensTurboModule.h +17 -20
  81. package/ios/RNSConvert.h +7 -0
  82. package/ios/RNSConvert.mm +24 -0
  83. package/ios/RNSModalScreen.mm +22 -0
  84. package/ios/RNSModule.mm +2 -3
  85. package/ios/RNSScreen.h +2 -1
  86. package/ios/RNSScreen.mm +35 -19
  87. package/ios/RNSScreenContainer.mm +1 -1
  88. package/ios/RNSScreenStack.mm +59 -54
  89. package/ios/RNSScreenStackAnimator.mm +43 -6
  90. package/ios/RNSScreenStackHeaderConfig.h +2 -0
  91. package/ios/RNSScreenStackHeaderConfig.mm +93 -28
  92. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  93. package/ios/RNSSearchBar.h +5 -5
  94. package/ios/RNSSearchBar.mm +11 -11
  95. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
  96. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
  97. package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
  98. package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
  99. package/ios/utils/UIView+RNSUtility.h +23 -0
  100. package/ios/utils/UIView+RNSUtility.mm +55 -0
  101. package/lib/commonjs/components/Screen.js +119 -127
  102. package/lib/commonjs/components/Screen.js.map +1 -1
  103. package/lib/commonjs/components/ScreenStack.js +8 -1
  104. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  105. package/lib/commonjs/components/SearchBar.js +39 -36
  106. package/lib/commonjs/components/SearchBar.js.map +1 -1
  107. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  108. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  109. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  110. package/lib/commonjs/native-stack/views/HeaderConfig.js +2 -0
  111. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  112. package/lib/commonjs/native-stack/views/NativeStackView.js +4 -0
  113. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  114. package/lib/module/components/Screen.js +118 -126
  115. package/lib/module/components/Screen.js.map +1 -1
  116. package/lib/module/components/ScreenStack.js +8 -1
  117. package/lib/module/components/ScreenStack.js.map +1 -1
  118. package/lib/module/components/SearchBar.js +39 -36
  119. package/lib/module/components/SearchBar.js.map +1 -1
  120. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  121. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  122. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  123. package/lib/module/native-stack/views/HeaderConfig.js +2 -0
  124. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  125. package/lib/module/native-stack/views/NativeStackView.js +4 -0
  126. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  127. package/lib/typescript/TransitionProgressContext.d.ts +1 -1
  128. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -1
  129. package/lib/typescript/components/Screen.d.ts +3 -14
  130. package/lib/typescript/components/Screen.d.ts.map +1 -1
  131. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  132. package/lib/typescript/components/SearchBar.d.ts +14 -21
  133. package/lib/typescript/components/SearchBar.d.ts.map +1 -1
  134. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +12 -10
  135. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  136. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +12 -10
  137. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  138. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +5 -3
  139. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  140. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +1 -1
  141. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  142. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +1 -1
  143. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
  144. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +9 -9
  145. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
  146. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +1 -1
  147. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -1
  148. package/lib/typescript/native-stack/types.d.ts +39 -14
  149. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  150. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +1 -1
  151. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -1
  152. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +1 -1
  153. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -1
  154. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -1
  155. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -1
  156. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +2 -2
  157. package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -1
  158. package/lib/typescript/native-stack/views/NativeStackView.d.ts +1 -1
  159. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  160. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +1 -1
  161. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -1
  162. package/lib/typescript/types.d.ts +39 -13
  163. package/lib/typescript/types.d.ts.map +1 -1
  164. package/lib/typescript/useTransitionProgress.d.ts +3 -3
  165. package/native-stack/README.md +116 -98
  166. package/package.json +16 -7
  167. package/react-native.config.js +17 -15
  168. package/src/TransitionProgressContext.tsx +1 -1
  169. package/src/components/Screen.tsx +31 -37
  170. package/src/components/ScreenStack.tsx +11 -1
  171. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  172. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  173. package/src/components/SearchBar.tsx +77 -65
  174. package/src/core.ts +1 -1
  175. package/src/fabric/ModalScreenNativeComponent.ts +2 -0
  176. package/src/fabric/ScreenNativeComponent.ts +2 -0
  177. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  178. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +4 -1
  179. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  180. package/src/fabric/SearchBarNativeComponent.ts +7 -7
  181. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  182. package/src/gesture-handler/constraints.ts +5 -5
  183. package/src/gesture-handler/fabricUtils.ts +1 -1
  184. package/src/native-stack/contexts/GHContext.tsx +1 -1
  185. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  186. package/src/native-stack/types.tsx +29 -4
  187. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  188. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  189. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  190. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  191. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  192. package/src/native-stack/views/FontProcessor.tsx +1 -1
  193. package/src/native-stack/views/HeaderConfig.tsx +3 -1
  194. package/src/native-stack/views/NativeStackView.tsx +13 -9
  195. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  196. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  197. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  198. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  199. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  200. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  201. package/src/types.tsx +31 -5
  202. package/src/useTransitionProgress.tsx +1 -1
  203. package/windows/README.md +4 -1
@@ -16,7 +16,9 @@ import com.swmansion.rnscreens.events.HeaderDetachedEvent
16
16
  import javax.annotation.Nonnull
17
17
 
18
18
  @ReactModule(name = ScreenStackHeaderConfigViewManager.REACT_CLASS)
19
- class ScreenStackHeaderConfigViewManager : ViewGroupManager<ScreenStackHeaderConfig>(), RNSScreenStackHeaderConfigManagerInterface<ScreenStackHeaderConfig> {
19
+ class ScreenStackHeaderConfigViewManager :
20
+ ViewGroupManager<ScreenStackHeaderConfig>(),
21
+ RNSScreenStackHeaderConfigManagerInterface<ScreenStackHeaderConfig> {
20
22
  private val delegate: ViewManagerDelegate<ScreenStackHeaderConfig>
21
23
 
22
24
  init {
@@ -27,16 +29,22 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager<ScreenStackHeaderCon
27
29
 
28
30
  override fun createViewInstance(reactContext: ThemedReactContext) = ScreenStackHeaderConfig(reactContext)
29
31
 
30
- override fun addView(parent: ScreenStackHeaderConfig, child: View, index: Int) {
32
+ override fun addView(
33
+ parent: ScreenStackHeaderConfig,
34
+ child: View,
35
+ index: Int,
36
+ ) {
31
37
  if (child !is ScreenStackHeaderSubview) {
32
38
  throw JSApplicationCausedNativeException(
33
- "Config children should be of type " + ScreenStackHeaderSubviewManager.REACT_CLASS
39
+ "Config children should be of type " + ScreenStackHeaderSubviewManager.REACT_CLASS,
34
40
  )
35
41
  }
36
42
  parent.addConfigSubview(child, index)
37
43
  }
38
44
 
39
- override fun onDropViewInstance(@Nonnull view: ScreenStackHeaderConfig) {
45
+ override fun onDropViewInstance(
46
+ @Nonnull view: ScreenStackHeaderConfig,
47
+ ) {
40
48
  view.destroy()
41
49
  }
42
50
 
@@ -44,13 +52,19 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager<ScreenStackHeaderCon
44
52
  parent.removeAllConfigSubviews()
45
53
  }
46
54
 
47
- override fun removeViewAt(parent: ScreenStackHeaderConfig, index: Int) {
55
+ override fun removeViewAt(
56
+ parent: ScreenStackHeaderConfig,
57
+ index: Int,
58
+ ) {
48
59
  parent.removeConfigSubview(index)
49
60
  }
50
61
 
51
62
  override fun getChildCount(parent: ScreenStackHeaderConfig): Int = parent.configSubviewsCount
52
63
 
53
- override fun getChildAt(parent: ScreenStackHeaderConfig, index: Int): View = parent.getConfigSubview(index)
64
+ override fun getChildAt(
65
+ parent: ScreenStackHeaderConfig,
66
+ index: Int,
67
+ ): View = parent.getConfigSubview(index)
54
68
 
55
69
  override fun needsCustomLayoutForChildren() = true
56
70
 
@@ -60,88 +74,126 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager<ScreenStackHeaderCon
60
74
  }
61
75
 
62
76
  @ReactProp(name = "title")
63
- override fun setTitle(config: ScreenStackHeaderConfig, title: String?) {
77
+ override fun setTitle(
78
+ config: ScreenStackHeaderConfig,
79
+ title: String?,
80
+ ) {
64
81
  config.setTitle(title)
65
82
  }
66
83
 
67
84
  @ReactProp(name = "titleFontFamily")
68
- override fun setTitleFontFamily(config: ScreenStackHeaderConfig, titleFontFamily: String?) {
85
+ override fun setTitleFontFamily(
86
+ config: ScreenStackHeaderConfig,
87
+ titleFontFamily: String?,
88
+ ) {
69
89
  config.setTitleFontFamily(titleFontFamily)
70
90
  }
71
91
 
72
92
  @ReactProp(name = "titleFontSize")
73
- override fun setTitleFontSize(config: ScreenStackHeaderConfig, titleFontSize: Int) {
93
+ override fun setTitleFontSize(
94
+ config: ScreenStackHeaderConfig,
95
+ titleFontSize: Int,
96
+ ) {
74
97
  config.setTitleFontSize(titleFontSize.toFloat())
75
98
  }
76
99
 
77
100
  @ReactProp(name = "titleFontWeight")
78
- override fun setTitleFontWeight(config: ScreenStackHeaderConfig, titleFontWeight: String?) {
101
+ override fun setTitleFontWeight(
102
+ config: ScreenStackHeaderConfig,
103
+ titleFontWeight: String?,
104
+ ) {
79
105
  config.setTitleFontWeight(titleFontWeight)
80
106
  }
81
107
 
82
108
  @ReactProp(name = "titleColor", customType = "Color")
83
- override fun setTitleColor(config: ScreenStackHeaderConfig, titleColor: Int?) {
109
+ override fun setTitleColor(
110
+ config: ScreenStackHeaderConfig,
111
+ titleColor: Int?,
112
+ ) {
84
113
  if (titleColor != null) {
85
114
  config.setTitleColor(titleColor)
86
115
  }
87
116
  }
88
117
 
89
118
  @ReactProp(name = "backgroundColor", customType = "Color")
90
- override fun setBackgroundColor(config: ScreenStackHeaderConfig, backgroundColor: Int?) {
119
+ override fun setBackgroundColor(
120
+ config: ScreenStackHeaderConfig,
121
+ backgroundColor: Int?,
122
+ ) {
91
123
  config.setBackgroundColor(backgroundColor)
92
124
  }
93
125
 
94
126
  @ReactProp(name = "hideShadow")
95
- override fun setHideShadow(config: ScreenStackHeaderConfig, hideShadow: Boolean) {
127
+ override fun setHideShadow(
128
+ config: ScreenStackHeaderConfig,
129
+ hideShadow: Boolean,
130
+ ) {
96
131
  config.setHideShadow(hideShadow)
97
132
  }
98
133
 
99
134
  @ReactProp(name = "hideBackButton")
100
- override fun setHideBackButton(config: ScreenStackHeaderConfig, hideBackButton: Boolean) {
135
+ override fun setHideBackButton(
136
+ config: ScreenStackHeaderConfig,
137
+ hideBackButton: Boolean,
138
+ ) {
101
139
  config.setHideBackButton(hideBackButton)
102
140
  }
103
141
 
104
142
  @ReactProp(name = "topInsetEnabled")
105
- override fun setTopInsetEnabled(config: ScreenStackHeaderConfig, topInsetEnabled: Boolean) {
143
+ override fun setTopInsetEnabled(
144
+ config: ScreenStackHeaderConfig,
145
+ topInsetEnabled: Boolean,
146
+ ) {
106
147
  config.setTopInsetEnabled(topInsetEnabled)
107
148
  }
108
149
 
109
150
  @ReactProp(name = "color", customType = "Color")
110
- override fun setColor(config: ScreenStackHeaderConfig, color: Int?) {
151
+ override fun setColor(
152
+ config: ScreenStackHeaderConfig,
153
+ color: Int?,
154
+ ) {
111
155
  config.setTintColor(color ?: 0)
112
156
  }
113
157
 
114
158
  @ReactProp(name = "hidden")
115
- override fun setHidden(config: ScreenStackHeaderConfig, hidden: Boolean) {
159
+ override fun setHidden(
160
+ config: ScreenStackHeaderConfig,
161
+ hidden: Boolean,
162
+ ) {
116
163
  config.setHidden(hidden)
117
164
  }
118
165
 
119
166
  @ReactProp(name = "translucent")
120
- override fun setTranslucent(config: ScreenStackHeaderConfig, translucent: Boolean) {
167
+ override fun setTranslucent(
168
+ config: ScreenStackHeaderConfig,
169
+ translucent: Boolean,
170
+ ) {
121
171
  config.setTranslucent(translucent)
122
172
  }
123
173
 
124
174
  @ReactProp(name = "backButtonInCustomView")
125
175
  override fun setBackButtonInCustomView(
126
176
  config: ScreenStackHeaderConfig,
127
- backButtonInCustomView: Boolean
177
+ backButtonInCustomView: Boolean,
128
178
  ) {
129
179
  config.setBackButtonInCustomView(backButtonInCustomView)
130
180
  }
131
181
 
132
182
  @ReactProp(name = "direction")
133
- override fun setDirection(config: ScreenStackHeaderConfig, direction: String?) {
183
+ override fun setDirection(
184
+ config: ScreenStackHeaderConfig,
185
+ direction: String?,
186
+ ) {
134
187
  config.setDirection(direction)
135
188
  }
136
189
 
137
- override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
138
- return MapBuilder.of(
190
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? =
191
+ MapBuilder.of(
139
192
  HeaderAttachedEvent.EVENT_NAME,
140
193
  MapBuilder.of("registrationName", "onAttached"),
141
194
  HeaderDetachedEvent.EVENT_NAME,
142
195
  MapBuilder.of("registrationName", "onDetached"),
143
196
  )
144
- }
145
197
 
146
198
  protected override fun getDelegate(): ViewManagerDelegate<ScreenStackHeaderConfig> = delegate
147
199
 
@@ -151,54 +203,97 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager<ScreenStackHeaderCon
151
203
 
152
204
  // TODO: Find better way to handle platform specific props
153
205
  private fun logNotAvailable(propName: String) {
154
- Log.w("RN SCREENS", "$propName prop is not available on Android")
206
+ Log.w("[RNScreens]", "$propName prop is not available on Android")
155
207
  }
156
208
 
157
- override fun setBackTitle(view: ScreenStackHeaderConfig?, value: String?) {
209
+ override fun setBackTitle(
210
+ view: ScreenStackHeaderConfig?,
211
+ value: String?,
212
+ ) {
158
213
  logNotAvailable("backTitle")
159
214
  }
160
215
 
161
- override fun setBackTitleFontFamily(view: ScreenStackHeaderConfig?, value: String?) {
216
+ override fun setBackTitleFontFamily(
217
+ view: ScreenStackHeaderConfig?,
218
+ value: String?,
219
+ ) {
162
220
  logNotAvailable("backTitleFontFamily")
163
221
  }
164
222
 
165
- override fun setBackTitleFontSize(view: ScreenStackHeaderConfig?, value: Int) {
223
+ override fun setBackTitleFontSize(
224
+ view: ScreenStackHeaderConfig?,
225
+ value: Int,
226
+ ) {
166
227
  logNotAvailable("backTitleFontSize")
167
228
  }
168
229
 
169
- override fun setBackTitleVisible(view: ScreenStackHeaderConfig?, value: Boolean) {
230
+ override fun setBackTitleVisible(
231
+ view: ScreenStackHeaderConfig?,
232
+ value: Boolean,
233
+ ) {
170
234
  logNotAvailable("backTitleVisible")
171
235
  }
172
236
 
173
- override fun setLargeTitle(view: ScreenStackHeaderConfig?, value: Boolean) {
237
+ override fun setLargeTitle(
238
+ view: ScreenStackHeaderConfig?,
239
+ value: Boolean,
240
+ ) {
174
241
  logNotAvailable("largeTitle")
175
242
  }
176
243
 
177
- override fun setLargeTitleFontFamily(view: ScreenStackHeaderConfig?, value: String?) {
244
+ override fun setLargeTitleFontFamily(
245
+ view: ScreenStackHeaderConfig?,
246
+ value: String?,
247
+ ) {
178
248
  logNotAvailable("largeTitleFontFamily")
179
249
  }
180
250
 
181
- override fun setLargeTitleFontSize(view: ScreenStackHeaderConfig?, value: Int) {
251
+ override fun setLargeTitleFontSize(
252
+ view: ScreenStackHeaderConfig?,
253
+ value: Int,
254
+ ) {
182
255
  logNotAvailable("largeTitleFontSize")
183
256
  }
184
257
 
185
- override fun setLargeTitleFontWeight(view: ScreenStackHeaderConfig?, value: String?) {
258
+ override fun setLargeTitleFontWeight(
259
+ view: ScreenStackHeaderConfig?,
260
+ value: String?,
261
+ ) {
186
262
  logNotAvailable("largeTitleFontWeight")
187
263
  }
188
264
 
189
- override fun setLargeTitleBackgroundColor(view: ScreenStackHeaderConfig?, value: Int?) {
265
+ override fun setLargeTitleBackgroundColor(
266
+ view: ScreenStackHeaderConfig?,
267
+ value: Int?,
268
+ ) {
190
269
  logNotAvailable("largeTitleBackgroundColor")
191
270
  }
192
271
 
193
- override fun setLargeTitleHideShadow(view: ScreenStackHeaderConfig?, value: Boolean) {
272
+ override fun setLargeTitleHideShadow(
273
+ view: ScreenStackHeaderConfig?,
274
+ value: Boolean,
275
+ ) {
194
276
  logNotAvailable("largeTitleHideShadow")
195
277
  }
196
278
 
197
- override fun setLargeTitleColor(view: ScreenStackHeaderConfig?, value: Int?) {
279
+ override fun setLargeTitleColor(
280
+ view: ScreenStackHeaderConfig?,
281
+ value: Int?,
282
+ ) {
198
283
  logNotAvailable("largeTitleColor")
199
284
  }
200
285
 
201
- override fun setDisableBackButtonMenu(view: ScreenStackHeaderConfig?, value: Boolean) {
286
+ override fun setDisableBackButtonMenu(
287
+ view: ScreenStackHeaderConfig?,
288
+ value: Boolean,
289
+ ) {
202
290
  logNotAvailable("disableBackButtonMenu")
203
291
  }
292
+
293
+ override fun setBackButtonDisplayMode(
294
+ view: ScreenStackHeaderConfig?,
295
+ value: String?,
296
+ ) {
297
+ logNotAvailable("backButtonDisplayMode")
298
+ }
204
299
  }
@@ -6,7 +6,9 @@ import com.facebook.react.bridge.ReactContext
6
6
  import com.facebook.react.views.view.ReactViewGroup
7
7
 
8
8
  @SuppressLint("ViewConstructor")
9
- class ScreenStackHeaderSubview(context: ReactContext?) : ReactViewGroup(context) {
9
+ class ScreenStackHeaderSubview(
10
+ context: ReactContext?,
11
+ ) : ReactViewGroup(context) {
10
12
  private var reactWidth = 0
11
13
  private var reactHeight = 0
12
14
  var type = Type.RIGHT
@@ -14,7 +16,10 @@ class ScreenStackHeaderSubview(context: ReactContext?) : ReactViewGroup(context)
14
16
  val config: ScreenStackHeaderConfig?
15
17
  get() = (parent as? CustomToolbar)?.config
16
18
 
17
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
19
+ override fun onMeasure(
20
+ widthMeasureSpec: Int,
21
+ heightMeasureSpec: Int,
22
+ ) {
18
23
  if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY &&
19
24
  MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY
20
25
  ) {
@@ -30,9 +35,19 @@ class ScreenStackHeaderSubview(context: ReactContext?) : ReactViewGroup(context)
30
35
  setMeasuredDimension(reactWidth, reactHeight)
31
36
  }
32
37
 
33
- override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) = Unit
38
+ override fun onLayout(
39
+ changed: Boolean,
40
+ left: Int,
41
+ top: Int,
42
+ right: Int,
43
+ bottom: Int,
44
+ ) = Unit
34
45
 
35
46
  enum class Type {
36
- LEFT, CENTER, RIGHT, BACK, SEARCH_BAR
47
+ LEFT,
48
+ CENTER,
49
+ RIGHT,
50
+ BACK,
51
+ SEARCH_BAR,
37
52
  }
38
53
  }
@@ -10,7 +10,9 @@ import com.facebook.react.viewmanagers.RNSScreenStackHeaderSubviewManagerDelegat
10
10
  import com.facebook.react.viewmanagers.RNSScreenStackHeaderSubviewManagerInterface
11
11
 
12
12
  @ReactModule(name = ScreenStackHeaderSubviewManager.REACT_CLASS)
13
- class ScreenStackHeaderSubviewManager : ViewGroupManager<ScreenStackHeaderSubview>(), RNSScreenStackHeaderSubviewManagerInterface<ScreenStackHeaderSubview> {
13
+ class ScreenStackHeaderSubviewManager :
14
+ ViewGroupManager<ScreenStackHeaderSubview>(),
15
+ RNSScreenStackHeaderSubviewManagerInterface<ScreenStackHeaderSubview> {
14
16
  private val delegate: ViewManagerDelegate<ScreenStackHeaderSubview>
15
17
 
16
18
  init {
@@ -22,15 +24,19 @@ class ScreenStackHeaderSubviewManager : ViewGroupManager<ScreenStackHeaderSubvie
22
24
  override fun createViewInstance(context: ThemedReactContext) = ScreenStackHeaderSubview(context)
23
25
 
24
26
  @ReactProp(name = "type")
25
- override fun setType(view: ScreenStackHeaderSubview, type: String?) {
26
- view.type = when (type) {
27
- "left" -> ScreenStackHeaderSubview.Type.LEFT
28
- "center" -> ScreenStackHeaderSubview.Type.CENTER
29
- "right" -> ScreenStackHeaderSubview.Type.RIGHT
30
- "back" -> ScreenStackHeaderSubview.Type.BACK
31
- "searchBar" -> ScreenStackHeaderSubview.Type.SEARCH_BAR
32
- else -> throw JSApplicationIllegalArgumentException("Unknown type $type")
33
- }
27
+ override fun setType(
28
+ view: ScreenStackHeaderSubview,
29
+ type: String?,
30
+ ) {
31
+ view.type =
32
+ when (type) {
33
+ "left" -> ScreenStackHeaderSubview.Type.LEFT
34
+ "center" -> ScreenStackHeaderSubview.Type.CENTER
35
+ "right" -> ScreenStackHeaderSubview.Type.RIGHT
36
+ "back" -> ScreenStackHeaderSubview.Type.BACK
37
+ "searchBar" -> ScreenStackHeaderSubview.Type.SEARCH_BAR
38
+ else -> throw JSApplicationIllegalArgumentException("Unknown type $type")
39
+ }
34
40
  }
35
41
 
36
42
  protected override fun getDelegate(): ViewManagerDelegate<ScreenStackHeaderSubview> = delegate
@@ -1,7 +1,6 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
3
  import android.view.View
4
- import android.view.ViewGroup
5
4
  import com.facebook.react.bridge.ReactApplicationContext
6
5
  import com.facebook.react.module.annotations.ReactModule
7
6
  import com.facebook.react.uimanager.LayoutShadowNode
@@ -13,7 +12,9 @@ import com.facebook.react.viewmanagers.RNSScreenStackManagerInterface
13
12
  import com.swmansion.rnscreens.events.StackFinishTransitioningEvent
14
13
 
15
14
  @ReactModule(name = ScreenStackViewManager.REACT_CLASS)
16
- class ScreenStackViewManager : ViewGroupManager<ScreenStack>(), RNSScreenStackManagerInterface<ScreenStack> {
15
+ class ScreenStackViewManager :
16
+ ViewGroupManager<ScreenStack>(),
17
+ RNSScreenStackManagerInterface<ScreenStack> {
17
18
  private val delegate: ViewManagerDelegate<ScreenStack>
18
19
 
19
20
  init {
@@ -24,40 +25,41 @@ class ScreenStackViewManager : ViewGroupManager<ScreenStack>(), RNSScreenStackMa
24
25
 
25
26
  override fun createViewInstance(reactContext: ThemedReactContext) = ScreenStack(reactContext)
26
27
 
27
- override fun addView(parent: ScreenStack, child: View, index: Int) {
28
+ override fun addView(
29
+ parent: ScreenStack,
30
+ child: View,
31
+ index: Int,
32
+ ) {
28
33
  require(child is Screen) { "Attempt attach child that is not of type RNScreen" }
34
+ NativeProxy.addScreenToMap(child.id, child)
29
35
  parent.addScreen(child, index)
30
36
  }
31
37
 
32
- override fun removeViewAt(parent: ScreenStack, index: Int) {
33
- prepareOutTransition(parent.getScreenAt(index))
38
+ override fun removeViewAt(
39
+ parent: ScreenStack,
40
+ index: Int,
41
+ ) {
42
+ val screen = parent.getScreenAt(index)
43
+ prepareOutTransition(screen)
34
44
  parent.removeScreenAt(index)
45
+ NativeProxy.removeScreenFromMap(screen.id)
35
46
  }
36
47
 
37
48
  private fun prepareOutTransition(screen: Screen?) {
38
- startTransitionRecursive(screen)
49
+ screen?.startRemovalTransition()
39
50
  }
40
51
 
41
- private fun startTransitionRecursive(parent: ViewGroup?) {
42
- parent?.let {
43
- for (i in 0 until it.childCount) {
44
- val child = it.getChildAt(i)
45
- child?.let { view -> it.startViewTransition(view) }
46
- if (child is ScreenStackHeaderConfig) {
47
- // we want to start transition on children of the toolbar too,
48
- // which is not a child of ScreenStackHeaderConfig
49
- startTransitionRecursive(child.toolbar)
50
- }
51
- if (child is ViewGroup) {
52
- startTransitionRecursive(child)
53
- }
54
- }
55
- }
52
+ override fun invalidate() {
53
+ super.invalidate()
54
+ NativeProxy.clearMapOnInvalidate()
56
55
  }
57
56
 
58
57
  override fun getChildCount(parent: ScreenStack) = parent.screenCount
59
58
 
60
- override fun getChildAt(parent: ScreenStack, index: Int): View = parent.getScreenAt(index)
59
+ override fun getChildAt(
60
+ parent: ScreenStack,
61
+ index: Int,
62
+ ): View = parent.getScreenAt(index)
61
63
 
62
64
  override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context)
63
65
 
@@ -65,9 +67,10 @@ class ScreenStackViewManager : ViewGroupManager<ScreenStack>(), RNSScreenStackMa
65
67
 
66
68
  protected override fun getDelegate(): ViewManagerDelegate<ScreenStack> = delegate
67
69
 
68
- override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> = mutableMapOf(
69
- StackFinishTransitioningEvent.EVENT_NAME to mutableMapOf("registrationName" to "onFinishTransitioning")
70
- )
70
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
71
+ mutableMapOf(
72
+ StackFinishTransitioningEvent.EVENT_NAME to mutableMapOf("registrationName" to "onFinishTransitioning"),
73
+ )
71
74
 
72
75
  companion object {
73
76
  const val REACT_CLASS = "RNSScreenStack"