import CancelIcon from '@material-ui/icons/Cancel'; import CheckIcon from '@material-ui/icons/Check'; import EmojiPeopleIcon from '@material-ui/icons/EmojiPeople'; import { useEffect } from 'react'; import { useCallback, useContext, useMemo, useState } from 'react'; import { lightgrey } from '../../lib/colors'; import { useCancelCarpoolRequest, useInvitationState, useSendCarpoolRequest, } from '../../state/Notifications/NotificationsHooks'; import { createCarpool } from '../api'; import { useMe } from '../hooks'; import { IEvent } from '../types'; import UIButton from '../UI/UIButton'; import UILink from '../UI/UILink'; import EventContext from './EventContext'; function CarpoolRow({ carpool, inCarpoolAlready, }: { carpool: IEvent['carpools'][0]; inCarpoolAlready: boolean; }) { const PADDING = '1rem'; const inviteState = useInvitationState(carpool.id); const cancelCarpoolRequest = useCancelCarpoolRequest(); const sendCarpoolRequest = useSendCarpoolRequest(); const sendButton = useCallback(() => { sendCarpoolRequest(carpool.id); }, [sendCarpoolRequest, carpool.id]); const cancelButton = useCallback(() => { cancelCarpoolRequest(carpool.id); }, [cancelCarpoolRequest, carpool.id]); return (
{/*
*/} { window.location.href = '/carpools/' + carpool.id; }} > {carpool.name}

{/*
{' '} {carpool.extraDistance} miles
*/} {/*
*/} {!inCarpoolAlready && ( <> {inviteState === 'none' ? ( ) : inviteState === 'requested' ? ( ) : ( // inviteState === 'invited )} )}
); } type CreationStatus = null | 'pending' | 'completed' | 'errored'; export default function Carpools() { const { event, tentativeInvites, signups, setHasCarpool } = useContext(EventContext); const [creationStatus, setCreationStatus] = useState(null); const [createdCarpoolId, setCreatedCarpoolId] = useState(null); const me = useMe()!; const myCarpool = useMemo( () => event.carpools.find((carpool) => carpool.members.some((member) => member.id === me.id) ), [event.carpools, me.id] ); const alreadyInCarpool = myCarpool !== undefined || creationStatus === 'completed'; useEffect(() => { setHasCarpool(alreadyInCarpool); }, [alreadyInCarpool, setHasCarpool]); const createCarpoolCallback = useCallback(() => { setCreationStatus('pending'); createCarpool({ name: me.name + "'s Carpool", eventId: event.id, invitedUserIds: tentativeInvites.toArray(), }) .then(({ id }) => { setCreatedCarpoolId(id); setCreationStatus('completed'); }) .catch(() => { setCreationStatus('errored'); }); }, [event.id, me.name, tentativeInvites]); const tentativeInviteNames = useMemo(() => { if (!signups) return []; const names = tentativeInvites.map((id) => { const signup = signups.find((s) => s.user.id === id); return signup?.user.name; }); const nonNull = names.filter((n) => n != null); return nonNull.toArray() as string[]; }, [tentativeInvites, signups]); let createCarpoolSection; if (tentativeInviteNames.length > 0) { const inviteeCount = tentativeInviteNames.length; const peoplePlural = inviteeCount > 1 ? 'People' : 'Person'; createCarpoolSection = ( <>
You have invited these people to carpool with you: {tentativeInviteNames.join(',')} {creationStatus === null ? `Create Carpool With ${inviteeCount} ${peoplePlural}` : creationStatus === 'pending' ? 'Creating...' : 'Errored'} ); } else createCarpoolSection = ( <> Available to drive? {creationStatus === null ? 'Create Empty Carpool' : creationStatus === 'pending' ? 'Creating...' : 'Errored'} ); return (

Carpools

{creationStatus === 'completed' ? ( Created{' '} your carpool! ) : myCarpool ? ( You are already in a carpool for this event:{' '} {myCarpool.name} ) : ( createCarpoolSection )} {event.carpools.map((carpool) => ( ))}
); }