"use client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { cn } from "@/lib/utils"; interface CourtOccupancy { courtId: string; courtName: string; availableHours: number; bookedHours: number; occupancyPercent: number; } interface OccupancyChartProps { data: CourtOccupancy[]; isLoading?: boolean; } export function OccupancyChart({ data, isLoading = false }: OccupancyChartProps) { if (isLoading) { return ; } if (data.length === 0) { return ( Ocupacion de Canchas No hay canchas configuradas ); } // Calculate overall occupancy const totalAvailable = data.reduce((sum, c) => sum + c.availableHours, 0); const totalBooked = data.reduce((sum, c) => sum + c.bookedHours, 0); const overallOccupancy = totalAvailable > 0 ? Math.round((totalBooked / totalAvailable) * 100) : 0; return ( Ocupacion de Canchas = 80 ? "text-green-600" : overallOccupancy >= 50 ? "text-blue-600" : "text-primary-600" )} > {overallOccupancy}% total {data.map((court) => ( {court.courtName} {court.bookedHours}h / {court.availableHours}h {/* Available bar (background) */} {/* Booked bar */} = 80 ? "bg-blue-500" : court.occupancyPercent >= 50 ? "bg-blue-400" : "bg-blue-300" )} style={{ width: `${court.occupancyPercent}%` }} > = 80 ? "text-blue-600" : court.occupancyPercent >= 50 ? "text-blue-500" : "text-primary-500" )} > {court.occupancyPercent}% ocupado {court.availableHours - court.bookedHours}h disponible ))} {/* Legend */} Ocupado Disponible ); } // Loading skeleton export function OccupancyChartSkeleton() { return ( {[1, 2, 3].map((i) => ( ))} ); }
No hay canchas configuradas