frontend/hooks/usePermissions.ts (view raw)
1import useEventStore from '../stores/useEventStore';
2import useProfile from './useProfile';
3
4interface UserPermissions {
5 canEditEventOptions: boolean;
6 canEditEventDetails: boolean;
7 canEditWaitingList: boolean;
8 canAddTravel: boolean;
9 editableTravels: Array<string>;
10 canJoinTravels: boolean;
11 canAddToTravel: boolean;
12}
13
14const noPermissions = {
15 canEditEventOptions: false,
16 canEditEventDetails: false,
17 canEditWaitingList: false,
18 canAddTravel: false,
19 editableTravels: [],
20 canJoinTravels: false,
21 canAddToTravel: false,
22};
23
24const usePermissions = (): {userPermissions: UserPermissions} => {
25 const {event} = useEventStore();
26 const {profile, connected, userId} = useProfile();
27
28 const carosterPlus = event?.enabled_modules?.includes('caroster-plus');
29 const userIsAnonymous = !connected;
30 const userIsEventCreator = event && profile?.email === event.email;
31 const userIsEventAdmin = event?.administrators?.includes(profile?.email);
32 const travels = event?.travels?.data || [];
33
34 const allPermissions: UserPermissions = {
35 canEditEventOptions: true,
36 canEditEventDetails: true,
37 canEditWaitingList: true,
38 canAddTravel: true,
39 editableTravels: travels.map(({id}) => id),
40 canJoinTravels: true,
41 canAddToTravel: true,
42 };
43
44 if (carosterPlus) {
45 if (userIsAnonymous) return {userPermissions: noPermissions};
46 else if (userIsEventCreator || userIsEventAdmin)
47 return {userPermissions: {...allPermissions, canAddToTravel: false}};
48 else {
49 const editableTravelsCollection = travels.filter(
50 travel => travel.attributes.user?.data?.id !== userId
51 );
52 const carosterPlusPermissions: UserPermissions = {
53 ...noPermissions,
54 editableTravels: editableTravelsCollection.map(({id}) => id),
55 canJoinTravels: true,
56 canAddTravel: true,
57 };
58 return {userPermissions: carosterPlusPermissions};
59 }
60 }
61 // Caroster Vanilla permissions
62 else
63 return {
64 userPermissions: {
65 ...allPermissions,
66 canEditEventOptions: userIsEventCreator,
67 canJoinTravels: connected,
68 },
69 };
70};
71
72export default usePermissions;