diff --git a/src/components/inbox/conversation-list.tsx b/src/components/inbox/conversation-list.tsx index 76c6ee6..c13e137 100644 --- a/src/components/inbox/conversation-list.tsx +++ b/src/components/inbox/conversation-list.tsx @@ -54,7 +54,13 @@ export function ConversationList({ .order("last_message_at", { ascending: false }); if (error) { - console.error("Failed to fetch conversations:", error); + // Supabase errors have non-enumerable properties — log fields explicitly + console.error("Failed to fetch conversations:", { + message: error.message, + details: error.details, + hint: error.hint, + code: error.code, + }); setLoading(false); return; } diff --git a/src/lib/supabase/client.ts b/src/lib/supabase/client.ts index 792b457..f381eb7 100644 --- a/src/lib/supabase/client.ts +++ b/src/lib/supabase/client.ts @@ -1,8 +1,18 @@ import { createBrowserClient } from '@supabase/ssr' +import type { SupabaseClient } from '@supabase/supabase-js' + +// Singleton instance — one client shared across the whole browser session. +// Creating multiple clients causes auth-lock contention ("Lock was released +// because another request stole it") and intermittent fetch failures. +let browserClient: SupabaseClient | undefined export function createClient() { - return createBrowserClient( + if (browserClient) return browserClient + + browserClient = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ) + + return browserClient }