{"version":3,"file":"js/CaravanParkReservation.bundle.js","mappings":"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","sources":["webpack://rp-majoitus-client/./src/views/CaravanPark/CaravanParkReservation.js","webpack://rp-majoitus-client/./src/views/CaravanPark/index.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\n\nimport DatePicker from '../../components/DatePicker/DatePicker';\nimport NumberInput from 'Components/Form/Input/NumberInput/NumberInput';\nimport ErrorMessage from '../AccommodationSearch/components/ErrorMessage';\n\nconst CaravanParkReservation = () => {\n const seasons = drupalSettings.caravan_park_seasons;\n const today = new Date();\n today.setUTCHours(0, 0, 0, 0);\n\n const [isLoading, setIsLoading] = useState(true);\n\n const [startDate, setStartDate] = useState();\n const [endDate, setEndDate] = useState();\n\n const [people, setPeople] = useState(1);\n const [isMember, setIsMember] = useState(false);\n\n const [dateSelectionType, setDateSelectionType] = useState(\n drupalSettings.show_seasonal_tab_by_default ? 'season' : 'day'\n );\n\n const [selectedSeason, setSelectedSeason] = useState('default');\n const [dayAvailabilities, setDayAvailabilities] = useState();\n const [availableDates, setAvailableDates] = useState();\n const [minimalDates, setMinimalDates] = useState([]);\n\n const [seasonAvailabilities, setSeasonAvailabilities] = useState();\n const [sites, setSites] = useState([]);\n // Site is a room in Hlx. In day booking, it's selected randomly.\n // In season booking the user can select it. \"Empty\" value should be 'default'.\n const [selectedSite, setSelectedSite] = useState('default');\n const [storageOnlyBooking, setStorageOnlyBooking] = useState(false);\n\n const [vehicleNumber, setVehicleNumber] = useState();\n const [memberNumber, setMemberNumber] = useState();\n\n const [price, setPrice] = useState();\n const [product, setProduct] = useState();\n const [addingtoCart, setAddingToCart] = useState(false);\n\n const [redirect, setRedirect] = useState();\n\n const [errorMessage, setErrorMessage] = useState();\n const [availabilityErrorMessage, setAvailabilityErrorMessage] = useState(\n drupalSettings.custom_not_available_message\n );\n\n const [extraServices, setExtraServices] = useState(\n drupalSettings.accommodation_extra_services[dateSelectionType] ?? []\n );\n const [selectedExtras, setSelectedExtras] = useState([]);\n\n const calendarInfo = (\n <>\n
\n
\n
\n \n {Drupal.t('Available date')}\n
\n
\n \n {Drupal.t('Booked')}\n
\n
\n \n {Drupal.t('Limited availability')}\n
\n
\n \n );\n\n useEffect(() => {\n async function getRoomAvailabilities() {\n // If there are no seasons configured, booking can't be done.\n if (!seasons) {\n setErrorMessage(Drupal.t(\"Bookings can't be made at the moment.\"));\n return;\n }\n\n const searchStart = new Date();\n const searchEnd = seasons[seasons.length - 1].endDate;\n const url = `${process.env.IPS_API_URL}/api/roomavailabilities?resort=${\n drupalSettings.active_site\n }&startDate=${\n searchStart.toISOString().split('T')[0]\n }&endDate=${searchEnd}`;\n\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n\n const dayAvailabilityData = data.result\n .map((accommodation) => {\n if (\n accommodation.roomTypeId ===\n parseInt(drupalSettings.hotellinx_ids.day)\n ) {\n return accommodation;\n }\n })\n .filter((accommodation) => accommodation !== undefined);\n\n setDayAvailabilities(dayAvailabilityData);\n\n // List of dates with availability for each day.\n const availabilityPerDay = {};\n dayAvailabilityData.forEach((dayAvailability) => {\n dayAvailability.availability.forEach((day) => {\n const dateString = day.date.split('T')[0];\n if (day.isAvailable) {\n availabilityPerDay[dateString] = availabilityPerDay[dateString]\n ? availabilityPerDay[dateString] + 1\n : 1;\n } else {\n if (!availabilityPerDay[dateString]) {\n availabilityPerDay[dateString] = 0;\n }\n }\n });\n });\n setAvailableDates(availabilityPerDay);\n\n const minimal = Object.keys(availabilityPerDay)\n .map((day) => {\n if (\n availabilityPerDay[day] !== 0 &&\n availabilityPerDay[day] <= drupalSettings.hotellinx_buffers.day\n ) {\n return day;\n }\n })\n .filter((date) => date !== undefined);\n setMinimalDates(minimal);\n\n const seasonAvailabilityData = data.result\n .map((accommodation) => {\n if (\n accommodation.roomTypeId ===\n parseInt(drupalSettings.hotellinx_ids.season)\n ) {\n return accommodation;\n }\n })\n .filter((accommodation) => accommodation !== undefined);\n setSeasonAvailabilities(seasonAvailabilityData);\n } else {\n setAvailabilityErrorMessage(\n Drupal.t(\n 'There was an error fetching availabilities. Please refresh the page and try again.'\n )\n );\n }\n } catch (error) {\n setAvailabilityErrorMessage(\n Drupal.t(\n 'There was an error fetching availabilities. Please refresh the page and try again.'\n )\n );\n console.log(error);\n }\n\n setIsLoading(false);\n }\n\n getRoomAvailabilities();\n }, []);\n\n // Find available sites for the season.\n useEffect(() => {\n setErrorMessage(null);\n\n if (!selectedSeason || selectedSeason === 'default') {\n return;\n }\n\n const seasonData = getSelectedSeasonData();\n const availableSites = getAvailableSites(\n seasonData.startDate,\n seasonData.endDate,\n seasonAvailabilities\n );\n\n if (availableSites.length > drupalSettings.hotellinx_buffers.season) {\n setSites(availableSites);\n } else {\n setErrorMessage(drupalSettings.caravan_park_limited_availability_message);\n setSites([]);\n }\n }, [selectedSeason]);\n\n // Pick an available site for the selected period.\n useEffect(() => {\n async function fetchAvailability() {\n setIsLoading(true);\n\n let availableSites = getAvailableSites(\n startDate,\n endDate,\n dayAvailabilities\n );\n\n let site = null;\n // Randomize the order of rooms. Then check the room's\n // availability, until one available room is found, and set it\n // as the selected room.\n availableSites.sort(() => Math.random() - 0.5);\n for (const availableSite of availableSites) {\n const isAvailable = await checkRoomAvailability(availableSite.roomId);\n if (isAvailable) {\n site = availableSite.roomId;\n break;\n }\n }\n if (site) {\n setSelectedSite(site.toString());\n } else {\n setErrorMessage(\n Drupal.t(\n 'No sites available for the selected date. Please select another date and try again.'\n )\n );\n }\n setIsLoading(false);\n }\n\n setSelectedSite('default');\n setPrice(null);\n setErrorMessage(null);\n if (startDate && endDate && dayAvailabilities) {\n if (includesMinimalDates(startDate, endDate)) {\n setErrorMessage(\n drupalSettings.caravan_park_limited_availability_message\n );\n return;\n }\n\n if (\n dailyBookingIsWithinOneSeason(\n new Date(startDate).setHours(15, 0, 0),\n new Date(endDate).setHours(15, 0, 0)\n )\n ) {\n fetchAvailability();\n } else {\n setErrorMessage(drupalSettings.caravan_cross_season_message);\n }\n }\n }, [startDate, endDate, dayAvailabilities]);\n\n // Check that the daily reservation booking fits within only one season.\n function dailyBookingIsWithinOneSeason(bookingStart, bookingEnd) {\n return seasons.some((season) => {\n const seasonStart = new Date(season.startDate).setHours(0, 0, 0);\n const seasonEnd = new Date(season.endDate).setHours(23, 59, 59);\n\n if (\n bookingStart >= seasonStart &&\n bookingStart <= seasonEnd &&\n bookingEnd >= seasonStart &&\n bookingEnd <= seasonEnd\n ) {\n return true;\n }\n });\n }\n\n /**\n * Check if the stay includes any dates\n * with minimal booking availability.\n */\n function includesMinimalDates(bookingStart, bookingEnd) {\n let currentDate = new Date(bookingStart);\n let currentDateFormatted = formatDate(currentDate);\n const end = formatDate(new Date(bookingEnd));\n\n while (currentDateFormatted !== end) {\n if (minimalDates.includes(currentDateFormatted)) {\n return true;\n }\n\n currentDate.setDate(currentDate.getDate() + 1);\n currentDateFormatted = formatDate(currentDate);\n }\n\n return false;\n }\n\n function getAvailableSites(start, end, data) {\n // Seasonal reservations may have their start date in the past,\n // but since it doesn't make sense to check availability for past\n // dates, setting the start date to current date.\n let searchStartDate = new Date(start);\n if (today.getTime() > new Date(start).getTime()) {\n searchStartDate = new Date();\n }\n\n const availableSites = data\n .map((room) => {\n const startIndex = room.availability.findIndex(\n (availability) =>\n new Date(availability.date).toDateString() ===\n searchStartDate.toDateString()\n );\n const endIndex = room.availability.findIndex(\n (availability) =>\n new Date(availability.date).toDateString() ===\n new Date(end).toDateString()\n );\n\n for (let i = startIndex; i < endIndex; i++) {\n if (!room.availability[i].isAvailable) {\n return;\n }\n }\n\n const { roomId, roomNumber, roomTypeId } = room;\n return { roomId, roomNumber, roomTypeId };\n })\n .filter((room) => room && room !== undefined && room.roomNumber)\n .sort((a, b) => a.roomNumber - b.roomNumber);\n\n return availableSites;\n }\n\n function selectSeason(e) {\n setSelectedSite('default');\n setSites([]);\n setStartDate(null);\n setEndDate(null);\n setPrice(null);\n setSelectedSeason(e.target.value);\n setStorageOnlyBooking(false);\n }\n\n useEffect(() => {\n if (startDate) {\n setSelectedSeason('default');\n }\n }, [startDate]);\n\n function formatDate(date) {\n const offset = date.getTimezoneOffset();\n const formattedDate = new Date(date.getTime() - offset * 60 * 1000);\n return formattedDate.toISOString().split('T')[0];\n }\n\n async function checkRoomAvailability(roomId) {\n let searchStartDate;\n let searchEndDate;\n\n if (dateSelectionType === 'day') {\n searchStartDate = formatDate(startDate);\n searchEndDate = formatDate(endDate);\n } else {\n const seasonData = getSelectedSeasonData();\n if (new Date(seasonData.startDate) > today) {\n searchStartDate = seasonData.startDate;\n } else {\n searchStartDate = today.toISOString().split('T')[0];\n }\n searchEndDate = seasonData.endDate;\n }\n\n const url = `${process.env.IPS_API_URL}/api/singleroomavailability?startDate=${searchStartDate}&endDate=${searchEndDate}&roomId=${roomId}`;\n\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n\n data.result.forEach((day) => {\n if (!day.isAvailable) {\n return false;\n }\n });\n\n return true;\n }\n } catch (error) {\n console.log(error);\n }\n }\n\n useEffect(() => {\n async function getPrice() {\n setPrice(null);\n setIsLoading(true);\n\n let id;\n let searchStartDate;\n let searchEndDate;\n let campaignCode = null;\n // We make the assumption that either there can be a SF discount (because it's for daily reservations)\n // or a storage only option (because it's for seasonal reservations)\n if (isMember) {\n campaignCode = `campaignCode=${drupalSettings.sf_member_code}`;\n } else if (storageOnlyBooking) {\n campaignCode = `campaignCode=${drupalSettings.caravan_park_storage_only_booking_code}`;\n }\n\n if (dateSelectionType === 'day') {\n searchStartDate = formatDate(startDate);\n searchEndDate = formatDate(endDate);\n id = drupalSettings.hotellinx_ids.day;\n } else {\n const seasonData = getSelectedSeasonData();\n if (new Date(seasonData.startDate) > today) {\n searchStartDate = seasonData.startDate;\n } else {\n searchStartDate = today.toISOString().split('T')[0];\n }\n searchEndDate = seasonData.endDate;\n id = drupalSettings.hotellinx_ids.season;\n }\n\n const url = `${process.env.IPS_API_URL}/api/accommodations?resort=${drupalSettings.active_site}&roomTypeIds=${id}&adults=1&startDate=${searchStartDate}&endDate=${searchEndDate}&${campaignCode}`;\n\n try {\n const response = await fetch(url);\n const data = await response.json();\n\n if (response.ok) {\n data.result.sort((a, b) => a.price - b.price);\n if (data.result[0].price) {\n setProduct(data.result[0]);\n }\n } else {\n switch (response.status) {\n case 453:\n setErrorMessage(\n Drupal.t(\n 'No availability for this period. Please consider a different room type.'\n )\n );\n break;\n case 455: {\n // Reservation length exceeds the maximum.\n setErrorMessage(drupalSettings.reservation_length_error_message);\n break;\n }\n case 456:\n case 457: {\n // Reservation contains days that can't be booked online.\n setErrorMessage(\n drupalSettings.caravan_park_limited_availability_message\n );\n break;\n }\n\n default:\n setErrorMessage(data.error);\n }\n }\n } catch (error) {\n console.log(error);\n setErrorMessage(\n Drupal.t(\n 'There was an error checking availability. Please refresh the page and try again'\n )\n );\n }\n setIsLoading(false);\n }\n\n async function checkSeasonRoomAvailability() {\n const roomIsAvailable = await checkRoomAvailability(selectedSite);\n if (roomIsAvailable) {\n getPrice();\n } else {\n setErrorMessage(\n Drupal.t(\n \"The selected site isn't available for booking. Please select another site.\"\n )\n );\n }\n }\n\n if (selectedSite !== 'default') {\n if (dateSelectionType === 'day') {\n getPrice();\n } else {\n checkSeasonRoomAvailability();\n }\n }\n }, [selectedSite, isMember, storageOnlyBooking]);\n\n async function addToCart(event) {\n event.preventDefault();\n setErrorMessage(null);\n setAddingToCart(true);\n\n if (!product) {\n return;\n }\n\n if (!vehicleNumber) {\n setErrorMessage(Drupal.t('Please set the vehicle registration number.'));\n setAddingToCart(false);\n return;\n }\n\n if (isMember && !memberNumber) {\n setErrorMessage(Drupal.t('Please set your SF-Caravan ry membership ID.'));\n setAddingToCart(false);\n return;\n }\n\n if (isMember && memberNumber.length < 4) {\n setErrorMessage(\n Drupal.t('The membership number should be at least 4 digits long.')\n );\n setAddingToCart(false);\n return;\n }\n\n let campaignCode = null;\n // We make the assumption that either there can be a SF discount (because it's for daily reservations)\n // or a storage only option (because it's for seasonal reservations)\n if (isMember) {\n campaignCode = drupalSettings.sf_member_code;\n } else if (storageOnlyBooking) {\n campaignCode = drupalSettings.caravan_park_storage_only_booking_code;\n }\n\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n\n body: JSON.stringify([\n {\n purchased_entity_type: 'commerce_product_variation',\n purchased_entity_id: product.variationId,\n quantity: '1',\n combine: false, // False will create another order item, while true will increment an existing item.\n campaignData: null,\n caravanParkData: {\n memberNumber,\n vehicleNumber,\n people,\n campaignCode,\n storageOnlyBooking,\n },\n },\n ]),\n };\n\n let searchStartDate;\n let searchEndDate;\n if (dateSelectionType === 'day') {\n searchStartDate = formatDate(startDate);\n searchEndDate = formatDate(endDate);\n } else {\n const seasonData = getSelectedSeasonData();\n if (new Date(seasonData.startDate) > today) {\n searchStartDate = seasonData.startDate;\n } else {\n searchStartDate = today.toISOString().split('T')[0];\n }\n searchEndDate = seasonData.endDate;\n }\n\n const response = await fetch(\n `${drupalSettings.base_url}/${drupalSettings.path.currentLanguage}/cart/\n\t\t\tadd?_format=json\n\t\t\t&adults=1&startDate=${searchStartDate}&endDate=${searchEndDate}\n\t\t\t&price=${product.price}\n\t\t\t&rateplanCode=${product.rateplanCode}\n\t\t\t&children=0&infants=0&pets=false\n\t\t\t&extraServices=${selectedExtras ? selectedExtras.toString() : ''}\n\t\t\t&roomId=${selectedSite}`,\n requestOptions\n );\n\n if (response.ok) {\n setRedirect(`/${drupalSettings.path.currentLanguage}/cart`);\n } else {\n setAddingToCart(false);\n setErrorMessage(\n Drupal.t(\n 'Error adding product to the cart. Please refresh the page and try again.'\n )\n );\n }\n }\n\n useEffect(() => {\n if (redirect) {\n window.location.replace(redirect);\n }\n }, [redirect]);\n\n function submitButtonText() {\n if (isLoading) {\n return Drupal.t('Loading');\n }\n\n let text = Drupal.t('Reserve site');\n if (price) {\n text += ` ${new Intl.NumberFormat('fi-FI', {\n style: 'currency',\n currency: 'EUR',\n }).format(parseFloat(price))}`;\n }\n\n return text;\n }\n\n function disableSubmit() {\n if (selectedSite === 'default' || isLoading || addingtoCart || !price) {\n return true;\n }\n\n return false;\n }\n\n function dayIsDisabled(date) {\n if (availableDates) {\n const dateString = formatDate(date);\n\n if (availableDates[dateString] === 0) {\n // User should be able to select a blocked date as a departure date,\n // if the previous day wasn't blocked.\n if (!startDate || startDate.getTime() > date.getTime()) {\n return true;\n }\n\n let yesterday = new Date(date);\n yesterday = new Date(yesterday.setUTCDate(date.getUTCDate() - 1));\n if (availableDates[formatDate(yesterday)] === 0) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n function checkAvailability(date) {\n if (availableDates) {\n const dateString = formatDate(date);\n if (!availableDates[dateString]) {\n return 'react-calendar__month-view__days__day--blocked';\n } else if (minimalDates.includes(dateString)) {\n return 'react-calendar__month-view__days__day--limited';\n }\n }\n return '';\n }\n\n function getSelectedSeasonData() {\n return seasons.find((season) => season.name === selectedSeason);\n }\n\n // Reset date and season data and price when tab is changed.\n function onTabChange(tab) {\n setDateSelectionType(tab);\n\n setSelectedExtras([]);\n setExtraServices(drupalSettings.accommodation_extra_services[tab] ?? []);\n setStartDate(null);\n setEndDate(null);\n setSelectedSite('default');\n setPrice(null);\n setSelectedSeason('default');\n setIsMember(false);\n setMemberNumber(null);\n setStorageOnlyBooking(false);\n }\n\n function onExtraServiceChange(e) {\n if (e.target.checked) {\n setSelectedExtras([...selectedExtras, e.target.value]);\n } else {\n const newExtras = selectedExtras.filter(\n (extra) => extra !== e.target.value\n );\n setSelectedExtras(newExtras);\n }\n }\n\n // Calculate the total price for the reservation.\n useEffect(() => {\n if (product) {\n let totalPrice = product.price;\n selectedExtras.forEach((extra) => {\n totalPrice += parseFloat(\n extraServices.find((extraService) => extraService.id === extra)\n .price ?? 0\n );\n });\n\n setPrice(totalPrice);\n }\n }, [selectedExtras, product]);\n\n return (\n \n
\n

\n 1. {Drupal.t('Date')}\n *\n

\n\n
\n onTabChange('day')}\n >\n {Drupal.t('Day or week')}\n \n onTabChange('season')}\n >\n {Drupal.t('Seasonal spots')}\n \n
\n\n {dateSelectionType === 'day' && (\n <>\n {Drupal.t('Select dates')}\n \n\n {availabilityErrorMessage && (\n \n )}\n \n )}\n\n {dateSelectionType === 'season' && (\n <>\n {Drupal.t('Summer and winter spots')}\n
\n \n \n {seasons\n .filter((season) => !season.disableSeasonBooking)\n .map((season, i) => (\n \n ))}\n \n
\n\n {selectedSeason !== 'default' &&\n !!getSelectedSeasonData()?.storageOnlyBooking && (\n \n setStorageOnlyBooking(e.target.checked)}\n />\n \n {Drupal.t('Book only for storage')}\n \n )}\n \n )}\n\n

2. {Drupal.t('Booking information')}

\n \n {Drupal.t('Number of people')}\n *\n \n

\n {Drupal.t(\n 'For security reasons, please state the number of people in the party'\n )}\n

\n \n\n \n {Drupal.t('Vehicle registration number')}\n *\n \n setVehicleNumber(e.target.value)}\n required={true}\n />\n\n {dateSelectionType === 'season' && (\n <>\n {Drupal.t('Caravan site')}\n

{Drupal.t('The available spots for the chosen date')}

\n \n {Drupal.t('Check the caravan park map')}\n \n
\n setSelectedSite(e.target.value)}\n name=\"select-site\"\n id=\"select-site\"\n className=\"form-item__select\"\n disabled={selectedSeason === 'default' || isLoading}\n value={selectedSite ?? 'default'}\n >\n \n {sites.map((site) => (\n \n ))}\n \n
\n \n )}\n\n {dateSelectionType === 'day' && (\n <>\n \n setIsMember(e.target.checked)}\n />\n \n {Drupal.t('I am SF-Caravan ry member')}\n \n\n {isMember && (\n setMemberNumber(e.target.value)}\n />\n )}\n \n )}\n\n {extraServices && extraServices.length > 0 && (\n <>\n

{Drupal.t('Extra services')}

\n\n
\n {extraServices.map((extraService) => (\n \n \n \n {extraService.name} (+{extraService.price}€)\n \n ))}\n
\n \n )}\n\n {errorMessage && }\n\n addToCart(e)}\n className={`button button--large-full-width ${\n disableSubmit() ? 'button--disabled' : ''\n }`}\n disabled={disableSubmit()}\n >\n {submitButtonText()}\n \n \n \n );\n};\n\nexport default CaravanParkReservation;\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\n\nimport CaravanParkReservation from './CaravanParkReservation';\n\nconst root = ReactDOM.createRoot(\n document.getElementById('caravan_park_reservation')\n);\n\nroot.render(\n \n \n \n);\n"],"names":["_drupalSettings$accom","_getSelectedSeasonDat","seasons","drupalSettings","caravan_park_seasons","today","Date","setUTCHours","_useState","useState","_useState2","_slicedToArray","isLoading","setIsLoading","_useState3","_useState4","startDate","setStartDate","_useState5","_useState6","endDate","setEndDate","_useState7","_useState8","people","setPeople","_useState9","_useState10","isMember","setIsMember","_useState11","show_seasonal_tab_by_default","_useState12","dateSelectionType","setDateSelectionType","_useState13","_useState14","selectedSeason","setSelectedSeason","_useState15","_useState16","dayAvailabilities","setDayAvailabilities","_useState17","_useState18","availableDates","setAvailableDates","_useState19","_useState20","minimalDates","setMinimalDates","_useState21","_useState22","seasonAvailabilities","setSeasonAvailabilities","_useState23","_useState24","sites","setSites","_useState25","_useState26","selectedSite","setSelectedSite","_useState27","_useState28","storageOnlyBooking","setStorageOnlyBooking","_useState29","_useState30","vehicleNumber","setVehicleNumber","_useState31","_useState32","memberNumber","setMemberNumber","_useState33","_useState34","price","setPrice","_useState35","_useState36","product","setProduct","_useState37","_useState38","addingtoCart","setAddingToCart","_useState39","_useState40","redirect","setRedirect","_useState41","_useState42","errorMessage","setErrorMessage","_useState43","custom_not_available_message","_useState44","availabilityErrorMessage","setAvailabilityErrorMessage","_useState45","accommodation_extra_services","_useState46","extraServices","setExtraServices","_useState47","_useState48","selectedExtras","setSelectedExtras","calendarInfo","React","className","Drupal","t","getAvailableSites","start","end","data","searchStartDate","getTime","map","room","startIndex","availability","findIndex","date","toDateString","endIndex","i","isAvailable","roomId","roomNumber","roomTypeId","filter","undefined","sort","a","b","formatDate","offset","getTimezoneOffset","toISOString","split","checkRoomAvailability","_x","_checkRoomAvailability","apply","arguments","_asyncToGenerator","_regeneratorRuntime","_callee5","searchEndDate","seasonData","url","response","_context5","prev","next","getSelectedSeasonData","concat","process","fetch","sent","ok","json","result","forEach","day","abrupt","t0","console","log","stop","_addToCart","_callee6","event","campaignCode","requestOptions","_context6","preventDefault","length","sf_member_code","caravan_park_storage_only_booking_code","method","headers","body","JSON","stringify","purchased_entity_type","purchased_entity_id","variationId","quantity","combine","campaignData","caravanParkData","base_url","path","currentLanguage","rateplanCode","toString","disableSubmit","find","season","name","onTabChange","tab","_drupalSettings$accom2","onExtraServiceChange","e","target","checked","_toConsumableArray","value","newExtras","extra","useEffect","_getRoomAvailabilities","_callee","searchStart","searchEnd","dayAvailabilityData","availabilityPerDay","minimal","seasonAvailabilityData","_context","active_site","accommodation","parseInt","hotellinx_ids","dayAvailability","dateString","Object","keys","hotellinx_buffers","getRoomAvailabilities","availableSites","caravan_park_limited_availability_message","_fetchAvailability","_callee2","site","_iterator","_step","availableSite","_context2","Math","random","_createForOfIteratorHelper","s","n","done","f","finish","bookingStart","bookingEnd","currentDate","currentDateFormatted","includes","setDate","getDate","includesMinimalDates","setHours","some","seasonStart","seasonEnd","fetchAvailability","caravan_cross_season_message","getPrice","_getPrice","_callee3","id","_context3","status","reservation_length_error_message","error","t1","_checkSeasonRoomAvailability","_callee4","_context4","checkSeasonRoomAvailability","window","location","replace","totalPrice","_extraServices$find$p","parseFloat","extraService","style","minHeight","color","onClick","DatePicker","parseDay","dayIsDisabled","yesterday","setUTCDate","getUTCDate","content","disabled","ErrorMessage","message","onChange","disableSeasonBooking","key","htmlFor","type","NumberInput","class","min","max","setter","required","href","caravan_park_map","rel","marginTop","display","_x2","addToCart","text","Intl","NumberFormat","currency","format","submitButtonText","ReactDOM","document","getElementById","render","CaravanParkReservation"],"sourceRoot":""}