import { useMemo } from 'react' import type { ClienteMaestro } from '../services/clientes-maestro' interface Props { datos: ClienteMaestro[] total: number pagina: number limite: number cargando: boolean onPageChange: (pagina: number) => void onExportar: () => void onRowClick?: (cliente: ClienteMaestro) => void } /** Tabla paginada de clientes maestro con dark mode completo */ export function ClientesMaestroTable({ datos, total, pagina, limite, cargando, onPageChange, onExportar, onRowClick }: Props) { const totalPaginas = Math.ceil(total / limite) const inicio = (pagina - 1) * limite + 1 const fin = Math.min(pagina * limite, total) const paginasVisibles = useMemo(() => { const paginas: number[] = [] const start = Math.max(1, pagina - 2) const end = Math.min(totalPaginas, pagina + 2) for (let i = start; i <= end; i++) paginas.push(i) return paginas }, [pagina, totalPaginas]) const formatCurrency = (v: number | null) => { if (v == null) return 'β€”' return new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN', maximumFractionDigits: 0 }).format(v) } return (
{/* Toolbar */}

{total > 0 ? ( <> Mostrando {inicio}–{fin} de{' '} {total.toLocaleString()} clientes ) : ( 'Sin resultados' )}

{/* Loading skeleton */} {cargando ? (
{Array.from({ length: 10 }).map((_, i) => (
))}
) : datos.length === 0 ? (

No hay clientes para mostrar.

) : ( <> {/* Mobile: cards */}
{datos.map((c) => (

{c.nombre} {c.apellidoPaterno} {c.apellidoMaterno ?? ''}

{c.estatus && ( {c.estatus} )}

#{c.numCliente}

{c.telefono && πŸ“ž {c.telefono}} {c.email && βœ‰οΈ {c.email}} {c.desarrollo && 🏠 {c.desarrollo}} {c.valorTotal != null && πŸ’° {formatCurrency(c.valorTotal)}} {c.vendedor && πŸ‘€ {c.vendedor}}
))}
{/* Desktop: table */}
{datos.map((c) => ( onRowClick?.(c)}> ))}
# Nombre completo TelΓ©fono Email Desarrollo Estatus Valor Vendedor
{c.numCliente} {c.nombre} {c.apellidoPaterno} {c.apellidoMaterno ?? ''} {c.telefono ?? 'β€”'} {c.email ?? 'β€”'} {c.desarrollo ?? 'β€”'} {c.estatus ? ( {c.estatus} ) : ( β€” )} {formatCurrency(c.valorTotal)} {c.vendedor ?? 'β€”'}
{/* Pagination */} {totalPaginas > 1 && (
{paginasVisibles[0]! > 1 && …} {paginasVisibles.map((p) => ( ))} {paginasVisibles[paginasVisibles.length - 1]! < totalPaginas && ( … )}
)} )}
) }