Files
Rs_blog_front/src/lib/auth-context.tsx
2026-02-11 19:46:38 +08:00

77 lines
1.8 KiB
TypeScript

"use client";
import {
createContext,
useContext,
useState,
useEffect,
useCallback,
type ReactNode,
} from "react";
import { api } from "./api";
import type { User, LoginRequest, RegisterRequest } from "@/types/api";
interface AuthContextType {
user: User | null;
loading: boolean;
login: (data: LoginRequest) => Promise<void>;
register: (data: RegisterRequest) => Promise<void>;
logout: () => void;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const token = api.getToken();
if (token) {
// Token exists, user is authenticated
// In a real app, you might validate the token or fetch user data
setUser({ id: "", email: "" });
}
setLoading(false);
}, []);
const login = useCallback(async (data: LoginRequest) => {
const response = await api.login(data);
setUser(response.user);
}, []);
const register = useCallback(async (data: RegisterRequest) => {
const response = await api.register(data);
setUser(response.user);
}, []);
const logout = useCallback(() => {
api.logout();
setUser(null);
}, []);
return (
<AuthContext.Provider
value={{
user,
loading,
login,
register,
logout,
isAuthenticated: !!user || !!api.getToken(),
}}
>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error("useAuth must be used within an AuthProvider");
}
return context;
}