import React, {useState, useEffect} from "react"; import { useSelector } from "react-redux"; import { useParams, useNavigate } from "react-router-dom"; import { selectAllRoutes, selectTomorrowAllRoutes, selectAllActiveDrivers, selectAllActiveVehicles, selectHistoryRoutes } from "./../../store"; import PersonnelSection from "./PersonnelSection"; import { AuthService, CustomerService, SignatureRequestService, EmployeeService, TransRoutesService } from "../../services"; import { ROUTE_STATUS } from "../../shared"; import moment from 'moment'; import { Breadcrumb, Tabs, Tab, Dropdown, Spinner, Modal, Button } from "react-bootstrap"; import { Download, Pencil } from "react-bootstrap-icons"; import RouteCustomerEditor from "./RouteCustomerEditor"; const RouteView = () => { const params = useParams(); const allRoutes = useSelector(selectAllRoutes); const tomorrowRoutes = useSelector(selectTomorrowAllRoutes); const historyRoutes = useSelector(selectHistoryRoutes); const drivers = useSelector(selectAllActiveDrivers); const vehicles = useSelector(selectAllActiveVehicles); const currentRoute = (allRoutes.find(item => item.id === params.id)) || (tomorrowRoutes.find(item => item.id === params.id)) || (historyRoutes.find(item => item.id === params.id)); const currentVehicle = vehicles.find(item => item.id === currentRoute?.vehicle ); const currentDriver = drivers.find(item => item.id === currentRoute?.driver); const [fallbackDriver, setFallbackDriver] = useState(undefined); const [showVehicleDetails, setShowVehicleDetails] = useState(false); const [signature, setSignature] = useState(undefined); const [signatureRequest, setSignatureRequest] = useState(undefined); const [routeStatusValue, setRouteStatusValue] = useState(''); const [isSavingRouteStatus, setIsSavingRouteStatus] = useState(false); const [latestRouteForStatus, setLatestRouteForStatus] = useState(undefined); const [routeSnapshot, setRouteSnapshot] = useState(undefined); const [customerMetaById, setCustomerMetaById] = useState(new Map()); const paramsQuery = new URLSearchParams(window.location.search); const scheduleDate = paramsQuery.get('dateSchedule'); const navigate = useNavigate(); const resolvedDriverId = currentDriver?.id || fallbackDriver?.id || currentRoute?.driver; const resolvedDriverName = currentDriver?.name || fallbackDriver?.name || ''; const routeStatusOptions = [ { value: '', label: 'Not Started' }, { value: ROUTE_STATUS.ENROUTE, label: 'En Route' }, { value: ROUTE_STATUS.ENROUTE_TO_CENTER, label: 'En Route To Center' }, { value: ROUTE_STATUS.DROPPED_OFF_ALL, label: 'Dropped Off All' }, { value: ROUTE_STATUS.SIGN_OFF, label: 'Signed Off' }, { value: ROUTE_STATUS.UNEXPECTED_ABSENT, label: 'Unexpected Absent' }, ]; const mergeRouteCustomerMeta = (route) => { if (!route || !Array.isArray(route?.route_customer_list) || customerMetaById.size === 0) { return route; } return Object.assign({}, route, { route_customer_list: route.route_customer_list.map((customerInRoute) => { const customerMeta = customerMetaById.get(customerInRoute?.customer_id); if (!customerMeta) return customerInRoute; return Object.assign({}, customerInRoute, { customer_program_type: customerMeta.program_type || '', customer_pay_source: customerMeta.pay_source || '' }); }) }); }; const routeForStatusView = mergeRouteCustomerMeta(latestRouteForStatus || routeSnapshot || currentRoute); const routeForAssignmentView = routeSnapshot || currentRoute; const closeModal = () => { setShowVehicleDetails(false); } const openModal = () => { setShowVehicleDetails(true); } const getRelatedOutboundRoutesForThisView = () => { if (allRoutes.find(item => item.id === params.id)) { return allRoutes.filter(item => item.type==='outbound'); } if (tomorrowRoutes.find(item => item.id === params.id)) { return tomorrowRoutes.filter(item => item.type==='outbound'); } if (historyRoutes.find(item => item.id === params.id)) { return historyRoutes.filter(item => item.type==='outbound'); } } const directToDashboad = () => { navigate(`/trans-routes/dashboard?dateSchedule=${moment(currentRoute?.schedule_date).format('YYYY-MM-DD')}`); } const edit = (editSection) => { if (scheduleDate) { navigate(`/trans-routes/edit/${currentRoute?.id}?dateSchedule=${scheduleDate}&editSection=${editSection}`) } else { navigate(`/trans-routes/edit/${currentRoute?.id}?editSection=${editSection}`) } } const deleteFile = () => { if (signature) { const dateArr = moment(currentRoute?.schedule_date)?.format('MM/DD/YYYY')?.split('/') || []; CustomerService.deleteFile({name: `${currentRoute?.id}_${currentRoute?.driver}_${dateArr[0]}_${dateArr[1]}`}).then(data => { setSignature(undefined); }) } } const generateSignatureRequest = () => { if (!resolvedDriverId) { window.alert('Driver is not assigned for this route.'); return; } SignatureRequestService.createNewSignatureRequest({ driver_id: resolvedDriverId, driver_name: resolvedDriverName, route_id: currentRoute?.id, route_date: currentRoute?.schedule_date, route_name: currentRoute?.name, status: 'active', }).then((data) => { setSignatureRequest(data.data); }) } const saveRouteStatus = async () => { if (!currentRoute?.id || isSavingRouteStatus) return; try { setIsSavingRouteStatus(true); const nextStatus = routeStatusValue ? [routeStatusValue] : []; await TransRoutesService.updateRoute(currentRoute.id, { status: nextStatus }); await refreshRouteStatusData(); window.alert('Route status updated successfully.'); } catch (error) { console.error('Error updating route status:', error); window.alert('Failed to update route status.'); } finally { setIsSavingRouteStatus(false); } }; const refreshRouteStatusData = async () => { if (!currentRoute?.id) return; try { const response = await TransRoutesService.getRoute(currentRoute.id); if (response?.data) { setLatestRouteForStatus(response.data); } } catch (error) { console.error('Error refreshing route status data:', error); } }; useEffect(() => { const currentStatus = Array.isArray(currentRoute?.status) ? currentRoute.status[0] : ''; setRouteStatusValue(currentStatus || ''); }, [currentRoute?.id, currentRoute?.status]); useEffect(() => { setLatestRouteForStatus(undefined); }, [currentRoute?.id]); useEffect(() => { const routeId = currentRoute?.id || params?.id; if (!routeId) return; TransRoutesService.getRoute(routeId) .then((response) => { if (response?.data) { setRouteSnapshot(response.data); } }) .catch(() => { setRouteSnapshot(undefined); }); }, [currentRoute?.id, params?.id]); useEffect(() => { CustomerService.getAllCustomers() .then((res) => { const nextMap = new Map(); (res?.data || []).forEach((customer) => { nextMap.set(customer?.id, { program_type: customer?.program_type || '', pay_source: customer?.pay_source || '' }); }); setCustomerMetaById(nextMap); }) .catch(() => { setCustomerMetaById(new Map()); }); }, []); useEffect(() => { if (!currentRoute?.driver || currentDriver?.id) { setFallbackDriver(undefined); return; } EmployeeService.getEmployee(currentRoute?.driver) .then((data) => { setFallbackDriver(data?.data); }) .catch(() => { setFallbackDriver(undefined); }); }, [currentRoute?.driver, currentDriver?.id]); useEffect(() => { const dateArr = moment(currentRoute?.schedule_date)?.format('MM/DD/YYYY')?.split('/') || []; CustomerService.getAvatar(`${currentRoute?.id}_${currentRoute?.driver}_${dateArr[0]}_${dateArr[1]}`).then(data => { setSignature(data.data); }); SignatureRequestService.getAllSignatureRequests({driver_id: resolvedDriverId, route_id: currentRoute?.id, route_date: currentRoute?.schedule_date}).then((data) => { if (data?.data?.length > 0) { setSignatureRequest(data?.data[0]); } }) }, [currentRoute, resolvedDriverId]); return ( <>
Transportation Transportation Routes View Route

View Route Information

Route Details
Route Name
{currentRoute?.name}
Vehicle
{currentVehicle?.vehicle_number}
Driver
{resolvedDriverName || 'Not assigned'}
Route Type
{currentRoute?.type}
Route Start Time
{currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
Route End Time
{currentRoute?.end_time && (new Date(currentRoute?.end_time))?.toLocaleTimeString()}
{currentRoute?.type === 'outbound' &&
Leave Center Time
{currentRoute?.start_time && (new Date(currentRoute?.start_time))?.toLocaleTimeString()}
} {currentRoute?.type === 'outbound' &&
Estimated Start Time
{currentRoute?.estimated_start_time && (new Date(currentRoute?.estimated_start_time))?.toLocaleTimeString()}
}
Start Mileage
{ currentRoute?.start_mileage}
End Mileage
{ currentRoute?.end_mileage}
{signature &&
Driver Signature
{signature && }
} {!signature && !signatureRequest &&
Signature Request
} {!signature && signatureRequest &&
Please send this to the driver to get signature:
{`${window.location.origin}/signature/${signatureRequest?.id}`}
}
Checklist
{currentRoute && currentRoute?.checklist_result?.map(item =>
{`${item?.item}: ${item?.result ? 'Yes': "No"}`}
)} {currentRoute && currentRoute?.checklist_result.length === 0 && <>No Checklist found}
Route Status
{routeForStatusView && }
{/*
*/}
closeModal()}> Vehicle Info <>
Vehicle Number: {currentVehicle?.vehicle_number}
Tag: {currentVehicle?.tag}
EzPass: {currentVehicle?.ezpass}
GPS: {currentVehicle?.gps_tag}
Capacity: {currentVehicle?.capacity}
Status: {currentVehicle?.status}
Mileage: {currentVehicle?.mileage}
); }; export default RouteView;