diff --git a/ios/Fabric/RCTTabViewComponentView.mm b/ios/Fabric/RCTTabViewComponentView.mm index c68cfc81..f3a467a1 100644 --- a/ios/Fabric/RCTTabViewComponentView.mm +++ b/ios/Fabric/RCTTabViewComponentView.mm @@ -142,19 +142,19 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & if (oldViewProps.inactiveTintColor != newViewProps.inactiveTintColor) { _tabViewProvider.inactiveTintColor = RCTUIColorFromSharedColor(newViewProps.inactiveTintColor); } - + if (oldViewProps.hapticFeedbackEnabled != newViewProps.hapticFeedbackEnabled) { _tabViewProvider.hapticFeedbackEnabled = newViewProps.hapticFeedbackEnabled; } - + if (oldViewProps.fontSize != newViewProps.fontSize) { _tabViewProvider.fontSize = [NSNumber numberWithInt:newViewProps.fontSize]; } - + if (oldViewProps.fontWeight != newViewProps.fontWeight) { _tabViewProvider.fontWeigth = RCTNSStringFromStringNilIfEmpty(newViewProps.fontWeight); } - + if (oldViewProps.fontFamily != newViewProps.fontFamily) { _tabViewProvider.fontFamily = RCTNSStringFromStringNilIfEmpty(newViewProps.fontFamily); } @@ -168,7 +168,8 @@ bool areTabItemsEqual(const RNCTabViewItemsStruct& lhs, const RNCTabViewItemsStr lhs.sfSymbol == rhs.sfSymbol && lhs.badge == rhs.badge && lhs.activeTintColor == rhs.activeTintColor && - lhs.hidden == rhs.hidden; + lhs.hidden == rhs.hidden && + lhs.tabBarHidden == rhs.tabBarHidden; } bool haveTabItemsChanged(const std::vector& oldItems, @@ -196,7 +197,8 @@ bool haveTabItemsChanged(const std::vector& oldItems, badge:RCTNSStringFromStringNilIfEmpty(item.badge) sfSymbol:RCTNSStringFromStringNilIfEmpty(item.sfSymbol) activeTintColor:RCTUIColorFromSharedColor(item.activeTintColor) - hidden:item.hidden]; + hidden:item.hidden + tabBarHidden:item.tabBarHidden]; [result addObject:tabInfo]; } diff --git a/ios/TabViewImpl.swift b/ios/TabViewImpl.swift index 693733b6..7a29820c 100644 --- a/ios/TabViewImpl.swift +++ b/ios/TabViewImpl.swift @@ -35,6 +35,12 @@ class TabViewProps: ObservableObject { return activeTintColor } + + var filteredItems: [TabInfo] { + items.filter({ + !$0.hidden || $0.key == selectedPage + }) + } } /** @@ -68,10 +74,10 @@ struct TabViewImpl: View { } #if !os(tvOS) .onTabItemEvent({ index, isLongPress in - guard let key = props.items.filter({ - !$0.hidden || $0.key == props.selectedPage - })[safe: index]?.key else { return } - + let item = props.filteredItems[safe: index] + guard let key = item?.key else { return } + + if isLongPress { onLongPress(key) emitHapticFeedback(longPress: true) @@ -86,6 +92,7 @@ struct TabViewImpl: View { }) .onChange(of: tabBar) { newValue in updateTabBarAppearance(props: props, tabBar: tabBar) + hideTabBarIfNeeded() } .configureAppearance(props: props, tabBar: tabBar) .tintColor(props.selectedActiveTintColor) @@ -100,6 +107,7 @@ struct TabViewImpl: View { #if os(tvOS) onSelect(newValue) #endif + hideTabBarIfNeeded() } } @@ -152,6 +160,12 @@ struct TabViewImpl: View { } #endif } + + func hideTabBarIfNeeded() { + let item = props.filteredItems.first {$0.key == props.selectedPage} + let tabBarHidden = item?.tabBarHidden ?? false + tabBar?.isHidden = tabBarHidden + } } struct TabItem: View { diff --git a/ios/TabViewProvider.swift b/ios/TabViewProvider.swift index e2b2a100..e7610772 100644 --- a/ios/TabViewProvider.swift +++ b/ios/TabViewProvider.swift @@ -9,7 +9,8 @@ import React @objc public let sfSymbol: String @objc public let activeTintColor: UIColor? @objc public let hidden: Bool - + @objc public let tabBarHidden: Bool + @objc public init( key: String, @@ -17,7 +18,8 @@ import React badge: String, sfSymbol: String, activeTintColor: UIColor?, - hidden: Bool + hidden: Bool, + tabBarHidden: Bool ) { self.key = key self.title = title @@ -25,6 +27,7 @@ import React self.sfSymbol = sfSymbol self.activeTintColor = activeTintColor self.hidden = hidden + self.tabBarHidden = tabBarHidden super.init() } } @@ -232,7 +235,8 @@ import React badge: itemDict["badge"] as? String ?? "", sfSymbol: itemDict["sfSymbol"] as? String ?? "", activeTintColor: RCTConvert.uiColor(itemDict["activeTintColor"] as? NSNumber), - hidden: itemDict["hidden"] as? Bool ?? false + hidden: itemDict["hidden"] as? Bool ?? false, + tabBarHidden: itemDict["tabBarHidden"] as? Bool ?? false ) ) } diff --git a/src/TabView.tsx b/src/TabView.tsx index be888ba7..5c3ad862 100644 --- a/src/TabView.tsx +++ b/src/TabView.tsx @@ -223,6 +223,7 @@ const TabView = ({ badge: getBadge?.({ route }), activeTintColor: processColor(getActiveTintColor({ route })), hidden: getHidden?.({ route }), + tabBarHidden: route.tabBarHidden, }; }), [ diff --git a/src/TabViewAdapter.android.tsx b/src/TabViewAdapter.android.tsx index de739f17..c77a8b26 100644 --- a/src/TabViewAdapter.android.tsx +++ b/src/TabViewAdapter.android.tsx @@ -3,10 +3,17 @@ import type { TabViewProps } from './TabViewNativeComponent'; import { StyleSheet, View } from 'react-native'; const TabViewAdapter = ({ children, style: _, ...props }: TabViewProps) => { + const hidesTabBar = props.items.find( + (item) => item.key === props.selectedPage + )?.tabBarHidden; + return ( <> {children} - + ); }; diff --git a/src/TabViewNativeComponent.ts b/src/TabViewNativeComponent.ts index 75020fc6..b7c0cf22 100644 --- a/src/TabViewNativeComponent.ts +++ b/src/TabViewNativeComponent.ts @@ -19,6 +19,7 @@ export type TabViewItems = ReadonlyArray<{ badge?: string; activeTintColor?: ProcessedColorValue | null; hidden?: boolean; + tabBarHidden?: boolean; }>; export interface TabViewProps extends ViewProps { diff --git a/src/types.ts b/src/types.ts index 8307f910..e030c76d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -14,6 +14,7 @@ export type BaseRoute = { unfocusedIcon?: ImageSourcePropType | AppleIcon; activeTintColor?: string; hidden?: boolean; + tabBarHidden?: boolean; }; export type NavigationState = {