feat: 集成 Redux 状态管理和用户目标管理功能
- 添加 Redux 状态管理,支持用户登录和个人信息的持久化 - 新增目标管理页面,允许用户设置每日卡路里和步数目标 - 更新首页,移除旧的活动展示,改为固定的热点功能卡片 - 修改布局以适应新功能的展示和交互 - 更新依赖,添加 @reduxjs/toolkit 和 react-redux 库以支持状态管理 - 新增 API 服务模块,处理与后端的交互
This commit is contained in:
@@ -1,23 +1,15 @@
|
||||
import { Colors } from '@/constants/Colors';
|
||||
import { getTabBarBottomPadding } from '@/constants/TabBar';
|
||||
import { useAppSelector } from '@/hooks/redux';
|
||||
import { useColorScheme } from '@/hooks/useColorScheme';
|
||||
import { Ionicons } from '@expo/vector-icons';
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { useBottomTabBarHeight } from '@react-navigation/bottom-tabs';
|
||||
import { useFocusEffect } from '@react-navigation/native';
|
||||
import type { Href } from 'expo-router';
|
||||
import { router } from 'expo-router';
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import {
|
||||
Alert,
|
||||
SafeAreaView,
|
||||
ScrollView,
|
||||
StatusBar,
|
||||
StyleSheet,
|
||||
Switch,
|
||||
Text,
|
||||
TouchableOpacity,
|
||||
View
|
||||
} from 'react-native';
|
||||
import { Alert, SafeAreaView, ScrollView, StatusBar, StyleSheet, Switch, Text, TouchableOpacity, View } from 'react-native';
|
||||
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
||||
|
||||
export default function PersonalScreen() {
|
||||
@@ -41,6 +33,7 @@ export default function PersonalScreen() {
|
||||
avatarUri?: string | null;
|
||||
};
|
||||
|
||||
const userProfileFromRedux = useAppSelector((s) => s.user.profile);
|
||||
const [profile, setProfile] = useState<UserProfile>({});
|
||||
|
||||
const load = async () => {
|
||||
@@ -73,6 +66,11 @@ export default function PersonalScreen() {
|
||||
|
||||
useEffect(() => { load(); }, []);
|
||||
useFocusEffect(React.useCallback(() => { load(); return () => { }; }, []));
|
||||
useEffect(() => {
|
||||
if (userProfileFromRedux) {
|
||||
setProfile(userProfileFromRedux);
|
||||
}
|
||||
}, [userProfileFromRedux]);
|
||||
|
||||
const formatHeight = () => {
|
||||
if (profile.heightCm == null) return '--';
|
||||
@@ -234,23 +232,11 @@ export default function PersonalScreen() {
|
||||
|
||||
const accountItems = [
|
||||
{
|
||||
icon: 'person-outline',
|
||||
icon: 'flag-outline',
|
||||
iconBg: '#E8F5E8',
|
||||
iconColor: '#4ADE80',
|
||||
title: '个人资料',
|
||||
onPress: () => router.push('/profile/edit'),
|
||||
},
|
||||
{
|
||||
icon: 'trophy-outline',
|
||||
iconBg: '#E8F5E8',
|
||||
iconColor: '#4ADE80',
|
||||
title: '成就',
|
||||
},
|
||||
{
|
||||
icon: 'time-outline',
|
||||
iconBg: '#E8F5E8',
|
||||
iconColor: '#4ADE80',
|
||||
title: '活动历史',
|
||||
title: '目标管理',
|
||||
onPress: () => router.push('/profile/goals' as Href),
|
||||
},
|
||||
{
|
||||
icon: 'stats-chart-outline',
|
||||
@@ -265,7 +251,7 @@ export default function PersonalScreen() {
|
||||
icon: 'notifications-outline',
|
||||
iconBg: '#E8F5E8',
|
||||
iconColor: '#4ADE80',
|
||||
title: '弹窗通知',
|
||||
title: '消息推送',
|
||||
type: 'switch',
|
||||
},
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user