"use client"; import { useState, useEffect } from 'react'; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import PageHero from "@/components/PageHero"; import BoardCard from "@/components/BoardCard"; import { AlertTriangle, RefreshCw, Search, ShoppingCart, SlidersHorizontal } from "lucide-react"; 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 [filtrosAbertos, setFiltrosAbertos] = useState(false); const excludedColumns = ['Nome', 'Descrição', 'Link', 'Imagem', 'Loja Oficial']; useEffect(() => { fetchBoards(); // No desktop os filtros ficam sempre à vista; no celular começam recolhidos. setFiltrosAbertos(window.matchMedia('(min-width: 1024px)').matches); }, []); 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 newFilters[column] = newFilters[column].filter(v => v !== value); if (newFilters[column].length === 0) { delete newFilters[column]; } } else { // Adiciona o valor newFilters[column] = [...newFilters[column], value]; } } return newFilters; }); }; const clearFilters = () => { setActiveFilters({}); setSearchTerm(''); }; const activeFilterCount = Object.keys(activeFilters).length + (searchTerm ? 1 : 0); const filterableColumns = headers.filter((h) => !excludedColumns.includes(h)); const hero = ( ); if (loading) { return (
{hero}
{Array.from({ length: 6 }).map((_, i) => (
))}

Consultando o banco de placas…

); } if (error) { return (
{hero}
); } const filtros = (
{filterableColumns.map((column) => { const filterData = filterOptions[column]; if (!filterData) return null; if (filterData.isBinary) { return ( ); } return (
{column} {activeFilters[column]?.length > 0 && {activeFilters[column].length}}
{filterData.values.map((option) => ( ))}
); })}
); return (
{hero}

{filteredBoards.length}{" "} {filteredBoards.length === 1 ? "placa encontrada" : "placas encontradas"}

{filteredBoards.length === 0 ? (
) : (
{filteredBoards.map((board, index) => ( ))}
)}
); }