import { useQuery, useQueryClient } from '@tanstack/react-query'; import { api } from '../api'; import { useAuth } from '../context/AuthContext'; import MapView, { MapMarker } from '../components/MapView'; import DriverAvailabilityToggle from '../components/features/DriverAvailabilityToggle'; import DriverRequestCard from '../components/features/DriverRequestCard'; import DriverTripNavigation from '../components/features/DriverTripNavigation'; import { Ride } from '../types/ride'; import { Car, Navigation, Radio, RefreshCw, ShieldAlert } from 'lucide-react'; import { Link } from 'react-router-dom'; export default function DriverWorkstation() { const { user } = useAuth(); const queryClient = useQueryClient(); // Fetch driver profile to check setup & availability const { data: profileRes, isLoading: isProfileLoading, refetch: refetchProfile } = useQuery({ queryKey: ['driver-profile'], queryFn: async () => { const res = await api.get('/driver/profile'); return res.data; }, }); const driverProfile = profileRes?.profile; const isAvailable = Boolean(driverProfile?.is_available); // Fetch driver's current rides to locate an active trip const { data: myRidesRes, refetch: refetchMyRides } = useQuery({ queryKey: ['rides-my'], queryFn: async () => { const res = await api.get('/rides/my'); return res.data; }, refetchInterval: 5000, }); const myRides: Ride[] = Array.isArray(myRidesRes?.rides) ? myRidesRes.rides : []; const activeRide = myRides.find( (r) => r.status === 'accepted' || r.status === 'picked_up' ); // Fetch nearby ride requests when available & not in an active trip const { refetch: refetchNearby } = useQuery({ queryKey: ['rides-nearby'], queryFn: async () => { const res = await api.get('/rides/nearby'); return res.data; }, enabled: isAvailable && !activeRide, refetchInterval: isAvailable && !activeRide ? 4000 : false, }); const handleRefresh = () => { refetchProfile(); refetchMyRides(); if (isAvailable && !activeRide) refetchNearby(); }; const handleAcceptRide = () => { queryClient.invalidateQueries({ queryKey: ['rides-my'] }); queryClient.invalidateQueries({ queryKey: ['rides-nearby'] }); }; const handleRideUpdated = () => { queryClient.invalidateQueries({ queryKey: ['rides-my'] }); queryClient.invalidateQueries({ queryKey: ['rides-nearby'] }); }; // Determine map markers strictly matching MapMarker contract const mapMarkers: MapMarker[] = []; if (activeRide) { if (typeof activeRide.pickup_lat === 'number' && typeof activeRide.pickup_lng === 'number') { mapMarkers.push({ id: 'pickup', lat: activeRide.pickup_lat, lng: activeRide.pickup_lng, label: `Pickup: ${activeRide.pickup_location}`, type: 'pickup', }); } if (typeof activeRide.destination_lat === 'number' && typeof activeRide.destination_lng === 'number') { mapMarkers.push({ id: 'destination', lat: activeRide.destination_lat, lng: activeRide.destination_lng, label: `Destination: ${activeRide.destination_location}`, type: 'destination', }); } if (typeof activeRide.driver_lat === 'number' && typeof activeRide.driver_lng === 'number') { mapMarkers.push({ id: 'driver', lat: activeRide.driver_lat, lng: activeRide.driver_lng, label: 'Your Vehicle Position', type: 'driver', }); } } // Calculate polyline for route const polyline: [number, number][] | undefined = activeRide && typeof activeRide.pickup_lat === 'number' && typeof activeRide.pickup_lng === 'number' && typeof activeRide.destination_lat === 'number' && typeof activeRide.destination_lng === 'number' ? [ [activeRide.pickup_lat, activeRide.pickup_lng], [activeRide.destination_lat, activeRide.destination_lng], ] : undefined; // Determine map center const mapCenter: [number, number] = activeRide && typeof activeRide.driver_lat === 'number' && typeof activeRide.driver_lng === 'number' ? [activeRide.driver_lat, activeRide.driver_lng] : activeRide && typeof activeRide.pickup_lat === 'number' && typeof activeRide.pickup_lng === 'number' ? [activeRide.pickup_lat, activeRide.pickup_lng] : [37.7749, -122.4194]; if (!driverProfile && !isProfileLoading) { return (
To receive ride dispatches and go online as a driver, please register your vehicle details first.
{activeRide ? 'Active navigation in progress' : isAvailable ? 'Online — Scanning for nearby dispatch requests' : 'Offline — Switch online to receive requests'}
Toggle your availability to "Online" in the header bar above to receive nearby passenger ride dispatches.