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]
Organização
Seção intitulada “Organização”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.
Fronteiras
Seção intitulada “Fronteiras”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.
Contrato do editor de fluxos
Seção intitulada “Contrato do editor de fluxos”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.
Autenticação
Seção intitulada “Autenticação”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.