diff --git a/src/components/ActiveCarpools/ActiveCarpools.tsx b/src/components/ActiveCarpools/ActiveCarpools.tsx new file mode 100644 index 0000000..adb1854 --- /dev/null +++ b/src/components/ActiveCarpools/ActiveCarpools.tsx @@ -0,0 +1,35 @@ +import { useEffect } from 'react'; +import { useState } from 'react'; +import { getActiveCarpools } from '../api'; +import { ICarpool } from '../types'; +import UISecondaryBox from '../UI/UISecondaryBox'; +import UISecondaryHeader from '../UI/UISecondaryHeader'; + +function ActiveCarpoolListItem({ carpool }: { carpool: ICarpool }) { + return ( + + + {carpool.name} + + + ); +} + +export default function ActiveCarpools() { + const [activeCarpools, setActiveCarpools] = useState([]); + + useEffect(() => { + getActiveCarpools().then(setActiveCarpools); + }, []); + + return ( + <> +

Carpools

+
+ {activeCarpools.map((carpool) => ( + + ))} +
+ + ); +} diff --git a/src/components/Events.tsx b/src/components/ActiveEvents/Events.tsx similarity index 54% rename from src/components/Events.tsx rename to src/components/ActiveEvents/Events.tsx index 5a33712..6b213ef 100644 --- a/src/components/Events.tsx +++ b/src/components/ActiveEvents/Events.tsx @@ -1,17 +1,17 @@ import { useEffect } from 'react'; -import { getEvents } from './api'; -import { IEvent } from './types'; -import EventStream from './EventStream'; -import useImmutable from './useImmutable'; +import { getActiveEvents } from '../api'; +import EventStream from '../EventStream'; +import { IEvent } from '../types'; +import useImmutable from '../useImmutable'; -export default function Events() { +export default function ActiveEvents() { const [events, setEvents] = useImmutable([]); const hasEvents = events.length > 0; useEffect(() => { if (!hasEvents) { - getEvents().then(setEvents); + getActiveEvents().then(setEvents); } }, [hasEvents, setEvents]); diff --git a/src/components/Event/EventCarpoolCreateButton.tsx b/src/components/Event/EventCarpoolCreateButton.tsx index e0931dc..66b4469 100644 --- a/src/components/Event/EventCarpoolCreateButton.tsx +++ b/src/components/Event/EventCarpoolCreateButton.tsx @@ -1,10 +1,11 @@ -import { useCallback, useContext, useMemo, useState } from 'react'; +import { useCallback, useContext, useState } from 'react'; import { lightgrey } from '../../lib/colors'; import { createCarpool } from '../api'; import { useMe } from '../hooks'; import UIButton from '../UI/UIButton'; import UILink from '../UI/UILink'; import EventContext from './EventContext'; +import { useMyCarpool } from './EventHooks'; type CreationStatus = null | 'pending' | 'completed' | 'errored'; @@ -15,13 +16,7 @@ export default function EventCarpoolCreateButton() { 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 myCarpool = useMyCarpool(); const createCarpoolCallback = useCallback(async () => { setCreationStatus('pending'); diff --git a/src/components/Event/EventHooks.ts b/src/components/Event/EventHooks.ts index 7d4f05e..1e43a38 100644 --- a/src/components/Event/EventHooks.ts +++ b/src/components/Event/EventHooks.ts @@ -1,14 +1,39 @@ -import { useContext, useMemo } from 'react'; +import { useContext, useDebugValue, useMemo } from 'react'; import { useMe } from '../hooks'; import EventContext from './EventContext'; export function useSignups() { - return useContext(EventContext).event.signups; + const signups = useContext(EventContext).event.signups; + + useDebugValue(signups); + + return signups; } export function useMySignup() { const signups = useSignups(); const me = useMe()!; - return useMemo(() => signups[me.id] ?? null, [signups, me.id]); + const signup = useMemo(() => signups[me.id] ?? null, [signups, me.id]); + + useDebugValue(signup); + + return signup; +} + +export function useMyCarpool() { + const me = useMe()!; + const { event } = useContext(EventContext); + + const carpool = useMemo( + () => + event.carpools.find((carpool) => + carpool.members.some((member) => member.id === me.id) + ), + [event.carpools, me.id] + ); + + useDebugValue(carpool); + + return carpool; } diff --git a/src/components/WheelShare.tsx b/src/components/WheelShare.tsx index 3f49195..c3b4970 100644 --- a/src/components/WheelShare.tsx +++ b/src/components/WheelShare.tsx @@ -1,4 +1,5 @@ -import Events from './Events'; +import ActiveCarpools from './ActiveCarpools/ActiveCarpools'; +import ActiveEvents from './ActiveEvents/Events'; import Groups from './Groups/Groups'; import Header from './Header/Header'; @@ -8,7 +9,8 @@ export default function WheelShare() {
- + + ); } diff --git a/src/components/api.ts b/src/components/api.ts index b828de3..d4c98a5 100644 --- a/src/components/api.ts +++ b/src/components/api.ts @@ -218,3 +218,11 @@ export async function cancelCarpoolRequest(carpoolId: number) { export async function getSentRequestsAndInvites() { return (await get('/users/@me/sent_requests_and_invites')) as IInvitation[]; } + +export async function getActiveEvents() { + return (await get('/users/@me/active_events')) as IEvent[]; +} + +export async function getActiveCarpools() { + return (await get('/users/@me/active_carpools')) as ICarpool[]; +}