Mapa de Hooks — ZPRO CRM
Hooks Socket (realtime)
| Hook | Função | Armadilhas |
|---|---|---|
use-socket.ts | Inicializa todos os sockets | Chamado no dashboard/layout |
use-socket-tickets.ts | Eventos de tickets em tempo real | — |
use-socket-tickets-otm.ts | Tickets OTM (transferidos) | — |
use-socket-whatsapp.ts | Status de canais em tempo real | — |
use-socket-chat.ts | Chat privado interno | ⚠️ RACE CONDITION: fetchPrivateGroups antes do token estar no localStorage — fix: setTimeout(500ms) + check token |
use-socket-auth.ts | Autenticacao via socket | — |
use-notification-socket.ts | Notificacoes push | — |
use-dialog360-call-socket.ts | Chamadas Dialog360 | — |
use-gupshup-call-socket.ts | Chamadas Gupshup | — |
Hooks de Canal (auth expirado)
use-dialog360-auth-expired-socket.tsuse-gupshup-auth-expired-socket.tsuse-channel-auth-expired-socket.tsuse-google-auth-expired-socket.ts
Hooks de UI
| Hook | Função |
|---|---|
use-live-mode.ts | Modo ao vivo (blur dados sensĂveis) |
use-page-access.ts | Controle de acesso por página e perfil |
use-notifications.ts | Notificacoes do sistema |
use-push-notifications.ts | Push notifications (service worker) |
use-install-pwa.ts | Instalar como PWA |
use-service-worker-update.ts | Atualizar SW |
use-settings.ts | Configuracoes gerais |
Hooks de Canal / Proxy
use-channel-sender.ts— envio via canaluse-channel-caller.ts— chamada via canaluse-meta-proxy-popup.ts— popup Metause-dialog360-proxy-popup.tsuse-gupshup-proxy-popup.tsuse-dialog360-group-notification-socket.tsuse-gupshup-group-notification-socket.tsuse-oauth-proxy-domain.ts
Hooks de Formulário
use-login-form.tsuse-masterkey-form.tsuse-smtp-config.tsuse-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(...)
}