"use client"; import { useState, useEffect, useMemo } from "react"; const FILTER_CATEGORIES = [ { id: "All", name: "Todos", color: "#64748b" }, { id: "Ground", name: "Terra (GND)", color: "#64748b" }, { id: "Power", name: "Alimentação", color: "#ef4444" }, { id: "RTC", name: "RTC", color: "#f59e0b" }, { id: "GPIO", name: "GPIO", color: "#22c55e" }, { id: "ADC", name: "ADC", color: "#ec4899" }, { id: "DAC", name: "DAC", color: "#a855f7" }, { id: "Touch", name: "Touch", color: "#06b6d4" }, { id: "UART", name: "UART", color: "#3b82f6" }, { id: "SPI", name: "SPI", color: "#ef4444" }, { id: "I2C", name: "I2C", color: "#10b981" }, { id: "PWM", name: "PWM", color: "#f97316" }, { id: "USB", name: "USB", color: "#8b5cf6" }, { id: "Clock", name: "Clock", color: "#eab308" }, { id: "JTAG", name: "JTAG", color: "#8b5cf6" }, { id: "Strapping", name: "Inicialização", color: "#dc2626" }, ]; export default function ConnectionsDiagram({ connections, color }) { const [activeFilter, setActiveFilter] = useState("All"); const [selectedConnection, setSelectedConnection] = useState(null); const [hoveredConnection, setHoveredConnection] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [viewMode, setViewMode] = useState("grid"); // 'grid' or 'list' const [showTooltip, setShowTooltip] = useState(null); const isConnectionVisible = (connection) => { const matchesFilter = activeFilter === "All" || connection.categorias.includes(activeFilter); const matchesSearch = searchQuery === "" || connection.nome.toLowerCase().includes(searchQuery.toLowerCase()) || connection.numero.toString().toLowerCase().includes(searchQuery.toLowerCase()); return matchesFilter && matchesSearch; }; const getCategoryColor = (category) => { const filter = FILTER_CATEGORIES.find((f) => f.id === category); return filter?.color || "#64748b"; }; const visibleConnections = useMemo(() => { return connections.filter(isConnectionVisible); }, [connections, activeFilter, searchQuery]); const activeCategories = useMemo(() => { if (activeFilter === "All") return []; return FILTER_CATEGORIES.filter(cat => visibleConnections.some(conn => conn.categorias.includes(cat.id)) ); }, [visibleConnections, activeFilter]); useEffect(() => { const handleEscape = (e) => { if (e.key === "Escape") { setSelectedConnection(null); setShowTooltip(null); } }; if (selectedConnection) { document.addEventListener("keydown", handleEscape); document.body.style.overflow = "hidden"; } return () => { document.removeEventListener("keydown", handleEscape); document.body.style.overflow = "unset"; }; }, [selectedConnection]); useEffect(() => { const handleKeyDown = (e) => { if (selectedConnection) return; if (e.key === "Tab") { const buttons = document.querySelectorAll('[data-connection-button]'); const currentIndex = Array.from(buttons).findIndex(btn => btn === document.activeElement); if (e.shiftKey && currentIndex > 0) { e.preventDefault(); buttons[currentIndex - 1].focus(); } else if (!e.shiftKey && currentIndex < buttons.length - 1) { e.preventDefault(); buttons[currentIndex + 1].focus(); } } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [selectedConnection]); if (!connections || connections.length === 0) { return (

Diagrama de conexões indisponível

Este modelo ainda não possui dados de conexão

); } return (

📍 Diagrama de Conexões Interativo

Explore as conexões do ESP32. Use a busca, filtros por função ou passe o mouse para ver detalhes rápidos.

setSearchQuery(e.target.value)} className="w-full pl-12 pr-4 py-3 rounded-xl border-2 border-gray-200 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 transition-all outline-none text-gray-700" aria-label="Search connections" /> {searchQuery && ( )}

Filtre por Função

{visibleConnections.length} de {connections.length}
{FILTER_CATEGORIES.map((filter) => { const isActive = activeFilter === filter.id; const count = connections.filter(c => filter.id === "All" ? true : c.categorias.includes(filter.id) ).length; return ( ); })}
{activeFilter !== "All" && activeCategories.length > 0 && (

Categorias visíveis:

{activeCategories.map(cat => ( {cat.name} ))}
)}
{visibleConnections.length === 0 ? (

Nenhuma conexão encontrada

Tente ajustar os filtros ou termo de busca

) : viewMode === "grid" ? (
{visibleConnections.map((connection, index) => { const isHovered = hoveredConnection === index; const connectionId = `connection-${index}`; return (
{showTooltip === index && ( )}
); })}
) : (
{visibleConnections.map((connection, index) => ( setSelectedConnection(connection)} className="hover:bg-gray-50 cursor-pointer transition-colors group" > ))}
Pin Nome Categorias Funções Status
{typeof connection.numero === "number" ? connection.numero : connection.numero.substring(0, 4)}
{connection.nome}
{connection.categorias.map((cat) => ( {cat === "Strapping" ? "Inicialização" : cat} ))}
{connection.funcoes.join(", ")}
{connection.restricoes ? ( Atenção ) : ( OK )}
)} {connections.some(c => c.restricoes) && (

Informações Importantes

  • • Conexões com ícones de aviso possuem restrições de uso. Clique para mais detalhes.
  • • Sempre consulte o datasheet oficial antes de usar conexões com funções especiais.
)} {selectedConnection && (
setSelectedConnection(null)} role="dialog" aria-modal="true" aria-labelledby="modal-title" >
e.stopPropagation()} >
{typeof selectedConnection.numero === "number" ? selectedConnection.numero : selectedConnection.numero.substring(0, 4)}

Conexão {selectedConnection.numero}

Categorias

{selectedConnection.categorias.map((cat) => ( {cat === "Strapping" ? "Inicialização" : cat} ))}

Funções da Conexão

    {selectedConnection.funcoes.map((func, index) => (
  • {func}
  • ))}
{selectedConnection.restricoes && (

Alertas Importantes

{selectedConnection.restricoes}

)}
)}

Sobre a Matriz de Conexões Flexível

O ESP32 possui uma matriz de conexões flexível que permite mapear diversas funções para múltiplos pinos. Isso significa que muitas conexões podem ser configuradas para desempenhar diferentes papéis, dependendo das necessidades do seu projeto. Consulte a documentação oficial para entender como aproveitar ao máximo essa flexibilidade.

); }