wheelshare-frontend/src/components/Carpool/CarpoolRouteEstimator.tsx
2021-07-26 20:03:22 -04:00

82 lines
2.0 KiB
TypeScript

import { useContext, useMemo } from 'react';
import { Location } from '../../lib/estimateoptimalpath';
import getDistance from '../../lib/getdistance';
import { IEventSignupComplete } from '../types';
import useOptimalPath from '../useOptimalPath';
import { CarpoolContext } from './Carpool';
import useSignups from './useSignups';
export default function CarpoolRouteEstimator() {
const { carpool } = useContext(CarpoolContext);
const { members } = carpool;
const memberIds = useMemo(
() => members.map((member) => member.id),
[members]
);
const signups = useSignups(carpool.event.id, memberIds);
const completedSignups = useMemo(
() =>
signups.filter(
(signup) => signup.latitude !== null
) as IEventSignupComplete[],
[signups]
);
const path = useOptimalPath(completedSignups, carpool.event);
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
width: '100%',
boxSizing: 'border-box',
padding: '0rem 2rem',
}}
>
<h2>Route Optimization</h2>
{path ? (
<div
style={{ display: 'flex', flexDirection: 'column', width: '100%' }}
>
<span>Best route: {path.distance.toFixed(1)} miles</span>
<br />
{(() => {
const driver = path.path.from;
const waypoints = path.path.waypoints;
let previousLocation: Location = driver;
return (
<>
<span>Driver: {driver.user.name}</span>
{waypoints.map((waypoint, index) => {
const distance = getDistance(previousLocation, waypoint);
previousLocation = waypoint;
return (
<span key={waypoint.user.id}>
Passenger #{index + 1}: {waypoint.user.name} (
{distance.toFixed(1)} miles)
</span>
);
})}
<span>
Destination: {carpool.event.name} (
{getDistance(carpool.event, previousLocation).toFixed(1)}{' '}
miles)
</span>
</>
);
})()}
</div>
) : (
'No valid paths are available.'
)}
</div>
);
}