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 onSucceed?: () => void;
14 onError?: (error: string) => void;
15}
16
17interface AddPassengerToWaitingList {
18 passenger: ComponentPassengerPassenger;
19 event: Event;
20 onSucceed?: () => void;
21 onError?: (error: string) => void;
22}
23
24interface RemovePassengerArgs {
25 passenger: ComponentPassengerPassenger;
26 event: Event;
27 onSucceed?: () => void;
28 onError?: (error: string) => void;
29}
30
31const usepassengersActions = () => {
32 const [updateEvent] = useUpdateEventMutation();
33 const [updateTravel] = useUpdateTravelMutation();
34
35 const addPassengerToTravel = async ({
36 passenger,
37 travel,
38 onSucceed,
39 onError,
40 }: AddPassengerToTravelArgs): Promise<void> => {
41 try {
42 const passengers =
43 [...travel.passengers, passenger].map(({__typename, user, ...item}) => {
44 return user && typeof user !== 'string'
45 ? {
46 ...item,
47 user: user.id,
48 }
49 : item;
50 }) || [];
51
52 await updateTravel({
53 variables: {
54 id: travel.id,
55 travelUpdate: {
56 passengers,
57 },
58 },
59 });
60 return onSucceed && onSucceed();
61 } catch (error) {
62 console.error(error);
63 return onError && onError(error);
64 }
65 };
66
67 const addPassengerToWaitingList = async ({
68 passenger,
69 event,
70 onSucceed,
71 onError,
72 }: AddPassengerToWaitingList): Promise<void> => {
73 try {
74 const waitingList = [...event.waitingList, passenger].map(
75 ({__typename, user, ...item}) =>
76 user ? {...item, user: user.id} : item
77 );
78 await updateEvent({
79 variables: {uuid: event.uuid, eventUpdate: {waitingList}},
80 refetchQueries: ['eventByUUID'],
81 });
82 return onSucceed && onSucceed();
83 } catch (error) {
84 console.error(error);
85 return onError && onError(error);
86 }
87 };
88
89 const removePassengerFromWaitingList = async ({
90 passenger,
91 event,
92 onSucceed,
93 onError,
94 }: RemovePassengerArgs): Promise<void> => {
95 try {
96 const waitingList = event.waitingList
97 .filter(
98 waitingListPassenger => waitingListPassenger.id !== passenger?.id
99 )
100 .map(({__typename, user, ...item}) => item);
101 await updateEvent({
102 variables: {uuid: event.uuid, eventUpdate: {waitingList}},
103 refetchQueries: ['eventByUUID'],
104 });
105 return onSucceed && onSucceed();
106 } catch (error) {
107 console.error(error);
108 return onError && onError(error);
109 }
110 };
111
112 return {
113 addPassengerToTravel,
114 addPassengerToWaitingList,
115 removePassengerFromWaitingList,
116 };
117};
118
119export default usepassengersActions;