Pular para o conteúdo

Arquitetura do frontend

O cliente é uma SPA em React 19 e TypeScript, construída com Vite. TanStack Router define as rotas, TanStack Query gerencia dados remotos e Zustand mantém estados locais específicos. Os componentes de interface usam Tailwind CSS e uma base shadcn.

flowchart TB
    U[Usuário no navegador] --> R[TanStack Router]
    R --> G[Guarda de autenticação e permissões]
    G --> P[Páginas e features React]
    P --> Q[TanStack Query]
    P --> S[Estado local / Zustand]
    P --> L[localStorage: sessão e rascunhos]
    Q --> F[apiFetch]
    F --> A[API Procon Flow /v1]
  • src/routes/: composição de rotas e políticas de acesso.
  • src/features/: funcionalidades isoladas por domínio.
  • src/components/ui/: vocabulário visual compartilhado.
  • src/lib/: cliente HTTP, ambiente e utilitários transversais.
  • src/features/shared/: tabelas, filtros, providers e tipos reutilizados.

As rotas devem permanecer finas: validam parâmetros, aplicam guardas e entregam a tela. Regras e chamadas de API pertencem à feature correspondente. Componentes compartilhados só devem receber comportamento que já é usado em mais de um domínio.

flowSchemaSchema aceita execution_mode com os valores conversation e private; a ausência continua equivalente a conversa para compatibilidade. O modo integra o próprio schema exportado e importado, não um estado separado da tela.

O editor deriva os tipos das variáveis coletadas pelas etapas: perguntas numéricas produzem number e confirmações com save_as produzem boolean. Isso permite validar os bindings contra o catálogo antes da publicação. Entradas de integração com hidden: true são ligadas automaticamente ao estado pelo próprio nome e não são renderizadas para edição. O backend permanece a autoridade final para validar e publicar o roteiro.

O token de acesso é persistido no localStorage. O cliente HTTP tenta renovar a sessão em POST /v1/auth/refresh quando necessário. Ao sair, o armazenamento local é limpo; isso também remove preferências e rascunhos locais.