Skip to main content

Padrões de Diretórios

Este guia define como novos diretórios, páginas e módulos devem ser organizados no frontend da Smart NX (SNX).
O foco é garantir uma arquitetura baseada em domínio, favorecendo isolamento entre áreas (como Dashboard, Chat, Admin ou Público) e padronização no desenvolvimento de novas features.

Este documento não reflete a estrutura atual, mas o padrão de referência para futuras criações.
Ele define como pensamos e construímos novos módulos, garantindo consistência, previsibilidade e escalabilidade.


Princípios Arquiteturais​

  1. Organização por Domínio (Domain-Driven Frontend)
    Cada área funcional da aplicação (Dashboard, Chat, Público, Admin etc.) é tratada como um domínio isolado, com sua própria estrutura interna.

  2. Isolamento Contextual
    Tudo o que pertence a um domínio deve estar contido nele — componentes, contextos, hooks, helpers e types.
    Isso evita dependências cruzadas e mantém o código modular.

  3. Reutilização Consciente
    Apenas o que for realmente compartilhável entre domínios deve ser movido para o escopo global (src/components, src/hooks, etc.).

  4. Simplicidade e Escalabilidade
    A estrutura deve permitir a adição de novas features sem quebrar o padrão de organização.


Estrutura de Domínios​

O diretório src/pages é o núcleo organizacional do frontend.
Cada subdiretório dentro dele representa um domínio funcional do sistema.

Hierarquia de Páginas​

src/pages/
├── Attendance/ # Páginas de atendimento ao cliente
├── Chat/ # Páginas de chat
├── Dashboard/ # Dashboard principal
│ ├── ArtificialIntelligence/
│ ├── Attendance/
│ ├── Billing/
│ ├── Builder/
│ ├── Channels/
│ ├── Config/
│ ├── Home/
│ ├── Monitoring/
│ ├── People/
│ └── Utility/
├── Public/ # Páginas públicas (login, etc.)
└── System/ # Páginas do sistema

O objetivo é que cada domínio represente um contexto funcional completo da aplicação.


Estrutura Interna de um Domínio​

Cada domínio (ou subdomínio) segue a mesma estrutura modular:


src/pages/<domain>/
│
├─ components/ → Componentes locais e específicos do domínio
├─ contexts/ → Estados e contextos próprios da área
├─ hooks/ → Hooks customizados usados apenas neste domínio
├─ helpers/ → Funções utilitárias específicas
├─ types/ → Tipos e interfaces locais
├─ services/ → Comunicação com APIs ou lógicas de dados
├─ index.tsx → Ponto de entrada (página principal)
└─ style.ts → Estilização principal do domínio

Tudo que for específico daquele domínio deve estar dentro dele.
Se uma página ou funcionalidade é exclusiva do Dashboard, ela deve estar em src/pages/dashboard/... — nunca diretamente em src/pages.


Exemplos de Estrutura por Domínio​

1. Páginas Públicas​


src/pages/public/
│
├─ login/
│ ├─ index.tsx
│ ├─ style.ts
│ └─ components/
│ ├─ LoginForm/
│ │ ├─ index.tsx
│ │ └─ style.ts
│
├─ register/
│ ├─ index.tsx
│ └─ style.ts
└─ forgot-password/
├─ index.tsx
└─ style.ts

  • Não possuem dependências de contexto global.
  • Acesso livre (sem autenticação).
  • Devem ser simples e focadas em fluxo de entrada do usuário.

2. Dashboard (Área Autenticada)​


src/pages/dashboard/
│
├─ relationship/
│ ├─ components/
│ │ ├─ Flows/
│ │ └─ Segments/
│ ├─ contexts/
│ │ └─ RelationshipContext.tsx
│ ├─ hooks/
│ │ └─ useFlows.ts
│ ├─ helpers/
│ │ └─ mapRelationshipData.ts
│ ├─ types/
│ │ └─ relationshipTypes.ts
│ ├─ index.tsx
│ └─ style.ts
│
└─ reports/
├─ components/
├─ hooks/
├─ types/
└─ index.tsx

  • Cada subpasta dentro de dashboard é um subdomínio funcional (ex: relationship, reports, settings).
  • Devem ser organizadas de forma autônoma, com o mínimo de dependências entre si.
  • Contextos e hooks globais do dashboard ficam em src/pages/dashboard/contexts e src/pages/dashboard/hooks.

3. Chat (Domínio Isolado)​


src/pages/chat/
│
├─ components/
│ ├─ ChatWindow/
│ ├─ MessageInput/
│ └─ UserList/
├─ contexts/
│ └─ ChatContext.tsx
├─ hooks/
│ ├─ useChatMessages.ts
│ ├─ useConnection.ts
│ └─ useTypingStatus.ts
├─ services/
│ └─ chatService.ts
├─ types/
│ └─ chatTypes.ts
├─ index.tsx
└─ style.ts

  • Pode usar contextos próprios de conexão ou estado.
  • Totalmente desacoplado do Dashboard.
  • Comunicação via WebSocket, com isolamento técnico completo.

Critérios para Novos Diretórios​

CasoOnde criarObservações
Nova página públicasrc/pages/public/<page>Acessível sem autenticação. Simples e isolada.
Nova página autenticadaDentro de src/pages/dashboard/<module>Deve herdar layout e contexto do Dashboard.
Nova área independentesrc/pages/<domain>Domínio isolado, como Chat ou Admin.
Componente compartilhadosrc/components/<ComponentName>Reutilizado em múltiplos domínios.
Hook ou helper globalsrc/hooks/ ou src/helpers/Genérico, sem dependência de contexto.
Nova API Servicesrc/services/<domain>.service.tsRepresenta um endpoint específico de domínio.

Diretrizes de Criação​

  1. Prefira proximidade ao escopo
    → Se um componente ou hook é usado apenas dentro de um domínio, mantenha-o localmente.
    Evite criar pastas globais sem necessidade.

  2. Crie um index.ts sempre que houver múltiplos exports
    → Isso simplifica imports e evita caminhos longos.

  3. Mantenha a hierarquia rasa
    → Evite mais de 3 níveis de aninhamento (ex: components/ButtonGroup/Button/index.tsx).

  4. Nomeie de forma previsível e semântica
    → Exemplo: relationship, reports, settings, chat, public.

  5. Evite sobreposição de domínios
    → Uma feature deve pertencer claramente a um domínio.
    Se precisar interagir com outro, faça isso via serviços ou hooks de integração, nunca importando diretamente os componentes do outro domínio.


Convenções de Nomenclatura​

TipoConvençãoExemplo
InterfacesI + PascalCaseIUser, IFunctionality
TiposT + PascalCaseTStatus, TChannelType
ComponentesPascalCaseUserCard.tsx, DashboardHeader.tsx
Hooksuse + PascalCaseuseChatMessages.ts, useUserSession.ts
Helpers / UtilscamelCaseformatDate.ts, parseUserData.ts
Arquivos de estilo.style.tsButton.style.ts, Header.style.ts
DiretórioscamelCaserelationship, userSettings, chatWindow
ContextosPascalCase + “Context”ChatContext.tsx, ThemeContext.tsx
Testes.test.ts(x)Button.test.tsx, useAuth.test.ts
IdiomaInglês (100%)Código, nomes e comentários.

Decisão Arquitetural​

  • Camada Global: fornece componentes e utilitários reutilizáveis.
  • Camada de Domínio: cada área (Dashboard, Chat, Público) tem autonomia estrutural.
  • Camada de Feature: cada página representa uma feature isolada com suas dependências locais.

Essa separação facilita a evolução da aplicação, testes independentes e modularização progressiva (eventualmente suportando microfrontends).


Histórico de Versões​

DataVersãoAutor / RevisorAlterações
08/04/2026v1.1.0Juathan Coelho DuarteAlinhamento com o Master Guideline e prefixos I/T
29/10/2025v1.0.0@Matheus TellesCriação inicial e estrutura base do documento