import React, { useState, useEffect } from 'react';
import { Filter, MessageSquare, UserPlus, CheckCircle, X, Loader2, Plus, ChevronDown } from 'lucide-react';
import { HybridBackend } from '../services/backend.ts';
import { Lead, Dentista } from '../types.ts';
import { useHybridBackend } from '../hooks/useHybridBackend.ts';
import { useToast } from '../contexts/ToastContext.tsx';
const LoadingSpinner = () => (
);
const ErrorDisplay = ({ error }: { error: Error }) => (
ERRO AO CARREGAR LEADS: {error.message}
);
const NovoLeadModal: React.FC<{ onClose: () => void; onSaved: () => void }> = ({ onClose, onSaved }) => {
const toast = useToast();
const [form, setForm] = useState({ nome: '', sobrenome: '', whatsapp: '', tipoInteresse: 'Particular' });
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };
document.addEventListener('keydown', handleKeyDown);
return () => document.removeEventListener('keydown', handleKeyDown);
}, [onClose]);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!form.nome || !form.whatsapp) {
toast.error('PREENCHA NOME E WHATSAPP.');
return;
}
try {
await HybridBackend.saveLead({
...form,
status: 'Novo',
dataCadastro: new Date().toISOString(),
} as any);
toast.success('LEAD CADASTRADO!');
onSaved();
onClose();
} catch {
toast.error('ERRO AO CADASTRAR LEAD.');
}
};
return (
);
};
import { PageHeader } from '../components/PageHeader.tsx';
export const LeadsView: React.FC = () => {
const { data: leads, isLoading, error, refresh } = useHybridBackend(HybridBackend.getLeads);
const { data: dentistas } = useHybridBackend(HybridBackend.getDentistas);
const [isConvertModalOpen, setIsConvertModalOpen] = useState(false);
const [isNovoLeadOpen, setIsNovoLeadOpen] = useState(false);
const [selectedLead, setSelectedLead] = useState(null);
const [filterStatus, setFilterStatus] = useState('TODOS');
const [isFilterOpen, setIsFilterOpen] = useState(false);
const toast = useToast();
// Effect to handle Esc key to close modal
useEffect(() => {
if (!isConvertModalOpen) return;
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
setIsConvertModalOpen(false);
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [isConvertModalOpen]);
const handleConvert = async (e: React.FormEvent) => {
e.preventDefault();
if (!selectedLead) return;
try {
// Mocking the conversion as the backend method is not yet implemented
toast.info(`FUNCIONALIDADE DE CONVERSÃO PARA ${selectedLead.nome} EM DESENVOLVIMENTO.`);
setIsConvertModalOpen(false);
// In a real scenario, this would create a patient and an appointment
} catch {
toast.error("FALHA AO CONVERTER LEAD.");
}
};
const filterOptions = ['TODOS', 'NOVO', 'CONVERTIDO'];
const filteredLeads = leads?.filter(lead => {
if (filterStatus === 'TODOS') return true;
return lead.status?.toUpperCase() === filterStatus;
});
return (
{/* Filter Dropdown */}
{isFilterOpen && (
{filterOptions.map(opt => (
))}
)}
{/* New Lead Button */}
{isLoading &&
}
{error &&
}
{filteredLeads && filteredLeads.map(lead => (
{lead.status === 'Novo' && (
)}
{lead.nome} {lead.sobrenome}
{lead.whatsapp}
{lead.tipoInteresse}
CADASTRADO EM: {new Date(lead.dataCadastro).toLocaleDateString()}
{lead.status !== 'Convertido' ? (
) : (
CONVERTIDO
)}
))}
{filteredLeads?.length === 0 && !isLoading && (
NENHUM LEAD ENCONTRADO.
)}
{isConvertModalOpen && selectedLead && (
CONVERTER LEAD
)}
{isNovoLeadOpen && (
setIsNovoLeadOpen(false)} onSaved={refresh} />
)}
);
};