-
-
Notifications
You must be signed in to change notification settings - Fork 643
Expand file tree
/
Copy pathScreenStackViewManager.kt
More file actions
82 lines (66 loc) · 2.68 KB
/
ScreenStackViewManager.kt
File metadata and controls
82 lines (66 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.swmansion.rnscreens
import android.view.View
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.ViewGroupManager
import com.facebook.react.uimanager.ViewManagerDelegate
import com.facebook.react.viewmanagers.RNSScreenStackManagerDelegate
import com.facebook.react.viewmanagers.RNSScreenStackManagerInterface
import com.swmansion.rnscreens.events.StackFinishTransitioningEvent
@ReactModule(name = ScreenStackViewManager.REACT_CLASS)
class ScreenStackViewManager :
ViewGroupManager<ScreenStack>(),
RNSScreenStackManagerInterface<ScreenStack> {
private val delegate: ViewManagerDelegate<ScreenStack>
init {
delegate = RNSScreenStackManagerDelegate<ScreenStack, ScreenStackViewManager>(this)
}
override fun getName() = REACT_CLASS
override fun createViewInstance(reactContext: ThemedReactContext) = ScreenStack(reactContext)
override fun addView(
parent: ScreenStack,
child: View,
index: Int,
) {
require(child is Screen) { "Attempt attach child that is not of type Screen" }
NativeProxy.addScreenToMap(child.id, child)
parent.addScreen(child, index)
}
override fun removeViewAt(
parent: ScreenStack,
index: Int,
) {
val screen = parent.getScreenAt(index)
prepareOutTransition(screen)
parent.removeScreenAt(index)
NativeProxy.removeScreenFromMap(screen.id)
}
private fun prepareOutTransition(screen: Screen?) {
screen?.startRemovalTransition()
}
override fun invalidate() {
super.invalidate()
NativeProxy.clearMapOnInvalidate()
}
override fun getChildCount(parent: ScreenStack) = parent.screenCount
override fun getChildAt(
parent: ScreenStack,
index: Int,
): View = parent.getScreenAt(index)
override fun needsCustomLayoutForChildren() = true
protected override fun getDelegate(): ViewManagerDelegate<ScreenStack> = delegate
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
mutableMapOf(
StackFinishTransitioningEvent.EVENT_NAME to mutableMapOf("registrationName" to "onFinishTransitioning"),
)
// nativeContainerBackgroundColor is iOS-only because the native view hierarchy
// differs between platforms. On Android, ScreenStack is used directly as the
// container, so `style.backgroundColor` achieves the same effect.
override fun setNativeContainerBackgroundColor(
view: ScreenStack,
value: Int?,
) = Unit
companion object {
const val REACT_CLASS = "RNSScreenStack"
}
}