all repos — caroster @ 35fc135e937a5b85fe35e7f9b03772d2e1f3f04e

[Octree] Group carpool to your event https://caroster.io

frontend/hooks/usePassengersActions.ts (view raw)

 1import {
 2  Travel,
 3  Event,
 4  useUpdateTravelMutation,
 5  useUpdateEventMutation,
 6  ComponentPassengerPassenger,
 7  ComponentPassengerPassengerInput,
 8} from '../generated/graphql';
 9
10interface AddPassengerToTravelArgs {
11  passenger: ComponentPassengerPassengerInput;
12  travel: Travel;
13}
14
15interface AddPassengerToWaitingList {
16  passenger: ComponentPassengerPassenger;
17  event: Event;
18}
19
20interface RemovePassengerArgs {
21  passenger: ComponentPassengerPassenger;
22  event: Event;
23}
24
25const usepassengersActions = () => {
26  const [updateEvent] = useUpdateEventMutation();
27  const [updateTravel] = useUpdateTravelMutation();
28
29  const addPassengerToTravel = async ({
30    passenger,
31    travel,
32  }: AddPassengerToTravelArgs) => {
33    const passengers =
34      [...travel.passengers, passenger].map(({__typename, user, ...item}) => {
35        return user && typeof user !== 'string'
36          ? {
37              ...item,
38              user: user.id,
39            }
40          : item;
41      }) || [];
42
43    return updateTravel({
44      variables: {
45        id: travel.id,
46        travelUpdate: {
47          passengers,
48        },
49      },
50    });
51  };
52
53  const addPassengerToWaitingList = async ({
54    passenger,
55    event,
56  }: AddPassengerToWaitingList) => {
57    const waitingList = [
58      ...event.waitingList,
59      passenger,
60    ].map(({__typename, user, ...item}) =>
61      user ? {...item, user: user.id} : item
62    );
63    return updateEvent({
64      variables: {uuid: event.uuid, eventUpdate: {waitingList}},
65      refetchQueries: ['eventByUUID'],
66    });
67  };
68
69  const removePassengerFromWaitingList = async ({
70    passenger,
71    event,
72  }: RemovePassengerArgs) => {
73    const waitingList = event.waitingList
74      .filter(waitingListPassenger => waitingListPassenger.id !== passenger?.id)
75      .map(({__typename, user, ...item}) => item);
76    return updateEvent({
77      variables: {uuid: event.uuid, eventUpdate: {waitingList}},
78      refetchQueries: ['eventByUUID'],
79    });
80  };
81
82  return {
83    addPassengerToTravel,
84    addPassengerToWaitingList,
85    removePassengerFromWaitingList,
86  };
87};
88
89export default usepassengersActions;