import apiClient from "@/services/api"; import { signal, Signal } from "@preact/signals"; import { createContext, JSX } from "preact"; import { useContext, useEffect } from "preact/hooks"; interface UserData { id: number; username: string; email: string; } interface AuthStatusResponse { isAuthenticated: boolean; user?: UserData; } interface AppContextValue { isLoggedIn: Signal; isCheckingAuth: Signal; currentUser: Signal; checkAuth: () => Promise; } const initialLoggedIn = localStorage.getItem("loggedIn") === "true"; const AppContext = createContext(null); const AppProvider = ({ children }: { children: JSX.Element }) => { const isLoggedIn = signal(initialLoggedIn); const isCheckingAuth = signal(true); const currentUser = signal(null); const checkAuth = async () => { console.log("Checking auth status..."); isCheckingAuth.value = true; try { const response = await apiClient("/api/auth/status/", { method: "GET", needsCsrf: false, }); if (response.isAuthenticated && response.user) { console.log("User is authenticated:", response.user.username); isLoggedIn.value = true; currentUser.value = response.user; localStorage.setItem("loggedIn", "true"); } else { console.log("User is not authenticated."); isLoggedIn.value = false; currentUser.value = null; localStorage.removeItem("loggedIn"); } } catch (error: any) { console.error("Auth check failed:", error.message); isLoggedIn.value = false; currentUser.value = null; localStorage.removeItem("loggedIn"); } finally { isCheckingAuth.value = false; console.log("Auth check finished. isLoggedIn:", isLoggedIn.value); } }; useEffect(() => { checkAuth(); }, []); const value: AppContextValue = { isLoggedIn, isCheckingAuth, currentUser, checkAuth, }; return {children}; }; const useAppContext = () => { const context = useContext(AppContext); if (!context) { throw new Error("useAppContext must be used within AppProvider"); } return context; }; export { AppProvider, useAppContext }; export type { UserData };