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.
- package/README.md +17 -13
- package/RNScreens.podspec +10 -52
- package/android/CMakeLists.txt +48 -4
- package/android/build.gradle +9 -81
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
- package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
- package/android/src/main/cpp/NativeProxy.cpp +51 -0
- package/android/src/main/cpp/NativeProxy.h +35 -0
- package/android/src/main/cpp/OnLoad.cpp +8 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
- package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
- package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +245 -0
- package/android/src/main/jni/CMakeLists.txt +5 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
- package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
- package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
- package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
- package/cpp/RNSScreenRemovalListener.cpp +25 -0
- package/cpp/RNSScreenRemovalListener.h +20 -0
- package/ios/RNSConvert.h +1 -0
- package/ios/RNSModalScreen.mm +22 -0
- package/ios/RNSModule.mm +1 -1
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +27 -19
- package/ios/RNSScreenStack.mm +24 -77
- package/ios/RNSScreenStackAnimator.mm +43 -6
- package/ios/RNSScreenStackHeaderConfig.mm +49 -11
- package/ios/RNSScreenStackHeaderSubview.mm +8 -0
- package/ios/utils/UIView+RNSUtility.h +23 -0
- package/ios/utils/UIView+RNSUtility.mm +55 -0
- package/lib/commonjs/components/ScreenStack.js +8 -1
- package/lib/commonjs/components/ScreenStack.js.map +1 -1
- package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/components/ScreenStack.js +8 -1
- package/lib/module/components/ScreenStack.js.map +1 -1
- package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +2 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +10 -0
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +10 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/native-stack/README.md +110 -99
- package/package.json +6 -3
- package/react-native.config.js +17 -15
- package/src/TransitionProgressContext.tsx +1 -1
- package/src/components/Screen.tsx +4 -4
- package/src/components/ScreenStack.tsx +11 -1
- package/src/components/ScreenStackHeaderConfig.tsx +5 -5
- package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
- package/src/components/SearchBar.tsx +4 -4
- package/src/core.ts +1 -1
- package/src/fabric/ModalScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
- package/src/fabric/SearchBarNativeComponent.ts +1 -1
- package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
- package/src/gesture-handler/constraints.ts +5 -5
- package/src/gesture-handler/fabricUtils.ts +1 -1
- package/src/native-stack/contexts/GHContext.tsx +1 -1
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
- package/src/native-stack/types.tsx +14 -4
- package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
- package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
- package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
- package/src/native-stack/views/FontProcessor.tsx +1 -1
- package/src/native-stack/views/HeaderConfig.tsx +1 -1
- package/src/native-stack/views/NativeStackView.tsx +11 -9
- package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
- package/src/reanimated/ReanimatedScreen.tsx +2 -2
- package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
- package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
- package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
- package/src/types.tsx +15 -5
- package/src/useTransitionProgress.tsx +1 -1
- 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(
|
|
14
|
-
:
|
|
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,
|
|
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(
|
|
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(
|
|
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 :
|
|
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(
|
|
47
|
-
view
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
75
|
-
view
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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("
|
|
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(
|
|
179
|
+
override fun toggleCancelButton(
|
|
180
|
+
view: SearchBarView?,
|
|
181
|
+
flag: Boolean,
|
|
182
|
+
) {
|
|
153
183
|
view?.handleToggleCancelButtonJsRequest(flag)
|
|
154
184
|
}
|
|
155
185
|
|
|
156
|
-
override fun setText(
|
|
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(
|
|
199
|
+
override fun setPlacement(
|
|
200
|
+
view: SearchBarView,
|
|
201
|
+
placeholder: String?,
|
|
202
|
+
) {
|
|
167
203
|
logNotAvailable("setPlacement")
|
|
168
204
|
}
|
|
169
205
|
|
|
170
|
-
override fun setHideWhenScrolling(
|
|
206
|
+
override fun setHideWhenScrolling(
|
|
207
|
+
view: SearchBarView?,
|
|
208
|
+
value: Boolean,
|
|
209
|
+
) {
|
|
171
210
|
logNotAvailable("hideWhenScrolling")
|
|
172
211
|
}
|
|
173
212
|
|
|
174
|
-
override fun setObscureBackground(
|
|
213
|
+
override fun setObscureBackground(
|
|
214
|
+
view: SearchBarView?,
|
|
215
|
+
value: Boolean,
|
|
216
|
+
) {
|
|
175
217
|
logNotAvailable("hideNavigationBar")
|
|
176
218
|
}
|
|
177
219
|
|
|
178
|
-
override fun setHideNavigationBar(
|
|
220
|
+
override fun setHideNavigationBar(
|
|
221
|
+
view: SearchBarView?,
|
|
222
|
+
value: Boolean,
|
|
223
|
+
) {
|
|
179
224
|
logNotAvailable("hideNavigationBar")
|
|
180
225
|
}
|
|
181
226
|
|
|
182
|
-
override fun setCancelButtonText(
|
|
227
|
+
override fun setCancelButtonText(
|
|
228
|
+
view: SearchBarView?,
|
|
229
|
+
value: String?,
|
|
230
|
+
) {
|
|
183
231
|
logNotAvailable("cancelButtonText")
|
|
184
232
|
}
|
|
185
233
|
|
|
186
|
-
override fun setTintColor(
|
|
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(
|
|
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)
|
|
75
|
-
|
|
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(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt
CHANGED
|
@@ -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(
|
|
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(
|
|
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? =
|
|
19
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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? =
|
|
14
|
-
|
|
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"
|
package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt
CHANGED
|
@@ -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? =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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? =
|
|
18
|
-
|
|
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"
|