all repos — caroster @ 1410b54dc70ad59a92a3fe31c76237c46a37c1d8

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

frontend/hooks/usePermissions.ts (view raw)

  1import {PassengerEntity, TravelEntity} from '../generated/graphql';
  2import useEventStore from '../stores/useEventStore';
  3import useProfile from './useProfile';
  4
  5interface UserPermissions {
  6  canEditEventOptions: () => boolean;
  7  canEditEventDetails: () => boolean;
  8  canEditWaitingList: () => boolean;
  9  canAddTravel: () => boolean;
 10  canEditTravel: (travel: TravelEntity) => boolean;
 11  canJoinTravels: () => boolean;
 12  canAddToTravel: () => boolean;
 13  canDeletePassenger: (passenger: PassengerEntity) => boolean;
 14  canSeePassengerDetails: (passenger: PassengerEntity) => boolean;
 15}
 16
 17const noPermissions = {
 18  canEditEventOptions: () => false,
 19  canEditEventDetails: () => false,
 20  canEditWaitingList: () => false,
 21  canAddTravel: () => false,
 22  canEditTravel: () => false,
 23  canJoinTravels: () => false,
 24  canAddToTravel: () => false,
 25  canDeletePassenger: () => false,
 26  canSeePassengerDetails: () => false,
 27};
 28
 29const usePermissions = (): {userPermissions: UserPermissions} => {
 30  const {event} = useEventStore();
 31  const {profile, connected, userId} = useProfile();
 32
 33  const carosterPlus = event?.enabled_modules?.includes('caroster-plus');
 34  const userIsAnonymous = !connected;
 35  const userIsEventCreator = event && profile?.email === event.email;
 36  const userIsEventAdmin = event?.administrators?.includes(profile?.email);
 37
 38  const allPermissions: UserPermissions = {
 39    canEditEventOptions: () => true,
 40    canEditEventDetails: () => true,
 41    canEditWaitingList: () => true,
 42    canAddTravel: () => true,
 43    canEditTravel: () => true,
 44    canJoinTravels: () => true,
 45    canAddToTravel: () => true,
 46    canDeletePassenger: () => true,
 47    canSeePassengerDetails: () => true,
 48  };
 49
 50  if (carosterPlus) {
 51    if (userIsAnonymous) return {userPermissions: noPermissions};
 52    else if (userIsEventCreator || userIsEventAdmin)
 53      return {
 54        userPermissions: {...allPermissions, canAddToTravel: () => false},
 55      };
 56    else {
 57      const carosterPlusPermissions: UserPermissions = {
 58        ...noPermissions,
 59        canEditTravel: travel => {
 60          const travelCreatorId =
 61            travel.attributes.user?.data?.id || travel.attributes.user;
 62          return travelCreatorId === userId;
 63        },
 64        canJoinTravels: () => true,
 65        canAddTravel: () => true,
 66        canDeletePassenger: passenger => {
 67          const travel = event?.travels?.data?.find(travel =>
 68            travel.attributes.passengers.data.some(
 69              travelPassenger => travelPassenger.id === passenger.id
 70            )
 71          );
 72          const isTravelCreator = travel?.attributes.user?.data?.id === userId;
 73          const isCurrentPassenger =
 74            passenger.attributes.user?.data?.id === userId;
 75          return isTravelCreator || isCurrentPassenger;
 76        },
 77        canSeePassengerDetails: passenger => {
 78          const travel = event?.travels?.data?.find(travel =>
 79            travel.attributes.passengers.data.some(
 80              travelPassenger => travelPassenger.id === passenger.id
 81            )
 82          );
 83          const isTravelCreator = travel?.attributes.user?.data?.id === userId;
 84          const isCurrentPassenger =
 85            passenger?.attributes.user?.data?.id === userId;
 86          return isTravelCreator || isCurrentPassenger;
 87        },
 88      };
 89      return {userPermissions: carosterPlusPermissions};
 90    }
 91  }
 92  // Caroster Vanilla permissions
 93  else
 94    return {
 95      userPermissions: {
 96        ...allPermissions,
 97        canSeePassengerDetails: () => false,
 98        canDeletePassenger: () => true,
 99        canEditEventOptions: () => userIsEventCreator,
100        canJoinTravels: () => connected,
101      },
102    };
103};
104
105export default usePermissions;