41 lines
1.0 KiB
JavaScript
Executable File
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);
|
|
} |