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
30 const userIsAnonymous = !connected;
31 const userIsEventCreator = event && profile?.email === event.email;
32 const userIsEventAdmin = event?.administrators?.includes(profile?.email);
33
34 const travels = event?.travels?.data || [];
35
36 const allPermissions: UserPermissions = {
37 canEditEventOptions: true,
38 canEditEventDetails: true,
39 canEditWaitingList: true,
40 canAddTravel: true,
41 editableTravels: travels.map(({id}) => id),
42 canJoinTravels: true,
43 canAddToTravel: true,
44 };
45
46 if (carosterPlus) {
47 if (userIsAnonymous) return {userPermissions: noPermissions};
48 else if (userIsEventCreator || userIsEventAdmin)
49 return {userPermissions: {...allPermissions, canAddToTravel: false}};
50
51 const editableTravelsCollection = travels.filter(({attributes}) => {
52 const userIsDriver = attributes.user?.data?.id === userId;
53 return !userIsDriver;
54 });
55
56 const carosterPlusPermissions: UserPermissions = {
57 ...noPermissions,
58 editableTravels: editableTravelsCollection.map(({id}) => id),
59 canJoinTravels: true,
60 canAddTravel: true,
61 };
62
63 return {userPermissions: carosterPlusPermissions};
64 }
65 // Caroster Vanilla permissions
66 else
67 return {
68 userPermissions: {
69 ...allPermissions,
70 canEditEventOptions: userIsEventCreator,
71 canJoinTravels: connected,
72 },
73 };
74};
75
76export default usePermissions;