'use client';
import React, { useEffect } from 'react';
import { GroupRideSummary } from './types';
interface RideDetailsModalProps {
isOpen: boolean;
ride: GroupRideSummary | null;
onClose: () => void;
onEdit?: (ride: GroupRideSummary) => void;
onRequestSlot?: (rideId: string) => void;
}
export function RideDetailsModal({
isOpen,
ride,
onClose,
onEdit,
onRequestSlot,
}: RideDetailsModalProps) {
useEffect(() => {
function handleKeyDown(e: KeyboardEvent) {
if (e.key === 'Escape') onClose();
}
if (isOpen) {
document.addEventListener('keydown', handleKeyDown);
}
return () => document.removeEventListener('keydown', handleKeyDown);
}, [isOpen, onClose]);
if (!isOpen || !ride) return null;
const isFull = ride.participantCount >= ride.participantLimit;
const isJoined = ride.userStatus === 'joined' || ride.isOrganizer;
return (
{
if (e.target === e.currentTarget) onClose();
}}
>
{/* Header */}
sports_motorsports
{ride.title}
{ride.discipline || 'Sport / Canyon'} • {ride.paceClassification}
{/* Status & Code Row */}
Status:
{ride.status || 'scheduled'}
{ride.rideCode && (
Code:
{ride.rideCode}
)}
{/* Detailed Metadata Grid */}
Date & Time:
{ride.scheduledDate} • {ride.scheduledTime}
Region:
{ride.region}
Total Distance:
{ride.distance}
Formation Profile:
{ride.formationProfile}
Rider Roster:
{ride.participantCount} / {ride.participantLimit} Riders
Road Captain / Lead:
{ride.leadHandle}
{/* Meeting Point */}
Meeting Point & Rally Location
{ride.meetingPoint}
{/* Route Preview Snippet */}
Route Preview Waypoints
{ride.routeSnippet || 'Waypoints synchronized via MotorSignal GNSS Multi-Band Mesh.'}
{/* Description & Safety Briefing */}
Briefing & Safety Protocol
{ride.description}
{/* Footer Actions */}
{ride.isOrganizer && onEdit && (
)}
{!ride.isOrganizer && !isJoined && onRequestSlot && !isFull && (
)}
);
}