'use client'; import React, { useState, useEffect } from 'react'; import { GroupRideSummary } from './types'; interface CreateRideModalProps { isOpen: boolean; onClose: () => void; onCreateRide: (ride: GroupRideSummary) => void | Promise; } export function CreateRideModal({ isOpen, onClose, onCreateRide }: CreateRideModalProps) { const [title, setTitle] = useState(''); const [region, setRegion] = useState(''); const [scheduledDate, setScheduledDate] = useState('Saturday'); const [scheduledTime, setScheduledTime] = useState('07:00 AM PST'); const [paceClassification, setPaceClassification] = useState('Brisk Pace'); const [discipline, setDiscipline] = useState>('Sport / Canyon'); const [joinPolicy, setJoinPolicy] = useState('requestToJoin'); const [formationProfile, setFormationProfile] = useState('Staggered Dual Column [B]'); const [distance, setDistance] = useState('50.0 Miles'); const [meetingPoint, setMeetingPoint] = useState(''); const [routeSnippet, setRouteSnippet] = useState('Skyline Blvd > Stage Rd > PCH Pacific Coast Hwy'); const [participantLimit, setParticipantLimit] = useState(12); const [description, setDescription] = useState(''); const [errorMsg, setErrorMsg] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); // Reset form when modal opens useEffect(() => { if (isOpen) { setTitle(''); setRegion(''); setScheduledDate('Saturday'); setScheduledTime('07:00 AM PST'); setPaceClassification('Brisk Pace'); setDiscipline('Sport / Canyon'); setJoinPolicy('requestToJoin'); setFormationProfile('Staggered Dual Column [B]'); setDistance('50.0 Miles'); setMeetingPoint(''); setRouteSnippet('Skyline Blvd > Stage Rd > PCH Pacific Coast Hwy'); setParticipantLimit(12); setDescription(''); setErrorMsg(null); setIsSubmitting(false); } }, [isOpen]); // Handle ESC key press useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { onClose(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [isOpen, onClose]); if (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // Prevent duplicate submissions while a create is in flight. if (isSubmitting) return; if (!title.trim()) { setErrorMsg('Please enter a ride title.'); return; } if (!region.trim()) { setErrorMsg('Please enter a location or region.'); return; } const newRide: GroupRideSummary = { id: `ride-${Date.now()}`, title: title.trim(), description: description.trim() || 'Custom squadron pack run with MotorSignal live telemetry.', region: region.trim(), scheduledDate, scheduledTime, paceClassification, discipline, formationProfile, joinPolicy, leadHandle: 'You (Organizer)', leadAvatarText: 'YOU', participantCount: 1, participantLimit: Number(participantLimit) || 12, distance: distance.trim() || '45.0 Miles', meetingPoint: meetingPoint.trim() || 'Designated Rally Staging Point', routeSnippet: routeSnippet.trim() || 'Custom GPX route uploaded by organizer.', userStatus: 'joined', status: 'scheduled', }; setIsSubmitting(true); try { await onCreateRide(newRide); onClose(); } finally { setIsSubmitting(false); } }; return (
{ if (e.target === e.currentTarget) onClose(); }} >
{/* Header */}
add_circle

Create Group Ride Run

Organize a new squadron run with real-time radar tracking, safety spacing buffers, and synchronized telemetry check-ins.

{errorMsg && (
error {errorMsg}
)}
{/* Title */}
setTitle(e.target.value)} placeholder="e.g. Sierra Foothills Canyon Run" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Region & Distance Grid */}
setRegion(e.target.value)} placeholder="e.g. Sacramento, CA" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
setDistance(e.target.value)} placeholder="e.g. 58.4 Miles" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Date & Time Grid */}
setScheduledDate(e.target.value)} placeholder="e.g. Saturday" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
setScheduledTime(e.target.value)} placeholder="e.g. 06:45 AM PST" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Pace & Formation */}
setParticipantLimit(Number(e.target.value))} className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Discipline & Privacy Controls */}
{/* Meeting Point */}
setMeetingPoint(e.target.value)} placeholder="e.g. Chevron Staging Lot at Highway 49" className="w-full bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Route Upload or Waypoint Selection */}
setRouteSnippet(e.target.value)} placeholder="e.g. Skyline Blvd > Stage Rd > Pescadero Creek" className="flex-1 bg-surface-container-lowest font-body-md text-body-md text-on-surface px-space-md py-2.5 rounded-xl border border-outline-variant/30 focus:border-primary-container outline-none" />
{/* Description */}