import React, { useState, useEffect, useCallback } from 'react'; import { Search, MapPin, Truck, Activity, Navigation, User, Calendar, Clock, AlertTriangle, Filter, ChevronDown, X, ChevronLeft, ChevronRight } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { Pagination } from '../../components/Pagination'; interface Vehicle { id: string; registration_number: string; vehicle_type: string; brand?: string; model?: string; station_id?: string; status?: string; gps_lat?: string; gps_lon?: string; activeShift?: any; activeRoster?: any; } export const FleetTrips: React.FC = () => { const [vehicles, setVehicles] = useState([]); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchQuery, setSearchQuery] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [isSearchFocused, setIsSearchFocused] = useState(false); // Pagination const [page, setPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(5); const fetchVehicles = useCallback(async (regNumber: string = '') => { setLoading(true); setError(null); try { const token = localStorage.getItem('teleems_token') || ''; let url = 'https://teleems-api-gateway.onrender.com/v1/fleet/vehicles/stats'; if (regNumber) { url += `?registration_number=${encodeURIComponent(regNumber)}`; } const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, }); const json = await res.json(); const data = json?.data || {}; setStats(data); const activeList = data.activeVehiclesList || []; const inactiveList = data.inactiveVehiclesList || []; setVehicles([...activeList, ...inactiveList]); } catch (e: any) { console.error('Failed to fetch vehicles for trip management:', e); setError(e?.message || 'Failed to fetch vehicles'); } finally { setLoading(false); } }, []); useEffect(() => { const delayDebounceFn = setTimeout(() => { fetchVehicles(searchQuery); }, 500); return () => clearTimeout(delayDebounceFn); }, [searchQuery, fetchVehicles]); const filteredVehicles = vehicles.filter(v => { const searchMatch = v.registration_number?.toLowerCase().includes(searchQuery.toLowerCase()) || v.activeShift?.driver?.user?.name?.toLowerCase().includes(searchQuery.toLowerCase()) || v.activeShift?.staff?.user?.name?.toLowerCase().includes(searchQuery.toLowerCase()); const statusMatch = statusFilter ? v.status === statusFilter : true; return searchMatch && statusMatch; }); const totalPages = Math.max(1, Math.ceil(filteredVehicles.length / itemsPerPage)); const safePage = Math.min(page, totalPages); const pageData = filteredVehicles.slice((safePage - 1) * itemsPerPage, safePage * itemsPerPage); const getStatusColor = (status?: string) => { switch (status) { case 'BUSY': return { bg: 'rgba(239, 68, 68, 0.1)', color: '#EF4444', border: 'rgba(239, 68, 68, 0.2)' }; case 'AVAILABLE': return { bg: 'rgba(34, 197, 94, 0.1)', color: '#22C55E', border: 'rgba(34, 197, 94, 0.2)' }; default: return { bg: 'rgba(245, 158, 11, 0.1)', color: '#F59E0B', border: 'rgba(245, 158, 11, 0.2)' }; } }; const activeTripsCount = vehicles.filter(v => v.status === 'BUSY').length; const availableCount = vehicles.filter(v => v.status === 'AVAILABLE').length; return (
{/* Top Stats */}
{loading ? '...' : stats?.totalVehicles ?? vehicles.length}
Total Vehicles
{loading ? '...' : stats?.busyVehiclesCount ?? activeTripsCount}
Active Trips (Busy)
{loading ? '...' : stats?.availableVehiclesCount ?? availableCount}
Available Units
{loading ? '...' : stats?.inactiveVehiclesCount ?? vehicles.filter(v => !v.activeShift).length}
Inactive Vehicles
{/* Toolbar */}
{ setSearchQuery(e.target.value); setPage(1); }} onFocus={() => setIsSearchFocused(true)} onBlur={() => setIsSearchFocused(false)} className="stations-search-input" style={{ background: 'transparent', border: 'none', color: '#0F172A', fontSize: '0.875rem', outline: 'none', width: '100%', paddingRight: searchQuery ? '24px' : '0' }} /> {searchQuery && ( )}
{/* Content */} {loading ? (
Loading trips...
) : error ? (
Error loading trips
{error}
) : filteredVehicles.length === 0 ? (
No trips found
Adjust your filters to see more results
) : (
{pageData.map(v => { const sc = getStatusColor(v.status); const shift = v.activeShift; const roster = v.activeRoster; const driverName = shift?.driver?.user?.name || roster?.driver?.user?.name || 'Unassigned'; const emtName = shift?.staff?.user?.name || roster?.staff?.user?.name || 'Unassigned'; return (

{v.registration_number}

{v.vehicle_type} UNIT
{v.gps_lat && v.gps_lat !== "0.0000000" ? `${v.gps_lat}, ${v.gps_lon}` : 'Location Unavailable'}
{v.status || 'UNKNOWN'}
Driver / Pilot
{driverName}
Paramedic / EMT
{emtName}
{shift && (
Shift Details
Started: {new Date(shift.startTime).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
)}
); })}
)} {/* Pagination Controls */} {!loading && filteredVehicles.length > 0 && (
)}
); };