Identificamos e corrigimos o erro fatal do Onboarding que impedia o acesso ao Dashboard (loop infinito no Onboarding / tela branca). O SDK do Supabase estava causando deadlock na persistência da sessão.
- Problema: Ao fazer login via Google OAuth, a aplicação congelava (tela branca) tentando gravar a sessão localmente.
- Causa: Conflitos do
localStoragecom a API nativa do Supabase GoTrue SDK (navigator.locks). - Solução: Criada uma classe de Storage customizada em
supabaseClient.jsignorando os locks e forçando a leitura sÃncrona dolocalStorage.
- Problema: Ao escolher um slug no Onboarding, o usuário era devolvido para a própria tela de Onboarding, sem entrar no Dashboard.
- Causa: O salvamento forçava um Hard Reload (
window.location.href). O contexto do React reiniciava sem oslugmapeado devido à lentidão do Cold Start do Supabase para baixar o perfil, ativando a proteção de rota (ProtectedRoute). - Solução:
- Em
AuthContext.jsx, a leitura do perfil foi otimizada parafetchnativo (REST) bypassando o SDK travado. - O estado do usuário agora recebe Optimistic Updates (recebe o ID instantaneamente sem esperar o DB).
- Em
OnboardingPage.jsx, o uso donavigate('/dashboard', { replace: true })eupdateProfile()garantem que a memória do React seja atualizada e a rota alterada sem reload.
- Em
- Problema: A
FTP-Deploy-Actionfalhava repetidamente com erroTimeout (control socket). - Causa: O servidor do Hostinger rate-limita o FTP por excesso de conexões simultâneas quando ocorrem múltiplos pushes rápidos.
- Solução: Pushes foram espaçados para permitir a liberação das conexões TCP no firewall do Hostinger.
| Arquivo | Tipo | O que mudou |
|---|---|---|
apps/web/src/lib/supabaseClient.js |
FIX | Criado proxy Storage customizado |
apps/web/src/contexts/AuthContext.jsx |
FIX | Conversão de calls do DB para Fetch API nativo + Optimistic Update no onAuthStateChange |
apps/web/src/pages/OnboardingPage.jsx |
FIX | Remoção do window.location.href, adoção do updateProfile com redirecionamento React |
apps/web/src/pages/DashboardPage.jsx |
FIX | Transição das escritas e deleções de links do SDK para a Fetch API |
Sessão intensiva de debugging e estabilização da autenticação com Supabase e Google OAuth. Todas as fases do plano de implementação (1-5) foram concluÃdas com sucesso.
- Problema:
Invalid supabaseUrlao inicializar o cliente. - Solução: Criado arquivo
.envemapps/web/com as variáveisVITE_SUPABASE_URLeVITE_SUPABASE_ANON_KEY.
Múltiplas camadas de problemas foram identificadas e resolvidas em sequência:
| # | Problema | Causa Raiz | Solução |
|---|---|---|---|
| 1 | Erro flowName=GeneralOAuthFlow |
Client ID errado no Supabase (estava contate.site em vez do ID real) |
Colocado o Client ID completo do Google Cloud: 424695097438-...apps.googleusercontent.com |
| 2 | Loop infinito: login OK mas volta pra tela de login | redirectTo apontava para /dashboard (rota protegida) que redirecionava para /login antes do token ser processado |
Mudado redirectTo para /login + adicionado useEffect de redirect no LoginPage |
| 3 | Sessão não persistia após OAuth redirect | supabaseClient.js criado sem configurações de auth — detectSessionInUrl e flowType não estavam definidos |
Configurado explicitamente flowType: 'implicit', detectSessionInUrl: true, persistSession: true |
| 4 | Unable to exchange external code |
Chave secreta do Google OAuth estava desativada no Google Cloud Console | Usuário ativou a chave secreta e gerou uma nova no Google Cloud Console |
| 5 | Crash do React: Cannot destructure useAuth() |
HMR (Hot Module Reload) do Vite criava múltiplas instâncias do GoTrueClient, quebrando o AuthContext | Adicionado fallback seguro no useAuth() com valores default quando o contexto é null |
- Problema:
null value in column "slug" violates not-null constraintao salvar cor de fundo. - Causa: O
updateProfile()usavaupsertsem incluir oslugexistente. - Solução: O
updateProfileagora injeta automaticamentecurrentUser.slugno payload quando ausente.
- Problema:
Cannot coerce the result to a single JSON objectquando perfil não existia. - Solução: Trocado
.single()por.maybeSingle()em todas as queries de perfil.
- Sistema de autenticação completo (Magic Link + Google OAuth)
- Dashboard com gerenciamento de links (CRUD + Drag & Drop)
- Perfil público em
/:slug - Onboarding para escolha de slug
- SEO: Injeção dinâmica de
application/ld+json(SchemaPerson) viareact-helmet - Video Embed: Componente
VideoEmbed.jsxcom suporte a YouTube, TikTok e Vimeo (lazy-loading) - �cones Automáticos: Função
getSocialIcon()detecta rede social pela URL do link - Tipo de Bloco: Usuário seleciona manualmente "Link" vs "VÃdeo" no formulário
- Todas as null-safety fixes aplicadas (VideoEmbed, getSocialIcon, link.url.replace)
- Error boundaries via useAuth fallback
- Debug logging com
[Auth]prefix para diagnóstico
| Arquivo | Tipo | O que mudou |
|---|---|---|
apps/web/src/lib/supabaseClient.js |
CONFIG | Adicionado auth: { flowType, detectSessionInUrl, persistSession } |
apps/web/src/contexts/AuthContext.jsx |
CORE | Reescrito: useAuth com fallback, onAuthStateChange como handler primário, updateProfile com slug injection, maybeSingle() |
apps/web/src/pages/LoginPage.jsx |
PAGE | Redirect se autenticado, detecção de erros OAuth via URL params, toast de vinculação de contas, texto informativo |
apps/web/src/pages/ProfilePage.jsx |
PAGE | Null-safety em getSocialIcon() e link.url.replace() |
apps/web/src/pages/OnboardingPage.jsx |
PAGE | Removido campo email do payload de updateProfile |
apps/web/src/components/VideoEmbed.jsx |
COMPONENT | Null-safety em parsers de URL (YouTube, Vimeo, TikTok) |
apps/web/src/components/LinkForm.jsx |
COMPONENT | Seleção manual de tipo (link/video) |
apps/web/.env |
CONFIG | Variáveis do Supabase |
- Authentication > Providers > Google: Ativado com Client ID e Client Secret corretos
- Authentication > URL Configuration:
- Site URL:
http://localhost:3000/ - Redirect URLs:
http://localhost:3000/*,http://localhost:3000/**
- Site URL:
- Authentication > Sign In / Providers:
- Allow manual linking: OFF (vinculação automática de contas)
- Confirm email: ON
- OAuth Client:
contate-site-auth— Status: Ativado - Callback URL:
https://jxdupvgluypllzfupung.supabase.co/auth/v1/callback - Origens autorizadas:
http://localhost:3000
- Deploy em produção (Hostinger ou Vercel)
- Atualizar URLs do OAuth para domÃnio de produção
- Refinamento visual do perfil público
- Implementar upload de avatar via Supabase Storage
- Analytics básico (contagem de cliques nos links)
- GitHub Workflow: Após cada atualização ou correção de bug concluída, o agente DEVE fazer o commit e o push automático para o GitHub.