Files
lcbp3.np-dms.work/frontend/lib/auth.js

41 lines
1.0 KiB
JavaScript
Executable File

// frontend/lib/auth.js
'use client';
import { createContext, useContext, useEffect, useState, useCallback } from "react";
const AuthContext = createContext({
user: null,
isAuthenticated: false,
loading: true,
logout: () => {},
});
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch("/api/auth/me", { credentials: "include" })
.then((res) => (res.ok ? res.json() : null))
.then((data) => setUser(data?.user ?? null))
.finally(() => setLoading(false));
}, []);
const logout = useCallback(async () => {
try {
await fetch("/api/auth/logout", { method: "POST", credentials: "include" });
} finally {
window.location.href = "/login";
}
}, []);
return (
<AuthContext.Provider value={{ user, isAuthenticated: !!user, loading, logout }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
return useContext(AuthContext);
}