all repos — caroster @ 2514e64e14324d01eada51f08410194d01a169c4

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

feat: :sparkles: Allow only travel creator and admins to edit travel for Caroster plus
Tim Izzo tim@octree.ch
Mon, 12 Feb 2024 13:47:39 +0000
commit

2514e64e14324d01eada51f08410194d01a169c4

parent

296817c73e419caa195ca5d6fa90a5db7578e6c5

M frontend/containers/Travel/Header.tsxfrontend/containers/Travel/Header.tsx

@@ -31,7 +31,7 @@ const availableSeats = travel?.seats - passengersCount || 0;

return ( <Box - sx={{padding: 2}} + p={2} onClick={() => { setFocusOnTravel(focusedTravel === travel.id ? undefined : travel); const mapElement = document?.getElementById('map');
M frontend/containers/Travel/index.tsxfrontend/containers/Travel/index.tsx

@@ -32,16 +32,13 @@ const actions = useActions({travel});

const {userId, connected} = useProfile(); const {focusedTravel} = useMapStore(); const focused = focusedTravel === travel.id; - - if (!travel) return null; - const disableNewPassengers = travel.passengers.data?.length >= travel.seats; + const disableNewPassengers = travel?.passengers.data?.length >= travel.seats; const registered = useMemo(() => { if (!connected) return false; const isInTravel = travel.passengers?.data.some( passenger => passenger.attributes.user?.data?.id === `${userId}` ); - return isInTravel; }, [travel, userId]);

@@ -56,13 +53,12 @@ scrollMarginTop: theme.spacing(2),

}} id={travel.id} > - {isEditing ? ( + {isEditing && ( <HeaderEditing travel={travel} toggleEditing={toggleEditing} /> - ) : ( - <Header travel={travel} toggleEditing={toggleEditing} /> )} {!isEditing && ( <> + <Header travel={travel} toggleEditing={toggleEditing} /> {(canJoinTravels || canAddToTravel) && ( <> <Divider />
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -205,6 +205,9 @@ }

export enum Enum_Notification_Type { AddedAsAdmin = 'AddedAsAdmin', + EventCreated = 'EventCreated', + EventEnded = 'EventEnded', + EventRecap = 'EventRecap', NewPassengerInYourTrip = 'NewPassengerInYourTrip', NewTrip = 'NewTrip' }

@@ -218,65 +221,6 @@ en = 'en',

fr = 'fr' } -export type EmailDesignerEmailTemplate = { - __typename?: 'EmailDesignerEmailTemplate'; - bodyHtml?: Maybe<Scalars['String']['output']>; - bodyText?: Maybe<Scalars['String']['output']>; - createdAt?: Maybe<Scalars['DateTime']['output']>; - design?: Maybe<Scalars['JSON']['output']>; - enabled?: Maybe<Scalars['Boolean']['output']>; - name?: Maybe<Scalars['String']['output']>; - subject?: Maybe<Scalars['String']['output']>; - tags?: Maybe<Scalars['JSON']['output']>; - templateReferenceId?: Maybe<Scalars['Int']['output']>; - updatedAt?: Maybe<Scalars['DateTime']['output']>; -}; - -export type EmailDesignerEmailTemplateEntity = { - __typename?: 'EmailDesignerEmailTemplateEntity'; - attributes?: Maybe<EmailDesignerEmailTemplate>; - id?: Maybe<Scalars['ID']['output']>; -}; - -export type EmailDesignerEmailTemplateEntityResponse = { - __typename?: 'EmailDesignerEmailTemplateEntityResponse'; - data?: Maybe<EmailDesignerEmailTemplateEntity>; -}; - -export type EmailDesignerEmailTemplateEntityResponseCollection = { - __typename?: 'EmailDesignerEmailTemplateEntityResponseCollection'; - data: Array<EmailDesignerEmailTemplateEntity>; - meta: ResponseCollectionMeta; -}; - -export type EmailDesignerEmailTemplateFiltersInput = { - and?: InputMaybe<Array<InputMaybe<EmailDesignerEmailTemplateFiltersInput>>>; - bodyHtml?: InputMaybe<StringFilterInput>; - bodyText?: InputMaybe<StringFilterInput>; - createdAt?: InputMaybe<DateTimeFilterInput>; - design?: InputMaybe<JsonFilterInput>; - enabled?: InputMaybe<BooleanFilterInput>; - id?: InputMaybe<IdFilterInput>; - name?: InputMaybe<StringFilterInput>; - not?: InputMaybe<EmailDesignerEmailTemplateFiltersInput>; - or?: InputMaybe<Array<InputMaybe<EmailDesignerEmailTemplateFiltersInput>>>; - subject?: InputMaybe<StringFilterInput>; - tags?: InputMaybe<JsonFilterInput>; - templateReferenceId?: InputMaybe<IntFilterInput>; - updatedAt?: InputMaybe<DateTimeFilterInput>; -}; - -export type EmailDesignerEmailTemplateInput = { - bodyHtml?: InputMaybe<Scalars['String']['input']>; - bodyText?: InputMaybe<Scalars['String']['input']>; - design?: InputMaybe<Scalars['JSON']['input']>; - enabled?: InputMaybe<Scalars['Boolean']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - subject?: InputMaybe<Scalars['String']['input']>; - tags?: InputMaybe<Scalars['JSON']['input']>; - templateReferenceId?: InputMaybe<Scalars['Int']['input']>; -}; - export type Event = { __typename?: 'Event'; address?: Maybe<Scalars['String']['output']>;

@@ -406,7 +350,7 @@ or?: InputMaybe<Array<InputMaybe<Scalars['Float']['input']>>>;

startsWith?: InputMaybe<Scalars['Float']['input']>; }; -export type GenericMorph = ContentReleasesRelease | ContentReleasesReleaseAction | EmailDesignerEmailTemplate | Event | I18NLocale | Module | Notification | Page | Passenger | Setting | Travel | TripAlert | UploadFile | UploadFolder | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsUser | Vehicle; +export type GenericMorph = ContentReleasesRelease | ContentReleasesReleaseAction | Event | I18NLocale | Module | Notification | Page | Passenger | Setting | Travel | TripAlert | UploadFile | UploadFolder | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsUser | Vehicle; export type I18NLocale = { __typename?: 'I18NLocale';

@@ -564,7 +508,6 @@ /** Change user password. Confirm with the current password. */

changePassword?: Maybe<UsersPermissionsLoginPayload>; createContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; createContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; - createEmailDesignerEmailTemplate?: Maybe<EmailDesignerEmailTemplateEntityResponse>; createEvent?: Maybe<EventEntityResponse>; createModuleLocalization?: Maybe<ModuleEntityResponse>; createNotification?: Maybe<NotificationEntityResponse>;

@@ -583,7 +526,6 @@ createUsersPermissionsUser: UsersPermissionsUserEntityResponse;

createVehicle?: Maybe<VehicleEntityResponse>; deleteContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; deleteContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; - deleteEmailDesignerEmailTemplate?: Maybe<EmailDesignerEmailTemplateEntityResponse>; deleteEvent?: Maybe<EventEntityResponse>; deleteEventAdmin?: Maybe<EventEntityResponse>; deleteModule?: Maybe<ModuleEntityResponse>;

@@ -615,7 +557,6 @@ resetPassword?: Maybe<UsersPermissionsLoginPayload>;

setTripAlert?: Maybe<TripAlertEntityResponse>; updateContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; updateContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; - updateEmailDesignerEmailTemplate?: Maybe<EmailDesignerEmailTemplateEntityResponse>; updateEvent?: Maybe<EventEntityResponse>; /** Update an event using its UUID */ updateEventByUUID?: Maybe<EventEntityResponse>;

@@ -624,6 +565,7 @@ updateMe: UsersPermissionsUserEntityResponse;

updateModule?: Maybe<ModuleEntityResponse>; updateNotification?: Maybe<NotificationEntityResponse>; updatePage?: Maybe<PageEntityResponse>; + /** Update a passenger */ updatePassenger?: Maybe<PassengerEntityResponse>; updateSetting?: Maybe<SettingEntityResponse>; updateTravel?: Maybe<TravelEntityResponse>;

@@ -662,11 +604,6 @@ data: ContentReleasesReleaseActionInput;

}; -export type MutationCreateEmailDesignerEmailTemplateArgs = { - data: EmailDesignerEmailTemplateInput; -}; - - export type MutationCreateEventArgs = { data: EventInput; };

@@ -743,11 +680,6 @@ };

export type MutationDeleteContentReleasesReleaseActionArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteEmailDesignerEmailTemplateArgs = { id: Scalars['ID']['input']; };

@@ -890,12 +822,6 @@ id: Scalars['ID']['input'];

}; -export type MutationUpdateEmailDesignerEmailTemplateArgs = { - data: EmailDesignerEmailTemplateInput; - id: Scalars['ID']['input']; -}; - - export type MutationUpdateEventArgs = { data: EventInput; id: Scalars['ID']['input'];

@@ -1003,6 +929,7 @@ export type Notification = {

__typename?: 'Notification'; createdAt?: Maybe<Scalars['DateTime']['output']>; event?: Maybe<EventEntityResponse>; + payload?: Maybe<Scalars['JSON']['output']>; read?: Maybe<Scalars['Boolean']['output']>; type: Enum_Notification_Type; updatedAt?: Maybe<Scalars['DateTime']['output']>;

@@ -1033,6 +960,7 @@ event?: InputMaybe<EventFiltersInput>;

id?: InputMaybe<IdFilterInput>; not?: InputMaybe<NotificationFiltersInput>; or?: InputMaybe<Array<InputMaybe<NotificationFiltersInput>>>; + payload?: InputMaybe<JsonFilterInput>; read?: InputMaybe<BooleanFilterInput>; type?: InputMaybe<StringFilterInput>; updatedAt?: InputMaybe<DateTimeFilterInput>;

@@ -1041,6 +969,7 @@ };

export type NotificationInput = { event?: InputMaybe<Scalars['ID']['input']>; + payload?: InputMaybe<Scalars['JSON']['input']>; read?: InputMaybe<Scalars['Boolean']['input']>; type?: InputMaybe<Enum_Notification_Type>; user?: InputMaybe<Scalars['ID']['input']>;

@@ -1174,8 +1103,6 @@ contentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>;

contentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; contentReleasesReleaseActions?: Maybe<ContentReleasesReleaseActionEntityResponseCollection>; contentReleasesReleases?: Maybe<ContentReleasesReleaseEntityResponseCollection>; - emailDesignerEmailTemplate?: Maybe<EmailDesignerEmailTemplateEntityResponse>; - emailDesignerEmailTemplates?: Maybe<EmailDesignerEmailTemplateEntityResponseCollection>; event?: Maybe<EventEntityResponse>; /** Retrieve an event using its UUID */ eventByUUID?: Maybe<EventEntityResponse>;

@@ -1228,18 +1155,6 @@

export type QueryContentReleasesReleasesArgs = { filters?: InputMaybe<ContentReleasesReleaseFiltersInput>; - pagination?: InputMaybe<PaginationArg>; - sort?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>; -}; - - -export type QueryEmailDesignerEmailTemplateArgs = { - id?: InputMaybe<Scalars['ID']['input']>; -}; - - -export type QueryEmailDesignerEmailTemplatesArgs = { - filters?: InputMaybe<EmailDesignerEmailTemplateFiltersInput>; pagination?: InputMaybe<PaginationArg>; sort?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>; };

@@ -2120,7 +2035,7 @@

export type ResetPasswordMutation = { __typename?: 'Mutation', resetPassword?: { __typename?: 'UsersPermissionsLoginPayload', jwt?: string | null, user: { __typename?: 'UsersPermissionsMe', id: string, username: string, email?: string | null, confirmed?: boolean | null } } | null }; -export type EventFieldsFragment = { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null }; +export type EventFieldsFragment = { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null } | null } | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null }; export type CreateEventMutationVariables = Exact<{ name: Scalars['String']['input'];

@@ -2134,7 +2049,7 @@ newsletter?: InputMaybe<Scalars['Boolean']['input']>;

}>; -export type CreateEventMutation = { __typename?: 'Mutation', createEvent?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; +export type CreateEventMutation = { __typename?: 'Mutation', createEvent?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null } | null } | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; export type UpdateEventMutationVariables = Exact<{ uuid: Scalars['String']['input'];

@@ -2142,7 +2057,7 @@ eventUpdate: EventInput;

}>; -export type UpdateEventMutation = { __typename?: 'Mutation', updateEventByUUID?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; +export type UpdateEventMutation = { __typename?: 'Mutation', updateEventByUUID?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null } | null } | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; export type AddEventAdminMutationVariables = Exact<{ eventId: Scalars['ID']['input'];

@@ -2165,7 +2080,7 @@ uuid: Scalars['String']['input'];

}>; -export type EventByUuidQuery = { __typename?: 'Query', eventByUUID?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; +export type EventByUuidQuery = { __typename?: 'Query', eventByUUID?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, name: string, description?: string | null, enabled_modules?: any | null, email: string, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, position?: any | null, waitingPassengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, email?: string | null, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null, attributes?: { __typename?: 'Travel', meeting?: string | null, meeting_latitude?: number | null, meeting_longitude?: number | null, departure?: any | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, seats?: number | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null } | null } | null, passengers?: { __typename?: 'PassengerRelationResponseCollection', data: Array<{ __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }> } | null } | null }> } | null } | null } | null } | null }; export type ModuleQueryVariables = Exact<{ locale: Scalars['I18NLocaleCode']['input'];

@@ -2326,6 +2241,11 @@ details

vehicleName phone_number seats + user { + data { + id + } + } passengers { data { id
M frontend/graphql/event.gqlfrontend/graphql/event.gql

@@ -37,12 +37,17 @@ id

attributes { meeting meeting_latitude - meeting_longitude + meeting_longitude departure details vehicleName phone_number seats + user { + data { + id + } + } passengers { data { id

@@ -103,7 +108,7 @@ }

} } -mutation addEventAdmin($eventId: ID!, $email: String!){ +mutation addEventAdmin($eventId: ID!, $email: String!) { addEventAdmin(eventId: $eventId, email: $email) { data { id

@@ -114,7 +119,7 @@ }

} } -mutation deleteEventAdmin($eventId: ID!, $email: String!){ +mutation deleteEventAdmin($eventId: ID!, $email: String!) { deleteEventAdmin(eventId: $eventId, email: $email) { data { id
M frontend/hooks/usePermissions.tsfrontend/hooks/usePermissions.ts

@@ -26,11 +26,9 @@ 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 travels = event?.travels?.data || []; const allPermissions: UserPermissions = {

@@ -47,20 +45,18 @@ if (carosterPlus) {

if (userIsAnonymous) return {userPermissions: noPermissions}; else if (userIsEventCreator || userIsEventAdmin) return {userPermissions: {...allPermissions, canAddToTravel: false}}; - - const editableTravelsCollection = travels.filter(({attributes}) => { - const userIsDriver = attributes.user?.data?.id === userId; - return !userIsDriver; - }); - - const carosterPlusPermissions: UserPermissions = { - ...noPermissions, - editableTravels: editableTravelsCollection.map(({id}) => id), - canJoinTravels: true, - canAddTravel: true, - }; - - return {userPermissions: carosterPlusPermissions}; + else { + const editableTravelsCollection = travels.filter( + travel => travel.attributes.user?.data?.id !== userId + ); + const carosterPlusPermissions: UserPermissions = { + ...noPermissions, + editableTravels: editableTravelsCollection.map(({id}) => id), + canJoinTravels: true, + canAddTravel: true, + }; + return {userPermissions: carosterPlusPermissions}; + } } // Caroster Vanilla permissions else