Mapa de Hooks — ZPRO CRM

Hooks Socket (realtime)

HookFunçãoArmadilhas
use-socket.tsInicializa todos os socketsChamado no dashboard/layout
use-socket-tickets.tsEventos de tickets em tempo real—
use-socket-tickets-otm.tsTickets OTM (transferidos)—
use-socket-whatsapp.tsStatus de canais em tempo real—
use-socket-chat.tsChat privado interno⚠️ RACE CONDITION: fetchPrivateGroups antes do token estar no localStorage — fix: setTimeout(500ms) + check token
use-socket-auth.tsAutenticacao via socket—
use-notification-socket.tsNotificacoes push—
use-dialog360-call-socket.tsChamadas Dialog360—
use-gupshup-call-socket.tsChamadas Gupshup—

Hooks de Canal (auth expirado)

  • use-dialog360-auth-expired-socket.ts
  • use-gupshup-auth-expired-socket.ts
  • use-channel-auth-expired-socket.ts
  • use-google-auth-expired-socket.ts

Hooks de UI

HookFunção
use-live-mode.tsModo ao vivo (blur dados sensĂ­veis)
use-page-access.tsControle de acesso por página e perfil
use-notifications.tsNotificacoes do sistema
use-push-notifications.tsPush notifications (service worker)
use-install-pwa.tsInstalar como PWA
use-service-worker-update.tsAtualizar SW
use-settings.tsConfiguracoes gerais

Hooks de Canal / Proxy

  • use-channel-sender.ts — envio via canal
  • use-channel-caller.ts — chamada via canal
  • use-meta-proxy-popup.ts — popup Meta
  • use-dialog360-proxy-popup.ts
  • use-gupshup-proxy-popup.ts
  • use-dialog360-group-notification-socket.ts
  • use-gupshup-group-notification-socket.ts
  • use-oauth-proxy-domain.ts

Hooks de Formulário

  • use-login-form.ts
  • use-masterkey-form.ts
  • use-smtp-config.ts
  • use-auth-guard.ts

Hook critico: use-socket-chat.ts

Problema: Ao montar, chama fetchPrivateGroups(userId) imediatamente. Se o token ainda nao estava no localStorage (race condition de hidratacao), a API retorna 403 ERR_AUTH_TOKEN_MISSING → interceptor do axios forca logout.

Fix aplicado:

// Antes da chamada, verificar token + delay
setTimeout(() => {
  try { if (!localStorage.getItem("token")) return; } catch { return; }
  fetchPrivateGroups(userId).then(...).catch(() => {});
}, 500);

Fix complementar em api.ts:

const isSilentBackgroundCall =
  url.includes("/users/grupo-privado/") ||
  url.includes("/users/chat-privado") ||
  url.includes("/chat-privado/unread-preview");
 
// Nao forcar logout para essas URLs mesmo com 403
if (status === 403 && !isAuthCall && !isSilentBackgroundCall && isAuthError) {
  redirectToLogin(...)
}