blob: 7b75005e02a8f07924cb50485759308fcb568ec3 [file] [log] [blame]
Krishya6bf199c2025-06-06 21:14:23 +08001// import React, { createContext, useContext, useState, useEffect } from 'react';
2
3// const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';
4
5// export const UserContext = createContext();
6
7// export const UserProvider = ({ children }) => {
8// const [user, setUser] = useState(null);
9// const [loading, setLoading] = useState(true);
10
11// // ✅ 标准化用户数据结构
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
22// useEffect(() => {
23// const storedUser = localStorage.getItem('user');
24// if (storedUser) {
25// 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// }
33// } else {
34// // 设置默认用户
35// const defaultUser = {
36// userId: 1,
37// username: '测试用户',
38// avatarUrl: null,
39// };
40// localStorage.setItem('user', JSON.stringify(defaultUser));
41// setUser(formatUser(defaultUser));
42// }
43// setLoading(false);
44// }, []);
45
46// const saveUser = (userData) => {
47// if (userData && (userData.userId || userData.id)) {
48// const formatted = formatUser(userData);
49// localStorage.setItem('user', JSON.stringify(userData)); // 原始数据存储
50// setUser(formatted); // 格式化后使用
51// } else {
52// console.error('无效的用户数据:', userData);
53// }
54// };
55
56// const logout = () => {
57// localStorage.removeItem('user');
58// setUser(null);
59// };
60
61// return (
62// <UserContext.Provider value={{ user, saveUser, logout, loading }}>
63// {children}
64// </UserContext.Provider>
65// );
66// };
67
68// export 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;
74// };
75
76
Krishya75e43c02025-04-05 21:16:30 +080077import React, { createContext, useContext, useState, useEffect } from 'react';
78
22301009df48f962025-06-05 13:40:44 +080079const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';
80
Krishya8f2fec82025-06-04 21:54:46 +080081export const UserContext = createContext();
Krishya75e43c02025-04-05 21:16:30 +080082
83export const UserProvider = ({ children }) => {
84 const [user, setUser] = useState(null);
85 const [loading, setLoading] = useState(true);
86
22301009df48f962025-06-05 13:40:44 +080087 const formatUser = (raw) => {
88 if (!raw) return null;
89 return {
90 userId: raw.userId || raw.id || null,
91 username: raw.username || '匿名用户',
92 avatarUrl: raw.avatarUrl ? `${avatarBaseUrl}${raw.avatarUrl}` : null,
Krishya6bf199c2025-06-06 21:14:23 +080093 ...raw,
22301009df48f962025-06-05 13:40:44 +080094 };
95 };
96
Krishya75e43c02025-04-05 21:16:30 +080097 useEffect(() => {
98 const storedUser = localStorage.getItem('user');
99 if (storedUser) {
22301009df48f962025-06-05 13:40:44 +0800100 try {
101 const parsed = JSON.parse(storedUser);
102 setUser(formatUser(parsed));
103 } catch (err) {
104 console.error('本地用户信息解析失败:', err);
105 localStorage.removeItem('user');
106 setUser(null);
107 }
2230100937ebec12025-06-03 21:17:04 +0800108 } else {
Krishya6bf199c2025-06-06 21:14:23 +0800109 // 可以默认不自动登录,退出就是空
110 setUser(null);
Krishya75e43c02025-04-05 21:16:30 +0800111 }
112 setLoading(false);
113 }, []);
114
Krishya75e43c02025-04-05 21:16:30 +0800115 const saveUser = (userData) => {
22301009df48f962025-06-05 13:40:44 +0800116 if (userData && (userData.userId || userData.id)) {
Krishya6bf199c2025-06-06 21:14:23 +0800117 localStorage.setItem('user', JSON.stringify(userData));
118 setUser(formatUser(userData));
Krishya8f2fec82025-06-04 21:54:46 +0800119 } else {
120 console.error('无效的用户数据:', userData);
121 }
Krishya75e43c02025-04-05 21:16:30 +0800122 };
123
Krishya75e43c02025-04-05 21:16:30 +0800124 const logout = () => {
125 localStorage.removeItem('user');
126 setUser(null);
127 };
128
129 return (
Krishya8f2fec82025-06-04 21:54:46 +0800130 <UserContext.Provider value={{ user, saveUser, logout, loading }}>
Krishya75e43c02025-04-05 21:16:30 +0800131 {children}
132 </UserContext.Provider>
133 );
134};
135
Krishya8f2fec82025-06-04 21:54:46 +0800136export const useUser = () => {
137 const context = useContext(UserContext);
138 if (!context) {
Krishya6bf199c2025-06-06 21:14:23 +0800139 throw new Error('useUser 必须在 UserProvider 内使用');
Krishya8f2fec82025-06-04 21:54:46 +0800140 }
141 return context;
22301009df48f962025-06-05 13:40:44 +0800142};