all repos — caroster @ 47cfddf44c0e3ba91db7ce94b80ec360dcf3348d

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

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;