"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { formatCurrency, formatDate, cn } from "@/lib/utils"; interface Membership { id: string; startDate: string; endDate: string; status: "ACTIVE" | "EXPIRED" | "CANCELLED" | "SUSPENDED"; remainingHours: number | null; autoRenew: boolean; isExpiring?: boolean; daysUntilExpiry?: number | null; plan: { id: string; name: string; price: number | string; durationMonths: number; courtHours: number | null; }; client: { id: string; firstName: string; lastName: string; email: string | null; phone: string | null; }; benefitsSummary?: { freeHours: number; hoursRemaining: number; }; } interface MembershipTableProps { memberships: Membership[]; onRenew?: (membership: Membership) => void; onCancel?: (membership: Membership) => void; onViewDetails?: (membership: Membership) => void; isLoading?: boolean; } const statusConfig: Record = { ACTIVE: { label: "Activa", className: "bg-green-100 text-green-700 border-green-300", }, EXPIRED: { label: "Expirada", className: "bg-red-100 text-red-700 border-red-300", }, CANCELLED: { label: "Cancelada", className: "bg-gray-100 text-gray-700 border-gray-300", }, SUSPENDED: { label: "Suspendida", className: "bg-yellow-100 text-yellow-700 border-yellow-300", }, }; export function MembershipTable({ memberships, onRenew, onCancel, onViewDetails, isLoading = false, }: MembershipTableProps) { if (isLoading) { return (

Cargando membresias...

); } if (memberships.length === 0) { return (

No hay membresias

Asigna una membresia a un cliente para comenzar

); } return (
{memberships.map((membership) => { const status = statusConfig[membership.status] || statusConfig.ACTIVE; const hoursTotal = membership.plan.courtHours || membership.benefitsSummary?.freeHours || 0; const hoursRemaining = membership.remainingHours ?? membership.benefitsSummary?.hoursRemaining ?? 0; const hoursUsed = hoursTotal - hoursRemaining; return ( {/* Client */} {/* Plan */} {/* Start Date */} {/* End Date */} {/* Hours Used */} {/* Status */} {/* Actions */} ); })}
Cliente Plan Inicio Fin Horas Usadas Estado Acciones

{membership.client.firstName} {membership.client.lastName}

{membership.client.email || membership.client.phone || "Sin contacto"}

{membership.plan.name} {formatDate(membership.startDate)}

{formatDate(membership.endDate)}

{membership.isExpiring && membership.status === "ACTIVE" && (

Expira en {membership.daysUntilExpiry} dias

)}
{hoursTotal > 0 ? (

{hoursUsed} / {hoursTotal}h

= hoursTotal ? "bg-red-500" : hoursUsed >= hoursTotal * 0.75 ? "bg-yellow-500" : "bg-accent-500" )} style={{ width: `${Math.min((hoursUsed / hoursTotal) * 100, 100)}%` }} />
) : ( - )}
{status.label}
{membership.status === "ACTIVE" && ( <> )} {(membership.status === "EXPIRED" || membership.status === "CANCELLED") && ( )}
); }