diff --git a/client/mobile/mobile_app.tsx b/client/mobile/mobile_app.tsx index 8430e30..8f3b4ce 100644 --- a/client/mobile/mobile_app.tsx +++ b/client/mobile/mobile_app.tsx @@ -191,72 +191,7 @@ const ErrorPage = () => { ); }; -// 添加个人页面组件 -const ProfilePage = () => { - const { logout, user } = useAuth(); - const navigate = useNavigate(); - - const handleLogout = async () => { - if (confirm('确定要退出登录吗?')) { - await logout(); - navigate('/mobile/login'); - } - }; - - return ( -
-

我的

-
-
-
- {user?.avatar ? ( - {user?.nickname - ) : ( - 用户 - )} -
-
-

{user?.nickname || user?.username || '未登录用户'}

-

个人信息

-
-
-
-
-
- 设置 -
-
-
- 账号安全 - -
-
- 通知设置 - -
-
- 隐私 - -
-
- 关于 - -
-
-
- -
- ); -}; +import ProfilePage from './pages_profile.tsx' // 移动端布局组件 - 包含底部导航 const MobileLayout = () => { diff --git a/client/mobile/pages_profile.tsx b/client/mobile/pages_profile.tsx index 6fc9456..0ed74c4 100644 --- a/client/mobile/pages_profile.tsx +++ b/client/mobile/pages_profile.tsx @@ -1,63 +1,114 @@ import React from 'react' import { useNavigate } from 'react-router' import { useForm } from 'react-hook-form' +import { useQuery, useMutation } from '@tanstack/react-query' import { UserAPI } from './api.ts' import type { User } from '../share/types.ts' +import { useAuth } from './hooks.tsx' export default function ProfilePage() { const navigate = useNavigate() - const { register, handleSubmit, formState: { errors }, setValue } = useForm & { password?: string }>() - const [loading, setLoading] = React.useState(false) - const [user, setUser] = React.useState(null) + const { register, handleSubmit, formState: { errors }, setValue } = useForm<{ + username: string + nickname: string + email: string + phone?: string + password?: string + }>() // 获取当前用户信息 - React.useEffect(() => { - const fetchUser = async () => { - try { - const res = await UserAPI.getUsers({ limit: 1 }) - if (res.data?.length > 0) { - const userData = res.data[0] - setUser(userData) - setValue('username', userData.username) - setValue('nickname', userData.nickname) - setValue('email', userData.email) - setValue('phone', userData.phone) - } - } catch (error) { - console.error('获取用户信息失败:', error) + const { data: user } = useQuery({ + queryKey: ['currentUser'], + queryFn: async () => { + const res = await UserAPI.getUsers({ limit: 1 }) + if (res.data?.length > 0) { + const userData = res.data[0] + setValue('username', userData.username) + setValue('nickname', userData.nickname || '') + setValue('email', userData.email || '') + setValue('phone', userData.phone || '') + return userData } + return null } - fetchUser() - }, [setValue]) + }) - // 提交表单更新用户信息 - const onSubmit = async (data: User) => { - try { - setLoading(true) - if (!user?.id) return - - const updatedUser = await UserAPI.updateUser(user.id, { - nickname: data.nickname, - email: data.email, - phone: data.phone, - ...(data.password ? { password: data.password } : {}) - }) - - setUser(updatedUser.data) - alert('更新成功') - } catch (error) { - console.error('更新失败:', error) - alert('更新失败') - } finally { - setLoading(false) + + // 更新用户信息 + const { mutate: updateUser, isPending } = useMutation({ + mutationFn: async (data: { + nickname: string + email: string + phone?: string + password?: string + }) => { + if (!user?.id) throw new Error('用户ID不存在') + return UserAPI.updateUser(user.id, { + nickname: data.nickname, + email: data.email, + phone: data.phone, + ...(data.password ? { password: data.password } : {}) + }) + }, + onSuccess: (updatedUser) => { + alert('更新成功') + }, + onError: (error) => { + console.error('更新失败:', error) + alert('更新失败') + } + }) + + const onSubmit = (data: { + username: string + nickname: string + email: string + phone?: string + password?: string + }) => { + updateUser({ + nickname: data.nickname, + email: data.email, + phone: data.phone, + password: data.password + }) + } + + const { logout } = useAuth() + + const handleLogout = async () => { + if (confirm('确定要退出登录吗?')) { + await logout() + navigate('/mobile/login') } } return ( -
-

个人信息

+
+

我的

+
+
+
+ {user?.avatar ? ( + {user?.nickname + ) : ( + 用户 + )} +
+
+

{user?.nickname || user?.username || '未登录用户'}

+

个人信息

+
+
+
-
+
+

编辑信息

+
+
+ +
+
+ 设置 +
+
+
+ 账号安全 + +
+
+ 通知设置 + +
+
+ 隐私 + +
+
+ 关于 + +
+
+
+ +
) } \ No newline at end of file