'use client'; import React, { createContext, useState, useContext, ReactNode, useEffect } from 'react'; import { User } from '@supabase/supabase-js'; import { supabase } from '@/utils/supabase'; interface AuthContextType { token: string | null; user: User | null; login: (token: string, user: User) => void; logout: () => void; } const AuthContext = createContext(undefined); export const AuthProvider = ({ children }: { children: ReactNode }) => { const [token, setToken] = useState(() => { if (typeof window !== 'undefined') { return localStorage.getItem('token'); } return null; }); const [user, setUser] = useState(() => { if (typeof window !== 'undefined') { const userJson = localStorage.getItem('user'); return userJson ? JSON.parse(userJson) : null; } return null; }); useEffect(() => { const fetchSession = async () => { const { data: { session }, } = await supabase.auth.getSession(); if (session) { const { access_token, user } = session; setToken(access_token); setUser(user); localStorage.setItem('token', access_token); localStorage.setItem('user', JSON.stringify(user)); } else { localStorage.removeItem('token'); localStorage.removeItem('user'); setToken(null); setUser(null); } }; console.log('Fetching session'); fetchSession(); }, [token]); const login = (newToken: string, newUser: User) => { console.log('Logging in'); setToken(newToken); setUser(newUser); localStorage.setItem('token', newToken); localStorage.setItem('user', JSON.stringify(newUser)); }; const logout = async () => { console.log('Logging out'); await supabase.auth.refreshSession(); await supabase.auth.signOut(); localStorage.removeItem('token'); localStorage.removeItem('user'); setToken(null); setUser(null); }; return ( {children} ); }; export const useAuth = (): AuthContextType => { const context = useContext(AuthContext); if (!context) throw new Error('useAuth must be used within AuthProvider'); return context; };