import { useCallback, useEffect, useMemo, useState } from 'react' import { getContactos, type Contacto } from '../services/api' import { ModalContacto } from './ModalContacto' import { SkeletonList } from "./Skeleton" import toast from "react-hot-toast" interface Props { onVolver: () => void } /** * Vista interna "Contactos": lista del tablero Contactos de Monday (lo más * reciente primero). Vive dentro de la landing (no hay router); se abre desde * la tarjeta Contactos del grid. Click en un contacto → modal con toda su * información, propiedad, quién lo atiende e historial de atención. */ export function VistaContactos({ onVolver }: Props) { const [contactos, setContactos] = useState(null) const [cargando, setCargando] = useState(true) const [error, setError] = useState('') const [seleccionado, setSeleccionado] = useState(null) const [busqueda, setBusqueda] = useState('') /** Contactos filtrados por texto de búsqueda */ const contactosFiltrados = useMemo(() => { if (!contactos) return null if (busqueda.trim() === '') return contactos const q = busqueda.toLowerCase() return contactos.filter( (c) => c.nombre.toLowerCase().includes(q) || (c.email && c.email.toLowerCase().includes(q)) || (c.telefono && c.telefono.includes(q)), ) }, [contactos, busqueda]) const cargar = useCallback(() => { setCargando(true) setError('') getContactos() .then(setContactos) .catch(() => { toast.error("No se pudieron cargar los contactos."); setError("No se pudieron cargar los contactos."); }) .finally(() => setCargando(false)) }, []) useEffect(() => cargar(), [cargar]) return (

Contactos

{cargando ? ( ) : error ? (

{error}

) : !contactos || contactos.length === 0 ? (

No hay contactos para mostrar.

) : ( <>
setBusqueda(e.target.value)} className="w-full rounded-lg border border-[#D1D5DB] bg-white px-4 dark:border-[#334155] dark:bg-[#0F172A] dark:text-[#E2E8F0] py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20" />
{contactosFiltrados && contactosFiltrados.length === 0 ? (

Sin resultados para “{busqueda}”

) : ( <> {/* Mobile: cards */}
{contactosFiltrados?.map((contacto) => ( ))}
{/* Desktop: table-style list */}
    {contactosFiltrados?.map((contacto) => (
  • ))}
)} )}
{seleccionado && ( setSeleccionado(null)} /> )}
) }