blob: c8c65e8b2cf585683732bd0025859b64a0f0b1bc [file] [log] [blame]
Krishya6bf199c2025-06-06 21:14:23 +08001
Krishya75e43c02025-04-05 21:16:30 +08002import React, { createContext, useContext, useState, useEffect } from 'react';
3
22301009df48f962025-06-05 13:40:44 +08004const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';
5
Krishya8f2fec82025-06-04 21:54:46 +08006export const UserContext = createContext();
Krishya75e43c02025-04-05 21:16:30 +08007
8export const UserProvider = ({ children }) => {
9 const [user, setUser] = useState(null);
10 const [loading, setLoading] = useState(true);
11
22301009df48f962025-06-05 13:40:44 +080012 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,
Krishya6bf199c2025-06-06 21:14:23 +080018 ...raw,
22301009df48f962025-06-05 13:40:44 +080019 };
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 {
Krishya6bf199c2025-06-06 21:14:23 +080034 // 可以默认不自动登录,退出就是空
35 setUser(null);
Krishya75e43c02025-04-05 21:16:30 +080036 }
37 setLoading(false);
38 }, []);
39
Krishya75e43c02025-04-05 21:16:30 +080040 const saveUser = (userData) => {
22301009df48f962025-06-05 13:40:44 +080041 if (userData && (userData.userId || userData.id)) {
Krishya6bf199c2025-06-06 21:14:23 +080042 localStorage.setItem('user', JSON.stringify(userData));
43 setUser(formatUser(userData));
Krishya8f2fec82025-06-04 21:54:46 +080044 } else {
45 console.error('无效的用户数据:', userData);
46 }
Krishya75e43c02025-04-05 21:16:30 +080047 };
48
Krishya75e43c02025-04-05 21:16:30 +080049 const logout = () => {
50 localStorage.removeItem('user');
51 setUser(null);
52 };
53
54 return (
Krishya8f2fec82025-06-04 21:54:46 +080055 <UserContext.Provider value={{ user, saveUser, logout, loading }}>
Krishya75e43c02025-04-05 21:16:30 +080056 {children}
57 </UserContext.Provider>
58 );
59};
60
Krishya8f2fec82025-06-04 21:54:46 +080061export const useUser = () => {
62 const context = useContext(UserContext);
63 if (!context) {
Krishya6bf199c2025-06-06 21:14:23 +080064 throw new Error('useUser 必须在 UserProvider 内使用');
Krishya8f2fec82025-06-04 21:54:46 +080065 }
66 return context;
22301009df48f962025-06-05 13:40:44 +080067};