import * as immutable from 'immutable'; import { useCallback, useEffect, useRef, useState } from 'react'; import { green, lightgrey } from '../../lib/colors'; import { addOrUpdateEventSignup, getEvent, getEventSignups, removeEventSignup, } from '../api'; import { useMe } from '../hooks'; import { IEvent, IEventSignup } from '../types'; import UIButton from '../UI/UIButton'; import UILink from '../UI/UILink'; import UIPlacesAutocomplete from '../UI/UIPlacesAutocomplete'; import UISecondaryBox from '../UI/UISecondaryBox'; import UISecondaryHeader from '../UI/UISecondaryHeader'; import useThrottle from '../useThrottle'; import EventCarpools from './EventCarpools'; import EventContext from './EventContext'; import EventDetails from './EventDetails'; import EventSignups from './EventSignups'; function GroupName({ group }: { group: IEvent['group'] }) { return {group.name}; } export default function Event({ id, initial, }: { id: number; initial?: IEvent; }) { const [event, setEvent] = useState(initial || null); const [placeId, setPlaceId] = useState(null); const [interested, setInterested] = useState(false); const [updating, setUpdating] = useState(false); const [signups, setSignups] = useState(null); const [hasCarpool, setHasCarpool] = useState(false); const toggleInterested = useCallback(() => setInterested((i) => !i), []); const toggleInterestedThrottled = useThrottle(toggleInterested, 500); const existingSignup = useRef({ interested: false, placeId: null as string | null, eventId: null as number | null, }); const me = useMe(); const [tentativeInvites, setTentativeInvites] = useState( immutable.Set() ); const addTentativeInvite = useCallback((userId: number) => { setTentativeInvites((t) => t.add(userId)); }, []); const removeTentativeInvite = useCallback((userId: number) => { setTentativeInvites((t) => t.delete(userId)); }, []); const refresh = useCallback(() => { getEvent(id).then(setEvent); }, [id]); useEffect(refresh, [refresh]); useEffect(() => { if (signups === null) { return; } const removeSignup = () => { if (prev.interested) { removeEventSignup(id) .then(() => { prev.interested = false; }) .finally(() => setUpdating(false)); } }; const addOrUpdateSignup = () => { if (!prev.interested || prev.placeId !== placeId) { console.log('Adding or updating signup.', prev, { interested, placeId, eventId: id, signups, }); addOrUpdateEventSignup(id, placeId) .then(() => { prev.placeId = placeId; prev.eventId = id; prev.interested = true; }) .finally(() => setUpdating(false)); } }; const prev = existingSignup.current; if (!interested) { removeSignup(); } else { addOrUpdateSignup(); } }, [id, interested, placeId, signups, updating]); useEffect(() => { getEventSignups(id) .then((signups) => { for (let signup of signups) { if (signup.user.id === me?.id) { setInterested(true); setPlaceId(signup.placeId); existingSignup.current.eventId = id; existingSignup.current.placeId = signup.placeId; existingSignup.current.interested = true; } } setSignups(signups); }) .catch(console.error); }, [id, me?.id]); if (!event) { return Loading...; } const { name, group, formattedAddress, startTime, endTime } = event; return (
{name}
{interested ? 'Interested' : 'Not interested'} {interested && ( <> { setPlaceId(placeID); }} style={placeId != null ? { border: '2px solid ' + green } : {}} placeId={placeId} />
{signups !== null && ( )} )}
); }