react-native-screens 3.32.0 → 3.34.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 (142) hide show
  1. package/README.md +17 -13
  2. package/RNScreens.podspec +10 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +9 -81
  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/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
  12. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  13. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  14. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  35. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
  39. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  51. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +245 -0
  54. package/android/src/main/jni/CMakeLists.txt +5 -4
  55. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
  57. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  58. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  59. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  60. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  61. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  62. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
  63. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
  64. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  65. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
  66. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
  67. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
  68. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  69. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  70. package/cpp/RNSScreenRemovalListener.h +20 -0
  71. package/ios/RNSConvert.h +1 -0
  72. package/ios/RNSModalScreen.mm +22 -0
  73. package/ios/RNSModule.mm +1 -1
  74. package/ios/RNSScreen.h +2 -1
  75. package/ios/RNSScreen.mm +27 -19
  76. package/ios/RNSScreenStack.mm +24 -77
  77. package/ios/RNSScreenStackAnimator.mm +43 -6
  78. package/ios/RNSScreenStackHeaderConfig.mm +49 -11
  79. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  80. package/ios/utils/UIView+RNSUtility.h +23 -0
  81. package/ios/utils/UIView+RNSUtility.mm +55 -0
  82. package/lib/commonjs/components/ScreenStack.js +8 -1
  83. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  84. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  85. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  86. package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
  87. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  88. package/lib/module/components/ScreenStack.js +8 -1
  89. package/lib/module/components/ScreenStack.js.map +1 -1
  90. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  91. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  92. package/lib/module/native-stack/views/NativeStackView.js +2 -0
  93. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  94. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  95. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
  96. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  97. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
  98. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  99. package/lib/typescript/native-stack/types.d.ts +10 -0
  100. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  101. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  102. package/lib/typescript/types.d.ts +10 -0
  103. package/lib/typescript/types.d.ts.map +1 -1
  104. package/native-stack/README.md +110 -99
  105. package/package.json +6 -3
  106. package/react-native.config.js +17 -15
  107. package/src/TransitionProgressContext.tsx +1 -1
  108. package/src/components/Screen.tsx +4 -4
  109. package/src/components/ScreenStack.tsx +11 -1
  110. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  111. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  112. package/src/components/SearchBar.tsx +4 -4
  113. package/src/core.ts +1 -1
  114. package/src/fabric/ModalScreenNativeComponent.ts +1 -0
  115. package/src/fabric/ScreenNativeComponent.ts +1 -0
  116. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  117. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
  118. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  119. package/src/fabric/SearchBarNativeComponent.ts +1 -1
  120. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  121. package/src/gesture-handler/constraints.ts +5 -5
  122. package/src/gesture-handler/fabricUtils.ts +1 -1
  123. package/src/native-stack/contexts/GHContext.tsx +1 -1
  124. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  125. package/src/native-stack/types.tsx +14 -4
  126. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  127. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  128. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  129. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  130. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  131. package/src/native-stack/views/FontProcessor.tsx +1 -1
  132. package/src/native-stack/views/HeaderConfig.tsx +1 -1
  133. package/src/native-stack/views/NativeStackView.tsx +11 -9
  134. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  135. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  136. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  137. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  138. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  139. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  140. package/src/types.tsx +15 -5
  141. package/src/useTransitionProgress.tsx +1 -1
  142. package/windows/README.md +4 -1
@@ -4,17 +4,20 @@ import android.util.Log
4
4
  import com.facebook.proguard.annotations.DoNotStrip
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.bridge.UiThreadUtil
7
+ import com.facebook.react.fabric.FabricUIManager
7
8
  import com.facebook.react.module.annotations.ReactModule
8
9
  import com.facebook.react.uimanager.UIManagerHelper
10
+ import com.facebook.react.uimanager.common.UIManagerType
9
11
  import com.swmansion.rnscreens.events.ScreenTransitionProgressEvent
10
12
  import java.util.concurrent.atomic.AtomicBoolean
11
13
 
12
14
  @ReactModule(name = ScreensModule.NAME)
13
- class ScreensModule(private val reactContext: ReactApplicationContext)
14
- : NativeScreensModuleSpec(reactContext)
15
- {
15
+ class ScreensModule(
16
+ private val reactContext: ReactApplicationContext,
17
+ ) : NativeScreensModuleSpec(reactContext) {
16
18
  private var topScreenId: Int = -1
17
19
  private val isActiveTransition = AtomicBoolean(false)
20
+ private var proxy: NativeProxy? = null
18
21
 
19
22
  init {
20
23
  try {
@@ -32,6 +35,18 @@ class ScreensModule(private val reactContext: ReactApplicationContext)
32
35
 
33
36
  private external fun nativeInstall(jsiPtr: Long)
34
37
 
38
+ override fun initialize() {
39
+ super.initialize()
40
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
41
+ val fabricUIManager =
42
+ UIManagerHelper.getUIManager(reactContext, UIManagerType.FABRIC) as FabricUIManager
43
+ proxy =
44
+ NativeProxy().apply {
45
+ nativeAddMutationsListener(fabricUIManager)
46
+ }
47
+ }
48
+ }
49
+
35
50
  override fun getName(): String = NAME
36
51
 
37
52
  @DoNotStrip
@@ -64,25 +79,32 @@ class ScreensModule(private val reactContext: ReactApplicationContext)
64
79
  if (topScreenId == -1) {
65
80
  return
66
81
  }
67
- val progressFloat = progress.toFloat();
82
+ val progressFloat = progress.toFloat()
68
83
  val coalescingKey = ScreenFragment.getCoalescingKey(progressFloat)
69
84
  UIManagerHelper
70
85
  .getEventDispatcherForReactTag(reactContext, topScreenId)
71
86
  ?.dispatchEvent(
72
87
  ScreenTransitionProgressEvent(
73
88
  UIManagerHelper.getSurfaceId(reactContext),
74
- topScreenId, progressFloat, true, true, coalescingKey
75
- )
89
+ topScreenId,
90
+ progressFloat,
91
+ true,
92
+ true,
93
+ coalescingKey,
94
+ ),
76
95
  )
77
96
  }
78
97
 
79
98
  @DoNotStrip
80
- private fun finishTransition(reactTag: Int?, canceled: Boolean) {
99
+ private fun finishTransition(
100
+ reactTag: Int?,
101
+ canceled: Boolean,
102
+ ) {
81
103
  UiThreadUtil.assertOnUiThread()
82
104
  if (!isActiveTransition.get() || reactTag == null) {
83
105
  Log.e(
84
106
  "[RNScreens]",
85
- "Unable to call `finishTransition` method before transition start."
107
+ "Unable to call `finishTransition` method before transition start.",
86
108
  )
87
109
  return
88
110
  }
@@ -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 ->
@@ -18,24 +18,20 @@ import com.swmansion.rnscreens.events.SearchBarOpenEvent
18
18
  import com.swmansion.rnscreens.events.SearchBarSearchButtonPressEvent
19
19
 
20
20
  @ReactModule(name = SearchBarManager.REACT_CLASS)
21
- class SearchBarManager : ViewGroupManager<SearchBarView>(), RNSSearchBarManagerInterface<SearchBarView> {
21
+ class SearchBarManager :
22
+ ViewGroupManager<SearchBarView>(),
23
+ RNSSearchBarManagerInterface<SearchBarView> {
22
24
  private val delegate: ViewManagerDelegate<SearchBarView>
23
25
 
24
26
  init {
25
27
  delegate = RNSSearchBarManagerDelegate<SearchBarView, SearchBarManager>(this)
26
28
  }
27
29
 
28
- protected override fun getDelegate(): ViewManagerDelegate<SearchBarView> {
29
- return delegate
30
- }
30
+ protected override fun getDelegate(): ViewManagerDelegate<SearchBarView> = delegate
31
31
 
32
- override fun getName(): String {
33
- return REACT_CLASS
34
- }
32
+ override fun getName(): String = REACT_CLASS
35
33
 
36
- override fun createViewInstance(context: ThemedReactContext): SearchBarView {
37
- return SearchBarView(context)
38
- }
34
+ override fun createViewInstance(context: ThemedReactContext): SearchBarView = SearchBarView(context)
39
35
 
40
36
  override fun onAfterUpdateTransaction(view: SearchBarView) {
41
37
  super.onAfterUpdateTransaction(view)
@@ -43,75 +39,107 @@ class SearchBarManager : ViewGroupManager<SearchBarView>(), RNSSearchBarManagerI
43
39
  }
44
40
 
45
41
  @ReactProp(name = "autoCapitalize")
46
- override fun setAutoCapitalize(view: SearchBarView, autoCapitalize: String?) {
47
- view.autoCapitalize = 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
- }
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
+ }
56
56
  }
57
57
 
58
58
  @ReactProp(name = "autoFocus")
59
- fun setAutoFocus(view: SearchBarView, autoFocus: Boolean?) {
59
+ fun setAutoFocus(
60
+ view: SearchBarView,
61
+ autoFocus: Boolean?,
62
+ ) {
60
63
  view.autoFocus = autoFocus ?: false
61
64
  }
62
65
 
63
66
  @ReactProp(name = "barTintColor", customType = "Color")
64
- override fun setBarTintColor(view: SearchBarView, color: Int?) {
67
+ override fun setBarTintColor(
68
+ view: SearchBarView,
69
+ color: Int?,
70
+ ) {
65
71
  view.tintColor = color
66
72
  }
67
73
 
68
74
  @ReactProp(name = "disableBackButtonOverride")
69
- override fun setDisableBackButtonOverride(view: SearchBarView, disableBackButtonOverride: Boolean) {
75
+ override fun setDisableBackButtonOverride(
76
+ view: SearchBarView,
77
+ disableBackButtonOverride: Boolean,
78
+ ) {
70
79
  view.shouldOverrideBackButton = disableBackButtonOverride != true
71
80
  }
72
81
 
73
82
  @ReactProp(name = "inputType")
74
- override fun setInputType(view: SearchBarView, inputType: String?) {
75
- view.inputType = when (inputType) {
76
- null, "text" -> SearchBarView.SearchBarInputTypes.TEXT
77
- "phone" -> SearchBarView.SearchBarInputTypes.PHONE
78
- "number" -> SearchBarView.SearchBarInputTypes.NUMBER
79
- "email" -> SearchBarView.SearchBarInputTypes.EMAIL
80
- else -> throw JSApplicationIllegalArgumentException(
81
- "Forbidden input type value"
82
- )
83
- }
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
+ }
84
97
  }
85
98
 
86
99
  @ReactProp(name = "placeholder")
87
- override fun setPlaceholder(view: SearchBarView, placeholder: String?) {
100
+ override fun setPlaceholder(
101
+ view: SearchBarView,
102
+ placeholder: String?,
103
+ ) {
88
104
  if (placeholder != null) {
89
105
  view.placeholder = placeholder
90
106
  }
91
107
  }
92
108
 
93
109
  @ReactProp(name = "textColor", customType = "Color")
94
- override fun setTextColor(view: SearchBarView, color: Int?) {
110
+ override fun setTextColor(
111
+ view: SearchBarView,
112
+ color: Int?,
113
+ ) {
95
114
  view.textColor = color
96
115
  }
97
116
 
98
117
  @ReactProp(name = "headerIconColor", customType = "Color")
99
- override fun setHeaderIconColor(view: SearchBarView, color: Int?) {
118
+ override fun setHeaderIconColor(
119
+ view: SearchBarView,
120
+ color: Int?,
121
+ ) {
100
122
  view.headerIconColor = color
101
123
  }
102
124
 
103
125
  @ReactProp(name = "hintTextColor", customType = "Color")
104
- override fun setHintTextColor(view: SearchBarView, color: Int?) {
126
+ override fun setHintTextColor(
127
+ view: SearchBarView,
128
+ color: Int?,
129
+ ) {
105
130
  view.hintTextColor = color
106
131
  }
107
132
 
108
133
  @ReactProp(name = "shouldShowHintSearchIcon")
109
- override fun setShouldShowHintSearchIcon(view: SearchBarView, shouldShowHintSearchIcon: Boolean) {
134
+ override fun setShouldShowHintSearchIcon(
135
+ view: SearchBarView,
136
+ shouldShowHintSearchIcon: Boolean,
137
+ ) {
110
138
  view.shouldShowHintSearchIcon = shouldShowHintSearchIcon ?: true
111
139
  }
112
140
 
113
- override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
114
- return MapBuilder.of(
141
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? =
142
+ MapBuilder.of(
115
143
  SearchBarBlurEvent.EVENT_NAME,
116
144
  MapBuilder.of("registrationName", "onSearchBlur"),
117
145
  SearchBarChangeTextEvent.EVENT_NAME,
@@ -125,14 +153,13 @@ class SearchBarManager : ViewGroupManager<SearchBarView>(), RNSSearchBarManagerI
125
153
  SearchBarSearchButtonPressEvent.EVENT_NAME,
126
154
  MapBuilder.of("registrationName", "onSearchButtonPress"),
127
155
  )
128
- }
129
156
 
130
157
  companion object {
131
158
  const val REACT_CLASS = "RNSSearchBar"
132
159
  }
133
160
 
134
161
  private fun logNotAvailable(propName: String) {
135
- Log.w("RN SCREENS", "$propName prop is not available on Android")
162
+ Log.w("[RNScreens]", "$propName prop is not available on Android")
136
163
  }
137
164
 
138
165
  // NativeCommands
@@ -149,11 +176,17 @@ class SearchBarManager : ViewGroupManager<SearchBarView>(), RNSSearchBarManagerI
149
176
  view?.handleClearTextJsRequest()
150
177
  }
151
178
 
152
- override fun toggleCancelButton(view: SearchBarView?, flag: Boolean) {
179
+ override fun toggleCancelButton(
180
+ view: SearchBarView?,
181
+ flag: Boolean,
182
+ ) {
153
183
  view?.handleToggleCancelButtonJsRequest(flag)
154
184
  }
155
185
 
156
- override fun setText(view: SearchBarView?, text: String?) {
186
+ override fun setText(
187
+ view: SearchBarView?,
188
+ text: String?,
189
+ ) {
157
190
  view?.handleSetTextJsRequest(text)
158
191
  }
159
192
 
@@ -163,27 +196,45 @@ class SearchBarManager : ViewGroupManager<SearchBarView>(), RNSSearchBarManagerI
163
196
 
164
197
  // iOS only
165
198
 
166
- override fun setPlacement(view: SearchBarView, placeholder: String?) {
199
+ override fun setPlacement(
200
+ view: SearchBarView,
201
+ placeholder: String?,
202
+ ) {
167
203
  logNotAvailable("setPlacement")
168
204
  }
169
205
 
170
- override fun setHideWhenScrolling(view: SearchBarView?, value: Boolean) {
206
+ override fun setHideWhenScrolling(
207
+ view: SearchBarView?,
208
+ value: Boolean,
209
+ ) {
171
210
  logNotAvailable("hideWhenScrolling")
172
211
  }
173
212
 
174
- override fun setObscureBackground(view: SearchBarView?, value: Boolean) {
213
+ override fun setObscureBackground(
214
+ view: SearchBarView?,
215
+ value: Boolean,
216
+ ) {
175
217
  logNotAvailable("hideNavigationBar")
176
218
  }
177
219
 
178
- override fun setHideNavigationBar(view: SearchBarView?, value: Boolean) {
220
+ override fun setHideNavigationBar(
221
+ view: SearchBarView?,
222
+ value: Boolean,
223
+ ) {
179
224
  logNotAvailable("hideNavigationBar")
180
225
  }
181
226
 
182
- override fun setCancelButtonText(view: SearchBarView?, value: String?) {
227
+ override fun setCancelButtonText(
228
+ view: SearchBarView?,
229
+ value: String?,
230
+ ) {
183
231
  logNotAvailable("cancelButtonText")
184
232
  }
185
233
 
186
- override fun setTintColor(view: SearchBarView?, value: Int?) {
234
+ override fun setTintColor(
235
+ view: SearchBarView?,
236
+ value: Int?,
237
+ ) {
187
238
  logNotAvailable("tintColor")
188
239
  }
189
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.
@@ -7,17 +7,17 @@ import com.facebook.react.uimanager.events.Event
7
7
  class HeaderHeightChangeEvent(
8
8
  surfaceId: Int,
9
9
  viewId: Int,
10
- private val headerHeight: Double
10
+ private val headerHeight: Double,
11
11
  ) : Event<HeaderHeightChangeEvent>(surfaceId, viewId) {
12
-
13
12
  override fun getEventName() = EVENT_NAME
14
13
 
15
14
  // As the same header height could appear twice, use header height as a coalescing key.
16
15
  override fun getCoalescingKey(): Short = headerHeight.toInt().toShort()
17
16
 
18
- override fun getEventData(): WritableMap? = Arguments.createMap().apply {
19
- putDouble("headerHeight", headerHeight)
20
- }
17
+ override fun getEventData(): WritableMap? =
18
+ Arguments.createMap().apply {
19
+ putDouble("headerHeight", headerHeight)
20
+ }
21
21
 
22
22
  companion object {
23
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.
@@ -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"