Carregando placas...
"use client"; import { useState, useEffect } from 'react'; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import BoardCard from "@/components/BoardCard"; export default function PlacasPage() { const [boards, setBoards] = useState([]); const [filteredBoards, setFilteredBoards] = useState([]); const [headers, setHeaders] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [activeFilters, setActiveFilters] = useState({}); const [filterOptions, setFilterOptions] = useState({}); const excludedColumns = ['Nome', 'Link', 'Imagem']; useEffect(() => { fetchBoards(); }, []); useEffect(() => { applyFilters(); }, [boards, searchTerm, activeFilters]); const fetchBoards = async () => { try { setLoading(true); const response = await fetch('/api/placas'); if (!response.ok) { throw new Error('Erro ao carregar dados das placas'); } const result = await response.json(); setBoards(result.data); setHeaders(result.headers); setFilteredBoards(result.data); generateFilterOptions(result.data, result.headers); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const generateFilterOptions = (data, headers) => { const options = {}; const filterableColumns = headers.filter(h => !excludedColumns.includes(h)); filterableColumns.forEach(column => { const uniqueValues = new Set(); data.forEach(item => { const value = item[column]; if (value && value.toString().trim()) { uniqueValues.add(value.toString().trim()); } }); const values = Array.from(uniqueValues).sort(); // Verificar se é um filtro binário (apenas Sim/Não/Opcional) const binaryValues = ['Sim', 'Não', 'Opcional']; const isBinaryFilter = values.every(v => binaryValues.includes(v)); options[column] = { values: values, isBinary: isBinaryFilter }; }); setFilterOptions(options); }; const applyFilters = () => { let filtered = [...boards]; if (searchTerm) { filtered = filtered.filter(board => { const searchLower = searchTerm.toLowerCase(); return ( board.Nome?.toLowerCase().includes(searchLower) || board.Descrição?.toLowerCase().includes(searchLower) ); }); } Object.keys(activeFilters).forEach(column => { if (activeFilters[column] && activeFilters[column].length > 0) { filtered = filtered.filter(board => { const boardValue = board[column]?.toString().trim(); // Para filtros binários, o valor armazenado é 'binary-enabled' if (activeFilters[column].includes('binary-enabled')) { return boardValue === 'Sim' || boardValue === 'Opcional'; } return activeFilters[column].includes(boardValue); }); } }); setFilteredBoards(filtered); }; const handleFilterToggle = (column, value) => { setActiveFilters(prev => { const newFilters = { ...prev }; if (!newFilters[column]) { newFilters[column] = [value]; } else { const index = newFilters[column].indexOf(value); if (index > -1) { // Remove o valor (criar novo array sem o valor) newFilters[column] = newFilters[column].filter(v => v !== value); if (newFilters[column].length === 0) { delete newFilters[column]; } } else { // Adiciona o valor (criar novo array com o valor) newFilters[column] = [...newFilters[column], value]; } } return newFilters; }); }; const clearFilters = () => { setActiveFilters({}); setSearchTerm(''); }; const activeFilterCount = Object.keys(activeFilters).length + (searchTerm ? 1 : 0); if (loading) { return (
Carregando placas...
Erro ao carregar dados
{error}
Encontre a placa perfeita para o seu projeto
Todos os links são verificados e de fontes confiáveis
{activeFilterCount} filtro(s) ativo(s)
)}{filteredBoards.length} placa(s) encontrada(s)
Nenhuma placa encontrada
Tente ajustar os filtros