all repos — caroster @ e70dda0ec966d182cfaf626d43aea6888cdb7634

[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  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;