all repos — caroster @ 296817c73e419caa195ca5d6fa90a5db7578e6c5

[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  Travel,
 11  useUpdatePassengerMutation,
 12  TravelInput,
 13} from '../../generated/graphql';
 14
 15interface Props {
 16  travel: Travel & {id: string};
 17}
 18
 19const useActions = (props: Props) => {
 20  const {travel} = props;
 21  const {t} = useTranslation();
 22  const event = useEventStore(s => s.event);
 23  const addToast = useToastStore(s => s.addToast);
 24  const clearToast = useToastStore(s => s.clearToast);
 25  const [updateTravelMutation] = useUpdateTravelMutation();
 26  const [deleteTravelMutation] = useDeleteTravelMutation();
 27  const [updatePassenger] = useUpdatePassengerMutation();
 28
 29  const sendPassengerToWaitingList = async (passengerId: string) => {
 30    try {
 31      await updatePassenger({
 32        variables: {
 33          id: passengerId,
 34          passengerUpdate: {
 35            event: event.id,
 36            travel: null,
 37          },
 38        },
 39        refetchQueries: ['eventByUUID'],
 40      });
 41      addToast(
 42        t('travel.moved_to_waiting_list'),
 43        <Link href={`/e/${event.uuid}/waitingList`} passHref>
 44          <Button
 45            size="small"
 46            color="primary"
 47            variant="contained"
 48            onClick={() => clearToast()}
 49          >
 50            {t('generic.access')}
 51          </Button>
 52        </Link>
 53      );
 54    } catch (error) {
 55      console.error(error);
 56      addToast(t('travel.errors.cant_remove_passenger'));
 57    }
 58  };
 59
 60  const updateTravel = async (travelUpdate: TravelInput) => {
 61    try {
 62      await updateTravelMutation({
 63        variables: {
 64          id: travel.id,
 65          travelUpdate: {
 66            ...travelUpdate,
 67          },
 68        },
 69        refetchQueries: [
 70          {
 71            query: EventByUuidDocument,
 72            variables: {
 73              uuid: event.uuid,
 74            },
 75          },
 76        ],
 77      });
 78    } catch (error) {
 79      console.error(error);
 80      addToast(t('travel.errors.cant_update'));
 81    }
 82  };
 83
 84  const removeTravel = async (successText?: string) => {
 85    try {
 86      await deleteTravelMutation({
 87        variables: {
 88          id: travel.id,
 89        },
 90        refetchQueries: [
 91          {query: EventByUuidDocument, variables: {uuid: event.uuid}},
 92        ],
 93      });
 94      addToast(successText || t('travel.actions.removed'));
 95    } catch (error) {
 96      console.error(error);
 97      addToast(t('travel.errors.cant_remove'));
 98    }
 99  };
100
101  return {sendPassengerToWaitingList, updateTravel, removeTravel};
102};
103
104export default useActions;