import React, { useEffect, useState } from 'react'; import { apiClient } from '../services/api'; import Chart from '../components/Chart'; import './Dashboard.css'; interface HealthData { date: string; steps?: number; heartRate?: number; sleep?: { duration: number; quality: number; }; caloriesBurned?: number; } function Dashboard() { const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [summary, setSummary] = useState([]); const [today, setToday] = useState(null); const [stats, setStats] = useState({ avgSteps: 0, avgHeartRate: 0, avgSleep: 0, totalCalories: 0, }); useEffect(() => { loadData(); }, []); const loadData = async () => { try { setLoading(true); setError(''); // Load 30-day summary const now = new Date(); const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); const startDate = thirtyDaysAgo.toISOString().split('T')[0]; const endDate = now.toISOString().split('T')[0]; const response = await apiClient.getHealthSummary(startDate, endDate); const data = response.data.data || []; setSummary(data); // Get today's data const todayData = data.find((d: HealthData) => d.date === endDate); setToday(todayData || null); // Calculate stats const validData = data.filter((d: HealthData) => d.steps || d.heartRate); if (validData.length > 0) { const avgSteps = Math.round( validData.reduce((sum: number, d: HealthData) => sum + (d.steps || 0), 0) / validData.length ) || 0; const heartRates = validData .map((d: HealthData) => d.heartRate) .filter((hr) => hr); const avgHeartRate = heartRates.length > 0 ? Math.round(heartRates.reduce((a, b) => a + b, 0) / heartRates.length) : 0; const sleeps = validData .map((d: HealthData) => d.sleep?.duration) .filter((s) => s); const avgSleep = sleeps.length > 0 ? Math.round((sleeps.reduce((a, b) => a + b, 0) / sleeps.length) * 10) / 10 : 0; const totalCalories = Math.round( validData.reduce((sum: number, d: HealthData) => sum + (d.caloriesBurned || 0), 0) ); setStats({ avgSteps, avgHeartRate, avgSleep, totalCalories }); } setLoading(false); } catch (err: any) { const errorMsg = err.response?.data?.error?.message || 'Failed to load data'; setError(errorMsg); setLoading(false); } }; if (loading) { return
⏳ 加载中...
; } return (

📊 健康仪表板

{error &&
{error}
} {/* Today's Summary */} {today ? (

今日概览

🚶
步数
{today.steps || '-'}
❤️
心率
{today.heartRate || '-'} bpm
😴
睡眠
{today.sleep?.duration || '-'} 小时
🔥
卡路里
{today.caloriesBurned || '-'} kcal
) : (
暂无今日数据
)} {/* 30-Day Statistics */}

30 日统计

📈
平均步数
{stats.avgSteps.toLocaleString()}
❤️
平均心率
{stats.avgHeartRate} bpm
😴
平均睡眠
{stats.avgSleep}h
🔥
总卡路里消耗
{stats.totalCalories.toLocaleString()}
{/* Charts */} {summary.length > 0 && (

数据趋势

d.heartRate)} type="line" dataKey="heartRate" stroke="#ff6b9d" /> d.sleep)} type="line" dataKey={(d: any) => d.sleep?.duration} stroke="#ffd93d" />
)}
); } export default Dashboard;