Files
kino-app/frontend/src/lib/auth.jsx
T
2026-04-29 14:49:07 +00:00

57 lines
1.5 KiB
React

import { createContext, useContext, useEffect, useState, useCallback } from "react";
import api from "./api";
const AuthCtx = createContext(null);
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const refresh = useCallback(async () => {
const token = localStorage.getItem("kino_token");
if (!token) {
setUser(null);
setLoading(false);
return;
}
try {
const { data } = await api.get("/auth/me");
setUser(data);
} catch {
localStorage.removeItem("kino_token");
setUser(null);
} finally {
setLoading(false);
}
}, []);
useEffect(() => { refresh(); }, [refresh]);
const login = async (email, password) => {
const { data } = await api.post("/auth/login", { email, password });
localStorage.setItem("kino_token", data.access_token);
setUser(data.user);
return data.user;
};
const register = async (email, password, name) => {
const { data } = await api.post("/auth/register", { email, password, name });
localStorage.setItem("kino_token", data.access_token);
setUser(data.user);
return data.user;
};
const logout = () => {
localStorage.removeItem("kino_token");
setUser(null);
};
return (
<AuthCtx.Provider value={{ user, loading, login, register, logout, refresh }}>
{children}
</AuthCtx.Provider>
);
};
export const useAuth = () => useContext(AuthCtx);