mirror of
https://github.com/snowykami/neo-blog.git
synced 2025-09-26 11:06:23 +00:00
feat: 实现用户认证上下文,重构相关组件以支持用户状态管理
This commit is contained in:
38
web/src/contexts/auth-context.tsx
Normal file
38
web/src/contexts/auth-context.tsx
Normal file
@ -0,0 +1,38 @@
|
||||
"use client";
|
||||
|
||||
import React, { createContext, useContext, useState, useMemo } from "react";
|
||||
import type { User } from "@/models/user";
|
||||
import { userLogout } from "@/api/user";
|
||||
|
||||
type AuthContextValue = {
|
||||
user: User | null;
|
||||
setUser: (u: User | null) => void;
|
||||
logout: () => void;
|
||||
};
|
||||
|
||||
const AuthContext = createContext<AuthContextValue | undefined>(undefined);
|
||||
|
||||
export function AuthProvider({
|
||||
children,
|
||||
initialUser = null,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
initialUser?: User | null;
|
||||
}) {
|
||||
const [user, setUser] = useState<User | null>(initialUser);
|
||||
|
||||
const logout = async () => {
|
||||
setUser(null);
|
||||
await userLogout();
|
||||
};
|
||||
const value = useMemo(() => ({ user, setUser, logout }), [user]);
|
||||
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
|
||||
}
|
||||
|
||||
export function useAuth() {
|
||||
const ctx = useContext(AuthContext);
|
||||
if (!ctx) {
|
||||
throw new Error("useAuth must be used within an AuthProvider");
|
||||
}
|
||||
return ctx;
|
||||
}
|
Reference in New Issue
Block a user