import { supabase } from "@/lib/supabase";
import type { Session } from "@supabase/supabase-js";
import { type ReactNode, createContext, useContext, useEffect, useState } from "react";
type AuthState = {
session: Session | null;
loading: boolean;
signInWithEmail: (email: string) => Promise<{ error: Error | null }>;
signOut: () => Promise<void>;
};
const AuthContext = createContext<AuthState | null>(null);
export function AuthProvider({ children }: { children: ReactNode }) {
const [session, setSession] = useState<Session | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
if (!supabase) {
setLoading(false);
return;
}
supabase.auth.getSession().then(({ data }) => {
setSession(data.session);
setLoading(false);
});
const { data: sub } = supabase.auth.onAuthStateChange((_event, s) => {
setSession(s);
});
return () => sub.subscription.unsubscribe();
}, []);
const signInWithEmail = async (email: string) => {
if (!supabase) return { error: new Error("Supabase not configured") };
const { error } = await supabase.auth.signInWithOtp({
email,
options: { emailRedirectTo: window.location.origin },
});
return { error };
};
const signOut = async () => {
if (!supabase) return;
await supabase.auth.signOut();
};
return (
<AuthContext.Provider value={{ session, loading, signInWithEmail, signOut }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) throw new Error("useAuth must be used inside AuthProvider");
return ctx;
}