'use client';
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
import ApiService from '@/utils/api';
|
|
interface User {
|
id: number;
|
username: string;
|
email: string;
|
// 根据实际用户信息结构添加其他字段
|
}
|
|
interface UserContextType {
|
user: User | null;
|
setUser: (user: User | null) => void;
|
isLoading: boolean;
|
logout: () => void;
|
}
|
|
const UserContext = createContext<UserContextType | undefined>(undefined);
|
|
export function UserProvider({ children }: { children: React.ReactNode }) {
|
const [user, setUser] = useState<User | null>(null);
|
const [isLoading, setIsLoading] = useState(true);
|
|
useEffect(() => {
|
const initializeUser = async () => {
|
const token = localStorage.getItem('token');
|
if (token) {
|
try {
|
const response = await ApiService.get<User>('/users/info');
|
if (response.code === 200) {
|
setUser(response.data);
|
}
|
} catch (error) {
|
console.error('Failed to fetch user info:', error);
|
localStorage.removeItem('token'); // 如果获取用户信息失败,清除token
|
}
|
}
|
setIsLoading(false);
|
};
|
|
initializeUser();
|
}, []);
|
|
const logout = () => {
|
setUser(null);
|
localStorage.removeItem('token');
|
};
|
|
return (
|
<UserContext.Provider value={{ user, setUser, isLoading, logout }}>
|
{children}
|
</UserContext.Provider>
|
);
|
}
|
|
export function useUser() {
|
const context = useContext(UserContext);
|
if (context === undefined) {
|
throw new Error('useUser must be used within a UserProvider');
|
}
|
return context;
|
}
|