Skip to content

Commit 118d6e9

Browse files
committed
refactor(Android): make TabScreenEventEmitter inherit from BaseEventEmitter (#115)
Make use of `BaseEventEmitter` introduced in #114
1 parent 32ca419 commit 118d6e9

File tree

3 files changed

+25
-33
lines changed

3 files changed

+25
-33
lines changed

android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreen.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ class TabScreen(
2020

2121
internal val eventEmitter = TabScreenEventEmitter(reactContext)
2222

23-
override fun setId(id: Int) {
24-
super.setId(id)
25-
eventEmitter.viewTag = id
26-
}
23+
internal lateinit var eventEmitter: TabScreenEventEmitter
2724

2825
override fun onAttachedToWindow() {
2926
Log.d(TAG, "TabScreen attached to window")
@@ -32,6 +29,12 @@ class TabScreen(
3229

3330
var isFocusedTab: Boolean = false
3431

32+
internal fun onViewManagerAddEventEmitters() {
33+
// When this is called from View Manager the view tag is already set
34+
check(id != NO_ID) { "[RNScreens] TabScreen must have its tag set when registering event emitters" }
35+
eventEmitter = TabScreenEventEmitter(reactContext, id)
36+
}
37+
3538
companion object {
3639
const val TAG = "TabScreen"
3740
}
Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,46 @@
11
package com.swmansion.rnscreens.gamma.tabs
22

33
import android.util.Log
4-
import android.view.View
54
import com.facebook.react.bridge.ReactContext
6-
import com.facebook.react.uimanager.UIManagerHelper
7-
import com.facebook.react.uimanager.events.EventDispatcher
5+
import com.swmansion.rnscreens.gamma.common.BaseEventEmitter
86
import com.swmansion.rnscreens.gamma.tabs.TabScreenEventEmitter.Companion.TAG
97
import com.swmansion.rnscreens.gamma.tabs.event.TabScreenDidAppearEvent
108
import com.swmansion.rnscreens.gamma.tabs.event.TabScreenDidDisappearEvent
119
import com.swmansion.rnscreens.gamma.tabs.event.TabScreenWillAppearEvent
1210
import com.swmansion.rnscreens.gamma.tabs.event.TabScreenWillDisappearEvent
1311

14-
class TabScreenEventEmitter(val reactContext: ReactContext) {
15-
var viewTag: Int = View.NO_ID
16-
17-
private val reactEventDispatcher: EventDispatcher?
18-
get() {
19-
// Lets assert for now to make sure we won't miss event delivery
20-
checkValidViewTag()
21-
return UIManagerHelper.getEventDispatcherForReactTag(reactContext, viewTag)
22-
}
23-
24-
private val surfaceId: Int
25-
get() = UIManagerHelper.getSurfaceId(reactContext)
26-
12+
internal class TabScreenEventEmitter(
13+
reactContext: ReactContext,
14+
viewTag: Int,
15+
) : BaseEventEmitter(reactContext, viewTag) {
2716
fun emitOnWillAppear() {
28-
checkValidViewTag()
2917
logEventDispatch(viewTag, TabScreenWillAppearEvent.EVENT_REGISTRATION_NAME)
30-
reactEventDispatcher?.dispatchEvent(TabScreenWillAppearEvent(surfaceId, viewTag))
18+
reactEventDispatcher.dispatchEvent(TabScreenWillAppearEvent(surfaceId, viewTag))
3119
}
3220

3321
fun emitOnDidAppear() {
34-
checkValidViewTag()
3522
logEventDispatch(viewTag, TabScreenDidAppearEvent.EVENT_REGISTRATION_NAME)
36-
reactEventDispatcher?.dispatchEvent(TabScreenDidAppearEvent(surfaceId, viewTag))
23+
reactEventDispatcher.dispatchEvent(TabScreenDidAppearEvent(surfaceId, viewTag))
3724
}
3825

3926
fun emitOnWillDisappear() {
40-
checkValidViewTag()
4127
logEventDispatch(viewTag, TabScreenWillDisappearEvent.EVENT_REGISTRATION_NAME)
42-
reactEventDispatcher?.dispatchEvent(TabScreenWillDisappearEvent(surfaceId, viewTag))
28+
reactEventDispatcher.dispatchEvent(TabScreenWillDisappearEvent(surfaceId, viewTag))
4329
}
4430

4531
fun emitOnDidDisappear() {
46-
checkValidViewTag()
4732
logEventDispatch(viewTag, TabScreenDidDisappearEvent.EVENT_REGISTRATION_NAME)
48-
reactEventDispatcher?.dispatchEvent(TabScreenDidDisappearEvent(surfaceId, viewTag))
49-
}
50-
51-
private fun checkValidViewTag() {
52-
check(viewTag != View.NO_ID) { "[RNScreens] Attempt to use viewTag before the value was provided"}
33+
reactEventDispatcher.dispatchEvent(TabScreenDidDisappearEvent(surfaceId, viewTag))
5334
}
5435

5536
companion object {
5637
const val TAG = "TabScreenEventEmitter"
5738
}
5839
}
5940

60-
private fun logEventDispatch(viewTag: Int, eventName: String) {
41+
private fun logEventDispatch(
42+
viewTag: Int,
43+
eventName: String,
44+
) {
6145
Log.d(TAG, "TabScreen [$viewTag] emits event: $eventName")
6246
}

android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ class TabScreenViewManager :
2828

2929
override fun getDelegate() = delegate
3030

31+
override fun addEventEmitters(reactContext: ThemedReactContext, view: TabScreen) {
32+
super.addEventEmitters(reactContext, view)
33+
view.onViewManagerAddEventEmitters()
34+
}
35+
3136
// These should be ignored or another component, dedicated for Android should be used
3237

3338
override fun setTabBarBackgroundColor(

0 commit comments

Comments
 (0)