import React, { useState, useEffect, useMemo } from 'react'; import { View, ScrollView, TouchableOpacity, RefreshControl } from 'react-native'; import { useTheme } from '@/hooks/useTheme'; import { Screen } from '@/components/Screen'; import { ThemedText } from '@/components/ThemedText'; import { ThemedView } from '@/components/ThemedView'; import { FontAwesome6 } from '@expo/vector-icons'; import { useSafeRouter } from '@/hooks/useSafeRouter'; import { createStyles } from './styles'; // 模拟用户ID(实际应用中应该从用户认证系统获取) const MOCK_USER_ID = 'mock-user-001'; export default function HomeScreen() { const { theme, isDark } = useTheme(); const styles = useMemo(() => createStyles(theme), [theme]); const router = useSafeRouter(); const [totalCalories, setTotalCalories] = useState(0); const [targetCalories] = useState(2000); const [currentWeight, setCurrentWeight] = useState(null); const [targetWeight, setTargetWeight] = useState(65); const [loading, setLoading] = useState(true); // 获取今日热量和体重数据 const fetchData = async () => { setLoading(true); try { // 获取今日总热量 /** * 服务端文件:server/src/routes/food-records.ts * 接口:GET /api/v1/food-records/total-calories * Query 参数:userId: string, date?: string */ const caloriesRes = await fetch( `${process.env.EXPO_PUBLIC_BACKEND_BASE_URL}/api/v1/food-records/total-calories?userId=${MOCK_USER_ID}` ); const caloriesData = await caloriesRes.json(); if (caloriesData.success) { setTotalCalories(caloriesData.data.totalCalories); } // 获取体重统计 /** * 服务端文件:server/src/routes/weight-records.ts * 接口:GET /api/v1/weight-records/stats * Query 参数:userId: string */ const weightRes = await fetch( `${process.env.EXPO_PUBLIC_BACKEND_BASE_URL}/api/v1/weight-records/stats?userId=${MOCK_USER_ID}` ); const weightData = await weightRes.json(); if (weightData.success) { setCurrentWeight(weightData.data.currentWeight); if (weightData.data.targetWeight) { setTargetWeight(weightData.data.targetWeight); } } } catch (error) { console.error('Failed to fetch data:', error); } finally { setLoading(false); } }; useEffect(() => { fetchData(); }, []); const caloriePercentage = Math.min((totalCalories / targetCalories) * 100, 100); return ( } > {/* Header */} 今日概览 坚持就是胜利 💪 {/* 热量卡片 */} 今日热量 {totalCalories} / {targetCalories} kcal 还可摄入 {Math.max(0, targetCalories - totalCalories)} kcal {/* 体重卡片 */} 当前体重 {currentWeight || '--'} kg {currentWeight && ( 目标体重:{targetWeight} kg {currentWeight > targetWeight ? ` (还需减 ${(currentWeight - targetWeight).toFixed(1)} kg)` : ' ✨'} )} {/* 快捷操作 */} router.push('/record')} > 拍照识别 router.push('/stats')} > 数据统计 router.push('/chat')} > AI 助手 {/* 最近记录 */} 最近记录 router.push('/record')}> 查看全部 暂无记录,快去拍照识别吧! ); }