Considere isso em todo prompt, mesmo se eu esquecer de mencionar, isso deve ser implicito e subentendido em todo prompt: 1) Eu sempre peço pra INCREMENTAR novas telas ou features ou lógica.
NUNCA altere nem remova funcionalidades que já estavam funcionando anteriormente (passado), como features, elementos visuais, UX ou UI ou Design que já está funcionando anteriormente. 3) A não ser que eu peça pra você remover ou alterar explicitamente no meu prompt. 3) Em caso de ambiguidade onde uma interpretação levaria à remoção de uma funcionalidade existente, você deve priorizar a manutenção da funcionalidade e pedir uma clarificação e minha aprovação antes, perguntando por exemplo: "Você mencionou que o botão X deve 'sair' da tela de login. Isso significa que devo removê-lo, o que impediria o acesso como convidado, ou você se refere à sua ação de levar para a tela Inicial?"
Prompt:
mesmo erro no console continua.
no preview os botoes X e entrar como convidado tentar ir pra home e depois voltam pra tela de login. 3. no site ao vivo esses dois botoes nao fazem nada.
chatGPT:
Respostas objetivas
Console – “Multiple GoTrueClient instances detected …”
Causa verificada: você está chamando createBrowserSupabaseClient (ou createClient) mais de uma vez no ambiente do navegador; cada chamada grava no mesmo localStorage (chave supabase.auth.token) e o runtime emite o alerta (certo)
.
Correção (altamente provável): transformar o client em singleton e importar sempre a mesma função.
lib/supabase/client.ts
import { createBrowserSupabaseClient } from '@supabase/ssr'
import { SupabaseClient } from '@supabase/supabase-js'
let client: SupabaseClient | undefined
export function getSupabaseBrowser(): SupabaseClient {
if (!client) client = createBrowserSupabaseClient()
return client
}
Ajuste em componentes:
const supabase = getSupabaseBrowser()
Remova chamadas diretas a createBrowserSupabaseClient ou múltiplos <SessionContextProvider>.
Preview – botões “X” e “Entrar como convidado” vão a /home e voltam para /login
Sintoma indica que o middleware detecta ausência de sessão após o redirecionamento e força retorno (certo).
• Para o botão “X”: ele deve apenas esconder o modal; se você usa router.push('/home') sem sessão, o middleware bloqueia. Alterar para router.back() ou fechar modal no estado local (altamente provável).
• Para “convidado” use autenticação anônima, que grava sessão válida:
const supabase = getSupabaseBrowser()
const { error } = await supabase.auth.signInAnonymously()
if (!error) router.replace('/home')
(certo)
.
• Middleware deve aceitar /home só quando session existe:
if (!session && req.nextUrl.pathname.startsWith('/home')) {
return NextResponse.redirect(new URL('/login', req.url))
}
Site ao vivo – botões não respondem
Diferente do preview, aqui o evento onClick sequer dispara (altamente provável). Verifique:
• Build de produção removeu o handler por tree-shaking se o componente não é client-marked ('use client').
• Variáveis de ambiente de produção (NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY) ausentes; sem client válido, promessa rejeita silenciosamente (provável).
• Hydration mismatch: botão é <a href="/home"> sem preventDefault; navegador faz navegação completa, middleware redireciona e parece “não fazer nada”. Transforme em <button> ou chame e.preventDefault() (provável).
Teste via DevTools → Network: clique no botão e veja se dispara requisição JS ou navegação de página.
Checklist de verificação antes de novo deploy
pnpm install
pnpm build
pnpm start
– console sem o aviso GoTrue;
– clique em “convidado” cria cookie sb-access-token e URL final /home;
– botão “X” apenas fecha modal;
– git push → Vercel.