'use client'; import React, { useState, useEffect } from 'react'; interface JoinRideModalProps { isOpen: boolean; onClose: () => void; onJoinSuccess: (code: string, rideTitle: string) => void; } export function JoinRideModal({ isOpen, onClose, onJoinSuccess }: JoinRideModalProps) { const [code, setCode] = useState(''); const [isCameraActive, setIsCameraActive] = useState(false); const [errorMsg, setErrorMsg] = useState(null); const [successInfo, setSuccessInfo] = useState<{ title: string; lead: string } | null>(null); const [isSubmitting, setIsSubmitting] = useState(false); // Reset state when modal is opened/closed useEffect(() => { if (isOpen) { setCode(''); setErrorMsg(null); setSuccessInfo(null); setIsCameraActive(false); 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 handleCodeChange = (e: React.ChangeEvent) => { const raw = e.target.value.toUpperCase().replace(/[^A-Z0-9_-]/g, ''); setCode(raw); if (errorMsg) setErrorMsg(null); }; const processCode = (rideCode: string) => { const cleanCode = rideCode.trim().toUpperCase(); if (!cleanCode || cleanCode.length < 4) { setErrorMsg('Please enter a valid ride code (at least 4 characters).'); return; } setIsSubmitting(true); setErrorMsg(null); // Simulated lookup setTimeout(() => { setIsSubmitting(false); let resolvedTitle = 'Squad Formation Ride'; let resolvedLead = 'ApexLead'; if (cleanCode.includes('APEX') || cleanCode === 'CA-84' || cleanCode === 'APEX84') { resolvedTitle = 'Bay Area Dawn Patrol'; resolvedLead = 'ApexLead'; } else if (cleanCode.includes('MALIBU') || cleanCode === 'MALIBU7') { resolvedTitle = 'Malibu Canyons Fast Pace'; resolvedLead = 'Dan_KTM'; } else if (cleanCode.includes('DRAGON') || cleanCode === 'DRAGON318') { resolvedTitle = 'Tail of the Dragon Run'; resolvedLead = 'Sweep_Marshal'; } else { resolvedTitle = `Squad Run #${cleanCode}`; resolvedLead = 'Pack Marshal'; } setSuccessInfo({ title: resolvedTitle, lead: resolvedLead }); onJoinSuccess(cleanCode, resolvedTitle); }, 400); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); processCode(code); }; const handleSimulateScan = () => { setCode('APEX84'); processCode('APEX84'); }; return (
{ if (e.target === e.currentTarget) onClose(); }} >
{/* Header */}
qr_code_scanner

Join Pack Formation

{/* Success State */} {successInfo ? (
check_circle
Telemetry Linked

{successInfo.title}

Lead Marshal: {successInfo.lead}. Your telemetry stream is now synchronized with this pack.

) : ( /* Input / Scanner Flow */

Enter the encrypted 6-character ride code generated by your Lead Pace Setter or scan their cockpit radar QR display.

{/* Error Message */} {errorMsg && (
error {errorMsg}
)} {/* Code Input */}
{/* Divider */}
Or Scan Optical QR
{/* Optical Lens / Camera Simulation */} {isCameraActive ? (
{/* Viewfinder crosshairs */}
{/* Animated scanline */}
Radar Optical Lens Active
) : (
setIsCameraActive(true)} className="bg-surface-container hover:bg-surface-container-high border border-outline-variant/30 h-32 rounded-xl flex flex-col items-center justify-center gap-2 text-on-surface-variant hover:text-primary transition-all cursor-pointer group" data-testid="activate-radar-lens-button" > photo_camera Activate Radar Optical Lens
)}
{/* Submit Button */}
)}
); }