frontend/containers/Travel/useActions.tsx (view raw)
1import Link from 'next/link';
2import Button from '@mui/material/Button';
3import {useTranslation} from 'react-i18next';
4import useEventStore from '../../stores/useEventStore';
5import useToastStore from '../../stores/useToastStore';
6import {
7 useUpdateTravelMutation,
8 useDeleteTravelMutation,
9 EventByUuidDocument,
10 useUpdatePassengerMutation,
11 TravelInput,
12 TravelEntity,
13 useDeletePassengerMutation,
14} from '../../generated/graphql';
15
16interface Props {
17 travel: TravelEntity;
18}
19
20const useActions = (props: Props) => {
21 const {travel} = props;
22 const {t} = useTranslation();
23 const event = useEventStore(s => s.event);
24 const addToast = useToastStore(s => s.addToast);
25 const clearToast = useToastStore(s => s.clearToast);
26 const [updateTravelMutation] = useUpdateTravelMutation();
27 const [deleteTravelMutation] = useDeleteTravelMutation();
28 const [updatePassenger] = useUpdatePassengerMutation();
29 const [deletePassenger] = useDeletePassengerMutation();
30
31 const removePassengerFromTravel = async (passengerId: string) => {
32 const isCarosterPlus = event.enabled_modules.includes('caroster-plus');
33 if (isCarosterPlus) {
34 try {
35 await deletePassenger({
36 variables: {
37 id: passengerId,
38 },
39 refetchQueries: ['eventByUUID'],
40 });
41 addToast(t`travel.passengers.removed`);
42 } catch (error) {
43 console.error(error);
44 addToast(t('travel.errors.cant_remove_passenger'));
45 }
46 } else return sendPassengerToWaitingList(passengerId);
47 };
48
49 const sendPassengerToWaitingList = async (passengerId: string) => {
50 try {
51 await updatePassenger({
52 variables: {
53 id: passengerId,
54 passengerUpdate: {
55 event: event.id,
56 travel: null,
57 },
58 },
59 refetchQueries: ['eventByUUID'],
60 });
61 addToast(
62 t('travel.passengers.moved_to_waiting_list'),
63 <Link href={`/e/${event.uuid}/waitingList`} passHref>
64 <Button
65 size="small"
66 color="primary"
67 variant="contained"
68 onClick={() => clearToast()}
69 >
70 {t('generic.access')}
71 </Button>
72 </Link>
73 );
74 } catch (error) {
75 console.error(error);
76 addToast(t('travel.errors.cant_remove_passenger'));
77 }
78 };
79
80 const updateTravel = async (travelUpdate: TravelInput) => {
81 try {
82 await updateTravelMutation({
83 variables: {
84 id: travel.id,
85 travelUpdate: {
86 ...travelUpdate,
87 },
88 },
89 refetchQueries: [
90 {
91 query: EventByUuidDocument,
92 variables: {
93 uuid: event.uuid,
94 },
95 },
96 ],
97 });
98 } catch (error) {
99 console.error(error);
100 addToast(t('travel.errors.cant_update'));
101 }
102 };
103
104 const removeTravel = async (successText?: string) => {
105 try {
106 await deleteTravelMutation({
107 variables: {
108 id: travel.id,
109 },
110 refetchQueries: [
111 {query: EventByUuidDocument, variables: {uuid: event.uuid}},
112 ],
113 });
114 addToast(successText || t('travel.actions.removed'));
115 } catch (error) {
116 console.error(error);
117 addToast(t('travel.errors.cant_remove'));
118 }
119 };
120
121 return {removePassengerFromTravel, updateTravel, removeTravel};
122};
123
124export default useActions;