feat: 更新健康数据管理功能及相关组件

- 新增 healthSlice,用于管理健康数据的 Redux 状态
- 在 Statistics 组件中整合健康数据获取逻辑,优化数据展示
- 更新 NutritionRadarCard 组件,调整卡路里计算区域,提升用户体验
- 移除不必要的状态管理,简化组件逻辑
- 优化代码结构,提升可读性和维护性
This commit is contained in:
richarjiang
2025-08-25 19:20:56 +08:00
parent 91b7b0cb99
commit e6bbda9d0f
4 changed files with 179 additions and 93 deletions

View File

@@ -2,7 +2,6 @@ import { AnimatedNumber } from '@/components/AnimatedNumber';
import { ROUTES } from '@/constants/Routes';
import { NutritionSummary } from '@/services/dietRecords';
import { Ionicons } from '@expo/vector-icons';
import Feather from '@expo/vector-icons/Feather';
import dayjs from 'dayjs';
import { router } from 'expo-router';
import React, { useMemo } from 'react';
@@ -117,8 +116,10 @@ export function NutritionRadarCard({
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}></Text>
<View style={styles.cardRightContainer}>
<Text style={styles.cardSubtitle}>: {dayjs(nutritionSummary?.updatedAt).format('YYYY-MM-DD HH:mm')}</Text>
<Feather name="more-vertical" size={16} color="#9AA3AE" />
<Text style={styles.cardSubtitle}>: {dayjs(nutritionSummary?.updatedAt).format('MM-DD HH:mm')}</Text>
<View style={styles.addButton}>
<Ionicons name="add" size={12} color="#FFFFFF" />
</View>
</View>
</View>
@@ -146,8 +147,8 @@ export function NutritionRadarCard({
{/* 卡路里计算区域 */}
<View style={styles.calorieSection}>
<View style={styles.calorieContent}>
<Text style={styles.calorieSubtitle}>()</Text>
<View style={styles.calculationRow}>
<Text style={styles.calorieSubtitle}>()</Text>
<AnimatedNumber
value={remainingCalories}
resetToken={resetToken}
@@ -176,39 +177,8 @@ export function NutritionRadarCard({
style={styles.calculationValue}
format={(v) => Math.round(v).toString()}
/>
<Text style={styles.calculationText}> - </Text>
<View style={styles.calculationItem}>
<Ionicons name="trending-down" size={16} color="#95A5A6" />
<Text style={styles.calculationLabel}></Text>
</View>
<AnimatedNumber
value={calorieDeficit}
resetToken={resetToken}
style={styles.calculationValue}
format={(v) => Math.round(v).toString()}
/>
</View>
</View>
{/* 餐次选择区域 */}
{/* <View style={styles.mealsContainer}>
{meals.map((meal) => (
<TouchableOpacity
key={meal.type}
style={styles.mealItem}
onPress={() => onMealPress?.(meal.type)}
activeOpacity={0.7}
>
<View style={styles.mealIconContainer}>
<Text style={styles.mealEmoji}>{meal.emoji}</Text>
<View style={styles.addButton}>
<Ionicons name="add" size={12} color="#FFFFFF" />
</View>
</View>
<Text style={styles.mealName}>{meal.name}</Text>
</TouchableOpacity>
))}
</View> */}
</View>
</TouchableOpacity>
);
@@ -310,8 +280,8 @@ const styles = StyleSheet.create({
calorieSubtitle: {
fontSize: 10,
color: '#64748B',
marginBottom: 8,
fontWeight: '600',
marginRight: 4,
},
calculationRow: {
flexDirection: 'row',
@@ -363,9 +333,6 @@ const styles = StyleSheet.create({
fontSize: 24,
},
addButton: {
position: 'absolute',
top: -2,
right: -2,
width: 16,
height: 16,
borderRadius: 8,