{"version":3,"file":"static/js/form-page.73f3da2d.chunk.js","mappings":"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","sources":["components/access-booking/access-booking-container.tsx","components/access-booking/service.ts","components/blue-screen/blue-screen.tsx","lib/src/common/content-service.ts","common/booking-details-service.ts","components/sailing-provider/querystring-sailing-provider.tsx","lib/src/common/querystring.ts","lib/src/common/network-cache.ts","lib/src/common/initial-data-service.ts","components/form/form-container.tsx","components/form/form-service.ts","pages/form/form.tsx","lib/src/common/content-parser.ts","lib/src/common/sailing-notification-service.ts","components/booked-nav/booked-nav-container.tsx","common/cookies.ts","common/ccl-cookies.ts","common/profile.ts","components/footer/footer-container.tsx"],"sourcesContent":["import * as React from 'react';\nimport { addBookings } from './service';\nimport {\n AccessBookingModalTrigger,\n AccessBookingContentProps,\n AddBookingRequest,\n AddBookingsResponse,\n Modal,\n AccessBooking\n} from 'cclr-huge-ui';\nimport { getContent } from '../../lib/src/common/content-service';\nimport * as profile from '../../common/profile';\nimport { localRoutes } from '../../lib/src/common/constants';\n\nexport interface AccessBookingContainerProps {\n onOpening?(): void;\n onClosed?(): void;\n mode?: 'autoOpen' | 'link';\n}\n\nexport type AccessBookingContainerState = {\n content: AccessBookingContentProps | null;\n};\n\nexport class AccessBookingContainer extends React.Component<AccessBookingContainerProps, AccessBookingContainerState> {\n\n state: AccessBookingContainerState = {\n content: null\n };\n\n render() {\n if (!this.state.content) {\n return null;\n }\n\n const guestName = profile.getAuthenticatedUserFullName();\n\n if (this.props.mode === 'autoOpen') {\n return (\n <Modal\n shell={false}\n isOpen={true}\n fullScreen={true}\n dialogDescription={this.state.content.heading}\n >\n <AccessBooking\n mode=\"modal\"\n onRequestClose={this.autoOpenModeCloseModal}\n content={this.state.content}\n onSubmit={this.submitSearch}\n onComplete={this.onSailingToSelect}\n anonymousUser={!guestName}\n />\n </Modal>\n );\n }\n\n return (\n <AccessBookingModalTrigger\n onSubmit={this.submitSearch}\n content={this.state.content!}\n onOpening={this.props.onOpening}\n onClosed={this.props.onClosed}\n onComplete={this.onSailingToSelect}\n />\n );\n }\n\n componentDidMount() {\n getContent<AccessBookingContentProps>('23FF20BD-DF4E-42A8-ABD1-1F5F53F21FB2')\n .then(content => this.setState({ content }));\n }\n\n private autoOpenModeCloseModal() {\n window.location.href = '/';\n }\n\n private onSailingToSelect = (fromBookingNumber: string): void => {\n if (fromBookingNumber) {\n this.redirectToBooking(encodeURIComponent(fromBookingNumber));\n }\n }\n\n private submitSearch = (bookings: AddBookingRequest[]): Promise<AddBookingsResponse> => {\n return addBookings(bookings).then(n => {\n setTimeout(() => {\n const isOrganizerAccess = window.location.pathname.toLowerCase().indexOf(localRoutes.access) >= 0;\n const bookingNumber = encodeURIComponent(bookings[0].bookingNumber);\n if (isOrganizerAccess) {\n window.location.href = `${localRoutes.home}?bookingNumber=${bookingNumber}&source=oa`;\n } else {\n this.redirectToBooking(bookingNumber);\n }\n }, 4000);\n return n;\n });\n }\n\n private redirectToBooking(bookingNumber: string) {\n const path = window.location.pathname.toLowerCase();\n if (path.indexOf(localRoutes.details) >= 0 || path.indexOf(localRoutes.home) >= 0 || path.indexOf(localRoutes.planner) >= 0) {\n window.location.href = `${path}?bookingNumber=${bookingNumber}`;\n } else {\n window.location.href = `${localRoutes.home}?bookingNumber=${bookingNumber}`;\n }\n }\n}\n","import { AddBookingRequest, AddBookingsResponse, Advisory } from 'cclr-huge-ui';\nimport { ApiError, cclFetch } from 'ccl-utilities';\n\nexport type AddBookingsApiResponse = {\n responses: AddBookingApiResponse[];\n};\n\nexport type AddBookingApiResponse = {\n bookingNumber: string;\n lastName: string;\n success: boolean;\n details: Advisory[];\n};\n\nexport function addBookings(bookings: AddBookingRequest[]): Promise<AddBookingsResponse> {\n const opts: RequestInit = {\n method: 'POST',\n headers: new Headers({\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }),\n body: JSON.stringify({\n bookings: bookings\n }),\n };\n\n return cclFetch<AddBookingsApiResponse>('/booked/api/v1.0/bookings', opts)\n .catch((error: ApiError) => {\n if (error.code === 'RequestsFailed' && error.innerError && error.innerError.data) {\n // eslint-disable-next-line no-throw-literal\n throw error.innerError.data as AddBookingsResponse;\n }\n throw error;\n });\n}\n","import * as React from 'react';\n\nexport const BlueScreen: React.FunctionComponent = () => (\n <div>\n <h1>Page could not be loaded</h1>\n <p>Please log out and log in again.</p>\n </div>\n);","import { cclFetch } from 'ccl-utilities';\nimport { parseContent } from './content-parser';\nimport { Item } from 'cclr-huge-ui/dist/src/models/sitecore';\nimport { getInitialData } from './initial-data-service';\nimport { sailingNotificationService } from './sailing-notification-service';\n\ninterface Store {\n // tslint:disable-next-line:no-any\n [key: string]: Promise<any>;\n}\n\nconst store: Store = {};\n\nexport function getContent<TContent>(id: string): Promise<TContent> {\n // some modules don't have a sailing dependency (Funmail and travel companions).\n // Access does not either, but our version is not used, hybris's is.\n const lang = sailingNotificationService.currentSailing?.contentLanguageCode || 'en';\n const storageKey = `${id.toLowerCase()}_${lang}`;\n\n if (!store[storageKey]) {\n const content = getInitialData<Item>(storageKey);\n if (content) {\n store[storageKey] = Promise.resolve(parseContent<TContent>(content));\n } else {\n const contentVersionParam = getContentVersionParam();\n const url = `/booked/api/v1.0/Content?${contentVersionParam}id=${id}&lang=${lang}`;\n store[storageKey] = cclFetch<Item>(url)\n .then(rawContent => parseContent<TContent>(rawContent));\n }\n }\n return store[storageKey];\n}\n\ninterface RawStore {\n [key: string]: Promise<Item>;\n}\n\nconst rawStore: RawStore = {};\n\nexport function getRawContent(id: string): Promise<Item> {\n\n const lang = sailingNotificationService.currentSailing?.contentLanguageCode || 'en';\n const storageKey = `${id.toLowerCase()}_${lang}`;\n\n if (!rawStore[storageKey]) {\n const content = getInitialData<Item>(storageKey);\n if (content) {\n rawStore[storageKey] = Promise.resolve(content);\n } else {\n const contentVersionParam = getContentVersionParam();\n const url = `/booked/api/v1.0/Content?${contentVersionParam}id=${id}&lang=${lang}`;\n rawStore[storageKey] = cclFetch<Item>(url);\n }\n }\n return rawStore[storageKey];\n}\n\nfunction getContentVersionParam(): string {\n const hstElement = document.getElementById('hst');\n if (hstElement) {\n const contentVersion = hstElement.getAttribute('ver');\n if (contentVersion) {\n const hash = getContentHash();\n return `version=${contentVersion}.${hash}&`;\n }\n }\n return '';\n}\n\nfunction getContentHash(): string {\n const hashElement = document.getElementById('content-hash') as HTMLInputElement;\n return hashElement ? hashElement.value : '';\n}\n","import { cclFetch } from 'ccl-utilities';\nimport { GetDetailsApiResponse, InvoiceApiResponse, SailingApiResponse } from '../lib/src/common/api-models';\n\nexport type Observer = () => Promise<SailingApiResponse>;\nlet bookingDetailsObserver: Observer;\n\nexport function registerBookingDetailsObserver(observer: Observer) {\n bookingDetailsObserver = observer;\n}\n\ninterface Store {\n [key: string]: Promise<GetDetailsApiResponse>;\n}\n\nconst store: Store = {};\n\nexport function getBookingDetails(bookingNumber: string): Promise<GetDetailsApiResponse> {\n if (!store[bookingNumber]) {\n const url = `/booked/api/v1.0/bookings/details?bookingNumber=${encodeURIComponent(bookingNumber)}`;\n store[bookingNumber] = cclFetch<GetDetailsApiResponse>(url);\n }\n return store[bookingNumber];\n}\n\nexport function getQuote(bookingNumber: string, vpp: number[] | null, gratuities: boolean | null): Promise<InvoiceApiResponse> {\n const qs = [`bookingNumber=${encodeURIComponent(bookingNumber)}`];\n if (vpp) {\n Array.prototype.push.apply(qs, vpp.map(s => `vpp=${encodeURIComponent(s.toString())}`));\n }\n if (gratuities !== null && gratuities !== undefined) {\n qs.push(`gratuities=${encodeURIComponent(gratuities.toString())}`);\n }\n return cclFetch<InvoiceApiResponse>(`/booked/api/v1.0/bookings/quote?${qs.join('&')}`);\n}\n\nexport function invalidateBookingDetails(bookingNumber: string): Promise<any> {\n delete store[bookingNumber];\n if (bookingDetailsObserver) {\n return bookingDetailsObserver();\n }\n\n return Promise.resolve();\n}\n","import * as React from 'react';\nimport { parse } from '../../lib/src/common/querystring';\nimport { SailingApiResponse, SailingsApiResponse, PageDataApiResponse } from '../../lib/src/common/api-models';\nimport { cclFetch } from 'ccl-utilities';\nimport { registerBookingDetailsObserver } from '../../common/booking-details-service';\nimport { SailingProviderProps } from '../../lib/src/components/sailing-provider/sailing-provider-props';\nimport { getInitialData, populateInitialData } from '../../lib/src/common/initial-data-service';\nimport { sailingNotificationService } from '../../lib/src/common/sailing-notification-service';\n\ninterface QuerystringSailingProviderState {\n sailing: SailingApiResponse | null;\n sailings: SailingsApiResponse | null;\n showOrders: boolean;\n pending: boolean;\n}\n\nexport class QuerystringSailingProvider extends React.Component<SailingProviderProps, QuerystringSailingProviderState> {\n\n state: QuerystringSailingProviderState = {\n sailing: null,\n sailings: null,\n showOrders: false,\n pending: true,\n };\n\n componentDidMount() {\n registerBookingDetailsObserver(this.onBookingDetailsChanged);\n this.fetchInitialData();\n }\n\n render() {\n const { pending, sailing, sailings, showOrders } = this.state;\n const { children, renderLoading, renderError} = this.props;\n if (pending) {\n return renderLoading();\n }\n if (!sailing || !sailings) {\n return renderError();\n }\n return children(sailing, sailings, showOrders);\n }\n\n private onBookingDetailsChanged = (): Promise<SailingApiResponse> => {\n return this.fetchSailing();\n }\n\n private fetchInitialData = () => {\n return this.fetchData().then(results => {\n const { sailing, sailings, showOrders } = results;\n sailingNotificationService.notify(sailing);\n this.setState({\n pending: false,\n sailing,\n sailings,\n showOrders\n }, this.props.onLoaded);\n }).catch(e => {\n this.setState({\n pending: false,\n sailing: null,\n sailings: null\n });\n // tslint:disable-next-line:no-console\n console.log(e);\n });\n }\n\n private fetchData = (): Promise<PageDataApiResponse> => {\n const pathname = window.location.pathname;\n const route =\n pathname === '/booked/details' ? 'details'\n : pathname === '/booked/planner' ? 'planner'\n : null;\n\n const showOrders = getInitialData<boolean>(\"showOrders\") || false;\n\n if (route && !getInitialData('sailing')) {\n const { sailDate, shipCode } = this.getSailingParams();\n return cclFetch<PageDataApiResponse>(`/booked/api/v1.0/app/${route}?shipCode=${encodeURIComponent(shipCode)}&sailDate=${encodeURIComponent(sailDate)}`).then(results => {\n results.showOrders = showOrders;\n populateInitialData(results);\n return results;\n });\n }\n\n return Promise.all([\n this.fetchSailingData(),\n this.fetchSailingsData(),\n ]).then<PageDataApiResponse>(results => {\n const [sailing, sailings] = results;\n return { sailing, sailings, showOrders };\n });\n };\n\n private fetchSailingData = (): Promise<SailingApiResponse> => {\n const sailingInitialData = getInitialData<SailingApiResponse>(\"sailing\");\n if (sailingInitialData) {\n return Promise.resolve(sailingInitialData)\n }\n\n const { sailDate, shipCode } = this.getSailingParams();\n\n const sailingUrl = `/booked/api/v1.0/Bookings/Sailing?shipCode=${encodeURIComponent(shipCode)}&sailDate=${encodeURIComponent(sailDate)}`;\n return cclFetch<SailingApiResponse>(sailingUrl);\n }\n\n private getSailingParams(): { sailDate: string; shipCode: string; } {\n let sailDate = '';\n let shipCode = '';\n if (window['bookedContext']) {\n sailDate = window['bookedContext'].sailDate;\n shipCode = window['bookedContext'].shipCode;\n } else {\n const qs = parse();\n sailDate = qs.sailDate || qs.SailDate;\n shipCode = qs.shipCode || qs.ShipCode;\n }\n return { sailDate, shipCode };\n }\n\n isBookedContextPresent(): boolean {\n return 'bookedContext' in window;\n }\n\n private fetchSailingsData = (): Promise<SailingsApiResponse> => {\n const sailingsInitialData = getInitialData<SailingsApiResponse>('sailings');\n if (sailingsInitialData) {\n return Promise.resolve(sailingsInitialData)\n }\n const sailingsUrl = '/booked/api/v1.0/Bookings/Sailings';\n return cclFetch<SailingsApiResponse>(sailingsUrl);\n }\n\n private fetchSailing = () => {\n const { sailDate, shipCode } = this.getSailingParams();\n const sailingUrl = `/booked/api/v1.0/Bookings/Sailing?shipCode=${encodeURIComponent(shipCode)}&sailDate=${encodeURIComponent(sailDate)}`;\n return cclFetch<SailingApiResponse>(sailingUrl)\n .then(sailing => {\n this.setState({\n pending: false,\n sailing,\n });\n\n return sailing;\n });\n }\n}\n","export type ParsedQuerystring = {\n [name: string]: string;\n};\n\nexport function parse(): ParsedQuerystring {\n if (!window.location.search) {\n return {};\n }\n\n const hash: ParsedQuerystring = {};\n window.location.search.substring(1).split('&').map(n => n.split('=')).forEach(kv => {\n hash[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n });\n\n return hash;\n}\n\nexport function mergeQueryStrings(url: string): ParsedQuerystring | null {\n if (!url) {\n return null;\n }\n\n const urlParams = url.indexOf('?') === -1 ? '' : url.split('?')[1];\n\n const hash: ParsedQuerystring = {};\n if (urlParams) {\n urlParams.split('&').map(n => n.split('=')).forEach(kv => {\n hash[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n });\n }\n\n if (window.location.search) {\n window.location.search.substring(1).split('&').map(n => n.split('=')).forEach(kv => {\n // avoid overrides. predefined qs in url have priority over the window's\n if (!hash[kv[0]]) {\n hash[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n }\n });\n }\n\n return Object.keys(hash).length > 0 ? hash : null;\n}\n\nexport type DetailsParams = {\n shipCode: string;\n sailDate: string;\n bookingNumber?: string;\n op?: 'bedding' | 'dining' | 'guests' | 'invoice' | 'orders';\n seqNumber?: string;\n};\n\nexport function getDetailsParams(): DetailsParams {\n return parse() as DetailsParams;\n}","import { cclFetch } from 'ccl-utilities';\n\ninterface CacheEntry {\n timestamp: number;\n // tslint:disable-next-line:no-any\n promise: Promise<any>;\n}\n\ninterface Cache {\n [key: string]: CacheEntry;\n}\n\nconst cache: Cache = {};\n\nexport function getOrFetch<Response>(input: RequestInfo, init?: RequestInit): Promise<Response> {\n if (typeof input !== 'string') {\n return cclFetch<Response>(input, init);\n }\n const key = input;\n if (!cache[key] || ((Date.now() - cache[key].timestamp) / 1000) > 60) {\n cache[key] = {\n timestamp: Date.now(),\n promise: cclFetch<Response>(input, init),\n };\n }\n return cache[key].promise;\n}\n","export function getInitialData<T>(key: string): T | undefined {\n if ('initialData' in window) {\n // tslint:disable-next-line:no-string-literal no-any\n const initialData = (window as any)['initialData'];\n if (initialData) {\n const data = initialData[key];\n if (data) {\n return data as T;\n }\n }\n }\n return undefined;\n}\n\nexport function populateInitialData(data: { [key: string]: {} }) {\n for (const propName in data) {\n if (data.hasOwnProperty(propName)) {\n setInitialData(propName, data[propName]);\n }\n }\n}\n\nfunction setInitialData(key: string, value: {}) {\n // tslint:disable:no-string-literal\n // tslint:disable-next-line:no-any\n let initialData = (window as any)['initialData'];\n if (!initialData) {\n // tslint:disable-next-line:no-any\n initialData = (window as any)['initialData'] = {};\n }\n initialData[key] = value;\n}","import * as React from 'react';\nimport { SailingApiResponse } from \"../../lib/src/common/api-models\";\nimport { getForm, submit } from './form-service';\nimport { parse } from '../../lib/src/common/querystring';\nimport { ReservationFormContentProps, ReservationForm, ReservationFormData, SubmissionStatus } from 'cclr-huge-ui';\nimport { Splashscreen } from '../splashscreen/splashscreen';\nimport './form-container.scss';\nexport interface FormContainerProps {\n sailing: SailingApiResponse | null;\n bubbleNotification: boolean;\n}\n\nexport type FormContainerState = {\n data: ReservationFormContentProps | null;\n submissionStatus: SubmissionStatus;\n}\n\nexport class FormContainer extends React.PureComponent<FormContainerProps, FormContainerState> {\n\n state: FormContainerState = {\n data: null,\n submissionStatus: 'none',\n };\n\n componentDidMount() {\n var qs = parse();\n const { sailing } = this.props;\n const shipCode = sailing ? sailing.itinerary.shipCode : null;\n const sailDate = sailing ? sailing.itinerary.sailDate : null;\n getForm(qs['formId'], shipCode, sailDate).then(data => {\n document.title = data.formName + document.title;\n this.setState({ data: data });\n });\n }\n\n public render() {\n const { data, submissionStatus } = this.state;\n if (!data) {\n return(\n <div className=\"h-form-splash\">\n <Splashscreen />\n </div>\n );\n }\n\n return (\n <ReservationForm\n content={data}\n onSubmit={this.onSubmit}\n submissionStatus={submissionStatus}\n onNotificationClosed={this.onNotificationClosed}\n />\n );\n }\n onNotificationClosed = () => {\n this.setState({submissionStatus: 'none'});\n }\n\n onSubmit = (formData: ReservationFormData) => {\n const qs = parse();\n const formId = qs['formId'];\n const { sailing, bubbleNotification } = this.props;\n const shipCode = sailing ? encodeURIComponent(sailing.itinerary.shipCode) : null;\n const sailDate = sailing ? encodeURIComponent(sailing.itinerary.sailDate) : null;\n let conf =this.state.data!.formName.replace(/[^a-zA-Z0-9]/g, '');\n conf = conf.charAt(0).toLowerCase() + conf.slice(1);\n conf = encodeURIComponent(conf + 'Form');\n\n submit(formId, formData)\n .then(_ => {\n if (sailing && bubbleNotification) {\n window.location.href = `/booked/home?shipCode=${shipCode}&sailDate=${sailDate}&confirmation=${conf}`;\n }\n this.notifyIfNeeded('success', bubbleNotification);\n }).catch(_ => {\n this.notifyIfNeeded('error', bubbleNotification);\n });\n }\n\n notifyIfNeeded = (status: SubmissionStatus, bubbleNotification: boolean) => {\n if (!bubbleNotification) {\n this.setState({submissionStatus: status});\n window.scroll({top: 0, behavior: 'smooth'});\n }\n }\n}\n","import { getOrFetch } from \"../../lib/src/common/network-cache\";\nimport { ReservationFormContentProps, ReservationFormData } from \"cclr-huge-ui\";\nimport { cclFetch } from \"ccl-utilities\";\n\nexport function getForm(formId: string, shipCode: string | null, sailDate: string | null): Promise<ReservationFormContentProps> {\n let url = null;\n if (shipCode && sailDate) {\n url = `/booked/api/v1.0/forms?shipCode=${encodeURIComponent(shipCode)}&sailDate=${encodeURIComponent(sailDate)}&formId=${encodeURIComponent(formId)}`;\n } else {\n url = `/booked/api/v1.0/forms?formId=${encodeURIComponent(formId)}`; // browse mode\n }\n return getOrFetch<ReservationFormContentProps>(url);\n}\n\nexport function submit(formId: string, formData: ReservationFormData): Promise<{}> {\n\n var params = [];\n for (const propName in formData) {\n params.push({ name: propName, value: formData[propName] });\n }\n\n return cclFetch('/booked/api/v1.0/forms', {\n method: 'POST',\n headers: new Headers({\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }),\n body: JSON.stringify({\n formId: formId,\n fields: params\n })\n });\n}","import * as React from 'react';\nimport { RouteComponentProps } from '@reach/router';\nimport { QuerystringSailingProvider } from '../../components/sailing-provider/querystring-sailing-provider';\nimport { SailingsApiResponse, SkipNav } from 'cclr-huge-ui';\nimport { BookedNavContainer } from '../../components/booked-nav/booked-nav-container';\nimport { SailingApiResponse } from '../../lib/src/common/api-models';\nimport { FooterContainer } from '../../components/footer/footer-container';\nimport { Splashscreen } from '../../components/splashscreen/splashscreen';\nimport { BlueScreen } from '../../components/blue-screen/blue-screen';\nimport { FormContainer } from '../../components/form/form-container';\nimport { parse } from '../../lib/src/common/querystring';\n\nimport './form.scss';\n\nexport interface FormProps extends RouteComponentProps {\n includeHeaderAndFooter: boolean;\n}\n\nexport default class Form extends React.Component<FormProps> {\n\n public render() {\n const {sailDate, shipCode} = this.getSailingParams();\n if (sailDate && shipCode) {\n return this.renderBuyMode();\n }\n return this.renderBrowseMode();\n }\n\n private renderBuyMode() {\n return (\n <QuerystringSailingProvider renderLoading={() => <Splashscreen />} renderError={() => <BlueScreen />}>\n {(sailing: SailingApiResponse, sailings: SailingsApiResponse) => (\n <>\n {this.props.includeHeaderAndFooter && <SkipNav\n text=\"Skip to main content\"\n targetDomId=\"hero-header\"\n id=\"skip-nav\"\n />}\n {this.props.includeHeaderAndFooter && <BookedNavContainer sailing={sailing} sailings={sailings} />}\n <main className=\"h-main-container\">\n <FormContainer sailing={sailing} bubbleNotification={this.props.includeHeaderAndFooter}/>\n </main>\n {this.props.includeHeaderAndFooter && <FooterContainer sailing={sailing} />}\n </>\n )}\n </QuerystringSailingProvider>\n );\n }\n\n private renderBrowseMode() { // show notification on form\n return (\n <main className=\"h-main-container\">\n <FormContainer sailing={null} bubbleNotification={false} />\n </main>\n );\n }\n\n private getSailingParams(): { sailDate: string; shipCode: string; } {\n let sailDate = '';\n let shipCode = '';\n if (!!window['bookedContext']) {\n sailDate = window['bookedContext'].sailDate;\n shipCode = window['bookedContext'].shipCode;\n } else {\n const qs = parse();\n sailDate = qs.sailDate || qs.SailDate;\n shipCode = qs.shipCode || qs.ShipCode;\n }\n return { sailDate, shipCode };\n }\n}\n","import { Field, Item, Image, Fields } from 'cclr-huge-ui/dist/src/models/sitecore';\n\n // tslint:disable-next-line\n export interface IContentValue {\n [key: string]: string | number | boolean | Image | IContentValue | IContentValue[] | null | undefined;\n}\n\nexport class ContentParser {\n\n public mapContent(item: Item): IContentValue {\n const target = {\n children: this.mapItems(item.children),\n ...this.mapFields(item.fields)\n };\n return target;\n }\n\n private parseField(field: Field): IContentValue | string | number | boolean | Image | IContentValue[] | null | undefined {\n\n if (!field) {\n return null;\n }\n let target: IContentValue | string | number | boolean | Image | IContentValue[] | null = {};\n\n if (!field.value) {\n target = null;\n } else if (field.value.hasOwnProperty('templateId')) {\n target = this.mapItem(field.value as Item);\n } else if (Array.isArray(field.value)) {\n const values: IContentValue[] = [];\n field.value.forEach(value => {\n const mappedSubItem = this.mapItem(value);\n if (mappedSubItem) {\n values.push(mappedSubItem);\n }\n });\n target = values;\n } else {\n target = field.value;\n }\n return target;\n }\n\n private mapFields(fields: Fields) {\n const targetFields: IContentValue = {};\n if (fields) {\n Object.keys(fields).forEach((key) => {\n const fieldValue = fields[key];\n targetFields[key] = this.parseField(fieldValue);\n });\n }\n return targetFields;\n }\n\n private mapItems(items: Item[] | undefined): IContentValue[] {\n if (!items) {\n return [];\n }\n const contentItems: IContentValue[] = [];\n items.forEach(subItem => {\n const mappedSubItem = this.mapItem(subItem);\n if (mappedSubItem) {\n contentItems.push(mappedSubItem);\n }\n });\n return contentItems;\n }\n\n private mapItem(item: Item): IContentValue | null {\n if (!item) {\n return null;\n }\n const target = this.mapFields(item.fields);\n\n if (item!.children! && target.hasOwnProperty('children') !== undefined ) {\n target.children = this.mapItems(item!.children!);\n }\n return target;\n }\n}\n\nexport function parseContent<T>(item: Item): T {\n let converter = new ContentParser();\n let content = converter.mapContent(item);\n // tslint:disable-next-line:no-any\n return (content as any) as T;\n}\n","\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { SailingApiResponse } from './api-models';\n\nclass SailingNotificationService {\n\n constructor() {\n this.sailingApiSubject.subscribe(value => this.currentSailing = value);\n this.sailingObservable = this.sailingApiSubject.asObservable();\n }\n\n private sailingApiSubject = new BehaviorSubject<SailingApiResponse | null>(null);\n public currentSailing: SailingApiResponse | null = null;\n public sailingObservable: Observable<SailingApiResponse | null>;\n\n public notify(sailing: SailingApiResponse) {\n this.sailingApiSubject.next(sailing);\n }\n}\n\nexport const sailingNotificationService = new SailingNotificationService();\n","import * as React from 'react';\nimport { BookedNav, Item, BookedNavData, SailingsApiResponse } from 'cclr-huge-ui';\nimport { AccessBookingContainer } from '../access-booking/access-booking-container';\nimport { SailingApiResponse } from '../../lib/src/common/api-models';\nimport * as profile from '../../common/profile';\nimport { getRawContent } from '../../lib/src/common/content-service';\n\nexport interface BookedNavContainerProps {\n sailing: SailingApiResponse;\n sailings?: SailingsApiResponse;\n}\n\ninterface BookedNavContainerState {\n content: Item | null;\n}\n\nexport class BookedNavContainer extends React.Component<BookedNavContainerProps, BookedNavContainerState> {\n\n private navRef: React.RefObject<BookedNav> = React.createRef();\n\n state: BookedNavContainerState = {\n content: null,\n };\n\n componentDidMount() {\n this.fetchContent().then(content => this.setState({ content }));\n }\n\n public render() {\n const { content } = this.state;\n if (!content) {\n return null;\n }\n\n const data = this.getData();\n return (\n <BookedNav\n ref={this.navRef}\n item={content}\n fullMediaQuery=\"(min-width:768px)\"\n data={{\n ...data,\n accessBooking: this.accessBooking\n }}\n />\n );\n }\n\n private accessBooking = (onOpening: () => void, onClosed: () => void) => (\n <AccessBookingContainer\n onOpening={onOpening}\n onClosed={onClosed}\n />\n )\n\n private getData(): BookedNavData {\n const { sailings, sailing } = this.props;\n\n const guestName = profile.getAuthenticatedUserFullName();\n\n const data: BookedNavData = {\n activeRoute: window.location.pathname,\n activeSailing: sailing,\n fullName: guestName,\n idPrefix: 'b-',\n isAuthenticated: !!guestName,\n sailingData: sailings\n };\n return data;\n }\n\n private fetchContent = (): Promise<Item> => {\n return getRawContent('709b6ef9-5941-4ef7-9c47-49d5466a0fd5');\n }\n}\n","// Brought from https://github.com/js-cookie/js-cookie\n// and modified to play nice with typescript and webpack\n\nfunction decode (s: string) {\n return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n}\n\nexport interface CookieAttributes {\n path?: string;\n expires?: number | Date | string;\n domain?: string;\n secure?: boolean;\n}\n\nexport function set (key: string, value: string, attributes: CookieAttributes) {\n if (typeof document === 'undefined') {\n return;\n }\n\n attributes = { path: '/', ...attributes };\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(new Date().getTime() + attributes.expires * 864e+5);\n }\n\n // We're using \"expires\" because \"max-age\" is not supported by IE\n attributes.expires = attributes.expires ? (attributes.expires as Date).toUTCString() : '';\n\n try {\n const result = JSON.stringify(value);\n // eslint-disable-next-line no-useless-escape\n if (/^[\\{\\[]/.test(result)) {\n value = result;\n }\n // tslint:disable-next-line:no-empty\n } catch (e) {}\n\n value =\n encodeURIComponent(String(value))\n .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n // eslint-disable-next-line no-useless-escape\n key = encodeURIComponent(String(key)).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent).replace(/[\\(\\)]/g, escape);\n\n let stringifiedAttributes = '';\n for (const attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue;\n }\n stringifiedAttributes += '; ' + attributeName;\n if (attributes[attributeName] === true) {\n continue;\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie = key + '=' + value + stringifiedAttributes);\n}\n\nfunction getHelper (key: string, json: boolean) {\n if (typeof document === 'undefined') {\n return;\n }\n\n const jar = {};\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n const cookies = document.cookie ? document.cookie.split('; ') : [];\n let i = 0;\n\n for (; i < cookies.length; i++) {\n const parts = cookies[i].split('=');\n let cookie = parts.slice(1).join('=');\n\n if (!json && cookie.charAt(0) === '\"') {\n cookie = cookie.slice(1, -1);\n }\n\n try {\n const name = decode(parts[0]);\n cookie = decode(cookie);\n\n if (json) {\n try {\n cookie = JSON.parse(cookie);\n // tslint:disable-next-line:no-empty\n } catch (e) {}\n }\n\n jar[name] = cookie;\n\n if (key === name) {\n break;\n }\n // tslint:disable-next-line:no-empty\n } catch (e) {}\n }\n\n return key ? jar[key] : jar;\n}\n\nexport function get(key: string): string {\n return getHelper(key, false /* read as raw */);\n}\nexport function getJSON<T>(key: string): T | undefined {\n return getHelper(key, true /* read as json */) as T;\n}\nexport function remove(key: string, attributes: CookieAttributes) {\n set(key, '', {...attributes, expires: -1 });\n}\n","import * as cookies from './cookies';\n\nexport interface CclUser {\n FirstName: string;\n LastName: string;\n Email: string;\n PastGuestNumber: string;\n TierCode: string;\n CarnivalUser: string;\n}\n\nexport interface CclSession {\n BookingNumber: string;\n SailDate: string;\n VifpNumberOfDays: string;\n TierCode: string;\n IsAuthenticated: boolean;\n}\n\nexport function getCclSessionCookieData() {\n return cookies.getJSON<CclSession>('cclSession');\n}\n\nexport function getCclUserCookieData() {\n return cookies.getJSON<CclUser>('cclUser');\n}\n","import { Guest } from 'cclr-huge-ui';\nimport { getCclUserCookieData, getCclSessionCookieData } from './ccl-cookies';\n\nexport function getAuthenticatedUserFullName(): string | undefined {\n const cclSession = getCclSessionCookieData();\n if (cclSession && cclSession.IsAuthenticated) {\n const cclUser = getCclUserCookieData();\n if (cclUser) {\n const fullName = `${cclUser.FirstName} ${cclUser.LastName}`;\n return fullName;\n }\n }\n return undefined;\n}\n\nexport function getAuthenticatedUserFirstName(): string | undefined {\n const cclSession = getCclSessionCookieData();\n if (cclSession && cclSession.IsAuthenticated) {\n const cclUser = getCclUserCookieData();\n if (cclUser) {\n return cclUser.FirstName;\n }\n }\n return undefined;\n}\n\nexport function getAuthenticatedGuest(): Guest | null {\n const cclSession = getCclSessionCookieData();\n if (cclSession && cclSession.IsAuthenticated) {\n const cclUser = getCclUserCookieData();\n if (cclUser == null)\n return null;\n return {\n firstName: cclUser.FirstName,\n lastName: cclUser.LastName,\n bookingNumber: cclSession.BookingNumber,\n };\n }\n\n return null;\n}","import * as React from 'react';\nimport { BookedFooter, Item, HubAppDownloadProps } from 'cclr-huge-ui';\nimport { SailingApiResponse } from '../../lib/src/common/api-models';\nimport { getContent, getRawContent } from '../../lib/src/common/content-service';\n\nexport interface FooterContainerProps {\n sailing: SailingApiResponse;\n}\n\ninterface FooterContainerState {\n content: Item | null;\n hubApp: HubAppDownloadProps | null;\n}\n\nexport class FooterContainer extends React.Component<FooterContainerProps, FooterContainerState> {\n\n state: FooterContainerState = {\n content: null,\n hubApp: null\n };\n\n componentDidMount() {\n Promise.all([\n getRawContent('8A889B74-974A-4E4C-84E9-29061EF61172'),\n getContent<HubAppDownloadProps>('1A2AD5F5-08AA-48BA-941B-A55C187C6022')\n ]).then(result => {\n const [content, hubApp] = result;\n this.setState({ content, hubApp });\n })\n }\n\n public render() {\n const { content, hubApp } = this.state;\n if (!content || !hubApp) {\n return null;\n }\n\n return (\n <BookedFooter\n item={content}\n hubApp={hubApp}\n activeSailing={this.props.sailing}\n />\n );\n }\n}\n"],"names":["AccessBookingContainer","React","constructor","arguments","state","content","onSailingToSelect","fromBookingNumber","this","redirectToBooking","encodeURIComponent","submitSearch","bookings","opts","method","headers","Headers","body","JSON","stringify","cclFetch","catch","error","code","innerError","data","addBookings","then","n","setTimeout","isOrganizerAccess","window","location","pathname","toLowerCase","indexOf","localRoutes","access","bookingNumber","href","home","render","guestName","profile","props","mode","Modal","shell","isOpen","fullScreen","dialogDescription","heading","AccessBooking","onRequestClose","autoOpenModeCloseModal","onSubmit","onComplete","anonymousUser","AccessBookingModalTrigger","onOpening","onClosed","componentDidMount","getContent","setState","path","details","planner","BlueScreen","store","id","_sailingNotificationS","lang","sailingNotificationService","currentSailing","contentLanguageCode","storageKey","getInitialData","Promise","resolve","parseContent","url","getContentVersionParam","rawContent","rawStore","getRawContent","_sailingNotificationS2","hstElement","document","getElementById","contentVersion","getAttribute","hashElement","value","getContentHash","bookingDetailsObserver","registerBookingDetailsObserver","observer","getBookingDetails","getQuote","vpp","gratuities","qs","Array","prototype","push","apply","map","s","toString","undefined","join","invalidateBookingDetails","QuerystringSailingProvider","sailing","sailings","showOrders","pending","onBookingDetailsChanged","fetchSailing","fetchInitialData","fetchData","results","notify","onLoaded","e","console","log","route","sailDate","shipCode","getSailingParams","populateInitialData","all","fetchSailingData","fetchSailingsData","sailingInitialData","sailingUrl","sailingsInitialData","children","renderLoading","renderError","parse","SailDate","ShipCode","isBookedContextPresent","search","hash","substring","split","forEach","kv","decodeURIComponent","mergeQueryStrings","urlParams","Object","keys","length","getDetailsParams","cache","getOrFetch","input","init","key","Date","now","timestamp","promise","initialData","propName","hasOwnProperty","setInitialData","FormContainer","submissionStatus","onNotificationClosed","formData","formId","bubbleNotification","itinerary","conf","formName","replace","charAt","slice","params","name","fields","submit","_","notifyIfNeeded","status","scroll","top","behavior","getForm","title","ReservationForm","className","Splashscreen","Form","renderBuyMode","renderBrowseMode","includeHeaderAndFooter","SkipNav","text","targetDomId","BookedNavContainer","FooterContainer","ContentParser","mapContent","item","mapItems","mapFields","parseField","field","target","mapItem","isArray","values","mappedSubItem","targetFields","fieldValue","items","contentItems","subItem","sailingApiSubject","BehaviorSubject","sailingObservable","subscribe","asObservable","next","navRef","accessBooking","fetchContent","getData","BookedNav","ref","fullMediaQuery","activeRoute","activeSailing","fullName","idPrefix","isAuthenticated","sailingData","decode","getHelper","json","jar","cookies","cookie","i","parts","getJSON","getCclSessionCookieData","getCclUserCookieData","getAuthenticatedUserFullName","cclSession","IsAuthenticated","cclUser","FirstName","LastName","getAuthenticatedUserFirstName","getAuthenticatedGuest","firstName","lastName","BookingNumber","hubApp","result","BookedFooter"],"sourceRoot":""}