import { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Search, Loader2, ChevronRight, Menu, X, MapPin, Navigation, Compass, Radio } from 'lucide-react'; import BusCard from '@/components/BusCard/BusCard'; import BusRouteMap from '@/components/BusRouteMap/BusRouteMap'; import type { BusRoute } from '@/types'; import { getBackendUrl } from '@/lib/utils'; import { Link } from 'react-router-dom'; export default function BusRoutes() { const [busSearch, setBusSearch] = useState(''); const [busRoutes, setBusRoutes] = useState([]); const [loadingBus, setLoadingBus] = useState(true); const [selectedBusRoute, setSelectedBusRoute] = useState(null); const [isSidebarOpen, setIsSidebarOpen] = useState(false); useEffect(() => { // 1. Instantly load static bus routes (0ms loading delay) fetch('/bus_routes.json') .then((res) => res.json()) .then((data) => { if (Array.isArray(data) && data.length > 0) { setBusRoutes(data); setSelectedBusRoute(data[0]); } }) .catch((err) => console.error('Local JSON load error:', err)) .finally(() => setLoadingBus(false)); // 2. Silently fetch live backend updates in background with a 2s timeout const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 2000); fetch(getBackendUrl('/api/bus-routes'), { signal: controller.signal }) .then((res) => (res.ok ? res.json() : null)) .then((data) => { if (Array.isArray(data) && data.length > 0) { setBusRoutes(data); } }) .catch(() => {}) .finally(() => clearTimeout(timeoutId)); }, []); const filteredRoutes = busRoutes.filter( (r) => r.name.toLowerCase().includes(busSearch.toLowerCase()) || r.from.toLowerCase().includes(busSearch.toLowerCase()) || r.number.toLowerCase().includes(busSearch.toLowerCase()) ); return (
{/* Sleek Dark Header */}
Home Live Bus Tracking

RIT Live Transport Map

Live GPS Sync
{/* Controls: Search + Toggle Drawer Button */}
setBusSearch(e.target.value)} className="w-full pl-9 pr-4 py-2 rounded-xl bg-slate-800 border border-slate-700 text-xs text-white placeholder-slate-400 focus:outline-none focus:border-orange-500 transition-colors" style={{ fontFamily: 'Inter, sans-serif' }} />
{/* Main Map Viewport */}
{loadingBus ? (

Initializing Live GPS Bus Tracking Map...

) : ( <> {/* Quick Horizontal Route Chips Bar on top of Map */}
{filteredRoutes.map((route) => { const isSelected = selectedBusRoute?.number === route.number; return ( ); })}
{/* The Fullscreen Map Component */} {/* Sidebar / Bottom Sheet Overlay */} {isSidebarOpen && ( <> {/* Backdrop on mobile */} setIsSidebarOpen(false)} className="absolute inset-0 bg-slate-950/60 backdrop-blur-xs z-30 lg:hidden" /> {/* Drawer Panel: Floating Panel on Desktop, Bottom Sheet on Mobile */} {/* Drawer Header */}

Select Bus Route ({filteredRoutes.length})

{/* Route List inside Drawer */}
{filteredRoutes.map((route) => ( { setSelectedBusRoute(route); // Auto close sidebar on mobile for instant map view if (window.innerWidth < 1024) { setIsSidebarOpen(false); } }} /> ))}
)}
)}
); }