import * as Haptics from 'expo-haptics'; import { Tabs, usePathname } from 'expo-router'; import React from 'react'; import { Text, TouchableOpacity, View } from 'react-native'; import { IconSymbol } from '@/components/ui/IconSymbol'; import { Colors } from '@/constants/Colors'; import { ROUTES } from '@/constants/Routes'; import { TAB_BAR_BOTTOM_OFFSET, TAB_BAR_HEIGHT } from '@/constants/TabBar'; import { useColorScheme } from '@/hooks/useColorScheme'; export default function TabLayout() { const theme = (useColorScheme() ?? 'light') as 'light' | 'dark'; const colorTokens = Colors[theme]; const pathname = usePathname(); return ( { const routeName = route.name; const isSelected = (routeName === 'explore' && pathname === ROUTES.TAB_EXPLORE) || (routeName === 'coach' && pathname === ROUTES.TAB_COACH) || (routeName === 'statistics' && pathname === ROUTES.TAB_STATISTICS) || pathname.includes(routeName); return { headerShown: false, tabBarActiveTintColor: colorTokens.tabIconSelected, tabBarButton: (props) => { const { onPress } = props; const handlePress = (event: any) => { if (process.env.EXPO_OS === 'ios') { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); } onPress && onPress(event); }; // 基于 routeName 设置图标与标题,避免 tabBarIcon 的包装导致文字裁剪 const getIconAndTitle = () => { switch (routeName) { case 'explore': return { icon: 'magnifyingglass.circle.fill', title: '发现' } as const; case 'coach': return { icon: 'person.3.fill', title: 'Seal' } as const; case 'statistics': return { icon: 'chart.pie.fill', title: '统计' } as const; case 'personal': return { icon: 'person.fill', title: '个人' } as const; default: return { icon: 'circle', title: '' } as const; } }; const { icon, title } = getIconAndTitle(); const activeContentColor = colorTokens.onPrimary; const inactiveContentColor = colorTokens.tabIconDefault; return ( {isSelected && !!title && ( {title} )} ); }, tabBarStyle: { position: 'absolute', bottom: TAB_BAR_BOTTOM_OFFSET, height: TAB_BAR_HEIGHT, borderRadius: 34, backgroundColor: colorTokens.tabBarBackground, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.2, shadowRadius: 10, elevation: 5, paddingHorizontal: 10, paddingTop: 0, paddingBottom: 0, marginHorizontal: 20, width: '90%', alignSelf: 'center', }, tabBarItemStyle: { backgroundColor: 'transparent', height: TAB_BAR_HEIGHT, marginTop: 0, marginBottom: 0, paddingTop: 0, paddingBottom: 0, }, tabBarShowLabel: false, }; }}> { const isCoachSelected = pathname === '/coach'; return ( {isCoachSelected && ( Seal )} ); }, }} /> { const isHomeSelected = pathname === '/' || pathname === '/index'; return ( {isHomeSelected && ( 发现 )} ); }, }} /> { const isStatisticsSelected = pathname === '/statistics'; return ( {isStatisticsSelected && ( 统计 )} ); }, }} /> { const isPersonalSelected = pathname === '/personal'; return ( {isPersonalSelected && ( 个人 )} ); }, }} /> ); }