all repos — caroster @ 3c0bbee900166b5b841ef12b7b71dfc5330de1f8

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

feat: :fire: Improve travel & vehicle creation
Tim Izzo tim@octree.ch
Mon, 14 Feb 2022 16:43:38 +0000
commit

3c0bbee900166b5b841ef12b7b71dfc5330de1f8

parent

e5c55de093d4edc0ba99de71ea4ce6b32179268a

A backend/api/travel/config/schema.graphql.js

@@ -0,0 +1,11 @@

+module.exports = { + definition: ` + extend input TravelInput { + createVehicle: Boolean + } + `, + query: ``, + mutation: ``, + type: {}, + resolver: {}, +};
M backend/api/travel/controllers/travel.jsbackend/api/travel/controllers/travel.js

@@ -1,8 +1,29 @@

'use strict'; -/** - * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#core-controllers) - * to customize this controller - */ +module.exports = { + async create(ctx) { + const {createVehicle = false, ...travelInput} = ctx.request.body; + const userId = ctx.state.user?.id; + + if (userId && createVehicle) { + try { + const vehicleInput = { + name: travelInput.vehicleName, + seats: travelInput.seats || 0, + phone_number: travelInput.phone_number, + user: userId, + }; + await strapi.services.vehicle.create(vehicleInput); + } catch (error) { + console.error(`Can't create vehicle for user ${userId}`, error); + } + } -module.exports = {}; + try { + return await strapi.services.travel.create(travelInput); + } catch (error) { + console.error(`Can't create new travel`, error); + throw new Error("Can't create new travel"); + } + }, +};
M backend/api/travel/models/travel.settings.jsonbackend/api/travel/models/travel.settings.json

@@ -29,9 +29,16 @@ "event": {

"via": "travels", "model": "event" }, - "vehicle": { - "via": "travels", - "model": "vehicle" + "vehicleName": { + "type": "string" + }, + "seats": { + "type": "integer", + "default": 4, + "min": 0 + }, + "phone_number": { + "type": "string" } } }
M backend/api/vehicle/models/vehicle.settings.jsonbackend/api/vehicle/models/vehicle.settings.json

@@ -20,10 +20,6 @@ "type": "integer",

"min": 0, "default": 4 }, - "travels": { - "via": "vehicle", - "collection": "travel" - }, "phone_number": { "type": "string" },
M frontend/containers/NewPassengerDialog/AddPassengerToTravel.tsxfrontend/containers/NewPassengerDialog/AddPassengerToTravel.tsx

@@ -62,7 +62,7 @@ TransitionComponent={Transition}

> <form onSubmit={onSubmit}> <DialogTitle className={classes.title}> - {travel.vehicle.name} + {travel.vehicleName} <Icon className={classes.closeIcon} onClick={toggle}
M frontend/containers/NewTravelDialog/index.tsxfrontend/containers/NewTravelDialog/index.tsx

@@ -10,18 +10,25 @@ import TextField from '@material-ui/core/TextField';

import Slider from '@material-ui/core/Slider'; import Typography from '@material-ui/core/Typography'; import {DatePicker, TimePicker} from '@material-ui/pickers'; -import moment from 'moment'; +import moment, {Moment} from 'moment'; import {useTranslation} from 'react-i18next'; import useEventStore from '../../stores/useEventStore'; import useActions from './useActions'; -import useProfile from '../../hooks/useProfile'; +import {Vehicle} from '../../generated/graphql'; + +interface Props { + context: { + vehicle: Vehicle; + opened: boolean; + }; + toggle: ({opened: boolean}) => void; +} -const NewTravelDialog = ({context, toggle}) => { +const NewTravelDialog = ({context, toggle}: Props) => { const {t} = useTranslation(); const classes = useStyles(); - const {user} = useProfile(); const event = useEventStore(s => s.event); - const actions = useActions({event}); + const {createTravel} = useActions({event}); const dateMoment = useMemo(() => { if (!event?.date) return moment();

@@ -51,32 +58,16 @@ if (e.preventDefault) e.preventDefault();

const travel = { meeting, - date, - time, details, - vehicle: { - name, - seats, - phone_number: phone, - }, + seats, + vehicleName: name, + phone_number: phone, + departure: formatDate(date, time), + event: event.id, }; - if (context.vehicle && user) { - // The authenticated user choose an existing vehicle and assign it to the travel - await actions.createTravel({ - ...travel, - vehicle: context.vehicle, - }); - } else if (user) { - // The autenticated user create a vehicle and assign it to the travel - await actions.createTravel({ - ...travel, - vehicle: {...travel.vehicle, user: user.id, created_by: user.id}, - }); - } else { - // The anonymous user create a vehicle and assign it to the travel - await actions.createTravel(travel); - } + const createVehicle = !context.vehicle; + await createTravel({...travel, createVehicle}); toggle({opened: false}); // Clear states

@@ -126,7 +117,6 @@ label={t('travel.creation.name')}

fullWidth helperText=" " value={name} - disabled={!!context.vehicle} onChange={e => setName(e.target.value)} name="name" id="NewTravelName"

@@ -136,7 +126,6 @@ label={t('travel.creation.phone')}

fullWidth helperText=" " value={phone} - disabled={!!context.vehicle} onChange={e => setPhone(e.target.value)} name="phone" id="NewTravelPhone"

@@ -171,7 +160,6 @@ {t('travel.creation.seats')}

</Typography> <Slider value={seats} - disabled={!!context.vehicle} onChange={(e, value) => setSeats(value)} step={1} marks={MARKS}

@@ -210,6 +198,13 @@

const Transition = forwardRef(function Transition(props, ref) { return <Slide direction="up" ref={ref} {...props} />; }); + +const formatDate = (date: Moment, time: Moment) => { + return moment( + `${moment(date).format('YYYY-MM-DD')} ${moment(time).format('HH:mm')}`, + 'YYYY-MM-DD HH:mm' + ).toISOString(); +}; const MARKS = [1, 2, 3, 4, 5, 6, 7, 8].map(value => ({ value,
M frontend/containers/NewTravelDialog/useActions.tsfrontend/containers/NewTravelDialog/useActions.ts

@@ -6,11 +6,8 @@ import {

Event, EventByUuidDocument, useCreateTravelMutation, - useCreateVehicleMutation, - FindUserVehiclesDocument, - Vehicle, + TravelInput, } from '../../generated/graphql'; -import useProfile from '../../hooks/useProfile'; interface Props { event: Event;

@@ -19,29 +16,14 @@

const useActions = (props: Props) => { const {event} = props; const {t} = useTranslation(); - const {user} = useProfile(); const addToast = useToastsStore(s => s.addToast); const {addToEvent} = useAddToEvents(); - const [createVehicleMutation] = useCreateVehicleMutation(); const [createTravelMutation] = useCreateTravelMutation(); - // TODO Move these logics to backend - const createTravel = async ({vehicle, date, time, ...travel}) => { + const createTravel = async (travelInput: TravelInput) => { try { - const departure = moment( - `${moment(date).format('YYYY-MM-DD')} ${moment(time).format('HH:mm')}`, - 'YYYY-MM-DD HH:mm' - ).toISOString(); - - const makeTravelMutationParams = (travelVehicle: Vehicle) => ({ - variables: { - travel: { - ...travel, - departure, - event: event.id, - vehicle: travelVehicle?.id, - }, - }, + await createTravelMutation({ + variables: {travel: travelInput}, refetchQueries: [ { query: EventByUuidDocument,

@@ -51,46 +33,12 @@ },

}, ], }); - - if (vehicle.id) { - // The authenticated user chooses an existing vehicle and assign it to the travel - await createTravelMutation(makeTravelMutationParams(vehicle)); - } else if (user) { - // The autenticated user creates a vehicle and assign it to the travel - const {data: {createVehicle} = {}} = await createVehicleMutation({ - variables: { - vehicle, - }, - refetchQueries: [ - { - query: FindUserVehiclesDocument, - variables: {userId: user.id}, - }, - ], - }); - - const params = makeTravelMutationParams( - createVehicle.vehicle as Vehicle - ); - await createTravelMutation(params); - } else { - // The anonymous user creates a vehicle and assign it to the travel - const {data: {createVehicle} = {}} = await createVehicleMutation({ - variables: { - vehicle, - }, - }); - - await createTravelMutation(makeTravelMutationParams(createVehicle?.vehicle as Vehicle)); - } - addToEvent(event.id); addToast(t('travel.creation.created')); } catch (error) { console.error(error); addToast(t('travel.errors.cant_create')); } - return false; }; return {createTravel};
M frontend/containers/Travel/Header.tsxfrontend/containers/Travel/Header.tsx

@@ -35,15 +35,15 @@ {moment(travel.departure).format('LLLL')}

</Typography> )} <Typography variant="h5" id="TravelName"> - {travel.vehicle?.name} + {travel.vehicleName} </Typography> - {!!travel.vehicle?.phone_number && ( + {!!travel.phone_number && ( <div className={classes.section}> <Typography variant="subtitle2"> {t('travel.fields.phone')} </Typography> <Typography variant="body2" id="TravelPhone"> - {travel.vehicle?.phone_number} + {travel.phone_number} </Typography> </div> )}
M frontend/containers/Travel/HeaderEditing.tsxfrontend/containers/Travel/HeaderEditing.tsx

@@ -7,7 +7,7 @@ import Button from '@material-ui/core/Button';

import TextField from '@material-ui/core/TextField'; import Slider from '@material-ui/core/Slider'; import {DatePicker, TimePicker} from '@material-ui/pickers'; -import moment from 'moment'; +import moment, {Moment} from 'moment'; import {useTranslation} from 'react-i18next'; import RemoveDialog from '../RemoveDialog'; import useActions from './useActions';

@@ -23,12 +23,12 @@ [travel?.departure]

); // States - const [name, setName] = useState(travel?.vehicle?.name ?? ''); - const [seats, setSeats] = useState(travel?.vehicle?.seats ?? 4); + const [name, setName] = useState(travel?.vehicleName ?? ''); + const [seats, setSeats] = useState(travel?.seats ?? 4); const [meeting, setMeeting] = useState(travel?.meeting ?? ''); const [date, setDate] = useState(dateMoment); const [time, setTime] = useState(dateMoment); - const [phone, setPhone] = useState(travel?.vehicle?.phone_number ?? ''); + const [phone, setPhone] = useState(travel?.phone_number ?? ''); const [details, setDetails] = useState(travel?.details ?? ''); // Click on ESQ closes the form

@@ -48,15 +48,15 @@ }, [escFunction]);

const onSave = async event => { if (event.preventDefault) event.preventDefault(); - const update = { - vehicle: { - name, - seats, - phone_number: phone, - }, - travel: {meeting, date, time, details}, + const travelUpdate = { + meeting, + details, + seats, + phone_number: phone, + vehicleName: name, + departure: formatDate(date, time), }; - await actions.updateTravel(update); + await actions.updateTravel(travelUpdate); toggleEditing(); };

@@ -185,6 +185,13 @@ onRemove={onRemove}

/> </div> ); +}; + +const formatDate = (date: Moment, time: Moment) => { + return moment( + `${moment(date).format('YYYY-MM-DD')} ${moment(time).format('HH:mm')}`, + 'YYYY-MM-DD HH:mm' + ).toISOString(); }; const useStyles = makeStyles(theme => ({
M frontend/containers/Travel/useActions.tsfrontend/containers/Travel/useActions.ts

@@ -1,14 +1,13 @@

-import moment from 'moment'; import {useTranslation} from 'react-i18next'; import useEventStore from '../../stores/useEventStore'; import useToastStore from '../../stores/useToastStore'; import { useUpdateTravelMutation, useUpdateEventMutation, - useUpdateVehicleMutation, useDeleteTravelMutation, EventByUuidDocument, Travel, + EditTravelInput, } from '../../generated/graphql'; interface Props {

@@ -22,7 +21,6 @@ const event = useEventStore(s => s.event);

const addToast = useToastStore(s => s.addToast); const [updateEventMutation] = useUpdateEventMutation(); const [updateTravelMutation] = useUpdateTravelMutation(); - const [updateVehicleMutation] = useUpdateVehicleMutation(); const [deleteTravelMutation] = useDeleteTravelMutation(); const sendPassengerToWaitingList = async (passengerId: string) => {

@@ -38,11 +36,9 @@ const existingPassengers =

travel.passengers?.map(({__typename, user, ...item}) => user && user.id ? {...item, user: user.id} : item ) || []; - const waitingList = [ - ...event.waitingList, - removedPassenger, - ].map(({__typename, user, ...item}) => - user && user.id ? {...item, user: user.id} : item + const waitingList = [...event.waitingList, removedPassenger].map( + ({__typename, user, ...item}) => + user && user.id ? {...item, user: user.id} : item ); const passengers = existingPassengers.filter( item => item.id !== passengerId

@@ -71,12 +67,12 @@ }

} }; - const updateTravel = async update => { + const updateTravel = async (travelUpdate: EditTravelInput) => { try { // If new seats count is under current passengers count, put excedent in event waiting list // TODO: Move these logics to backend - if (travel.passengers?.length > update.vehicle?.seats) { - const lostPassengers = travel.passengers.slice(update.vehicle?.seats); + if (travel.passengers?.length > travelUpdate.seats) { + const lostPassengers = travel.passengers.slice(travelUpdate.seats); if (lostPassengers.length > 0) await updateEventMutation({ variables: {

@@ -91,30 +87,13 @@ },

refetchQueries: ['eventByUUID'], }); } - const departure = moment( - `${moment(update.travel.date).format('YYYY-MM-DD')} ${moment( - update.travel.time - ).format('HH:mm')}`, - 'YYYY-MM-DD HH:mm' - ).toISOString(); await updateTravelMutation({ variables: { id: travel.id, travelUpdate: { - departure, - meeting: update.travel.meeting, - details: update.travel.details, - passengers: formatPassengers( - travel.passengers, - travel.vehicle?.seats - ), + ...travelUpdate, + passengers: formatPassengers(travel.passengers, travel.seats), }, - }, - }); - await updateVehicleMutation({ - variables: { - id: travel?.vehicle?.id, - vehicleUpdate: update.vehicle, }, }); } catch (error) {
M frontend/containers/VehicleChoiceDialog/VehicleItem.tsxfrontend/containers/VehicleChoiceDialog/VehicleItem.tsx

@@ -6,8 +6,8 @@ import {makeStyles} from '@material-ui/core/styles';

import {useTranslation} from 'react-i18next'; import { VehicleFieldsFragment, - useUpdateVehicleMutation, FindUserVehiclesDocument, + useDeleteVehicleMutation, } from '../../generated/graphql'; import useProfile from '../../hooks/useProfile';

@@ -20,13 +20,8 @@ const VehicleItem = ({vehicle, select}: Props) => {

const {t} = useTranslation(); const classes = useStyles(); const {user} = useProfile(); - const [unlinkUserCar] = useUpdateVehicleMutation({ - variables: { - id: vehicle.id, - vehicleUpdate: { - user: null, - }, - }, + const [deleteVehicleMutation] = useDeleteVehicleMutation({ + variables: {id: vehicle.id}, refetchQueries: [ {query: FindUserVehiclesDocument, variables: {userId: user.id}}, ],

@@ -42,7 +37,7 @@ <Button

color="primary" variant="text" size="small" - onClick={() => unlinkUserCar()} + onClick={() => deleteVehicleMutation()} > {t('generic.delete')} </Button>
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -433,7 +433,7 @@ };

-export type Morph = Dependency | Info | UsersPermissionsMe | UsersPermissionsMeRole | UsersPermissionsLoginPayload | UserPermissionsPasswordPayload | Car | CarConnection | CarAggregator | CarAggregatorSum | CarAggregatorAvg | CarAggregatorMin | CarAggregatorMax | CarGroupBy | CarConnectionId | CarConnectionCreated_At | CarConnectionUpdated_At | CarConnectionName | CarConnectionSeats | CarConnectionMeeting | CarConnectionDeparture | CarConnectionPhone_Number | CarConnectionDetails | CarConnectionEvent | CreateCarPayload | UpdateCarPayload | DeleteCarPayload | Event | EventConnection | EventAggregator | EventGroupBy | EventConnectionId | EventConnectionCreated_At | EventConnectionUpdated_At | EventConnectionName | EventConnectionEmail | EventConnectionDate | EventConnectionAddress | EventConnectionPosition | EventConnectionUuid | EventConnectionDescription | CreateEventPayload | UpdateEventPayload | DeleteEventPayload | Page | PageConnection | PageAggregator | PageGroupBy | PageConnectionId | PageConnectionCreated_At | PageConnectionUpdated_At | PageConnectionName | PageConnectionContent | PageConnectionType | CreatePagePayload | UpdatePagePayload | DeletePagePayload | Settings | UpdateSettingPayload | DeleteSettingPayload | Travel | TravelConnection | TravelAggregator | TravelGroupBy | TravelConnectionId | TravelConnectionCreated_At | TravelConnectionUpdated_At | TravelConnectionMeeting | TravelConnectionDeparture | TravelConnectionDetails | TravelConnectionEvent | TravelConnectionVehicle | CreateTravelPayload | UpdateTravelPayload | DeleteTravelPayload | Vehicle | VehicleConnection | VehicleAggregator | VehicleAggregatorSum | VehicleAggregatorAvg | VehicleAggregatorMin | VehicleAggregatorMax | VehicleGroupBy | VehicleConnectionId | VehicleConnectionCreated_At | VehicleConnectionUpdated_At | VehicleConnectionName | VehicleConnectionSeats | VehicleConnectionPhone_Number | VehicleConnectionUser | CreateVehiclePayload | UpdateVehiclePayload | DeleteVehiclePayload | EmailDesignerEmailTemplate | UploadFile | UploadFileConnection | UploadFileAggregator | UploadFileAggregatorSum | UploadFileAggregatorAvg | UploadFileAggregatorMin | UploadFileAggregatorMax | UploadFileGroupBy | UploadFileConnectionId | UploadFileConnectionCreated_At | UploadFileConnectionUpdated_At | UploadFileConnectionName | UploadFileConnectionAlternativeText | UploadFileConnectionCaption | UploadFileConnectionWidth | UploadFileConnectionHeight | UploadFileConnectionFormats | UploadFileConnectionHash | UploadFileConnectionExt | UploadFileConnectionMime | UploadFileConnectionSize | UploadFileConnectionUrl | UploadFileConnectionPreviewUrl | UploadFileConnectionProvider | UploadFileConnectionProvider_Metadata | DeleteFilePayload | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsRoleConnection | UsersPermissionsRoleAggregator | UsersPermissionsRoleGroupBy | UsersPermissionsRoleConnectionId | UsersPermissionsRoleConnectionName | UsersPermissionsRoleConnectionDescription | UsersPermissionsRoleConnectionType | CreateRolePayload | UpdateRolePayload | DeleteRolePayload | UsersPermissionsUser | UsersPermissionsUserConnection | UsersPermissionsUserAggregator | UsersPermissionsUserGroupBy | UsersPermissionsUserConnectionId | UsersPermissionsUserConnectionCreated_At | UsersPermissionsUserConnectionUpdated_At | UsersPermissionsUserConnectionUsername | UsersPermissionsUserConnectionFirstName | UsersPermissionsUserConnectionLastName | UsersPermissionsUserConnectionEmail | UsersPermissionsUserConnectionProvider | UsersPermissionsUserConnectionConfirmed | UsersPermissionsUserConnectionBlocked | UsersPermissionsUserConnectionRole | UsersPermissionsUserConnectionOnboardingUser | UsersPermissionsUserConnectionOnboardingCreator | UsersPermissionsUserConnectionLang | CreateUserPayload | UpdateUserPayload | DeleteUserPayload | ComponentPassengerPassenger; +export type Morph = Dependency | Info | UsersPermissionsMe | UsersPermissionsMeRole | UsersPermissionsLoginPayload | UserPermissionsPasswordPayload | Car | CarConnection | CarAggregator | CarAggregatorSum | CarAggregatorAvg | CarAggregatorMin | CarAggregatorMax | CarGroupBy | CarConnectionId | CarConnectionCreated_At | CarConnectionUpdated_At | CarConnectionName | CarConnectionSeats | CarConnectionMeeting | CarConnectionDeparture | CarConnectionPhone_Number | CarConnectionDetails | CarConnectionEvent | CreateCarPayload | UpdateCarPayload | DeleteCarPayload | Event | EventConnection | EventAggregator | EventGroupBy | EventConnectionId | EventConnectionCreated_At | EventConnectionUpdated_At | EventConnectionName | EventConnectionEmail | EventConnectionDate | EventConnectionAddress | EventConnectionPosition | EventConnectionUuid | EventConnectionDescription | CreateEventPayload | UpdateEventPayload | DeleteEventPayload | Page | PageConnection | PageAggregator | PageGroupBy | PageConnectionId | PageConnectionCreated_At | PageConnectionUpdated_At | PageConnectionName | PageConnectionContent | PageConnectionType | CreatePagePayload | UpdatePagePayload | DeletePagePayload | Settings | UpdateSettingPayload | DeleteSettingPayload | Travel | TravelConnection | TravelAggregator | TravelAggregatorSum | TravelAggregatorAvg | TravelAggregatorMin | TravelAggregatorMax | TravelGroupBy | TravelConnectionId | TravelConnectionCreated_At | TravelConnectionUpdated_At | TravelConnectionMeeting | TravelConnectionDeparture | TravelConnectionDetails | TravelConnectionEvent | TravelConnectionVehicleName | TravelConnectionSeats | TravelConnectionPhone_Number | CreateTravelPayload | UpdateTravelPayload | DeleteTravelPayload | Vehicle | VehicleConnection | VehicleAggregator | VehicleAggregatorSum | VehicleAggregatorAvg | VehicleAggregatorMin | VehicleAggregatorMax | VehicleGroupBy | VehicleConnectionId | VehicleConnectionCreated_At | VehicleConnectionUpdated_At | VehicleConnectionName | VehicleConnectionSeats | VehicleConnectionPhone_Number | VehicleConnectionUser | CreateVehiclePayload | UpdateVehiclePayload | DeleteVehiclePayload | EmailDesignerEmailTemplate | UploadFile | UploadFileConnection | UploadFileAggregator | UploadFileAggregatorSum | UploadFileAggregatorAvg | UploadFileAggregatorMin | UploadFileAggregatorMax | UploadFileGroupBy | UploadFileConnectionId | UploadFileConnectionCreated_At | UploadFileConnectionUpdated_At | UploadFileConnectionName | UploadFileConnectionAlternativeText | UploadFileConnectionCaption | UploadFileConnectionWidth | UploadFileConnectionHeight | UploadFileConnectionFormats | UploadFileConnectionHash | UploadFileConnectionExt | UploadFileConnectionMime | UploadFileConnectionSize | UploadFileConnectionUrl | UploadFileConnectionPreviewUrl | UploadFileConnectionProvider | UploadFileConnectionProvider_Metadata | DeleteFilePayload | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsRoleConnection | UsersPermissionsRoleAggregator | UsersPermissionsRoleGroupBy | UsersPermissionsRoleConnectionId | UsersPermissionsRoleConnectionName | UsersPermissionsRoleConnectionDescription | UsersPermissionsRoleConnectionType | CreateRolePayload | UpdateRolePayload | DeleteRolePayload | UsersPermissionsUser | UsersPermissionsUserConnection | UsersPermissionsUserAggregator | UsersPermissionsUserGroupBy | UsersPermissionsUserConnectionId | UsersPermissionsUserConnectionCreated_At | UsersPermissionsUserConnectionUpdated_At | UsersPermissionsUserConnectionUsername | UsersPermissionsUserConnectionFirstName | UsersPermissionsUserConnectionLastName | UsersPermissionsUserConnectionEmail | UsersPermissionsUserConnectionProvider | UsersPermissionsUserConnectionConfirmed | UsersPermissionsUserConnectionBlocked | UsersPermissionsUserConnectionRole | UsersPermissionsUserConnectionOnboardingUser | UsersPermissionsUserConnectionOnboardingCreator | UsersPermissionsUserConnectionLang | CreateUserPayload | UpdateUserPayload | DeleteUserPayload | ComponentPassengerPassenger; export type Mutation = { __typename?: 'Mutation';

@@ -996,13 +996,39 @@ departure?: Maybe<Scalars['DateTime']>;

details?: Maybe<Scalars['String']>; passengers?: Maybe<Array<Maybe<ComponentPassengerPassenger>>>; event?: Maybe<Event>; - vehicle?: Maybe<Vehicle>; + vehicleName?: Maybe<Scalars['String']>; + seats?: Maybe<Scalars['Int']>; + phone_number?: Maybe<Scalars['String']>; }; export type TravelAggregator = { __typename?: 'TravelAggregator'; count?: Maybe<Scalars['Int']>; totalCount?: Maybe<Scalars['Int']>; + sum?: Maybe<TravelAggregatorSum>; + avg?: Maybe<TravelAggregatorAvg>; + min?: Maybe<TravelAggregatorMin>; + max?: Maybe<TravelAggregatorMax>; +}; + +export type TravelAggregatorAvg = { + __typename?: 'TravelAggregatorAvg'; + seats?: Maybe<Scalars['Float']>; +}; + +export type TravelAggregatorMax = { + __typename?: 'TravelAggregatorMax'; + seats?: Maybe<Scalars['Float']>; +}; + +export type TravelAggregatorMin = { + __typename?: 'TravelAggregatorMin'; + seats?: Maybe<Scalars['Float']>; +}; + +export type TravelAggregatorSum = { + __typename?: 'TravelAggregatorSum'; + seats?: Maybe<Scalars['Float']>; }; export type TravelConnection = {

@@ -1048,15 +1074,27 @@ key?: Maybe<Scalars['String']>;

connection?: Maybe<TravelConnection>; }; +export type TravelConnectionPhone_Number = { + __typename?: 'TravelConnectionPhone_number'; + key?: Maybe<Scalars['String']>; + connection?: Maybe<TravelConnection>; +}; + +export type TravelConnectionSeats = { + __typename?: 'TravelConnectionSeats'; + key?: Maybe<Scalars['Int']>; + connection?: Maybe<TravelConnection>; +}; + export type TravelConnectionUpdated_At = { __typename?: 'TravelConnectionUpdated_at'; key?: Maybe<Scalars['DateTime']>; connection?: Maybe<TravelConnection>; }; -export type TravelConnectionVehicle = { - __typename?: 'TravelConnectionVehicle'; - key?: Maybe<Scalars['ID']>; +export type TravelConnectionVehicleName = { + __typename?: 'TravelConnectionVehicleName'; + key?: Maybe<Scalars['String']>; connection?: Maybe<TravelConnection>; };

@@ -1069,7 +1107,9 @@ meeting?: Maybe<Array<Maybe<TravelConnectionMeeting>>>;

departure?: Maybe<Array<Maybe<TravelConnectionDeparture>>>; details?: Maybe<Array<Maybe<TravelConnectionDetails>>>; event?: Maybe<Array<Maybe<TravelConnectionEvent>>>; - vehicle?: Maybe<Array<Maybe<TravelConnectionVehicle>>>; + vehicleName?: Maybe<Array<Maybe<TravelConnectionVehicleName>>>; + seats?: Maybe<Array<Maybe<TravelConnectionSeats>>>; + phone_number?: Maybe<Array<Maybe<TravelConnectionPhone_Number>>>; }; export type TravelInput = {

@@ -1078,9 +1118,12 @@ departure?: Maybe<Scalars['DateTime']>;

details?: Maybe<Scalars['String']>; passengers?: Maybe<Array<Maybe<ComponentPassengerPassengerInput>>>; event?: Maybe<Scalars['ID']>; - vehicle?: Maybe<Scalars['ID']>; + vehicleName?: Maybe<Scalars['String']>; + seats?: Maybe<Scalars['Int']>; + phone_number?: Maybe<Scalars['String']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; + createVehicle?: Maybe<Scalars['Boolean']>; };

@@ -1590,15 +1633,6 @@ name: Scalars['String'];

seats?: Maybe<Scalars['Int']>; phone_number?: Maybe<Scalars['String']>; user?: Maybe<UsersPermissionsUser>; - travels?: Maybe<Array<Maybe<Travel>>>; -}; - - -export type VehicleTravelsArgs = { - sort?: Maybe<Scalars['String']>; - limit?: Maybe<Scalars['Int']>; - start?: Maybe<Scalars['Int']>; - where?: Maybe<Scalars['JSON']>; }; export type VehicleAggregator = {

@@ -1694,7 +1728,6 @@

export type VehicleInput = { name: Scalars['String']; seats?: Maybe<Scalars['Int']>; - travels?: Maybe<Array<Maybe<Scalars['ID']>>>; phone_number?: Maybe<Scalars['String']>; user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>;

@@ -1942,7 +1975,9 @@ departure?: Maybe<Scalars['DateTime']>;

details?: Maybe<Scalars['String']>; passengers?: Maybe<Array<Maybe<EditComponentPassengerPassengerInput>>>; event?: Maybe<Scalars['ID']>; - vehicle?: Maybe<Scalars['ID']>; + vehicleName?: Maybe<Scalars['String']>; + seats?: Maybe<Scalars['Int']>; + phone_number?: Maybe<Scalars['String']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -1972,7 +2007,6 @@

export type EditVehicleInput = { name?: Maybe<Scalars['String']>; seats?: Maybe<Scalars['Int']>; - travels?: Maybe<Array<Maybe<Scalars['ID']>>>; phone_number?: Maybe<Scalars['String']>; user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>;

@@ -2147,11 +2181,8 @@ & Pick<UsersPermissionsUser, 'id' | 'firstName' | 'lastName'>

)> } )>>>, travels?: Maybe<Array<Maybe<( { __typename?: 'Travel' } - & Pick<Travel, 'id' | 'meeting' | 'departure' | 'details'> - & { vehicle?: Maybe<( - { __typename?: 'Vehicle' } - & Pick<Vehicle, 'id' | 'name' | 'phone_number' | 'seats'> - )>, passengers?: Maybe<Array<Maybe<( + & Pick<Travel, 'id' | 'meeting' | 'departure' | 'details' | 'vehicleName' | 'phone_number' | 'seats'> + & { passengers?: Maybe<Array<Maybe<( { __typename?: 'ComponentPassengerPassenger' } & Pick<ComponentPassengerPassenger, 'id' | 'name' | 'location'> & { user?: Maybe<(

@@ -2226,11 +2257,8 @@ );

export type TravelFieldsFragment = ( { __typename?: 'Travel' } - & Pick<Travel, 'id' | 'meeting' | 'departure' | 'details'> - & { vehicle?: Maybe<( - { __typename?: 'Vehicle' } - & Pick<Vehicle, 'id' | 'name' | 'phone_number' | 'seats'> - )>, passengers?: Maybe<Array<Maybe<( + & Pick<Travel, 'id' | 'meeting' | 'departure' | 'details' | 'vehicleName' | 'phone_number' | 'seats'> + & { passengers?: Maybe<Array<Maybe<( { __typename?: 'ComponentPassengerPassenger' } & Pick<ComponentPassengerPassenger, 'id' | 'name' | 'location'> & { user?: Maybe<(

@@ -2352,39 +2380,6 @@ )> }

)> } ); -export type CreateVehicleMutationVariables = Exact<{ - vehicle: VehicleInput; -}>; - - -export type CreateVehicleMutation = ( - { __typename?: 'Mutation' } - & { createVehicle?: Maybe<( - { __typename?: 'createVehiclePayload' } - & { vehicle?: Maybe<( - { __typename?: 'Vehicle' } - & VehicleFieldsFragment - )> } - )> } -); - -export type UpdateVehicleMutationVariables = Exact<{ - id: Scalars['ID']; - vehicleUpdate: EditVehicleInput; -}>; - - -export type UpdateVehicleMutation = ( - { __typename?: 'Mutation' } - & { updateVehicle?: Maybe<( - { __typename?: 'updateVehiclePayload' } - & { vehicle?: Maybe<( - { __typename?: 'Vehicle' } - & VehicleFieldsFragment - )> } - )> } -); - export type DeleteVehicleMutationVariables = Exact<{ id: Scalars['ID']; }>;

@@ -2434,12 +2429,9 @@ id

meeting departure details - vehicle { - id - name - phone_number - seats - } + vehicleName + phone_number + seats passengers { id name

@@ -2459,12 +2451,9 @@ id

meeting departure details - vehicle { - id - name - phone_number - seats - } + vehicleName + phone_number + seats passengers { id name

@@ -3003,75 +2992,6 @@ }

export type FindUserVehiclesQueryHookResult = ReturnType<typeof useFindUserVehiclesQuery>; export type FindUserVehiclesLazyQueryHookResult = ReturnType<typeof useFindUserVehiclesLazyQuery>; export type FindUserVehiclesQueryResult = Apollo.QueryResult<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>; -export const CreateVehicleDocument = gql` - mutation createVehicle($vehicle: VehicleInput!) { - createVehicle(input: {data: $vehicle}) { - vehicle { - ...VehicleFields - } - } -} - ${VehicleFieldsFragmentDoc}`; -export type CreateVehicleMutationFn = Apollo.MutationFunction<CreateVehicleMutation, CreateVehicleMutationVariables>; - -/** - * __useCreateVehicleMutation__ - * - * To run a mutation, you first call `useCreateVehicleMutation` within a React component and pass it any options that fit your needs. - * When your component renders, `useCreateVehicleMutation` returns a tuple that includes: - * - A mutate function that you can call at any time to execute the mutation - * - An object with fields that represent the current status of the mutation's execution - * - * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; - * - * @example - * const [createVehicleMutation, { data, loading, error }] = useCreateVehicleMutation({ - * variables: { - * vehicle: // value for 'vehicle' - * }, - * }); - */ -export function useCreateVehicleMutation(baseOptions?: Apollo.MutationHookOptions<CreateVehicleMutation, CreateVehicleMutationVariables>) { - return Apollo.useMutation<CreateVehicleMutation, CreateVehicleMutationVariables>(CreateVehicleDocument, baseOptions); - } -export type CreateVehicleMutationHookResult = ReturnType<typeof useCreateVehicleMutation>; -export type CreateVehicleMutationResult = Apollo.MutationResult<CreateVehicleMutation>; -export type CreateVehicleMutationOptions = Apollo.BaseMutationOptions<CreateVehicleMutation, CreateVehicleMutationVariables>; -export const UpdateVehicleDocument = gql` - mutation updateVehicle($id: ID!, $vehicleUpdate: editVehicleInput!) { - updateVehicle(input: {where: {id: $id}, data: $vehicleUpdate}) { - vehicle { - ...VehicleFields - } - } -} - ${VehicleFieldsFragmentDoc}`; -export type UpdateVehicleMutationFn = Apollo.MutationFunction<UpdateVehicleMutation, UpdateVehicleMutationVariables>; - -/** - * __useUpdateVehicleMutation__ - * - * To run a mutation, you first call `useUpdateVehicleMutation` within a React component and pass it any options that fit your needs. - * When your component renders, `useUpdateVehicleMutation` returns a tuple that includes: - * - A mutate function that you can call at any time to execute the mutation - * - An object with fields that represent the current status of the mutation's execution - * - * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; - * - * @example - * const [updateVehicleMutation, { data, loading, error }] = useUpdateVehicleMutation({ - * variables: { - * id: // value for 'id' - * vehicleUpdate: // value for 'vehicleUpdate' - * }, - * }); - */ -export function useUpdateVehicleMutation(baseOptions?: Apollo.MutationHookOptions<UpdateVehicleMutation, UpdateVehicleMutationVariables>) { - return Apollo.useMutation<UpdateVehicleMutation, UpdateVehicleMutationVariables>(UpdateVehicleDocument, baseOptions); - } -export type UpdateVehicleMutationHookResult = ReturnType<typeof useUpdateVehicleMutation>; -export type UpdateVehicleMutationResult = Apollo.MutationResult<UpdateVehicleMutation>; -export type UpdateVehicleMutationOptions = Apollo.BaseMutationOptions<UpdateVehicleMutation, UpdateVehicleMutationVariables>; export const DeleteVehicleDocument = gql` mutation deleteVehicle($id: ID!) { deleteVehicle(input: {where: {id: $id}}) {
M frontend/graphql/event.gqlfrontend/graphql/event.gql

@@ -22,12 +22,9 @@ id

meeting departure details - vehicle { - id - name - phone_number - seats - } + vehicleName + phone_number + seats passengers { id name
M frontend/graphql/travel.gqlfrontend/graphql/travel.gql

@@ -3,12 +3,9 @@ id

meeting departure details - vehicle { - id - name - phone_number - seats - } + vehicleName + phone_number + seats passengers { id name
M frontend/graphql/vehicle.gqlfrontend/graphql/vehicle.gql

@@ -17,22 +17,6 @@ }

} } -mutation createVehicle($vehicle: VehicleInput!) { - createVehicle(input: {data: $vehicle}) { - vehicle { - ...VehicleFields - } - } -} - -mutation updateVehicle($id: ID!, $vehicleUpdate: editVehicleInput!) { - updateVehicle(input: {where: {id: $id}, data: $vehicleUpdate}) { - vehicle { - ...VehicleFields - } - } -} - mutation deleteVehicle($id: ID!) { deleteVehicle(input: {where: {id: $id}}) { vehicle {
M frontend/stores/useEventStore.tsfrontend/stores/useEventStore.ts

@@ -11,7 +11,7 @@ };

const useEventStore = create<State>((set, get) => ({ event: null, - setEvent: event => set({event: formatEvent(event)}), + setEvent: event => set({event}), setEventUpdate: eventUpdate => { const event = get().event; set({event: {...event, ...eventUpdate}});

@@ -19,10 +19,5 @@ },

isEditing: false, setIsEditing: isEditing => set({isEditing}), })); - -const formatEvent = (event: Event): Event => { - const travels = event.travels?.filter(travel => !!travel.vehicle); - return {...event, travels}; -}; export default useEventStore;