import { PassengerEntity, TravelEntity } from '../generated/graphql'; import useEventStore from '../stores/useEventStore'; import useProfile from './useProfile'; interface UserPermissions { canEditEventOptions: () => boolean; canEditEventDetails: () => boolean; canEditWaitingList: () => boolean; canAddTravel: () => boolean; canEditTravel: (travel: TravelEntity) => boolean; canJoinTravels: () => boolean; canAddToTravel: () => boolean; canDeletePassenger: (passenger: PassengerEntity) => boolean; canSeePassengerDetails: (passenger: PassengerEntity) => boolean; } const noPermissions = { canEditEventOptions: () => false, canEditEventDetails: () => false, canEditWaitingList: () => false, canAddTravel: () => false, canEditTravel: () => false, canJoinTravels: () => false, canAddToTravel: () => false, canDeletePassenger: () => false, canSeePassengerDetails: () => false, }; const usePermissions = (): { userPermissions: UserPermissions } => { const { event } = useEventStore(); const { profile, connected, userId } = useProfile(); const carosterPlus = event?.enabled_modules?.includes('caroster-plus'); const userIsAnonymous = !connected; const userIsEventCreator = event && profile?.email === event.email; const userIsEventAdmin = event?.administrators?.includes(profile?.email); const allPermissions: UserPermissions = { canEditEventOptions: () => true, canEditEventDetails: () => true, canEditWaitingList: () => true, canAddTravel: () => true, canEditTravel: () => true, canJoinTravels: () => true, canAddToTravel: () => true, canDeletePassenger: () => true, canSeePassengerDetails: () => true, }; if (carosterPlus) { if (userIsAnonymous) return { userPermissions: noPermissions }; else if (userIsEventCreator || userIsEventAdmin) return { userPermissions: { ...allPermissions, canAddToTravel: () => false }, }; else { const carosterPlusPermissions: UserPermissions = { ...noPermissions, canEditTravel: travel => { const travelCreatorId = travel.attributes.user?.data?.id || travel.attributes.user; return travelCreatorId === userId; }, canJoinTravels: () => true, canAddTravel: () => true, canDeletePassenger: passenger => { const travel = event?.travels?.data?.find(travel => travel.attributes.passengers.data.some( travelPassenger => travelPassenger.id === passenger.id ) ); const isTravelCreator = travel?.attributes.user?.data?.id === userId; const isCurrentPassenger = passenger.attributes.user?.data?.id === userId; return isTravelCreator || isCurrentPassenger; }, canSeePassengerDetails: (passenger) => { const travel = event?.travels?.data?.find(travel => travel?.id === passenger.attributes.travel.data?.id) const userIsDriver = travel?.attributes.user?.data?.id === userId; return userIsDriver || passenger.attributes.user?.data?.id === userId; } }; return { userPermissions: carosterPlusPermissions }; } } // Caroster Vanilla permissions else return { userPermissions: { ...allPermissions, canSeePassengerDetails: () => false, canDeletePassenger: () => true, canEditEventOptions: () => userIsEventCreator, canJoinTravels: () => connected, }, }; }; export default usePermissions;