Skip to content

Commit 55f7ff7

Browse files
committed
wip: rough working state for android
1 parent 4a56cf5 commit 55f7ff7

File tree

7 files changed

+118
-10
lines changed

7 files changed

+118
-10
lines changed

packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewPackage.kt

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class RCTTabViewPackage : ReactPackage {
1010
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
1111
val viewManagers: MutableList<ViewManager<*, *>> = ArrayList()
1212
viewManagers.add(RCTTabViewManager(reactContext))
13+
viewManagers.add(RCTTabViewScreenManager(reactContext))
1314
return viewManagers
1415
}
1516

packages/react-native-bottom-tabs/android/src/main/jni/RNCTabView.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <ReactCommon/JavaTurboModule.h>
44
#include <ReactCommon/TurboModule.h>
55
#include <jsi/jsi.h>
6-
#include <react/renderer/components/RNCTabView/RNCTabViewComponentDescriptor.h>
6+
#include <react/renderer/components/RNCTabView/RNCTabViewScreenComponentDescriptor.h>
77

88
namespace facebook::react {
99
JSI_EXPORT

packages/react-native-bottom-tabs/android/src/newarch/RCTTabViewManager.kt

+24-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.rcttabview
22

3+
import android.util.Log
34
import android.view.View
4-
import android.view.ViewGroup
5+
import android.widget.FrameLayout
6+
import androidx.core.view.children
57
import com.facebook.react.bridge.ReactApplicationContext
68
import com.facebook.react.bridge.ReadableArray
79
import com.facebook.react.module.annotations.ReactModule
@@ -11,7 +13,6 @@ import com.facebook.react.uimanager.ViewGroupManager
1113
import com.facebook.react.uimanager.ViewManagerDelegate
1214
import com.facebook.react.viewmanagers.RNCTabViewManagerDelegate
1315
import com.facebook.react.viewmanagers.RNCTabViewManagerInterface
14-
import com.rcttabview.events.OnNativeLayoutEvent
1516
import com.rcttabview.events.PageSelectedEvent
1617
import com.rcttabview.events.TabLongPressEvent
1718

@@ -37,7 +38,27 @@ class RCTTabViewManager(context: ReactApplicationContext) :
3738
}
3839

3940
view.onNativeLayoutListener = { width, height ->
40-
eventDispatcher?.dispatchEvent(OnNativeLayoutEvent(viewTag = view.id, width, height))
41+
val childCount = tabViewImpl.getChildCount(view)
42+
for (i in 0 until childCount) { // Use 'until' instead of '..' to exclude childCount
43+
val child = tabViewImpl.getChildAt(view, i)
44+
45+
// Safe cast for FrameLayout
46+
if (child is FrameLayout) {
47+
val innerChildren = child.children
48+
if (innerChildren.any()) {
49+
val innerChild = innerChildren.first()
50+
51+
// Safe cast for RCTTabViewScreen
52+
if (innerChild is RCTTabViewScreen) {
53+
innerChild.updateFrame(width, height)
54+
}
55+
}
56+
57+
Log.w("TAB_VIEW", "CHILD: ${child}")
58+
}
59+
}
60+
61+
// eventDispatcher?.dispatchEvent(OnNativeLayoutEvent(viewTag = view.id, width, height))
4162
}
4263
return view
4364

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.rcttabview
2+
3+
import android.content.Context
4+
import android.util.Log
5+
import android.view.View
6+
import android.widget.FrameLayout
7+
import com.facebook.react.bridge.Arguments
8+
import com.facebook.react.bridge.ReactApplicationContext
9+
import com.facebook.react.module.annotations.ReactModule
10+
import com.facebook.react.uimanager.ReactStylesDiffMap
11+
import com.facebook.react.uimanager.StateWrapper
12+
import com.facebook.react.uimanager.ThemedReactContext
13+
import com.facebook.react.uimanager.ViewGroupManager
14+
import com.facebook.react.uimanager.ViewManagerDelegate
15+
import com.facebook.react.viewmanagers.RNCTabViewScreenManagerDelegate
16+
import com.facebook.react.viewmanagers.RNCTabViewScreenManagerInterface
17+
18+
class RCTTabViewScreen(context: Context): FrameLayout(context) {
19+
private var stateWrapper: StateWrapper? = null
20+
21+
public fun setStateWrapper(stateWrapper: StateWrapper?) {
22+
this.stateWrapper = stateWrapper
23+
}
24+
25+
public fun updateFrame(width: Double, height: Double) {
26+
Log.w("TABVIEW_SCREEN", "UPDATE FRAME, ${width} ${height}")
27+
stateWrapper?.updateState(Arguments.createMap().apply {
28+
putInt("width", width.toInt())
29+
putInt("height", height.toInt())
30+
})
31+
}
32+
}
33+
34+
35+
@ReactModule(name = "RNCTabViewScreen")
36+
class RCTTabViewScreenManager(context: ReactApplicationContext) :
37+
ViewGroupManager<RCTTabViewScreen>(),
38+
RNCTabViewScreenManagerInterface<RCTTabViewScreen> {
39+
40+
private val delegate: RNCTabViewScreenManagerDelegate<RCTTabViewScreen, RCTTabViewScreenManager> =
41+
RNCTabViewScreenManagerDelegate(this)
42+
43+
44+
override fun createViewInstance(context: ThemedReactContext): RCTTabViewScreen {
45+
return RCTTabViewScreen(context);
46+
}
47+
48+
override fun updateState(
49+
view: RCTTabViewScreen,
50+
props: ReactStylesDiffMap?,
51+
stateWrapper: StateWrapper?
52+
): Any? {
53+
view.setStateWrapper(stateWrapper)
54+
return super.updateState(view, props, stateWrapper)
55+
}
56+
57+
override fun getDelegate(): ViewManagerDelegate<RCTTabViewScreen> {
58+
return delegate
59+
}
60+
61+
override fun getName(): String {
62+
return "RNCTabViewScreen"
63+
}
64+
65+
override fun addView(parent: RCTTabViewScreen, child: View, index: Int) {
66+
parent.addView(child, index)
67+
}
68+
69+
override fun removeViewAt(parent: RCTTabViewScreen, index: Int) {
70+
parent.removeViewAt(index)
71+
}
72+
73+
override fun getChildCount(parent: RCTTabViewScreen): Int {
74+
return parent.childCount
75+
}
76+
77+
override fun getChildAt(parent: RCTTabViewScreen, index: Int): View {
78+
return parent.getChildAt(index)
79+
}
80+
}

packages/react-native-bottom-tabs/common/cpp/react/renderer/components/RNCTabView/RNCTabViewScreenComponentDescriptor.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ class RNCTabViewScreenComponentDescriptor final : public ConcreteComponentDescri
1313
RNCTabViewScreenComponentDescriptor(const ComponentDescriptorParameters &parameters)
1414
: ConcreteComponentDescriptor(parameters) {}
1515

16-
16+
1717
/**
1818
Retrieve shadow node's state and update it's layout size accordingly.
1919
This is needed because we need to accomodate for bottom bar / sidebar size.
2020
*/
2121
void adopt(ShadowNode &shadowNode) const override {
2222
auto& layoutableShadowNode = static_cast<RNCTabViewScreenShadowNode&>(shadowNode);
2323
auto& stateData = layoutableShadowNode.getStateData();
24-
24+
2525
layoutableShadowNode.setSize(stateData.frameSize);
26-
26+
2727
ConcreteComponentDescriptor::adopt(shadowNode);
2828
}
2929
};

packages/react-native-bottom-tabs/common/cpp/react/renderer/components/RNCTabView/RNCTabViewScreenState.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
#include <react/renderer/graphics/Size.h>
55
#ifdef ANDROID
66
#include <folly/dynamic.h>
7-
#include <react/renderer/mapbuffer/MapBuffer.h>
8-
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
97
#endif
108

119
namespace facebook::react {
@@ -17,6 +15,14 @@ class RNCTabViewScreenState
1715
RNCTabViewScreenState(Size frameSize): frameSize(frameSize) {};
1816

1917
Size frameSize;
18+
19+
#ifdef ANDROID
20+
RNCTabViewScreenState(RNCTabViewScreenState const &previousState, folly::dynamic data)
21+
: frameSize((int)data["width"].getInt(), (int)data["height"].getInt()) {};
22+
folly::dynamic getDynamic() const {
23+
return {};
24+
};
25+
#endif
2026
};
2127

2228
}

packages/react-native-bottom-tabs/react-native.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module.exports = {
33
platforms: {
44
android: {
55
libraryName: 'RNCTabView',
6-
componentDescriptors: ['RNCTabViewComponentDescriptor'],
6+
componentDescriptors: ['RNCTabViewScreenComponentDescriptor'],
77
cmakeListsPath: 'src/main/jni/CMakeLists.txt',
88
},
99
},

0 commit comments

Comments
 (0)