blob: 01f500d98bbdc2e709256373bd39b628b6215a91 [file] [log] [blame]
Krishya75e43c02025-04-05 21:16:30 +08001import React, { createContext, useContext, useState, useEffect } from 'react';
2
22301009df48f962025-06-05 13:40:44 +08003const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';
4
Krishya8f2fec82025-06-04 21:54:46 +08005export const UserContext = createContext();
Krishya75e43c02025-04-05 21:16:30 +08006
7export const UserProvider = ({ children }) => {
8 const [user, setUser] = useState(null);
9 const [loading, setLoading] = useState(true);
10
22301009df48f962025-06-05 13:40:44 +080011 // ✅ 标准化用户数据结构
12 const formatUser = (raw) => {
13 if (!raw) return null;
14 return {
15 userId: raw.userId || raw.id || null,
16 username: raw.username || '匿名用户',
17 avatarUrl: raw.avatarUrl ? `${avatarBaseUrl}${raw.avatarUrl}` : null,
18 ...raw, // 保留其它字段(如 email, level 等)
19 };
20 };
21
Krishya75e43c02025-04-05 21:16:30 +080022 useEffect(() => {
23 const storedUser = localStorage.getItem('user');
24 if (storedUser) {
22301009df48f962025-06-05 13:40:44 +080025 try {
26 const parsed = JSON.parse(storedUser);
27 setUser(formatUser(parsed));
28 } catch (err) {
29 console.error('本地用户信息解析失败:', err);
30 localStorage.removeItem('user');
31 setUser(null);
32 }
2230100937ebec12025-06-03 21:17:04 +080033 } else {
34 // 设置默认用户
22301009df48f962025-06-05 13:40:44 +080035 const defaultUser = {
36 userId: 1,
37 username: '测试用户',
38 avatarUrl: null,
39 };
2230100937ebec12025-06-03 21:17:04 +080040 localStorage.setItem('user', JSON.stringify(defaultUser));
22301009df48f962025-06-05 13:40:44 +080041 setUser(formatUser(defaultUser));
Krishya75e43c02025-04-05 21:16:30 +080042 }
43 setLoading(false);
44 }, []);
45
Krishya75e43c02025-04-05 21:16:30 +080046 const saveUser = (userData) => {
22301009df48f962025-06-05 13:40:44 +080047 if (userData && (userData.userId || userData.id)) {
48 const formatted = formatUser(userData);
49 localStorage.setItem('user', JSON.stringify(userData)); // 原始数据存储
50 setUser(formatted); // 格式化后使用
Krishya8f2fec82025-06-04 21:54:46 +080051 } else {
52 console.error('无效的用户数据:', userData);
53 }
Krishya75e43c02025-04-05 21:16:30 +080054 };
55
Krishya75e43c02025-04-05 21:16:30 +080056 const logout = () => {
57 localStorage.removeItem('user');
58 setUser(null);
59 };
60
61 return (
Krishya8f2fec82025-06-04 21:54:46 +080062 <UserContext.Provider value={{ user, saveUser, logout, loading }}>
Krishya75e43c02025-04-05 21:16:30 +080063 {children}
64 </UserContext.Provider>
65 );
66};
67
Krishya8f2fec82025-06-04 21:54:46 +080068export const useUser = () => {
69 const context = useContext(UserContext);
70 if (!context) {
71 throw new Error('useUser must be used within a UserProvider');
72 }
73 return context;
22301009df48f962025-06-05 13:40:44 +080074};