import React, { useState, useEffect, useCallback } from 'react'; import { CalendarClock, RefreshCw, Building2, Truck, PackageCheck, CheckCircle2, MapPin, User } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { useToast } from '../contexts/ToastContext.tsx'; import { PageHeader } from '../components/PageHeader.tsx'; const dataHoraBR = (d: string) => { if (!d) return 'Sem data'; const x = new Date(d); return isNaN(x.getTime()) ? d : x.toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }); }; const diaBR = (d: string) => { if (!d) return 'Sem data'; const x = new Date(d); return isNaN(x.getTime()) ? d : x.toLocaleDateString('pt-BR', { weekday: 'short', day: '2-digit', month: 'short' }); }; // Agenda do laboratório: coletas (lab busca) e entregas (lab leva) agendadas. export const LabAgendaView: React.FC = () => { const toast = useToast(); const [lista, setLista] = useState([]); const [loading, setLoading] = useState(false); const [busy, setBusy] = useState(''); const carregar = useCallback(async () => { setLoading(true); try { const r = await HybridBackend.getLabAgenda(); setLista(Array.isArray(r) ? r : []); } catch { /* silent */ } finally { setLoading(false); } }, []); useEffect(() => { carregar(); }, [carregar]); const acao = async (id: string, status: 'realizada' | 'cancelada') => { setBusy(id); try { await HybridBackend.statusColeta(id, status); toast.success(status === 'realizada' ? 'MARCADA COMO REALIZADA.' : 'CANCELADA.'); carregar(); } catch (e: any) { toast.error((e.message || 'ERRO').toUpperCase()); } finally { setBusy(''); } }; // agrupa por dia (data_hora) const grupos: Record = {}; for (const c of lista.filter(x => x.status === 'agendada')) { const k = (c.data_hora || '').slice(0, 10) || 'sem-data'; (grupos[k] = grupos[k] || []).push(c); } const realizadas = lista.filter(x => x.status === 'realizada').slice(0, 10); const Card: React.FC<{ c: any }> = ({ c }) => { const coleta = c.tipo === 'coleta'; return (
{coleta ? : }
{coleta ? 'Coleta' : 'Entrega'} {dataHoraBR(c.data_hora)}

{c.os_tipo} {c.paciente_nome ? · {c.paciente_nome} : ''}

{c.clinica_nome || 'Clínica'}

{c.endereco &&

{c.endereco}

} {c.responsavel &&

{c.responsavel}

} {c.status === 'agendada' && (
)}
); }; return (
{loading ?
: lista.filter(x => x.status === 'agendada').length === 0 && realizadas.length === 0 ?
Nenhuma coleta ou entrega agendada.
: (
{Object.keys(grupos).sort().map(dia => (

{dia === 'sem-data' ? 'Sem data' : diaBR(grupos[dia][0].data_hora)}

{grupos[dia].map(c => )}
))} {realizadas.length > 0 && (

Realizadas (recentes)

{realizadas.map(c => )}
)}
)}
); };