feat: 更新多个组件以优化用户体验和功能
- 在 CoachScreen 中移除不必要的 router 引入,简化代码结构 - 在 PersonalScreen 中移除未使用的 colorScheme 引入,优化组件性能 - 更新 NutritionRadarCard 组件,新增卡路里计算功能,提升营养数据展示 - 修改 Statistics 组件,调整样式以增强视觉效果 - 移除 iOS 项目中的多余健康数据权限设置,简化配置
This commit is contained in:
@@ -2,7 +2,7 @@ import { Ionicons } from '@expo/vector-icons';
|
||||
import { BlurView } from 'expo-blur';
|
||||
import * as Haptics from 'expo-haptics';
|
||||
import * as ImagePicker from 'expo-image-picker';
|
||||
import { useLocalSearchParams, useRouter } from 'expo-router';
|
||||
import { useLocalSearchParams } from 'expo-router';
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import {
|
||||
ActivityIndicator,
|
||||
@@ -115,10 +115,8 @@ const CardType = {
|
||||
|
||||
type CardType = typeof CardType[keyof typeof CardType];
|
||||
|
||||
// const COACH_AVATAR = require('@/assets/images/logo.png');
|
||||
|
||||
export default function CoachScreen() {
|
||||
const router = useRouter();
|
||||
const params = useLocalSearchParams<{ name?: string }>();
|
||||
const insets = useSafeAreaInsets();
|
||||
|
||||
@@ -290,10 +288,10 @@ export default function CoachScreen() {
|
||||
if (Platform.OS === 'ios') {
|
||||
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
||||
}
|
||||
router.push('/mood/calendar');
|
||||
pushIfAuthedElseLogin('/mood/calendar');
|
||||
}
|
||||
},
|
||||
], [router, planDraft, checkin]);
|
||||
], [planDraft, checkin]);
|
||||
|
||||
const scrollToEnd = useCallback(() => {
|
||||
requestAnimationFrame(() => {
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import ActivityHeatMap from '@/components/ActivityHeatMap';
|
||||
import { PRIVACY_POLICY_URL, USER_AGREEMENT_URL } from '@/constants/Agree';
|
||||
import { Colors } from '@/constants/Colors';
|
||||
import { getTabBarBottomPadding } from '@/constants/TabBar';
|
||||
import { useAppDispatch, useAppSelector } from '@/hooks/redux';
|
||||
import { useAuthGuard } from '@/hooks/useAuthGuard';
|
||||
import { useColorScheme } from '@/hooks/useColorScheme';
|
||||
import { useNotifications } from '@/hooks/useNotifications';
|
||||
import { DEFAULT_MEMBER_NAME, fetchActivityHistory, fetchMyProfile } from '@/store/userSlice';
|
||||
import { Ionicons } from '@expo/vector-icons';
|
||||
@@ -21,16 +19,14 @@ export default function PersonalScreen() {
|
||||
const { confirmLogout, confirmDeleteAccount, isLoggedIn, pushIfAuthedElseLogin } = useAuthGuard();
|
||||
const insets = useSafeAreaInsets();
|
||||
const tabBarHeight = useBottomTabBarHeight();
|
||||
const colorScheme = useColorScheme();
|
||||
|
||||
|
||||
// 推送通知相关
|
||||
const {
|
||||
isInitialized,
|
||||
permissionStatus,
|
||||
requestPermission,
|
||||
sendNotification,
|
||||
} = useNotifications();
|
||||
|
||||
|
||||
const [notificationEnabled, setNotificationEnabled] = useState(false);
|
||||
|
||||
// 计算底部间距
|
||||
@@ -38,9 +34,6 @@ export default function PersonalScreen() {
|
||||
return getTabBarBottomPadding(tabBarHeight) + (insets?.bottom ?? 0);
|
||||
}, [tabBarHeight, insets?.bottom]);
|
||||
|
||||
// 颜色主题
|
||||
const colors = Colors[colorScheme ?? 'light'];
|
||||
|
||||
// 直接使用 Redux 中的用户信息,避免重复状态管理
|
||||
const userProfile = useAppSelector((state) => state.user.profile);
|
||||
|
||||
@@ -116,9 +109,9 @@ export default function PersonalScreen() {
|
||||
<View style={styles.cardContainer}>
|
||||
<View style={styles.userInfoContainer}>
|
||||
<View style={styles.avatarContainer}>
|
||||
<Image
|
||||
source={{ uri: userProfile.avatar || DEFAULT_AVATAR_URL }}
|
||||
style={styles.avatar}
|
||||
<Image
|
||||
source={{ uri: userProfile.avatar || DEFAULT_AVATAR_URL }}
|
||||
style={styles.avatar}
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.userDetails}>
|
||||
@@ -183,7 +176,7 @@ export default function PersonalScreen() {
|
||||
{item.type === 'switch' ? (
|
||||
<Switch
|
||||
value={item.switchValue || false}
|
||||
onValueChange={item.onSwitchChange || (() => {})}
|
||||
onValueChange={item.onSwitchChange || (() => { })}
|
||||
trackColor={{ false: '#E5E5E5', true: '#9370DB' }}
|
||||
thumbColor="#FFFFFF"
|
||||
style={styles.switch}
|
||||
|
||||
@@ -352,6 +352,14 @@ export default function ExploreScreen() {
|
||||
{/* 营养摄入雷达图卡片 */}
|
||||
<NutritionRadarCard
|
||||
nutritionSummary={nutritionSummary}
|
||||
burnedCalories={basalMetabolism || 0}
|
||||
calorieDeficit={0}
|
||||
resetToken={animToken}
|
||||
onMealPress={(mealType: 'breakfast' | 'lunch' | 'dinner' | 'snack') => {
|
||||
console.log('选择餐次:', mealType);
|
||||
// 这里可以导航到营养记录页面
|
||||
pushIfAuthedElseLogin('/nutrition/records');
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* 真正瀑布流布局 */}
|
||||
@@ -720,13 +728,11 @@ const styles = StyleSheet.create({
|
||||
justifyContent: 'space-between',
|
||||
marginBottom: 16,
|
||||
},
|
||||
healthMetricsContainer: {
|
||||
marginBottom: 16,
|
||||
},
|
||||
masonryContainer: {
|
||||
marginBottom: 16,
|
||||
flexDirection: 'row',
|
||||
gap: 12,
|
||||
marginTop: 16,
|
||||
},
|
||||
masonryColumn: {
|
||||
flex: 1,
|
||||
|
||||
Reference in New Issue
Block a user