import type { FC } from 'react'; import { useEffect, useState, useCallback } from 'react'; import { Search, FolderClock, FileText, Images, StickyNote } from 'lucide-react'; import Layout from '../components/Layout'; import PatientAdjuntos from '../components/PatientAdjuntos'; import { Card, Button, Input, Select, TextArea, Modal, EmptyState, MobileCard, PageHeader, Skeleton, toast, } from '../components/ui'; import { odooApi, type ExpedienteReciente, type Doctor } from '../services/odoo'; const UltimasVisitas: FC = () => { const [expedientes, setExpedientes] = useState([]); const [loading, setLoading] = useState(true); const [recencia, setRecencia] = useState<'' | '6m' | '6m_plus'>(''); const [onlyVip, setOnlyVip] = useState(false); const [doctorFilter, setDoctorFilter] = useState(''); const [doctors, setDoctors] = useState([]); const [search, setSearch] = useState(''); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const [totalPages, setTotalPages] = useState(0); const [modalAdjuntos, setModalAdjuntos] = useState<{ patient: ExpedienteReciente; kind: 'expediente' | 'imagen' } | null>(null); const [modalNotas, setModalNotas] = useState(null); const [notas, setNotas] = useState(''); const [savingNotas, setSavingNotas] = useState(false); const load = useCallback(async () => { try { setLoading(true); const params: Record = { page, page_size: 50 }; if (recencia) { params.recencia = recencia; } else { // Sin chip de recencia: todos los pacientes con visita, más reciente primero params.date_from = 'todas'; } if (onlyVip) params.vip = '1'; if (doctorFilter) params.doctor_id = doctorFilter; if (search) params.search = search; const res = await odooApi.getExpedientesRecientes(params); if (res.status === 'success') { setExpedientes(res.expedientes); setTotal(res.total ?? 0); setTotalPages(res.total_pages ?? 0); } } catch (err) { toast.error('Error al cargar expedientes'); console.error(err); } finally { setLoading(false); } }, [recencia, onlyVip, doctorFilter, search, page]); useEffect(() => { setPage(1); }, [recencia, onlyVip, doctorFilter, search]); useEffect(() => { load(); }, [load]); useEffect(() => { odooApi.getDoctors() .then((res) => { if (res.status === 'success') setDoctors(res.doctors); }) .catch(() => {}); }, []); const openNotas = (p: ExpedienteReciente) => { setModalNotas(p); setNotas(p.internal_notes || ''); }; const saveNotas = async () => { if (!modalNotas) return; try { setSavingNotas(true); await odooApi.updatePatient(modalNotas.id, { internal_notes: notas }); toast.success('Notas actualizadas'); setModalNotas(null); await load(); } catch (err) { toast.error('Error al guardar notas'); console.error(err); } finally { setSavingNotas(false); } }; return (
setSearch(e.target.value)} className="pl-10" />
{/* Filtros rápidos */}
{([ { key: '6m', label: 'Visita últimos 6 meses' }, { key: '6m_plus', label: '+6 meses sin visita' }, ] as const).map((chip) => ( ))}