File size: 2,030 Bytes
7f6dd09 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import { createContext, useContext, useState, useEffect } from "react";
import { login, logout, signup } from "../api/client.js";
const AuthContext = createContext(null);
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
// Load user from localStorage on mount
useEffect(() => {
const storedUser = localStorage.getItem("intelli_user");
if (storedUser) {
try {
setUser(JSON.parse(storedUser));
} catch (e) {
localStorage.removeItem("intelli_user");
}
}
setLoading(false);
}, []);
const handleLogin = async (email, password) => {
const data = await login(email, password);
const userData = { email: data.user.email, id: data.user.id };
setUser(userData);
localStorage.setItem("intelli_user", JSON.stringify(userData));
// Optional: store token if passing via headers later
if (data.session?.access_token) {
localStorage.setItem("intelli_token", data.session.access_token);
}
};
const handleSignup = async (email, password) => {
const data = await signup(email, password);
const userData = { email: data.user.email, id: data.user.id };
setUser(userData);
localStorage.setItem("intelli_user", JSON.stringify(userData));
if (data.session?.access_token) {
localStorage.setItem("intelli_token", data.session.access_token);
}
};
const handleLogout = async () => {
try {
await logout();
} catch (e) {
console.error("Logout API error", e);
}
setUser(null);
localStorage.removeItem("intelli_user");
localStorage.removeItem("intelli_token");
};
return (
<AuthContext.Provider value={{ user, loading, login: handleLogin, signup: handleSignup, logout: handleLogout }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) throw new Error("useAuth must be used within AuthProvider");
return ctx;
}
|