'use client'; import React, { useState, useEffect } from 'react'; import { GroupRideSummary, EditRideFormData } from './types'; interface EditRideModalProps { isOpen: boolean; ride: GroupRideSummary | null; onClose: () => void; onSaveRide: (updatedRide: GroupRideSummary) => void; } export function EditRideModal({ isOpen, ride, onClose, onSaveRide, }: EditRideModalProps) { const [formData, setFormData] = useState({ title: '', region: '', description: '', paceClassification: 'Brisk Pace', formationProfile: 'Staggered Paceline', joinPolicy: 'requestToJoin', scheduledDate: '', scheduledTime: '', distance: '', meetingPoint: '', participantLimit: 12, status: 'scheduled', }); useEffect(() => { if (ride) { setFormData({ title: ride.title, region: ride.region, description: ride.description, paceClassification: ride.paceClassification, formationProfile: ride.formationProfile, joinPolicy: ride.joinPolicy, scheduledDate: ride.scheduledDate, scheduledTime: ride.scheduledTime, distance: ride.distance, meetingPoint: ride.meetingPoint, participantLimit: ride.participantLimit, status: ride.status ?? 'scheduled', }); } }, [ride]); 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 handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.title.trim() || !formData.region.trim()) return; const updated: GroupRideSummary = { ...ride, title: formData.title.trim(), region: formData.region.trim(), description: formData.description.trim(), paceClassification: formData.paceClassification, formationProfile: formData.formationProfile.trim(), joinPolicy: formData.joinPolicy, scheduledDate: formData.scheduledDate.trim(), scheduledTime: formData.scheduledTime.trim(), distance: formData.distance.trim(), meetingPoint: formData.meetingPoint.trim(), participantLimit: formData.participantLimit, status: formData.status, }; onSaveRide(updated); onClose(); }; return (
{/* Header */}
edit_note

Alter Group Ride Parameters

ID: {ride.id} {ride.rideCode ? `• Code: ${ride.rideCode}` : ''}
{/* Edit Form */}
{/* Title */}
setFormData({ ...formData, title: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container font-sans" placeholder="e.g. Skyline Dawn Patrol" />
{/* Region & Rally Point */}
setFormData({ ...formData, region: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container" placeholder="e.g. San Francisco, CA" />
setFormData({ ...formData, meetingPoint: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container" placeholder="e.g. Alice's Restaurant" />
{/* Date, Time, Distance */}
setFormData({ ...formData, scheduledDate: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container" placeholder="e.g. Saturday" />
setFormData({ ...formData, scheduledTime: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container" placeholder="e.g. 06:30 AM PST" />
setFormData({ ...formData, distance: e.target.value })} className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container" placeholder="e.g. 74 Miles" />
{/* Pace Classification, Status, Rider Limit */}
setFormData({ ...formData, participantLimit: parseInt(e.target.value) || 10 }) } className="w-full px-3.5 py-2 rounded-xl bg-surface-container border border-outline-variant/30 text-on-surface text-sm focus:outline-none focus:ring-2 focus:ring-primary-container font-mono" />
{/* Description */}