Ir para o conteúdo

Documentação de Componentização do Frontend

Visão Geral

Esta documentação descreve a estrutura de componentização do frontend da Imobiliária Bortone, desenvolvido em Next.js 14 com App Router. O projeto utiliza uma arquitetura modular baseada em componentes reutilizáveis, seguindo as melhores práticas de React e Next.js.


🏗️ Arquitetura de Componentes

Estrutura de Diretórios

front-end/src/components/
├── auth/                    # Componentes de autenticação
│   ├── AdminRoute.js       # HOC para rotas administrativas
│   ├── ConditionalAuth.js  # Autenticação condicional
│   └── ProtectedRoute.js   # HOC para rotas protegidas
│
├── blog/                    # Componentes do blog
│   └── [componentes de blog]
│
├── chat/                    # Sistema de chat
│   └── [componentes de chat]
│
├── cms/                     # Componentes do CMS (Admin)
│   ├── Card.js             # Card reutilizável do dashboard
│   ├── ConfirmModal.js     # Modal de confirmação
│   ├── DropdownFilterPublicidade.js
│   ├── FaqModal.js         # Modal para gerenciar FAQs
│   ├── PostCard.js         # Card para posts do blog
│   ├── Sidebar.js          # Barra lateral do admin
│   ├── SidebarLinks.js     # Links da sidebar
│   ├── SidebarNav.js       # Navegação da sidebar
│   ├── form/               # Componentes de formulário
│   └── table/              # Componentes de tabela
│
├── Contato/                 # Componentes de contato
│   └── [formulários de contato]
│
├── dash/                    # Dashboard
│   └── [componentes do dashboard]
│
├── faq/                     # FAQ público
│   └── [componentes de FAQ]
│
├── home/                    # Página inicial
│   ├── Header.js           # Cabeçalho principal
│   ├── HeaderSlider.js     # Slider do cabeçalho
│   ├── HomeFooter.js       # Rodapé da home
│   ├── HomeNavbar.js       # Navegação da home
│   ├── ImovelCard.js       # Card de imóvel
│   ├── PropriedadesSelecionadas.js
│   └── PublicidadeCarousel.js
│
├── mapa/                    # Componentes de mapa
│   └── [componentes do Google Maps]
│
├── notifications/           # Sistema de notificações
│   └── [componentes de notificação]
│
├── relatorio/              # Relatórios
│   └── [componentes de relatório]
│
├── SEO/                    # Componentes de SEO
│   └── [meta tags, structured data]
│
├── simulacao/              # Simulador de financiamento
│   └── [componentes de simulação]
│
├── ui/                     # Componentes UI reutilizáveis
│   └── CloudinaryImage.js # Componente de imagem otimizada
│
├── vitrine/                # Vitrine de imóveis
│   ├── DropdownFilter.js  # Filtro dropdown
│   ├── Filtros.js         # Sistema de filtros
│   ├── GridImoveis.js     # Grid de imóveis
│   ├── GridImoveisFooter.js
│   ├── ImageCarroussel.js # Carrossel de imagens
│   ├── ImovelCard.js      # Card de imóvel na vitrine
│   ├── LocationInput.js   # Input de localização
│   └── PesquisaAvancada/  # Busca avançada
│
├── DebugAuth.js            # Componente de debug
├── Popup.js                # Popup genérico
├── PublicidadeImage.js     # Imagem de publicidade
└── SplashScreen.js         # Tela de carregamento

📦 Categorias de Componentes

1. Componentes de Autenticação (auth/)

ProtectedRoute.js

Propósito: Higher-Order Component (HOC) para proteger rotas que requerem autenticação.

Funcionalidades: - Verifica se o usuário está autenticado - Redireciona para login se não autenticado - Suporta níveis de acesso (admin, operador, cliente)

Uso:

import ProtectedRoute from '@/components/auth/ProtectedRoute';

export default function MinhaRota() {
  return (
    <ProtectedRoute>
      <ConteudoProtegido />
    </ProtectedRoute>
  );
}

AdminRoute.js

Propósito: HOC específico para rotas administrativas.

Funcionalidades: - Verifica se o usuário tem permissões de administrador - Redireciona usuários não autorizados - Integrado com sistema de níveis de usuário

Uso:

import AdminRoute from '@/components/auth/AdminRoute';

export default function PainelAdmin() {
  return (
    <AdminRoute>
      <DashboardAdmin />
    </AdminRoute>
  );
}

ConditionalAuth.js

Propósito: Renderiza componentes diferentes baseado no estado de autenticação.

Uso:

<ConditionalAuth
  authenticated={<ComponenteAutenticado />}
  unauthenticated={<ComponentePublico />}
/>


2. Componentes CMS/Admin (cms/)

Sidebar.js, SidebarNav.js, SidebarLinks.js

Propósito: Sistema de navegação lateral do painel administrativo.

Funcionalidades: - Menu lateral colapsável - Links organizados por categoria - Indicador de rota ativa - Responsivo para mobile

Estrutura:

<Sidebar>
  <SidebarNav>
    <SidebarLinks links={adminLinks} />
  </SidebarNav>
</Sidebar>

Card.js

Propósito: Card reutilizável para dashboard e listagens.

Props: - title: Título do card - subtitle: Subtítulo ou descrição - icon: Ícone do card - children: Conteúdo interno - actions: Botões de ação

Uso:

<Card 
  title="Total de Imóveis" 
  subtitle="150 propriedades"
  icon={<HomeIcon />}
>
  <ConteudoDoCard />
</Card>

ConfirmModal.js

Propósito: Modal de confirmação para ações destrutivas.

Props: - isOpen: Controla visibilidade - onConfirm: Callback de confirmação - onCancel: Callback de cancelamento - title: Título do modal - message: Mensagem de confirmação - confirmText: Texto do botão confirmar - cancelText: Texto do botão cancelar - variant: 'danger' | 'warning' | 'info'

Uso:

<ConfirmModal
  isOpen={showModal}
  onConfirm={handleDelete}
  onCancel={() => setShowModal(false)}
  title="Confirmar Exclusão"
  message="Tem certeza que deseja excluir este imóvel?"
  confirmText="Excluir"
  variant="danger"
/>

FaqModal.js

Propósito: Modal para criar/editar FAQs no CMS.

Funcionalidades: - Formulário de pergunta e resposta - Seleção de categoria - Toggle de status (ativo/inativo) - Validação de campos

Componentes de Formulário (cms/form/)

Componentes reutilizáveis para formulários administrativos: - Input de texto - Textarea - Select/Dropdown - Checkbox/Radio - Upload de arquivos - Editor de texto rico (WYSIWYG)

Componentes de Tabela (cms/table/)

Componentes para tabelas administrativas: - Tabela com paginação - Ordenação de colunas - Filtros inline - Ações por linha (editar, deletar) - Seleção múltipla


3. Componentes de Vitrine (vitrine/)

GridImoveis.js

Propósito: Grid responsivo de imóveis.

Funcionalidades: - Layout em grid responsivo - Suporte a paginação - Loading states - Empty states

Uso:

<GridImoveis 
  imoveis={imoveis}
  loading={isLoading}
  onPageChange={handlePageChange}
/>

ImovelCard.js

Propósito: Card individual de imóvel na vitrine.

Props: - imovel: Objeto com dados do imóvel - onClick: Callback ao clicar - showActions: Mostra ações (favoritar, compartilhar) - variant: 'default' | 'compact' | 'featured'

Estrutura do Card:

<ImovelCard>
  <ImageCarroussel images={imovel.imagens} />
  <CardBody>
    <Title>{imovel.titulo}</Title>
    <Location>{imovel.localizacao}</Location>
    <Price>{imovel.preco}</Price>
    <Features>
      <Feature icon={<BedIcon />}>{imovel.quartos}</Feature>
      <Feature icon={<BathIcon />}>{imovel.banheiros}</Feature>
      <Feature icon={<AreaIcon />}>{imovel.area}</Feature>
    </Features>
  </CardBody>
</ImovelCard>

Filtros.js

Propósito: Sistema de filtros para busca de imóveis.

Funcionalidades: - Filtro por tipo (casa, apartamento, terreno) - Filtro por faixa de preço - Filtro por localização - Filtro por características (quartos, banheiros, área) - Reset de filtros

Uso:

<Filtros
  onFilterChange={handleFilterChange}
  initialFilters={filters}
/>

ImageCarroussel.js

Propósito: Carrossel de imagens de imóveis.

Funcionalidades: - Navegação por setas - Indicadores de página - Swipe em mobile - Lightbox para visualização ampliada - Lazy loading de imagens

PesquisaAvancada/

Propósito: Componentes de busca avançada de imóveis.

Funcionalidades: - Múltiplos critérios de busca - Filtros combinados - Salvamento de buscas - Sugestões de busca


4. Componentes de Home (home/)

HomeNavbar.js

Propósito: Barra de navegação principal do site.

Funcionalidades: - Logo da imobiliária - Menu de navegação - Botões de login/cadastro - Menu mobile (hamburger) - Indicador de rota ativa

HeaderSlider.js

Propósito: Slider de destaque na home.

Funcionalidades: - Carrossel automático - Imagens de banners - Call-to-actions - Navegação manual

PropriedadesSelecionadas.js

Propósito: Seção de imóveis em destaque na home.

Funcionalidades: - Exibe imóveis selecionados - Carrossel de propriedades - Link para vitrine completa

PublicidadeCarousel.js

Propósito: Carrossel de publicidade.

Funcionalidades: - Banners publicitários rotativos - Links externos - Tracking de cliques


5. Componentes UI Reutilizáveis (ui/)

CloudinaryImage.js

Propósito: Componente otimizado para imagens do Cloudinary.

Funcionalidades: - Otimização automática de imagens - Lazy loading - Placeholder blur - Responsive images - Transformações dinâmicas

Props: - src: URL da imagem no Cloudinary - alt: Texto alternativo - width: Largura - height: Altura - quality: Qualidade (1-100) - transform: Transformações customizadas

Uso:

<CloudinaryImage
  src="imobiliaria/imoveis/imovel_123.jpg"
  alt="Casa em São Paulo"
  width={800}
  height={600}
  quality={80}
  transform={{ crop: 'fill', gravity: 'auto' }}
/>

Benefícios: - ✅ Carregamento otimizado - ✅ Formato automático (WebP, AVIF) - ✅ CDN global (Cloudinary) - ✅ Redimensionamento dinâmico


6. Componentes de Chat (chat/)

Funcionalidades: - Chat em tempo real (WebSocket) - Interface de conversação - Indicadores de digitação - Notificações de mensagens - Histórico de conversas


7. Componentes de Mapa (mapa/)

Funcionalidades: - Integração com Google Maps API - Marcadores de imóveis - InfoWindows personalizadas - Filtros no mapa - Clustering de marcadores


8. Componentes SEO (SEO/)

Funcionalidades: - Meta tags dinâmicas - Open Graph - Twitter Cards - Schema.org (JSON-LD) - Canonical URLs

Uso:

import SEO from '@/components/SEO';

<SEO
  title="Casa 3 Quartos - São Paulo"
  description="Bela casa com 3 quartos..."
  image="https://..."
  type="product"
/>


🎨 Padrões de Componentização

1. Componentes Funcionais

Todos os componentes utilizam a sintaxe de componentes funcionais com Hooks:

import { useState, useEffect } from 'react';

export default function MeuComponente({ prop1, prop2 }) {
  const [state, setState] = useState(initialValue);

  useEffect(() => {
    // Side effects
  }, [dependencies]);

  return (
    <div>
      {/* JSX */}
    </div>
  );
}

2. Componentes Client vs Server

Server Components (padrão no Next.js 14):

// app/page.js
export default async function Page() {
  const data = await fetchData(); // Fetch no servidor
  return <Component data={data} />;
}

Client Components (com interatividade):

'use client'; // Diretiva obrigatória

import { useState } from 'react';

export default function InteractiveComponent() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

3. Composição de Componentes

Preferência por composição ao invés de herança:

// ❌ Evitar herança
class ImovelCard extends BaseCard { }

// ✅ Usar composição
function ImovelCard({ children, ...props }) {
  return (
    <Card {...props}>
      {children}
    </Card>
  );
}

4. Props Destructuring

// ✅ Bom
function Component({ title, description, onClick }) {
  return <div onClick={onClick}>...</div>;
}

// ❌ Evitar
function Component(props) {
  return <div onClick={props.onClick}>...</div>;
}

5. PropTypes ou TypeScript

Para validação de tipos (se usando TypeScript):

interface ComponentProps {
  title: string;
  count?: number;
  onAction: () => void;
}

export default function Component({ title, count = 0, onAction }: ComponentProps) {
  // ...
}

🔄 Fluxo de Dados

1. Props Down, Events Up

// Parent
function Parent() {
  const [value, setValue] = useState('');

  return (
    <Child 
      value={value} 
      onChange={(newValue) => setValue(newValue)} 
    />
  );
}

// Child
function Child({ value, onChange }) {
  return (
    <input 
      value={value} 
      onChange={(e) => onChange(e.target.value)} 
    />
  );
}

2. Context para Estado Global

// contexts/AuthContext.js
import { createContext, useContext, useState } from 'react';

const AuthContext = createContext();

export function AuthProvider({ children }) {
  const [user, setUser] = useState(null);

  return (
    <AuthContext.Provider value={{ user, setUser }}>
      {children}
    </AuthContext.Provider>
  );
}

export function useAuth() {
  return useContext(AuthContext);
}

3. Custom Hooks para Lógica Reutilizável

// hooks/useImoveis.js
export function useImoveis(filters) {
  const [imoveis, setImoveis] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetchImoveis(filters).then(data => {
      setImoveis(data);
      setLoading(false);
    });
  }, [filters]);

  return { imoveis, loading };
}

🖼️ Gerenciamento de Imagens

Integração com Cloudinary

Todas as imagens do sistema utilizam o Cloudinary para:

  • ✅ Upload direto do frontend
  • ✅ Otimização automática
  • ✅ CDN global
  • ✅ Transformações dinâmicas
  • ✅ Armazenamento permanente

Componente Principal:

import CloudinaryImage from '@/components/ui/CloudinaryImage';

<CloudinaryImage
  src="imobiliaria/imoveis/foto.jpg"
  alt="Descrição"
  width={800}
  height={600}
/>

Serviço de Upload:

import { uploadImovelImage } from '@/services/netlifyUploadService';

const url = await uploadImovelImage(file, imovelId);


📱 Responsividade

Mobile-First Approach

Todos os componentes são desenvolvidos com abordagem mobile-first:

/* Mobile (padrão) */
.component {
  padding: 1rem;
}

/* Tablet */
@media (min-width: 768px) {
  .component {
    padding: 2rem;
  }
}

/* Desktop */
@media (min-width: 1024px) {
  .component {
    padding: 3rem;
  }
}

Breakpoints

const breakpoints = {
  sm: '640px',   // Mobile grande
  md: '768px',   // Tablet
  lg: '1024px',  // Desktop
  xl: '1280px',  // Desktop grande
  '2xl': '1536px' // Ultra-wide
};

🧪 Testes de Componentes

Estrutura de Testes

// __tests__/ImovelCard.test.js
import { render, screen } from '@testing-library/react';
import ImovelCard from '@/components/vitrine/ImovelCard';

describe('ImovelCard', () => {
  it('renderiza o título do imóvel', () => {
    render(<ImovelCard imovel={mockImovel} />);
    expect(screen.getByText('Casa em São Paulo')).toBeInTheDocument();
  });
});

🎯 Boas Práticas

1. Nomenclatura

  • ✅ Componentes em PascalCase: ImovelCard.js
  • ✅ Hooks em camelCase: useImoveis.js
  • ✅ Utilitários em camelCase: formatPrice.js

2. Organização de Imports

// 1. Imports do React/Next
import { useState } from 'react';
import Link from 'next/link';

// 2. Imports de bibliotecas externas
import axios from 'axios';

// 3. Imports de componentes
import ImovelCard from '@/components/vitrine/ImovelCard';

// 4. Imports de utilitários
import { formatPrice } from '@/utils/format';

// 5. Imports de estilos
import styles from './styles.module.css';

3. Performance

  • ✅ Usar React.memo() para componentes puros
  • ✅ Lazy loading de componentes pesados
  • ✅ Debounce em inputs de busca
  • ✅ Virtualização de listas longas

4. Acessibilidade

  • ✅ Usar tags semânticas HTML
  • ✅ Atributos ARIA quando necessário
  • ✅ Suporte a navegação por teclado
  • ✅ Contraste adequado de cores

🚀 Próximos Passos

Melhorias Futuras

  1. Migração para TypeScript
  2. Type safety completo
  3. Melhor autocomplete
  4. Menos bugs em produção

  5. Storybook

  6. Documentação visual de componentes
  7. Testes de UI isolados
  8. Design system

  9. Component Library

  10. Biblioteca de componentes reutilizáveis
  11. Temas customizáveis
  12. Tokens de design

  13. Testes E2E

  14. Cypress ou Playwright
  15. Testes de fluxos completos
  16. CI/CD integrado

📚 Referências


🔗 Documentação Relacionada