all repos — caroster @ f5c854ad35aa58a77481d22c3554680f8828f45f

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

feat: :sparkles: Sync linked event for round-trip option

#556
Tim Izzo tim@octree.ch
Wed, 11 Dec 2024 16:08:32 +0100
commit

f5c854ad35aa58a77481d22c3554680f8828f45f

parent

01cb299b08e873d95e7352a5e023658147653118

M backend/src/api/event/content-types/event/lifecycles.tsbackend/src/api/event/content-types/event/lifecycles.ts

@@ -1,4 +1,6 @@

import { v4 as uuid } from "uuid"; +import moment from "moment"; +import _pick from "lodash/pick"; export default { async beforeCreate(event) {

@@ -17,16 +19,52 @@ data.users = [userCreator.id];

} }, async afterCreate({ result }) { - await strapi - .service("api::email.email") - .sendEmailNotif(result.email, "EventCreated", result.lang, { - event: result, - }); + if (!result.isReturnEvent) + await strapi + .service("api::email.email") + .sendEmailNotif(result.email, "EventCreated", result.lang, { + event: result, + }); }, async beforeUpdate(event) { const { params } = event; const eventInDb = await strapi.db.query("api::event.event").findOne(params); if (eventInDb && !eventInDb.uuid) params.data.uuid = uuid(); + }, + + async afterUpdate({ params, result }) { + const eventInDb = await strapi.entityService.findOne( + "api::event.event", + result.id, + { populate: ["linkedEvent"] } + ); + if ( + eventInDb.linkedEvent && + !moment(eventInDb.linkedEvent.updatedAt).isSame( + eventInDb.updatedAt, + "second" + ) + ) { + const update = _pick(params.data, [ + "name", + "email", + "date", + "address", + "description", + "latitude", + "longitude", + "enabled_modules", + "lang", + "administrators", + ]); + await strapi.entityService.update( + "api::event.event", + eventInDb.linkedEvent.id, + { + data: update, + } + ); + } }, };
M backend/src/api/event/content-types/event/schema.jsonbackend/src/api/event/content-types/event/schema.json

@@ -87,6 +87,15 @@ "creator": {

"type": "relation", "relation": "oneToOne", "target": "plugin::users-permissions.user" + }, + "isReturnEvent": { + "type": "boolean", + "default": false + }, + "linkedEvent": { + "type": "relation", + "relation": "oneToOne", + "target": "api::event.event" } } }
M backend/src/api/event/controllers/event.tsbackend/src/api/event/controllers/event.ts

@@ -20,10 +20,19 @@ const user = ctx.state.user;

if (user) eventData = { ...eventData, users: [user.id] }; - const event = await strapi.entityService.create("api::event.event", { + const goEvent = await strapi.entityService.create("api::event.event", { data: eventData, }); - return this.sanitizeOutput(event, ctx); + const returnEvent = await strapi.entityService.create( + "api::event.event", + { + data: { ...eventData, isReturnEvent: true, linkedEvent: goEvent.id }, + } + ); + await strapi.entityService.update("api::event.event", goEvent.id, { + data: { linkedEvent: returnEvent.id }, + }); + return this.sanitizeOutput(goEvent, ctx); }, }) );
M backend/src/graphql/event/event.tsbackend/src/graphql/event/event.ts

@@ -146,5 +146,8 @@ },

"Event.travels": { auth: false, }, + "Event.linkedEvent": { + auth: false, + }, }, });
M backend/types/generated/contentTypes.d.tsbackend/types/generated/contentTypes.d.ts

@@ -400,9 +400,15 @@ Attribute.CustomField<

'plugin::multi-select.multi-select', ['caroster-plus'] >; + isReturnEvent: Attribute.Boolean & Attribute.DefaultTo<false>; lang: Attribute.Enumeration<['fr', 'en', 'de', 'nl', 'it']> & Attribute.DefaultTo<'en'>; latitude: Attribute.Float; + linkedEvent: Attribute.Relation< + 'api::event.event', + 'oneToOne', + 'api::event.event' + >; longitude: Attribute.Float; name: Attribute.String & Attribute.Required; newsletter: Attribute.Boolean & Attribute.Private;
M frontend/containers/CarosterPlusSettings/index.tsxfrontend/containers/CarosterPlusSettings/index.tsx

@@ -133,8 +133,9 @@ <AccountCircleOutlinedIcon />

</ListItemIcon> <ListItemText primary={event.email} /> </ListItem> - {event.administrators?.map(email => ( + {event.administrators?.map((email, index) => ( <ListItem + key={index} secondaryAction={ canEditEventOptions() && ( <IconButton size="medium" onClick={() => deleteAdmin({email})}>
A frontend/containers/EventBar/LinkedEventSwitch.tsx

@@ -0,0 +1,43 @@

+import {Button, ButtonGroup} from '@mui/material'; +import {useTranslation} from 'react-i18next'; +import useEventStore from '../../stores/useEventStore'; +import Link from 'next/link'; +import {useRouter} from 'next/router'; + +type Props = {}; + +const LinkedEventSwitch = (props: Props) => { + const {t} = useTranslation(); + const router = useRouter(); + const loadedEvent = useEventStore(s => s.event); + const linkedEvent = loadedEvent?.linkedEvent?.data?.attributes; + + if (!loadedEvent || !linkedEvent) return null; + + const goEvent = loadedEvent.isReturnEvent ? linkedEvent : loadedEvent; + const returnEvent = loadedEvent.isReturnEvent ? loadedEvent : linkedEvent; + + return ( + <ButtonGroup variant="contained"> + <Link href={router.asPath.replace(loadedEvent.uuid, goEvent.uuid)}> + <Button + color={loadedEvent.isReturnEvent ? 'inherit' : 'secondary'} + sx={{color: 'black'}} + > + {t`event.linked.goEvent`} ({goEvent.travels?.data?.length || 0}) + </Button> + </Link> + <Link href={router.asPath.replace(loadedEvent.uuid, returnEvent.uuid)}> + <Button + color={!loadedEvent.isReturnEvent ? 'inherit' : 'secondary'} + sx={{color: 'black'}} + > + {t`event.linked.returnEvent`} ( + {returnEvent?.travels?.data?.length || 0}) + </Button> + </Link> + </ButtonGroup> + ); +}; + +export default LinkedEventSwitch;
M frontend/containers/EventBar/index.tsxfrontend/containers/EventBar/index.tsx

@@ -14,6 +14,7 @@ import UserIcon from './UserIcon';

import DrawerNotification from '../DrawerNotification'; import useProfile from '../../hooks/useProfile'; import {Chip} from '@mui/material'; +import LinkedEventSwitch from './LinkedEventSwitch'; const EventBar = ({event, onAdd, goBack, title}) => { const {connected} = useProfile();

@@ -44,6 +45,7 @@ <Box

flexGrow={1} display="flex" justifyContent="space-start" + alignItems="center" pr={1} gap={1} >

@@ -74,6 +76,7 @@ variant="outlined"

sx={{color: 'white', borderColor: 'white'}} /> )} + <LinkedEventSwitch /> </Box> <> <IconButton
M frontend/containers/EventBar/useActions.tsfrontend/containers/EventBar/useActions.ts

@@ -15,7 +15,7 @@ const {t} = useTranslation();

const router = useRouter(); const {connected} = useProfile(); const {share} = useShare(); - const {event} = useEventStore(); + const event = useEventStore(s => s.event); const noUserMenuActions = [ {
M frontend/containers/Map/SearchField.tsxfrontend/containers/Map/SearchField.tsx

@@ -24,7 +24,7 @@ place={meetingFilter.place}

onSelect={onSelect} textFieldProps={{ variant: 'outlined', - placeholder: t`travel.fields.meeting_point`, + placeholder: t`travel.meeting`, size: 'small', slotProps: { input: {
M frontend/containers/Markers/TravelMarker/TravelPopup.tsxfrontend/containers/Markers/TravelMarker/TravelPopup.tsx

@@ -9,6 +9,7 @@ import {useTranslation} from 'next-i18next';

import getMapsLink from '../../../lib/getMapsLink'; import {getFormatedPhoneNumber} from '../../../lib/phoneNumbers'; import usePermissions from '../../../hooks/usePermissions'; +import useEventStore from '../../../stores/useEventStore'; interface Props { travel: TravelEntity;

@@ -19,6 +20,7 @@ const {t} = useTranslation();

const { userPermissions: {canSeeTravelDetails}, } = usePermissions(); + const isReturnEvent = useEventStore(s => s.event?.isReturnEvent); return ( <Popup> <Card sx={{p: 2, width: '350px', maxWidth: '100%', cursor: 'pointer'}}>

@@ -47,7 +49,7 @@ )}

{!!travel.attributes.meeting && ( <Box sx={{marginTop: 2}}> <Typography variant="overline" color="GrayText"> - {t('travel.fields.meeting_point')} + {t(isReturnEvent ? 'travel.destination' : 'travel.meeting')} </Typography> <Typography variant="body1" color="primary"> <Link
M frontend/containers/NewPassengerDialog/AddPassengerToWaitingList.tsxfrontend/containers/NewPassengerDialog/AddPassengerToWaitingList.tsx

@@ -110,7 +110,9 @@ <Box className={classes.inputBox}>

<label htmlFor="location"> <Typography className={classes.label}> <Icon className={classes.labelIcon}>place</Icon>{' '} - {t('travel.passengers.location')} + {t( + event?.isReturnEvent ? 'travel.destination' : 'travel.meeting' + )} </Typography> </label> <TextField

@@ -122,10 +124,14 @@ variant="outlined"

size="small" fullWidth label="" - placeholder={t('travel.passengers.location_placeholder')} + placeholder={t('generic.optional')} /> <Typography variant="caption"> - {t('travel.passengers.location_helper')} + {t( + event?.isReturnEvent + ? 'travel.passengers.destination_helper' + : 'travel.passengers.location_helper' + )} </Typography> </Box> <SubmitButton
M frontend/containers/NewTravelDialog/index.tsxfrontend/containers/NewTravelDialog/index.tsx

@@ -230,7 +230,9 @@ minutesStep={5}

/> </Box> <PlaceInput - label={t('travel.creation.meeting')} + label={t( + event?.isReturnEvent ? 'travel.destination' : 'travel.meeting' + )} textFieldProps={{ variant: 'outlined', size: 'small',
M frontend/containers/Travel/Header.tsxfrontend/containers/Travel/Header.tsx

@@ -16,6 +16,7 @@ import useProfile from '../../hooks/useProfile';

import DetailsLink from '../DetailsLink'; import {TravelEntity} from '../../generated/graphql'; import {getFormatedPhoneNumber} from '../../lib/phoneNumbers'; +import useEventStore from '../../stores/useEventStore'; interface Props { travel: TravelEntity;

@@ -33,6 +34,7 @@ userPermissions: {canEditTravel, canSeeTravelDetails},

} = usePermissions(); const setFocusOnTravel = useMapStore(s => s.setFocusOnTravel); const {userId} = useProfile(); + const isReturnEvent = useEventStore(s => s.event?.isReturnEvent); const isUserTripCreator = userId && userId === travel.attributes.user?.data?.id;

@@ -105,7 +107,7 @@ )}

{!!travel.attributes.meeting && ( <Box sx={{marginTop: 2}}> <Typography variant="overline" sx={{color: 'GrayText'}}> - {t('travel.fields.meeting_point')} + {t(isReturnEvent ? 'travel.destination' : 'travel.meeting')} </Typography> <Typography variant="body1"> <Link
M frontend/containers/Travel/HeaderEditing.tsxfrontend/containers/Travel/HeaderEditing.tsx

@@ -29,6 +29,7 @@ const actions = useActions({travel});

const isCarosterPlus = useEventStore(s => s.event.enabled_modules?.includes('caroster-plus') ); + const isReturnEvent = useEventStore(s => s.event?.isReturnEvent); const [removing, toggleRemoving] = useReducer(i => !i, false); // States

@@ -148,7 +149,7 @@ name="phone"

id="EditTravelPhone" /> <PlaceInput - label={t('travel.creation.meeting')} + label={t(isReturnEvent ? 'travel.destination' : 'travel.meeting')} textFieldProps={{sx: {pb: 2}}} place={meeting} latitude={meeting_latitude}
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -107,6 +107,7 @@ }

export enum Enum_Notification_Type { AddedAsAdmin = 'AddedAsAdmin', + AssignedByAdmin = 'AssignedByAdmin', ContactTripCreator = 'ContactTripCreator', DeletedFromTrip = 'DeletedFromTrip', DeletedTrip = 'DeletedTrip',

@@ -143,8 +144,10 @@ date?: Maybe<Scalars['Date']['output']>;

description?: Maybe<Scalars['String']['output']>; email: Scalars['String']['output']; enabled_modules?: Maybe<Scalars['JSON']['output']>; + isReturnEvent?: Maybe<Scalars['Boolean']['output']>; lang?: Maybe<Enum_Event_Lang>; latitude?: Maybe<Scalars['Float']['output']>; + linkedEvent?: Maybe<EventEntityResponse>; longitude?: Maybe<Scalars['Float']['output']>; name: Scalars['String']['output']; passengers?: Maybe<PassengerRelationResponseCollection>;

@@ -191,8 +194,10 @@ description?: InputMaybe<StringFilterInput>;

email?: InputMaybe<StringFilterInput>; enabled_modules?: InputMaybe<JsonFilterInput>; id?: InputMaybe<IdFilterInput>; + isReturnEvent?: InputMaybe<BooleanFilterInput>; lang?: InputMaybe<StringFilterInput>; latitude?: InputMaybe<FloatFilterInput>; + linkedEvent?: InputMaybe<EventFiltersInput>; longitude?: InputMaybe<FloatFilterInput>; name?: InputMaybe<StringFilterInput>; newsletter?: InputMaybe<BooleanFilterInput>;

@@ -213,8 +218,10 @@ date?: InputMaybe<Scalars['Date']['input']>;

description?: InputMaybe<Scalars['String']['input']>; email?: InputMaybe<Scalars['String']['input']>; enabled_modules?: InputMaybe<Scalars['JSON']['input']>; + isReturnEvent?: InputMaybe<Scalars['Boolean']['input']>; lang?: InputMaybe<Enum_Event_Lang>; latitude?: InputMaybe<Scalars['Float']['input']>; + linkedEvent?: InputMaybe<Scalars['ID']['input']>; longitude?: InputMaybe<Scalars['Float']['input']>; name?: InputMaybe<Scalars['String']['input']>; newsletter?: InputMaybe<Scalars['Boolean']['input']>;

@@ -1902,14 +1909,14 @@

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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, isReturnEvent?: boolean | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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<{ eventData: EventInput; }>; -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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, isReturnEvent?: boolean | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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'];

@@ -1917,7 +1924,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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, isReturnEvent?: boolean | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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'];

@@ -1940,7 +1947,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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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, lang?: Enum_Event_Lang | null, administrators?: Array<string | null> | null, date?: any | null, address?: string | null, latitude?: number | null, longitude?: number | null, isReturnEvent?: boolean | null, linkedEvent?: { __typename?: 'EventEntityResponse', data?: { __typename?: 'EventEntity', id?: string | null, attributes?: { __typename?: 'Event', uuid?: string | null, travels?: { __typename?: 'TravelRelationResponseCollection', data: Array<{ __typename?: 'TravelEntity', id?: string | null }> } | null } | null } | null } | 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, departureDate?: any | null, departureTime?: string | null, details?: string | null, vehicleName?: string | null, phone_number?: string | null, phoneCountry?: 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, phone?: string | null, phoneCountry?: 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 EventTripAlertsQueryVariables = Exact<{ uuid: Scalars['String']['input'];

@@ -2077,6 +2084,7 @@ date

address latitude longitude + isReturnEvent waitingPassengers { data { id

@@ -2607,6 +2615,21 @@ query eventByUUID($uuid: String!) {

eventByUUID(uuid: $uuid) { data { ...EventFields + attributes { + linkedEvent { + data { + id + attributes { + uuid + travels { + data { + id + } + } + } + } + } + } } } }
M frontend/graphql/event.gqlfrontend/graphql/event.gql

@@ -12,6 +12,7 @@ date

address latitude longitude + isReturnEvent waitingPassengers { data { id

@@ -119,6 +120,21 @@ query eventByUUID($uuid: String!) {

eventByUUID(uuid: $uuid) { data { ...EventFields + attributes { + linkedEvent { + data { + id + attributes { + uuid + travels { + data { + id + } + } + } + } + } + } } } }
M frontend/locales/de.jsonfrontend/locales/de.json

@@ -210,7 +210,6 @@ "travel.actions.remove_alert.caroster_plus": "Sind Sie sicher, dass Sie diese Fahrt entfernen möchten? Die Passagiere werden benachrichtigt.",

"travel.actions.removed.caroster_plus": "Die Fahrt wurde gestrichen und die Passagiere wurden informiert.", "travel.creation.created": "Die Fahrt wurde erstellt", "travel.creation.date": "Datum der Abfahrt", - "travel.creation.meeting": "Treffpunkt", "travel.creation.name": "Name des Fahrzeugs", "travel.creation.notes": "Zusätzliche Informationen", "travel.creation.phone": "Telefonnummer",

@@ -226,7 +225,7 @@ "travel.errors.cant_remove": "Die Reise konnte nicht gelöscht werden",

"travel.errors.cant_remove_passenger": "Passagier konnte nicht entfernt werden", "travel.errors.cant_update": "Die Reise konnte nicht geändert werden", "travel.fields.details": "Anmerkungen", - "travel.fields.meeting_point": "Treffpunkt", + "travel.meeting": "Treffpunkt", "travel.fields.phone": "Kontakt", "travel.passengers.add": "Passagier hinzufügen", "travel.passengers.add_someone": "Jemanden hinzufügen",

@@ -237,9 +236,7 @@ "travel.passengers.email": "E-Mail",

"travel.passengers.email_helpertext": "E-Mail ist nicht gültig", "travel.passengers.email_placeholder_optionnal": "E-Mail (optional)", "travel.passengers.empty": "Verfügbarer Sitzplatz", - "travel.passengers.location": "Treffpunkt", "travel.passengers.location_helper": "Geben Sie Ihren bevorzugten Abfahrtsort an", - "travel.passengers.location_placeholder": "Treffpunkt (optional)", "travel.passengers.name": "Name", "travel.passengers.name_placeholder": "Name", "travel.passengers.register_to_waiting_list": "Auf der Warteliste eintragen",
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -37,6 +37,8 @@ "event.add_to_my_events.login": "$t(menu.login)",

"event.add_to_my_events.register": "$t(menu.register)", "event.add_to_my_events.text": "To add <bold>{{eventName}}</bold> to your carosters you must be logged in or create an account.", "event.add_to_my_events.title": "You must be logged in", + "event.linked.goEvent": "Go", + "event.linked.returnEvent": "Return", "event.creation.addFromAccount.actions.login": "$t(menu.login)", "event.creation.addFromAccount.actions.register": "$t(menu.register)", "event.creation.addFromAccount.subtitle": "Create it from your account",

@@ -249,7 +251,6 @@ "travel.actions.removed.caroster_plus": "The trip has been removed and its passengers have been notified.",

"travel.creation.car.title": "Car and driver", "travel.creation.created": "The trip has been created", "travel.creation.date": "Date of departure", - "travel.creation.meeting": "Meeting place", "travel.creation.name": "Name of the car", "travel.creation.notes": "Additional information", "travel.creation.phone": "Telephone number",

@@ -268,7 +269,8 @@ "travel.errors.cant_remove": "Unable to remove the trip",

"travel.errors.cant_remove_passenger": "Unable to remove passenger", "travel.errors.cant_update": "Unable to modify the trip", "travel.fields.details": "Notes", - "travel.fields.meeting_point": "Meeting place", + "travel.meeting": "Meeting place", + "travel.destination": "Destination", "travel.fields.phone": "Contact", "travel.passengers.add": "Add a passenger", "travel.passengers.add_me": "Add myself",

@@ -281,9 +283,8 @@ "travel.passengers.email_helpertext": "Email is not valid",

"travel.passengers.email_placeholder": "Email", "travel.passengers.email_placeholder_optionnal": "Email (optionnal)", "travel.passengers.empty": "Available seat", - "travel.passengers.location": "Meeting place", "travel.passengers.location_helper": "Indicate your preferred departure location", - "travel.passengers.location_placeholder": "Meeting place (optionnal)", + "travel.passengers.destination_helper": "Indicate your preferred destination", "travel.passengers.moved_to_waiting_list": "The passenger has been moved to the waiting list.", "travel.passengers.name": "Name", "travel.passengers.name_placeholder": "Name",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -37,6 +37,8 @@ "event.add_to_my_events.login": "$t(menu.login)",

"event.add_to_my_events.register": "$t(menu.register)", "event.add_to_my_events.text": "Pour ajouter <bold>{{eventName}}</bold> à vos carosters vous devez être connecté ou créer un compte.", "event.add_to_my_events.title": "Vous devez être connecté", + "event.linked.goEvent": "Aller", + "event.linked.returnEvent": "Retour", "event.creation.addFromAccount.actions.login": "$t(menu.login)", "event.creation.addFromAccount.actions.register": "$t(menu.register)", "event.creation.addFromAccount.subtitle": "Créez-le depuis votre compte",

@@ -92,6 +94,7 @@ "generic.me": "Moi",

"generic.remove": "Supprimer", "generic.save": "Enregistrer", "generic.select": "Selectionner", + "generic.optional": "Optionnel", "lost_password.actions.cancel": "Annuler", "lost_password.actions.login": "Retour à l'écran de connexion", "lost_password.actions.register": "Créer un compte ?",

@@ -248,7 +251,8 @@ "travel.actions.removed.caroster_plus": "Le trajet a été supprimée et ses passagers ont été notifiés.",

"travel.creation.car.title": "Voiture et contact", "travel.creation.created": "Le trajet a été créée", "travel.creation.date": "Date de départ", - "travel.creation.meeting": "Lieu de rencontre", + "travel.meeting": "Lieu de rencontre", + "travel.destination": "Destination", "travel.creation.name": "Nom de la voiture", "travel.creation.notes": "Infos complémentaires", "travel.creation.phone": "Numéro de téléphone",

@@ -267,7 +271,6 @@ "travel.errors.cant_remove": "Impossible de supprimer le trajet",

"travel.errors.cant_remove_passenger": "Impossible de supprimer le passager", "travel.errors.cant_update": "Impossible de modifier le trajet", "travel.fields.details": "Notes", - "travel.fields.meeting_point": "Lieu de rencontre", "travel.fields.phone": "Contact", "travel.passengers.add": "Ajouter un passager", "travel.passengers.add_me": "S'ajouter",

@@ -280,9 +283,8 @@ "travel.passengers.email_helpertext": "Email non valide",

"travel.passengers.email_placeholder": "Email", "travel.passengers.email_placeholder_optionnal": "Email (optionnel)", "travel.passengers.empty": "Place disponible", - "travel.passengers.location": "Lieu de rencontre", "travel.passengers.location_helper": "Indiquez votre lieu de départ de préférence", - "travel.passengers.location_placeholder": "Lieu de rencontre (optionnel)", + "travel.passengers.destination_helper": "Indiquez votre destination de préférence", "travel.passengers.moved_to_waiting_list": "Le passager a été déplacé dans la liste d'attente.", "travel.passengers.name": "Nom", "travel.passengers.name_placeholder": "Nom",
M frontend/locales/it.jsonfrontend/locales/it.json

@@ -49,7 +49,6 @@ "event.details": "Informazioni",

"event.details.modify": "Modifica", "event.details.save": "Salva", "event.creation.name": "Nome evento", - "travel.creation.meeting": "Luogo d'incontro", "travel.creation.name": "Nome dell'auto", "travel.creation.notes": "Informazioni aggiuntive", "travel.creation.phone": "Numero di telefono",

@@ -67,7 +66,7 @@ "travel.errors.cant_create": "Impossibile creare il passaggio",

"travel.errors.cant_remove": "Impossibile rimuovere il passaggio", "travel.errors.cant_update": "Impossibile modificare il passaggio", "travel.fields.details": "Note", - "travel.fields.meeting_point": "Luogo d'incontro", + "travel.meeting": "Luogo d'incontro", "travel.fields.phone": "Contatta", "travel.passengers.add": "Aggiungi un passeggero", "travel.passengers.add_me": "Aggiungimi",

@@ -78,7 +77,6 @@ "travel.passengers.email": "Email",

"travel.passengers.email_helpertext": "L'email non è valida", "travel.passengers.email_placeholder_optionnal": "Email (facoltativa)", "travel.passengers.empty": "Posto disponibile", - "travel.passengers.location": "Luogo d'incontro", "travel.passengers.location_helper": "Indica il tuo luogo di partenza desiderato", "travel.passengers.moved_to_waiting_list": "Il passeggero è stato trasferito alla lista d'attesa.", "travel.passengers.name": "Nome",

@@ -110,7 +108,6 @@ "signin.email": "Email",

"event.add_to_my_events.text": "Per aggiungere <bold>{{eventName}}</bold> ai tuoi caroster devi effettuare l'accesso o creare un account.", "event.loginToSetAlert": "Gli avvisi sono disponibili solo a chi partecipa al carpool.", "passenger.success.added_self_to_car": "Sei stato aggiunto al passaggio", - "travel.passengers.location_placeholder": "Luogo d'incontro (facoltativo)", "alert.description": "Imposta un avviso via email per le partenze vicine", "event.errors.cant_update": "Impossibile modificare l'evento", "event.fields.address": "Indirizzo evento",

@@ -146,6 +143,7 @@ "generic.me": "Io",

"generic.remove": "Rimuovi", "generic.save": "Salva", "generic.select": "Seleziona", + "generic.optional": "Facoltativo", "lost_password.actions.cancel": "Annulla", "lost_password.actions.login": "Torna alla schermata d'accesso", "lost_password.actions.register": "Creare un account?",
M frontend/locales/nl.jsonfrontend/locales/nl.json

@@ -92,6 +92,7 @@ "generic.me": "Ik",

"generic.remove": "Verwijderen", "generic.save": "Opslaan", "generic.select": "Selecteren", + "generic.optional": "Optioneel", "lost_password.actions.cancel": "Annuleren", "lost_password.actions.login": "Terug naar inlogscherm", "lost_password.actions.register": "Account aanmaken?",

@@ -243,7 +244,6 @@ "travel.actions.removed.caroster_plus": "Het voertuig is verwijderd en alle passagiers zijn op de hoogte gesteld.",

"travel.creation.car.title": "Voertuig en bestuurder", "travel.creation.created": "Het voertuig is aangemaakt", "travel.creation.date": "Vertrekdatum", - "travel.creation.meeting": "Afspraaklocatie", "travel.creation.name": "Voertuignaam", "travel.creation.notes": "Aanvullende informatie", "travel.creation.phone": "Telefoonnummer",

@@ -262,7 +262,7 @@ "travel.errors.cant_remove": "Het voertuig kan niet worden verwijderd",

"travel.errors.cant_remove_passenger": "De passagier kan niet worden verwijderd", "travel.errors.cant_update": "Het voertuig kan niet worden bewerkt", "travel.fields.details": "Aantekeningen", - "travel.fields.meeting_point": "Afspraaklocatie", + "travel.meeting": "Afspraaklocatie", "travel.fields.phone": "Contact", "travel.passengers.add": "Passagier toevoegen", "travel.passengers.add_me": "Mijzelf toevoegen",

@@ -275,9 +275,7 @@ "travel.passengers.email_helpertext": "Het e-mailadres is ongeldig",

"travel.passengers.email_placeholder": "E-mailadres", "travel.passengers.email_placeholder_optionnal": "Email (optioneel)", "travel.passengers.empty": "Beschikbare plaats", - "travel.passengers.location": "Afspraaklocatie", "travel.passengers.location_helper": "Geef de gewenste vertreklocatie op", - "travel.passengers.location_placeholder": "Afspraaklocatie (optioneel)", "travel.passengers.moved_to_waiting_list": "De passagier is toegevoegd aan de wachtlijst.", "travel.passengers.name": "Naam", "travel.passengers.name_placeholder": "Naam",
M frontend/locales/pl.jsonfrontend/locales/pl.json

@@ -232,7 +232,6 @@ "travel.actions.removed.caroster_plus": "",

"travel.creation.car.title": "", "travel.creation.created": "", "travel.creation.date": "", - "travel.creation.meeting": "Miejsce spotkania", "travel.creation.name": "", "travel.creation.notes": "Dodatkowe informacje", "travel.creation.phone": "Numer telefonu",

@@ -248,7 +247,7 @@ "travel.errors.cant_remove": "",

"travel.errors.cant_remove_passenger": "", "travel.errors.cant_update": "", "travel.fields.details": "Notatki", - "travel.fields.meeting_point": "Miejsce spotkania", + "travel.meeting": "Miejsce spotkania", "travel.fields.phone": "Kontakt", "travel.moved_to_waiting_list": "", "travel.passengers.add": "",

@@ -262,9 +261,7 @@ "travel.passengers.email_helpertext": "",

"travel.passengers.email_placeholder": "Email", "travel.passengers.email_placeholder_optionnal": "", "travel.passengers.empty": "", - "travel.passengers.location": "", "travel.passengers.location_helper": "", - "travel.passengers.location_placeholder": "", "travel.passengers.name": "Imię", "travel.passengers.name_placeholder": "Imię", "travel.passengers.register_to_waiting_list": "",
M frontend/locales/sv.jsonfrontend/locales/sv.json

@@ -210,7 +210,6 @@ "travel.actions.removed.caroster_plus": "",

"travel.creation.car.title": "", "travel.creation.created": "", "travel.creation.date": "", - "travel.creation.meeting": "", "travel.creation.name": "", "travel.creation.notes": "", "travel.creation.phone": "",

@@ -226,7 +225,7 @@ "travel.errors.cant_remove": "",

"travel.errors.cant_remove_passenger": "", "travel.errors.cant_update": "", "travel.fields.details": "", - "travel.fields.meeting_point": "", + "travel.meeting": "", "travel.fields.phone": "", "travel.moved_to_waiting_list": "", "travel.passengers.add": "",

@@ -240,9 +239,7 @@ "travel.passengers.email_helpertext": "",

"travel.passengers.email_placeholder": "", "travel.passengers.email_placeholder_optionnal": "", "travel.passengers.empty": "", - "travel.passengers.location": "", "travel.passengers.location_helper": "", - "travel.passengers.location_placeholder": "", "travel.passengers.name": "", "travel.passengers.name_placeholder": "", "travel.passengers.register_to_waiting_list": "",
M frontend/pages/e/[uuid]/details.tsxfrontend/pages/e/[uuid]/details.tsx

@@ -59,6 +59,8 @@

const onSave = async e => { try { const {uuid, ...data} = event; + delete data.linkedEvent; + delete data.isReturnEvent; const { id, travels,
M frontend/public/sw.jsfrontend/public/sw.js

@@ -1,1 +1,1 @@

-if(!self.define){let e,s={};const a=(a,c)=>(a=new URL(a+".js",c).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(c,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(s[n])return;let t={};const r=e=>a(e,n),d={module:{uri:n},exports:t,require:r};s[n]=Promise.all(c.map((e=>d[e]||r(e)))).then((e=>(i(...e),t)))}}define(["./workbox-860c9203"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/chunks/116-b6ba819ce00cf1b2.js",revision:"b6ba819ce00cf1b2"},{url:"/_next/static/chunks/139-765d797f38161601.js",revision:"765d797f38161601"},{url:"/_next/static/chunks/148-4c7f4f314e51d8e7.js",revision:"4c7f4f314e51d8e7"},{url:"/_next/static/chunks/153-96966bed280628f6.js",revision:"96966bed280628f6"},{url:"/_next/static/chunks/170-fd9cef35a8538241.js",revision:"fd9cef35a8538241"},{url:"/_next/static/chunks/208-d06d675823d71864.js",revision:"d06d675823d71864"},{url:"/_next/static/chunks/249-57c739594fd1eb17.js",revision:"57c739594fd1eb17"},{url:"/_next/static/chunks/270.4738fe01f5312ece.js",revision:"4738fe01f5312ece"},{url:"/_next/static/chunks/289-bfed5ea8e1335875.js",revision:"bfed5ea8e1335875"},{url:"/_next/static/chunks/305-44087c167bdc11e4.js",revision:"44087c167bdc11e4"},{url:"/_next/static/chunks/306-47b8a84177fa7ff6.js",revision:"47b8a84177fa7ff6"},{url:"/_next/static/chunks/415-6d36656adf9285d7.js",revision:"6d36656adf9285d7"},{url:"/_next/static/chunks/426-b37a0b6753087c78.js",revision:"b37a0b6753087c78"},{url:"/_next/static/chunks/478-e3c8c68335eb5e04.js",revision:"e3c8c68335eb5e04"},{url:"/_next/static/chunks/60.54ba37612834371b.js",revision:"54ba37612834371b"},{url:"/_next/static/chunks/618-d64860f3b0c44549.js",revision:"d64860f3b0c44549"},{url:"/_next/static/chunks/637-44219b64bf227850.js",revision:"44219b64bf227850"},{url:"/_next/static/chunks/674-d88bd34ba1784616.js",revision:"d88bd34ba1784616"},{url:"/_next/static/chunks/685-471597121e7349d3.js",revision:"471597121e7349d3"},{url:"/_next/static/chunks/837-ff88120b474141d2.js",revision:"ff88120b474141d2"},{url:"/_next/static/chunks/894-9572bdb6ae497251.js",revision:"9572bdb6ae497251"},{url:"/_next/static/chunks/985.c42c10aa951eecae.js",revision:"c42c10aa951eecae"},{url:"/_next/static/chunks/c158f0e1.1535fa31e78d7750.js",revision:"1535fa31e78d7750"},{url:"/_next/static/chunks/cabb2d90-99818b45e801a968.js",revision:"99818b45e801a968"},{url:"/_next/static/chunks/framework-97a3c2b9bdeaabd8.js",revision:"97a3c2b9bdeaabd8"},{url:"/_next/static/chunks/main-34edacdd4b2346ab.js",revision:"34edacdd4b2346ab"},{url:"/_next/static/chunks/pages/_app-f175f25ec74f5cb4.js",revision:"f175f25ec74f5cb4"},{url:"/_next/static/chunks/pages/_error-fc948942ffc17083.js",revision:"fc948942ffc17083"},{url:"/_next/static/chunks/pages/auth/confirm-e7616c4d2f5b9c3b.js",revision:"e7616c4d2f5b9c3b"},{url:"/_next/static/chunks/pages/auth/confirm/google-7277eddd8f727d35.js",revision:"7277eddd8f727d35"},{url:"/_next/static/chunks/pages/auth/email-confirmation-7e90df76555bb4db.js",revision:"7e90df76555bb4db"},{url:"/_next/static/chunks/pages/auth/login-22d35f873e56d75f.js",revision:"22d35f873e56d75f"},{url:"/_next/static/chunks/pages/auth/lost-password-7db0d9b24d5f82af.js",revision:"7db0d9b24d5f82af"},{url:"/_next/static/chunks/pages/auth/register-cd7eec9711b3ba4c.js",revision:"cd7eec9711b3ba4c"},{url:"/_next/static/chunks/pages/auth/register/mail-627436df37a0d738.js",revision:"627436df37a0d738"},{url:"/_next/static/chunks/pages/auth/reset-ef02424ccde62877.js",revision:"ef02424ccde62877"},{url:"/_next/static/chunks/pages/dashboard-bbcdbeb7b5595e54.js",revision:"bbcdbeb7b5595e54"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D-23ef79ee4dc7ba27.js",revision:"23ef79ee4dc7ba27"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/alerts-15682a3cfa17c467.js",revision:"15682a3cfa17c467"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/assign/%5BpassengerId%5D-6875dd94bfd84589.js",revision:"6875dd94bfd84589"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/details-8b6f3f6cc2a371b7.js",revision:"8b6f3f6cc2a371b7"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/options-2cd55de85e1f1c1d.js",revision:"2cd55de85e1f1c1d"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/waitingList-445aa90799500c8f.js",revision:"445aa90799500c8f"},{url:"/_next/static/chunks/pages/index-21d5681e7ce08b51.js",revision:"21d5681e7ce08b51"},{url:"/_next/static/chunks/pages/new-7a5431640ef7388f.js",revision:"7a5431640ef7388f"},{url:"/_next/static/chunks/pages/profile-0d245bda7cdc3260.js",revision:"0d245bda7cdc3260"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-05174729dbf55dd4.js",revision:"05174729dbf55dd4"},{url:"/_next/static/css/0742d73c3229e134.css",revision:"0742d73c3229e134"},{url:"/_next/static/css/209b782d1a2e630e.css",revision:"209b782d1a2e630e"},{url:"/_next/static/media/layers-2x.9859cd12.png",revision:"9859cd12"},{url:"/_next/static/media/layers.ef6db872.png",revision:"ef6db872"},{url:"/_next/static/media/marker-icon.d577052a.png",revision:"d577052a"},{url:"/_next/static/wpJD8mq6V4ToV7HWvJ6Bi/_buildManifest.js",revision:"00e8fd3ed9499742de5eac168a78a5bc"},{url:"/_next/static/wpJD8mq6V4ToV7HWvJ6Bi/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/assets/Caroster_Octree_Social.jpg",revision:"563fc10a4ec83e735943c5f67d417a6e"},{url:"/assets/Caroster_beta.png",revision:"86c6259620aee306a019b2a611eaf21d"},{url:"/assets/Logo_in_beta.svg",revision:"cdde8d69adbfdbaf7c903e155419b12c"},{url:"/assets/android-chrome-192x192.png",revision:"b288769d936ad5f9a87944e027d0096c"},{url:"/assets/android-chrome-512x512.png",revision:"c789c009674fc4a2087a8b71c24a12b7"},{url:"/assets/apple-touch-icon.png",revision:"573a4bc22886d3ef3f6c3aa0eab64d44"},{url:"/assets/car.png",revision:"0c95a91895d437b7ea06db071aa8f68f"},{url:"/assets/favicon-16x16.png",revision:"9f98c22a36ec0001995797d29a7583b1"},{url:"/assets/favicon-32x32.png",revision:"562ff70a6694a29302644d4f85b2e920"},{url:"/assets/favicon.ico",revision:"45004f0a61722a526ca688bddc4955c4"},{url:"/assets/google-icon.svg",revision:"81ad048ed858673aaca6cc2227076b8a"},{url:"/assets/icon.png",revision:"ac122f40fd4c9fd7f1831b0dd406c950"},{url:"/assets/logo.png",revision:"d685d6b49c3aedcf4819d5cbbc873d60"},{url:"/assets/logo.svg",revision:"bf83592cc1865c5c492b7ab09bb18f59"},{url:"/assets/site.webmanifest",revision:"053100cb84a50d2ae7f5492f7dd7f25e"},{url:"/favicon.ico",revision:"8eb6dd187ac1c4e26f8df8062bb42e09"},{url:"/leaflet_reset.css",revision:"0936d7c0f04ef89fe3c337decb621909"},{url:"/manifest.json",revision:"e76480838d8eb8908456941dcb59275e"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:a,state:c})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +if(!self.define){let e,s={};const c=(c,a)=>(c=new URL(c+".js",a).href,s[c]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=s,document.head.appendChild(e)}else e=c,importScripts(c),s()})).then((()=>{let e=s[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e})));self.define=(a,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(s[n])return;let t={};const r=e=>c(e,n),d={module:{uri:n},exports:t,require:r};s[n]=Promise.all(a.map((e=>d[e]||r(e)))).then((e=>(i(...e),t)))}}define(["./workbox-860c9203"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/chunks/116-b6ba819ce00cf1b2.js",revision:"b6ba819ce00cf1b2"},{url:"/_next/static/chunks/136.fabdec7e2ff311b6.js",revision:"fabdec7e2ff311b6"},{url:"/_next/static/chunks/148-4c7f4f314e51d8e7.js",revision:"4c7f4f314e51d8e7"},{url:"/_next/static/chunks/153-39bef0336ef0f126.js",revision:"39bef0336ef0f126"},{url:"/_next/static/chunks/170-fd9cef35a8538241.js",revision:"fd9cef35a8538241"},{url:"/_next/static/chunks/208-d06d675823d71864.js",revision:"d06d675823d71864"},{url:"/_next/static/chunks/273-e958107c3cfee59b.js",revision:"e958107c3cfee59b"},{url:"/_next/static/chunks/289-bfed5ea8e1335875.js",revision:"bfed5ea8e1335875"},{url:"/_next/static/chunks/306-9752b98ea1c64f83.js",revision:"9752b98ea1c64f83"},{url:"/_next/static/chunks/317-e017bc6b67b3ff5e.js",revision:"e017bc6b67b3ff5e"},{url:"/_next/static/chunks/323-450d0bbddeb6b841.js",revision:"450d0bbddeb6b841"},{url:"/_next/static/chunks/381-736a372fad54ef32.js",revision:"736a372fad54ef32"},{url:"/_next/static/chunks/471.223f771ef75149cd.js",revision:"223f771ef75149cd"},{url:"/_next/static/chunks/478-e3c8c68335eb5e04.js",revision:"e3c8c68335eb5e04"},{url:"/_next/static/chunks/573-800a9cf90e7d6bb6.js",revision:"800a9cf90e7d6bb6"},{url:"/_next/static/chunks/618-d64860f3b0c44549.js",revision:"d64860f3b0c44549"},{url:"/_next/static/chunks/623.d0fa7c009574fa0d.js",revision:"d0fa7c009574fa0d"},{url:"/_next/static/chunks/637-fb672ccf8b1ca9a8.js",revision:"fb672ccf8b1ca9a8"},{url:"/_next/static/chunks/674-97580337eccf94c1.js",revision:"97580337eccf94c1"},{url:"/_next/static/chunks/823-73fe604503dd5592.js",revision:"73fe604503dd5592"},{url:"/_next/static/chunks/825-52af096ca61a1268.js",revision:"52af096ca61a1268"},{url:"/_next/static/chunks/837-ff88120b474141d2.js",revision:"ff88120b474141d2"},{url:"/_next/static/chunks/894-9572bdb6ae497251.js",revision:"9572bdb6ae497251"},{url:"/_next/static/chunks/90.7beac63fb8c8f9b1.js",revision:"7beac63fb8c8f9b1"},{url:"/_next/static/chunks/c158f0e1.1535fa31e78d7750.js",revision:"1535fa31e78d7750"},{url:"/_next/static/chunks/cabb2d90-1ccf91252a833ded.js",revision:"1ccf91252a833ded"},{url:"/_next/static/chunks/framework-97a3c2b9bdeaabd8.js",revision:"97a3c2b9bdeaabd8"},{url:"/_next/static/chunks/main-96bcd357b9fc1215.js",revision:"96bcd357b9fc1215"},{url:"/_next/static/chunks/pages/_app-3b1488b62029b1d5.js",revision:"3b1488b62029b1d5"},{url:"/_next/static/chunks/pages/_error-5e6c2c8882761acf.js",revision:"5e6c2c8882761acf"},{url:"/_next/static/chunks/pages/auth/confirm-c0558f5c11631171.js",revision:"c0558f5c11631171"},{url:"/_next/static/chunks/pages/auth/confirm/google-d88e22518b702db6.js",revision:"d88e22518b702db6"},{url:"/_next/static/chunks/pages/auth/email-confirmation-13f3ec2e68e016a5.js",revision:"13f3ec2e68e016a5"},{url:"/_next/static/chunks/pages/auth/login-c217d4e2391b501f.js",revision:"c217d4e2391b501f"},{url:"/_next/static/chunks/pages/auth/lost-password-c7c0e379a3ce603d.js",revision:"c7c0e379a3ce603d"},{url:"/_next/static/chunks/pages/auth/register-fab8defec2c1603a.js",revision:"fab8defec2c1603a"},{url:"/_next/static/chunks/pages/auth/register/mail-151c129b102de050.js",revision:"151c129b102de050"},{url:"/_next/static/chunks/pages/auth/reset-0f18d60c770add67.js",revision:"0f18d60c770add67"},{url:"/_next/static/chunks/pages/dashboard-f0289c2ea1244000.js",revision:"f0289c2ea1244000"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D-128aabc39e32f4d0.js",revision:"128aabc39e32f4d0"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/adminWaitingList-11e4ecaa9ad38f0b.js",revision:"11e4ecaa9ad38f0b"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/alerts-ac93e0fdf8c3e663.js",revision:"ac93e0fdf8c3e663"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/assign/%5BpassengerId%5D-922838df21666888.js",revision:"922838df21666888"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/details-7ca951c06dc37dc5.js",revision:"7ca951c06dc37dc5"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/options-7082949c580778a7.js",revision:"7082949c580778a7"},{url:"/_next/static/chunks/pages/e/%5Buuid%5D/waitingList-42a3a550246178b9.js",revision:"42a3a550246178b9"},{url:"/_next/static/chunks/pages/index-21d5681e7ce08b51.js",revision:"21d5681e7ce08b51"},{url:"/_next/static/chunks/pages/new-2e45b6fc99211a94.js",revision:"2e45b6fc99211a94"},{url:"/_next/static/chunks/pages/profile-f0a342e3ad6d5631.js",revision:"f0a342e3ad6d5631"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-54ec7b4a850802c2.js",revision:"54ec7b4a850802c2"},{url:"/_next/static/css/0742d73c3229e134.css",revision:"0742d73c3229e134"},{url:"/_next/static/css/209b782d1a2e630e.css",revision:"209b782d1a2e630e"},{url:"/_next/static/media/layers-2x.9859cd12.png",revision:"9859cd12"},{url:"/_next/static/media/layers.ef6db872.png",revision:"ef6db872"},{url:"/_next/static/media/marker-icon.d577052a.png",revision:"d577052a"},{url:"/_next/static/t9fdUxQuDBwHgMZXIFjPu/_buildManifest.js",revision:"bf181ba09c2dd38f91ee4694adc3056c"},{url:"/_next/static/t9fdUxQuDBwHgMZXIFjPu/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/assets/Caroster_Octree_Social.jpg",revision:"563fc10a4ec83e735943c5f67d417a6e"},{url:"/assets/Caroster_beta.png",revision:"86c6259620aee306a019b2a611eaf21d"},{url:"/assets/Logo_in_beta.svg",revision:"cdde8d69adbfdbaf7c903e155419b12c"},{url:"/assets/android-chrome-192x192.png",revision:"b288769d936ad5f9a87944e027d0096c"},{url:"/assets/android-chrome-512x512.png",revision:"c789c009674fc4a2087a8b71c24a12b7"},{url:"/assets/apple-touch-icon.png",revision:"573a4bc22886d3ef3f6c3aa0eab64d44"},{url:"/assets/car.png",revision:"0c95a91895d437b7ea06db071aa8f68f"},{url:"/assets/favicon-16x16.png",revision:"9f98c22a36ec0001995797d29a7583b1"},{url:"/assets/favicon-32x32.png",revision:"562ff70a6694a29302644d4f85b2e920"},{url:"/assets/favicon.ico",revision:"45004f0a61722a526ca688bddc4955c4"},{url:"/assets/google-icon.svg",revision:"81ad048ed858673aaca6cc2227076b8a"},{url:"/assets/icon.png",revision:"ac122f40fd4c9fd7f1831b0dd406c950"},{url:"/assets/logo.png",revision:"d685d6b49c3aedcf4819d5cbbc873d60"},{url:"/assets/logo.svg",revision:"bf83592cc1865c5c492b7ab09bb18f59"},{url:"/assets/site.webmanifest",revision:"053100cb84a50d2ae7f5492f7dd7f25e"},{url:"/favicon.ico",revision:"8eb6dd187ac1c4e26f8df8062bb42e09"},{url:"/leaflet_reset.css",revision:"0936d7c0f04ef89fe3c337decb621909"},{url:"/manifest.json",revision:"e76480838d8eb8908456941dcb59275e"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:c,state:a})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}));