all repos — caroster @ ec2276de0c9fc726e11e5be10ba90e54216f1cec

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

feat: ✨ Show passenger info in drawer for travel creators #413
Maylie maylie@octree.ch
Thu, 15 Feb 2024 14:09:17 +0000
commit

ec2276de0c9fc726e11e5be10ba90e54216f1cec

parent

d25fd2970a46f8b86f2abaaff47a8ebef62e4f73

M backend/src/api/notification/content-types/notification/schema.jsonbackend/src/api/notification/content-types/notification/schema.json

@@ -21,7 +21,8 @@ "DeletedTrip",

"AddedAsAdmin", "EventCreated", "EventEnded", - "EventRecap" + "EventRecap", + "PassengerJoinTrip" ], "required": true },
M backend/types/generated/contentTypes.d.tsbackend/types/generated/contentTypes.d.ts

@@ -962,7 +962,8 @@ 'DeletedTrip',

'AddedAsAdmin', 'EventCreated', 'EventEnded', - 'EventRecap' + 'EventRecap', + 'PassengerJoinTrip' ] > & Attribute.Required;
M e2e/graphql.tse2e/graphql.ts

@@ -203,7 +203,9 @@ }

export enum Enum_Notification_Type { NewPassengerInYourTrip = 'NewPassengerInYourTrip', - NewTrip = 'NewTrip' + NewTrip = 'NewTrip', + AddedAsAdmin = 'AddedAsAdmin', + PassengerJoinTrip = 'PassengerJoinTrip' } export enum Enum_Page_Type {

@@ -2257,7 +2259,7 @@ }

} `; -export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => Promise<T>; +export type SdkFunctionWrapper = <T>(action: (requestHeaders?: Record<string, string>) => Promise<T>, operationName: string, operationType?: string) => Promise<T>; const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action();

@@ -2265,58 +2267,58 @@

export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { login(variables: LoginMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<LoginMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<LoginMutation>(LoginDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'login', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<LoginMutation>(LoginDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'login', 'mutation'); }, register(variables: RegisterMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<RegisterMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<RegisterMutation>(RegisterDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'register', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<RegisterMutation>(RegisterDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'register', 'mutation'); }, forgotPassword(variables: ForgotPasswordMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<ForgotPasswordMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<ForgotPasswordMutation>(ForgotPasswordDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'forgotPassword', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<ForgotPasswordMutation>(ForgotPasswordDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'forgotPassword', 'mutation'); }, resetPassword(variables: ResetPasswordMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<ResetPasswordMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<ResetPasswordMutation>(ResetPasswordDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'resetPassword', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<ResetPasswordMutation>(ResetPasswordDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'resetPassword', 'mutation'); }, createEvent(variables: CreateEventMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<CreateEventMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<CreateEventMutation>(CreateEventDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'createEvent', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<CreateEventMutation>(CreateEventDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'createEvent', 'mutation'); }, updateEvent(variables: UpdateEventMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<UpdateEventMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<UpdateEventMutation>(UpdateEventDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'updateEvent', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<UpdateEventMutation>(UpdateEventDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'updateEvent', 'mutation'); }, eventByUUID(variables: EventByUuidQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<EventByUuidQuery> { - return withWrapper((wrappedRequestHeaders) => client.request<EventByUuidQuery>(EventByUuidDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'eventByUUID', 'query'); + return withWrapper((wrappedRequestHeaders) => client.request<EventByUuidQuery>(EventByUuidDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'eventByUUID', 'query'); }, createPassenger(variables: CreatePassengerMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<CreatePassengerMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<CreatePassengerMutation>(CreatePassengerDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'createPassenger', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<CreatePassengerMutation>(CreatePassengerDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'createPassenger', 'mutation'); }, updatePassenger(variables: UpdatePassengerMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<UpdatePassengerMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<UpdatePassengerMutation>(UpdatePassengerDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'updatePassenger', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<UpdatePassengerMutation>(UpdatePassengerDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'updatePassenger', 'mutation'); }, deletePassenger(variables: DeletePassengerMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<DeletePassengerMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<DeletePassengerMutation>(DeletePassengerDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'deletePassenger', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<DeletePassengerMutation>(DeletePassengerDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'deletePassenger', 'mutation'); }, setting(variables: SettingQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<SettingQuery> { - return withWrapper((wrappedRequestHeaders) => client.request<SettingQuery>(SettingDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'setting', 'query'); + return withWrapper((wrappedRequestHeaders) => client.request<SettingQuery>(SettingDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'setting', 'query'); }, createTravel(variables: CreateTravelMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<CreateTravelMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<CreateTravelMutation>(CreateTravelDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'createTravel', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<CreateTravelMutation>(CreateTravelDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'createTravel', 'mutation'); }, updateTravel(variables: UpdateTravelMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<UpdateTravelMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<UpdateTravelMutation>(UpdateTravelDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'updateTravel', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<UpdateTravelMutation>(UpdateTravelDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'updateTravel', 'mutation'); }, deleteTravel(variables: DeleteTravelMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<DeleteTravelMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<DeleteTravelMutation>(DeleteTravelDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'deleteTravel', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<DeleteTravelMutation>(DeleteTravelDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'deleteTravel', 'mutation'); }, profile(variables?: ProfileQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<ProfileQuery> { - return withWrapper((wrappedRequestHeaders) => client.request<ProfileQuery>(ProfileDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'profile', 'query'); + return withWrapper((wrappedRequestHeaders) => client.request<ProfileQuery>(ProfileDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'profile', 'query'); }, updateMe(variables: UpdateMeMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<UpdateMeMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<UpdateMeMutation>(UpdateMeDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'updateMe', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<UpdateMeMutation>(UpdateMeDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'updateMe', 'mutation'); }, findUserVehicles(variables?: FindUserVehiclesQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<FindUserVehiclesQuery> { - return withWrapper((wrappedRequestHeaders) => client.request<FindUserVehiclesQuery>(FindUserVehiclesDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'findUserVehicles', 'query'); + return withWrapper((wrappedRequestHeaders) => client.request<FindUserVehiclesQuery>(FindUserVehiclesDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'findUserVehicles', 'query'); }, deleteVehicle(variables: DeleteVehicleMutationVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<DeleteVehicleMutation> { - return withWrapper((wrappedRequestHeaders) => client.request<DeleteVehicleMutation>(DeleteVehicleDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'deleteVehicle', 'mutation'); + return withWrapper((wrappedRequestHeaders) => client.request<DeleteVehicleMutation>(DeleteVehicleDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'deleteVehicle', 'mutation'); } }; }
M frontend/containers/DrawerNotification/CardNotification.tsxfrontend/containers/DrawerNotification/CardNotification.tsx

@@ -1,11 +1,8 @@

-import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; +import {Box, Typography, Stack, Badge} from '@mui/material/'; import { NotificationEntity, useReadNotificationsMutation, } from '../../generated/graphql'; -import Stack from '@mui/material/Stack'; -import Badge from '@mui/material/Badge'; import {useRouter} from 'next/navigation'; import {useTranslation} from 'react-i18next'; import {formatDate} from './formatDate';

@@ -15,10 +12,7 @@ notification: NotificationEntity;

onClose: () => void; } -const CardNotification: React.FC<NotificationProps> = ({ - notification, - onClose, -}: NotificationProps) => { +const CardNotification = ({notification, onClose}: NotificationProps) => { const router = useRouter(); const {t} = useTranslation(); const [readNotifications] = useReadNotificationsMutation();

@@ -26,11 +20,12 @@

const eventName = notification.attributes.event.data?.attributes?.name; const handleClick = () => { - router.push(`/e/${notification.attributes.event.data.attributes.uuid}`); readNotifications({ refetchQueries: ['UserNotifications'], variables: {id: notification.id}, }); + + router.push(`/e/${notification.attributes.event.data.attributes.uuid}`); onClose(); };
M frontend/containers/DrawerNotification/DrawerContent.tsxfrontend/containers/DrawerNotification/DrawerContent.tsx

@@ -1,37 +1,32 @@

-import Drawer from '@mui/material/Drawer'; -import Box from '@mui/material/Box'; +import {Drawer, Box, Icon, Typography} from '@mui/material/'; +import useMediaQuery from '@mui/material/useMediaQuery'; import { useUserNotificationsQuery, useReadNotificationsMutation, + NotificationEntity, } from '../../generated/graphql'; import CardNotification from './CardNotification'; import DrawerHeader from './DrawerHeader'; -import Icon from '@mui/material/Icon'; -import Typography from '@mui/material/Typography'; -import useMediaQuery from '@mui/material/useMediaQuery'; import {useTranslation} from 'react-i18next'; interface Props { isOpen: boolean; onClose: () => void; + notification: NotificationEntity; } -const DrawerContent: React.FC<Props> = ({isOpen, onClose}) => { +const DrawerContent = ({isOpen, onClose}: Props) => { const {data} = useUserNotificationsQuery(); const [readNotifications] = useReadNotificationsMutation(); const {t} = useTranslation(); - const notifications = data?.me?.profile?.notifications?.data || []; - const hasNotifications = notifications.length > 0; - const markAllRead = () => { readNotifications({refetchQueries: ['UserNotifications']}); }; const isAllRead = notifications.every( notification => notification.attributes.read ); - const isMobile = useMediaQuery('(max-width:400px)'); return (

@@ -58,7 +53,6 @@ onClose={onClose}

markAllRead={markAllRead} disabled={isAllRead} /> - <Box> {hasNotifications ? ( notifications.map((notification, index) => (
A frontend/containers/DrawerPassenger/DrawerPassengerHeader.tsx

@@ -0,0 +1,60 @@

+import {Box, IconButton, Icon, Typography} from '@mui/material'; +import {t} from 'i18next'; + +interface DrawerHeaderProps { + isMobile: boolean; + onClose: () => void; +} + +const DrawerHeader = ({isMobile, onClose}: DrawerHeaderProps) => { + return ( + <Box> + {!isMobile && ( + <Box + display="flex" + justifyContent="flex-end" + alignItems="flex-end" + paddingTop={2} + > + <IconButton + sx={{marginRight: 0}} + color="inherit" + edge="end" + aria-label="close" + onClick={onClose} + id="CloseBtn" + > + <Icon>close</Icon> + </IconButton> + </Box> + )} + <Box + display="flex" + alignItems="center" + justifyContent="space-between" + paddingBottom={2} + > + <Box display="flex" alignItems="center"> + {isMobile && ( + <IconButton + sx={{marginRight: 0}} + color="inherit" + edge="end" + aria-label="close" + onClick={onClose} + id="CloseBtn" + > + <Icon>chevron_left</Icon> + </IconButton> + )} + <Typography + variant="h3" + pl={2} + >{t`passenger.informations.title`}</Typography> + </Box> + </Box> + </Box> + ); +}; + +export default DrawerHeader;
A frontend/containers/DrawerPassenger/index.tsx

@@ -0,0 +1,89 @@

+import { + Drawer, + Icon, + Typography, + useMediaQuery, + Link, + Box, +} from '@mui/material'; +import {useTranslation} from 'react-i18next'; +import DrawerPassengerHeader from './DrawerPassengerHeader'; + +interface Props { + isOpen: boolean; + onClose: () => void; + firstName: string; + lastName: string; + email: string; +} + +const DrawerPassenger = ({ + isOpen, + onClose, + lastName, + firstName, + email, +}: Props) => { + const {t} = useTranslation(); + const isMobile = useMediaQuery('(max-width:400px)'); + + return ( + <Drawer + anchor="right" + open={isOpen} + onClose={onClose} + hideBackdrop={true} + sx={{ + height: 'auto', + '& .MuiDrawer-paper': { + width: isMobile ? '100%' : '375px', + maxWidth: '100%', + }, + }} + > + <Box bgcolor="background.default" sx={{height: '100%', overflow: 'auto'}}> + <DrawerPassengerHeader isMobile={isMobile} onClose={onClose} /> + <Box + display="flex" + flexDirection="column" + gap={2} + bgcolor="white" + padding={2} + > + <Box display="flex" flexDirection="column"> + <Typography variant="h6"> + {t('passenger.informations.name.label')} + </Typography> + <Typography variant="body1" gutterBottom> + {firstName} + </Typography> + </Box> + <Box display="flex" flexDirection="column"> + <Typography variant="h6"> + {t('passenger.informations.surname.label')} + </Typography> + <Typography variant="body1" gutterBottom> + {lastName} + </Typography> + </Box> + <Box display="flex" flexDirection="column"> + <Typography variant="h6"> + {t('passenger.informations.email.label')} + </Typography> + <Typography variant="body1" gutterBottom> + {email} + </Typography> + </Box> + <Link + sx={{display: 'flex', flexDirection: 'row', gap: 1}} + href={`mailto:${email}`} + > + <Icon>email</Icon> {t('passenger.informations.email.label')} + </Link> + </Box> + </Box> + </Drawer> + ); +}; + +export default DrawerPassenger;
M frontend/containers/PassengersList/Passenger.tsxfrontend/containers/PassengersList/Passenger.tsx

@@ -1,15 +1,19 @@

-import {ReactNode} from 'react'; -import ListItemAvatar from '@mui/material/ListItemAvatar'; -import ListItemIcon from '@mui/material/ListItemIcon'; -import ListItemText from '@mui/material/ListItemText'; -import Chip from '@mui/material/Chip'; -import Box from '@mui/material/Box'; -import Typography from '@mui/material/Typography'; -import Icon from '@mui/material/Icon'; -import {useTheme} from '@mui/material/styles'; +import {ReactNode, useReducer} from 'react'; +import { + ListItemAvatar, + ListItemIcon, + ListItemText, + Chip, + Box, + Typography, + Icon, + useTheme, +} from '@mui/material'; import {useTranslation} from 'react-i18next'; import useProfile from '../../hooks/useProfile'; import {PassengerEntity} from '../../generated/graphql'; +import DrawerPassenger from '../DrawerPassenger'; +import usePermissions from '../../hooks/usePermissions'; interface Props { passenger?: PassengerEntity;

@@ -22,8 +26,16 @@ const {passenger, button, isTravel} = props;

const theme = useTheme(); const {t} = useTranslation(); - const {userId} = useProfile(); + const [openDrawerPassenger, toggleDrawerPassenger] = useReducer( + i => !i, + false + ); + const { + userPermissions: {canSeePassengerDetails}, + } = usePermissions(); + + const {userId} = useProfile(); const isUser = `${userId}` === passenger?.attributes.user?.data?.id; const showLocation = isTravel ? null : ( <Typography

@@ -37,16 +49,20 @@ );

if (passenger) { return ( - <Box sx={{width: 1}}> + <Box sx={{width: 1}} aria-label="user informations"> <ListItemText primary={ <Box + onClick={toggleDrawerPassenger} sx={{ width: 1, maxWidth: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', + cursor: canSeePassengerDetails(passenger) + ? 'pointer' + : 'inherit', }} > <Icon fontSize="inherit" sx={{verticalAlign: 'middle', mr: 0.5}}>

@@ -76,9 +92,18 @@ </Box>

} /> {button} + {canSeePassengerDetails(passenger) && ( + <DrawerPassenger + isOpen={openDrawerPassenger} + onClose={() => toggleDrawerPassenger()} + firstName={passenger?.attributes.user?.data?.attributes.firstName} + lastName={passenger?.attributes.user?.data?.attributes.lastName} + email={passenger?.attributes.email} + /> + )} </Box> ); - } else + } else { return ( <> <ListItemAvatar>

@@ -92,6 +117,7 @@ sx={{color: theme.palette.text.secondary}}

/> </> ); + } }; export default Passenger;
M frontend/containers/PassengersList/index.tsxfrontend/containers/PassengersList/index.tsx

@@ -1,8 +1,7 @@

-import List from '@mui/material/List'; -import {styled, useTheme} from '@mui/material/styles'; -import ListItem from '@mui/material/ListItem'; +import {useState} from 'react'; +import {ListItem, List, styled, useTheme} from '@mui/material'; import Passenger from './Passenger'; -import {PassengerEntity} from '../../generated/graphql'; +import {PassengerEntity, TravelEntity} from '../../generated/graphql'; const PREFIX = 'PassengersList';

@@ -33,13 +32,14 @@

interface Props { passengers: PassengerEntity[]; Button: PassengerButton; - isTravel?: boolean; + travel?: TravelEntity; onPress?: (passengerId: string) => void; onClick?: (passengerId: string) => void; } const PassengersList = (props: Props) => { - const {passengers, Button, onClick, onPress, isTravel} = props; + const {passengers, Button, onClick, onPress, travel} = props; + const theme = useTheme(); let list = passengers;

@@ -57,8 +57,11 @@ onClick={() => !!onPress && onPress(passenger.id)}

> <Passenger key={index} - passenger={passenger} - isTravel={isTravel} + passenger={{ + id: passenger.id, + attributes: {...passenger.attributes, travel: {data: travel}}, + }} + isTravel={!!travel} button={ <Button passenger={passenger}
M frontend/containers/Travel/index.tsxfrontend/containers/Travel/index.tsx

@@ -79,9 +79,12 @@ {travel.attributes.passengers.data.length > 0 && <Divider />}

<PassengersList passengers={travel.attributes.passengers.data} onClick={actions.sendPassengerToWaitingList} - isTravel + travel={travel} Button={({onClick, passenger}) => - canDeletePassenger({id: passenger.id, attributes: {...passenger.attributes, travel: {data: travel}}}) && ( + canDeletePassenger({ + id: passenger.id, + attributes: {...passenger.attributes, travel: {data: travel}}, + }) && ( <ListItemSecondaryAction> <Button color="primary" onClick={onClick} tabIndex={-1}> {t`travel.passengers.remove`}
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -210,7 +210,8 @@ EventCreated = 'EventCreated',

EventEnded = 'EventEnded', EventRecap = 'EventRecap', NewPassengerInYourTrip = 'NewPassengerInYourTrip', - NewTrip = 'NewTrip' + NewTrip = 'NewTrip', + PassengerJoinTrip = 'PassengerJoinTrip' } export enum Enum_Page_Type {

@@ -2060,7 +2061,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, 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 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, email?: 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'];

@@ -2074,7 +2075,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, 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 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, email?: 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'];

@@ -2082,7 +2083,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, 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 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, email?: 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'];

@@ -2105,7 +2106,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, 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 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, email?: 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'];

@@ -2128,14 +2129,14 @@

export type ReadNotificationsMutation = { __typename?: 'Mutation', readNotifications?: { __typename?: 'NotificationEntityResponseCollection', data: Array<{ __typename?: 'NotificationEntity', id?: string | null, attributes?: { __typename?: 'Notification', type: Enum_Notification_Type, read?: boolean | null } | null }> } | null }; -export type PassengerFieldsFragment = { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null } | null } | null } | null } | null }; +export type PassengerFieldsFragment = { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null, email: string } | null } | null } | null } | null }; export type CreatePassengerMutationVariables = Exact<{ passenger: PassengerInput; }>; -export type CreatePassengerMutation = { __typename?: 'Mutation', createPassenger?: { __typename?: 'PassengerEntityResponse', data?: { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: 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 }; +export type CreatePassengerMutation = { __typename?: 'Mutation', createPassenger?: { __typename?: 'PassengerEntityResponse', data?: { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null, email: string } | null } | null } | null } | null } | null } | null }; export type UpdatePassengerMutationVariables = Exact<{ id: Scalars['ID']['input'];

@@ -2143,7 +2144,7 @@ passengerUpdate: PassengerInput;

}>; -export type UpdatePassengerMutation = { __typename?: 'Mutation', updatePassenger?: { __typename?: 'PassengerEntityResponse', data?: { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: 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 }; +export type UpdatePassengerMutation = { __typename?: 'Mutation', updatePassenger?: { __typename?: 'PassengerEntityResponse', data?: { __typename?: 'PassengerEntity', id?: string | null, attributes?: { __typename?: 'Passenger', name: string, location?: string | null, email?: string | null, user?: { __typename?: 'UsersPermissionsUserEntityResponse', data?: { __typename?: 'UsersPermissionsUserEntity', id?: string | null, attributes?: { __typename?: 'UsersPermissionsUser', firstName?: string | null, lastName?: string | null, email: string } | null } | null } | null } | null } | null } | null }; export type DeletePassengerMutationVariables = Exact<{ id: Scalars['ID']['input'];

@@ -2159,7 +2160,7 @@

export type SettingQuery = { __typename?: 'Query', setting?: { __typename?: 'SettingEntityResponse', data?: { __typename?: 'SettingEntity', id?: string | null, attributes?: { __typename?: 'Setting', gtm_id?: string | null, about_link?: string | null, faq_link?: string | null, announcement?: string | null, matomo_script_url?: string | null, opencollective_link?: string | null, code_link?: string | null, stripe_dashboard_link?: string | null } | null } | null } | null }; -export type TravelFieldsFragment = { __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 }; +export type TravelFieldsFragment = { __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, email: string } | null } | null } | null } | null }> } | null } | null }; export type CreateTravelMutationVariables = Exact<{ travel: TravelInput;

@@ -2167,7 +2168,7 @@ createVehicle?: InputMaybe<Scalars['Boolean']['input']>;

}>; -export type CreateTravelMutation = { __typename?: 'Mutation', createTravel?: { __typename?: 'TravelEntityResponse', data?: { __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 CreateTravelMutation = { __typename?: 'Mutation', createTravel?: { __typename?: 'TravelEntityResponse', data?: { __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, email: string } | null } | null } | null } | null }> } | null } | null } | null } | null }; export type UpdateTravelMutationVariables = Exact<{ id: Scalars['ID']['input'];

@@ -2175,7 +2176,7 @@ travelUpdate: TravelInput;

}>; -export type UpdateTravelMutation = { __typename?: 'Mutation', updateTravel?: { __typename?: 'TravelEntityResponse', data?: { __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 UpdateTravelMutation = { __typename?: 'Mutation', updateTravel?: { __typename?: 'TravelEntityResponse', data?: { __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, email: string } | null } | null } | null } | null }> } | null } | null } | null } | null }; export type DeleteTravelMutationVariables = Exact<{ id: Scalars['ID']['input'];

@@ -2277,6 +2278,7 @@ id

attributes { name location + email user { data { id

@@ -2308,6 +2310,7 @@ id

attributes { firstName lastName + email } } }

@@ -2338,6 +2341,7 @@ id

attributes { firstName lastName + email } } }
M frontend/graphql/event.gqlfrontend/graphql/event.gql

@@ -54,6 +54,7 @@ id

attributes { name location + email user { data { id
M frontend/graphql/passenger.gqlfrontend/graphql/passenger.gql

@@ -10,6 +10,7 @@ id

attributes { firstName lastName + email } } }
M frontend/graphql/travel.gqlfrontend/graphql/travel.gql

@@ -21,6 +21,7 @@ id

attributes { firstName lastName + email } } }
M frontend/hooks/usePermissions.tsfrontend/hooks/usePermissions.ts

@@ -11,6 +11,7 @@ canEditTravel: (travel: TravelEntity) => boolean;

canJoinTravels: () => boolean; canAddToTravel: () => boolean; canDeletePassenger: (passenger: PassengerEntity) => boolean; + canSeePassengerDetails: (passenger: PassengerEntity) => boolean; } const noPermissions = {

@@ -22,6 +23,7 @@ canEditTravel: () => false,

canJoinTravels: () => false, canAddToTravel: () => false, canDeletePassenger: () => false, + canSeePassengerDetails: () => false, }; const usePermissions = (): {userPermissions: UserPermissions} => {

@@ -42,25 +44,40 @@ canEditTravel: () => true,

canJoinTravels: () => true, canAddToTravel: () => true, canDeletePassenger: () => true, + canSeePassengerDetails: () => true, }; if (carosterPlus) { if (userIsAnonymous) return {userPermissions: noPermissions}; else if (userIsEventCreator || userIsEventAdmin) - return {userPermissions: {...allPermissions, canAddToTravel: () => false}}; + return { + userPermissions: {...allPermissions, canAddToTravel: () => false}, + }; else { const carosterPlusPermissions: UserPermissions = { ...noPermissions, canEditTravel: travel => { - const travelCreatorId = travel.attributes.user?.data?.id || travel.attributes.user; + const travelCreatorId = + travel.attributes.user?.data?.id || travel.attributes.user; return travelCreatorId === userId; }, canJoinTravels: () => true, canAddTravel: () => true, - canDeletePassenger: (passenger) => { - const travel = event?.travels?.data?.find(travel => travel.id === passenger.attributes.travel.data.id); - const travelCreatorId = travel?.attributes.user?.data?.id || travel?.attributes.user; - return travelCreatorId === userId; + canDeletePassenger: passenger => { + const travel = event?.travels?.data?.find( + travel => travel?.id === passenger.attributes.travel.data?.id + ); + const isTravelCreator = travel?.attributes.user?.data?.id === userId; + const isCurrentPassenger = + passenger.attributes.user?.data?.id === userId; + return isTravelCreator || isCurrentPassenger; + }, + canSeePassengerDetails: passenger => { + const travel = event?.travels?.data?.find( + travel => travel?.id === passenger.attributes.travel.data?.id + ); + const isTravelCreator = travel?.attributes.user?.data?.id === userId; + return isTravelCreator; }, }; return {userPermissions: carosterPlusPermissions};
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -125,6 +125,7 @@ "notification.type.NewPassengerInYourTrip.content": "A passenger has been added to your trip.",

"notification.type.NewTrip.content": "A departure close to you is available.", "notification.type.DeletedTrip.content": "A car has been removed.", "notification.type.AddedAsAdmin.content": "You have been added as admin to an event.", + "notification.type.PassengerJoinTrip.content": "A passenger wishes to contact.", "passenger.actions.place": "Assign", "passenger.actions.remove_alert": "Are you sure you want to remove <italic> <bold> {{name}} </bold> </italic> from the waitlist?", "passenger.availability.seats": "{{count}} seat available",

@@ -141,6 +142,12 @@ "passenger.deleted": "The passenger has been deleted from the event.",

"passenger.errors.cant_add_passenger": "Unable to add a passenger", "passenger.errors.cant_remove_passenger": "Unable to remove the passenger", "passenger.errors.cant_select_travel": "Can't move the passenger", + "passenger.informations.title": "Contact us", + "passenger.informations.name.label": "Name", + "passenger.informations.surname.label": "Surname", + "passenger.informations.phone.label": "Phone", + "passenger.informations.email.label": "E-mail", + "passenger.informations.call.label": "Call", "passenger.success.added_self_to_car": "You have been added to this car", "passenger.success.added_self_to_waitlist": "You have been added to the waitlist. You'll be notified when new cars will be added.", "passenger.success.added_to_car": "{{name}} has been added to this car",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -125,6 +125,7 @@ "notification.type.NewPassengerInYourTrip.content": "Un passager a été ajouté à votre trajet.",

"notification.type.NewTrip.content": "Un départ proche de vous est disponible.", "notification.type.DeletedTrip.content": "Une voiture a été supprimée.", "notification.type.AddedAsAdmin.content": "Vous avez été ajouté en tant qu'admin à un événement.", + "notification.type.PassengerJoinTrip.content": "Un passager souhaite prendre contact.", "passenger.actions.place": "Placer", "passenger.actions.remove_alert": "Voulez-vous vraiment supprimer <italic><bold>{{name}}</bold></italic> de la liste d'attente ?", "passenger.availability.seats": "{{count}} place disponible",

@@ -141,6 +142,12 @@ "passenger.deleted": "Le passager a été supprimé de l'événement.",

"passenger.errors.cant_add_passenger": "Impossible d'ajouter un passager", "passenger.errors.cant_remove_passenger": "Impossible de retirer le passager", "passenger.errors.cant_select_travel": "Impossible de placer le passager", + "passenger.informations.title": "Demande de contact", + "passenger.informations.name.label": "Prénom", + "passenger.informations.surname.label": "Nom", + "passenger.informations.phone.label": "Téléphone", + "passenger.informations.email.label": "E-mail", + "passenger.informations.call.label": "Appeler", "passenger.success.added_self_to_car": "Vous avez été ajouté à la voiture", "passenger.success.added_self_to_waitlist": "Vous avez été ajouté à la liste d’attente. Vous serez notifié à l’ajout de nouvelles voitures", "passenger.success.added_to_car": "{{name}} a été ajouté à la voiture",