"use client"; import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { useLocale } from "@/contexts/LocaleContext"; interface Project { id: string; title: string; category: string; description: string | null; coverImage: string | null; galleryImages: string[]; status: string; client: string | null; completionDate: string | null; createdAt?: string; } const FALLBACK_IMAGE = "https://images.unsplash.com/photo-1616401784845-180882ba9ba8?q=80&w=2070&auto=format&fit=crop"; export default function ProjetosPage() { const { t, locale } = useLocale(); const prefix = locale === 'pt' ? '' : `/${locale}`; const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [selectedCategory, setSelectedCategory] = useState('todos'); const [searchTerm, setSearchTerm] = useState(""); const searchPlaceholder = locale === 'pt' ? 'Pesquisar projetos...' : locale === 'es' ? 'Buscar proyectos...' : 'Search projects...'; useEffect(() => { let isMounted = true; const controller = new AbortController(); const fetchProjects = async () => { try { const response = await fetch('/api/projects', { method: 'GET', cache: 'no-store', credentials: 'same-origin', signal: controller.signal, }); if (!response.ok) { throw new Error(`Falha ao buscar projetos (status ${response.status})`); } const data = await response.json(); if (isMounted && Array.isArray(data)) { const publishedProjects = (data as Project[]) .filter((project) => project.status !== 'Rascunho') .sort((a, b) => { const dateA = a.createdAt ? new Date(a.createdAt).getTime() : 0; const dateB = b.createdAt ? new Date(b.createdAt).getTime() : 0; return dateB - dateA; }); setProjects(publishedProjects); } } catch (err) { if ((err as Error).name !== 'AbortError') { console.error('Erro ao carregar projetos:', err); } } finally { if (isMounted) { setLoading(false); } } }; fetchProjects(); return () => { isMounted = false; controller.abort(); }; }, []); const categories = useMemo(() => { const unique = new Set(); projects.forEach((project) => { if (project.category) { unique.add(project.category); } }); return Array.from(unique); }, [projects]); const filteredProjects = useMemo(() => { return projects.filter((project) => { const matchesCategory = selectedCategory === 'todos' || project.category === selectedCategory; const matchesSearch = !searchTerm || project.title.toLowerCase().includes(searchTerm.toLowerCase()) || project.description?.toLowerCase().includes(searchTerm.toLowerCase()) || project.category?.toLowerCase().includes(searchTerm.toLowerCase()) || project.client?.toLowerCase().includes(searchTerm.toLowerCase()); return matchesCategory && matchesSearch; }); }, [projects, selectedCategory, searchTerm]); return (
{/* Hero Section */}

{t('projects.hero.title')}

{t('projects.hero.subtitle')}

{/* Projects Grid */}
{/* Search Bar */}
setSearchTerm(e.target.value)} className="w-full px-5 py-3 pl-12 rounded-full border border-gray-200 dark:border-white/20 bg-white dark:bg-white/5 text-secondary dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent transition-all" /> {searchTerm && ( )}
{/* Filters */}
{categories.map((category) => ( ))}
{loading ? (
{Array.from({ length: 6 }).map((_, index) => (
))}
) : filteredProjects.length === 0 ? (

{locale === 'pt' ? 'Nenhum projeto encontrado' : locale === 'es' ? 'Ningún proyecto encontrado' : 'No projects found'}

{searchTerm || selectedCategory !== 'todos' ? (locale === 'pt' ? 'Tente ajustar os filtros de busca' : locale === 'es' ? 'Intente ajustar los filtros de búsqueda' : 'Try adjusting your search filters') : (locale === 'pt' ? 'Em breve adicionaremos novos projetos' : locale === 'es' ? 'Pronto agregaremos nuevos proyectos' : 'New projects coming soon')}

{(searchTerm || selectedCategory !== 'todos') && ( )}
) : (
{filteredProjects.map((project) => { const image = project.coverImage || project.galleryImages[0] || FALLBACK_IMAGE; const description = project.description || (locale === 'pt' ? 'Descrição disponível em breve.' : locale === 'es' ? 'Descripción disponible pronto.' : 'Description coming soon.'); return (
{project.category || t('projects.filters.all')}

{project.title}

{project.client || (locale === 'pt' ? 'Cliente confidencial' : locale === 'es' ? 'Cliente confidencial' : 'Confidential client')}

{description}

{t('projects.viewDetails')}
); })}
)} {/* Results Count */} {!loading && filteredProjects.length > 0 && (
{locale === 'pt' ? 'Exibindo' : locale === 'es' ? 'Mostrando' : 'Showing'} {filteredProjects.length} {locale === 'pt' ? 'de' : locale === 'es' ? 'de' : 'of'} {projects.length} {locale === 'pt' ? 'projetos' : locale === 'es' ? 'proyectos' : 'projects'}
)}
); }