all repos — caroster @ 296817c73e419caa195ca5d6fa90a5db7578e6c5

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

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;