From ea5afcbbb97f587ad76bc2445f960b68906772de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Kwas=CC=81niewski?= Date: Tue, 30 Sep 2025 21:49:59 +0200 Subject: [PATCH] feat!: drop old architecture --- .changeset/breezy-camels-lead.md | 7 + .github/workflows/ci.yml | 102 +---------- CONTRIBUTING.md | 24 +-- apps/example/package.json | 3 +- package.json | 1 - .../android/build.gradle | 17 +- .../java/com/rcttabview/RCTTabViewImpl.kt | 128 -------------- .../java/com/rcttabview}/RCTTabViewManager.kt | 77 ++++++--- .../android/src/oldarch/RCTTabViewManager.kt | 163 ------------------ .../ios/Events/OnNativeLayoutEvent.swift | 36 ---- .../ios/Events/PageSelectedEvent.swift | 35 ---- .../ios/Events/TabBarMeasuredEvent.swift | 35 ---- .../ios/Events/TabLongPressedEvent.swift | 38 ---- .../{Fabric => }/RCTTabViewComponentView.h | 0 .../{Fabric => }/RCTTabViewComponentView.mm | 0 .../ios/RCTTabViewViewManager.mm | 82 --------- .../ios/TabViewProvider.swift | 33 ---- .../react-native-bottom-tabs.podspec | 9 +- turbo.json | 16 -- 19 files changed, 74 insertions(+), 732 deletions(-) create mode 100644 .changeset/breezy-camels-lead.md delete mode 100644 packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewImpl.kt rename packages/react-native-bottom-tabs/android/src/{newarch => main/java/com/rcttabview}/RCTTabViewManager.kt (72%) delete mode 100644 packages/react-native-bottom-tabs/android/src/oldarch/RCTTabViewManager.kt delete mode 100644 packages/react-native-bottom-tabs/ios/Events/OnNativeLayoutEvent.swift delete mode 100644 packages/react-native-bottom-tabs/ios/Events/PageSelectedEvent.swift delete mode 100644 packages/react-native-bottom-tabs/ios/Events/TabBarMeasuredEvent.swift delete mode 100644 packages/react-native-bottom-tabs/ios/Events/TabLongPressedEvent.swift rename packages/react-native-bottom-tabs/ios/{Fabric => }/RCTTabViewComponentView.h (100%) rename packages/react-native-bottom-tabs/ios/{Fabric => }/RCTTabViewComponentView.mm (100%) delete mode 100644 packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm diff --git a/.changeset/breezy-camels-lead.md b/.changeset/breezy-camels-lead.md new file mode 100644 index 00000000..cf1de42d --- /dev/null +++ b/.changeset/breezy-camels-lead.md @@ -0,0 +1,7 @@ +--- +'react-native-bottom-tabs': major +'@bottom-tabs/expo-template': major +'@bottom-tabs/react-navigation': major +--- + +feat!: drop old architecture diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e84829c..7276e98b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,64 +108,6 @@ jobs: run: | yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" - build-android-newarch: - runs-on: ubuntu-latest - env: - TURBO_CACHE_DIR: .turbo/android-newarch - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup - uses: ./.github/actions/setup - - - name: Build package - run: yarn build - - - name: Cache turborepo for Android new arch - uses: actions/cache@v4 - with: - path: ${{ env.TURBO_CACHE_DIR }} - key: ${{ runner.os }}-turborepo-android-newarch-${{ hashFiles('yarn.lock') }} - restore-keys: | - ${{ runner.os }}-turborepo-android-newarch- - - - name: Check turborepo cache for Android new arch - run: | - TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:android:fabric --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:android:fabric').cache.status") - - if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then - echo "turbo_cache_hit=1" >> $GITHUB_ENV - fi - - - name: Install JDK - if: env.turbo_cache_hit != 1 - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: '17' - - - name: Finalize Android SDK - if: env.turbo_cache_hit != 1 - run: | - /bin/bash -c "yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null" - - - name: Cache Gradle - if: env.turbo_cache_hit != 1 - uses: actions/cache@v4 - with: - path: | - ~/.gradle/wrapper - ~/.gradle/caches - key: ${{ runner.os }}-gradle-newarch-${{ hashFiles('apps/example/android/gradle/wrapper/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle-newarch- - - - name: Build example for Android new arch - env: - JAVA_OPTS: '-XX:MaxHeapSize=6g' - run: | - yarn turbo run build:android:fabric --cache-dir="${{ env.TURBO_CACHE_DIR }}" build-ios: runs-on: macos-15 @@ -197,49 +139,6 @@ jobs: echo "turbo_cache_hit=1" >> $GITHUB_ENV fi - - name: Install cocoapods and plugins - if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true' - run: | - gem install cocoapods-swift-modular-headers - cd apps/example - pod install --project-directory=ios - env: - NO_FLIPPER: 1 - - - name: Build example for iOS - run: | - yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" - - build-ios-newarch: - runs-on: macos-15 - env: - TURBO_CACHE_DIR: .turbo/ios-newarch - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup - uses: ./.github/actions/setup - - - name: Build package - run: yarn build - - - name: Cache turborepo for iOS - uses: actions/cache@v4 - with: - path: ${{ env.TURBO_CACHE_DIR }} - key: ${{ runner.os }}-turborepo-ios-newarch-${{ hashFiles('yarn.lock') }} - restore-keys: | - ${{ runner.os }}-turborepo-ios- - - - name: Check turborepo cache for iOS - run: | - TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:ios').cache.status") - - if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then - echo "turbo_cache_hit=1" >> $GITHUB_ENV - fi - - name: Install cocoapods and plugins if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true' run: | @@ -253,3 +152,4 @@ jobs: - name: Build example for iOS run: | yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b48763f2..8d0a0119 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,29 +48,7 @@ cd - yarn ios ``` -By default, the example is configured to build with the new architecture. To run the example with the old architecture, you can do the following: - -1. For Android, run: - - ```sh - cd apps/example - ORG_GRADLE_PROJECT_newArchEnabled=false yarn android - ``` - -2. For iOS, run: - - ```sh - cd apps/example/ios - RCT_NEW_ARCH_ENABLED=0 pod install - cd - - yarn example ios - ``` - -If you are building for a different architecture than your previous build, make sure to remove the build folders first. You can run the following command to cleanup all build folders: - -```sh -yarn clean -``` +The example is configured to build with the new architecture (Fabric) by default. To confirm that the app is running with the new architecture, you can check the Metro logs for a message like this: diff --git a/apps/example/package.json b/apps/example/package.json index f127e6f7..aec4e3b5 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -4,8 +4,7 @@ "private": true, "scripts": { "android": "react-native run-android", - "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res", - "build:android:fabric": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", + "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", "build:ios": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", "ios": "react-native run-ios", "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", diff --git a/package.json b/package.json index d0c8ef03..9664e38b 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "typecheck": "turbo run typecheck", "build": "turbo run build", "build:android": "turbo run build:android", - "build:android:fabric": "turbo run build:android:fabric", "build:ios": "turbo run build:ios", "build:macos": "turbo run build:macos", "version-packages": "changeset version && yarn install --no-immutable", diff --git a/packages/react-native-bottom-tabs/android/build.gradle b/packages/react-native-bottom-tabs/android/build.gradle index 7ca7222f..babf4f18 100644 --- a/packages/react-native-bottom-tabs/android/build.gradle +++ b/packages/react-native-bottom-tabs/android/build.gradle @@ -15,7 +15,7 @@ buildscript { } def isNewArchitectureEnabled() { - return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" + return true } apply plugin: "com.android.library" @@ -84,16 +84,11 @@ android { sourceSets { main { - if (isNewArchitectureEnabled()) { - java.srcDirs += [ - "src/newarch", - // Codegen specs - "generated/java", - "generated/jni" - ] - } else { - java.srcDirs += ["src/oldarch"] - } + java.srcDirs += [ + // Codegen specs + "generated/java", + "generated/jni" + ] } } } diff --git a/packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewImpl.kt b/packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewImpl.kt deleted file mode 100644 index 0e6df67b..00000000 --- a/packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewImpl.kt +++ /dev/null @@ -1,128 +0,0 @@ -package com.rcttabview - -import android.content.res.ColorStateList -import android.view.View -import android.view.ViewGroup -import com.facebook.react.bridge.ReadableArray -import com.facebook.react.common.MapBuilder -import com.rcttabview.events.OnNativeLayoutEvent -import com.rcttabview.events.OnTabBarMeasuredEvent -import com.rcttabview.events.PageSelectedEvent -import com.rcttabview.events.TabLongPressEvent - -data class TabInfo( - val key: String, - val title: String, - val badge: String?, - val activeTintColor: Int?, - val hidden: Boolean, - val testID: String? -) - -class RCTTabViewImpl { - fun getName(): String { - return NAME - } - - fun setItems(view: ReactBottomNavigationView, items: ReadableArray) { - val itemsArray = mutableListOf() - for (i in 0 until items.size()) { - items.getMap(i)?.let { item -> - itemsArray.add( - TabInfo( - key = item.getString("key") ?: "", - title = item.getString("title") ?: "", - badge = if (item.hasKey("badge")) item.getString("badge") else null, - activeTintColor = if (item.hasKey("activeTintColor")) item.getInt("activeTintColor") else null, - hidden = if (item.hasKey("hidden")) item.getBoolean("hidden") else false, - testID = item.getString("testID") - ) - ) - } - } - view.updateItems(itemsArray) - } - - fun setSelectedPage(view: ReactBottomNavigationView, key: String) { - view.setSelectedItem(key) - } - - fun setLabeled(view: ReactBottomNavigationView, flag: Boolean?) { - view.setLabeled(flag) - } - - fun setIcons(view: ReactBottomNavigationView, icons: ReadableArray?) { - view.setIcons(icons) - } - - fun setBarTintColor(view: ReactBottomNavigationView, color: Int?) { - view.setBarTintColor(color) - } - - fun setRippleColor(view: ReactBottomNavigationView, rippleColor: Int?) { - if (rippleColor != null) { - val color = ColorStateList.valueOf(rippleColor) - view.setRippleColor(color) - } - } - - fun setActiveIndicatorColor(view: ReactBottomNavigationView, color: Int?) { - if (color != null) { - val color = ColorStateList.valueOf(color) - view.setActiveIndicatorColor(color) - } - } - - fun setActiveTintColor(view: ReactBottomNavigationView, color: Int?) { - view.setActiveTintColor(color) - } - - fun setInactiveTintColor(view: ReactBottomNavigationView, color: Int?) { - view.setInactiveTintColor(color) - } - - fun setHapticFeedbackEnabled(view: ReactBottomNavigationView, enabled: Boolean) { - view.isHapticFeedbackEnabled = enabled - } - - fun getExportedCustomDirectEventTypeConstants(): MutableMap? { - return MapBuilder.of( - PageSelectedEvent.EVENT_NAME, - MapBuilder.of("registrationName", "onPageSelected"), - TabLongPressEvent.EVENT_NAME, - MapBuilder.of("registrationName", "onTabLongPress"), - OnNativeLayoutEvent.EVENT_NAME, - MapBuilder.of("registrationName", "onNativeLayout"), - OnTabBarMeasuredEvent.EVENT_NAME, - MapBuilder.of("registrationName", "onTabBarMeasured") - ) - } - - fun getChildCount(parent: ReactBottomNavigationView): Int { - return parent.layoutHolder.childCount ?: 0 - } - - fun getChildAt(parent: ReactBottomNavigationView, index: Int): View? { - return parent.layoutHolder.getChildAt(index) - } - - fun removeView(parent: ReactBottomNavigationView, view: View) { - parent.layoutHolder.removeView(view) - } - - fun removeAllViews(parent: ReactBottomNavigationView) { - parent.layoutHolder.removeAllViews() - } - - fun removeViewAt(parent: ReactBottomNavigationView, index: Int) { - parent.layoutHolder.removeViewAt(index) - } - - fun needsCustomLayoutForChildren(): Boolean { - return true - } - - companion object { - const val NAME = "RNCTabView" - } -} diff --git a/packages/react-native-bottom-tabs/android/src/newarch/RCTTabViewManager.kt b/packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewManager.kt similarity index 72% rename from packages/react-native-bottom-tabs/android/src/newarch/RCTTabViewManager.kt rename to packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewManager.kt index 59be7cab..d2b97dc1 100644 --- a/packages/react-native-bottom-tabs/android/src/newarch/RCTTabViewManager.kt +++ b/packages/react-native-bottom-tabs/android/src/main/java/com/rcttabview/RCTTabViewManager.kt @@ -1,5 +1,6 @@ package com.rcttabview +import android.content.res.ColorStateList import android.view.View import android.view.ViewGroup import com.facebook.react.bridge.ReactApplicationContext @@ -16,15 +17,23 @@ import com.rcttabview.events.OnTabBarMeasuredEvent import com.rcttabview.events.PageSelectedEvent import com.rcttabview.events.TabLongPressEvent +data class TabInfo( + val key: String, + val title: String, + val badge: String?, + val activeTintColor: Int?, + val hidden: Boolean, + val testID: String? +) -@ReactModule(name = RCTTabViewImpl.NAME) + +@ReactModule(name = RCTTabViewManager.NAME) class RCTTabViewManager(context: ReactApplicationContext) : ViewGroupManager(), RNCTabViewManagerInterface { private val delegate: RNCTabViewManagerDelegate = RNCTabViewManagerDelegate(this) - private val tabViewImpl: RCTTabViewImpl = RCTTabViewImpl() override fun createViewInstance(context: ThemedReactContext): ReactBottomNavigationView { val view = ReactBottomNavigationView(context) @@ -53,76 +62,96 @@ class RCTTabViewManager(context: ReactApplicationContext) : } override fun getName(): String { - return tabViewImpl.getName() + return NAME } override fun getChildCount(parent: ReactBottomNavigationView): Int { - return tabViewImpl.getChildCount(parent) + return parent.layoutHolder.childCount ?: 0 } override fun getChildAt(parent: ReactBottomNavigationView, index: Int): View? { - return tabViewImpl.getChildAt(parent, index) + return parent.layoutHolder.getChildAt(index) } override fun removeView(parent: ReactBottomNavigationView, view: View) { - tabViewImpl.removeView(parent, view) + parent.layoutHolder.removeView(view) } override fun removeAllViews(parent: ReactBottomNavigationView) { - tabViewImpl.removeAllViews(parent) + parent.layoutHolder.removeAllViews() } override fun removeViewAt(parent: ReactBottomNavigationView, index: Int) { - tabViewImpl.removeViewAt(parent, index) + parent.layoutHolder.removeViewAt(index) } override fun needsCustomLayoutForChildren(): Boolean { - return tabViewImpl.needsCustomLayoutForChildren() + return true } override fun setItems(view: ReactBottomNavigationView?, value: ReadableArray?) { - if (view != null && value != null) - tabViewImpl.setItems(view, value) + if (view != null && value != null) { + val itemsArray = mutableListOf() + for (i in 0 until value.size()) { + value.getMap(i)?.let { item -> + itemsArray.add( + TabInfo( + key = item.getString("key") ?: "", + title = item.getString("title") ?: "", + badge = if (item.hasKey("badge")) item.getString("badge") else null, + activeTintColor = if (item.hasKey("activeTintColor")) item.getInt("activeTintColor") else null, + hidden = if (item.hasKey("hidden")) item.getBoolean("hidden") else false, + testID = item.getString("testID") + ) + ) + } + } + view.updateItems(itemsArray) + } } override fun setSelectedPage(view: ReactBottomNavigationView?, value: String?) { if (view != null && value != null) - tabViewImpl.setSelectedPage(view, value) + view.setSelectedItem(value) } override fun setIcons(view: ReactBottomNavigationView?, value: ReadableArray?) { if (view != null) - tabViewImpl.setIcons(view, value) + view.setIcons(value) } override fun setLabeled(view: ReactBottomNavigationView?, value: Boolean) { if (view != null) - tabViewImpl.setLabeled(view, value) + view.setLabeled(value) } override fun setRippleColor(view: ReactBottomNavigationView?, value: Int?) { - if (view != null && value != null) - tabViewImpl.setRippleColor(view, value) + if (view != null && value != null) { + val color = ColorStateList.valueOf(value) + view.setRippleColor(color) + } } override fun setBarTintColor(view: ReactBottomNavigationView?, value: Int?) { if (view != null && value != null) - tabViewImpl.setBarTintColor(view, value) + view.setBarTintColor(value) } override fun setActiveTintColor(view: ReactBottomNavigationView?, value: Int?) { if (view != null && value != null) - tabViewImpl.setActiveTintColor(view, value) + view.setActiveTintColor(value) } override fun setInactiveTintColor(view: ReactBottomNavigationView?, value: Int?) { if (view != null && value != null) - tabViewImpl.setInactiveTintColor(view, value) + view.setInactiveTintColor(value) } override fun setActiveIndicatorColor(view: ReactBottomNavigationView?, value: Int?) { - if (view != null && value != null) - tabViewImpl.setActiveIndicatorColor(view, value) + if (view != null && value != null) { + val color = ColorStateList.valueOf(value) + view.setActiveIndicatorColor(color) + } } override fun getDelegate(): ViewManagerDelegate { @@ -131,7 +160,7 @@ class RCTTabViewManager(context: ReactApplicationContext) : override fun setHapticFeedbackEnabled(view: ReactBottomNavigationView?, value: Boolean) { if (view != null) - tabViewImpl.setHapticFeedbackEnabled(view, value) + view.isHapticFeedbackEnabled = value } override fun setFontFamily(view: ReactBottomNavigationView?, value: String?) { @@ -166,4 +195,8 @@ class RCTTabViewManager(context: ReactApplicationContext) : override fun setMinimizeBehavior(view: ReactBottomNavigationView?, value: String?) { } + + companion object { + const val NAME = "RNCTabView" + } } diff --git a/packages/react-native-bottom-tabs/android/src/oldarch/RCTTabViewManager.kt b/packages/react-native-bottom-tabs/android/src/oldarch/RCTTabViewManager.kt deleted file mode 100644 index 50eb1f50..00000000 --- a/packages/react-native-bottom-tabs/android/src/oldarch/RCTTabViewManager.kt +++ /dev/null @@ -1,163 +0,0 @@ -package com.rcttabview - -import android.view.View -import com.facebook.react.module.annotations.ReactModule -import com.facebook.react.uimanager.ThemedReactContext -import com.facebook.react.uimanager.annotations.ReactProp -import com.facebook.react.uimanager.events.EventDispatcher -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReadableArray -import com.facebook.react.uimanager.UIManagerModule -import com.facebook.react.uimanager.ViewGroupManager -import com.rcttabview.events.OnNativeLayoutEvent -import com.rcttabview.events.OnTabBarMeasuredEvent -import com.rcttabview.events.PageSelectedEvent -import com.rcttabview.events.TabLongPressEvent - -@ReactModule(name = RCTTabViewImpl.NAME) -class RCTTabViewManager(context: ReactApplicationContext) : ViewGroupManager() { - private lateinit var eventDispatcher: EventDispatcher - private var tabViewImpl = RCTTabViewImpl() - - override fun getName(): String { - return tabViewImpl.getName() - } - - public override fun createViewInstance(context: ThemedReactContext): ReactBottomNavigationView { - eventDispatcher = context.getNativeModule(UIManagerModule::class.java)!!.eventDispatcher - val view = ReactBottomNavigationView(context) - view.onTabSelectedListener = { key -> - eventDispatcher.dispatchEvent(PageSelectedEvent(viewTag = view.id, key)) - } - - view.onTabLongPressedListener = { key -> - eventDispatcher.dispatchEvent(TabLongPressEvent(viewTag = view.id, key)) - } - - view.onNativeLayoutListener = { width, height -> - eventDispatcher.dispatchEvent(OnNativeLayoutEvent(viewTag = view.id, width, height)) - } - - view.onTabBarMeasuredListener = { height -> - eventDispatcher.dispatchEvent(OnTabBarMeasuredEvent(viewTag = view.id, height)) - } - return view - } - - override fun onDropViewInstance(view: ReactBottomNavigationView) { - super.onDropViewInstance(view) - view.onDropViewInstance() - } - - override fun getChildCount(parent: ReactBottomNavigationView): Int { - return tabViewImpl.getChildCount(parent) - } - - override fun getChildAt(parent: ReactBottomNavigationView, index: Int): View? { - return tabViewImpl.getChildAt(parent, index) - } - - override fun removeView(parent: ReactBottomNavigationView, view: View) { - tabViewImpl.removeView(parent, view) - } - - override fun removeAllViews(parent: ReactBottomNavigationView) { - tabViewImpl.removeAllViews(parent) - } - - override fun removeViewAt(parent: ReactBottomNavigationView, index: Int) { - tabViewImpl.removeViewAt(parent, index) - } - - override fun needsCustomLayoutForChildren(): Boolean { - return tabViewImpl.needsCustomLayoutForChildren() - } - - override fun getExportedCustomDirectEventTypeConstants(): MutableMap? { - return tabViewImpl.getExportedCustomDirectEventTypeConstants() - } - - @ReactProp(name = "items") - fun setItems(view: ReactBottomNavigationView, items: ReadableArray) { - tabViewImpl.setItems(view, items) - } - - @ReactProp(name = "selectedPage") - fun setSelectedPage(view: ReactBottomNavigationView, key: String) { - tabViewImpl.setSelectedPage(view, key) - } - - @ReactProp(name = "labeled") - fun setLabeled(view: ReactBottomNavigationView, flag: Boolean?) { - tabViewImpl.setLabeled(view, flag) - } - - @ReactProp(name = "icons") - fun setIcons(view: ReactBottomNavigationView, icons: ReadableArray?) { - tabViewImpl.setIcons(view, icons) - } - - @ReactProp(name = "barTintColor", customType = "Color") - fun setBarTintColor(view: ReactBottomNavigationView, color: Int?) { - tabViewImpl.setBarTintColor(view, color) - } - - @ReactProp(name = "rippleColor", customType = "Color") - fun setRippleColor(view: ReactBottomNavigationView, rippleColor: Int?) { - tabViewImpl.setRippleColor(view, rippleColor) - } - - @ReactProp(name = "activeTintColor", customType = "Color") - fun setActiveTintColor(view: ReactBottomNavigationView, color: Int?) { - tabViewImpl.setActiveTintColor(view, color) - } - - @ReactProp(name = "inactiveTintColor", customType = "Color") - fun setInactiveTintColor(view: ReactBottomNavigationView, color: Int?) { - tabViewImpl.setInactiveTintColor(view, color) - } - - @ReactProp(name = "activeIndicatorColor", customType = "Color") - fun setActiveIndicatorColor(view: ReactBottomNavigationView, color: Int?) { - tabViewImpl.setActiveIndicatorColor(view, color) - } - - @ReactProp(name = "disablePageAnimations") - fun setDisablePageAnimations(view: ReactBottomNavigationView, flag: Boolean) { - view.disablePageAnimations = flag - } - - @ReactProp(name = "tabBarHidden") - fun setTabBarHidden(view: ReactBottomNavigationView, flag: Boolean) { - view.setTabBarHidden(flag) - } - - // iOS Props - @ReactProp(name = "sidebarAdaptable") - fun setSidebarAdaptable(view: ReactBottomNavigationView, flag: Boolean) { - } - - @ReactProp(name = "minimizeBehavior") - fun setMinimizeBehavior(view: ReactBottomNavigationView, flag: Boolean) { - } - - @ReactProp(name = "hapticFeedbackEnabled") - fun setHapticFeedbackEnabled(view: ReactBottomNavigationView, value: Boolean) { - tabViewImpl.setHapticFeedbackEnabled(view, value) - } - - @ReactProp(name = "fontFamily") - fun setFontFamily(view: ReactBottomNavigationView?, value: String?) { - view?.setFontFamily(value) - } - - @ReactProp(name = "fontWeight") - fun setFontWeight(view: ReactBottomNavigationView?, value: String?) { - view?.setFontWeight(value) - } - - @ReactProp(name = "fontSize") - fun setFontSize(view: ReactBottomNavigationView?, value: Int) { - view?.setFontSize(value) - } -} diff --git a/packages/react-native-bottom-tabs/ios/Events/OnNativeLayoutEvent.swift b/packages/react-native-bottom-tabs/ios/Events/OnNativeLayoutEvent.swift deleted file mode 100644 index fd001071..00000000 --- a/packages/react-native-bottom-tabs/ios/Events/OnNativeLayoutEvent.swift +++ /dev/null @@ -1,36 +0,0 @@ -import React - -@objcMembers -public class OnNativeLayoutEvent: NSObject, RCTEvent { - private var size: CGSize - public var viewTag: NSNumber - - public var eventName: String { - "onNativeLayout" - } - - public init(reactTag: NSNumber, size: CGSize) { - self.viewTag = reactTag - self.size = size - super.init() - } - - public class func moduleDotMethod() -> String { - "RCTEventEmitter.receiveEvent" - } - - public func canCoalesce() -> Bool { - false - } - - public func arguments() -> [Any] { - [ - viewTag, - RCTNormalizeInputEventName(eventName) ?? eventName, - [ - "width": size.width, - "height": size.height - ] - ] - } -} diff --git a/packages/react-native-bottom-tabs/ios/Events/PageSelectedEvent.swift b/packages/react-native-bottom-tabs/ios/Events/PageSelectedEvent.swift deleted file mode 100644 index ff5b79b1..00000000 --- a/packages/react-native-bottom-tabs/ios/Events/PageSelectedEvent.swift +++ /dev/null @@ -1,35 +0,0 @@ -import React - -@objcMembers -public class PageSelectedEvent: NSObject, RCTEvent { - private var key: NSString - public var viewTag: NSNumber - - public var eventName: String { - "onPageSelected" - } - - public init(reactTag: NSNumber, key: NSString) { - self.viewTag = reactTag - self.key = key - super.init() - } - - public class func moduleDotMethod() -> String { - "RCTEventEmitter.receiveEvent" - } - - public func canCoalesce() -> Bool { - false - } - - public func arguments() -> [Any] { - [ - viewTag, - RCTNormalizeInputEventName(eventName) ?? eventName, - [ - "key": key - ] - ] - } -} diff --git a/packages/react-native-bottom-tabs/ios/Events/TabBarMeasuredEvent.swift b/packages/react-native-bottom-tabs/ios/Events/TabBarMeasuredEvent.swift deleted file mode 100644 index d5aa1aef..00000000 --- a/packages/react-native-bottom-tabs/ios/Events/TabBarMeasuredEvent.swift +++ /dev/null @@ -1,35 +0,0 @@ -import React - -@objcMembers -public class TabBarMeasuredEvent: NSObject, RCTEvent { - private var height: NSInteger - public var viewTag: NSNumber - - public var eventName: String { - "onTabBarMeasured" - } - - public init(reactTag: NSNumber, height: NSInteger) { - self.viewTag = reactTag - self.height = height - super.init() - } - - public class func moduleDotMethod() -> String { - "RCTEventEmitter.receiveEvent" - } - - public func canCoalesce() -> Bool { - false - } - - public func arguments() -> [Any] { - [ - viewTag, - RCTNormalizeInputEventName(eventName) ?? eventName, - [ - "height": height - ] - ] - } -} diff --git a/packages/react-native-bottom-tabs/ios/Events/TabLongPressedEvent.swift b/packages/react-native-bottom-tabs/ios/Events/TabLongPressedEvent.swift deleted file mode 100644 index 9950e40c..00000000 --- a/packages/react-native-bottom-tabs/ios/Events/TabLongPressedEvent.swift +++ /dev/null @@ -1,38 +0,0 @@ -import React - -// RCTEvent is not defined for new arch. -protocol RCTEvent {} - -@objcMembers -public class TabLongPressEvent: NSObject, RCTEvent { - private var key: NSString - public var viewTag: NSNumber - - public var eventName: String { - "onTabLongPress" - } - - public init(reactTag: NSNumber, key: NSString) { - self.viewTag = reactTag - self.key = key - super.init() - } - - public class func moduleDotMethod() -> String { - "RCTEventEmitter.receiveEvent" - } - - public func canCoalesce() -> Bool { - false - } - - public func arguments() -> [Any] { - [ - viewTag, - RCTNormalizeInputEventName(eventName) ?? eventName, - [ - "key": key - ] - ] - } -} diff --git a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h similarity index 100% rename from packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.h rename to packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h diff --git a/packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm similarity index 100% rename from packages/react-native-bottom-tabs/ios/Fabric/RCTTabViewComponentView.mm rename to packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm diff --git a/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm b/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm deleted file mode 100644 index 3a761d17..00000000 --- a/packages/react-native-bottom-tabs/ios/RCTTabViewViewManager.mm +++ /dev/null @@ -1,82 +0,0 @@ -#import -#import -#import -#import - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#if __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") -#import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" -#else -#import "react_native_bottom_tabs-Swift.h" -#endif - -@interface RCTTabView : RCTViewManager -@end - -@implementation RCTTabView - -RCT_EXPORT_MODULE(RNCTabView) - -RCT_EXPORT_VIEW_PROPERTY(items, NSArray) -RCT_EXPORT_VIEW_PROPERTY(onPageSelected, RCTDirectEventBlock) -RCT_EXPORT_VIEW_PROPERTY(onTabLongPress, RCTDirectEventBlock) -RCT_EXPORT_VIEW_PROPERTY(onTabBarMeasured, RCTDirectEventBlock) -RCT_EXPORT_VIEW_PROPERTY(onNativeLayout, RCTDirectEventBlock) -RCT_EXPORT_VIEW_PROPERTY(selectedPage, NSString) -RCT_EXPORT_VIEW_PROPERTY(tabViewStyle, NSString) -RCT_EXPORT_VIEW_PROPERTY(minimizeBehavior, NSString) -RCT_EXPORT_VIEW_PROPERTY(icons, NSArray); -RCT_EXPORT_VIEW_PROPERTY(sidebarAdaptable, BOOL) -RCT_EXPORT_VIEW_PROPERTY(labeled, BOOL) -RCT_EXPORT_VIEW_PROPERTY(disablePageAnimations, BOOL) -RCT_EXPORT_VIEW_PROPERTY(scrollEdgeAppearance, NSString) -RCT_EXPORT_VIEW_PROPERTY(translucent, BOOL) -RCT_EXPORT_VIEW_PROPERTY(barTintColor, UIColor) -RCT_EXPORT_VIEW_PROPERTY(activeTintColor, UIColor) -RCT_EXPORT_VIEW_PROPERTY(inactiveTintColor, UIColor) -RCT_EXPORT_VIEW_PROPERTY(hapticFeedbackEnabled, BOOL) -RCT_EXPORT_VIEW_PROPERTY(fontFamily, NSString) -RCT_EXPORT_VIEW_PROPERTY(fontWeight, NSString) -RCT_EXPORT_VIEW_PROPERTY(fontSize, NSNumber) -RCT_EXPORT_VIEW_PROPERTY(tabBarHidden, BOOL) - -// MARK: TabViewProviderDelegate - -- (void)onLongPressWithKey:(NSString *)key reactTag:(NSNumber *)reactTag { - auto event = [[TabLongPressEvent alloc] initWithReactTag:reactTag key:key]; - [self.bridge.eventDispatcher sendEvent:event]; -} - -- (void)onPageSelectedWithKey:(NSString *)key reactTag:(NSNumber *)reactTag { - auto event = [[PageSelectedEvent alloc] initWithReactTag:reactTag key:key]; - [self.bridge.eventDispatcher sendEvent:event]; -} - -- (void)onTabBarMeasuredWithHeight:(NSInteger)height reactTag:(NSNumber *)reactTag { - auto event = [[TabBarMeasuredEvent alloc] initWithReactTag:reactTag height:height]; - [self.bridge.eventDispatcher sendEvent:event]; -} - -- (void)onLayoutWithSize:(CGSize)size reactTag:(NSNumber *)reactTag { - auto event = [[OnNativeLayoutEvent alloc] initWithReactTag:reactTag size:size]; - [self.bridge.eventDispatcher sendEvent:event]; -} - -#if TARGET_OS_OSX -- (NSView *)view -#else -- (UIView *) view -#endif -{ - TabViewProvider *tabview = [[TabViewProvider alloc] initWithDelegate:self]; - RCTImageLoader *imageLoader = [self.bridge moduleForClass:[RCTImageLoader class]]; - [tabview setImageLoader:imageLoader]; - return tabview; -} - -@end diff --git a/packages/react-native-bottom-tabs/ios/TabViewProvider.swift b/packages/react-native-bottom-tabs/ios/TabViewProvider.swift index 9795a41a..934b8163 100644 --- a/packages/react-native-bottom-tabs/ios/TabViewProvider.swift +++ b/packages/react-native-bottom-tabs/ios/TabViewProvider.swift @@ -113,12 +113,6 @@ public final class TabInfo: NSObject { } } - @objc var items: NSArray? { - didSet { - props.items = parseTabData(from: items) - } - } - @objc public var barTintColor: PlatformColor? { didSet { props.barTintColor = barTintColor @@ -161,8 +155,6 @@ public final class TabInfo: NSObject { } } - // New arch specific properties - @objc public var itemsData: [TabInfo] = [] { didSet { props.items = itemsData @@ -268,29 +260,4 @@ public final class TabInfo: NSObject { } } } - - private func parseTabData(from array: NSArray?) -> [TabInfo] { - guard let array else { return [] } - var items: [TabInfo] = [] - - for value in array { - if let itemDict = value as? [String: Any] { - items.append( - TabInfo( - key: itemDict["key"] as? String ?? "", - title: itemDict["title"] as? String ?? "", - badge: itemDict["badge"] as? String, - sfSymbol: itemDict["sfSymbol"] as? String ?? "", - activeTintColor: RCTConvert.uiColor(itemDict["activeTintColor"] as? NSNumber), - hidden: itemDict["hidden"] as? Bool ?? false, - testID: itemDict["testID"] as? String ?? "", - role: itemDict["role"] as? String, - preventsDefault: itemDict["preventsDefault"] as? Bool ?? false - ) - ) - } - } - - return items - } } diff --git a/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec b/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec index befef4b2..15fddf33 100644 --- a/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec +++ b/packages/react-native-bottom-tabs/react-native-bottom-tabs.podspec @@ -1,7 +1,6 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) -new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' Pod::Spec.new do |s| s.name = "react-native-bottom-tabs" @@ -21,11 +20,9 @@ Pod::Spec.new do |s| s.source_files = "ios/**/*.{h,m,mm,cpp,swift}" s.static_framework = true - if new_arch_enabled - s.subspec "common" do |ss| - ss.source_files = "common/cpp/**/*.{cpp,h}" - ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" } - end + s.subspec "common" do |ss| + ss.source_files = "common/cpp/**/*.{cpp,h}" + ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" } end s.dependency "SwiftUIIntrospect", '~> 1.0' diff --git a/turbo.json b/turbo.json index d1422cf5..0991fc8f 100644 --- a/turbo.json +++ b/turbo.json @@ -30,22 +30,6 @@ ], "outputs": [] }, - "build:android:fabric": { - "env": ["JAVA_HOME", "ANDROID_NDK", "ANDROID_SDK", "ANDROID_HOME"], - "inputs": [ - "packages/react-native-bottom-tabs/package.json", - "packages/react-native-bottom-tabs/android", - "packages/react-native-bottom-tabs/!android/build", - "packages/react-native-bottom-tabs/src/*.ts", - "packages/react-native-bottom-tabs/src/*.tsx", - "apps/example/package.json", - "apps/example/android", - "!apps/example/android/.gradle", - "!apps/example/android/build", - "!apps/example/android/app/build" - ], - "outputs": [] - }, "build:ios": { "env": ["RCT_NEW_ARCH_ENABLED"], "inputs": [