Skip to content

Frontend — Visão Geral

O frontend do Galdix CRM é uma aplicação Next.js 16 com App Router, desenvolvida em TypeScript e React 19, servindo como interface principal para operadores, gestores e administradores do sistema.

Localização

/home/crm/app/frontend/
├── app/                    # App Router do Next.js
│   ├── layout.tsx          # Root layout (Clerk, ThemeProvider, Service Worker)
│   ├── page.tsx            # Redirect para /dashboard
│   ├── (auth)/             # Rotas de autenticação (sign-in, sign-up)
│   ├── dashboard/          # Dashboard principal com KPIs
│   ├── clients/            # Lista e perfil de clientes
│   ├── campaigns/          # Campanhas (lista, criação, detalhes, real-time)
│   ├── whatsapp/           # Templates, configuração WhatsApp
│   ├── segments/           # Segmentos de clientes
│   ├── results/            # Analytics (varejo, canais, qualidade, agenda)
│   ├── rfm/                # Análise RFM e por vendedor
│   ├── email-templates/    # Editor de templates MJML
│   ├── settings/           # Configurações do sistema
│   ├── inbox/              # Caixa de entrada (legada, redireciona ao Chatwoot)
│   ├── admin/              # Painel de administração (super admin)
│   ├── audit/              # Trilha de auditoria
│   └── components/         # Componentes compartilhados
├── hooks/                  # Custom hooks React
├── lib/                    # Utilitários: fetchWithAuth, config, date, pdf, etc.
└── contexts/               # (merged into app/contexts)

Stack

ComponenteTecnologiaVersão
FrameworkNext.js16.0.3
UIReact19.2.0
LinguagemTypeScript5.x
EstiloTailwind CSS3.4.17
AuthClerk5.x
GráficosRecharts3.4.1
ÍconesLucide React0.554.0
HTTPAxios + fetchWithAuth1.13.2
Email BuilderGrapesJS + MJML0.22.14
PDF ExportjsPDF + html2canvas
NotificaçõesSonner (toast)2.0.7
Datasdate-fns (pt-BR)4.1.0
Temanext-themes0.4.6

Porta e endereço

  • Porta interna: 3000
  • URL produção: https://crm.galdix.com.br
  • URL API: https://apicrm.galdix.com.br (via NEXT_PUBLIC_API_BASE_URL)

Arquitetura de layout

RootLayout (app/layout.tsx)
  ├── ClerkProvider (auth, pt-BR)
  ├── ThemeProvider (dark/light)
  └── LayoutWrapper (app/components/LayoutWrapper.tsx)
       ├── Rotas de auth → sem layout
       ├── Rotas legais → sem layout
       └── Demais rotas:
            RBACProvider
              SidebarProvider
                LayoutShell
                  ├── Sidebar (desktop, colapsável)
                  ├── Mobile Drawer (overlay)
                  ├── MobileHeader (sticky, <lg)
                  └── BottomNav (fixo, <lg)

Autenticação e autorização

Todo o fluxo de auth usa Clerk como Identity Provider:

  1. Usuário não autenticado → Clerk redireciona para /sign-in
  2. Após login, Clerk gera JWT
  3. useStableToken() obtém token sem re-renders desnecessários
  4. fetchWithAuth() injeta Authorization: Bearer <token> em todo request
  5. useRBAC() expõe hasPermission(permissionId) para controle de visibilidade de UI

Padrões de fetch

typescript
// Padrão básico em componentes:
const { stableGetToken, isLoaded, isSignedIn } = useStableToken()

useEffect(() => {
  if (!isLoaded || !isSignedIn) return
  
  async function load() {
    const res = await fetchWithAuth(
      `${API_BASE_URL}/campaigns`,
      stableGetToken,
    )
    const data = await res.json()
    setItems(data)
  }
  
  load()
}, [isLoaded, isSignedIn])  // NUNCA adicionar stableGetToken às deps

Temas

Suporte a dark/light mode via next-themes. O usuário alterna pelo ícone na sidebar. Componentes usam useTheme() para ajustes condicionais (ex: cores de gráficos).

Progressive Web App (PWA)

Service Worker registrado no RootLayout. Intercepta atualizações de chunks Webpack para forçar refresh quando o frontend é re-deployado (evita erro de "stale deploy").

Documentação interna — Galdix CRM