blob: 39ab6cde59d2d61eeb2c424ea35da8b5e7acc07c [file] [log] [blame]
Krishya75e43c02025-04-05 21:16:30 +08001import React, { createContext, useContext, useState, useEffect } from 'react';
2
Krishya8f2fec82025-06-04 21:54:46 +08003export const UserContext = createContext();
Krishya75e43c02025-04-05 21:16:30 +08004
5export const UserProvider = ({ children }) => {
6 const [user, setUser] = useState(null);
7 const [loading, setLoading] = useState(true);
8
Krishya75e43c02025-04-05 21:16:30 +08009 useEffect(() => {
10 const storedUser = localStorage.getItem('user');
11 if (storedUser) {
Krishya8f2fec82025-06-04 21:54:46 +080012 try {
13 const parsedUser = JSON.parse(storedUser);
14 // 验证用户对象是否有效
15 if (parsedUser && parsedUser.userId) {
16 setUser(parsedUser);
17 } else {
18 localStorage.removeItem('user');
19 }
20 } catch (error) {
21 console.error('解析用户信息失败:', error);
22 localStorage.removeItem('user');
23 }
Krishya75e43c02025-04-05 21:16:30 +080024 }
25 setLoading(false);
26 }, []);
27
Krishya75e43c02025-04-05 21:16:30 +080028 const saveUser = (userData) => {
Krishya8f2fec82025-06-04 21:54:46 +080029 if (userData && userData.id) {
30 localStorage.setItem('user', JSON.stringify(userData));
31 setUser(userData);
32 } else {
33 console.error('无效的用户数据:', userData);
34 }
Krishya75e43c02025-04-05 21:16:30 +080035 };
36
Krishya75e43c02025-04-05 21:16:30 +080037 const logout = () => {
38 localStorage.removeItem('user');
39 setUser(null);
40 };
41
42 return (
Krishya8f2fec82025-06-04 21:54:46 +080043 <UserContext.Provider value={{ user, saveUser, logout, loading }}>
Krishya75e43c02025-04-05 21:16:30 +080044 {children}
45 </UserContext.Provider>
46 );
47};
48
Krishya8f2fec82025-06-04 21:54:46 +080049export const useUser = () => {
50 const context = useContext(UserContext);
51 if (!context) {
52 throw new Error('useUser must be used within a UserProvider');
53 }
54 return context;
55};