You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
TypeScript
69 lines
2.1 KiB
TypeScript
import Link from 'next/link';
|
|
import { getCourtColor } from '../utils/bookingUtils';
|
|
import { SlotStatus } from '../lib/types';
|
|
import useTranslation from '../hooks/useTranslation';
|
|
|
|
interface CourtCardHeaderProps {
|
|
courtName?: string;
|
|
timeDisplay?: string;
|
|
playerCount: number;
|
|
status: SlotStatus | string;
|
|
players?: any[];
|
|
isOngoing?: boolean;
|
|
linkHref?: string;
|
|
viewMode?: 'timeline' | 'court';
|
|
}
|
|
|
|
export default function CourtCardHeader({
|
|
courtName,
|
|
timeDisplay,
|
|
playerCount,
|
|
status,
|
|
players = [],
|
|
isOngoing = false,
|
|
linkHref,
|
|
viewMode = 'timeline'
|
|
}: CourtCardHeaderProps) {
|
|
const { t } = useTranslation();
|
|
|
|
const displayText = viewMode === 'timeline' ? courtName : timeDisplay;
|
|
|
|
return (
|
|
<div className="relative p-4 bg-gradient-to-br from-white via-slate-50/30 to-slate-100/20">
|
|
<div className="flex items-center justify-between">
|
|
{/* Court name or time on the left */}
|
|
{linkHref ? (
|
|
<Link
|
|
href={linkHref}
|
|
className="text-lg font-bold text-slate-800 hover:text-slate-600 transition-colors duration-300"
|
|
>
|
|
{displayText}
|
|
</Link>
|
|
) : (
|
|
<span className="text-lg font-bold text-slate-800">
|
|
{displayText}
|
|
</span>
|
|
)}
|
|
|
|
{/* Player count with status indicator in center */}
|
|
<div className="flex items-center space-x-2">
|
|
<div
|
|
className={`w-2 h-2 rounded-full ${isOngoing ? 'animate-pulse' : ''}`}
|
|
style={{ backgroundColor: getCourtColor(players, status as SlotStatus) }}
|
|
></div>
|
|
<span className="text-sm text-slate-600 font-medium">
|
|
{t('{count}/4 players', { count: String(playerCount) })}
|
|
</span>
|
|
</div>
|
|
|
|
{/* Status badge on the right */}
|
|
<span
|
|
className="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold text-white shadow-sm"
|
|
style={{ backgroundColor: getCourtColor(players, status as SlotStatus) }}
|
|
>
|
|
{t(status as 'available' | 'pending' | 'booked' | 'coach')}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
);
|
|
} |