Ir para o conteúdo
Produto · 6 min de leitura

WITHMIA v1.0.6 — Transição perfeita

Acabamos com o carregamento duplo depois do login, colocamos no lugar uma transição visual profissional com overlay inline, dark mode completo no onboarding e a correção definitiva do loop de redirecionamento na autenticação.

E

Equipe WITHMIA

WITHMIA

A v1.0.5 blindou a infraestrutura com testes, CI/CD e faturamento. A v1.0.6 olha para o que a pessoa vê e sente: uma entrada na plataforma sem interrupções, sem flashes brancos, sem reloads visíveis. É uma mudança de arquitetura que elimina um carregamento inteiro da aplicação e o substitui por uma transição visual fluida.

O problema: carregar tudo duas vezes depois do login

Até a v1.0.5, o fluxo de autenticação com o Google funcionava assim:

  1. A pessoa clica em “Entrar com Google”
  2. O Google autentica e devolve para /auth/google
  3. O servidor renderiza auth-loading.blade.php — uma página intermediária que mostra o vídeo de transição
  4. Essa página carrega o app React dentro de um iframe para guardar o token
  5. Depois executa top.location.replace() em direção ao painel
  6. O navegador carrega o app inteiro pela segunda vez

O resultado: um flash branco visível entre a transição e o painel. O app carregava duas vezes a cada login.

A solução: redirect direto + overlay inline

A v1.0.6 elimina o auth-loading.blade.php por completo e substitui todo o fluxo por um desenho de carregamento único:

O novo fluxo

  1. A pessoa clica em “Entrar com Google”
  2. O Google autentica e devolve para /auth/google
  3. O servidor faz um redirect() direto para o painel com ?transition=1&auth_token=...
  4. O app.blade.php detecta o ?transition=1 e renderiza o overlay de transição inline sobre a <div id="app">
  5. O React monta por baixo do overlay
  6. Quando o React está pronto, o overlay faz um fade-out suave (mínimo de 1,5s em tela + 0,6s de animação)

Um único carregamento de página. Zero flashes brancos. Transição profissional.

O que muda tecnicamente

ComponenteAntes (v1.0.5)Agora (v1.0.6)
GoogleAuthControllerreturn view('auth-loading', ...)return redirect($url . '&transition=1')
OnboardingControllerreturn view('auth-loading', ...)return redirect($url . '&transition=1')
routes/web.phpRenderiza auth-loading como viewRedirect direto com ?transition=1
OverlayPágina separada (auth-loading.blade.php)Inline no app.blade.php com CSS
Carregamentos de página2 (iframe + replace)1 (redirect direto)

Dark mode completo no onboarding

O fluxo de onboarding agora respeita totalmente o modo escuro do sistema:

  • Detecção automática — lê o prefers-color-scheme: dark do sistema operacional
  • Persistência — se já existe uma preferência salva no localStorage, ela prevalece
  • Fundo e texto — toda a tela de onboarding se adapta: fundos #0F0F0F, textos claros, inputs com bordas sutis
  • Sem flash branco — o <html> recebe data-theme="dark" antes de o React renderizar

Correção do loop de redirecionamento na autenticação

Encontramos e corrigimos várias causas de um loop de redirecionamento que afetava algumas pessoas:

Causas identificadas e corrigidas

  1. Lazy closures em HandleInertiaRequests — as closures eram avaliadas mesmo com o usuário não autenticado, gerando erros que disparavam redirects
  2. AuthenticationException com 302 — passou a devolver um redirect limpo, em vez de uma resposta que o Inertia não conseguia tratar
  3. Middleware auth.clean removido — interferia no tratamento dos tokens do Railway
  4. Railway auth nas rotas de API — adicionamos railway.auth às rotas de usuário na API para que o token funcione corretamente
  5. auth_token preservado na URL — paramos de limpar o auth_token da URL cedo demais, permitindo que o app o capture direito

Overlay de transição: acabamento profissional

O overlay inline no app.blade.php reproduz exatamente o desenho do antigo auth-loading:

  • Vídeo de fundo — o mesmo MP4 corporativo, muted + autoplay + loop
  • Gradiente adaptativo — um linear-gradient que muda entre modo claro e escuro
  • Assinatura “WITH YOU, WITHMIA” — tracking amplo, peso semibold, com gradiente de opacidade
  • Timing inteligente — mínimo de 1,5 segundo em tela (o tempo que o window.__loadingStart acompanha) e fade-out de 0,6 segundo com pointer-events: none para nunca bloquear a interação
  • Limpeza da URL — o history.replaceState() remove transition e auth_token da URL depois do mount

Suporte a dark mode no overlay

/* Light mode */
background: linear-gradient(135deg, #f8f9fa 0%, #e8f4f8 50%, #f0f7ff 100%);

/* Dark mode (prefers-color-scheme: dark ou data-theme="dark") */
background: linear-gradient(135deg, #0a0a0a 0%, #111827 50%, #0f172a 100%);
color: white;

Correção: uma única fonte de verdade para o tema

Descobrimos que existiam dois sistemas de tema disputando o controle da classe dark no <html>:

  1. WITHMIA ThemeContext — lê withmia_theme_mode do localStorage (o sistema real, sincronizado com o banco)
  2. Laravel starter kit (initializeTheme) — lê appearance do localStorage, que por padrão vinha como 'system'

Se a pessoa tinha o tema WITHMIA em light, mas o sistema operacional estava em dark mode, o initializeTheme() adicionava a classe dark ao <html> depois de o overlay já ter renderizado em modo claro → um flash de escuro por cima do claro.

A solução

O initializeTheme() agora lê withmia_theme_mode como fonte de verdade principal, com fallback para appearance e depois para 'light'. O handler handleSystemThemeChange também foi atualizado.

// Antes
const savedAppearance = (localStorage.getItem('appearance') as Appearance) || 'system';

// Agora
const savedAppearance = (localStorage.getItem('withmia_theme_mode') as Appearance)
    || (localStorage.getItem('appearance') as Appearance)
    || 'light';

Faxina: auth-loading eliminado

O arquivo auth-loading.blade.php (216 linhas) foi removido do codebase. Nenhum controller, rota ou view faz mais referência a ele.

A rota /auth-loading continua existindo como redirect de compatibilidade — se alguém tiver a URL em cache, é simplesmente redirecionado ao destino com &transition=1.

Resumo técnico

MudançaArquivosImpacto
Eliminar o carregamento duploGoogleAuthController, OnboardingController, routes/web.phpview()redirect()
Overlay inlineapp.blade.phpDetecção de ?transition=1, overlay em CSS com vídeo
Fade-out no Reactapp.tsxMínimo de 1,5s + 0,6s de animação, limpeza da URL
Dark mode no onboardingonboarding.tsxRespeita prefers-color-scheme e localStorage
Correção do loop de redirectHandleInertiaRequests, routes/web.php, GoogleAuthController5 correções independentes
Return typesGoogleAuthController, OnboardingControllerRedirectResponse no tipo de retorno
Fonte de verdade do temause-appearance.tsxwithmia_theme_mode como fonte principal
Faxinaauth-loading.blade.phpArquivo removido (-216 linhas)

O que vem por aí

Com a experiência de login refinada, o foco volta para funcionalidades de produto:

  • PWA / app mobile — a prioridade para uma América Latina mobile-first
  • Pesquisas CSAT — satisfação do cliente integrada à conversa
  • AI resolution analytics — métricas de resolução por IA
  • Broadcasting no WhatsApp — campanhas em massa

A WITHMIA v1.0.6 é a versão que deixa os primeiros 3 segundos da sua experiência perfeitos. Um login, um carregamento, zero interrupções.

Abrir a WITHMIA → Teste grátis em app.withmia.com →

Etiquetas

atualização v1.0.6 produto UX dark-mode autenticação transição performance tema

Compartilhar

Comentários

Seja respeitoso. Seu e-mail não será publicado.

Artigos relacionados

Quer colocar isso para funcionar no seu negócio?

Teste grátis por 14 dias. Sem cartão de crédito.

Testar grátis por 14 dias