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) => (
))}
);
}