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
@@ -6,7 +6,9 @@ import com.facebook.react.uimanager.NativeViewHierarchyManager
6
6
  import com.facebook.react.uimanager.NativeViewHierarchyOptimizer
7
7
  import com.facebook.react.uimanager.UIManagerModule
8
8
 
9
- internal class ScreensShadowNode(private var context: ReactContext) : LayoutShadowNode() {
9
+ internal class ScreensShadowNode(
10
+ private var context: ReactContext,
11
+ ) : LayoutShadowNode() {
10
12
  override fun onBeforeLayout(nativeViewHierarchyOptimizer: NativeViewHierarchyOptimizer) {
11
13
  super.onBeforeLayout(nativeViewHierarchyOptimizer)
12
14
  (context.getNativeModule(UIManagerModule::class.java))?.addUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
@@ -1,12 +1,15 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
+ import android.util.Log
3
4
  import com.facebook.react.bridge.JSApplicationIllegalArgumentException
4
- import com.facebook.react.bridge.ReadableArray
5
5
  import com.facebook.react.common.MapBuilder
6
6
  import com.facebook.react.module.annotations.ReactModule
7
7
  import com.facebook.react.uimanager.ThemedReactContext
8
8
  import com.facebook.react.uimanager.ViewGroupManager
9
+ import com.facebook.react.uimanager.ViewManagerDelegate
9
10
  import com.facebook.react.uimanager.annotations.ReactProp
11
+ import com.facebook.react.viewmanagers.RNSSearchBarManagerDelegate
12
+ import com.facebook.react.viewmanagers.RNSSearchBarManagerInterface
10
13
  import com.swmansion.rnscreens.events.SearchBarBlurEvent
11
14
  import com.swmansion.rnscreens.events.SearchBarChangeTextEvent
12
15
  import com.swmansion.rnscreens.events.SearchBarCloseEvent
@@ -15,120 +18,223 @@ import com.swmansion.rnscreens.events.SearchBarOpenEvent
15
18
  import com.swmansion.rnscreens.events.SearchBarSearchButtonPressEvent
16
19
 
17
20
  @ReactModule(name = SearchBarManager.REACT_CLASS)
18
- class SearchBarManager : ViewGroupManager<SearchBarView>() {
19
- override fun getName(): String {
20
- return REACT_CLASS
21
- }
21
+ class SearchBarManager :
22
+ ViewGroupManager<SearchBarView>(),
23
+ RNSSearchBarManagerInterface<SearchBarView> {
24
+ private val delegate: ViewManagerDelegate<SearchBarView>
22
25
 
23
- override fun createViewInstance(context: ThemedReactContext): SearchBarView {
24
- return SearchBarView(context)
26
+ init {
27
+ delegate = RNSSearchBarManagerDelegate<SearchBarView, SearchBarManager>(this)
25
28
  }
26
29
 
30
+ protected override fun getDelegate(): ViewManagerDelegate<SearchBarView> = delegate
31
+
32
+ override fun getName(): String = REACT_CLASS
33
+
34
+ override fun createViewInstance(context: ThemedReactContext): SearchBarView = SearchBarView(context)
35
+
27
36
  override fun onAfterUpdateTransaction(view: SearchBarView) {
28
37
  super.onAfterUpdateTransaction(view)
29
38
  view.onUpdate()
30
39
  }
31
40
 
32
41
  @ReactProp(name = "autoCapitalize")
33
- fun setAutoCapitalize(view: SearchBarView, autoCapitalize: String?) {
34
- view.autoCapitalize = when (autoCapitalize) {
35
- null, "none" -> SearchBarView.SearchBarAutoCapitalize.NONE
36
- "words" -> SearchBarView.SearchBarAutoCapitalize.WORDS
37
- "sentences" -> SearchBarView.SearchBarAutoCapitalize.SENTENCES
38
- "characters" -> SearchBarView.SearchBarAutoCapitalize.CHARACTERS
39
- else -> throw JSApplicationIllegalArgumentException(
40
- "Forbidden auto capitalize value passed"
41
- )
42
- }
42
+ override fun setAutoCapitalize(
43
+ view: SearchBarView,
44
+ autoCapitalize: String?,
45
+ ) {
46
+ view.autoCapitalize =
47
+ when (autoCapitalize) {
48
+ null, "none" -> SearchBarView.SearchBarAutoCapitalize.NONE
49
+ "words" -> SearchBarView.SearchBarAutoCapitalize.WORDS
50
+ "sentences" -> SearchBarView.SearchBarAutoCapitalize.SENTENCES
51
+ "characters" -> SearchBarView.SearchBarAutoCapitalize.CHARACTERS
52
+ else -> throw JSApplicationIllegalArgumentException(
53
+ "Forbidden auto capitalize value passed",
54
+ )
55
+ }
43
56
  }
44
57
 
45
58
  @ReactProp(name = "autoFocus")
46
- fun setAutoFocus(view: SearchBarView, autoFocus: Boolean?) {
59
+ fun setAutoFocus(
60
+ view: SearchBarView,
61
+ autoFocus: Boolean?,
62
+ ) {
47
63
  view.autoFocus = autoFocus ?: false
48
64
  }
49
65
 
50
66
  @ReactProp(name = "barTintColor", customType = "Color")
51
- fun setTintColor(view: SearchBarView, color: Int?) {
67
+ override fun setBarTintColor(
68
+ view: SearchBarView,
69
+ color: Int?,
70
+ ) {
52
71
  view.tintColor = color
53
72
  }
54
73
 
55
74
  @ReactProp(name = "disableBackButtonOverride")
56
- fun setDisableBackButtonOverride(view: SearchBarView, disableBackButtonOverride: Boolean?) {
75
+ override fun setDisableBackButtonOverride(
76
+ view: SearchBarView,
77
+ disableBackButtonOverride: Boolean,
78
+ ) {
57
79
  view.shouldOverrideBackButton = disableBackButtonOverride != true
58
80
  }
59
81
 
60
82
  @ReactProp(name = "inputType")
61
- fun setInputType(view: SearchBarView, inputType: String?) {
62
- view.inputType = when (inputType) {
63
- null, "text" -> SearchBarView.SearchBarInputTypes.TEXT
64
- "phone" -> SearchBarView.SearchBarInputTypes.PHONE
65
- "number" -> SearchBarView.SearchBarInputTypes.NUMBER
66
- "email" -> SearchBarView.SearchBarInputTypes.EMAIL
67
- else -> throw JSApplicationIllegalArgumentException(
68
- "Forbidden input type value"
69
- )
70
- }
83
+ override fun setInputType(
84
+ view: SearchBarView,
85
+ inputType: String?,
86
+ ) {
87
+ view.inputType =
88
+ when (inputType) {
89
+ null, "text" -> SearchBarView.SearchBarInputTypes.TEXT
90
+ "phone" -> SearchBarView.SearchBarInputTypes.PHONE
91
+ "number" -> SearchBarView.SearchBarInputTypes.NUMBER
92
+ "email" -> SearchBarView.SearchBarInputTypes.EMAIL
93
+ else -> throw JSApplicationIllegalArgumentException(
94
+ "Forbidden input type value",
95
+ )
96
+ }
71
97
  }
72
98
 
73
99
  @ReactProp(name = "placeholder")
74
- fun setPlaceholder(view: SearchBarView, placeholder: String?) {
100
+ override fun setPlaceholder(
101
+ view: SearchBarView,
102
+ placeholder: String?,
103
+ ) {
75
104
  if (placeholder != null) {
76
105
  view.placeholder = placeholder
77
106
  }
78
107
  }
79
108
 
80
109
  @ReactProp(name = "textColor", customType = "Color")
81
- fun setTextColor(view: SearchBarView, color: Int?) {
110
+ override fun setTextColor(
111
+ view: SearchBarView,
112
+ color: Int?,
113
+ ) {
82
114
  view.textColor = color
83
115
  }
84
116
 
85
117
  @ReactProp(name = "headerIconColor", customType = "Color")
86
- fun setHeaderIconColor(view: SearchBarView, color: Int?) {
118
+ override fun setHeaderIconColor(
119
+ view: SearchBarView,
120
+ color: Int?,
121
+ ) {
87
122
  view.headerIconColor = color
88
123
  }
89
124
 
90
125
  @ReactProp(name = "hintTextColor", customType = "Color")
91
- fun setHintTextColor(view: SearchBarView, color: Int?) {
126
+ override fun setHintTextColor(
127
+ view: SearchBarView,
128
+ color: Int?,
129
+ ) {
92
130
  view.hintTextColor = color
93
131
  }
94
132
 
95
133
  @ReactProp(name = "shouldShowHintSearchIcon")
96
- fun setShouldShowHintSearchIcon(view: SearchBarView, shouldShowHintSearchIcon: Boolean?) {
134
+ override fun setShouldShowHintSearchIcon(
135
+ view: SearchBarView,
136
+ shouldShowHintSearchIcon: Boolean,
137
+ ) {
97
138
  view.shouldShowHintSearchIcon = shouldShowHintSearchIcon ?: true
98
139
  }
99
140
 
100
- fun setPlacement(view: SearchBarView, placeholder: String?) = Unit
101
-
102
- override fun receiveCommand(root: SearchBarView, commandId: String?, args: ReadableArray?) {
103
- when (commandId) {
104
- "focus" -> root.handleFocusJsRequest()
105
- "blur" -> root.handleBlurJsRequest()
106
- "clearText" -> root.handleClearTextJsRequest()
107
- "toggleCancelButton" -> root.handleToggleCancelButtonJsRequest(false) // just a dummy argument
108
- "setText" -> root.handleSetTextJsRequest(args?.getString(0))
109
- "cancelSearch" -> root.handleCancelSearchJsRequest()
110
- else -> throw JSApplicationIllegalArgumentException("Unsupported native command received: $commandId")
111
- }
112
- }
113
-
114
- override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
115
- return MapBuilder.of(
141
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? =
142
+ MapBuilder.of(
116
143
  SearchBarBlurEvent.EVENT_NAME,
117
- MapBuilder.of("registrationName", "onBlur"),
144
+ MapBuilder.of("registrationName", "onSearchBlur"),
118
145
  SearchBarChangeTextEvent.EVENT_NAME,
119
146
  MapBuilder.of("registrationName", "onChangeText"),
120
147
  SearchBarCloseEvent.EVENT_NAME,
121
148
  MapBuilder.of("registrationName", "onClose"),
122
149
  SearchBarFocusEvent.EVENT_NAME,
123
- MapBuilder.of("registrationName", "onFocus"),
150
+ MapBuilder.of("registrationName", "onSearchFocus"),
124
151
  SearchBarOpenEvent.EVENT_NAME,
125
152
  MapBuilder.of("registrationName", "onOpen"),
126
153
  SearchBarSearchButtonPressEvent.EVENT_NAME,
127
154
  MapBuilder.of("registrationName", "onSearchButtonPress"),
128
155
  )
129
- }
130
156
 
131
157
  companion object {
132
158
  const val REACT_CLASS = "RNSSearchBar"
133
159
  }
160
+
161
+ private fun logNotAvailable(propName: String) {
162
+ Log.w("[RNScreens]", "$propName prop is not available on Android")
163
+ }
164
+
165
+ // NativeCommands
166
+
167
+ override fun blur(view: SearchBarView?) {
168
+ view?.handleBlurJsRequest()
169
+ }
170
+
171
+ override fun focus(view: SearchBarView?) {
172
+ view?.handleFocusJsRequest()
173
+ }
174
+
175
+ override fun clearText(view: SearchBarView?) {
176
+ view?.handleClearTextJsRequest()
177
+ }
178
+
179
+ override fun toggleCancelButton(
180
+ view: SearchBarView?,
181
+ flag: Boolean,
182
+ ) {
183
+ view?.handleToggleCancelButtonJsRequest(flag)
184
+ }
185
+
186
+ override fun setText(
187
+ view: SearchBarView?,
188
+ text: String?,
189
+ ) {
190
+ view?.handleSetTextJsRequest(text)
191
+ }
192
+
193
+ override fun cancelSearch(view: SearchBarView?) {
194
+ view?.handleFocusJsRequest()
195
+ }
196
+
197
+ // iOS only
198
+
199
+ override fun setPlacement(
200
+ view: SearchBarView,
201
+ placeholder: String?,
202
+ ) {
203
+ logNotAvailable("setPlacement")
204
+ }
205
+
206
+ override fun setHideWhenScrolling(
207
+ view: SearchBarView?,
208
+ value: Boolean,
209
+ ) {
210
+ logNotAvailable("hideWhenScrolling")
211
+ }
212
+
213
+ override fun setObscureBackground(
214
+ view: SearchBarView?,
215
+ value: Boolean,
216
+ ) {
217
+ logNotAvailable("hideNavigationBar")
218
+ }
219
+
220
+ override fun setHideNavigationBar(
221
+ view: SearchBarView?,
222
+ value: Boolean,
223
+ ) {
224
+ logNotAvailable("hideNavigationBar")
225
+ }
226
+
227
+ override fun setCancelButtonText(
228
+ view: SearchBarView?,
229
+ value: String?,
230
+ ) {
231
+ logNotAvailable("cancelButtonText")
232
+ }
233
+
234
+ override fun setTintColor(
235
+ view: SearchBarView?,
236
+ value: Int?,
237
+ ) {
238
+ logNotAvailable("tintColor")
239
+ }
134
240
  }
@@ -16,7 +16,9 @@ import com.swmansion.rnscreens.events.SearchBarOpenEvent
16
16
  import com.swmansion.rnscreens.events.SearchBarSearchButtonPressEvent
17
17
 
18
18
  @SuppressLint("ViewConstructor")
19
- class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext) {
19
+ class SearchBarView(
20
+ reactContext: ReactContext?,
21
+ ) : ReactViewGroup(reactContext) {
20
22
  var inputType: SearchBarInputTypes = SearchBarInputTypes.TEXT
21
23
  var autoCapitalize: SearchBarAutoCapitalize = SearchBarAutoCapitalize.NONE
22
24
  var textColor: Int? = null
@@ -71,8 +73,10 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
71
73
  super.onAttachedToWindow()
72
74
 
73
75
  screenStackFragment?.onSearchViewCreate = { newSearchView ->
74
- if (searchViewFormatter == null) searchViewFormatter =
75
- SearchViewFormatter(newSearchView)
76
+ if (searchViewFormatter == null) {
77
+ searchViewFormatter =
78
+ SearchViewFormatter(newSearchView)
79
+ }
76
80
  setSearchViewProps()
77
81
  if (autoFocus) {
78
82
  screenStackFragment?.searchView?.focus()
@@ -81,17 +85,19 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
81
85
  }
82
86
 
83
87
  private fun setSearchViewListeners(searchView: SearchView) {
84
- searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
85
- override fun onQueryTextChange(newText: String?): Boolean {
86
- handleTextChange(newText)
87
- return true
88
- }
88
+ searchView.setOnQueryTextListener(
89
+ object : SearchView.OnQueryTextListener {
90
+ override fun onQueryTextChange(newText: String?): Boolean {
91
+ handleTextChange(newText)
92
+ return true
93
+ }
89
94
 
90
- override fun onQueryTextSubmit(query: String?): Boolean {
91
- handleTextSubmit(query)
92
- return true
93
- }
94
- })
95
+ override fun onQueryTextSubmit(query: String?): Boolean {
96
+ handleTextSubmit(query)
97
+ return true
98
+ }
99
+ },
100
+ )
95
101
  searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
96
102
  handleFocusChange(hasFocus)
97
103
  }
@@ -157,15 +163,19 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
157
163
  private fun setToolbarElementsVisibility(visibility: Int) {
158
164
  for (i in 0..(headerConfig?.configSubviewsCount?.minus(1) ?: 0)) {
159
165
  val subview = headerConfig?.getConfigSubview(i)
160
- if (subview?.type != ScreenStackHeaderSubview.Type.SEARCH_BAR)
166
+ if (subview?.type != ScreenStackHeaderSubview.Type.SEARCH_BAR) {
161
167
  subview?.visibility = visibility
168
+ }
162
169
  }
163
170
  }
164
171
 
165
172
  private val surfaceId = UIManagerHelper.getSurfaceId(this)
166
173
 
167
174
  enum class SearchBarAutoCapitalize {
168
- NONE, WORDS, SENTENCES, CHARACTERS
175
+ NONE,
176
+ WORDS,
177
+ SENTENCES,
178
+ CHARACTERS,
169
179
  }
170
180
 
171
181
  enum class SearchBarInputTypes {
@@ -179,17 +189,14 @@ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext)
179
189
  }
180
190
  },
181
191
  PHONE {
182
- override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
183
- InputType.TYPE_CLASS_PHONE
192
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) = InputType.TYPE_CLASS_PHONE
184
193
  },
185
194
  NUMBER {
186
- override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
187
- InputType.TYPE_CLASS_NUMBER
195
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) = InputType.TYPE_CLASS_NUMBER
188
196
  },
189
197
  EMAIL {
190
- override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
191
- InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
192
- };
198
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
199
+ }, ;
193
200
 
194
201
  abstract fun toAndroidInputType(capitalize: SearchBarAutoCapitalize): Int
195
202
  }
@@ -7,7 +7,9 @@ import android.widget.ImageView
7
7
  import androidx.appcompat.R
8
8
  import androidx.appcompat.widget.SearchView
9
9
 
10
- class SearchViewFormatter(var searchView: SearchView) {
10
+ class SearchViewFormatter(
11
+ var searchView: SearchView,
12
+ ) {
11
13
  private var defaultTextColor: Int? = null
12
14
  private var defaultTintBackground: Drawable? = null
13
15
 
@@ -57,7 +59,10 @@ class SearchViewFormatter(var searchView: SearchView) {
57
59
  }
58
60
  }
59
61
 
60
- fun setPlaceholder(placeholder: String, shouldShowHintSearchIcon: Boolean) {
62
+ fun setPlaceholder(
63
+ placeholder: String,
64
+ shouldShowHintSearchIcon: Boolean,
65
+ ) {
61
66
  if (shouldShowHintSearchIcon) {
62
67
  searchView.queryHint = placeholder
63
68
  } else {
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class HeaderAttachedEvent(surfaceId: Int, viewId: Int) : Event<HeaderAttachedEvent>(surfaceId, viewId) {
7
+ class HeaderAttachedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<HeaderAttachedEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class HeaderBackButtonClickedEvent(surfaceId: Int, viewId: Int) : Event<HeaderBackButtonClickedEvent>(surfaceId, viewId) {
7
+ class HeaderBackButtonClickedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<HeaderBackButtonClickedEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class HeaderDetachedEvent(surfaceId: Int, viewId: Int) : Event<HeaderDetachedEvent>(surfaceId, viewId) {
7
+ class HeaderDetachedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<HeaderDetachedEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -3,22 +3,21 @@ package com.swmansion.rnscreens.events
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
- import com.facebook.react.uimanager.events.RCTEventEmitter
7
6
 
8
7
  class HeaderHeightChangeEvent(
9
8
  surfaceId: Int,
10
9
  viewId: Int,
11
- private val headerHeight: Double
10
+ private val headerHeight: Double,
12
11
  ) : Event<HeaderHeightChangeEvent>(surfaceId, viewId) {
13
-
14
12
  override fun getEventName() = EVENT_NAME
15
13
 
16
14
  // As the same header height could appear twice, use header height as a coalescing key.
17
15
  override fun getCoalescingKey(): Short = headerHeight.toInt().toShort()
18
16
 
19
- override fun getEventData(): WritableMap? = Arguments.createMap().apply {
20
- putDouble("headerHeight", headerHeight)
21
- }
17
+ override fun getEventData(): WritableMap? =
18
+ Arguments.createMap().apply {
19
+ putDouble("headerHeight", headerHeight)
20
+ }
22
21
 
23
22
  companion object {
24
23
  const val EVENT_NAME = "topHeaderHeightChange"
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class ScreenAppearEvent(surfaceId: Int, viewId: Int) : Event<ScreenAppearEvent>(surfaceId, viewId) {
7
+ class ScreenAppearEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<ScreenAppearEvent>(surfaceId, viewId) {
8
11
  override fun getEventName() = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class ScreenDisappearEvent(surfaceId: Int, viewId: Int) : Event<ScreenDisappearEvent>(surfaceId, viewId) {
7
+ class ScreenDisappearEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<ScreenDisappearEvent>(surfaceId, viewId) {
8
11
  override fun getEventName() = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,15 +4,19 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class ScreenDismissedEvent(surfaceId: Int, viewId: Int) : Event<ScreenDismissedEvent>(surfaceId, viewId) {
7
+ class ScreenDismissedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<ScreenDismissedEvent>(surfaceId, viewId) {
8
11
  override fun getEventName() = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
11
14
  override fun getCoalescingKey(): Short = 0
12
15
 
13
- override fun getEventData(): WritableMap? = Arguments.createMap().apply {
14
- putInt("dismissCount", 1)
15
- }
16
+ override fun getEventData(): WritableMap? =
17
+ Arguments.createMap().apply {
18
+ putInt("dismissCount", 1)
19
+ }
16
20
 
17
21
  companion object {
18
22
  const val EVENT_NAME = "topDismissed"
@@ -10,17 +10,18 @@ class ScreenTransitionProgressEvent(
10
10
  private val progress: Float,
11
11
  private val isClosing: Boolean,
12
12
  private val isGoingForward: Boolean,
13
- private val coalescingKey: Short
13
+ private val coalescingKey: Short,
14
14
  ) : Event<ScreenTransitionProgressEvent>(surfaceId, viewId) {
15
15
  override fun getEventName(): String = EVENT_NAME
16
16
 
17
17
  override fun getCoalescingKey(): Short = coalescingKey
18
18
 
19
- override fun getEventData(): WritableMap? = Arguments.createMap().apply {
20
- putDouble("progress", progress.toDouble())
21
- putInt("closing", if (isClosing) 1 else 0)
22
- putInt("goingForward", if (isGoingForward) 1 else 0)
23
- }
19
+ override fun getEventData(): WritableMap? =
20
+ Arguments.createMap().apply {
21
+ putDouble("progress", progress.toDouble())
22
+ putInt("closing", if (isClosing) 1 else 0)
23
+ putInt("goingForward", if (isGoingForward) 1 else 0)
24
+ }
24
25
 
25
26
  companion object {
26
27
  const val EVENT_NAME = "topTransitionProgress"
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class ScreenWillAppearEvent(surfaceId: Int, viewId: Int) : Event<ScreenWillAppearEvent>(surfaceId, viewId) {
7
+ class ScreenWillAppearEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<ScreenWillAppearEvent>(surfaceId, viewId) {
8
11
  override fun getEventName() = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class ScreenWillDisappearEvent(surfaceId: Int, viewId: Int) : Event<ScreenWillDisappearEvent>(surfaceId, viewId) {
7
+ class ScreenWillDisappearEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<ScreenWillDisappearEvent>(surfaceId, viewId) {
8
11
  override fun getEventName() = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class SearchBarBlurEvent(surfaceId: Int, viewId: Int) : Event<SearchBarBlurEvent>(surfaceId, viewId) {
7
+ class SearchBarBlurEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<SearchBarBlurEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -13,6 +16,6 @@ class SearchBarBlurEvent(surfaceId: Int, viewId: Int) : Event<SearchBarBlurEvent
13
16
  override fun getEventData(): WritableMap? = Arguments.createMap()
14
17
 
15
18
  companion object {
16
- const val EVENT_NAME = "topBlur"
19
+ const val EVENT_NAME = "topSearchBlur"
17
20
  }
18
21
  }
@@ -14,9 +14,10 @@ class SearchBarChangeTextEvent(
14
14
  // All events for a given view can be coalesced.
15
15
  override fun getCoalescingKey(): Short = 0
16
16
 
17
- override fun getEventData(): WritableMap? = Arguments.createMap().apply {
18
- putString("text", text)
19
- }
17
+ override fun getEventData(): WritableMap? =
18
+ Arguments.createMap().apply {
19
+ putString("text", text)
20
+ }
20
21
 
21
22
  companion object {
22
23
  const val EVENT_NAME = "topChangeText"
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class SearchBarCloseEvent(surfaceId: Int, viewId: Int) : Event<SearchBarCloseEvent>(surfaceId, viewId) {
7
+ class SearchBarCloseEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<SearchBarCloseEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -4,7 +4,10 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class SearchBarFocusEvent(surfaceId: Int, viewId: Int) : Event<SearchBarFocusEvent>(surfaceId, viewId) {
7
+ class SearchBarFocusEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ ) : Event<SearchBarFocusEvent>(surfaceId, viewId) {
8
11
  override fun getEventName(): String = EVENT_NAME
9
12
 
10
13
  // All events for a given view can be coalesced.
@@ -13,6 +16,6 @@ class SearchBarFocusEvent(surfaceId: Int, viewId: Int) : Event<SearchBarFocusEve
13
16
  override fun getEventData(): WritableMap? = Arguments.createMap()
14
17
 
15
18
  companion object {
16
- const val EVENT_NAME = "topFocus"
19
+ const val EVENT_NAME = "topSearchFocus"
17
20
  }
18
21
  }