import { useEffect, useRef, useState } from 'react'; import { post } from './api'; import { green, lightgrey } from './colors'; import latlongdist, { R_miles } from './latlongdist'; import UIButton from './UIButton'; import UIPlacesAutocomplete from './UIPlacesAutocomplete'; import UISecondaryBox from './UISecondaryBox'; import UISecondaryHeader from './UISecondaryHeader'; import usePlace from './usePlace'; import useThrottle from './useThrottle'; import useToggle from './useToggle'; export type IEvent = { id: number; name: string; group: string; formattedAddress: string; startTime: string; endTime: string; latitude: number; longitude: number; }; function formatStartAndEndTime( startDatetimeString: string, endDatetimeString: string ) { const startDatetime = new Date(startDatetimeString); const endDatetime = new Date(endDatetimeString); if (isNaN(startDatetime.valueOf())) { console.error('Invalid datetime:', startDatetimeString); return '(invalid)'; } if (isNaN(endDatetime.valueOf())) { console.error('Invalid datetime:', startDatetimeString); return '(invalid)'; } const startDateString = startDatetime.toLocaleDateString(); const endDateString = endDatetime.toLocaleDateString(); if (startDateString === endDateString) { const startTimeString = startDatetime.toLocaleTimeString(); const endTimeString = endDatetime.toLocaleTimeString(); return `${startDateString}, ${startTimeString} - ${endTimeString}`; } else { return `${startDatetime.toLocaleString()} - ${endDatetime.toLocaleString()}`; } } function GroupName({ name }: { name: string }) { return ( {name} ); } function Details({ startTime, endTime, formattedAddress, }: { startTime: string; endTime: string; formattedAddress: string; }) { return (
When: {formatStartAndEndTime(startTime, endTime)}

Where: {formattedAddress}
); } export type ICarpool = { driver: { id: number; name: string; }; startTime: string; endTime: string; extraDistance: number; }; function CarpoolRow({ carpool }: { carpool: ICarpool }) { const PADDING = '1rem'; return (
{carpool.driver.name}
Time:{' '} {carpool.startTime} - {carpool.endTime}
Offset from route: {carpool.extraDistance} miles
Request to join
); } const dummyCarpoolData: ICarpool[] = [ { driver: { id: 0, name: 'Michael Fatemi', }, startTime: '10:00', endTime: '10:10', extraDistance: 6.9, }, { driver: { id: 1, name: 'Joshua Hsueh', }, startTime: '10:05', endTime: '10:10', extraDistance: 420, }, ]; function Carpools({ event }: { event: IEvent }) { // eslint-disable-next-line const [carpools, _setCarpools] = useState(dummyCarpoolData); return (

Carpools

{carpools.map((carpool) => ( ))}
); } export type IPerson = { id: number; name: string; latitude: number; longitude: number; }; const dummyPeopleData: IPerson[] = [ { id: 0, name: 'Rushil Umaretiya', latitude: 11.1, longitude: 10.09, }, { id: 1, name: 'Nitin Kanchinadam', latitude: 11.09, longitude: 10.12, }, ]; function People({ event, placeId }: { event: IEvent; placeId: string | null }) { const PADDING = '1rem'; // eslint-disable-next-line const [people, setPeople] = useState(dummyPeopleData); const placeDetails = usePlace(placeId); const locationLongitude = event.latitude; const locationLatitude = event.longitude; return (

People

{people.map(({ name, latitude, longitude, id }) => { let extraDistance = null; if (placeDetails != null) { const myLatitude = placeDetails.latitude; const myLongitude = placeDetails.longitude; const meToThem = latlongdist( latitude, longitude, locationLongitude, locationLatitude, R_miles ); const themToLocation = latlongdist( latitude, longitude, myLatitude, myLongitude, R_miles ); const totalWithThem = meToThem + themToLocation; const totalWithoutThem = latlongdist( locationLongitude, locationLatitude, myLatitude, myLongitude, R_miles ); extraDistance = totalWithThem - totalWithoutThem; } return (
{name} {extraDistance ? `: +${extraDistance.toFixed(1)} miles` : ''}
Invite to carpool
); })}
); } export default function Event({ event }: { event: IEvent }) { const { name, group, formattedAddress, startTime, endTime } = event; const [haveRide, toggleHaveRide] = useToggle(false); const [placeId, setPlaceId] = useState(null); const [interested, toggleInterested] = useToggle(false); const [updating, setUpdating] = useState(false); const toggleInterestedThrottled = useThrottle(toggleInterested, 500); const existingSignup = useRef({ interested: false, placeId: null as string | null, eventId: null as number | null, }); useEffect(() => { const prev = existingSignup.current; if (prev.interested === false && interested === false) { return; } if ( (prev.interested === true && interested === false) || (interested === true && prev.placeId !== null && placeId === null) ) { fetch(`http://localhost:5000/api/events/${event.id}/signup`, { method: 'delete', }).finally(() => setUpdating(false)); prev.interested = false; return; } if ( interested === true && (prev.placeId !== placeId || prev.eventId !== event.id) ) { prev.placeId = placeId; prev.eventId = event.id; prev.interested = true; post(`/events/${event.id}/signup`, { placeId, }).finally(() => setUpdating(false)); return; } }, [event.id, interested, placeId, updating]); return ( {name}
{interested ? 'Interested' : 'Not interested'} {interested && ( <> { setPlaceId(placeID); }} style={placeId != null ? { border: '2px solid ' + green } : {}} /> {false && (
I don't have any way to get there yet
)} )} ); }