"use client"; import { useEffect, useState, useMemo } from 'react'; import Link from 'next/link'; import { useToast } from '@/contexts/ToastContext'; import { useConfirm } from '@/contexts/ConfirmContext'; interface Service { id: string; title: string; icon: string; shortDescription: string | null; fullDescription: string | null; active: boolean; order: number; createdAt: string; updatedAt: string; } export default function ServicesList() { const [services, setServices] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [filterStatus, setFilterStatus] = useState(''); const { success, error } = useToast(); const { confirm } = useConfirm(); useEffect(() => { fetchServices(); }, []); const fetchServices = async () => { try { setLoading(true); const response = await fetch('/api/services'); if (!response.ok) { throw new Error('Falha ao carregar serviços'); } const data: Service[] = await response.json(); setServices(data); } catch (err) { console.error('Erro ao carregar serviços:', err); error('Não foi possível carregar os serviços.'); } finally { setLoading(false); } }; // Filtrar serviços const filteredServices = useMemo(() => { return services.filter((service) => { const matchesSearch = !searchTerm || service.title.toLowerCase().includes(searchTerm.toLowerCase()) || service.shortDescription?.toLowerCase().includes(searchTerm.toLowerCase()) || service.fullDescription?.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = !filterStatus || (filterStatus === 'active' && service.active) || (filterStatus === 'inactive' && !service.active); return matchesSearch && matchesStatus; }); }, [services, searchTerm, filterStatus]); const clearFilters = () => { setSearchTerm(''); setFilterStatus(''); }; const hasActiveFilters = searchTerm || filterStatus; const handleDelete = async (id: string) => { const confirmed = await confirm({ title: 'Excluir serviço', message: 'Tem certeza que deseja remover este serviço? Esta ação não pode ser desfeita.', confirmText: 'Excluir', cancelText: 'Cancelar', type: 'danger', }); if (!confirmed) return; try { const response = await fetch(`/api/services/${id}`, { method: 'DELETE' }); const result = await response.json(); if (!response.ok) { throw new Error(result?.error || 'Falha ao excluir serviço'); } success('Serviço excluído com sucesso!'); fetchServices(); } catch (err) { console.error('Erro ao excluir serviço:', err); error('Não foi possível excluir o serviço.'); } }; const formatDate = (value: string | null) => { if (!value) return '—'; try { return new Intl.DateTimeFormat('pt-BR').format(new Date(value)); } catch (err) { return '—'; } }; return (

Serviços

Gerencie os serviços oferecidos pela empresa.

Novo Serviço
{/* Filters Section */}
{/* Search */}
setSearchTerm(e.target.value)} className="w-full px-4 py-2.5 pl-10 rounded-lg border border-gray-200 dark:border-white/10 bg-gray-50 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 && ( )}
{/* Status Filter */}
{/* Clear Filters */} {hasActiveFilters && ( )}
{/* Results count */} {!loading && (
{hasActiveFilters ? ( Exibindo {filteredServices.length} de {services.length} serviços ) : ( {services.length} serviço{services.length !== 1 ? 's' : ''} cadastrado{services.length !== 1 ? 's' : ''} )}
)}
{loading ? (
) : filteredServices.length === 0 ? (
{hasActiveFilters ? ( <> Nenhum serviço encontrado com os filtros aplicados. ) : ( 'Nenhum serviço cadastrado ainda.' )}
) : (
{filteredServices.map((service) => ( ))}
Serviço Descrição Ordem Criado em Status Ações
{service.title}
{service.shortDescription || '—'} {service.order}
{formatDate(service.createdAt)} {new Date(service.createdAt).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}
{service.active ? 'Ativo' : 'Inativo'}
)}
); }