import { createContext, ReactNode, useContext, useEffect, useState, } from "react"; import { currentUser, logout, User } from "./api"; import { Login } from "./Login"; import Header from "./Header"; export interface SessionProviderProps { children: ReactNode; } export interface Session { user: User | null; onLogout: () => void; } const sessionContext = createContext({ user: null, onLogout: () => {}, }); export function SessionProvider(props: SessionProviderProps) { const { children } = props; const [user, setUser] = useState(null); const [err, setErr] = useState(null); const [loading, setLoading] = useState(false); function loadUser() { setLoading(true); currentUser() .then((user) => { setUser(user); setErr(null); }) .catch((err) => { setUser(null); setErr(err); }) .finally(() => setLoading(false)); } useEffect(() => { loadUser(); }, []); function onLogin(user: User) { setUser(user); setErr(null); } async function onLogout() { try { logout(); setUser(null); setErr({ message: "Logged out successfully" }); console.log("logged out."); } catch (e) { console.error(e); setErr(e); } } console.log("sanity", user); let content: ReactNode; if (loading || (!err && !user)) content = ( <>
); else if (err) { content = ; } else content = ( {children} ); return content; } export function useSession() { return useContext(sessionContext); }