Skip to content

Commit 4b177f8

Browse files
committed
feat: allow for hiding the tab bar
1 parent 28ce672 commit 4b177f8

File tree

7 files changed

+44
-14
lines changed

7 files changed

+44
-14
lines changed

ios/Fabric/RCTTabViewComponentView.mm

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,19 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &
142142
if (oldViewProps.inactiveTintColor != newViewProps.inactiveTintColor) {
143143
_tabViewProvider.inactiveTintColor = RCTUIColorFromSharedColor(newViewProps.inactiveTintColor);
144144
}
145-
145+
146146
if (oldViewProps.hapticFeedbackEnabled != newViewProps.hapticFeedbackEnabled) {
147147
_tabViewProvider.hapticFeedbackEnabled = newViewProps.hapticFeedbackEnabled;
148148
}
149-
149+
150150
if (oldViewProps.fontSize != newViewProps.fontSize) {
151151
_tabViewProvider.fontSize = [NSNumber numberWithInt:newViewProps.fontSize];
152152
}
153-
153+
154154
if (oldViewProps.fontWeight != newViewProps.fontWeight) {
155155
_tabViewProvider.fontWeigth = RCTNSStringFromStringNilIfEmpty(newViewProps.fontWeight);
156156
}
157-
157+
158158
if (oldViewProps.fontFamily != newViewProps.fontFamily) {
159159
_tabViewProvider.fontFamily = RCTNSStringFromStringNilIfEmpty(newViewProps.fontFamily);
160160
}
@@ -168,7 +168,8 @@ bool areTabItemsEqual(const RNCTabViewItemsStruct& lhs, const RNCTabViewItemsStr
168168
lhs.sfSymbol == rhs.sfSymbol &&
169169
lhs.badge == rhs.badge &&
170170
lhs.activeTintColor == rhs.activeTintColor &&
171-
lhs.hidden == rhs.hidden;
171+
lhs.hidden == rhs.hidden &&
172+
lhs.tabBarHidden == rhs.tabBarHidden;
172173
}
173174

174175
bool haveTabItemsChanged(const std::vector<RNCTabViewItemsStruct>& oldItems,
@@ -196,7 +197,8 @@ bool haveTabItemsChanged(const std::vector<RNCTabViewItemsStruct>& oldItems,
196197
badge:RCTNSStringFromStringNilIfEmpty(item.badge)
197198
sfSymbol:RCTNSStringFromStringNilIfEmpty(item.sfSymbol)
198199
activeTintColor:RCTUIColorFromSharedColor(item.activeTintColor)
199-
hidden:item.hidden];
200+
hidden:item.hidden
201+
tabBarHidden:item.tabBarHidden];
200202

201203
[result addObject:tabInfo];
202204
}

ios/TabViewImpl.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ class TabViewProps: ObservableObject {
3535

3636
return activeTintColor
3737
}
38+
39+
var filteredItems: [TabInfo] {
40+
items.filter({
41+
!$0.hidden || $0.key == selectedPage
42+
})
43+
}
3844
}
3945

4046
/**
@@ -68,10 +74,10 @@ struct TabViewImpl: View {
6874
}
6975
#if !os(tvOS)
7076
.onTabItemEvent({ index, isLongPress in
71-
guard let key = props.items.filter({
72-
!$0.hidden || $0.key == props.selectedPage
73-
})[safe: index]?.key else { return }
74-
77+
let item = props.filteredItems[safe: index]
78+
guard let key = item?.key else { return }
79+
80+
7581
if isLongPress {
7682
onLongPress(key)
7783
emitHapticFeedback(longPress: true)
@@ -86,6 +92,7 @@ struct TabViewImpl: View {
8692
})
8793
.onChange(of: tabBar) { newValue in
8894
updateTabBarAppearance(props: props, tabBar: tabBar)
95+
hideTabBarIfNeeded()
8996
}
9097
.configureAppearance(props: props, tabBar: tabBar)
9198
.tintColor(props.selectedActiveTintColor)
@@ -100,6 +107,7 @@ struct TabViewImpl: View {
100107
#if os(tvOS)
101108
onSelect(newValue)
102109
#endif
110+
hideTabBarIfNeeded()
103111
}
104112
}
105113

@@ -152,6 +160,12 @@ struct TabViewImpl: View {
152160
}
153161
#endif
154162
}
163+
164+
func hideTabBarIfNeeded() {
165+
let item = props.filteredItems.first {$0.key == props.selectedPage}
166+
let tabBarHidden = item?.tabBarHidden ?? false
167+
tabBar?.isHidden = tabBarHidden
168+
}
155169
}
156170

157171
struct TabItem: View {

ios/TabViewProvider.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,25 @@ import React
99
@objc public let sfSymbol: String
1010
@objc public let activeTintColor: UIColor?
1111
@objc public let hidden: Bool
12-
12+
@objc public let tabBarHidden: Bool
13+
1314
@objc
1415
public init(
1516
key: String,
1617
title: String,
1718
badge: String,
1819
sfSymbol: String,
1920
activeTintColor: UIColor?,
20-
hidden: Bool
21+
hidden: Bool,
22+
tabBarHidden: Bool
2123
) {
2224
self.key = key
2325
self.title = title
2426
self.badge = badge
2527
self.sfSymbol = sfSymbol
2628
self.activeTintColor = activeTintColor
2729
self.hidden = hidden
30+
self.tabBarHidden = tabBarHidden
2831
super.init()
2932
}
3033
}
@@ -232,7 +235,8 @@ import React
232235
badge: itemDict["badge"] as? String ?? "",
233236
sfSymbol: itemDict["sfSymbol"] as? String ?? "",
234237
activeTintColor: RCTConvert.uiColor(itemDict["activeTintColor"] as? NSNumber),
235-
hidden: itemDict["hidden"] as? Bool ?? false
238+
hidden: itemDict["hidden"] as? Bool ?? false,
239+
tabBarHidden: itemDict["tabBarHidden"] as? Bool ?? false
236240
)
237241
)
238242
}

src/TabView.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ const TabView = <Route extends BaseRoute>({
223223
badge: getBadge?.({ route }),
224224
activeTintColor: processColor(getActiveTintColor({ route })),
225225
hidden: getHidden?.({ route }),
226+
tabBarHidden: route.tabBarHidden,
226227
};
227228
}),
228229
[

src/TabViewAdapter.android.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@ import type { TabViewProps } from './TabViewNativeComponent';
33
import { StyleSheet, View } from 'react-native';
44

55
const TabViewAdapter = ({ children, style: _, ...props }: TabViewProps) => {
6+
const hidesTabBar = props.items.find(
7+
(item) => item.key === props.selectedPage
8+
)?.tabBarHidden;
9+
610
return (
711
<>
812
<View style={styles.content}>{children}</View>
9-
<NativeTabView {...props} />
13+
<NativeTabView
14+
{...props}
15+
style={{ display: hidesTabBar ? 'none' : 'flex' }}
16+
/>
1017
</>
1118
);
1219
};

src/TabViewNativeComponent.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type TabViewItems = ReadonlyArray<{
1919
badge?: string;
2020
activeTintColor?: ProcessedColorValue | null;
2121
hidden?: boolean;
22+
tabBarHidden?: boolean;
2223
}>;
2324

2425
export interface TabViewProps extends ViewProps {

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export type BaseRoute = {
1414
unfocusedIcon?: ImageSourcePropType | AppleIcon;
1515
activeTintColor?: string;
1616
hidden?: boolean;
17+
tabBarHidden?: boolean;
1718
};
1819

1920
export type NavigationState<Route extends BaseRoute> = {

0 commit comments

Comments
 (0)