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