import { createClient, SupabaseClient } from '@supabase/supabase-js' import type { Database } from '~/types/database.types' let supabaseInstance: SupabaseClient | null = null export const useSupabase = () => { const config = useRuntimeConfig() if (!supabaseInstance) { supabaseInstance = createClient( config.public.supabaseUrl, config.public.supabaseAnonKey, { auth: { persistSession: true, autoRefreshToken: true, detectSessionInUrl: true, storage: process.client ? window.localStorage : undefined } } ) } return supabaseInstance } /** * Composable for Supabase authentication */ export const useSupabaseAuth = () => { const supabase = useSupabase() const user = useState('supabase_user', () => null as any) const session = useState('supabase_session', () => null as any) // Initialize auth state const initAuth = async () => { const { data: { session: currentSession } } = await supabase.auth.getSession() session.value = currentSession user.value = currentSession?.user || null // Listen for auth changes supabase.auth.onAuthStateChange((_event, newSession) => { session.value = newSession user.value = newSession?.user || null }) } // Call initAuth on composable mount if (process.client) { initAuth() } const signIn = async (email: string, password: string) => { const { data, error } = await supabase.auth.signInWithPassword({ email, password }) return { data, error } } const signUp = async (email: string, password: string) => { const { data, error } = await supabase.auth.signUp({ email, password }) return { data, error } } const signOut = async () => { const { error } = await supabase.auth.signOut() return { error } } return { user: readonly(user), session: readonly(session), signIn, signUp, signOut } }