{"version":3,"sources":["reducers/bookReducer.js","reducers/modalReducer.js","reducers/index.js","actions/types.js","store.js","components/Portal/Portal.js","components/Modal/Modal.js","actions/modalActions.js","components/Modals/Modals.js","components/Spinner/Spinner.js","components/Footer/Footer.js","components/Navigation/Navigation.js","components/ScrollToTop.js","actions/bookActions.js","pages/additional-order-page.js","api/beachesAPI.js","api/inventoryAPI.js","api/testimonialsAPI.js","api/index.js","pages/book-now/steps/choose-beach.js","utils/formatMSToTimeString.js","utils/generateTimeIntervalOptions.js","utils/getMSFromTimeString.js","pages/book-now/steps/date-time.jsx","pages/book-now/steps/map-pin.jsx","pages/book-now/steps/customer-info.jsx","pages/book-now/steps/equipment/additional-equipment/additional-equipment.js","pages/book-now/steps/equipment/equipment.jsx","validations/index.js","pages/book-now/steps/summary.jsx","pages/book-now/steps/payment.jsx","pages/book-now/steps/thanks.js","pages/book-now/index.js","pages/contact-us-page.js","pages/pricing.js","pages/faq.js","pages/home-page.js","pages/howto-page.js","pages/testimonials.js","pages/privacy-policy-page.js","App.js","serviceWorker.js","index.js","components/Modal/Modal.module.scss","pages/book-now/steps/equipment/additional-equipment/additional-equipment.module.scss","components/Modals/Modals.module.scss"],"names":["initialState","beach","bookedEquipment","arrivalTime","departureTime","paymentInfo","location","date","customerInfo","birthYear","currentStep","combineReducers","book","state","action","filter","type","newState","payload","localStorage","setItem","JSON","stringify","Date","reservation","additionalOrder","reservationNumber","_id","createDate","removeItem","modal","info","prompt","confirm","middleware","thunk","composeEnchancers","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","store","createStore","rootReducer","applyMiddleware","portalRoot","document","getElementById","Portal","el","createElement","appendChild","this","removeChild","ReactDOM","createPortal","props","children","React","Component","Modal","title","classNames","show","closeHandler","cancelButton","cancelHandler","okButton","okHandler","closeByEnterClick","isError","useEffect","fn","e","keyCode","addEventListener","removeEventListener","className","classes","overlay","onClick","classnames","error","closeBtn","actions","showInfo","closeModal","ConfirmModal","clickHandler","isConfirmed","cb","data","html","bind","dangerouslySetInnerHTML","__html","PromptModal","value","preventDefault","changeValueHandler","setState","target","input","createRef","initialValue","current","focus","inputProps","underInputHtml","ref","promptField","onChange","connect","overlayStyles","position","backgroundColor","top","bottom","right","left","zIndex","Spinner","withOverlay","loading","anotherProps","style","boxSizing","transform","color","Footer","href","rel","src","alt","to","menuLinks","Navigation","showMenu","targetRef","targetElement","checkMenu","innerWidth","closeMenu","debouncedCheckMenu","debounce","enableBodyScroll","openMenu","disableBodyScroll","clearAllBodyScrollLocks","map","l","key","ScrollToTop","pathname","useLocation","scrollTo","updateBookState","resetBookState","AdditionalOrder","orderId","submit","stopPropagation","setBookStateForAdditionalOrder","history","url","axios","get","then","response","isCancelled","textAlign","reservationDate","moment","hours","minutes","valueOf","now","push","catch","err","console","log","message","inputHandler","onSubmit","required","apiPoint","fetchList","res","Promise","resolve","getById","id","getAvailableDays","datesAndTimes","getBeachPolygons","polygons","getTax","tax","getAvailableInventoryForBeachByDate","beachId","checkIfAvailableForBook","tryingToBook","post","defaults","baseURL","process","beaches","inventory","testimonials","ChooseBeach","onBeachSelectHandler","isAdditionalOrder","selected","goToNextStep","selectBeach","changeStep","selectedBeach","name","cancelOrder","showConfirm","API","formattedBeaches","b","hidden","sort","a","order","length","backgroundImage","image","disabled","withRouter","params","dispatch","reject","time","duration","ampm","from","interval","timeOptions","formatMSToTimeString","timeString","split","asMilliseconds","getDate","string","toDate","DateTime","availableDays","setTimeOptionsForSelectedDate","dateObject","currentSet","_","find","set","resetTime","isSelectedDateIsToday","setHours","currentTimeInMS","roundedCurrentTime","arrivalTimeInMS","getMSFromTimeString","arrival","departureTimeInMS","departure","generateTimeIntervalOptions","Math","max","handleArrivalTimeChange","updatedBookState","handleDepartureTimeChange","handleDayClick","available","getTime","format","today","startOf","tomorrow","add","disabledDays","before","selectedDate","filteredDatesAndTimesSets","initialMonth","prevProps","filteredDepartureTimeOptions","modifiers","selectedDays","fromMonth","onDayClick","month","canChangeMonth","val","opt","generateMarker","coords","google","maps","Marker","icon","generateCircle","Circle","strokeColor","strokeOpacity","strokeWeight","fillColor","fillOpacity","center","radius","MapPin","drawPin","marker","circle","setMap","replace","lat","lng","LatLng","parseFloat","mapInitialViewBounds","initMap","Map","draggable","zoom","mapTypeId","MapTypeId","HYBRID","mapTypeControlOptions","mapTypeIds","bounds","LatLngBounds","forEach","polygon","coordinatesObject","i","gmCoords","extend","Polygon","paths","addListener","latLng","lastCords","setZoom","setCenter","toString","newBounds","Number","trim","fitBounds","getCenter","event","AdditionalEquipment","item","booked","changeQuantity","currentQuantity","quantity","wrapper","lead","img","text","price","Equipment","availableInventory","showAdditionalModal","additionalEquip","getAvailableEquipment","checkIfAllItemsAreStillAvailable","result","notEnough","equip","updatePrice","reduce","accum","equipmentId","diff","bookedItem","previousQty","newCount","withoutCurrent","relatedIDs","relatedTo","withoutCurrentAndRelated","includes","triggerAdditionalModal","currentQty","getCurrentQtyOfEquip","additionalEquipInitialValue","cancelAdditionalModal","closeAdditionalModal","goNext","isAvailable","renderInventory","relatedItems","bookedCount","additionalItem","prevState","validateZip","zip","test","validatePhone","phone","match","validateEmail","email","phoneMask","zipMask","yearsOptions","getFullYear","InputGroup","label","validate","setError","accept","component","errorMessage","localOnChange","useMemo","formattedValue","localBlur","invalid","onBlur","CustomerInfo","errors","updateInfo","field","onChangeKnowFrom","updatedCustomerInfo","knowFrom","knowFromOther","firstName","lastName","zipCode","agreement","mask","guide","keepCharPositions","MaskedInput","year","checked","placeholder","ptopTypes","PropTypes","object","isRequired","func","Summary","amount","totalAmount","beachTax","toFixed","disableDefaultUI","beachPolygons","pi","renderEquipmentTable","inventoryItem","relatedItemsIDs","all","results","list","Payment","paymentBoxReady","processing","modalText","showModalClose","calculateTotal","discountValue","withoutTax","discountAmount","newWithoutTax","taxAmount","newTotalAmount","addDiscount","showPrompt","code","discount","discountId","discountCode","deleteDiscount","createDropInUI","token","dropin","create","authorization","container","paypal","flow","card","overrides","fields","cvv","maskInput","createErr","instance","braintreeInstance","confirmReservation","requestPaymentMethod","paymentMethodNonce","nonce","timeout","teardown","success","opacity","Thanks","steps","BookNow","StepPage","alert","ContactUs","subject","sendingEmail","resetFields","submitHandler","updateValue","toLowerCase","description","FAQ","active","number","changeSection","Home","additionalOrderId","HowTo","Testimonials","testimonial","PrivacyPolicy","localBookState","getItem","booksState","parse","lastUpdate","App","Modals","exact","path","Pricing","Boolean","hostname","render","navigator","serviceWorker","ready","registration","unregister","module","exports"],"mappings":"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","file":"static/js/main.d6c8621c.chunk.js","sourcesContent":["import {\n UPDATE_BOOK_STATE,\n SELECT_BEACH,\n RESET_BOOK_STATE,\n SET_BOOK_STATE_FOR_ADDITIONAL_ORDER\n} from \"actions/types\";\n\n// const dummyData = {\n // arrivalTime: '10:00 AM',\n // departureTime: '12:00 PM',\n // date: '07/20/2020',\n // location: '(42.82593604569192, -70.81327888894015)',\n // bookedEquipment: [\n // { _id: '5d2f13d81c480000245c98c1', quantity: 3 },\n // { _id: '5d2f13941c480000245c98bd', quantity: 4 },\n // { _id: '5d2f136a1c480000245c98bc', quantity: 4 }\n // ],\n // customerInfo: {\n // birthYear: 1990,\n // firstName: 'Test First Name',\n // lastName: 'Test Last Name',\n // zipCode: '12345',\n // phone: '123-456-7890',\n // email: 'dbondar@envionsoftware.com',\n // knowFrom: 'Facebook',\n // agreement: true\n // }\n// };\n\nconst initialState = {\n beach: null,\n bookedEquipment: [],\n arrivalTime: null,\n departureTime: null,\n paymentInfo: null,\n location: null,\n date: null,\n customerInfo: {\n birthYear: 1980,\n },\n currentStep: 0\n};\n\nconst filter = \"book\";\n\nexport default (state = initialState, action) => {\n if (filter !== action.filter) return state;\n\n switch (action.type) {\n case UPDATE_BOOK_STATE:\n const newState = {\n ...state,\n ...action.payload\n };\n\n localStorage.setItem(\"bookState\", JSON.stringify(newState));\n localStorage.setItem(\"lastUpdate\", new Date());\n return newState;\n case SET_BOOK_STATE_FOR_ADDITIONAL_ORDER:\n const reservation = action.payload;\n\n const additionalOrder = reservation.reservationNumber;\n\n // Remove extra data\n delete reservation._id;\n delete reservation.bookedEquipment;\n delete reservation.paymentInfo;\n delete reservation.createDate;\n delete reservation.reservationNumber;\n\n return {\n additionalOrder,\n currentStep: 3,\n bookedEquipment: [],\n ...action.payload\n };\n case SELECT_BEACH: {\n // Reset booked equipment, location, date and times if beach was changed\n return {\n ...state,\n beach: action.payload,\n bookedEquipment: [],\n paymentInfo: null,\n location: null,\n arrivalTime: null,\n departureTime: null,\n date: null\n };\n }\n case RESET_BOOK_STATE:\n localStorage.removeItem(\"bookState\");\n localStorage.removeItem(\"lastUpdate\");\n return initialState;\n default:\n return state;\n }\n};\n","import {\n SHOW_INFO_MODAL,\n CLOSE_MODAL,\n SHOW_PROMPT_MODAL,\n SHOW_CONFIRM_MODAL\n} from 'actions/types';\n\nconst initialState = {};\n\nconst filter = 'modal';\n\nexport default (state = initialState, action) => {\n if (filter !== action.filter) return state;\n\n switch (action.type) {\n case SHOW_INFO_MODAL:\n return {\n ...state,\n info: action.payload\n };\n case SHOW_PROMPT_MODAL:\n return {\n ...state,\n prompt: action.payload\n };\n case SHOW_CONFIRM_MODAL:\n return {\n ...state,\n confirm: action.payload\n };\n case CLOSE_MODAL:\n return initialState;\n default:\n return state;\n }\n};\n","import { combineReducers } from \"redux\";\n\nimport book from \"./bookReducer\";\nimport modal from \"./modalReducer\";\n\nexport default combineReducers({\n book,\n modal,\n});\n","export const UPDATE_BOOK_STATE = 'UPDATE_BOOK_STATE';\nexport const SELECT_BEACH = 'SELECT_BEACH';\nexport const RESET_BOOK_STATE = 'RESET_BOOK_STATE';\nexport const SET_BOOK_STATE_FOR_ADDITIONAL_ORDER =\n 'SET_BOOK_STATE_FOR_ADDITIONAL_ORDER';\n\nexport const SHOW_INFO_MODAL = 'SHOW_INFO_MODAL';\nexport const SHOW_PROMPT_MODAL = 'SHOW_PROMPT_MODAL';\nexport const SHOW_CONFIRM_MODAL = 'SHOW_CONFIRM_MODAL';\nexport const CLOSE_MODAL = 'CLOSE_MODAL';\n","import { createStore, applyMiddleware, compose } from 'redux';\nimport thunk from 'redux-thunk';\nimport rootReducer from './reducers';\n\nconst initialState = {};\n\nconst middleware = [thunk];\n\nconst composeEnchancers =\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n\nconst store = createStore(\n rootReducer,\n initialState,\n composeEnchancers(applyMiddleware(...middleware))\n);\n\nexport default store;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst portalRoot = document.getElementById('portal-root');\n\nclass Portal extends React.Component {\n el = document.createElement('div');\n\n componentDidMount() {\n portalRoot.appendChild(this.el);\n }\n\n componentWillUnmount() {\n portalRoot.removeChild(this.el);\n }\n\n render() {\n return ReactDOM.createPortal(this.props.children, this.el);\n }\n}\n\nexport default Portal;\n","import React, { useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport classnames from \"classnames\";\n\nimport Portal from \"../Portal/Portal\";\nimport classes from \"./Modal.module.scss\";\n\nconst Modal = ({\n title,\n classNames = {},\n show,\n closeHandler,\n cancelButton,\n cancelHandler,\n children,\n okButton,\n okHandler,\n closeByEnterClick = false,\n isError\n}) => {\n useEffect(() => {\n if (!closeByEnterClick) return;\n\n const fn = e => {\n if (e.keyCode === 13) {\n okHandler ? okHandler() : closeHandler();\n }\n\n if (e.keyCode === 27) {\n closeHandler();\n }\n };\n\n window.addEventListener(\"keyup\", fn);\n\n return () => window.removeEventListener(\"keyup\", fn);\n }, [closeHandler, okHandler, closeByEnterClick]);\n\n return show ? (\n \n
\n\n \n \n ×\n \n\n {title && {title}}\n\n {children}\n\n
\n {cancelButton && (\n (cancelHandler ? cancelHandler() : closeHandler())}\n >\n Cancel\n \n )}\n {okButton && (\n \n OK\n \n )}\n
\n
\n
\n ) : null;\n};\n\nModal.propTypes = {\n show: PropTypes.bool.isRequired,\n closeHandler: PropTypes.func.isRequired\n};\n\nexport default Modal;\n","import {\n SHOW_INFO_MODAL,\n SHOW_PROMPT_MODAL,\n CLOSE_MODAL,\n SHOW_CONFIRM_MODAL\n} from 'actions/types';\n\nconst filter = 'modal';\n\nexport const showInfo = payload => ({\n filter,\n type: SHOW_INFO_MODAL,\n payload\n});\n\nexport const closeModal = () => ({\n filter,\n type: CLOSE_MODAL\n});\n\nexport const showPrompt = params => dispatch =>\n new Promise((resolve, reject) => {\n dispatch({\n filter,\n type: SHOW_PROMPT_MODAL,\n payload: { ...params, cb: resolve }\n });\n });\n\nexport const showConfirm = params => dispatch =>\n new Promise((resolve, reject) => {\n dispatch({\n filter,\n type: SHOW_CONFIRM_MODAL,\n payload: { ...params, cb: resolve }\n });\n });\n","import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\n\nimport { closeModal } from \"actions/modalActions\";\nimport Modal from \"../Modal/Modal\";\nimport classes from \"./Modals.module.scss\";\n\nconst Dialogs = ({ modal, closeModal }) => {\n const { info, prompt, confirm } = modal;\n\n return (\n <>\n {info && (\n {\n closeModal();\n info.cb && info.cb();\n }}\n >\n {info.html}\n \n )}\n\n {prompt && }\n {confirm && }\n \n );\n};\n\nclass ConfirmModal extends Component {\n clickHandler = isConfirmed => {\n const { closeModal, data } = this.props;\n const { cb } = data;\n\n cb(isConfirmed);\n closeModal();\n };\n\n render() {\n const {\n data: { html = \"\" }\n } = this.props;\n\n return (\n \n <>\n
\n \n \n );\n }\n}\n\nclass PromptModal extends Component {\n state = { value: \"\" };\n\n componentDidMount() {\n const {\n data: { initialValue }\n } = this.props;\n\n if (initialValue) {\n this.setState({ value: initialValue });\n }\n\n this.input.current.focus();\n }\n\n okHandler = e => {\n const { closeModal, data } = this.props;\n const { cb } = data;\n const { value } = this.state;\n\n e && e.preventDefault && e.preventDefault();\n cb(value);\n closeModal();\n };\n\n closeHandler = e => {\n const { closeModal, data } = this.props;\n const { cb } = data;\n\n e && e.preventDefault && e.preventDefault();\n cb();\n closeModal();\n };\n\n changeValueHandler = e => {\n this.setState({ value: e.target.value });\n };\n\n input = React.createRef();\n\n render() {\n const {\n data: { inputProps = {}, html = \"\", underInputHtml = \"\" }\n } = this.props;\n\n const { value } = this.state;\n\n return (\n \n <>\n
\n\n \n\n
\n \n \n );\n }\n}\n\nDialogs.propTypes = {\n modal: PropTypes.object.isRequired,\n closeModal: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = state => ({\n modal: state.modal\n});\n\nexport default connect(mapStateToProps, { closeModal })(Dialogs);\n","import React from 'react';\n// import { css } from '@emotion/core';\nimport MoonLoader from 'react-spinners/MoonLoader';\n\n// const override = css`\n// margin: 0 auto;\n// border-color: red;\n// `;\n\nconst overlayStyles = {\n position: 'fixed',\n backgroundColor: 'rgba(255,255,255, 0.5)',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n zIndex: 200\n};\n\nconst Spinner = ({ withOverlay, loading, ...anotherProps }) => {\n return (\n loading && (\n
\n \n \n
\n
\n )\n );\n};\n\nexport default Spinner;\n","import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nclass Footer extends Component {\n render() {\n return (\n
\n
\n Connect\n\n
\n \n \"facebook\"\n \n\n \n \"instagram\"\n \n
\n
\n\n Contact us\n Privacy Policy\n
\n );\n }\n}\n\nexport default Footer;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n clearAllBodyScrollLocks,\n} from \"body-scroll-lock\";\nimport { debounce } from \"lodash\";\n\nconst menuLinks = [\n { title: \"Pricing\", to: \"/pricing\" },\n { title: \"Book Now\", to: \"/book\" },\n { title: \"Reviews\", to: \"/reviews\" },\n { title: \"Contact Us\", to: \"/contact-us\" },\n { title: \"FAQ\", to: \"/faq\" },\n { title: \"How To\", to: \"/howto\" },\n];\n\nclass Navigation extends React.Component {\n state = { showMenu: false };\n\n targetRef = React.createRef();\n targetElement = null;\n\n componentDidMount() {\n this.targetElement = this.targetRef.current;\n window.addEventListener(\"resize\", this.debouncedCheckMenu);\n }\n\n componentWillUnmount() {\n clearAllBodyScrollLocks();\n window.removeEventListener(\"resize\", this.debouncedCheckMenu);\n }\n\n checkMenu = () => {\n const { showMenu } = this.state;\n if (window.innerWidth >= 768 && showMenu) {\n this.closeMenu();\n }\n };\n\n debouncedCheckMenu = debounce(this.checkMenu, 500);\n\n closeMenu = () => {\n enableBodyScroll(this.targetElement);\n this.setState({ showMenu: false });\n };\n\n openMenu = () => {\n disableBodyScroll(this.targetElement);\n this.setState({ showMenu: true });\n };\n\n render() {\n const { showMenu } = this.state;\n\n return (\n \n );\n }\n}\n\nexport default Navigation;\n","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport default function ScrollToTop() {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n","import {\n UPDATE_BOOK_STATE,\n RESET_BOOK_STATE,\n SELECT_BEACH,\n SET_BOOK_STATE_FOR_ADDITIONAL_ORDER\n} from './types';\n\nconst filter = 'book';\n\nexport const updateBookState = payload => ({\n filter,\n type: UPDATE_BOOK_STATE,\n payload\n});\n\nexport const selectBeach = beach => ({\n filter,\n type: SELECT_BEACH,\n payload: beach\n})\n\nexport const setBookStateForAdditionalOrder = payload => ({\n filter,\n type: SET_BOOK_STATE_FOR_ADDITIONAL_ORDER,\n payload\n});\n\nexport const resetBookState = () => ({\n filter,\n type: RESET_BOOK_STATE\n});\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport axios from \"axios\";\nimport { showInfo } from \"actions/modalActions\";\nimport moment from \"moment\";\n\nimport {\n setBookStateForAdditionalOrder,\n resetBookState,\n} from \"actions/bookActions\";\n\nclass AdditionalOrder extends React.Component {\n state = {\n orderId: \"\",\n };\n\n componentDidMount() {\n const { resetBookState } = this.props;\n resetBookState();\n this.input.current.focus();\n }\n\n submit = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { setBookStateForAdditionalOrder, showInfo, history } = this.props;\n const { orderId } = this.state;\n\n const url = `/api/reservations/get-reservation-by-number/${orderId}`;\n\n axios\n .get(url)\n .then((response) => {\n const { data: reservation } = response;\n\n if (reservation.isCancelled) {\n return showInfo({\n html: (\n
\n Your reservation was cancelled\n
\n ),\n });\n }\n\n // Check that current date is less that reservation date 2pm\n const reservationDate = moment(reservation.date, \"MM/DD/YYYY\")\n .hours(14)\n .minutes(0)\n .valueOf();\n\n const currentDate = Date.now();\n\n if (currentDate < reservationDate) {\n setBookStateForAdditionalOrder(reservation);\n\n history.push(`/book`);\n } else {\n showInfo({\n html:\n \"Sorry, you can't book any additional equipment to this reservation.\",\n });\n }\n })\n .catch((err) => {\n console.log(err);\n showInfo({\n isError: true,\n html: (\n

\n {(err.response &&\n err.response.data &&\n err.response.data.message) ||\n \"Something goes wrong. Please try again\"}\n

\n ),\n });\n });\n };\n\n input = React.createRef();\n\n inputHandler = (e) => {\n const { value } = e.target;\n\n this.setState({ orderId: value });\n };\n\n render() {\n const { orderId } = this.state;\n\n return (\n
\n
\n

Additional order

\n \n \n \n \n
\n );\n }\n}\n\nAdditionalOrder.propTypes = {\n setBookStateForAdditionalOrder: PropTypes.func.isRequired,\n resetBookState: PropTypes.func.isRequired,\n showInfo: PropTypes.func.isRequired,\n history: PropTypes.object.isRequired,\n};\n\nexport default connect(null, {\n setBookStateForAdditionalOrder,\n showInfo,\n resetBookState,\n})(AdditionalOrder);\n","import axios from \"axios\";\n\nconst apiPoint = \"/api/beaches/\";\n\nexport default {\n fetchList() {\n return axios\n .get(apiPoint)\n .then((res) => Promise.resolve(res.data))\n .catch((err) => {\n console.log(err);\n return Promise.resolve([]);\n });\n },\n getById(id) {\n return axios\n .get(apiPoint + id)\n .then((res) => Promise.resolve(res.data))\n .catch((err) => {\n console.log(err);\n return Promise.resolve(null);\n });\n },\n getAvailableDays(id) {\n return this.getById(id).then((beach) => beach && beach.datesAndTimes);\n },\n getBeachPolygons(id) {\n return this.getById(id).then((beach) => beach && beach.polygons);\n },\n getTax(id) {\n return this.getById(id).then((beach) => beach && beach.tax);\n },\n getAvailableInventoryForBeachByDate(beachId, date) {\n return axios\n .get(\n `${apiPoint}get-available-inventory-for-date/${beachId}?date=${date}`\n )\n .then((res) => res.data)\n .catch((err) => {\n console.log(err);\n return null;\n });\n },\n checkIfAvailableForBook(beachId, date, tryingToBook) {\n const data = { beachId, date, tryingToBook };\n\n return axios\n .post(`${apiPoint}check-if-available-for-book`, data)\n .then((res) => res.data)\n .catch((err) => {\n console.log(err);\n return null;\n });\n },\n};\n","import axios from \"axios\";\n\nconst apiPoint = \"/api/inventory/\";\n\nexport default {\n fetchList() {\n return axios\n .get(apiPoint)\n .then((res) => Promise.resolve(res.data))\n .catch((err) => {\n console.log(err);\n return Promise.resolve([]);\n });\n },\n};\n","import axios from \"axios\";\n\nconst apiPoint = \"/api/testimonials/\";\n\nexport default {\n fetchList() {\n return axios\n .get(apiPoint)\n .then(res => Promise.resolve(res.data))\n .catch(err => {\n console.log(err);\n return Promise.resolve([]);\n });\n },\n};\n","import axios from \"axios\";\n\nimport beaches from \"./beachesAPI\";\nimport inventory from \"./inventoryAPI\";\nimport testimonials from \"./testimonialsAPI\";\n\naxios.defaults.baseURL = process.env.REACT_APP_API_URL;\n\nexport default {\n beaches,\n inventory,\n testimonials,\n};\n","import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { connect } from \"react-redux\";\nimport { compose } from \"redux\";\nimport { withRouter } from \"react-router-dom\";\nimport classnames from \"classnames\";\nimport { selectBeach, resetBookState } from \"actions/bookActions\";\n\nimport API from \"api\";\nimport { showInfo, showConfirm } from \"actions/modalActions\";\n\nexport class ChooseBeach extends Component {\n state = { beaches: null };\n\n componentDidMount() {\n const { showInfo, history, selectedBeach } = this.props;\n\n API.beaches.fetchList().then(beaches => {\n const formattedBeaches = beaches\n .filter(b => !b.hidden)\n .sort((a, b) => a.order - b.order);\n\n if (!formattedBeaches.length) {\n return showInfo({\n html: \"Sorry, there are no available beaches at this moment\",\n cb: () => history.push(\"/\")\n });\n }\n\n // if (formattedBeaches.length === 1) {\n // return this.setState({ selected: selectedBeach }, this.goToNextStep);\n // }\n\n this.setState({ beaches: formattedBeaches, selected: selectedBeach });\n });\n }\n\n onBeachSelectHandler = beach => {\n const { isAdditionalOrder, showInfo } = this.props;\n const { selected } = this.state;\n\n if (selected && selected._id === beach._id) {\n return;\n }\n\n if (isAdditionalOrder) {\n return showInfo({\n html: \"Sorry, you can't change the beach, cause it's additional order\"\n });\n }\n\n this.setState({ selected: beach });\n };\n\n goToNextStep = () => {\n const { selectBeach, changeStep, selectedBeach } = this.props;\n const { selected } = this.state;\n\n if (!selectedBeach || selectedBeach._id !== selected._id) {\n selectBeach({ name: selected.name, _id: selected._id });\n }\n\n changeStep(1);\n };\n\n cancelOrder = () => {\n const { history, resetBookState, showConfirm } = this.props;\n\n showConfirm({\n html: \"Are you sure you want to cancel booking?\"\n }).then(isConfirmed => {\n if (!isConfirmed) return;\n\n resetBookState();\n history.push(\"/\");\n });\n };\n\n render() {\n const { beaches, selected } = this.state;\n if (!beaches) return null;\n\n return (\n <>\n
\n

Choose Beach

\n\n \n {beaches.map(beach => {\n return (\n \n
\n
\n
\n
\n\n
\n

{beach.name}

\n \n );\n })}\n \n \n\n
\n
\n \n Cancel\n \n\n \n Next\n \n
\n
\n \n );\n }\n}\n\nChooseBeach.propTypes = {\n isAdditionalOrder: PropTypes.bool,\n history: PropTypes.object.isRequired,\n selectedBeach: PropTypes.object,\n showInfo: PropTypes.func.isRequired,\n showConfirm: PropTypes.func.isRequired,\n selectBeach: PropTypes.func.isRequired,\n resetBookState: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = ({ book }) => ({\n selectedBeach: book.beach,\n isAdditionalOrder: !!book.additionalOrder\n});\n\nexport default compose(\n withRouter,\n connect(mapStateToProps, {\n selectBeach,\n showInfo,\n showConfirm,\n resetBookState\n })\n)(ChooseBeach);\n","import moment from 'moment';\n\nexport default time => {\n let hours = moment.duration(time).hours();\n let minutes = moment.duration(time).minutes();\n\n const ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n hours = hours ? hours : 12;\n minutes = minutes < 10 ? '0' + minutes : minutes;\n\n return `${hours}:${minutes} ${ampm}`;\n};\n","import formatMSToTimeString from './formatMSToTimeString';\n\nexport default (from, to, interval) => {\n const timeOptions = [];\n\n for (let time = from; time <= to; time += interval) {\n timeOptions.push(formatMSToTimeString(time));\n }\n\n return timeOptions;\n};\n","import moment from \"moment\";\n\nexport default timeString => {\n if (!timeString) return 0;\n\n const [time, ampm] = timeString.split(\" \");\n let [hours, minutes] = time.split(\":\");\n\n minutes = +minutes;\n hours = +hours;\n\n if (ampm === \"PM\" && hours !== 12) {\n hours += 12;\n }\n\n if (ampm === \"AM\" && hours === 12) {\n hours = 0;\n }\n\n const duration = moment.duration({\n hours,\n minutes\n });\n\n return duration.asMilliseconds();\n};\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport _ from \"lodash\";\nimport PropTypes from \"prop-types\";\nimport DayPicker from \"react-day-picker\";\nimport moment from \"moment\";\n\nimport { generateTimeIntervalOptions, getMSFromTimeString } from \"utils\";\nimport { showInfo } from \"actions/modalActions\";\nimport { updateBookState } from \"actions/bookActions\";\nimport API from \"api\";\n\nconst timeInterval = 30 * 60 * 1000; // 30 minutes\nconst getDate = string => moment(string, \"MM/DD/YYYY\").toDate();\n\nclass DateTime extends Component {\n state = {\n timeOptions: [],\n availableDays: []\n };\n\n componentDidMount() {\n // Disable booking until today or tomorrow if today's time already past 14 o'clock\n const today = moment()\n .startOf(\"day\")\n .toDate();\n\n const tomorrow = moment()\n .startOf(\"day\")\n .add(1, \"days\")\n .toDate();\n\n const hoursNow = moment().hours();\n\n const disabledDays = [\n {\n before:\n hoursNow >= 14 // Disable booking same day after 14:00\n ? tomorrow\n : today\n }\n ];\n\n const {\n book: { beach, date: selectedDate },\n changeStep,\n showInfo\n } = this.props;\n\n if (!beach) {\n return showInfo({\n html: \"You should select a beach firstly\",\n cb: () => changeStep(0)\n });\n }\n\n // Get beach available days\n API.beaches.getAvailableDays(beach._id).then(datesAndTimes => {\n const filteredDatesAndTimesSets = datesAndTimes\n ? datesAndTimes.filter(({ from, to, arrival, departure }) => {\n return from && to && arrival && departure;\n })\n : [];\n\n if (!filteredDatesAndTimesSets.length) {\n return showInfo({\n html:\n \"We are sorry, there are no available dates to reserve on this beach\"\n });\n }\n\n const availableDays = filteredDatesAndTimesSets.map(set => ({\n ...set,\n from: getDate(set.from),\n to: getDate(set.to)\n }));\n\n const initialMonth =\n selectedDate && moment(selectedDate, \"MM/DD/YYYY\").toDate();\n\n this.setState(\n {\n availableDays,\n disabledDays,\n initialMonth\n },\n this.setTimeOptionsForSelectedDate\n );\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.book.date !== this.props.book.date) {\n this.setTimeOptionsForSelectedDate();\n }\n }\n\n setTimeOptionsForSelectedDate = () => {\n const { availableDays } = this.state;\n const { book } = this.props;\n\n const dateObject = getDate(book.date);\n\n const currentSet = _.find(availableDays, set => {\n return dateObject >= set.from && dateObject <= set.to;\n });\n\n if (!currentSet) {\n return this.setState({ timeOptions: [] }, this.resetTime);\n }\n\n const isSelectedDateIsToday =\n dateObject.setHours(0, 0, 0, 0) === new Date().setHours(0, 0, 0, 0);\n\n const currentTimeInMS = Date.now() - new Date().setHours(0, 0, 0, 0);\n const roundedCurrentTime =\n currentTimeInMS - (currentTimeInMS % timeInterval) + timeInterval;\n\n console.log(\"currentTimeInMS\", currentTimeInMS);\n console.log(\"roundedCurrentTime\", roundedCurrentTime);\n\n const arrivalTimeInMS = getMSFromTimeString(currentSet.arrival);\n const departureTimeInMS = getMSFromTimeString(currentSet.departure);\n\n console.log(\"isSelectedDateIsToday\", isSelectedDateIsToday);\n\n const timeOptions = generateTimeIntervalOptions(\n isSelectedDateIsToday\n ? Math.max(roundedCurrentTime, arrivalTimeInMS)\n : arrivalTimeInMS,\n departureTimeInMS,\n timeInterval\n );\n\n this.setState({ timeOptions });\n\n // Check if current selected times are included in the available time options\n if (\n (book.arrivalTime &&\n getMSFromTimeString(book.arrivalTime) < arrivalTimeInMS) ||\n (book.departureTime &&\n getMSFromTimeString(book.departureTime) > departureTimeInMS)\n ) {\n return this.resetTime();\n }\n };\n\n resetTime = () => {\n this.props.updateBookState({ arrivalTime: null, departureTime: null });\n };\n\n handleArrivalTimeChange = time => {\n const { updateBookState, book } = this.props;\n const { departureTime } = book;\n\n const updatedBookState = {};\n\n if (!time) {\n return updateBookState({ arrivalTime: null, departureTime: null });\n }\n\n if (\n departureTime &&\n getMSFromTimeString(time) >= getMSFromTimeString(departureTime)\n ) {\n updatedBookState.departureTime = null;\n }\n\n updatedBookState.arrivalTime = time;\n\n updateBookState(updatedBookState);\n };\n\n handleDepartureTimeChange = time => {\n const { updateBookState } = this.props;\n updateBookState({ departureTime: time });\n };\n\n handleDayClick = (date, { available, disabled }) => {\n const {\n updateBookState,\n book: { additionalOrder }\n } = this.props;\n\n if (additionalOrder) {\n return;\n }\n\n if (available && !disabled) {\n updateBookState({\n date: moment(date.getTime()).format(\"MM/DD/YYYY\"),\n bookedEquipment: [], // Reset booked equipment if date was changed\n paymentInfo: null // Rest payment info, cause inventory was removed\n });\n }\n };\n\n render() {\n const {\n changeStep,\n book: { date, departureTime, arrivalTime, additionalOrder }\n } = this.props;\n const {\n availableDays,\n timeOptions,\n disabledDays,\n initialMonth\n } = this.state;\n\n const filteredDepartureTimeOptions = timeOptions.filter(\n time =>\n arrivalTime &&\n getMSFromTimeString(time) > getMSFromTimeString(arrivalTime)\n );\n\n return (\n <>\n
\n

Choose Date and Times

\n\n \n\n
\n
\n
\n Arrival time\n {\n const val = e.target.value;\n this.handleArrivalTimeChange(val);\n }}\n value={arrivalTime || \"\"}\n >\n \n {timeOptions.map(opt => (\n \n ))}\n \n
\n\n
\n Departure time\n {\n const val = e.target.value;\n this.handleDepartureTimeChange(val);\n }}\n value={departureTime || \"\"}\n >\n \n {filteredDepartureTimeOptions.map(opt => (\n \n ))}\n \n
\n
\n\n
\n

\n We strongly recommend arriving as early as possible to ensure\n you find a parking spot. The Beach Butler is not affiliated with\n any parking lots/structures and cannot guarantee you a spot. The\n inability to find parking is not a condition in which we will\n provide a refund. However, we would be happy to help guide you\n towards other parking options if you contact us.\n

\n

\n It is ok if you decide to leave sooner or later than the\n selected departure time. Departure time will be used by Beach\n Butler to collect the equipment. Please keep in mind the latest\n we can collect equipment is 5:00pm.\n

\n
\n
\n
\n\n
\n
\n changeStep(0)}\n >\n Back to Beaches\n \n\n changeStep(2)}\n >\n Next\n \n
\n
\n \n );\n }\n}\n\nDateTime.propTypes = {\n book: PropTypes.object.isRequired,\n updateBookState: PropTypes.func.isRequired,\n showInfo: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = ({ book }) => ({\n book\n});\n\nexport default connect(mapStateToProps, { updateBookState, showInfo })(\n DateTime\n);\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\n\nimport { updateBookState } from \"actions/bookActions\";\nimport { showInfo } from \"actions/modalActions\";\nimport API from \"api\";\n\nfunction generateMarker(map, coords) {\n return new window.google.maps.Marker({\n position: coords,\n map,\n icon: \"/img/pin.png\",\n });\n}\n\nfunction generateCircle(map, coords) {\n return new window.google.maps.Circle({\n zIndex: 10,\n strokeColor: \"#ffffff\",\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: \"#ffffff\",\n fillOpacity: 0.7,\n map,\n center: coords,\n radius: 7,\n });\n}\n\nclass MapPin extends Component {\n state = {};\n\n componentDidMount() {\n const { beachId, showInfo } = this.props;\n\n API.beaches.getById(beachId).then(({ polygons, mapInitialViewBounds }) => {\n if (!polygons || !polygons.length) {\n return showInfo({\n html: \"We are sorry, there are no available places to spot\",\n });\n }\n\n this.setState({ polygons, mapInitialViewBounds }, this.initMap);\n });\n }\n\n componentDidUpdate(prevProps) {\n const { location } = this.props;\n\n if (prevProps.location !== location) {\n this.drawPin();\n }\n }\n\n drawPin = () => {\n const { location } = this.props;\n const { marker, circle } = this.state;\n\n marker && marker.setMap(null);\n circle && circle.setMap(null);\n\n const [lat, lng] = location.replace(/[\\s()]/g, \"\").split(\",\");\n\n const coords =\n location &&\n new window.google.maps.LatLng(parseFloat(lat), parseFloat(lng));\n\n this.setState({\n marker: generateMarker(this.map, coords),\n circle: generateCircle(this.map, coords),\n });\n };\n\n initMap() {\n const { updateBookState, location, showInfo, isAdditionalOrder } =\n this.props;\n const { google } = window;\n\n const { polygons, mapInitialViewBounds } = this.state;\n\n const map = new google.maps.Map(document.getElementById(\"map\"), {\n draggable: !isAdditionalOrder,\n // disableDefaultUI: isAdditionalOrder,\n zoom: 16,\n mapTypeId: google.maps.MapTypeId.HYBRID,\n mapTypeControlOptions: {\n mapTypeIds: [],\n },\n });\n\n const bounds = new google.maps.LatLngBounds();\n\n polygons.forEach((polygon) => {\n const coordinatesObject = polygon.map((e, i) => {\n const gmCoords = new google.maps.LatLng(e[0], e[1]);\n bounds.extend(gmCoords);\n return gmCoords;\n\n // return { lat: e[0], lng: e[1] };\n });\n\n const Polygon = new google.maps.Polygon({\n paths: coordinatesObject,\n strokeColor: \"#FF007F\",\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: \"#FF007F\",\n fillOpacity: 0.35,\n });\n\n Polygon.setMap(map);\n\n if (!isAdditionalOrder) {\n Polygon.addListener(\"click\", function ({ latLng }) {\n this.lastCords = latLng;\n\n if (map.zoom < 19) {\n map.setZoom(19);\n map.setCenter(latLng);\n return;\n }\n\n updateBookState({ location: latLng.toString() });\n });\n }\n });\n\n if (location) {\n const [lat, lng] = location.replace(/[\\s()]/g, \"\").split(\",\");\n map.setCenter(new google.maps.LatLng(lat, lng));\n } else {\n try {\n const newBounds = new google.maps.LatLngBounds();\n mapInitialViewBounds.split(\";\").forEach((coords) => {\n const [lat, lng] = coords.split(\",\");\n const gmCoords = new google.maps.LatLng(\n Number(lat.trim()),\n Number(lng.trim())\n );\n newBounds.extend(gmCoords);\n });\n map.fitBounds(newBounds);\n } catch (err) {\n map.setCenter(bounds.getCenter());\n }\n }\n\n if (!isAdditionalOrder) {\n map.addListener(\"click\", function (event) {\n showInfo({\n html: \"The spot you have chosen is out of range. Please select a spot within the pink shaded area.\",\n });\n map.setCenter(this.lastCords);\n });\n }\n\n this.map = map;\n\n if (location) {\n this.drawPin();\n }\n }\n\n render() {\n const { location } = this.props;\n\n return (\n
\n
\n

Pick Your Spot

\n\n
\n

\n All locations are approximate and not guaranteed. Our Beach\n Butlers will do their best to set up your spot as close to your\n desired location as possible. Your spot will be marked with a\n numbered flag.\n

\n

\n Use the map below to let us know approximately where you want to\n sit. Simply pick your preferred location as you zoom in within the\n pink shaded area by “dropping” the blue pin.\n

\n
\n
\n\n
\n\n
\n
\n {\n this.props.changeStep(1);\n }}\n >\n Back to Dates\n \n\n {\n this.props.changeStep(3);\n }}\n >\n Next\n \n
\n
\n
\n );\n }\n}\n\nMapPin.propTypes = {\n beachId: PropTypes.string.isRequired,\n location: PropTypes.string,\n showInfo: PropTypes.func.isRequired,\n updateBookState: PropTypes.func.isRequired,\n isAdditionalOrder: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = ({ book }) => ({\n beachId: book.beach._id,\n location: book.location,\n isAdditionalOrder: !!book.additionalOrder,\n});\n\nexport default connect(mapStateToProps, { updateBookState, showInfo })(MapPin);\n","import React, { Component, useMemo } from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport classnames from \"classnames\";\nimport MaskedInput from \"react-text-mask\";\n\nimport { updateBookState } from \"actions/bookActions\";\nimport {\n validateEmail,\n validateCustomerInfo,\n validatePhone,\n validateZip\n} from \"validations\";\n\nconst phoneMask = [\n /\\d/,\n /\\d/,\n /\\d/,\n \"-\",\n /\\d/,\n /\\d/,\n /\\d/,\n \"-\",\n /\\d/,\n /\\d/,\n /\\d/,\n /\\d/\n];\n\nconst zipMask = [/\\d/, /\\d/, /\\d/, /\\d/, /\\d/];\n\nconst yearsOptions = [];\n\nfor (\n let i = new Date().getFullYear() - 100;\n i <= new Date().getFullYear() - 10;\n i++\n) {\n yearsOptions.push(i);\n}\n\nconst InputGroup = ({\n format,\n error,\n label,\n type = \"text\",\n validate,\n setError,\n name,\n required,\n onChange,\n accept,\n component: Component,\n errorMessage,\n ...props\n}) => {\n const localOnChange = useMemo(\n () => e => {\n const { value } = e.target;\n\n const formattedValue = (format && format(value)) || value;\n\n if (accept) {\n if (accept(formattedValue)) {\n onChange(name, formattedValue);\n }\n } else {\n onChange(name, formattedValue);\n }\n },\n [format, accept, onChange, name]\n );\n\n const localBlur = useMemo(\n () => e => {\n if (!validate) return;\n const isValid = validate(e.target.value);\n if (isValid) return;\n\n setError(name, errorMessage);\n },\n [validate, setError, name, errorMessage]\n );\n\n return (\n \n \n\n {Component ? (\n \n ) : (\n \n )}\n\n {!!error && {error}}\n
\n );\n};\n\nclass CustomerInfo extends Component {\n state = {\n errors: {}\n };\n\n // componentDidMount() {\n // const { book } = this.props;\n\n // if (book.customerInfo) {\n // this.setState({ customerInfo: book.customerInfo });\n // }\n // }\n\n updateInfo = (field, value) => {\n const { updateBookState, book } = this.props;\n\n updateBookState({ customerInfo: { ...book.customerInfo, [field]: value } });\n\n this.setState(state => ({\n errors: { ...state.errors, [field]: null }\n }));\n };\n\n setError = (field, error) => {\n this.setState(state => ({ errors: { ...state.errors, [field]: error } }));\n };\n\n onChangeKnowFrom = e => {\n const { updateBookState, book } = this.props;\n const val = e.target.value;\n\n const updatedCustomerInfo = { ...book.customerInfo };\n\n updatedCustomerInfo.knowFrom = val;\n\n if (val !== \"Other\") {\n updatedCustomerInfo.knowFromOther = \"\";\n }\n\n updateBookState({ customerInfo: updatedCustomerInfo });\n };\n\n render() {\n const {\n changeStep,\n updateBookState,\n book: { customerInfo, additionalOrder }\n } = this.props;\n const { errors } = this.state;\n\n const isAdditionalOrder = !!additionalOrder;\n\n const {\n knowFrom,\n knowFromOther,\n firstName,\n lastName,\n zipCode,\n birthYear,\n phone,\n email,\n agreement\n } = customerInfo;\n\n return (\n
\n

Customer Information

\n\n
\n
\n \n {\n this.updateInfo(\"firstName\", e.target.value);\n }}\n />\n
\n
\n \n {\n this.updateInfo(\"lastName\", e.target.value);\n }}\n />\n
\n\n val.length < 6}\n errorMessage=\"Zip Code is not valid\"\n />\n\n
\n \n {\n this.updateInfo(\"birthYear\", e.target.value);\n }}\n >\n {yearsOptions.map(year => (\n \n ))}\n \n
\n\n \n {/*
\n \n\n this.updateInfo('phone', value)}\n />\n
*/}\n\n \n\n \n Mobile Phone Number and Email Address will only be used for\n communication leading up to and/or during your stay if needed.\n \n\n \n
\n \n \n \n \n \n \n
\n\n {\n this.updateInfo(\"knowFromOther\", e.target.value);\n }}\n />\n\n \n {\n this.updateInfo(\"agreement\", e.target.checked);\n }}\n />\n \n I agree to the{\" \"}\n \n Beach Butler Terms & Conditions\n \n \n \n
\n\n
\n
\n {\n changeStep(3);\n }}\n >\n Back to Equipment\n \n\n {\n updateBookState({\n customerInfo\n });\n changeStep(5);\n }}\n >\n Next\n \n
\n
\n
\n );\n }\n}\n\nCustomerInfo.ptopTypes = {\n book: PropTypes.object.isRequired,\n updateBookState: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = state => ({\n book: state.book\n});\n\nexport default connect(mapStateToProps, { updateBookState })(CustomerInfo);\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport _ from \"lodash\";\n\nimport { Modal } from \"components\";\nimport classes from \"./additional-equipment.module.scss\";\n\nconst AdditionalEquipment = ({\n item,\n booked,\n changeQuantity,\n closeHandler,\n okHandler\n}) => {\n const current = _.find(booked, { _id: item._id });\n const currentQuantity = (current && current.quantity) || 0;\n\n return (\n \n
\n Do you want to add {item.name}?\n\n \n\n
\n {item.name}\n ${item.price} per pack\n\n
\n \n\n {currentQuantity}\n\n \n
\n
\n
\n \n );\n};\n\nAdditionalEquipment.propTypes = {\n item: PropTypes.object.isRequired,\n booked: PropTypes.array.isRequired,\n changeQuantity: PropTypes.func.isRequired,\n closeHandler: PropTypes.func.isRequired\n};\n\nexport default AdditionalEquipment;\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport _ from \"lodash\";\n\nimport { showInfo, closeModal } from \"actions/modalActions\";\nimport { updateBookState } from \"actions/bookActions\";\nimport AdditionalEquipment from \"./additional-equipment/additional-equipment\";\nimport API from \"api\";\n\nclass Equipment extends Component {\n state = {\n price: 0,\n inventory: [],\n availableInventory: {},\n booked: [],\n showAdditionalModal: false,\n additionalEquip: null\n };\n\n async componentDidMount() {\n const {\n book: { date, bookedEquipment },\n changeStep,\n showInfo\n } = this.props;\n\n if (!date) {\n // return to first step\n return showInfo({\n html: \"You should pick date firstly\",\n cb: () => changeStep(1)\n });\n }\n\n const inventory = await API.inventory.fetchList();\n\n this.setState(\n {\n inventory,\n booked: [...(bookedEquipment || [])]\n },\n this.getAvailableEquipment\n );\n }\n\n getAvailableEquipment = async () => {\n const {\n book: { beach, date },\n showInfo\n } = this.props;\n\n const availableInventory = await API.beaches.getAvailableInventoryForBeachByDate(\n beach._id,\n date\n );\n\n if (!availableInventory) {\n showInfo({\n html: \"Error getting status of available inventory. Please reload page\"\n });\n }\n\n this.setState(\n { availableInventory: availableInventory || {} },\n this.checkIfAllItemsAreStillAvailable\n );\n };\n\n checkIfAllItemsAreStillAvailable = cb => {\n const {\n showInfo,\n book: { date, beach },\n updateBookState\n } = this.props;\n const { booked, inventory } = this.state;\n\n if (!booked || !booked.length) return;\n\n API.beaches\n .checkIfAvailableForBook(beach._id, date, booked)\n .then(result => {\n if (!result) {\n showInfo({\n html: (\n
\n Something goes wrong.
Booked equipment will be reseted,{\" \"}\n
\n please reload page and choose again\n
\n )\n });\n\n // Reset booked equipment\n updateBookState({ bookedEquipment: [], paymentInfo: {} });\n this.setState({ booked: [] });\n cb && cb(false);\n }\n\n const { availableInventory, notEnough } = result;\n\n this.setState({\n availableInventory\n });\n\n if (notEnough.length) {\n showInfo({\n html: (\n
\n

\n We are sorry, some of equipment are booked already.
{\" \"}\n Please decrease quantity of:\n

\n\n
    \n {notEnough.map(equip => {\n const { _id, quantity } = equip;\n const item = _.find(inventory, { _id });\n\n return (\n
  • \n {item.name} by {quantity}\n
  • \n );\n })}\n
\n
\n )\n });\n\n cb && cb(false);\n } else {\n cb && cb(true);\n }\n });\n };\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.booked !== this.state.booked) {\n this.updatePrice();\n }\n }\n\n componentWillUnmount() {\n this.props.closeModal();\n }\n\n updatePrice = () => {\n const { booked, inventory } = this.state;\n\n const price = _.reduce(\n booked,\n (accum, booked) => {\n const item = _.find(inventory, { _id: booked._id });\n return accum + (item.price || 0) * booked.quantity;\n },\n 0\n );\n\n this.setState({ price });\n };\n\n changeQuantity = (equipmentId, diff) => {\n const { showInfo } = this.props;\n const { booked, availableInventory, inventory } = this.state;\n\n const bookedItem = _.find(booked, { _id: equipmentId }) || {\n _id: equipmentId,\n quantity: 0\n };\n\n const previousQty = bookedItem.quantity;\n\n const newCount = previousQty + diff;\n\n const withoutCurrent = _.reject(booked, { _id: equipmentId });\n\n if (newCount <= 0) {\n // Check if has related items\n const relatedIDs = _.filter(inventory, { relatedTo: equipmentId }).map(\n i => i._id\n );\n\n const withoutCurrentAndRelated = _.filter(\n withoutCurrent,\n item => !relatedIDs.includes(item._id)\n );\n\n return this.setState({ booked: withoutCurrentAndRelated });\n }\n\n let available = availableInventory[equipmentId] || 0;\n\n if (newCount > available && newCount > previousQty) {\n return showInfo({\n html:\n available !== 0 && available !== \"0\" ? (\n \n Maximum available for today is: {available}\n \n ) : (\n \n We are sorry, we are sold out of this item today. Please try a\n different item or a different day.\n \n )\n });\n }\n\n this.setState({\n booked: [...withoutCurrent, { ...bookedItem, quantity: newCount }]\n });\n };\n\n triggerAdditionalModal = equip => {\n const currentQty = this.getCurrentQtyOfEquip(equip._id);\n\n this.setState({\n showAdditionalModal: true,\n additionalEquip: equip,\n additionalEquipInitialValue: currentQty\n });\n };\n\n getCurrentQtyOfEquip = _id => {\n const { booked } = this.state;\n const current = _.find(booked, { _id });\n const currentQty = (current && current.quantity) || 0;\n return currentQty;\n };\n\n cancelAdditionalModal = () => {\n const { additionalEquipInitialValue, additionalEquip } = this.state;\n const currentQty = this.getCurrentQtyOfEquip(additionalEquip._id);\n\n this.changeQuantity(\n additionalEquip._id,\n additionalEquipInitialValue - currentQty\n );\n this.closeAdditionalModal();\n };\n\n closeAdditionalModal = () => {\n this.setState({\n showAdditionalModal: false,\n additionalEquip: null,\n additionalEquipInitialValue: 0\n });\n };\n\n goNext = () => {\n const { updateBookState, changeStep } = this.props;\n const { booked } = this.state;\n\n // Check if inventory is still available\n this.checkIfAllItemsAreStillAvailable(isAvailable => {\n if (isAvailable) {\n updateBookState({ bookedEquipment: booked, paymentInfo: {} });\n changeStep(4);\n }\n });\n };\n\n render() {\n const { changeStep } = this.props;\n const { showAdditionalModal, additionalEquip, booked, price } = this.state;\n\n return (\n <>\n
\n

Choose Beach Butler Equipment

\n
\n

All prices include setup, delivery and pick up.

\n
\n\n {this.renderInventory()}\n
\n\n {showAdditionalModal && (\n \n )}\n\n
\n
\n {\n changeStep(2);\n }}\n >\n Back to Map\n \n\n
\n
\n {booked.length}\n
\n total sum${price || 0}\n
\n\n \n Next\n \n
\n
\n \n );\n }\n\n renderInventory = () => {\n const { booked, inventory } = this.state;\n\n return (\n
    \n {inventory.map(item => {\n if (item.relatedTo) return null;\n\n const relatedItems = _.filter(inventory, { relatedTo: item._id });\n\n const bookedItem = _.find(booked, { _id: item._id });\n const bookedCount = (bookedItem && bookedItem.quantity) || 0;\n\n return (\n
  • \n \n\n {item.name}\n\n
    \n \n ${item.price} per day\n \n\n
    \n \n\n {bookedCount}\n\n \n
    \n
    \n\n {!!bookedCount && !!relatedItems.length && (\n
    \n {relatedItems.map(additionalItem => (\n \n this.triggerAdditionalModal(additionalItem)\n }\n >\n + {additionalItem.name}\n \n ))}\n
    \n )}\n
  • \n );\n })}\n
\n );\n };\n}\n\nEquipment.propTypes = {\n book: PropTypes.object.isRequired,\n updateBookState: PropTypes.func.isRequired,\n showInfo: PropTypes.func.isRequired,\n closeModal: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = ({ book }) => ({\n book\n});\n\nexport default connect(mapStateToProps, {\n updateBookState,\n showInfo,\n closeModal\n})(Equipment);\n","export const validateZip = zip => /(^\\d{5})$/.test(zip);\n\nexport const validatePhone = phone =>\n !!phone.match(/^(\\+?\\d{10}|\\+?\\d{3}-\\d{3}-\\d{4})$/);\n\nexport const validateEmail = email =>\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/i.test(\n email\n );\n\nexport const validateCustomerInfo = info => {\n return !!(\n info.firstName &&\n info.lastName &&\n info.zipCode &&\n validateZip(info.zipCode) &&\n info.birthYear &&\n info.phone &&\n validatePhone(info.phone) &&\n info.email &&\n validateEmail(info.email) &&\n info.knowFrom &&\n (info.knowFrom !== 'Other' || info.knowFromOther) &&\n info.agreement\n );\n};\n\nexport { default as getValidateFunc } from './get-validate-func';\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\nimport _ from \"lodash\";\n\nimport API from \"api\";\nimport { updateBookState } from \"actions/bookActions\";\n\nclass Summary extends Component {\n state = {\n amount: 0,\n tax: 0,\n totalAmount: 0,\n };\n\n componentDidMount() {\n Promise.all([\n API.inventory.fetchList(),\n API.beaches.getById(this.props.book.beach._id),\n ]).then((results) => {\n const [list, beach] = results;\n this.setState(\n { inventory: list, beachTax: beach.tax, beachPolygons: beach.polygons },\n this.updatePrice\n );\n this.initMap();\n });\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { book } = this.props;\n const { inventory } = this.state;\n\n if (\n prevProps.book.bookedEquipment !== book.bookedEquipment ||\n prevState.inventory !== inventory\n ) {\n this.updatePrice();\n }\n }\n\n updatePrice = () => {\n const {\n book: { bookedEquipment },\n } = this.props;\n const { inventory, beachTax } = this.state;\n\n const amount = _.reduce(\n bookedEquipment,\n (accum, booked) => {\n const item = _.find(inventory, { _id: booked._id });\n return accum + (item.price || 0) * booked.quantity;\n },\n 0\n );\n\n const tax = parseFloat(((amount * beachTax) / 100).toFixed(2));\n const totalAmount = parseFloat((amount + tax).toFixed(2));\n\n this.setState({ amount, tax, totalAmount });\n };\n\n initMap = () => {\n const { book } = this.props;\n const { google } = window;\n\n const [lat, lng] = book.location.replace(/[\\s()]/g, \"\").split(\",\");\n\n let lastCords = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));\n\n const map = new google.maps.Map(document.getElementById(\"map\"), {\n center: lastCords,\n zoom: 16,\n mapTypeId: \"satellite\",\n draggable: false,\n disableDefaultUI: true,\n mapTypeControlOptions: {\n mapTypeIds: [],\n },\n });\n\n this.state.beachPolygons.forEach((polygon, pi) => {\n let coordinatesObject = polygon.map((e, i) => {\n return { lat: e[0], lng: e[1] };\n });\n\n const poly = new google.maps.Polygon({\n paths: coordinatesObject,\n strokeColor: \"#FF007F\",\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: \"#FF007F\",\n fillOpacity: 0.35,\n });\n\n poly.setMap(map);\n });\n\n new google.maps.Marker({\n position: lastCords,\n map: map,\n icon: \"img/pin.png\",\n });\n\n new google.maps.Circle({\n strokeColor: \"#ffffff\",\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: \"#ffffff\",\n fillOpacity: 0.7,\n map: map,\n center: lastCords,\n radius: 7,\n });\n };\n\n render() {\n const { book, updateBookState } = this.props;\n const { totalAmount, amount, inventory } = this.state;\n\n const { customerInfo, additionalOrder } = book;\n\n if (!inventory) return null;\n\n return (\n <>\n
\n

Summary

\n\n {this.renderEquipmentTable()}\n\n
\n {\n this.props.changeStep(3);\n }}\n >\n \"\"\n Edit Equipment\n \n
\n\n
\n
\n

\n \"\"\n Customer Info\n

\n
\n \n \n {customerInfo.firstName} {customerInfo.lastName}\n \n \n {customerInfo.zipCode}\n \n {customerInfo.birthYear}\n \n {customerInfo.phone}\n \n {customerInfo.email}\n
\n {!additionalOrder && (\n {\n this.props.changeStep(4);\n }}\n >\n \"\"\n edit\n \n )}\n
\n
\n

\n \"\"\n Date\n

\n\n
\n \n {book.date}\n \n {book.arrivalTime}\n \n {book.departureTime}\n
\n\n {!additionalOrder && (\n {\n this.props.changeStep(1);\n }}\n >\n \"\"\n edit\n \n )}\n
\n
\n

\n \"\"\n Location\n

\n\n
\n \n {book.beach.name}\n
\n\n
\n\n {!additionalOrder && (\n {\n this.props.changeStep(2);\n }}\n >\n \"\"\n edit\n \n )}\n
\n
\n
\n
\n
\n {\n this.props.changeStep(4);\n }}\n >\n Back to Customer Information\n \n {\n updateBookState({ paymentInfo: { amount } });\n this.props.changeStep(6); // payment\n }}\n >\n Next\n \n
\n
\n \n );\n }\n\n renderEquipmentTable = () => {\n const {\n book: { bookedEquipment },\n updateBookState,\n } = this.props;\n const { inventory, amount, tax, totalAmount } = this.state;\n\n if (!inventory) return;\n\n return (\n \n \n \n \n \n \n \n \n\n {bookedEquipment.map((equip) => {\n const inventoryItem = _.find(inventory, { _id: equip._id });\n const price = (inventoryItem.price * equip.quantity).toFixed(2);\n\n return (\n \n \n\n \n\n \n\n \n \n );\n })}\n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n
EquipmentQuantityPrice
\n \n {inventoryItem.name}\n \n {equip.quantity}\n $ {price}\n {\n const relatedItemsIDs = _.filter(inventory, {\n relatedTo: equip._id,\n }).map((i) => i._id);\n\n updateBookState({\n bookedEquipment: bookedEquipment.filter(\n (i) =>\n i._id !== equip._id &&\n !relatedItemsIDs.includes(i._id)\n ),\n });\n }}\n >\n \"\"\n \n
Subtotal$ {amount.toFixed(2)}
MA State Sales Tax$ {tax.toFixed(2)}
Total$ {totalAmount.toFixed(2)}
\n );\n };\n}\n\nSummary.propTypes = {\n book: PropTypes.object.isRequired,\n updateBookState: PropTypes.func.isRequired,\n};\n\nconst mapStateToProps = ({ book }) => ({\n book,\n});\n\nexport default connect(mapStateToProps, { updateBookState })(Summary);\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport { compose } from \"redux\";\nimport PropTypes from \"prop-types\";\nimport axios from \"axios\";\nimport dropin from \"braintree-web-drop-in\";\n\nimport API from \"api\";\nimport { Spinner } from \"components\";\nimport { updateBookState } from \"actions/bookActions\";\nimport { showPrompt, showInfo } from \"actions/modalActions\";\n\nclass Payment extends Component {\n state = {\n paymentBoxReady: false,\n\n processing: false,\n modalText: \"Wait, processing your reservation..\",\n showModalClose: false\n };\n\n componentDidMount() {\n const {\n book: { beach }\n } = this.props;\n\n this.createDropInUI();\n\n API.beaches.getTax(beach._id).then(beachTax => {\n this.setState({ beachTax }, this.calculateTotal);\n });\n }\n\n componentDidUpdate(prevProps) {\n const { paymentInfo } = this.props.book;\n\n if (prevProps.book.paymentInfo !== paymentInfo) {\n this.calculateTotal();\n }\n }\n\n calculateTotal = () => {\n const { beachTax } = this.state;\n const {\n updateBookState,\n book: { paymentInfo }\n } = this.props;\n\n const { amount, discountValue, totalAmount, withoutTax } = paymentInfo;\n\n const discountAmount = discountValue\n ? parseFloat((amount * (discountValue / 100)).toFixed(2))\n : 0;\n const newWithoutTax = parseFloat((amount - discountAmount).toFixed(2));\n const taxAmount = parseFloat((newWithoutTax * (beachTax / 100)).toFixed(2));\n const newTotalAmount = parseFloat((newWithoutTax + taxAmount).toFixed(2));\n\n if (newTotalAmount !== totalAmount || withoutTax !== newWithoutTax) {\n const newPaymentInfo = {\n ...paymentInfo,\n discountAmount,\n taxAmount,\n withoutTax: newWithoutTax,\n totalAmount: newTotalAmount\n };\n\n updateBookState({ paymentInfo: newPaymentInfo });\n }\n };\n\n addDiscount = e => {\n e.preventDefault();\n const { showPrompt, updateBookState, book, showInfo } = this.props;\n\n showPrompt({\n html: `Enter promo code:`,\n underInputHtml: `Code is case sensitive`\n }).then(code => {\n if (!code || !code.trim().length) {\n return;\n }\n\n // Check Discount Code\n axios\n .get(`/api/discounts/check-discount/${code.trim()}`)\n .then(res => {\n const { data: discount } = res;\n\n updateBookState({\n paymentInfo: {\n ...book.paymentInfo,\n discountId: discount._id,\n discountCode: discount.code,\n discountValue: discount.value\n }\n });\n })\n .catch(err => {\n const {\n response: { data }\n } = err;\n\n showInfo({\n isError: true,\n html: (\n

\n {data && data.message ? data.message : \"Server Error\"}\n

\n )\n });\n console.log(err);\n });\n });\n };\n\n deleteDiscount = e => {\n e && e.preventDefault && e.preventDefault();\n\n const { updateBookState, book } = this.props;\n\n const paymentInfo = { ...book.paymentInfo };\n delete paymentInfo.discountId;\n delete paymentInfo.discountCode;\n delete paymentInfo.discountValue;\n updateBookState({ paymentInfo });\n };\n\n createDropInUI = () => {\n // if (this.braintreeInstance) {\n // this.braintreeInstance.teardown();\n // }\n\n axios\n .get(\"/api/reservations/get-braintree-token\")\n .then(res => {\n const { data: token } = res;\n dropin.create(\n {\n authorization: token,\n container: \"#dropin-container\",\n paypal: {\n flow: 'vault'\n },\n card: {\n overrides: {\n fields: {\n cvv: {\n // type: 'password',\n maskInput: true\n }\n }\n }\n }\n },\n (createErr, instance) => {\n if (createErr) {\n console.log(createErr);\n return;\n // return showInfo({\n // html: \"Error while creating payment container\"\n // });\n }\n\n this.braintreeInstance = instance;\n this.setState({ paymentBoxReady: true });\n }\n );\n })\n .catch(err => {\n console.log(err);\n });\n };\n\n confirmReservation = e => {\n e && e.preventDefault && e.preventDefault();\n\n const { book, showInfo, changeStep, updateBookState } = this.props;\n\n this.braintreeInstance.requestPaymentMethod((err, payload) => {\n if (err) {\n console.log(\"err\", err);\n return;\n }\n\n this.setState({ processing: true });\n\n axios\n .post(\n \"/api/reservations/create-reservation\",\n {\n book,\n paymentMethodNonce: payload.nonce\n },\n { timeout: 45000 }\n )\n .then(res => {\n this.braintreeInstance.teardown();\n this.setState({ processing: false });\n\n if (res.data.success) {\n // Update Book State\n updateBookState(res.data.reservation);\n // Go to Thank You Page\n changeStep(7);\n }\n })\n .catch(err => {\n this.braintreeInstance.teardown();\n this.setState({ processing: false });\n\n this.createDropInUI();\n\n const message =\n (err.response && err.response.data && err.response.data.message) ||\n \"Something goes wrong. Please try again\";\n\n showInfo({ html: message, isError: true });\n });\n });\n };\n\n render() {\n const { paymentBoxReady, processing } = this.state;\n\n const {\n book: { paymentInfo },\n changeStep\n } = this.props;\n\n const {\n amount,\n discountCode,\n withoutTax,\n totalAmount,\n discountAmount,\n taxAmount,\n discountValue,\n discountId\n } = paymentInfo;\n\n return (\n <>\n \n \n \n

Payment

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Equipment${amount.toFixed(2)}
\n Promo Code{\" \"}\n {discountId ? (\n <>\n \n ({discountCode} - {discountValue}%)\n \n \n ✘\n \n \n ) : (\n \"\"\n )}\n \n {discountId && discountAmount ? (\n `- $${discountAmount.toFixed(2)}`\n ) : (\n \n Add\n \n )}\n
Subtotal${withoutTax && withoutTax.toFixed(2)}
Tax${taxAmount && taxAmount.toFixed(2)}
Total${totalAmount && totalAmount.toFixed(2)}
\n\n
\n \n\n
\n
\n {\n changeStep(5);\n }}\n >\n Back to Summary\n \n {\n this.confirmReservation();\n }}\n >\n Submit\n \n
\n
\n \n );\n }\n}\n\nPayment.propTypes = {\n book: PropTypes.object.isRequired,\n updateBookState: PropTypes.func.isRequired,\n showPrompt: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = ({ book }) => ({\n book\n});\n\nexport default compose(\n connect(mapStateToProps, { updateBookState, showPrompt, showInfo })\n)(Payment);\n","import React, { Component } from 'react';\nimport { Link, Redirect } from 'react-router-dom';\nimport { connect } from 'react-redux';\n\nimport { resetBookState } from 'actions/bookActions';\n\nclass Thanks extends Component {\n componentWillUnmount() {\n const { resetBookState } = this.props;\n\n resetBookState();\n }\n\n render() {\n const { book } = this.props;\n\n if (!book || !book.reservationNumber) {\n return ;\n }\n\n return (\n
\n

THANK YOU

\n \n \n {book.reservationNumber}\n \n {book.date}\n \n \n\n Back to Site\n
\n );\n }\n}\n\nconst mapStateToProps = ({ book }) => ({\n book\n});\n\nexport default connect(\n mapStateToProps,\n { resetBookState }\n)(Thanks);\n","import React, { Component } from \"react\";\nimport { connect } from \"react-redux\";\nimport PropTypes from \"prop-types\";\n\nimport ChooseBeach from \"./steps/choose-beach\";\nimport DateTime from \"./steps/date-time\";\nimport MapPin from \"./steps/map-pin\";\nimport Equipment from \"./steps/equipment/equipment\";\nimport CustomerInfo from \"./steps/customer-info\";\nimport Summary from \"./steps/summary\";\nimport Payment from \"./steps/payment\";\nimport Thanks from \"./steps/thanks\";\nimport { updateBookState } from \"actions/bookActions\";\n\nconst steps = [\n ChooseBeach,\n DateTime,\n MapPin,\n Equipment,\n CustomerInfo,\n Summary,\n Payment,\n Thanks\n];\n\nclass BookNow extends Component {\n componentDidUpdate(prevProps) {\n if (prevProps.currentStep !== this.props.currentStep) {\n window.scrollTo(0, 0);\n }\n }\n\n changeStep = currentStep => {\n this.props.updateBookState({ currentStep });\n };\n\n render() {\n let StepPage = null;\n const { currentStep } = this.props;\n\n StepPage = steps[currentStep];\n\n if (!StepPage) {\n alert(\"No Step\");\n return null;\n }\n\n return (\n
\n {StepPage && }\n
\n );\n }\n}\n\nBookNow.propTypes = {\n currentStep: PropTypes.number,\n updateBookState: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = ({ book }) => ({\n currentStep: book.currentStep\n});\n\nexport default connect(mapStateToProps, { updateBookState })(BookNow);\n","import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport axios from \"axios\";\nimport { connect } from \"react-redux\";\n\nimport { showInfo } from \"actions/modalActions\";\nimport { Spinner } from \"components\";\n\nclass ContactUs extends Component {\n state = {\n email: \"\",\n message: \"\",\n subject: \"\",\n sendingEmail: false,\n };\n\n resetFields = () => {\n this.setState({ email: \"\", message: \"\", subject: \"\" });\n };\n\n submitHandler = (e) => {\n e && e.preventDefault();\n\n const { showInfo } = this.props;\n\n this.setState({ sendingEmail: true });\n\n axios.post(\"/api/contact\", this.state).then((response) => {\n let message;\n\n if (response.data.success) {\n this.resetFields();\n\n message =\n \"Thank you for reaching out to us. A Beach Butler will get back to you soon!\";\n } else {\n message =\n \"There was an issue while sending email, please check all fields and try again\";\n }\n\n this.setState({ sendingEmail: false });\n\n showInfo({\n html:
{message}
,\n });\n });\n };\n\n updateValue = (field, val) => {\n this.setState({ [field]: val });\n };\n\n render() {\n const { email, subject, message, sendingEmail } = this.state;\n\n return (\n <>\n \n\n
\n
\n

Contact Us

\n \n Phone: 1-800-712-8708\n \n \n Email: \n \n \n this.updateValue(\"email\", e.target.value)}\n className=\"email\"\n type=\"email\"\n required\n />\n \n this.updateValue(\"subject\", e.target.value)}\n className=\"subject\"\n required\n />\n \n this.updateValue(\"message\", e.target.value)}\n className=\"message\"\n required\n >\n \n \n
\n \n );\n }\n}\n\nContactUs.propTypes = {\n showInfo: PropTypes.func.isRequired,\n};\n\nexport default connect(null, { showInfo })(ContactUs);\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport API from \"api\";\n\nexport default class Equipment extends React.Component {\n state = {\n list: null,\n };\n\n componentDidMount() {\n API.inventory.fetchList().then((list) => {\n this.setState({ list });\n });\n }\n\n render() {\n const { list } = this.state;\n\n return (\n
\n

\n All prices include delivery, setup and pick up.\n

\n\n
    \n {list &&\n list.map((equip) => {\n let price = `${equip.price} per day`;\n\n if (equip.name.toLowerCase() === \"ice\") {\n price = `${equip.price} per pack`;\n }\n\n return (\n
  • \n \n
    \n {equip.name}\n \n {equip.description}\n Book\n\n {/* */}\n
    \n
  • \n );\n })}\n
\n
\n );\n }\n}\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport default class FAQ extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n active: 0,\n };\n }\n\n changeSection(number) {\n console.log(number);\n if (this.state.active === number) this.setState({ active: 0 });\n else this.setState({ active: number });\n }\n\n render() {\n const { active } = this.state;\n\n return (\n
\n

Frequently Asked Questions

\n
\n
ARRIVAL & DEPARTURE
\n {\n this.changeSection(1);\n }}\n >\n \n \n No, there is no need to check in with the Beach Butler when you\n arrive at the beach. Simply make your way to the beach without\n lugging all the heavy equipment! Once you are settled your Beach\n Butler will check in on you to ensure you have everything you\n need. After that initial check in, your Beach Butler will only\n approach you if you raise your flag.\n \n
\n {\n this.changeSection(2);\n }}\n >\n \n \n When you arrive on the beach, look for a Beach Butler flag with\n your Flag ID number on it. We will do our best to setup your spot\n as close to the location you pinned on the map as possible.\n \n \n {\n this.changeSection(3);\n }}\n >\n \n \n You are welcome to move your location within a reasonable\n distance, but just be sure to let us know by emailing{\" \"}\n info@mybeachbutler.com so we can be\n sure to find your equipment for pickup at the end of the day.\n Also, we recommend that you allow a Butler to help you move your\n umbrella if you have rented one. Simply raise your flag and we’ll\n stop by as soon as possible.\n \n \n {\n this.changeSection(4);\n }}\n >\n \n \n Unfortunately, we are not permitted to serve any food or drink at\n this time.\n \n \n {\n this.changeSection(5);\n }}\n >\n \n \n No. You are welcome to leave as soon as you’re ready. A Butler\n will be around to clean up your equipment at the time you indicate\n on your reservation. If you leave earlier or decide to stay later,\n it is not a problem. We do, however, collect all equipment by\n 5:00pm.\n \n \n
RESERVATIONS
\n {\n this.changeSection(6);\n }}\n >\n \n \n A Beach Butler will check in with you soon after you arrive to\n make sure your order is correct. If you need service more\n urgently, you have two options: raise your flag and your Butler\n will approach and/or please email us at{\" \"}\n info@mybeachbutler.com.\n \n \n {\n this.changeSection(7);\n }}\n >\n \n \n The Beach Butler is here to make your beach visit as enjoyable as\n possible. If you would like to add something to your existing\n reservation (cooler, umbrella, more towels or chairs, etc.), you\n can use the link provided in your confirmation email. You will\n need to follow that link and enter your Order ID (not your Flag\n ID) and then you can add equipment.\n \n \n {\n this.changeSection(8);\n }}\n >\n \n \n We determined we will not be doing multiple day reservations at\n this time. The workflow was clunky and we decided not to put\n time/resources into making it better (yet).\n \n \n {\n this.changeSection(9);\n }}\n >\n \n \n Currently, the Beach Butler equipment is offered a la carte.\n However, we do plan to offer packages in the future. We also are\n considering a membership plan for people who visit Salisbury Beach\n often. If you are interested, we would love to hear from you.\n Please email us at{\" \"}\n info@mybeachbutler.com.\n \n \n {\n this.changeSection(10);\n }}\n >\n \n \n If you need to change your dates or remove items from your\n reservation, please email us at{\" \"}\n info@mybeachbutler.com. Please\n provide changes before 6:00 pm the day before your reservation.\n \n \n {\n this.changeSection(11);\n }}\n >\n \n \n We understand plans (and weather!) can change. If you need to\n cancel, please email us at{\" \"}\n info@mybeachbutler.com.  Please\n contact us by 6:00 pm the day before your reservation and we can\n process a refund. Unfortunately, we cannot accept cancellations\n after 6:00 pm the day before, or on the day of the reservation.\n \n \n
ISSUES
\n {\n this.changeSection(12);\n }}\n >\n \n \n We strongly recommend arriving as early as possible to ensure you\n can find parking. The beach parking lots fill up very quickly,\n especially on nice weather days and holidays. Unfortunately, the\n inability to find parking is not a condition in which we can\n provide a refund. Uber is always another option and can make going\n to the beach even easier!\n \n \n {\n this.changeSection(13);\n }}\n >\n \n \n Unfortunately, we cannot provide refunds for inclement weather. We\n recommend checking the weather in advance of your reservation and\n if bad weather is expected, we will accept cancellations the day\n prior, up to 6:00 pm. Please email us at{\" \"}\n info@mybeachbutler.com.\n \n \n {\n this.changeSection(14);\n }}\n >\n \n \n Please notify the Beach Butler at{\" \"}\n info@mybeachbutler.com if something\n breaks or gets lost. You are liable for the cost of the equipment\n if at fault. We review inventory at the end of every day, and will\n notify you if there is a discrepancy or issue.\n \n \n \n
\n );\n }\n}\n","import React, { useEffect } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nconst Home = () => {\n useEffect(() => {\n window.scrollTo(0, 0);\n delete localStorage.additionalOrderId;\n }, []);\n\n return (\n
\n
\n
\n

The Beach, Made Easy

\n\n

\n Enjoy the beach to the fullest while the Beach Butler does the heavy\n lifting.\n

\n\n \n Book Now\n \n
\n
\n\n
\n
\n
\n
\n

Maximize your beach experience with us

\n \n Tired of lugging endless supplies to the beach? Let the Beach\n Butler do the heavy lifting for you. We’re here to make your\n beach experience as enjoyable as possible by renting chairs,\n umbrellas, towels, coolers, games and more. Simply let us know\n where you want to sit, what equipment you want to have there and\n we’ll take care of the rest.\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 1

\n

Make a reservation

\n \n Let us know what day and time you plan to arrive, approximately\n where you want to sit on the beach and what equipment you’d like\n to have setup.{\" \"}\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 2

\n

Arrive and enjoy

\n \n Prior to your arrival, a Beach Butler will setup your area with\n your rental equipment. We’ll mark it with an easy to find flag.\n A Beach Butler will check on you to make sure you have\n everything you need.\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 3

\n

Depart worry-free

\n \n When you’re ready to leave, just pack yourselves up and leave\n the rental equipment. A Beach Butler will swing by to clean it\n all up.\n \n
\n
\n
\n \"\"\n
\n
\n
\n\n
\n

The beach shouldn’t be stressful, it should be fun!

\n
\n
\n );\n};\n\nexport default Home;\n","import React from \"react\";\n\nexport default class HowTo extends React.Component {\n render() {\n return (\n
\n
\n
\n
\n
\n

Maximize your beach experience with us

\n \n Tired of lugging endless supplies to the beach? Let the Beach\n Butler do the heavy lifting for you. We’re here to make your\n beach experience as enjoyable as possible by renting chairs,\n umbrellas, towels, coolers, games and more. Simply let us know\n where you want to sit, what equipment you want to have there\n and we’ll take care of the rest.\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 1

\n

Make a reservation

\n \n Let us know what day and time you plan to arrive,\n approximately where you want to sit on the beach and what\n equipment you’d like to have setup.{\" \"}\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 2

\n

Arrive and enjoy

\n \n Prior to your arrival, a Beach Butler will setup your area\n with your rental equipment. We’ll mark it with an easy to find\n flag. A Beach Butler will check on you to make sure you have\n everything you need.\n \n
\n
\n
\n \"\"\n
\n
\n\n
\n
\n
\n

STEP 3

\n

Depart worry-free

\n \n When you’re ready to leave, just pack yourselves up and leave\n the rental equipment. A Beach Butler will swing by to clean it\n all up.\n \n
\n
\n
\n \"\"\n
\n
\n
\n
\n

The beach shouldn’t be stressful, it should be fun!

\n
\n
\n );\n }\n}\n","import React, { Component } from \"react\";\n\nimport API from \"api\";\n\nclass Testimonials extends Component {\n state = {\n testimonials: null,\n };\n\n componentDidMount() {\n API.testimonials.fetchList().then((list) => {\n this.setState({ testimonials: list });\n });\n }\n\n render() {\n const { testimonials } = this.state;\n\n return (\n
\n

Reviews

\n\n
\n {testimonials &&\n testimonials.map((testimonial) => {\n return (\n
\n {testimonial.text}\n
\n );\n })}\n
\n
\n );\n }\n}\n\nexport default Testimonials;\n","import React from \"react\";\n\nexport default class PrivacyPolicy extends React.Component {\n render() {\n return (\n
\n
\n

Privacy Policy

\n Privacy NoticeThis privacy notice discloses the\n privacy practices for www.mybeachbutler.com. This privacy notice\n applies solely to information collected by this website. It will\n notify you of the following:\n
    \n
  1. \n What personally identifiable information is collected from you\n through the website, how it is used and with whom it may be\n shared.\n
  2. \n
  3. \n What choices are available to you regarding the use of your data.\n
  4. \n
  5. \n The security procedures in place to protect the misuse of your\n information.\n
  6. \n
  7. How you can correct any inaccuracies in the information.
  8. \n
\n Information Collection, Use, and Sharing\n We are the sole owners of the information collected on this site. We\n only have access to/collect information that you voluntarily give us\n via email or other direct contact from you. We will not sell or rent\n this information to anyone. We will use your information to respond to\n you, regarding the reason you contacted us. We will not share your\n information with any third party outside of our organization, other\n than as necessary to fulfill your request, e.g. to ship an order.\n Unless you ask us not to, we may contact you via email in the future\n to tell you about specials, new products or services, or changes to\n this privacy policy.\n Your Access to and Control Over InformationYou may\n opt out of any future contacts from us at any time. You can do the\n following at any time by contacting us via email at\n info@mybeachbutler.com:\n
    \n
  • See what data we have about you, if any.
  • \n
  • Change/correct any data we have about you.
  • \n
  • Have us delete any data we have about you.
  • \n
  • Express any concern you have about our use of your data.
  • \n
\n SecurityWe take precautions to protect your\n information. When you submit sensitive information via the website,\n your information is protected both online and offline. Wherever we\n collect sensitive information (such as credit card data), that\n information is encrypted and transmitted to us in a secure way. You\n can verify this by looking for a lock icon in the address bar and\n looking for \"https\" at the beginning of the address of the Web page.\n While we use encryption to protect sensitive information transmitted\n online, we also protect your information offline. Only employees who\n need the information to perform a specific job (for example, billing\n or customer service) are granted access to personally identifiable\n information. The computers/servers in which we store personally\n identifiable information are kept in a secure environment.\n OrdersWe request information from you on our order\n form. To buy from us, you must provide contact information (like name\n and address) and financial information (like credit card number,\n expiration date). This information is used for billing purposes and to\n fill your orders. If we have trouble processing an order, we'll use\n this information to contact you.\n \n If you feel that we are not abiding by this privacy policy, you\n should contact us immediately at info@mybeachbutler.com.\n \n
\n
\n );\n }\n}\n","import React from \"react\";\nimport { Provider } from \"react-redux\";\nimport { Route, Switch, BrowserRouter, Redirect } from \"react-router-dom\";\n\nimport store from \"./store\";\nimport { Modals, Navigation, Footer } from \"components\";\nimport ScrollToTop from \"components/ScrollToTop\";\n\nimport {\n FAQ,\n Home,\n HowTo,\n BookNow,\n Pricing,\n ContactUs,\n PrivacyPolicy,\n AdditionalOrder,\n Testimonials,\n} from \"pages\";\nimport { updateBookState, resetBookState } from \"actions/bookActions\";\n\nimport \"normalize.css\";\nimport \"react-day-picker/lib/style.css\";\nimport \"./scss/styles.scss\";\n\nconst localBookState = localStorage.getItem(\"bookState\");\n\nif (localBookState) {\n const booksState = JSON.parse(localBookState);\n\n if (booksState._id) {\n // Completed Order\n store.dispatch(resetBookState());\n } else {\n let lastUpdate = localStorage.getItem(\"lastUpdate\");\n lastUpdate = lastUpdate && new Date(lastUpdate);\n\n console.log(lastUpdate);\n\n // If last update was less than 15 min ago, then restore data\n if (lastUpdate && lastUpdate.valueOf() + 15 * 60 * 1000 > new Date()) {\n store.dispatch(updateBookState(booksState));\n }\n }\n}\n\nfunction App() {\n return (\n \n \n \n
\n \n\n
\n \n\n \n \n\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n\n
\n \n \n
\n
\n
\n
\n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"overlay\":\"Modal_overlay__1TgzI\",\"modal\":\"Modal_modal__1vwov\",\"title\":\"Modal_title__1gczl\",\"closeBtn\":\"Modal_closeBtn__iRFW-\",\"actions\":\"Modal_actions__34qLX\",\"cancelButton\":\"Modal_cancelButton__2fhNa\",\"error\":\"Modal_error__3nKe3\",\"okButton\":\"Modal_okButton__azkRZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"additional-equipment_wrapper__1i6rG\",\"lead\":\"additional-equipment_lead__1aLDG\",\"img\":\"additional-equipment_img__189du\",\"text\":\"additional-equipment_text__2Qqw3\",\"quantity\":\"additional-equipment_quantity__3LlwQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"promptField\":\"Modals_promptField__36tF1\"};"],"sourceRoot":""}