import React, { useState } from 'react'; import { Search, Plus, User, Briefcase, Pencil, X, Sparkles, Trash2 } from 'lucide-react'; import { Client, Service } from '../types'; import { useToast } from '../contexts/ToastContext'; import { CustomSelect } from './CustomSelect'; interface ManagementViewProps { type: 'clients' | 'services'; clientsData: Client[]; setClientsData: (data: Client[]) => void; servicesData: Service[]; setServicesData: (data: Service[]) => void; } // --- MODAIS --- const ClientModal: React.FC<{ isOpen: boolean; onClose: () => void; client: Client | null; onSave: (client: Client) => void }> = ({ isOpen, onClose, client, onSave }) => { const [formData, setFormData] = useState>( client || { name: '', company: '', email: '', phone: '', address: '', status: 'active', value: 0 } ); React.useEffect(() => { if (client) setFormData(client); else setFormData({ name: '', company: '', email: '', phone: '', address: '', status: 'active', value: 0 }); }, [client]); if (!isOpen) return null; const inputClass = "w-full p-3 bg-white border border-slate-200 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none text-slate-700 text-sm transition-all shadow-sm placeholder:text-slate-400"; const labelClass = "block text-xs font-bold text-slate-600 mb-1.5 uppercase tracking-wide"; return (

{client ? 'Editar Cliente' : 'Novo Cliente'}

setFormData({...formData, name: e.target.value})} className={inputClass} placeholder="Ex: João Silva"/>
setFormData({...formData, company: e.target.value})} className={inputClass} placeholder="Ex: Empresa X"/>
setFormData({...formData, email: e.target.value})} className={inputClass} />
setFormData({...formData, phone: e.target.value})} className={inputClass} />
); }; const ServiceModal: React.FC<{ isOpen: boolean; onClose: () => void; service: Service | null; onSave: (service: Service) => void }> = ({ isOpen, onClose, service, onSave }) => { const [formData, setFormData] = useState>( service || { name: '', category: 'Consultoria', price: 0, active: true, description: '', billingType: 'one-time' } ); React.useEffect(() => { if (service) setFormData(service); else setFormData({ name: '', category: 'Consultoria', price: 0, active: true, description: '', billingType: 'one-time' }); }, [service]); if (!isOpen) return null; const inputClass = "w-full p-3 bg-white border border-slate-200 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none text-slate-700 text-sm transition-all shadow-sm placeholder:text-slate-400"; const labelClass = "block text-xs font-bold text-slate-600 mb-1.5 uppercase tracking-wide"; return (

{service ? 'Editar Serviço' : 'Novo Serviço'}

setFormData({...formData, name: e.target.value})} className={inputClass} placeholder="Ex: Consultoria SEO"/>
setFormData({...formData, price: Number(e.target.value)})} className={inputClass} />
setFormData({...formData, billingType: val})} options={[ { value: 'one-time', label: 'Pontual (Única)' }, { value: 'recurring', label: 'Assinatura (Mensal)' } ]} />
setFormData({...formData, category: val})} options={[ { value: 'Consultoria', label: 'Consultoria' }, { value: 'TI', label: 'TI / Desenvolvimento' }, { value: 'Marketing', label: 'Marketing / Design' }, { value: 'Outro', label: 'Outro' } ]} />
); }; export const ManagementView: React.FC = ({ type, clientsData, setClientsData, servicesData, setServicesData }) => { const { addToast } = useToast(); const [isClientModalOpen, setIsClientModalOpen] = useState(false); const [editingClient, setEditingClient] = useState(null); const [isServiceModalOpen, setIsServiceModalOpen] = useState(false); const [editingService, setEditingService] = useState(null); const [searchTerm, setSearchTerm] = useState(''); // --- SERVICE ACTIONS --- const handleSaveService = (serviceData: Service) => { if (!serviceData.name || serviceData.price < 0) { addToast({ type: 'warning', title: 'Dados Inválidos', message: 'Verifique o nome e o preço.' }); return; } if (editingService) { setServicesData(servicesData.map(s => s.id === serviceData.id ? serviceData : s)); addToast({ type: 'success', title: 'Serviço Atualizado' }); } else { const newService = { ...serviceData, id: Math.random().toString(36).substr(2, 9) }; setServicesData([...servicesData, newService]); addToast({ type: 'success', title: 'Serviço Criado' }); } setIsServiceModalOpen(false); setEditingService(null); }; const handleDeleteService = (id: string) => { if (window.confirm('Excluir este serviço?')) { setServicesData(servicesData.filter(s => s.id !== id)); addToast({ type: 'info', title: 'Serviço Removido' }); } }; // --- CLIENT ACTIONS --- const handleSaveClient = (clientData: Client) => { if (!clientData.name) { addToast({ type: 'warning', title: 'Nome Obrigatório' }); return; } if(editingClient) { setClientsData(clientsData.map(c => c.id === clientData.id ? clientData : c)); addToast({ type: 'success', title: 'Cliente Atualizado' }); } else { setClientsData([...clientsData, {...clientData, id: Math.random().toString().substr(2, 9)}]); addToast({ type: 'success', title: 'Cliente Cadastrado' }); } setIsClientModalOpen(false); setEditingClient(null); }; const handleDeleteClient = (id: string) => { if (window.confirm('Excluir este cliente?')) { setClientsData(clientsData.filter(c => c.id !== id)); addToast({ type: 'info', title: 'Cliente Removido' }); } }; // --- FILTERING --- const filteredServices = servicesData.filter(s => s.name.toLowerCase().includes(searchTerm.toLowerCase()) || s.category.toLowerCase().includes(searchTerm.toLowerCase())); const filteredClients = clientsData.filter(c => c.name.toLowerCase().includes(searchTerm.toLowerCase()) || c.company.toLowerCase().includes(searchTerm.toLowerCase())); return (
setIsClientModalOpen(false)} client={editingClient} onSave={handleSaveClient} /> setIsServiceModalOpen(false)} service={editingService} onSave={handleSaveService} />

{type === 'clients' ? 'Base de Clientes (Legado)' : 'Catálogo de Serviços'}

{type === 'clients' ? 'Gestão simples de contatos.' : 'Gerencie preços e portfólio.'}

{/* Toolbar */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2.5 bg-slate-50 border-none rounded-xl focus:ring-2 focus:ring-primary-500 outline-none text-slate-600" />
{/* Table Content */}
{type === 'services' && filteredServices.map(service => ( ))} {type === 'clients' && filteredClients.map(client => ( ))}
{type === 'clients' ? 'Nome / Empresa' : 'Serviço'} {type === 'clients' ? 'Contato' : 'Preço'} {type === 'clients' ? 'Status' : 'Tipo / Categoria'}
{service.name}
{service.description &&
{service.description}
}
R$ {service.price.toLocaleString('pt-BR')}
{service.billingType === 'recurring' ? 'Assinatura' : 'Pontual'} {service.category}
{client.name}
{client.company}
{client.email}
{client.phone}
Ativo
{/* Empty State */} {((type === 'services' && filteredServices.length === 0) || (type === 'clients' && filteredClients.length === 0)) && (

Nenhum registro encontrado.

)}
); };