feat: 更新健康数据管理功能及相关组件
- 新增 healthSlice,用于管理健康数据的 Redux 状态 - 在 Statistics 组件中整合健康数据获取逻辑,优化数据展示 - 更新 NutritionRadarCard 组件,调整卡路里计算区域,提升用户体验 - 移除不必要的状态管理,简化组件逻辑 - 优化代码结构,提升可读性和维护性
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user