healthapp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

183 lines
5.2 KiB

import React from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { useAuthStore } from "../stores/authStore";
import { useSettingsStore, getFontSize } from "../stores/settingsStore";
import { colors } from "../theme";
// Screens
import LoginScreen from "../screens/auth/LoginScreen";
import HomeScreen from "../screens/home/HomeScreen";
import ChatListScreen from "../screens/chat/ChatListScreen";
import ChatDetailScreen from "../screens/chat/ChatDetailScreen";
import ConstitutionHomeScreen from "../screens/constitution/ConstitutionHomeScreen";
import ConstitutionTestScreen from "../screens/constitution/ConstitutionTestScreen";
import ConstitutionResultScreen from "../screens/constitution/ConstitutionResultScreen";
import ProfileScreen from "../screens/profile/ProfileScreen";
import HealthProfileScreen from "../screens/profile/HealthProfileScreen";
import HealthNewsScreen from "../screens/news/HealthNewsScreen";
// Icons (using text for simplicity)
import { Text, View } from "react-native";
const Stack = createNativeStackNavigator();
const Tab = createBottomTabNavigator();
const ChatStack = createNativeStackNavigator();
const ConstitutionStack = createNativeStackNavigator();
const HomeStack = createNativeStackNavigator();
const ProfileStack = createNativeStackNavigator();
function TabIcon({
label,
focused,
elderMode,
}: {
label: string;
focused: boolean;
elderMode: boolean;
}) {
const icons: Record<string, string> = {
: "🏠",
: "💬",
: "📊",
: "👤",
};
const fontSize = elderMode ? 24 : 20;
const textSize = elderMode ? 12 : 10;
return (
<View style={{ alignItems: "center" }}>
<Text style={{ fontSize }}>{icons[label]}</Text>
<Text
style={{
fontSize: textSize,
color: focused ? colors.primary : colors.textHint,
marginTop: 2,
}}
>
{label}
</Text>
</View>
);
}
function HomeStackNavigator() {
return (
<HomeStack.Navigator screenOptions={{ headerShown: false }}>
<HomeStack.Screen name="HomeMain" component={HomeScreen} />
<HomeStack.Screen name="HealthNews" component={HealthNewsScreen} />
</HomeStack.Navigator>
);
}
function ChatStackNavigator() {
return (
<ChatStack.Navigator screenOptions={{ headerShown: false }}>
<ChatStack.Screen name="ChatList" component={ChatListScreen} />
<ChatStack.Screen name="ChatDetail" component={ChatDetailScreen} />
</ChatStack.Navigator>
);
}
function ConstitutionStackNavigator() {
return (
<ConstitutionStack.Navigator screenOptions={{ headerShown: false }}>
<ConstitutionStack.Screen
name="ConstitutionHome"
component={ConstitutionHomeScreen}
/>
<ConstitutionStack.Screen
name="ConstitutionTest"
component={ConstitutionTestScreen}
/>
<ConstitutionStack.Screen
name="ConstitutionResult"
component={ConstitutionResultScreen}
/>
</ConstitutionStack.Navigator>
);
}
function ProfileStackNavigator() {
return (
<ProfileStack.Navigator screenOptions={{ headerShown: false }}>
<ProfileStack.Screen name="ProfileMain" component={ProfileScreen} />
<ProfileStack.Screen
name="HealthProfile"
component={HealthProfileScreen}
/>
</ProfileStack.Navigator>
);
}
function MainTabs() {
const { elderMode } = useSettingsStore();
return (
<Tab.Navigator
screenOptions={{
headerShown: false,
tabBarShowLabel: false,
tabBarStyle: {
height: elderMode ? 70 : 60,
paddingBottom: elderMode ? 10 : 8,
paddingTop: elderMode ? 10 : 8,
},
}}
>
<Tab.Screen
name="Home"
component={HomeStackNavigator}
options={{
tabBarIcon: ({ focused }) => (
<TabIcon label="首页" focused={focused} elderMode={elderMode} />
),
}}
/>
<Tab.Screen
name="Chat"
component={ChatStackNavigator}
options={{
tabBarIcon: ({ focused }) => (
<TabIcon label="问答" focused={focused} elderMode={elderMode} />
),
}}
/>
<Tab.Screen
name="Constitution"
component={ConstitutionStackNavigator}
options={{
tabBarIcon: ({ focused }) => (
<TabIcon label="体质" focused={focused} elderMode={elderMode} />
),
}}
/>
<Tab.Screen
name="Profile"
component={ProfileStackNavigator}
options={{
tabBarIcon: ({ focused }) => (
<TabIcon label="我的" focused={focused} elderMode={elderMode} />
),
}}
/>
</Tab.Navigator>
);
}
export default function Navigation() {
const { isLoggedIn } = useAuthStore();
return (
<NavigationContainer>
<Stack.Navigator screenOptions={{ headerShown: false }}>
{!isLoggedIn ? (
<Stack.Screen name="Login" component={LoginScreen} />
) : (
<Stack.Screen name="Main" component={MainTabs} />
)}
</Stack.Navigator>
</NavigationContainer>
);
}