Este é o frontend do sistema de painel de controle e governança (DAO). Ele foi construído utilizando as melhores práticas modernas de Clean Architecture, focando na separação de responsabilidades (Domain Separation) e integração híbrida entre contas tradicionais (Web2) e identidades descentralizadas (Web3 - SIWE).
Para garantir que a lógica complexa de perfis não invada os componentes visuais, a aplicação adota o padrão View Model Pattern.
A fonte da verdade de autenticação (AuthProvider) foi isolada, retornando apenas a sessão bruta. Os componentes visuais consomem os dados através do Hook especializado:
useUserProfile (src/auth/hooks/use-user-profile.ts)
A arquitetura conta com uma suíte de "Funções Puras" (Transformers) responsáveis pelas regras de negócio visuais:
buildDisplayName: Define o nome de exibição (Single Source of Truth). Prioriza Nomes Civis, realiza o fallback inteligente para endereços de Carteiras Web3 (aplicando o interceptador de emergência) ou extração de e-mails.formatWalletAddress: Formata nativamente qualquer carteira para o padrão simétrico (ex:0xDfcE...e6b56f).buildDisplayAvatar: Garante que o aplicativo inteiro respeite o carregamento de imagens de perfil do banco de dados ou acione nativamente a imagem global de Fallback (/assets/images/avatar/default-avatar.png).
Para a emissão de documentos oficiais (Extratos, Faturas, Certificados) que precisam de fidelidade de impressão ABNT (ou A4 padrão), o sistema adota uma arquitetura baseada em Componentes Ocultos Injetáveis. Essa abordagem contorna falhas dos motores de navegadores (como o Chrome Print Engine bug).
- Motor Físico (
A4Page): O componente mestre (src/components/abnt-document/a4-page.tsx). Ele delega as margens físicas à diretiva@page { margin: 15mm 15mm 0mm 15mm }, desativando a injeção de URLs nativas do navegador. Possui sistema de quebra de páginas, repetição automática de cabeçalho (<thead>) e ancoramento de rodapé de aviso legal no limite da folha via spacer invisível (<tfoot>). - Layout de Negócios: Componentes dedicados como o
<LedgerPrintDocument />encapsulam o design visual (Ex: métricas com psicologia de cores). O Box-Model é blindado com regras essenciais de impressão nativa:table-layout: fixedeword-wrap: break-wordevitam rompimento de colunas.white-space: nowrapprevine quebras monetárias indesejadas (órfãos).page-break-inside: avoidnas linhas iteradas garante integridade na virada de páginas.
- Padronização para novos Relatórios: No futuro, qualquer novo layout que exija a emissão PDF deverá simplesmente importar e envolver o seu design de negócios dentro do motor
<A4Page>para herdar toda essa proteção geométrica.
O ecossistema financeiro do painel foi desmembrado de pastas genéricas (como overview/analytics) para um domínio estritamente isolado (src/sections/banking/). O objetivo é garantir Bounded Context (Isolamento de Contexto) e blindar regras de negócio monetárias e fiscais.
Princípio Fundamental: O domínio financeiro não deve compartilhar dependências visuais intrincadas com outras áreas do painel. Cada subdomínio deve possuir seus próprios hooks, tipagens e componentes.
Árvore de Diretórios Oficial (Target Architecture):
src/
└── sections/
└── banking/
├── financial-history/ # Ficha Financeira (Visão 360º de um Associado Específico)
│ ├── components/ # Buscador, Resumo Financeiro (KPIs) e Extrato (Ledger)
│ ├── utils/ # Tipagens de perfil (IFinancialProfile) e lógicas locais
│ └── view/ # Smart Component: orquestra SWR, agrega dados e controla estado
│
├── treasury/ # Visão Macro (O Dashboard da Tesouraria da DAO)
│ ├── components/ # (A MIGRAR) Gráficos de fluxo de caixa, evolução mensal
│ └── view/ # Orquestrador de métricas coletivas do banco
│
└── payments/ # Fluxo de Saída (Contas a Pagar / Autorizações)
├── components/ # (A MIGRAR) Formulários de remessa e aprovação de saques
└── view/ # Interface de controle de liquidações
Linha de Raciocínio (Guia de Desenvolvimento):
- Regra do Isolamento Estrutural: Nenhuma funcionalidade nova ligada a finanças, contabilidade ou pagamentos deve ser criada nas pastas
overview/ouanalytics/. Elas pertencem asections/banking/. - Padrão Smart/Dumb: A pasta
view/deve conter apenas um (ou poucos) componentes "Inteligentes". É ali que os Hooks de API (SWR) e estados globais operam. Todo o restante deve ser criado dentro decomponents/como componentes "Burros" (Dumb Components) que apenas recebempropspuras. - UX de Estado Vazio (Empty State): Regra rígida de produto. Nenhum painel financeiro deve iniciar carregando dados aleatórios ou "R$ 0,00". Se nenhuma seleção foi feita, o componente deve repousar com indicadores visuais vazios (
—) aguardando a intenção direta do usuário.
Detalhamento do Módulo: Histórico Financeiro (financial-history/)
Módulo implementado e estabilizado. Atua como a "Ficha Financeira" oficial do associado, oferecendo uma visão 360º de suas obrigações e transações.
financial-history-view.tsx: Orquestrador central (Smart Component). Mantém os estados de filtro (ano, busca textual) e o ID do associado. Realiza o fetch dos dados agregados (useGetCitizenLedger) e os repassa aos componentes filhos.associate-search-card.tsx: Motor de busca (Autocomplete) que consome a API de Cidadãos (useGetCitizens) para localizar associados por Nome, CPF ou ASP-ID e devolve o UUID selecionado para a View.financial-summary-header.tsx: Painel (Dumb Component) que exibe a Identidade (com ofuscação de CPF/RG para LGPD), Situação do Contrato (valor contratado, pago, saldo, % de quitação) e Obrigações (vencimentos e parcelas). Implementa a regra rígida de "Estado 1" (Vazio) exibindo hifens (—) quando não há seleção.financial-transactions-table.tsx: Tabela interativa paginada que renderiza as movimentações financeiras do associado, com formatação de cores (verde/vermelho) para entradas e saídas.financial-history-print.tsx: Documento oculto para emissão de PDF A4, embutido no motor base de impressão para exportação do extrato auditável.
O núcleo de apresentação e rotas dinâmicas do dashboard já foi refatorado. As próximas fases focam exclusivamente na Consistência de Dados e Infraestrutura de Backend:
- Objetivo: O Frontend depende de campos completos (
firstName,lastName,photoURL,did,walletAddress, etc.). Atualmente o login local (local.ts) retorna DTOs limitados ({ id, email, role }). - Ação: Atualizar o Drizzle ORM e as rotas para retornar a payload completa, permitindo que a camada View Model opere em sua capacidade máxima com dados do banco ao invés de fallbacks.
- Objetivo: Substituir as simulações (
Promise.resolve) no componenteaccount-general.tsx. - Ação: Implementar upload
multipart/form-dataconectando ao Cloudflare R2, salvando a URL gerada de volta no banco de dados SQLite (D1) e atualizando a sessão em tempo real.
Status: Descongelado e Refatorado (Fase 1)
O módulo de Chat (src/sections/chat) foi completamente auditado e refatorado para uma arquitetura de classe corporativa, espelhando os padrões Enterprise (Slack/Teams).
Arquitetura Visual (Three-Pane Layout):
- Barra Global (ChatKpiBar): Injetada no topo da tela com 100% de largura, atuando como um painel executivo intocável contendo os indicadores vitais (Não Lidas, Online, Tickets, Ações IA, Chamadas). Desvinculada completamente do workspace.
- Sidebar (ChatNav): Painel lateral esquerdo com lista de contatos e conversas. Altamente responsivo (transforma-se nativamente em um Drawer no Mobile).
- Main Panel (Workspace): Orquestrado pela Máquina de Estados no
chat-view.tsx. Quando não há foco, exibe o<ChatDashboard>(Portal e Ações Rápidas). Quando uma conversa é selecionada, injeta o Header nativo, o histórico de mensagens e o Compositor de texto (Input). - Details (ChatRoom): Gaveta lateral direita exibindo metadados, arquivos anexos e ações financeiras do contrato associado (P2P).
Arquitetura de Dados (Engine Offline-First):
A camada UI é 100% desacoplada do motor de envio de rede. A orquestração ocorre via ChatRealtimeProvider:
- Estado de conexão governado por WebSocket (
Connecting,Connected,Offline). - Fila Offline nativa (IndexedDB): Mensagens criadas sem conexão com a internet ou em flutuação de rede são enfileiradas no disco do navegador (
Queued) e injetadas no WebSocket automaticamente assim que o handshake é reestabelecido, alcançando sincronia perfeita (Status: Sent / Delivered / Read).
(Atualmente sem grandes módulos bloqueados. O monolito estrutural do componente ChatMessageItem e a virtualização do Scroll de histórico do Chat estão mapeados para refatoração na Fase 2 e 3 do Roadmap da Área de Comunicação).
Pré-requisitos
- Node.js >=20 (Recomendado)
- Gerenciador de Pacotes:
pnpm(Padrão atual) ouyarn.
Instalação (pnpm)
pnpm install
pnpm devBuild de Produção
pnpm build(Base do projeto originada do Minimal UI Kit. Ambiente de Mock data genérico em https://api-dev-minimal-[version].vercel.app para componentes não integrados ao backend).