{"version":3,"file":"js/store_v2-f757f86e46b440f9d24f.js","mappings":"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","sources":["webpack://booqable/./webpack/shared/cookie_notice.js","webpack://booqable/./webpack/shared/image_focus.js","webpack://booqable/./webpack/shared/user_framework.js","webpack://booqable/./webpack/store/v2/application.js","webpack://booqable/./webpack/store/v2/globals.js","webpack://booqable/./webpack/shared/utils/get_fingerprint.js","webpack://booqable/./webpack/store/v2/redux/actions/locale.js","webpack://booqable/./webpack/store/v2/api.js","webpack://booqable/./webpack/shared/utils/cart.js","webpack://booqable/./webpack/store/v2/redux/actions/cart.js","webpack://booqable/./webpack/shared/utils/getBrandingColor.js","webpack://booqable/./webpack/store/v2/redux/actions/client.js","webpack://booqable/./webpack/store/v2/redux/actions/item.js","webpack://booqable/./webpack/store/v2/redux/actions/bundle.js","webpack://booqable/./webpack/store/v2/redux/actions/product_group.js","webpack://booqable/./webpack/store/v2/get_provider.js","webpack://booqable/./webpack/shared/utils/userFrameworkEvents.js","webpack://booqable/./webpack/store/v2/react/blocks/Period/styles.js","webpack://booqable/./webpack/store/v2/react/blocks/Period/index.js","webpack://booqable/./webpack/store/v2/react/scenes/cart/period.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart/line.jsx","webpack://booqable/./webpack/store/v2/react/components/delay.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Logo.jsx","webpack://booqable/./webpack/shop-components/components/PoweredBy/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart/lines.jsx","webpack://booqable/./webpack/store/v2/react/components/product_price.jsx","webpack://booqable/./webpack/store/blocks/Services/styles.js","webpack://booqable/./webpack/store/blocks/Services/index.js","webpack://booqable/./webpack/store/components/Services/Service.jsx","webpack://booqable/./webpack/store/components/Services/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart/blocks/Overdue/index.js","webpack://booqable/./webpack/store/v2/react/scenes/cart/components/Overdue/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart/components/FloatingCart/index.jsx","webpack://booqable/./webpack/store/blocks/Modal/index.js","webpack://booqable/./webpack/store/components/Modal.jsx","webpack://booqable/./webpack/shared/utils/useLockScroll.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/UserAddressesSelect.jsx","webpack://booqable/./webpack/store/modules/cart/CartPicker/DeliveryFulfillmentForm.jsx","webpack://booqable/./webpack/shared/utils/useCachedQuery.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/requests.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/Provider.jsx","webpack://booqable/./webpack/store/modules/cart/CartPicker/hooks.js","webpack://booqable/./webpack/shared/utils/useSearchParam.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/FulfillmentType.jsx","webpack://booqable/./webpack/store/components/ReadOnlyModeDisabledComponent/index.jsx","webpack://booqable/./webpack/store/v2/redux/actions/availability.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/Picker.jsx","webpack://booqable/./webpack/store/blocks/CartPicker/index.js","webpack://booqable/./webpack/store/blocks/CartPicker/styles.js","webpack://booqable/./webpack/store/modules/cart/CartPicker/Modal.jsx","webpack://booqable/./webpack/store/modules/cart/FloatingCart/components/CartPicker.jsx","webpack://booqable/./webpack/store/modules/cart/FloatingCart/components/Launcher.jsx","webpack://booqable/./webpack/store/v2/react/components/cart.jsx","webpack://booqable/./webpack/store/v2/react/blocks/Themed/index.js","webpack://booqable/./webpack/store/v2/react/blocks/Themed/styles.js","webpack://booqable/./webpack/ui/themes/public.js","webpack://booqable/./webpack/store/v2/react/components/Themed.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart.jsx","webpack://booqable/./webpack/store/v2/redux/selectors/item.js","webpack://booqable/./webpack/store/v2/react/id_finder.jsx","webpack://booqable/./webpack/store/v2/redux/actions/quickview.js","webpack://booqable/./webpack/store/v2/react/components/product.jsx","webpack://booqable/./webpack/store/v2/react/scenes/product_group.jsx","webpack://booqable/./webpack/store/v2/react/components/pagination.jsx","webpack://booqable/./webpack/store/v2/redux/actions/filter.js","webpack://booqable/./webpack/store/v2/react/components/product_search.jsx","webpack://booqable/./webpack/store/modules/product/blocks/CollectionList/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/CollectionList/index.js","webpack://booqable/./webpack/store/v2/redux/actions/collection.js","webpack://booqable/./webpack/store/modules/product/components/CollectionList/index.jsx","webpack://booqable/./webpack/store/v2/react/components/product_list.jsx","webpack://booqable/./webpack/store/v2/react/scenes/product_list.jsx","webpack://booqable/./webpack/store/modules/product/blocks/ProductButton/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ProductButton/index.js","webpack://booqable/./webpack/store/modules/product/components/ProductButton/BundleItems.jsx","webpack://booqable/./webpack/store/modules/product/blocks/ProductAvailabilityCalendar/TimeTable/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ProductAvailabilityCalendar/TimeTable/index.js","webpack://booqable/./webpack/store/modules/product/components/ProductAvailabilityCalendar/TimeTable.jsx","webpack://booqable/./webpack/store/modules/product/blocks/ProductAvailabilityCalendar/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ProductAvailabilityCalendar/index.js","webpack://booqable/./webpack/store/modules/product/components/ProductAvailabilityCalendar/index.jsx","webpack://booqable/./webpack/store/v2/redux/selectors/product.js","webpack://booqable/./webpack/store/v2/redux/actions/line.js","webpack://booqable/./webpack/store/modules/product/components/ProductButton/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/product_button.jsx","webpack://booqable/./webpack/store/modules/product/blocks/ProductImage/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ProductImage/index.js","webpack://booqable/./webpack/store/modules/product/blocks/ImageMagnify/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ImageMagnify/index.js","webpack://booqable/./webpack/store/modules/product/components/ImageMagnify/ImageRenderer.jsx","webpack://booqable/./webpack/store/modules/product/components/ImageMagnify/index.jsx","webpack://booqable/./webpack/store/modules/product/blocks/ModalGallery/styles.js","webpack://booqable/./webpack/store/modules/product/blocks/ModalGallery/index.js","webpack://booqable/./webpack/store/modules/product/components/ModalGallery/index.jsx","webpack://booqable/./webpack/store/modules/product/components/ProductImage/index.jsx","webpack://booqable/./webpack/store/v2/react/components/product_detail.jsx","webpack://booqable/./webpack/store/v2/react/scenes/product_detail.jsx","webpack://booqable/./webpack/store/v2/react/scenes/quickview.jsx","webpack://booqable/./webpack/store/v2/react/scenes/product_search.jsx","webpack://booqable/./webpack/store/v2/react/components/separate_date_picker/Base.styles.jsx","webpack://booqable/./webpack/store/v2/react/components/separate_date_picker/Base.jsx","webpack://booqable/./webpack/store/v2/react/scenes/separate_date_picker.jsx","webpack://booqable/./webpack/store/v2/react/scenes/collection_list.jsx","webpack://booqable/./webpack/store/modules/product/components/SortingSelect/index.jsx","webpack://booqable/./webpack/store/modules/product/components/FilterSelect/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/filter_bar.jsx","webpack://booqable/./webpack/store/v2/react/scenes/sorting_select.jsx","webpack://booqable/./webpack/store/modules/cart/CartPicker/Inline.jsx","webpack://booqable/./webpack/store/v2/react/scenes/sidebar.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Line.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/LineContainer.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/LinesContainer.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Lines.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Errors.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Totals.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Sidebar.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Mobile/Line.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Mobile/Lines.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/Mobile/index.jsx","webpack://booqable/./webpack/store/modules/cart/EmbeddableCart/index.jsx","webpack://booqable/./webpack/store/v2/react/scenes/embeddable_cart.jsx","webpack://booqable/./webpack/store/v2/react/scenes/embeddable_cart_lines.jsx","webpack://booqable/./webpack/store/v2/react/scenes/embeddable_cart_sidebar.jsx","webpack://booqable/./webpack/store/modules/cart/CartButton.jsx","webpack://booqable/./webpack/store/v2/react/components/cart_button.jsx","webpack://booqable/./webpack/store/v2/react/scenes/cart_button.jsx","webpack://booqable/./webpack/shop-components/components/ProductAvailability/styles.js","webpack://booqable/./webpack/shop-components/utils/withStore.js","webpack://booqable/./webpack/shop-components/utils/withTheme.js","webpack://booqable/./webpack/shop-components/utils/registerCustomElement.js","webpack://booqable/./webpack/shop-components/api/index.js","webpack://booqable/./webpack/shop-components/api/availability.js","webpack://booqable/./webpack/shop-components/redux/actions/availability.js","webpack://booqable/./webpack/shop-components/components/ProductAvailability/index.jsx","webpack://booqable/./webpack/shop-components/redux/actions/price.js","webpack://booqable/./webpack/shop-components/api/price.js","webpack://booqable/./webpack/shop-components/components/ProductPrice/Price.jsx","webpack://booqable/./webpack/shop-components/components/ProductPrice/Label.jsx","webpack://booqable/./webpack/shop-components/components/ProductVariationsSelect/styles.js","webpack://booqable/./webpack/shop-components/components/ProductVariationsSelect/index.jsx","webpack://booqable/./webpack/shop-components/components/ProductAvailabilityCalendar/index.jsx","webpack://booqable/./webpack/shop-components/components/ProductButton/styles.js","webpack://booqable/./webpack/shop-components/components/ProductButton/Button.jsx","webpack://booqable/./webpack/shop-components/api/items.js","webpack://booqable/./webpack/shop-components/redux/actions/item.js","webpack://booqable/./webpack/shop-components/components/ProductButton/index.jsx","webpack://booqable/./webpack/shop-components/components/DatePicker/styles.js","webpack://booqable/./webpack/shop-components/components/DatePicker/hooks.js","webpack://booqable/./webpack/shop-components/components/DatePicker/Button.jsx","webpack://booqable/./webpack/shop-components/components/DatePicker/styles-next.js","webpack://booqable/./webpack/shop-components/components/DatePicker/ButtonNext.jsx","webpack://booqable/./webpack/shop-components/components/DatePicker/index.jsx","webpack://booqable/./webpack/shop-components/components/DatePicker/Modal.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/styles/index.js","webpack://booqable/./webpack/shop-components/components/MiniCart/styles/Line.js","webpack://booqable/./webpack/shop-components/components/MiniCart/components/BundleItem.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/components/BundleContents.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Line.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Lines.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/styles/Period.js","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Period.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/styles/Services.js","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Service.jsx","webpack://booqable/./webpack/shop-components/components/MiniCart/components/Services.jsx","webpack://booqable/./webpack/shop-components/utils/useCart.js","webpack://booqable/./webpack/shop-components/components/MiniCart/index.jsx","webpack://booqable/./webpack/shop-components/components/ProductGallery/components/OptimizedImage/index.jsx","webpack://booqable/./webpack/shop-components/components/ProductGallery/styles.js","webpack://booqable/./webpack/shop-components/api/photo.js","webpack://booqable/./webpack/shop-components/redux/actions/photo.js","webpack://booqable/./webpack/shop-components/components/ProductGallery/index.jsx","webpack://booqable/./webpack/shop-components/components/BundleItems/styles.js","webpack://booqable/./webpack/shop-components/components/BundleItems/Item.jsx","webpack://booqable/./webpack/shop-components/components/BundleItems/index.jsx","webpack://booqable/./webpack/shop-components/components/CartLines/styles.js","webpack://booqable/./webpack/shop-components/components/CartLines/BundleContents/styles.js","webpack://booqable/./webpack/shop-components/components/CartLines/BundleContents/index.jsx","webpack://booqable/./webpack/shop-components/components/CartLines/Line.jsx","webpack://booqable/./webpack/shop-components/components/CartLines/LineSkeleton.jsx","webpack://booqable/./webpack/shop-components/components/CartLines/index.jsx","webpack://booqable/./webpack/shop-components/components/CartServices/styles.js","webpack://booqable/./webpack/shop-components/components/CartServices/Service.jsx","webpack://booqable/./webpack/shop-components/components/CartServices/index.jsx","webpack://booqable/./webpack/shop-components/components/CartTotals/styles.js","webpack://booqable/./webpack/shop-components/components/CartTotals/Errors.jsx","webpack://booqable/./webpack/shop-components/components/CartTotals/Buttons/styles.js","webpack://booqable/./webpack/shop-components/components/CartTotals/Buttons/Checkout.jsx","webpack://booqable/./webpack/shop-components/utils/navigation.js","webpack://booqable/./webpack/shop-components/components/CartTotals/Buttons/BackToStore.jsx","webpack://booqable/./webpack/shop-components/components/CartTotals/Discounts.jsx","webpack://booqable/./webpack/shop-components/components/CartTotals/index.jsx","webpack://booqable/./webpack/shop-components/components/MiniCartLauncher/styles.js","webpack://booqable/./webpack/shop-components/components/MiniCartLauncher/index.jsx","webpack://booqable/./webpack/shop-components/components/MiniCartButton/styles.js","webpack://booqable/./webpack/shop-components/components/MiniCartButton/index.jsx","webpack://booqable/./webpack/store/v2/react/initializer.js","webpack://booqable/./webpack/store/v2/redux/models.js","webpack://booqable/./webpack/store/v2/redux/reducers/client.js","webpack://booqable/./webpack/store/v2/redux/reducers/filter.js","webpack://booqable/./webpack/shop-components/redux/reducers/items.js","webpack://booqable/./webpack/store/v2/redux/reducers/index.js","webpack://booqable/./webpack/store/v2/redux/store.js","webpack://booqable/./webpack/ui/blocks/ActionGroup/styles.js","webpack://booqable/./webpack/ui/elements/Img.js"],"sourcesContent":["/* global Booqable, CookieConsent */\nconst CookieNotice = {\n // PUBLIC\n\n init (config, translations = { en: {} }) {\n CookieConsent.run(this._settings(config, translations))\n },\n\n showPreferencesModal () {\n CookieConsent.showPreferences()\n },\n\n servicesTable () {\n const services = []\n\n Booqable._apps.marketing.forEach(function (app) {\n if (services.find((service) => service.name === app.name)) {\n return\n }\n\n services.push({\n name: app.name,\n domain: app.domain,\n desc: app.description\n })\n })\n\n return services\n },\n\n // PRIVATE\n\n _services () {\n // These will be listed in the cookie consent modal\n // and the user can then choose to accept or deny\n // cookies on a per-app basis.\n return Booqable._apps.marketing.map(function (app) {\n if (!app.name) {\n return null\n }\n\n return { name: app.name, label: app.name }\n }).filter(function (app) { return app })\n .reduce(function (acc, app) { return { ...acc, [app.name]: app } }, {})\n },\n\n _refreshAppConsent (cookie) {\n // Every time the user changes his cookie preferences\n // we need to refresh the apps to reflect the new state.\n Booqable._apps.marketing.forEach(function (app) {\n if (cookie.services.tracking.includes(app.name)) {\n app.onConsent()\n } else {\n app.onDeny()\n }\n })\n },\n\n _settings (config, translations = { en: {} }) {\n const self = this\n const defaults = {\n hideFromBots: !navigator.webdriver,\n autoShow: false,\n categories: {\n necessary: {\n enabled: true,\n readOnly: true\n },\n tracking: {\n services: this._services()\n }\n },\n language: {\n default: 'en',\n translations\n },\n onConsent: function ({ cookie }) { self._refreshAppConsent(cookie) },\n onChange: function ({ cookie }) { self._refreshAppConsent(cookie) }\n }\n\n return Object.assign({}, defaults, config)\n }\n}\n\nif (window.CookieNotice === undefined) {\n window.CookieNotice = CookieNotice\n}\n","window.imageFocus = require('image-focus').FocusedImage\n","/* eslint-disable */\n\n// WARNING: This file needs to be written in Vanilla JS\n\nvar Booqable = {\n get location() {\n return window.location.pathname;\n },\n set origin(value) {\n localStorage.setItem('origin', value);\n },\n get origin() {\n return localStorage.getItem('origin');\n }\n}\n\nif (window.Booqable === undefined) {\n window.Booqable = Booqable;\n\n /////////////////////////////////////////////////\n // Delegate initializer\n /////////////////////////////////////////////////\n\n Booqable.init = function () {\n initBooqableComponents();\n };\n\n /////////////////////////////////////////////////\n // Set cart data\n /////////////////////////////////////////////////\n\n Booqable.setCartData = function (data) {\n Booqable.cartData = data;\n };\n\n /////////////////////////////////////////////////\n // Events\n /////////////////////////////////////////////////\n\n Booqable._events = {};\n\n Booqable.on = function (event, callback, context) {\n if (!Booqable._events.hasOwnProperty(event)) {\n Booqable._events[event] = [];\n }\n\n Booqable._events[event].push([callback, context]);\n };\n\n Booqable._trigger = function (event) {\n var args = Array.prototype.slice.call(arguments, 1);\n var callbacks = Booqable._events[event] || [];\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i][0];\n var context = callbacks[i][1] || Booqable;\n callback.apply(context, args);\n }\n };\n\n // Removes an event listener by filtering out the specified callback from the event's array.\n window.Booqable.off = function (event, callback) {\n if (!Booqable._events.hasOwnProperty(event)) {\n return;\n }\n\n Booqable._events[event] = Booqable._events[event].filter(function (listener) {\n return listener[0] !== callback;\n });\n };\n\n /////////////////////////////////////////////////\n // Script, tag & asset loading\n /////////////////////////////////////////////////\n\n Booqable.loadScript = function (src) {\n if (Booqable._isScriptLoaded(src)) { return; }\n\n var tag = document.createElement('script');\n tag.async = false;\n tag.src = src;\n\n document.getElementsByTagName('head')[0].appendChild(tag);\n };\n\n Booqable.unloadScript = function (src) {\n if (!Booqable._isScriptLoaded(src)) { return; }\n\n var tag = Booqable._findScript(src);\n\n document.getElementsByTagName('head')[0].removeChild(tag);\n };\n\n /////////////////////////////////////////////////\n // jQuery\n /////////////////////////////////////////////////\n Booqable.jQuery = function (callback) {\n Booqable.loadScript('https://code.jquery.com/jquery-3.3.1.min.js');\n\n Booqable._defer(function () { return window.$; }, callback);\n };\n\n /////////////////////////////////////////////////\n // Utilities\n /////////////////////////////////////////////////\n\n Booqable._isScriptLoaded = function (src) {\n return Booqable._findScript(src) ? true : false;\n };\n\n Booqable._findScript = function (src) {\n return document.querySelector('script[src=\"' + src + '\"]');\n }\n\n Booqable._once = function (func) {\n let didRun = false;\n\n if (typeof func != 'function') {\n throw new TypeError('Expected a function');\n }\n\n return function() {\n if (!didRun) {\n didRun = true;\n return func.apply(this, arguments);\n } else {\n func = undefined;\n }\n };\n };\n\n Booqable._defer = function (condition, method, attempt) {\n if (!attempt) {\n attempt = 1;\n }\n\n if (attempt === 200) {\n return;\n }\n\n if (condition()) {\n method();\n } else {\n setTimeout(function () { Booqable._defer(condition, method, attempt + 1) }, 50);\n }\n };\n\n Booqable._prependChild = function (parentElement, element) {\n parentElement.insertBefore(element, parentElement.firstChild);\n };\n\n /////////////////////////////////////////////////\n // App support\n /////////////////////////////////////////////////\n Booqable._apps = {\n marketing: [],\n essential: [],\n };\n\n Booqable._initApps = Booqable._once(function () {\n Object.entries(Booqable._apps).forEach(([_, apps]) => {\n apps.forEach((app) => {\n app.init()\n })\n })\n })\n\n Booqable._consentToAllApps = Booqable._once(function () {\n Object.entries(Booqable._apps).forEach(([_, apps]) => {\n apps.forEach((app) => {\n app.onConsent()\n })\n })\n })\n\n // Add app to a category.\n Booqable.registerApp = function (category, appConfig) {\n if (!Booqable._apps.hasOwnProperty(category)) {\n throw new Error('Invalid app category \\'' + category + \"'\");\n }\n\n // We expect apps to define their callbacks, but none\n // are required.\n // name -> name of the app (shown on the cookie notice preferences)\n // init() -> called on window load event\n // onConsent() -> called on window load and when user consents to cookies\n // onDeny() -> called when user denies cookies\n var defaultConfig = {\n name: null,\n init: function () {},\n onConsent: function () {},\n onDeny: function () {}\n }\n\n Booqable._apps[category].push(Object.assign({}, defaultConfig, appConfig));\n }\n\n /////////////////////////////////////////////////\n // Google Analytics\n /////////////////////////////////////////////////\n\n Booqable._gtag = function (type, event, data) {\n if (typeof window.gtag === 'function') {\n window.gtag(type, event, data);\n }\n }\n\n Booqable._prepare_gtag_event_data = function (data) {\n if (!data.value || !data.currency || !data.items || data.items.length == 0) {\n return null\n }\n\n return {\n value: data.value,\n currency: data.currency,\n items: data.items.map((item) => ({\n item_id: item.item_id,\n item_name: item.item_name,\n ...(item.quantity && { quantity: item.quantity }),\n price: item.price\n }))\n }\n }\n\n setupGoogleAnalytics = function (trackingId, defaultPageTracking = true, defaultEvents = false, options = {}) {\n if (!trackingId || trackingId == '') {\n return\n }\n\n if (typeof options !== 'object') {\n options = {}\n }\n\n options.linker = { accept_incoming: true }\n\n Booqable.loadScript('https://www.googletagmanager.com/gtag/js?id=' + trackingId);\n\n window.dataLayer = window.dataLayer || [];\n window.gtag = function () { dataLayer.push(arguments); }\n window.gtag('js', new Date());\n window.gtag('config', trackingId, options);\n\n if (defaultPageTracking) {\n Booqable._setupGoogleAnalyticsDefaultPageTracking(trackingId);\n }\n\n if (defaultEvents) {\n Booqable._setupGoogleAnalyticsDefaultEvents();\n }\n };\n\n Booqable.setupGoogleAnalytics = Booqable._once(setupGoogleAnalytics)\n\n _setupGoogleAnalyticsDefaultPageTracking = function (trackingId) {\n Booqable.on('viewCart', function () {\n Booqable._gtag('event', 'page_view', {\n page_title: 'Cart',\n send_to: trackingId\n });\n\n Booqable._gtag('event', 'view_cart', {\n 'currency': Booqable.cartData.currency,\n 'value': Booqable.cartData.grandTotalWithTax,\n 'items': Booqable.cartData.items\n });\n });\n\n Booqable.on('information', function () {\n Booqable._gtag('event', 'page_view', {\n page_title: 'Checkout Information',\n send_to: trackingId\n });\n });\n\n Booqable.on('payment', function () {\n Booqable._gtag('event', 'page_view', {\n page_title: 'Checkout Payment',\n send_to: trackingId\n });\n });\n\n Booqable.on('completed', function () {\n Booqable._gtag('event', 'page_view', {\n page_title: 'Checkout Completed',\n send_to: trackingId\n });\n });\n };\n\n Booqable._setupGoogleAnalyticsDefaultPageTracking = Booqable._once(_setupGoogleAnalyticsDefaultPageTracking)\n\n _setupGoogleAnalyticsDefaultEvents = function () {\n // Shop Events\n Booqable.on('viewProduct', function (data) {\n const event_data = Booqable._prepare_gtag_event_data(data)\n\n Booqable._gtag('event', 'view_item', event_data);\n });\n\n Booqable.on('addToCart', function (data) {\n const event_data = Booqable._prepare_gtag_event_data(data)\n\n Booqable._gtag('event', 'add_to_cart', event_data);\n });\n\n Booqable.on('removeFromCart', function (data) {\n const event_data = Booqable._prepare_gtag_event_data(data)\n\n Booqable._gtag('event', 'remove_from_cart', event_data);\n });\n\n // Checkout events\n Booqable.on('information', function () {\n // Regular event\n Booqable._gtag('event', 'Checkout', {\n 'event_category': 'Information',\n 'event_label': 'Information'\n });\n\n // Ecommerce event\n Booqable._gtag('event', 'begin_checkout', {\n 'currency': Booqable.cartData.currency,\n 'value': Booqable.cartData.grandTotalWithTax,\n 'coupon': Booqable.cartData.coupon,\n 'items': Booqable.cartData.items\n });\n });\n\n Booqable.on('payment', function () {\n // Regular event\n Booqable._gtag('event', 'Checkout', {\n 'event_category': 'Payment',\n 'event_label': 'Payment'\n });\n });\n\n Booqable.on('completed', function () {\n // Regular event\n Booqable._gtag('event', 'Checkout', {\n 'event_category': 'Completed',\n 'event_label': 'Completed'\n });\n\n // Ecommerce event\n Booqable._gtag('event', 'purchase', {\n \"transaction_id\": Booqable.cartData.cartId,\n \"value\": Booqable.cartData.grandTotalWithTax,\n \"currency\": Booqable.cartData.currency,\n \"tax\": Booqable.cartData.tax,\n \"items\": Booqable.cartData.items,\n \"coupon\": Booqable.cartData.coupon\n });\n });\n }\n\n Booqable._setupGoogleAnalyticsDefaultEvents = Booqable._once(_setupGoogleAnalyticsDefaultEvents)\n\n /////////////////////////////////////////////////\n // Facebook\n /////////////////////////////////////////////////\n\n Booqable._fbq = function (type, event, data) {\n if (typeof window.fbq === 'function') {\n window.fbq(type, event, data);\n }\n }\n\n Booqable._prepare_fbq_event_data = function (data) {\n const item = data.items[0]\n\n if (!data.currency || !item) {\n return null\n }\n\n return {\n contents: [{\n id: item.item_id,\n quantity: item.quantity\n }],\n content_name: item.item_name,\n currency: data.currency,\n value: item.price\n }\n }\n\n setupFacebook = function (fbId, defaultEvents = true) {\n if (!fbId || fbId == '') { return ; }\n\n (function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;\n n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;\n t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,\n document,'script','https://connect.facebook.net/en_US/fbevents.js'));\n\n fbq('init', fbId);\n\n if (defaultEvents) {\n Booqable._setupFacebookDefaultEvents();\n }\n };\n\n Booqable.setupFacebook = Booqable._once(setupFacebook)\n\n _setupFacebookDefaultEvents = function () {\n Booqable.on('information', function () {\n Booqable._fbq('track', 'InitiateCheckout', {\n value: Booqable.cartData.grandTotalWithTax,\n currency: Booqable.cartData.currency\n });\n });\n\n Booqable.on('payment', function () {\n Booqable._fbq('track', 'AddPaymentInfo');\n });\n\n Booqable.on('completed', function () {\n Booqable._fbq('track', 'Purchase', {\n value: Booqable.cartData.grandTotalWithTax,\n currency: Booqable.cartData.currency\n });\n });\n\n Booqable.on('page-change', function () {\n Booqable._fbq('track', 'PageView')\n });\n\n Booqable.on('viewProduct', function (data) {\n const event_data = Booqable._prepare_fbq_event_data(data)\n\n Booqable._fbq('track', 'ViewContent', event_data);\n });\n\n Booqable.on('addToCart', function (data) {\n const event_data = Booqable._prepare_fbq_event_data(data)\n\n Booqable._fbq('track', 'AddToCart', event_data);\n });\n\n Booqable.on('removeFromCart', function (data) {\n const event_data = Booqable._prepare_fbq_event_data(data)\n\n Booqable._fbq('trackCustom', 'RemoveFromCart', event_data);\n });\n };\n\n Booqable._setupFacebookDefaultEvents = Booqable._once(_setupFacebookDefaultEvents)\n\n /////////////////////////////////////////////////\n // Intercom\n /////////////////////////////////////////////////\n\n Booqable.setupIntercom = function (appId) {\n window.intercomSettings = {\n app_id: appId\n };\n\n (function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');\n ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];\n i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');\n s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/frrez76q';\n var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}\n if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}\n Booqable._loadIntercom=l;}})()\n\n Booqable._once(Booqable._loadIntercom)();\n };\n\n /////////////////////////////////////////////////\n // Properties & Property updaters\n /////////////////////////////////////////////////\n\n Booqable.decorateLinkForTracking = function (link) {\n // https://developers.google.com/analytics/devguides/collection/gtagjs/cross-domain\n if (window.ga) {\n var trackers = window.ga.getAll && window.ga.getAll()\n var tracker = trackers && trackers[0]\n\n if (tracker && window.gaplugins && window.gaplugins.Linker) {\n var linker = new window.gaplugins.Linker(tracker)\n\n link = linker.decorate(link)\n }\n }\n\n return link\n }\n\n /////////////////////////////////////////////////\n // Button utilities\n /////////////////////////////////////////////////\n\n document.querySelectorAll('form').forEach((form) => {\n form.addEventListener('submit', function (e) {\n const button = e.submitter\n if (button?.classList.contains('button--with-loading') || button?.classList.contains('button--disable-on-submit')) {\n button.setAttribute('disabled', 'disabled')\n }\n })\n })\n}\n","require('./globals')\n\n// Initialize Redux\nwindow.booqableStore = require('./redux/store').default\n\nwindow.booqableGetStore = function () {\n return window.booqableStore\n}\n\n// Intialize App\nrequire('./react/initializer')\nrequire('shared/user_framework')\nrequire('shared/cookie_notice')\n","// Polyfills for older and crappy browsers\nimport 'core-js'\n\nimport elementDataset from 'element-dataset'\n\n// Localization\nimport 'shared/utils/i18n'\n\nimport Bluebird from 'bluebird'\nimport Model from './redux/models'\nimport accounting from 'accounting'\nimport cuid from 'cuid'\n\nelementDataset()\n\nwindow.Promise = Bluebird\nwindow.Model = Model\n\n// Booqable currently relies on accounting to be global\n// for setting correct currency settings\nwindow.accounting = accounting\nwindow.cuid = cuid\n\n// Bluebird config\nwindow.Promise.config({\n warnings: false\n})\n\nwindow.Promise.onPossiblyUnhandledRejection((error) => {\n if (error && error?.message !== 'requestError') {\n throw error\n }\n})\n","import Fingerprint2 from 'fingerprintjs2'\n\nconst fingerPrintOptions = {\n excludes: {\n fonts: true,\n screenResolution: true,\n availableScreenResolution: true\n }\n}\n\nexport default (callback) => {\n try {\n Fingerprint2.getV18(fingerPrintOptions, (fingerprint) => {\n callback(fingerprint)\n })\n } catch {\n // Something went wrong, return an undefined fingerprint\n callback(undefined)\n }\n}\n","import moment from 'shared/lib/moment'\n\nconst store = window.booqableStore\n\nexport default {\n\n set: (locale) => {\n const debug = false\n\n const setLocale = (locale) => {\n window.booqableOptions.locale = locale.split('-')[0]\n moment.locale(locale)\n }\n\n const loadLocale = (locale) => {\n return import('moment/locale/' + locale).then(() => {\n debug && console.log(' - Locale found and loaded', locale)\n\n setLocale(locale)\n store.dispatch({ type: 'LOCALE_SET', payload: { locale } })\n })\n }\n\n const tryLoadLocales = (locales, i = 0) => {\n if (locales[i]) {\n debug && console.log(' - Attempting to load locale', locales[i])\n\n loadLocale(locales[i]).catch(() => {\n debug && console.log(' - Locale not found', locales[i])\n\n tryLoadLocales(locales, i + 1)\n })\n } else {\n debug && console.log(' - Locales not found', locales)\n }\n }\n\n // Use en as default while we load the proper locale\n setLocale('en')\n\n const [language, substring] = locale.toLowerCase().split('-')\n const locales = []\n\n // Some of the locales that we construct from language and substring are not present\n // in the moment locale folder https://github.com/moment/moment/tree/develop/locale\n // An error will occur when we try to import those\n const notSupported = ['nb-no']\n\n if (substring && language !== substring) {\n const localeWithSubstring = [language, substring].join('-')\n\n if (!notSupported.includes(localeWithSubstring)) {\n locales.push(localeWithSubstring)\n }\n }\n\n locales.push(language)\n\n debug && console.log('Detected browser locale', locale)\n\n // No need to load the default locale\n if (locales.length === 0 || (locales.length === 1 && locales[0] === 'en')) {\n debug && console.log(' - Locale is default en. No need to load any locale')\n\n return\n }\n\n debug && console.log(' - Loading locales in order:', locales)\n\n tryLoadLocales(locales)\n }\n\n}\n","import API from 'shared/lib/api'\n\nAPI.prefix = window.booqableOptions.apiURL + '/api'\n\nexport default API\n","import moment from 'shared/lib/moment'\nimport OperatinRuleUtils from 'shared/utils/operating_rules'\n\nexport const isOverdue = (cart) => {\n // If there is no cart (yet) we return.\n if (!cart) return false\n\n if (!cart.starts_at) return false\n\n // We get the start date from the cart.\n const startsAt = moment(cart.starts_at)\n\n // Check if this time is selectable\n return !OperatinRuleUtils.isTimeSelectable(startsAt)\n}\n\nexport const getLocalCartId = () => {\n return window.booqableOptions?.cart?.id || localStorage.bqCartId\n}\n\nexport default {\n isOverdue\n}\n","import API from 'store/v2/api'\nimport Model from '../models'\nimport { getLocalCartId } from 'shared/utils/cart'\n\nModel.Cart.createAction('FETCH', (params) => {\n if (params == null) {\n params = {}\n }\n\n const cartId = getLocalCartId()\n const provider = window.booqableOptions.storeProvider\n const pathName = document.location.pathname\n\n if (provider) {\n params.provider = provider\n }\n\n if (pathName.startsWith('/preview') || pathName.startsWith('/shop/preview')) {\n params.previewing = true\n }\n\n if (cartId !== 'null') {\n params.id = cartId\n }\n\n return API.get('cart', { ...params, apiVersion: 1 })\n})\n\nModel.Cart.createAction('UPDATE', (params) => {\n if (params == null) {\n params = {}\n }\n\n params.id = getLocalCartId()\n\n return API.put('cart', { ...params, apiVersion: 1 })\n})\n\nModel.Cart.createAction('BOOK', (params) => {\n if (params == null) {\n params = {}\n }\n\n params.id = getLocalCartId()\n\n return API.createResource('cart/book', { ...params, apiVersion: 1 })\n})\n\nModel.Cart.createAction('CLEAR', () => {\n const params = {\n id: getLocalCartId()\n }\n\n return API.createResource('cart/clear', { ...params, apiVersion: 1 })\n})\n\nexport default Model.Cart.actions\n","import SettingUtils from 'shared/utils/settings'\n\nexport default function getBrandingColor () {\n const options = window.booqableOptions\n\n return options?.primaryColor?.length ? options.primaryColor : SettingUtils.get('store.brand_color')\n}\n","import cartActions from 'store/v2/redux/actions/cart'\nimport brandingUtils from 'ui/themes/utils'\nimport TimeUtils from 'shared/utils/time'\nimport Model from 'store/v2/redux/models'\nimport cartUtils from 'shared/utils/cart'\nimport OperatingRuleUtils from 'shared/utils/operating_rules'\nimport getBrandingColor from 'shared/utils/getBrandingColor'\n\nconst initializeDefaultTimes = (store) => {\n const defaultStartTime = TimeUtils.defaultStartTime()\n\n const defaultStopTime = TimeUtils.defaultStopTime({\n defaultStartTime\n })\n\n // If we don't use times and have a fixed start time\n // we use this as the first selectable date, it would\n // not pass validation anyway\n const state = store.getState()\n const startType = state.settings.get('orders.start_type')\n const useTimes = state.settings.get('store.period_type') === 'timeslot_fixed' ?\n true :\n state.settings.get('store.use_times')\n\n let firstTimeSelectable\n\n if (startType === 'fixed' && !useTimes) {\n firstTimeSelectable = defaultStartTime\n } else {\n firstTimeSelectable = OperatingRuleUtils.firstTimeSelectable()\n }\n\n store.dispatch({\n type: 'DEFAULT_TIMES_INITIALIZED',\n payload: {\n defaultStartTime,\n defaultStopTime,\n firstTimeSelectable\n }\n })\n}\n\nconst clientActions = {\n initialize () {\n const store = window.booqableGetStore()\n\n return cartActions.fetch({\n source: 'store',\n embeddable_cart_elements: window.booqableOptions?.embeddableCartElements,\n apiVersion: 1\n }).then(function (action) {\n store.dispatch({ type: 'SETTINGS_INITIALIZED', payload: { settings: action.payload.response.meta.settings } })\n\n // Operating rules\n Model.OperatingRule.hydrate({ operating_rules: action.payload.response.meta.operating_rules })\n\n // Locations\n Model.Location.hydrate({ locations: action.payload.response.meta.locations })\n\n // Overdue cart check\n clientActions.evaluateCartOverdue()\n\n // Get branding color from theme or from settings\n const brandingColor = getBrandingColor()\n\n brandingUtils.insertCSS(brandingColor)\n\n // Do this async to speed up initialization\n new Promise((resolve, _reject) => {\n initializeDefaultTimes(store) && resolve()\n })\n\n return store.dispatch({ type: 'TRANSLATIONS_INITIALIZED' })\n })\n },\n\n setFloatingCart () {\n const store = window.booqableGetStore()\n\n return store.dispatch({\n type: 'SET_FLOATING_CART',\n payload: {\n floatingCart: true\n }\n })\n },\n\n toggleCart (open) {\n const store = window.booqableGetStore()\n\n return store.dispatch({\n type: 'TOGGLE_CART',\n payload: {\n cartOpen: open\n }\n })\n },\n\n toggleModalPicker (open) {\n const store = window.booqableGetStore()\n\n // Legacy picker support\n store.dispatch({\n type: 'TOGGLE_PICKER',\n payload: {\n modalPickerOpen: open\n }\n })\n\n return store.dispatch({\n type: open ? 'CART_OPEN' : 'CART_CLOSE'\n })\n },\n\n setCartScroll (pixels) {\n const store = window.booqableGetStore()\n\n return store.dispatch({\n type: 'SET_CART_SCROLL',\n payload: {\n cartScroll: pixels\n }\n })\n },\n\n setCheckingOut () {\n const store = window.booqableGetStore()\n const state = store.getState()\n\n store.dispatch({\n type: 'SET_CHECKING_OUT'\n })\n\n const cartId = state.client.get('cartId')\n const cart = state.orm.carts.getById(cartId)\n\n let checkoutURL = cart?.checkout_url\n const booqableOptions = window.booqableOptions\n\n if (checkoutURL && booqableOptions.checkoutDomain) {\n // Make sure we enforce SSL\n const domain = checkoutURL.match(/(https|http):\\/\\/(.*)\\/checkout/)[2]\n\n checkoutURL = checkoutURL.replace(domain, booqableOptions.checkoutDomain)\n }\n\n const checkoutURLwithSearch = window.Booqable.decorateLinkForTracking(`${checkoutURL}${window.location.search}`)\n\n store.dispatch({\n type: 'SET_CHECKING_OUT',\n payload: false\n })\n\n window.location = checkoutURLwithSearch\n },\n\n setCartId (id) {\n const store = window.booqableGetStore()\n\n return store.dispatch({\n type: 'SET_CART_ID',\n payload: {\n cartId: id\n }\n })\n },\n\n evaluateCartOverdue () {\n const store = window.booqableGetStore()\n const state = store.getState()\n\n const cartId = state.client.get('cartId')\n const cart = state.orm.carts.getById(cartId)\n\n const overdue = cartUtils.isOverdue(cart)\n\n store.dispatch({ type: 'SET_CART_OVERDUE', payload: overdue })\n\n return overdue\n }\n}\n\nexport default clientActions\n","import Model from '../models'\nimport API from '../../api'\n\nModel.Item.actions.fetchAllOnPage = function (cartId) {\n let id\n\n let products = document.getElementsByClassName('booqable-product')\n\n const itemIds = []\n const specificIds = []\n\n for (const node of Array.from(products)) {\n ({ id } = node.dataset)\n itemIds.push(id)\n }\n\n products = document.getElementsByClassName('booqable-product-button')\n\n for (const node of Array.from(products)) {\n ({ id } = node.dataset)\n specificIds.push(id)\n }\n\n products = document.getElementsByClassName('booqable-product-detail')\n\n for (const node of Array.from(products)) {\n ({ id } = node.dataset)\n specificIds.push(id)\n }\n\n if (specificIds.length > 0) {\n Model.Bundle.actions.fetchAll({ ids: specificIds, cart_id: cartId, apiVersion: 3 })\n Model.ProductGroup.actions.fetchAll({ ids: specificIds, cart_id: cartId, apiVersion: 3, include: 'products' })\n }\n\n if (itemIds.length > 0) {\n Model.Item.actions.fetchAll({ ids: itemIds, cart_id: cartId, apiVersion: 3 })\n }\n}\n\nModel.Item.createAction('FETCH_ALL', (options) => {\n if (options == null) {\n options = {}\n }\n\n return API.post('items', options)\n})\n\nexport default Model.Item.actions\n","import Model from '../models'\nimport API from '../../api'\n\nModel.Bundle.createAction('FETCH_ALL', (options) => {\n if (options == null) {\n options = {}\n }\n\n return API.post('bundles', options)\n})\n\nModel.Bundle.createAction('CONFIGURATION_AVAILABILITY', (options) => {\n return API.get(`bundles/${options.id}/configuration`, options)\n})\n\nexport default Model.Bundle.actions\n","import Model from '../models'\nimport API from '../../api'\nimport { getLocalCartId } from 'shared/utils/cart'\n\nModel.ProductGroup.actions.fetchAllOnPage = function () {\n let id\n let products = document.getElementsByClassName('booqable-product')\n const productIds = []\n\n for (const node of Array.from(products)) {\n // Get product group id\n ({ id } = node.dataset)\n productIds.push(id)\n }\n\n products = document.getElementsByClassName('booqable-product-button')\n\n for (const node of Array.from(products)) {\n // Get product group id\n ({ id } = node.dataset)\n productIds.push(id)\n }\n\n products = document.getElementsByClassName('booqable-product-detail')\n\n for (const node of Array.from(products)) {\n // Get product group id\n ({ id } = node.dataset)\n productIds.push(id)\n }\n\n const cartId = getLocalCartId()\n\n return Model.ProductGroup.actions.fetchAll({ ids: productIds, cart_id: cartId })\n}\n\nModel.ProductGroup.createAction('FETCH_ALL', (options) => {\n if (options == null) {\n options = {}\n }\n\n return API.post('product_groups', options)\n})\n\nModel.ProductGroup.createAction('FETCH_SERVICES', (options) => {\n return API.post('product_groups/services', { ...options, apiVersion: 1 })\n})\n\nexport default Model.ProductGroup.actions\n","export default {\n isSquarespace: () => {\n const iterator = document.createNodeIterator(document.head, NodeFilter.SHOW_COMMENT, filterNone, false)\n let curNode = iterator.nextNode()\n\n while (curNode) {\n if (curNode.nodeValue === ' This is Squarespace. ') {\n return true\n }\n curNode = iterator.nextNode()\n }\n },\n isWix: () => {\n const metaNode = document.querySelector('meta[name=\"generator\"]')\n\n if (metaNode) {\n return metaNode.content === 'Wix.com Website Builder'\n }\n },\n isWeebly: () => {\n if (window._W) {\n return true\n }\n },\n isShopify: () => {\n if (window.Shopify) {\n return true\n }\n }\n}\n\nconst filterNone = () => {\n return NodeFilter.FILTER_ACCEPT\n}\n","import SettingUtils from 'shared/utils/settings'\n\nexport function triggerUserFrameworkBookEvent (productId, quantity) {\n const _store = window.store || window.booqableStore\n const state = _store && _store.getState()\n\n if (quantity === 0) {\n return\n }\n\n const settings = state.client || state.session\n const currencySettings = settings.get('currency')\n const currency = currencySettings.name || currencySettings.get('name')\n\n const line = state.orm.lines.filter((line) => {\n return line.item_id === productId\n }).first()\n const event = quantity > 0 ? 'addToCart' : 'removeFromCart'\n const data = {\n value: line.price_each_in_cents / 100,\n currency,\n items: [{\n item_id: line.product.id,\n item_name: line.product.name,\n quantity: Math.abs(quantity),\n price: line.price_each_in_cents / 100\n }]\n }\n\n window.Booqable._trigger(event, data)\n}\n\nexport function triggerUserFrameworkViewProductEvent (product) {\n const _store = window.store || window.booqableStore\n const state = _store && _store.getState()\n const settings = state.client || state.session\n\n const currencySettings = settings.get('currency')\n const currency = currencySettings.iso_code || currencySettings.get('iso_code')\n\n window.Booqable._trigger('viewProduct', {\n value: product.price_in_cents / 100,\n currency,\n items: [{\n item_id: product.id,\n item_name: product.name,\n quantity: 1,\n price: product.price_each_in_cents / 100\n }]\n })\n}\n\nexport function setUserFrameworkCartData () {\n const _store = window.store || window.booqableStore\n const state = _store && _store.getState()\n\n const cart = state.orm.carts.getById(state.client?.cartId) || state.orm.carts.first()\n const coupon = cart && cart.coupon_id && state.orm.coupons.getById(cart.coupon_id)\n const settings = state.client || state.session\n\n const currencySettings = settings.get('currency')\n const currency = currencySettings.name || currencySettings.get('name')\n\n if (cart) {\n const data = {\n cartId: cart.id,\n orderId: cart.order_id,\n deposit: cart.deposit_in_cents / 100,\n couponDiscount: cart.coupon_discount_in_cents / 100,\n toBePaid: cart.to_be_paid_in_cents / 100,\n totalDueLater: cart.total_due_later_in_cents / 100,\n grandtotal: cart.grand_total_in_cents / 100,\n grandTotalWithTax: cart.grand_total_with_tax_in_cents / 100,\n tax: cart.tax_values.map((taxValue) => taxValue.value_in_cents / 100)\n .reduce((prev, current) => prev + current, 0),\n coupon: coupon && coupon.identifier,\n items: cart.lines.map((line) => {\n line = typeof line === 'string' ? state.orm.lines.getById(line) : line\n\n return {\n item_id: line.item_id,\n item_name: line.title,\n quantity: line.quantity,\n price: line.price_each_in_cents / 100\n }\n }),\n currency: currency || 'USD'\n }\n\n window.Booqable.setCartData(data)\n }\n}\n\nexport function initShopTracking () {\n const Booqable = window.Booqable\n\n const googleAnalytics = SettingUtils.get('store.google_analytics_id')\n const facebookPixel = SettingUtils.get('store.facebook_pixel_id')\n\n if (googleAnalytics) {\n Booqable._setupGoogleAnalyticsDefaultEvents()\n }\n\n if (facebookPixel) {\n Booqable._setupFacebookDefaultEvents()\n }\n\n setUserFrameworkCartData()\n}\n","import styled from 'styled-components'\nimport { size } from 'ui/themes/utils'\n\nimport Icon from 'ui/blocks/Icon'\n\nexport const Period = styled.div`\n cursor: pointer;\n\n ${Icon} {\n font-size: 12px;\n margin: 0 ${size('margin', 'xs')};\n\n &:last-child {\n margin-right: 0;\n }\n }\n`\n\nexport const Details = styled.div`\n display: flex;\n flex-flow: row nowrap;\n\n justify-content: space-between;\n align-items: center;\n\n font-size: 14px;\n text-align: left;\n`\n\nexport const Detail = styled.div``\n\nexport const Location = styled.p`\n font-size: 13px !important;\n font-weight: 500 !important;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`\n\nexport const DateTime = styled.p`\n font-size: 12px !important;\n font-weight: 300 !important;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:first-letter {\n text-transform: uppercase;\n }\n`\n\nexport const ChoosePeriod = styled.p`\n width: 100%;\n text-align: center;\n font-size: 14px !important;\n`\n\nconst DatesBase = styled.div`\n position: relative;\n\n display: flex;\n align-items: center;\n\n padding: ${size('padding', 'sm')} ${size('padding', 'md')} !important;\n`\n\nexport const WithDates = styled(DatesBase)`\n ${Details} {\n width: calc(100% - 12px - (1.5 * ${size('padding', 'md')}));\n }\n\n ${Icon} {\n &:last-child {\n position: absolute;\n\n top: 50%;\n right: ${size('padding', 'md')};\n\n transform: translateY(-50%);\n }\n }\n`\n\nexport const NoDates = styled(DatesBase)`\n ${Icon} {\n &:last-child {\n position: absolute;\n\n top: 50%;\n right: ${size('padding', 'md')};\n\n transform: translateY(-50%);\n }\n }\n`\n\nexport const Placeholder = styled.p`\n font-size: 14px !important;\n`\n","import {\n Period,\n Details,\n Detail,\n Location,\n DateTime,\n NoDates,\n WithDates,\n ChoosePeriod,\n Placeholder\n} from './styles'\n\nPeriod.Details = Details\nPeriod.Detail = Detail\nPeriod.Location = Location\nPeriod.DateTime = DateTime\nPeriod.NoDates = NoDates\nPeriod.WithDates = WithDates\nPeriod.ChoosePeriod = ChoosePeriod\nPeriod.Placeholder = Placeholder\n\nexport default Period\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport BPeriod from '../../blocks/Period'\nimport Icon from 'ui/components/Icon'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Shared\nimport Format from 'shared/utils/format'\nimport ClientActions from 'store/v2/redux/actions/client'\n\nexport class Period extends Component {\n static displayName = 'Period'\n\n static propTypes = {\n cart: PropTypes.any,\n hasDates: PropTypes.bool,\n useTimes: PropTypes.bool,\n timeFormat: PropTypes.any,\n locations: PropTypes.object,\n autoOpenedModal: PropTypes.bool,\n onAutoModal: PropTypes.func,\n open: PropTypes.bool,\n modalOpen: PropTypes.bool,\n togglePicker: PropTypes.func,\n t: PropTypes.func\n }\n\n componentDidUpdate = (prevProps) => {\n const { autoOpenedModal, onAutoModal, hasDates, open, modalOpen } = this.props\n\n if (!autoOpenedModal && !prevProps.open && open && !hasDates && !modalOpen) {\n onAutoModal(() => {\n this.props.togglePicker(true)\n })\n }\n }\n\n handleOpenModal = () => {\n this.props.togglePicker(true)\n }\n\n render () {\n const { cart, locations, useTimes, hasDates, t } = this.props\n const hasLocations = locations.size() > 1\n\n return (\n <BPeriod data-tid=\"Select dates\" className=\"bq-branded\" onClick={this.handleOpenModal}>\n {hasDates ?\n (\n <BPeriod.WithDates className=\"bq-selected-dates\">\n <BPeriod.Details>\n <BPeriod.Detail>\n {hasLocations && (\n <BPeriod.Location className=\"bq-branded\">\n {cart && cart.start_location_id ? locations.getById(cart.start_location_id)?.name : null}\n </BPeriod.Location>\n )}\n <BPeriod.DateTime className=\"bq-branded\">\n {`${Format.date(\n cart ? cart.starts_at : undefined,\n 'date'\n )}${useTimes ?\n `, ${Format.date(\n cart ? cart.starts_at : undefined,\n this.props.timeFormat\n )}` :\n ''}`}\n </BPeriod.DateTime>\n </BPeriod.Detail>\n <Icon icon=\"arrow-right\" />\n <BPeriod.Detail>\n {hasLocations && (\n <BPeriod.Location className=\"bq-branded\">\n {cart && cart.stop_location_id ? locations.getById(cart.stop_location_id)?.name : null}\n </BPeriod.Location>\n )}\n <BPeriod.DateTime className=\"bq-branded\">\n {`${Format.date(\n cart ? cart.stops_at : undefined,\n 'date'\n )}${useTimes ?\n `, ${Format.date(\n cart ? cart.stops_at : undefined,\n this.props.timeFormat\n )}` :\n ''}`}\n </BPeriod.DateTime>\n </BPeriod.Detail>\n </BPeriod.Details>\n <Icon icon=\"sliders-v\" />\n </BPeriod.WithDates>\n ) :\n (\n <BPeriod.NoDates className=\"bq-branded-border\">\n <BPeriod.ChoosePeriod>{t('user.store.select_a_period')}</BPeriod.ChoosePeriod>\n <Icon icon=\"sliders-v\" />\n </BPeriod.NoDates>\n )}\n </BPeriod>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n let timeFormat\n\n if (state.settings.get('dates.use_am_pm')) {\n timeFormat = 'hh:mm A'\n } else {\n timeFormat = 'HH:mm'\n }\n\n return {\n locale: state.client.locale,\n timeFormat,\n useTimes: state.settings.get('store.use_times'),\n open: state.client.cartOpen,\n modalOpen: state.client.modalPickerOpen\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n togglePicker: ClientActions.toggleModalPicker\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(Period)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport uiConnect from 'shared/redux/interface'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport cartActions from 'store/v2/redux/actions/cart'\nimport Format from 'shared/utils/format'\n\nclass Line extends React.Component {\n static displayName = 'Line'\n\n static propTypes = {\n updateUI: PropTypes.func,\n line: PropTypes.any,\n useAvailability: PropTypes.bool,\n hasDates: PropTypes.any,\n decreaseQty: PropTypes.func,\n increaseQty: PropTypes.func,\n currency: PropTypes.any,\n showPrices: PropTypes.any,\n hideProductAvailabilityQuantities: PropTypes.bool,\n remove: PropTypes.func,\n ui: PropTypes.shape({\n quantity: PropTypes.number,\n deleting: PropTypes.bool\n }),\n style: PropTypes.shape({\n opacity: PropTypes.number,\n transform: PropTypes.string\n }),\n t: PropTypes.func\n }\n\n componentDidMount = () => {\n const { line, updateUI } = this.props\n\n updateUI({ quantity: line.quantity })\n }\n\n componentDidUpdate = (prevProps) => {\n const { line, updateUI } = this.props\n\n if (line && prevProps.line && line.quantity !== prevProps.line.quantity) {\n updateUI({ quantity: line.quantity })\n }\n }\n\n render () {\n const {\n style,\n line,\n currency,\n hasDates,\n useAvailability,\n hideProductAvailabilityQuantities,\n showPrices,\n decreaseQty,\n remove,\n increaseQty,\n ui,\n t\n } = this.props\n\n const available = line.available_quantity >= ui.quantity\n const statusClass = available ? 'bq-available' : 'bq-unavailable'\n const titleClass = useAvailability ? 'bq-small' : 'bq-large'\n\n if (line.product_type === 'service') return null\n\n return (\n <div\n key={line.title}\n style={style}\n className=\"bq-list-item\"\n >\n {line?.photo_url && <img className=\"bq-product-image\" src={line.photo_url} />}\n {!line?.photo_url && (\n <span className=\"bq-no-photo\">\n <i className=\"bq-no-photo bq-icon-image fas fa-image\" />\n </span>\n )}\n <div className=\"bq-cart-line\">\n <div className={`bq-product-name ${titleClass}`}>{line.title}</div>\n {hasDates && useAvailability && (\n <span className={`bq-status-indicator ${statusClass}`}>\n {!hideProductAvailabilityQuantities && (\n <Fragment>\n <span className=\"bq-status-quantity\">\n {line.available_quantity}\n {' '}\n </span>\n {t('user.store.available')}\n </Fragment>\n )}\n {hideProductAvailabilityQuantities &&\n t(available ? 'user.store.available' : 'user.store.unavailable')}\n </span>\n )}\n <div className={`bq-quantity ${ui.deleting ? 'disabled' : 'enabled'}`}>\n <button className=\"bq-quantity-toggle\" onClick={decreaseQty}>\n -\n </button>\n <span className=\"bq-quantity\">{ui.quantity}</span>\n <button className=\"bq-quantity-toggle\" onClick={increaseQty}>\n +\n </button>\n </div>\n </div>\n <div className=\"bq-line-footer\">\n {showPrices && !line.discountable && (\n <p className=\"bq-product-discountable-hint\">\n <i className=\"bq-icon-tag fas fa-tag\" />\n {t('user.store.not_discountable_hint')}\n </p>\n )}\n {showPrices && line.display_price_in_cents > 0 && (\n <p className=\"bq-price\">{Format.money(line.display_price_in_cents, currency)}</p>\n )}\n </div>\n <button className=\"bq-remove-product\" onClick={ui.deleting ? undefined : remove}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </button>\n </div>\n )\n }\n}\n\nconst uiToProps = {\n persist: true,\n state: {\n quantity: 0,\n deleting: false\n }\n}\n\nconst mapStateToProps = (state, props) => {\n return {\n currency: state.client.currency.toJS(),\n useAvailability: state.settings.get('store.use_availability') && props.line.tracking_type !== 'none',\n hideProductAvailabilityQuantities: state.settings.get('store.hide_product_availability_quantities'),\n showPrices: state.settings.get('store.use_prices')\n }\n}\n\nconst mapDispatchToProps = (_dispatch, props) => {\n const book = function (quantity) {\n if (quantity === 0) {\n props.updateUI({ deleting: true })\n }\n\n if (quantity === -1) {\n return\n }\n\n props.updateUI({ quantity })\n\n return cartActions\n .book({\n item_id: props.line.item_id,\n line_id: props.line.id,\n quantity,\n type: 'set',\n apiVersion: 1\n })\n .then(() => {\n const quantityChange = quantity - props.line.quantity\n\n triggerUserFrameworkBookEvent(props.line.item_id, quantityChange)\n })\n }\n\n return {\n increaseQty: () => {\n const newQuantity = props.ui.quantity + 1\n\n return book(newQuantity)\n },\n decreaseQty: () => {\n const newQuantity = props.ui.quantity - 1\n\n return book(newQuantity)\n },\n remove: () => book(0)\n }\n}\n\nexport default compose(\n withTranslation('user'),\n uiConnect('Line', uiToProps),\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(Line)\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport default class Delay extends React.Component {\n static displayName = 'Delay'\n\n static propTypes = {\n initial: PropTypes.number,\n children: PropTypes.any,\n value: PropTypes.number,\n period: PropTypes.number\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n value: this.props.initial\n }\n }\n\n static getDerivedStateFromProps (props, state) {\n return (props.value === state.value) ? null : { value: props.value }\n }\n\n componentDidMount = () => {\n const setProps = () => this.setState((prevState, props) => {\n const { value } = props\n\n // update state only if the value has changed\n return (prevState.value === value) ? null : { value }\n })\n\n return setTimeout(setProps, this.props.period)\n }\n\n render = () => {\n return this.props.children(this.state.value)\n }\n}\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\nconst Logo = ({ width = '52px', height = '28px' }) => (\n <svg width={width} height={height} viewBox=\"0 0 52 28\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"icon\" transform=\"translate(0.000000, -6.000000)\">\n <g transform=\"translate(-0.000000, 6.000000)\">\n <path d=\"M48.6616,24.8061 C47.6936,25.8961 45.8576,25.5991 42.7846,23.9021 C41.0086,22.9331 39.0666,21.6181 37.0126,20.2281 L36.2236,19.6991 C34.9676,18.8551 33.6686,17.9831 32.4216,17.2181 C32.0956,17.0221 31.7686,16.8271 31.4676,16.6551 L30.8326,16.3041 C30.1396,15.9201 29.5406,15.6241 29.0396,15.4141 C28.9376,15.3671 28.8366,15.3231 28.7126,15.2711 L28.7126,15.2701 C28.5206,15.1861 28.3276,15.1041 28.1346,15.0251 L28.0256,14.9601 L27.9756,14.9601 C24.6466,13.6181 21.1286,12.9381 17.5076,12.9381 C14.5526,12.9381 11.6856,13.3961 8.9366,14.2821 C13.8786,9.7021 20.1486,5.4451 22.3716,4.1521 C23.3316,3.5921 24.5176,3.2961 25.8016,3.2961 C27.0916,3.2961 28.3386,3.6021 29.3126,4.1581 C34.6586,7.2061 48.2086,17.5781 49.0916,22.9811 L49.0926,22.9891 C49.2196,23.7421 49.0786,24.3361 48.6616,24.8061 M4.4186,25.3681 C3.8016,25.3681 3.3536,25.1891 3.0146,24.8081 C2.5706,24.3061 2.4156,23.6741 2.5426,22.8721 C2.5916,22.5571 2.6906,22.2121 2.8396,21.8401 C2.8496,21.8121 2.8656,21.7821 2.8776,21.7551 C2.9436,21.5951 3.0136,21.4321 3.0976,21.2631 C3.1296,21.1981 3.1706,21.1291 3.2046,21.0631 C3.2766,20.9251 3.3466,20.7891 3.4286,20.6461 L3.5066,20.5181 C3.5126,20.5081 3.5206,20.4971 3.5266,20.4871 C4.1376,19.4661 5.0966,18.6151 6.3016,18.0241 C9.8016,16.3081 13.5716,15.4381 17.5076,15.4381 C18.9326,15.4381 20.3396,15.5531 21.7226,15.7841 C21.6666,15.8101 21.6096,15.8421 21.5536,15.8691 C21.3746,15.9571 21.1936,16.0481 21.0106,16.1431 C20.9126,16.1941 20.8146,16.2451 20.7146,16.2981 C20.5296,16.3981 20.3416,16.5011 20.1536,16.6061 C20.0606,16.6581 19.9696,16.7081 19.8766,16.7611 C19.6306,16.9021 19.3826,17.0471 19.1336,17.1961 C19.0806,17.2271 19.0286,17.2581 18.9756,17.2901 C18.7156,17.4461 18.4536,17.6071 18.1906,17.7711 C18.0726,17.8451 17.9536,17.9211 17.8346,17.9961 C17.6636,18.1041 17.4926,18.2121 17.3206,18.3231 C17.1876,18.4081 17.0536,18.4951 16.9196,18.5811 C16.7596,18.6861 16.5986,18.7901 16.4376,18.8961 C16.3016,18.9851 16.1666,19.0731 16.0306,19.1631 C15.8656,19.2721 15.6996,19.3821 15.5346,19.4921 C15.4006,19.5811 15.2656,19.6701 15.1316,19.7591 C14.8606,19.9401 14.5896,20.1211 14.3196,20.3021 C10.5766,22.7931 6.7066,25.3681 4.4186,25.3681 M51.5576,22.5751 C50.3896,15.4541 34.6696,4.3351 30.5506,1.9861 C29.2046,1.2191 27.5186,0.7961 25.8016,0.7961 C24.0766,0.7961 22.4546,1.2091 21.1146,1.9911 C17.9316,3.8421 7.6646,10.8931 2.7376,17.2401 C2.2336,17.8891 1.7976,18.5151 1.4386,19.1051 L1.3486,19.2491 C0.6436,20.4401 0.2256,21.4981 0.0726,22.4861 C-0.1704,24.0231 0.1996,25.3991 1.1446,26.4681 C1.9616,27.3841 3.0936,27.8691 4.4186,27.8691 C7.4626,27.8691 11.4656,25.2041 15.7696,22.3401 C19.2656,20.0021 23.6156,17.0921 25.8366,17.0921 C26.1866,17.0921 26.6346,17.1831 27.1686,17.3631 L27.3076,17.4111 C27.4266,17.4521 27.5466,17.4981 27.6686,17.5461 L28.0316,17.7021 C28.4876,17.8931 29.0086,18.1521 29.6736,18.5201 C29.7506,18.5631 29.8306,18.6071 29.8536,18.6171 C29.9016,18.6441 29.9496,18.6681 30.0066,18.6961 L30.2096,18.8151 C30.5126,18.9891 30.8226,19.1741 31.1236,19.3561 C32.3186,20.0871 33.5946,20.9451 34.8296,21.7741 L35.6106,22.2981 C37.7166,23.7241 39.7056,25.0711 41.5826,26.0941 C43.8556,27.3491 45.6136,27.9331 47.1146,27.9331 C48.5166,27.9331 49.6666,27.4401 50.5306,26.4661 C51.4566,25.4231 51.8106,24.0781 51.5576,22.5751\" />\n </g>\n </g>\n </g>\n </svg>\n)\n\nLogo.propTypes = {\n width: PropTypes.string,\n height: PropTypes.string\n}\n\nexport default Logo\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\n// Hooks\nimport { useTranslation } from 'shared/utils/useTranslation'\n\n// Components\nimport Logo from 'shop-components/components/MiniCart/components/Logo'\n\n// Shared\nimport { featureEnabled, FeatureFlags } from 'shared/utils/features'\n\nexport const PoweredBy = ({ logoWidth }) => {\n const { t } = useTranslation('user')\n\n let title = t('user.powered_by_short')\n let href = 'https://booqable.com/?source=Shop&campaign=Cart'\n\n if (featureEnabled(FeatureFlags.EQUIPMENT_RENTAL_SOFTWARE_LINK)) {\n title = t('user.powered_by_equipment_rental_long')\n href = 'https://booqable.com/equipment-rental-software/?source=Shop&campaign=Cart'\n }\n\n return (\n <a href={href} target=\"_blank\" title={title} rel=\"noreferrer\">\n <Logo width={logoWidth} />\n {t('user.powered_by_short')}\n </a>\n )\n}\n\nPoweredBy.propTypes = {\n logoWidth: PropTypes.string\n}\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Line from './line'\nimport Delay from 'store/v2/react/components/delay'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\n\n// Libraries\nimport { Motion, spring } from 'react-motion'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport clientActions from 'store/v2/redux/actions/client'\nimport ReactCSSTransitionGroup from 'shared/lib/react_css_transition_group'\n\nconst easing = { stiffness: 150, damping: 15 }\n\nclass Lines extends React.Component {\n static displayName = 'Lines'\n\n static propTypes = {\n className: PropTypes.string,\n hasDates: PropTypes.bool,\n cannotCheckout: PropTypes.bool,\n lines: PropTypes.object,\n toggleCart: PropTypes.func,\n nonServiceCartLinesCount: PropTypes.number,\n showPoweredBy: PropTypes.bool,\n t: PropTypes.func\n }\n\n componentWillUnmount () {\n return clientActions.setCartScroll(0)\n }\n\n render () {\n const { lines, hasDates, cannotCheckout, className, toggleCart, nonServiceCartLinesCount, showPoweredBy, t } = this.props\n\n return (\n <div id=\"booqable-sidebar-lines\" className={className}>\n <ReactCSSTransitionGroup transitionName=\"fade\" transitionEnterTimeout={100} transitionLeaveTimeout={100}>\n {hasDates && cannotCheckout && (\n <div className=\"bq-notice\">\n <i className=\"bq-icon-warning fas fa-exclamation-triangle\" />\n {t('user.store.not_all_products_available')}\n </div>\n )}\n </ReactCSSTransitionGroup>\n {!!nonServiceCartLinesCount && (\n <ul className=\"bq-list\">\n <ReactCSSTransitionGroup\n transitionName=\"booqable-sidebar-line\"\n transitionAppear={false}\n transitionEnter={false}\n transitionLeaveTimeout={300}\n component=\"li\"\n >\n {lines.map((line, i) => (\n <Delay key={line.id} initial={0} value={1} period={i * 80}>\n {(delayed) => (\n <Motion key={line.id} defaultStyle={{ v: 0 }} style={{ v: spring(delayed, easing) }}>\n {(value) => (\n <Line\n uiKey={line.id}\n key={line.id}\n line={line}\n hasDates={hasDates}\n style={{\n opacity: value.v,\n transform: !window.testMode && `scale(${value.v})`\n }}\n />\n )}\n </Motion>\n )}\n </Delay>\n ))}\n </ReactCSSTransitionGroup>\n </ul>\n )}\n {!nonServiceCartLinesCount && (\n <div className=\"bq-cleanstate\">\n {t('user.store.cart_empty')}\n <button className=\"bq-link\" onClick={toggleCart.bind(null, false)}>\n {t('user.store.continue_shopping')}\n </button>\n </div>\n )}\n {!nonServiceCartLinesCount && showPoweredBy && (\n <div className=\"bq-poweredby\">\n <PoweredBy logoWidth=\"16px\" />\n </div>\n )}\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const lines = state.orm.lines.getAll({ id: props.cart != null ? props.cart.lines : undefined })\n const nonServiceCartLinesCount = lines.pluck('product_type').filter((type) => type !== 'service').length\n const showPoweredBy = state.settings.get('store.show_powered_by')\n\n return {\n cartOpen: state.client.cartOpen,\n lines,\n nonServiceCartLinesCount,\n className: 'active',\n showPoweredBy\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps))(Lines)\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nimport FormatUtils from 'shared/utils/format'\n\nexport class ProductPrice extends Component {\n static displayName = 'ProductPrice'\n\n static propTypes = {\n chargeLabel: PropTypes.string,\n priceInCents: PropTypes.number,\n currency: PropTypes.object,\n show: PropTypes.bool,\n productType: PropTypes.string,\n priceType: PropTypes.string,\n t: PropTypes.func\n }\n\n static defaultProps = {\n productType: 'rental'\n }\n\n render = () => {\n const { priceInCents, chargeLabel, productType, priceType, t } = this.props\n\n if (this.props.show) {\n return (\n <span className=\"bq-price-details\">\n {(priceType !== 'fixed' || productType !== 'rental') && (\n <span className=\"bq-duration\">\n {(productType === 'rental' || productType === 'bundle') && chargeLabel}\n {productType === 'consumable' && <b>{t('user.store.buy')}</b>}\n </span>\n )}\n <span className=\"bq-price\">\n {FormatUtils.money(priceInCents, this.props.currency)}\n </span>\n </span>\n )\n } else {\n return false\n }\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const usePrices = state.settings.get('store.use_prices')\n const hasPrice = props.priceInCents != null && props.priceInCents >= 0\n\n return {\n currency: state.client.currency && state.client.currency.toJS(),\n show: usePrices && hasPrice\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {}\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(ProductPrice)\n\nexport default withTranslation('user')(reduxComponent)\n","import styled, { css } from 'styled-components'\nimport { fontSize, fontWeight, size } from 'ui/themes/utils'\n\nexport const Services = styled.div`\n &&& {\n max-height: 180px;\n overflow-y: auto;\n padding-top: 16px;\n\n /* So scroll bar lines up with products scroll bar */\n margin-right: -15px;\n padding-right: 15px;\n\n /* Shadows to indiciate scroll */\n background: linear-gradient(#ffffff 33%, rgba(255, 255, 255, 0)),\n linear-gradient(rgba(255, 255, 255, 0), #ffffff 66%) 0 100%,\n radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0)),\n radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0)) 0 100%;\n background-color: #ffffff;\n background-repeat: no-repeat;\n background-attachment: local, local, scroll, scroll;\n background-size: 100% 30px, 100% 30px, 100% 10px, 100% 10px;\n }\n`\n\nexport const Service = styled.div`\n &&& {\n display: flex;\n justify-content: space-between;\n padding-top: 8px;\n\n ${({ disabled }) => disabled && css`\n opacity: 0.7;\n `}\n }\n`\n\nexport const Label = styled.span`\n &&& {\n font-size: ${fontSize('md')};\n font-weight: ${fontWeight('lighter')};\n\n margin-right: ${size('margin', 'xs')};\n }\n`\n","import { Services, Service, Label } from './styles'\n\nServices.Service = Service\nServices.Label = Label\n\nexport default Services\n","// React\nimport React, { useCallback, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport ProductPrice from 'store/v2/react/components/product_price'\nimport Switch from 'ui/components/Switch'\nimport BServices from 'store/blocks/Services'\n\n// Shared\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\n\nconst Service = ({ index, line, service, inCart, hasPrice, toggleService }) => {\n const [loading, setLoading] = useState(false)\n const [checked, setChecked] = useState(inCart)\n\n const handleChangeService = useCallback(() => {\n const value = !checked\n\n setLoading(true)\n toggleService(value).then(() => {\n if (checked !== value) {\n setChecked(value)\n }\n }).catch((error) => {\n console.error(error)\n }).finally(() => {\n setLoading(false)\n })\n }, [checked])\n\n return (\n <BServices.Service data-tid={`Service #${index + 1}`} disabled={!checked}>\n <BServices.Label className=\"service-label\">\n {service.name}\n {' '}\n {hasPrice && SettingsUtils.get('store.use_prices') && (\n <span>\n (\n <ProductPrice\n chargeLabel={(line || service).charge_label}\n priceInCents={line?.display_price_in_cents || service?.price_in_cents}\n priceType={(line || service).price_type}\n productType={(line || service).product_type}\n />\n )\n </span>\n )}\n </BServices.Label>\n <Switch\n className=\"service-toggle\"\n field={{ value: checked, onChange: handleChangeService }}\n disabled={loading}\n withActiveEffect={false}\n relative\n block\n />\n </BServices.Service>\n )\n}\n\nService.displayName = 'Service'\n\nService.propTypes = {\n index: PropTypes.number,\n line: PropTypes.object,\n service: PropTypes.object,\n inCart: PropTypes.bool,\n hasPrice: PropTypes.bool,\n toggleService: PropTypes.func\n}\n\nconst mapStateToProps = (_state, props) => {\n const hasPrice =\n props.service?.price_in_cents >= 0 &&\n props.service?.price_in_cents !== null &&\n props.service?.price_type !== 'none' &&\n props.service?.price_type !== null\n\n return {\n line: props.lines\n .getAll({ item_id: props.service.id })\n .reverse()\n .first(),\n checked: props.inCart,\n hasPrice\n }\n}\n\nconst mapDispatchToProps = (_dispatch, props) => {\n const book = (quantity) => {\n return CartActions.book({\n item_id: props.service.id,\n quantity,\n type: 'set',\n apiVersion: 1\n }).then(() => {\n const quantityChange = quantity === 0 ? -1 : 1\n\n triggerUserFrameworkBookEvent(props.service.id, quantityChange)\n })\n }\n\n return {\n toggleService: (value) => {\n if (value) {\n return book(1)\n } else {\n return book(0)\n }\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(Service)\n","// React\nimport React, { useCallback, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport Service from './Service'\nimport BServices from 'store/blocks/Services'\n\n// Shared\nimport ProductGroupActions from 'store/v2/redux/actions/product_group'\n\nconst Services = ({ cart, lines, services, items, fetchServices }) => {\n useEffect(() => {\n if (cart) {\n fetchServices(cart.id)\n }\n }, [cart?.id, cart?.starts_at, cart?.stops_at])\n\n const isServiceInCart = useCallback(\n (serviceId) => {\n return items.includes(serviceId)\n },\n [items]\n )\n\n return (\n <BServices className=\"bq-service-lines\">\n {services.map((service, index) => {\n const inCart = isServiceInCart(service.id)\n\n return <Service key={service.id} index={index} lines={lines} service={service} inCart={inCart} />\n })}\n </BServices>\n )\n}\n\nServices.displayName = 'Services'\n\nServices.propTypes = {\n cart: PropTypes.object,\n lines: PropTypes.object,\n services: PropTypes.object,\n items: PropTypes.object,\n fetchServices: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const lines = state.orm.lines.getAll({ id: props.cart != null ? props.cart.lines : undefined })\n const items = lines.map((line) => line.item_id)\n const enabledServices = state.orm.product_groups.getAll({ product_type: 'service', show_in_store: true })\n const services =\n state.orm.products\n .getAll({ product_type: 'service', product_group_id: enabledServices.pluck('id') })\n .sortBy((product) => enabledServices.getById(product.product_group_id)?.sorting_weight)\n\n return {\n lines,\n services,\n items\n }\n}\n\nconst mapDispatchToProps = (_dispatch) => ({\n fetchServices: (cartId) => ProductGroupActions.fetchServices({ cart_id: cartId })\n})\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(Services)\n","import styled from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nconst Overdue = styled.div`\n margin-top: 15px !important;\n color: ${color('Accent6/Base')};\n line-height: 1.2rem;\n i {\n margin-right: 5px;\n }\n`\n\nexport default Overdue\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\nimport BOverdue from 'store/v2/react/scenes/cart/blocks/Overdue'\n\n// Shared\n\n/**\n * Overdue notification\n *\n * @example\n * <Overdue show={Boolean} websiteURL={String} />\n */\n\nexport class Overdue extends Component {\n static displayName = 'Overdue'\n\n static propTypes = {\n show: PropTypes.bool\n }\n\n render = () => {\n return this.props.show && (\n <BOverdue>\n <i className=\"fas fa-exclamation-triangle\" />\n {this.props.t('user.checkout.dates_in_past')}\n </BOverdue>\n )\n }\n}\n\nexport default withTranslation('user')(Overdue)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Period from 'store/v2/react/scenes/cart/period'\nimport Lines from 'store/v2/react/scenes/cart/lines'\nimport Services from 'store/components/Services'\nimport Overdue from 'store/v2/react/scenes/cart/components/Overdue'\nimport Tooltip from 'ui/components/Tooltip'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\n\n// Libraries\nimport { StyleSheetManager } from 'styled-components'\n\n// Shared\nimport ClientActions from 'store/v2/redux/actions/client'\nimport Format from 'shared/utils/format'\nimport ReactCSSTransitionGroup from 'shared/lib/react_css_transition_group'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport previewUrlComposer from 'shared/utils/previewUrlComposer'\nimport { shouldForwardProp } from 'shared/utils/shouldForwardProp'\n\nclass FloatingCart extends Component {\n static displayName = 'FloatingCart'\n\n static propTypes = {\n cartOpen: PropTypes.bool,\n toggleCart: PropTypes.func,\n cart: PropTypes.object,\n locations: PropTypes.object,\n hasDates: PropTypes.bool,\n cannotCheckout: PropTypes.bool,\n showPrices: PropTypes.bool,\n showPoweredBy: PropTypes.bool,\n totalPriceAttribute: PropTypes.string,\n currency: PropTypes.object,\n checkingOut: PropTypes.bool,\n setCheckingOut: PropTypes.func,\n viewCartHref: PropTypes.string,\n checkoutButtonValid: PropTypes.bool,\n cartOverdue: PropTypes.bool,\n inPortal: PropTypes.bool,\n nonServiceCartLinesCount: PropTypes.number,\n t: PropTypes.func\n }\n\n state = {\n autoOpenedModal: false\n }\n\n onAutoModal = (callback) => {\n // Needs to live in parent state as Period gets unmounted\n // on some transitions losing state\n this.setState({ autoOpenedModal: true }, callback)\n }\n\n renderCheckoutButton = () => {\n const { checkoutButtonValid, hasDates, cannotCheckout, setCheckingOut, viewCartHref, t } = this.props\n const checkoutButtonClass = checkoutButtonValid ? 'bq-enabled' : 'bq-disabled'\n\n const checkoutButton = (\n <button onClick={setCheckingOut} className={`bq-branded bq-button ${checkoutButtonClass}`}>\n {t('user.store.checkout')}\n </button>\n )\n\n let tooltipContent = t('user.store.select_a_period')\n\n if (hasDates && cannotCheckout) {\n tooltipContent = t('user.store.not_all_products_available')\n }\n\n return (\n <div className=\"button-group\">\n {viewCartHref && (\n <a href={window.Booqable.decorateLinkForTracking(viewCartHref)} className=\"bq-branded bq-button\">\n {t('user.store.view_cart')}\n </a>\n )}\n {checkoutButtonValid && (\n checkoutButton\n )}\n {!checkoutButtonValid && (\n <Tooltip direction=\"bottom\" content={tooltipContent}>\n {checkoutButton}\n </Tooltip>\n )}\n </div>\n )\n }\n\n render () {\n const { autoOpenedModal } = this.state\n const {\n cart,\n cartOpen,\n toggleCart,\n cartOverdue,\n cannotCheckout,\n checkingOut,\n hasDates,\n showPrices,\n showPoweredBy,\n currency,\n totalPriceAttribute,\n inPortal,\n locations,\n nonServiceCartLinesCount,\n t\n } = this.props\n const floatingCartClasses = []\n\n floatingCartClasses.push(cartOpen ? 'open' : 'closed')\n\n if (inPortal) {\n floatingCartClasses.push('portal')\n }\n\n return (\n <ReactCSSTransitionGroup\n transitionName=\"booqable-sidebar\"\n transitionEnterTimeout={100}\n transitionLeaveTimeout={100}\n >\n <div\n id=\"booqable-sidebar-inner\"\n key={`booqable-sidebar-${cartOpen}`}\n data-tid=\"Mini cart\"\n className={floatingCartClasses.join(' ')}\n >\n <div className=\"bq-sidebar-head\">\n <button className=\"bq-branded bq-close\" onClick={toggleCart.bind(null, false)}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </button>\n <div className=\"bq-branded bq-title\">{t('user.store.my_order')}</div>\n <StyleSheetManager target={document.body} shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <Period\n cart={cart}\n hasDates={hasDates}\n locations={locations}\n autoOpenedModal={autoOpenedModal}\n onAutoModal={this.onAutoModal}\n />\n </StyleSheetManager>\n </div>\n <Lines toggleCart={toggleCart} cart={cart} cannotCheckout={cannotCheckout} hasDates={hasDates} />\n <ReactCSSTransitionGroup\n transitionName=\"booqable-sidebar-summary\"\n transitionEnterTimeout={150}\n transitionLeaveTimeout={150}\n component=\"div\"\n >\n {nonServiceCartLinesCount > 0 && (\n <div id=\"booqable-sidebar-summary\">\n {cart && (\n <StyleSheetManager target={document.body} shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <Services cart={cart} />\n </StyleSheetManager>\n )}\n {showPrices && (\n <div>\n <div className=\"bq-detail bq-strong\">\n <span>{t('user.store.subtotal')}</span>\n <span className=\"bq-amount\">{Format.money(cart?.get(totalPriceAttribute), currency)}</span>\n </div>\n\n {cart !== null && cart.get('deposit_in_cents') !== 0 && (\n <div className=\"bq-detail\">\n <span>{t('user.store.security_deposit')}</span>\n <span className=\"bq-amount\">{Format.money(cart.get('deposit_in_cents'), currency)}</span>\n </div>\n )}\n\n <Overdue show={cartOverdue} />\n </div>\n )}\n {checkingOut && (\n <div className=\"bq-loading-wrapper\">\n <div className=\"bq-loader\" />\n </div>\n )}\n {!checkingOut && this.renderCheckoutButton()}\n {showPoweredBy && (\n <div className=\"bq-poweredby\">\n <PoweredBy logoWidth=\"16px\" />\n </div>\n )}\n </div>\n )}\n </ReactCSSTransitionGroup>\n </div>\n </ReactCSSTransitionGroup>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n let cannotCheckout, totalPriceAttribute\n\n const slug = state.client.getIn(['company', 'slug'])\n const cart = state.orm.carts.getById(state.client.cartId)\n\n const cartLines = state.orm.lines.getById(cart.lines)\n const nonServiceCartLinesCount = cartLines.pluck('product_type').filter((type) => type !== 'service').length\n\n const cartOverdue = state.client.cartOverdue\n\n const searchParams = new URLSearchParams(window.location.search)\n const href = window.booqableOptions.preview ?\n previewUrlComposer({ slug, themeId: searchParams.get('theme_id'), key: 'templates/cart.json' }) :\n props.href || cart?.cart_url\n\n if (state.settings.get('pricing.tax_strategy') === 'inclusive') {\n totalPriceAttribute = 'grand_total_with_tax_in_cents'\n } else {\n totalPriceAttribute = 'grand_total_in_cents'\n }\n\n const hasDates = !!(cart?.starts_at && cart?.stops_at)\n const useAvailability = state.settings.get('store.use_availability')\n\n // Check if we need to calculate if use can checkout\n if (useAvailability) {\n cannotCheckout =\n state.orm.lines\n .getAll({\n id: cart?.lines,\n can_checkout: false\n })\n .size() > 0\n } else {\n cannotCheckout = false\n }\n\n // Make sure to typecast to boolean\n const checkoutButtonValid = !!(nonServiceCartLinesCount && hasDates && !cannotCheckout && !cartOverdue)\n\n return {\n cart,\n nonServiceCartLinesCount,\n cartOpen: state.client.cartOpen,\n cartScroll: state.client.cartScroll,\n currency: state.client.currency?.toJS(),\n totalPriceAttribute,\n checkoutButtonValid,\n hasDates,\n checkingOut: state.client.checkingOut,\n cannotCheckout,\n showPrices: state.settings.get('store.use_prices'),\n showPoweredBy: state.settings.get('store.show_powered_by'),\n cartOverdue,\n locations: state.orm.locations.getAll().sort('name'),\n viewCartHref: href\n }\n}\n\nconst mapDispatchToProps = () => {\n return {\n toggleCart: (cartOpen) => {\n return ClientActions.toggleCart(cartOpen)\n },\n setCheckingOut: (e) => {\n e.preventDefault()\n\n if (ClientActions.evaluateCartOverdue()) return\n\n ClientActions.setCheckingOut()\n }\n }\n}\n\nexport default compose(reduxConnect(mapStateToProps, mapDispatchToProps), withTranslation('user'))(FloatingCart)\n","import styled, { css } from 'styled-components'\nimport { color, size, fontSize, fontWeight } from 'ui/themes/utils'\n\nimport Div from 'ui/elements/Div'\nimport Button from 'ui/elements/Button'\n\nexport const Backdrop = styled(Div)`\n position: fixed;\n\n display: flex;\n justify-content: center;\n\n top: 0;\n left: 0;\n\n width: 100vw;\n height: 100%;\n\n /* 99 = 0.6 opacity */\n background: ${color('Accent2/Controlvariant1')}99;\n\n opacity: ${({ state }) => (state === 'entered' ? 1 : 0)};\n\n padding: ${size('padding', 'lg')};\n\n font-family: ${(props) => props.theme.font.body};\n\n transition: 0.25s all;\n\n z-index: 10000000;\n\n box-sizing: border-box;\n`\n\nexport const Body = styled(Div)`\n padding: ${size('padding', 'md')};\n\n @media screen and (max-height: 562px) {\n max-height: none;\n }\n`\n\nexport const Header = styled(Div)`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n\n padding: ${size('padding', 'md')};\n\n &:empty {\n padding: 0;\n }\n`\n\nexport const Footer = styled(Div)`\n display: flex;\n\n padding: ${size('padding', 'md')};\n\n background-color: ${color('white')};\n\n box-shadow: 0 -4px 10px 0 rgba(0, 0, 0, 0.18);\n\n z-index: 100;\n\n position: sticky;\n bottom: 0;\n left: 0;\n right: 0;\n`\n\nexport const Container = styled(Div)`\n max-width: 825px;\n max-height: 100%;\n width: 100%;\n\n background: ${color('white')};\n\n box-shadow: 0 7px 10px 0 rgba(0, 0, 0, 0.18);\n\n border-radius: ${size('borderRadius')};\n\n margin: auto 0;\n\n opacity: 0;\n\n transform: translateY(15%);\n\n position: relative;\n\n ${({ state }) => state === 'entered' && css`\n opacity: 1;\n transform: translateY(0);\n `}\n\n overflow-y: auto;\n transition: all 0.25s ease;\n`\n\nexport const Close = styled(Button)`\n appearance: none;\n\n background: transparent;\n\n border: none;\n\n position: absolute;\n\n top: ${size('padding', 'sm')};\n right: ${size('padding', 'sm')};\n\n opacity: 0.6;\n\n padding: 0;\n\n font-weight: ${fontWeight('bold')};\n font-size: ${fontSize('lg')};\n\n cursor: pointer;\n\n z-index: 99;\n\n transition: opacity 0.3s ease-in;\n\n &:hover, &:focus {\n opacity: 1;\n }\n`\n","/**\n * @fileoverview A customizable Modal component with header, body, and footer subcomponents.\n * @module Modal\n */\n\n// React\nimport React, { useRef, forwardRef } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { Transition, config } from 'react-transition-group'\n\n// Hooks\nimport { useLockScroll } from 'shared/utils/useLockScroll'\n\n// Components\nimport PortalWrapper from 'ui/components/PortalWrapper'\nimport Icon from 'ui/components/Icon'\nimport H3 from 'ui/elements/H3'\nimport { Backdrop, Body, Container, Header, Footer, Close } from 'store/blocks/Modal'\n\n/**\n * @typedef {Object} ModalModifiers\n * @property {string} [backdrop] - Custom CSS class for the backdrop.\n * @property {string} [container] - Custom CSS class for the container.\n */\n\n/**\n * A customizable Modal component that can be opened and closed.\n * It uses react-transition-group for enter/exit animations\n * and custom hooks for handling outside clicks and locking the body scroll.\n *\n * @component\n * @param {Object} props - The properties that define the Modal's behavior and content.\n * @param {boolean} props.open - Determines whether the modal is visible.\n * @param {Function} [props.onClose] - Callback function to be called when the modal should be closed.\n * @param {ModalModifiers} [props.modifiers] - Custom CSS classes for styling different parts of the modal.\n * @param {React.ReactNode} props.children - The content to be rendered inside the modal.\n *\n * @example\n * // Named import\n * import { Modal, ModalHeader, ModalBody, ModalFooter } from 'ui/components/Modal'\n *\n * <Modal\n * open={isOpen}\n * onClose={handleClose}\n * modifiers={{ backdrop: 'custom-backdrop', container: 'custom-container' }}\n * >\n * <ModalHeader>Modal Title</ModalHeader>\n * <ModalBody>Modal Content</ModalBody>\n * <ModalFooter>\n * <button onClick={handleClose}>Close</button>\n * </ModalFooter>\n * </Modal>\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Root\n * open={isOpen}\n * onClose={handleClose}\n * modifiers={{ backdrop: 'custom-backdrop', container: 'custom-container' }}\n * >\n * <Modal.Header>Modal Title</Modal.Header>\n * <Modal.Body>Modal Content</Modal.Body>\n * <Modal.Footer>\n * <button onClick={handleClose}>Close</button>\n * </Modal.Footer>\n * </Modal.Root>\n */\nexport const Modal = ({ open, onClose, modifiers, children }) => {\n // disables animations when in test mode\n config.disabled = !!window.testMode\n\n const nodeRef = useRef(null)\n\n useLockScroll(open)\n\n const handleBackdropClick = (event) => {\n if (event.target === event.currentTarget) {\n onClose?.()\n }\n }\n\n return (\n <Transition nodeRef={nodeRef} in={open} timeout={{ enter: 0, exit: 250 }}>\n {(state) => (\n <PortalWrapper open={open || state === 'exiting' || state === 'entered'}>\n <Backdrop onClick={handleBackdropClick} state={state} modifiers={modifiers?.backdrop}>\n <Container data-tid=\"Modal\" state={state} modifiers={modifiers?.container}>\n {children}\n </Container>\n </Backdrop>\n </PortalWrapper>\n )}\n </Transition>\n )\n}\n\nModal.propTypes = {\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func,\n modifiers: PropTypes.shape({\n backdrop: PropTypes.string,\n container: PropTypes.string\n }),\n children: PropTypes.node\n}\n\n/**\n * The close button for the Modal.\n *\n * @component\n * @param {Object} props - The properties for the ModalClose.\n * @param {Function} props.onClose - Callback function to be called when the close button is clicked.\n *\n * @example\n * // Named import\n * import { ModalClose } from 'ui/components/Modal'\n *\n * <ModalClose onClose={handleClose} />\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Close onClose={handleClose} />\n */\nexport const ModalClose = forwardRef(({ onClose }, ref) => (\n <Close ref={ref} onClick={onClose} data-tid=\"Close icon\">\n <Icon icon=\"times\" />\n </Close>\n))\n\nModalClose.displayName = 'ModalClose'\n\nModalClose.propTypes = {\n onClose: PropTypes.func\n}\n\n/**\n * The header section of the Modal.\n *\n * @component\n * @param {Object} props - The properties for the ModalHeader.\n * @param {React.ReactNode} props.children - The content to be rendered inside the header.\n * @param {string} [props.modifiers] - Custom CSS class for styling the header.\n *\n * @example\n * // Named import\n * import { ModalHeader } from 'ui/components/Modal'\n *\n * <ModalHeader modifiers=\"custom-header-class\">Modal Title</ModalHeader>\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Header modifiers=\"custom-header-class\">Modal Title</Modal.Header>\n */\nexport const ModalHeader = forwardRef(({ children, ...props }, ref) => (\n <Header ref={ref} {...props}>\n {children}\n </Header>\n))\n\nModalHeader.displayName = 'ModalHeader'\n\nModalHeader.propTypes = {\n children: PropTypes.node\n}\n\n/**\n * The title component for the Modal header.\n *\n * @component\n * @param {Object} props - The properties for the ModalTitle.\n * @param {React.ReactNode} props.children - The content to be rendered as the modal title.\n *\n * @example\n * // Named import\n * import { ModalTitle } from 'ui/components/Modal'\n *\n * <ModalTitle>Welcome to Our Application</ModalTitle>\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Title>Welcome to Our Application</Modal.Title>\n */\nexport const ModalTitle = ({ children, ...props }) => <H3 {...props}>{children}</H3>\n\nModalTitle.propTypes = {\n children: PropTypes.node\n}\n\n/**\n * The body section of the Modal.\n *\n * @component\n * @param {Object} props - The properties for the ModalBody.\n * @param {React.ReactNode} props.children - The content to be rendered inside the body.\n * @param {string} [props.modifiers] - Custom CSS class for styling the body.\n *\n * @example\n * // Named import\n * import { ModalBody } from 'ui/components/Modal'\n *\n * <ModalBody modifiers=\"custom-body-class\">\n * <p>This is the main content of the modal.</p>\n * </ModalBody>\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Body modifiers=\"custom-body-class\">\n * <p>This is the main content of the modal.</p>\n * </Modal.Body>\n */\nexport const ModalBody = forwardRef(({ children, ...props }, ref) => (\n <Body ref={ref} {...props}>\n {children}\n </Body>\n))\n\nModalBody.displayName = 'ModalBody'\n\nModalBody.propTypes = {\n children: PropTypes.node\n}\n\n/**\n * The footer section of the Modal.\n *\n * @component\n * @param {Object} props - The properties for the ModalFooter.\n * @param {React.ReactNode} props.children - The content to be rendered inside the footer.\n * @param {string} [props.modifiers] - Custom CSS class for styling the footer.\n *\n * @example\n * // Named import\n * import { ModalFooter } from 'ui/components/Modal'\n *\n * <ModalFooter modifiers=\"custom-footer-class\">\n * <button onClick={handleClose}>Close</button>\n * <button onClick={handleSave}>Save</button>\n * </ModalFooter>\n *\n * @example\n * // Namespace import\n * import * as Modal from 'ui/components/Modal'\n *\n * <Modal.Footer modifiers=\"custom-footer-class\">\n * <button onClick={handleClose}>Close</button>\n * <button onClick={handleSave}>Save</button>\n * </Modal.Footer>\n */\nexport const ModalFooter = forwardRef(({ children, ...props }, ref) => (\n <Footer ref={ref} data-tid=\"Modal actions\" {...props}>\n {children}\n </Footer>\n))\n\nModalFooter.displayName = 'ModalFooter'\n\nModalFooter.propTypes = {\n children: PropTypes.node\n}\n","import { useLayoutEffect } from 'react'\n\nexport const useLockScroll = (open) => {\n useLayoutEffect(() => {\n const originalStyle = window.getComputedStyle(document.body).overflow\n\n if (open) {\n document.body.style.overflow = 'hidden'\n }\n\n return () => {\n document.body.style.overflow = originalStyle\n }\n }, [open])\n}\n","// React\nimport React, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { pick } from 'lodash'\n\n// Components\nimport Select from 'ui/components/Select'\n\n// Hooks\nimport { useFormikContext } from 'formik'\n\nexport const UserAddressesSelect = ({ addresses }) => {\n const [selectedAddress, setSelectedAddress] = useState(null)\n\n const form = useFormikContext()\n\n useEffect(() => {\n if (!addresses?.length) return\n\n // Select expecting it's own shape as value\n setSelectedAddress({\n value: addresses[0].id,\n label: addresses[0].value\n })\n }, [addresses])\n\n const options = addresses.map((address) => ({\n value: address.id,\n label: address.value\n }))\n\n const handleUserAddressSelect = (id) => {\n const option = options.find((option) => option.value === id)\n\n if (!option) return\n\n setSelectedAddress(option)\n\n const address = addresses.find((address) => address.id === id)\n\n if (!address) return\n\n form.setValues({\n ...form.values,\n data: {\n ...form.values.data,\n delivery_address_property_id: id\n },\n delivery_address: pick(address, [\n 'address1',\n 'address2',\n 'zipcode',\n 'city',\n 'region',\n 'province',\n 'country',\n 'country_id'\n ])\n })\n }\n\n return (\n <Select\n value={selectedAddress}\n options={options}\n onChange={handleUserAddressSelect}\n data-tid=\"User addresses select\"\n forceValue\n forceOnChange\n />\n )\n}\n\nUserAddressesSelect.propTypes = {\n addresses: PropTypes.array\n}\n","// React\nimport React, { useEffect, useState, Fragment } from 'react'\n\n// Components\nimport AddressFields from 'back_office/modules/addresses/components/AddressFields'\nimport { UserAddressesSelect } from './UserAddressesSelect'\nimport Span from 'ui/elements/Span'\nimport A from 'ui/elements/A'\nimport Div from 'ui/elements/Div'\nimport Label from 'ui/elements/Label'\n\n// Libraries\nimport axios from 'axios'\n\n// Hooks\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useFormikContext } from 'formik'\nimport { useSelector } from 'react-redux'\nimport { useSettings } from 'shared/utils/useSettings'\n\n// Shared\nimport { addressFieldsOrder } from 'back_office/modules/addresses/components/addressFieldsOrder'\nimport { fetchCountriesAndProvinces } from 'back_office/modules/addresses/components/fetchCountriesAndProvinces'\nimport { featureDisabled, FeatureFlags } from 'shared/utils/features'\n\nexport const DeliveryFulfillmentForm = () => {\n const [userAddresses, setUserAddresses] = useState([])\n const [isUserAuthenticated, setIsUserAuthenticated] = useState(undefined)\n\n const form = useFormikContext()\n const { t, tOrEmptyString, Trans } = useTranslation('user')\n\n const cartId = useSelector((state) => state.client.cartId)\n\n const cart = useOrm('carts', (carts) => carts.getById(cartId || window.booqableOptions.cart?.id))\n const countries = useOrm('countries', (countries) => {\n return countries.getAll().toArray()\n })\n const provinces = useOrm('provinces', (provinces) => {\n return provinces.getAll().toArray()\n })\n\n const isAuthEnabled = useSettings('user.auth_enabled')\n\n const authUriBase = cart?.user_login_url ?? '/customers/login'\n const authRedirectUriParamValue = `${window.location.origin}?${encodeURIComponent(\n 'open-picker=true&fulfillment-tab=delivery'\n )}`\n const authUri = `${authUriBase}?redirect_uri=${authRedirectUriParamValue}`\n\n useEffect(() => {\n if (!cart) return\n if (!isAuthEnabled) return\n\n const userAddressesUrl = window.booqableOptions?.apiURL ?\n `${window.booqableOptions?.apiURL}/user_addresses` :\n '/user_addresses'\n\n axios\n .get(userAddressesUrl)\n .then(({ data }) => {\n setIsUserAuthenticated(true)\n setUserAddresses(data.properties)\n })\n .catch(() => {\n setIsUserAuthenticated(false)\n })\n }, [cart?.id, isAuthEnabled])\n\n useEffect(() => {\n if (!countries.length || !provinces.length) {\n fetchCountriesAndProvinces()\n }\n }, [])\n\n return (\n <Fragment>\n {isUserAuthenticated && userAddresses.length > 0 && (\n <Div modifiers=\"margin-bottom-md\">\n <Label modifiers=\"margin-bottom-xs\">{t('user.deliveries.choose_saved_address')}</Label>\n <UserAddressesSelect addresses={userAddresses} />\n </Div>\n )}\n <AddressFields\n defaultFormLayout={addressFieldsOrder()}\n skipValidation={featureDisabled(FeatureFlags.NEW_ADDRESS_VALIDATION)}\n invalidExistingAddressWarning={t('user.deliveries.invalid_existing_address_warning')}\n fieldTranslationPrefix=\"user.deliveries\"\n errorKey=\"user.public_errors.invalid\"\n selectPlaceholder={tOrEmptyString('user.checkout.select_placeholder')}\n initialValues={form.initialValues}\n countries={countries}\n provinces={provinces}\n addressIdentifier=\"delivery_address\"\n fieldDebounce={750}\n />\n {isUserAuthenticated === false && isAuthEnabled && (\n <Span modifiers=\"display-inline-block font-size-md margin-top-md\">\n <Trans\n i18nKey=\"user.deliveries.login\"\n components={{\n Link: <A modifiers=\"font-weight-bold font-size-md text-blue text-decoration-none\" href={authUri} />\n }}\n />\n </Span>\n )}\n </Fragment>\n )\n}\n","// React\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport const useCachedQuery = (queryFn, options = {}) => {\n const [isLoading, setIsLoading] = useState(false)\n\n // Cache to store results for different keys\n const cache = useRef(new Map())\n const previousKey = useRef(options.key)\n\n useEffect(() => {\n if (previousKey.current !== options.key) {\n // If we have cached data for the new key, use it\n if (options.key !== undefined && cache.current.has(options.key)) {\n options.onSuccess?.(cache.current.get(options.key))\n }\n\n previousKey.current = options.key\n }\n }, [options.key])\n\n const perform = useCallback(\n async (...args) => {\n // If key is undefined, always fetch\n // If key has changed from the previous fetch, fetch again\n // If key exists but no cached data, fetch\n const shouldFetch = options.key === undefined || !cache.current.has(options.key)\n\n if (!shouldFetch) {\n const cached = cache.current.get(options.key)\n\n options.onSuccess?.(cached)\n\n return cached\n }\n\n setIsLoading(true)\n\n options.onLoading?.()\n\n try {\n const result = await queryFn(...args)\n\n options.onSuccess?.(result)\n\n // Cache the result if we have a key\n if (options.key !== undefined) {\n cache.current.set(options.key, result)\n }\n\n return result\n } catch (err) {\n options.onError?.(err)\n\n throw new Error(options.errorKey || 'fetch_error')\n } finally {\n setIsLoading(false)\n }\n },\n [queryFn, options.key]\n )\n\n return {\n isLoading,\n perform\n }\n}\n","import axios from 'axios'\n\nexport const fetchDeliveryOptionsRequest = ({ cartId, deliveryAddress }) => {\n return axios.post(`${window.booqableOptions?.apiUrl ?? ''}/delivery_options`, {\n cart_id: cartId,\n delivery: {\n address: deliveryAddress\n },\n skip_checkout_validation: true,\n skip_shortage_validation: true\n })\n}\n","// React\nimport React, { createContext, useState, useEffect, useCallback } from 'react'\nimport PropTypes from 'prop-types'\n\n// Hooks\nimport { useSettings } from 'shared/utils/useSettings'\nimport { usePrevious } from 'shared/utils/usePrevious'\n\n// Actions\nimport ClientActions from 'store/v2/redux/actions/client'\nimport ItemActions from 'store/v2/redux/actions/item'\nimport CartActions from 'store/v2/redux/actions/cart'\n\n// Shared\nimport moment from 'shared/lib/moment'\nimport { featureEnabled, FeatureFlags } from 'back_office/v2/utils/utils'\n\nexport const CartPickerContext = createContext({\n cart: null,\n onSave: async () => {},\n onChange: () => {},\n onValidate: () => {},\n isValid: false,\n isLoading: false,\n setLoading: () => {}\n})\n\nexport const CartPickerProvider = ({ children, cart, onSave }) => {\n const [values, setValues] = useState(null)\n\n const [isValid, setIsValid] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const previousCart = usePrevious(cart)\n\n const behavior = useSettings('store.behaviors.location_picker', 'start_stop')\n const defaultStartLocationId = useSettings('defaults.shop_start_location_id')\n const defaultStopLocationId = useSettings('defaults.shop_stop_location_id')\n\n useEffect(() => {\n if ((!previousCart && cart) || (!previousCart?.starts_at && cart?.starts_at)) {\n setValues({\n start_location_id: cart.start_location_id,\n starts_at: cart.starts_at,\n stop_location_id: cart.stop_location_id,\n stops_at: cart.stops_at\n })\n }\n\n const shouldUpdateValues =\n previousCart?.starts_at !== cart?.starts_at ||\n previousCart?.stops_at !== cart?.stops_at ||\n previousCart?.start_location_id !== cart?.start_location_id ||\n previousCart?.stop_location_id !== cart?.stop_location_id\n\n if (shouldUpdateValues) {\n setValues({\n start_location_id: cart.start_location_id,\n starts_at: cart.starts_at,\n stop_location_id: cart.stop_location_id,\n stops_at: cart.stops_at\n })\n }\n }, [cart, previousCart])\n\n const handleChange = useCallback((newValues) => {\n setValues(newValues)\n }, [])\n\n const handleValidate = useCallback((valid) => {\n setIsValid(valid)\n }, [])\n\n const handleSave = useCallback(\n async (payload) => {\n const nextValues = { ...(payload || values) }\n\n switch (behavior) {\n case 'start':\n nextValues.stop_location_id = nextValues.start_location_id\n break\n case 'auto':\n nextValues.start_location_id = defaultStartLocationId\n nextValues.stop_location_id = defaultStopLocationId\n break\n default:\n break\n }\n\n if (featureEnabled(FeatureFlags.DELIVERIES) && nextValues.data.fulfillment_type === 'delivery') {\n nextValues.data.delivery_address = nextValues.delivery_address\n\n delete nextValues.delivery_address\n }\n\n setIsLoading(true)\n\n try {\n const response = await CartActions.update({\n ...nextValues,\n starts_at: moment(nextValues.starts_at),\n stops_at: moment(nextValues.stops_at)\n })\n\n onSave?.()\n\n const cartId = response.payload.response.cart.id\n\n await ItemActions.fetchAllOnPage(cartId)\n\n ClientActions.evaluateCartOverdue()\n\n setIsLoading(false)\n\n return response\n } catch (error) {\n console.error('Error saving cart', error)\n\n throw error\n } finally {\n setIsLoading(false)\n }\n },\n [values, behavior, defaultStartLocationId, defaultStopLocationId]\n )\n\n return (\n <CartPickerContext.Provider\n value={{\n cart,\n onChange: handleChange,\n onValidate: handleValidate,\n onSave: handleSave,\n isValid: isValid && !!values?.starts_at && !!values?.stops_at,\n isLoading,\n setLoading: setIsLoading\n }}\n >\n {children}\n </CartPickerContext.Provider>\n )\n}\n\nCartPickerProvider.propTypes = {\n children: PropTypes.node,\n cart: PropTypes.object,\n onSave: PropTypes.func\n}\n","// React\nimport { useEffect, useMemo, useRef, useContext } from 'react'\n\n// Libraries\nimport { isEqual, isEmpty } from 'lodash'\n\n// Hooks\nimport { useFormikContext } from 'formik'\nimport { useCachedQuery } from 'shared/utils/useCachedQuery'\n\n// Shared\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport { fetchDeliveryOptionsRequest } from './requests'\nimport { CartPickerContext } from './Provider'\n\nexport const useCartPicker = () => {\n const context = useContext(CartPickerContext)\n\n if (!context) {\n throw Error('\"useCartPicker\" should be used within \"CartPickerProvider\"')\n }\n\n return context\n}\n\nexport const useDeliveryOptions = ({ cart, fetchAvailability, onError, resetError }) => {\n const isFirstMount = useRef(true)\n\n const form = useFormikContext()\n\n const formattedDeliveryAddress = useMemo(() => {\n if (!form.values.delivery_address) return\n\n return FormatUtils.address(form.values.delivery_address)\n }, [form.values.delivery_address])\n\n const { setLoading, onSave } = useCartPicker()\n\n const { perform: fetchDeliveryOptions, isLoading } = useCachedQuery(fetchDeliveryOptionsRequest, {\n key: formattedDeliveryAddress,\n errorKey: 'fetch_delivery_options_error',\n onSuccess: async ({ data }) => {\n setLoading(false)\n resetError()\n\n if (data.rates.length === 0) {\n onError('delivery_unavailable_error')\n }\n },\n onError: () => {\n setLoading(false)\n\n onError('delivery_unavailable_error')\n },\n onLoading: () => {\n setLoading(true)\n resetError()\n }\n })\n\n const isDelivery = form.values.data?.fulfillment_type === 'delivery'\n\n useEffect(() => {\n const request = async () => {\n try {\n const { payload } = await onSave(form.values)\n\n await Promise.all([\n fetchDeliveryOptions({\n cartId: payload.response.cart.id,\n deliveryAddress: form.values.data.delivery_address\n }),\n fetchAvailability({ type: 'start', values: form.values })\n ])\n } catch (error) {\n if (error instanceof Error) {\n switch (error.message) {\n case 'fetch_delivery_options_error':\n onError('delivery_unavailable_error')\n break\n case 'fetch_availability_error':\n console.error('Error fetching availability', error)\n break\n }\n }\n }\n }\n\n if (!cart?.id) return\n if (!isDelivery) return\n if (isEmpty(form.values.delivery_address)) return\n\n // The following fields are always required despite the selected country,\n // do not fetch the closest location if they are not set\n if (\n !form.values.delivery_address?.country ||\n !form.values.delivery_address?.address1 ||\n !form.values.delivery_address?.zipcode ||\n !form.values.delivery_address?.city\n )\n return\n\n // Check if the delivery address fields have no errors\n if (Object.keys(form.errors?.delivery_address ?? {}).length) return\n\n // Check if it's the first mount or if values have changed\n const valuesAreEqual =\n isEqual(form.values.delivery_address, form.initialValues.delivery_address) &&\n isEqual(form.values.start_location_id, form.initialValues.start_location_id) &&\n isEqual(form.values.stop_location_id, form.initialValues.stop_location_id)\n\n if (isFirstMount.current || !valuesAreEqual) {\n request()\n }\n\n isFirstMount.current = false\n }, [cart?.id, form.values, form.initialValues, form.errors, isDelivery, onSave])\n\n return { isLoading }\n}\n","import { useState, useEffect } from 'react'\n\n/**\n * A custom React hook that returns the value of a specific URL search parameter\n * @param {string} paramName - The name of the search parameter to retrieve\n * @returns {string|null} The value of the search parameter or null if not found\n */\nexport const useSearchParam = (paramName) => {\n const [paramValue, setParamValue] = useState(() => {\n const searchParams = new URLSearchParams(window.location.search)\n return searchParams.get(paramName)\n })\n\n useEffect(() => {\n const handleUrlChange = () => {\n const searchParams = new URLSearchParams(window.location.search)\n setParamValue(searchParams.get(paramName))\n }\n\n window.addEventListener('popstate', handleUrlChange)\n return () => window.removeEventListener('popstate', handleUrlChange)\n }, [paramName])\n\n return paramValue\n}\n","// React\nimport React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport BCartPicker from 'ui/blocks/Picker/types/cart'\nimport { LocationPicker } from 'ui/components/Picker/LocationPicker'\nimport { DeliveryFulfillmentForm } from './DeliveryFulfillmentForm'\nimport Div from 'ui/elements/Div'\nimport Label from 'ui/elements/Label'\nimport Span from 'ui/elements/Span'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faTriangleExclamation as farTriangleExclamation } from '@fortawesome/pro-regular-svg-icons'\n\n// Hooks\nimport { useFormikContext } from 'formik'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useDeliveryOptions } from './hooks'\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useSearchParam } from 'shared/utils/useSearchParam'\n\n// Shared\nimport { Field } from 'shared/form'\n\nexport const FulfillmentType = ({ cart, fetchAvailability }) => {\n const [deliveryError, setDeliveryError] = useState(null)\n\n const form = useFormikContext()\n const fulfillmentTab = useSearchParam('fulfillment-tab')\n const { tOrEmptyString, t } = useTranslation('user')\n\n const pickupLocations = useOrm('locations', (locations) => {\n return locations\n .getAll({ archived_at: [null, undefined] })\n .filter((location) => location.fulfillment_capabilities.includes('pickup'))\n })\n const deliveryLocations = useOrm('locations', (locations) => {\n return locations\n .getAll({ archived_at: [null, undefined] })\n .filter((location) => location.fulfillment_capabilities.includes('delivery'))\n })\n\n useDeliveryOptions({ cart, fetchAvailability, onError: setDeliveryError, resetError: () => setDeliveryError(null) })\n\n const showFulfillmentTypeSelect = !!pickupLocations.size() && !!deliveryLocations.size()\n const isPickup = form.values.data.fulfillment_type === 'pickup'\n const isDelivery = form.values.data.fulfillment_type === 'delivery'\n\n useEffect(() => {\n if (fulfillmentTab === 'delivery') {\n form.setFieldValue('data.fulfillment_type', 'delivery')\n }\n }, [])\n\n useEffect(() => {\n const fulfillmentType = form.values.data.fulfillment_type\n\n if (fulfillmentType === 'delivery' && !form.values.delivery_address?.country && !form.values.delivery_address?.country_id) {\n form.setFieldError(\n 'delivery_address.country',\n `${tOrEmptyString('user.deliveries.address_fields.country')} ${tOrEmptyString('user.public_errors.invalid')}`\n )\n }\n\n if (fulfillmentType === 'pickup') {\n const errors = { ...form.errors }\n\n delete errors.delivery_address\n\n form.setErrors(errors)\n }\n }, [form.values.data.fulfillment_type, form.values.delivery_address, form.errors])\n\n const handleLocationChange = ({ start_location_id: id }) => {\n const values = {\n ...form.values,\n start_location_id: id\n }\n\n fetchAvailability({ type: 'start', values })\n }\n\n if (isPickup && pickupLocations.size() === 1 && !deliveryLocations.size()) return null\n\n return (\n <BCartPicker.Section>\n <Div modifiers=\"display-flex flex-column gap-5.5 width-100p\">\n {!!deliveryError && (\n <BCartPicker.Error>\n <FontAwesomeIcon icon={farTriangleExclamation} />\n <Span modifiers=\"font-size-md color-Warning/Foreground1 font-weight-semibold\">\n {t(`user.deliveries.${deliveryError}`)}\n </Span>\n </BCartPicker.Error>\n )}\n {showFulfillmentTypeSelect && (\n <BCartPicker.FulfillmentTypeSelect>\n <Field\n name=\"data.fulfillment_type\"\n type=\"radioGroup\"\n options={[\n {\n label: t('user.deliveries.pickup'),\n value: 'pickup'\n },\n {\n label: t('user.deliveries.delivery'),\n value: 'delivery'\n }\n ]}\n modifiers={{\n inputModifiers: {\n radioGroup: 'no-padding border-radius-md',\n radioGroupIcon: 'margin-left-md margin-top-sm',\n radioGroupLabel: 'padding-sm padding-left-xxl'\n }\n }}\n data-tid=\"Fulfillment type select\"\n />\n </BCartPicker.FulfillmentTypeSelect>\n )}\n {isPickup && pickupLocations.size() > 1 && (\n <Div data-tid=\"Pickup fulfillment type form\">\n <Label>{t('user.store.start_and_stop_location')}</Label>\n <BCartPicker.Section disableStyling>\n <LocationPicker type=\"cart\" locations={pickupLocations} onChange={handleLocationChange} />\n </BCartPicker.Section>\n </Div>\n )}\n {isDelivery && (\n <Div data-tid=\"Delivery fulfillment type form\">\n <DeliveryFulfillmentForm />\n </Div>\n )}\n </Div>\n </BCartPicker.Section>\n )\n}\n\nFulfillmentType.propTypes = {\n cart: PropTypes.object.isRequired,\n fetchAvailability: PropTypes.func.isRequired\n}\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport Tooltip from 'ui/components/Tooltip'\n\nexport class ReadOnlyModeDisabledComponent extends Component {\n static displayName = 'ReadOnlyModeDisabledComponent'\n\n static propTypes = {\n readOnlyMode: PropTypes.bool\n }\n\n render () {\n const { readOnlyMode, children } = this.props\n\n if (readOnlyMode) {\n return (\n <Tooltip\n direction=\"top\"\n maxWidth={500}\n content=\"Briefly unavailable for scheduled maintenance.\"\n >\n <div style={{ pointerEvents: 'none', opacity: 0.6 }}>\n {children}\n </div>\n </Tooltip>\n )\n } else {\n return children\n }\n }\n}\n\nconst mapStateToProps = (state, props) => {\n return {\n readOnlyMode: state.client.readOnlyMode\n }\n}\n\nexport default reduxConnect(mapStateToProps)(ReadOnlyModeDisabledComponent)\n","import Model from '../models'\nimport API from '../../api'\n\nModel.Availability.createAction('FETCH_ITEM_AVAILABILITY', (options) => {\n return API.get('item_availabilities', options)\n})\n\nModel.Availability.createAction('FETCH_CALENDAR_AVAILABILITY', (options) => {\n return API.get('cart_availabilities', options)\n})\n\nexport default Model.Availability.actions\n","// React\nimport React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport { CartFlowPicker } from 'ui/components/Picker'\nimport { PickerProvider } from 'ui/components/Picker/Provider'\nimport { LocationPicker } from 'ui/components/Picker/LocationPicker'\nimport { FulfillmentType } from './FulfillmentType'\nimport BCartPicker from 'ui/blocks/Picker/types/cart'\nimport ReadOnlyModeDisabledComponent from 'store/components/ReadOnlyModeDisabledComponent'\n\n// Libraries\nimport _debounce from 'lodash/debounce'\n\n// Hooks\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useOpeningHours } from 'shared/utils/useOpeningHours'\nimport { useCartPicker } from './hooks'\n\n// Shared\nimport { featureEnabled, FeatureFlags } from 'back_office/v2/utils/utils'\nimport AvailabilityActions from 'store/v2/redux/actions/availability'\nimport moment from 'shared/lib/moment'\nimport promiseDebounce from 'shared/utils/promiseDebounce'\nimport { useTranslation } from 'react-i18next'\n\n/**\n * CartPicker Component\n *\n * This component renders a CartFlowPicker with additional functionality for handling\n * availability fetching and duration changes.\n *\n * @component\n * @param {Object} props - The component props\n * @param {string} props.mode - The mode of the picker ('freely', 'timeslot_duration', 'timeslot_fixed')\n * @param {Function} props.onChange - Callback function when selection changes\n * @param {string} props.format - The date format to use\n * @param {boolean} props.useTimes - Whether to use times in the picker\n * @param {Object} props.cart - The cart object\n * @param {Object} props.durations - Object of available durations\n * @param {Object} props.timeslots - Object of available timeslots\n * @param {Object} props.initialValues - Initial values for the picker\n * @param {boolean} props.useAMOrPM - Whether to use AM/PM format\n * @param {Object} props.minDate - The minimum selectable date\n * @param {boolean} [props.disabled] - Whether the picker is disabled\n * @param {Object} props.availabilities - Object of availability data\n * @param {boolean} props.availabilityLoading - Whether availability data is currently loading\n * @param {number} props.lineCount - The number of lines in the cart\n * @param {boolean} props.showAvailability - Whether to show availability\n * @param {Function} props.fetchAvailability - Function to fetch availability data\n *\n * @returns {React.Component} A wrapped CartFlowPicker component with additional functionality\n */\nconst CartPicker = ({ cart, availabilities, initialValues, minDate, ...props }) => {\n const [duration, setDuration] = useState(null)\n\n const openingHours = useOpeningHours()\n const { onChange, onValidate } = useCartPicker()\n\n const locations = useOrm('locations', (locations) => {\n return locations.getAll({ archived_at: [null, undefined] })\n })\n const intervalInMinutes = useSettings('store.time_increment', {\n default: 15,\n transformer: (value) => parseInt(value)\n })\n\n const { t } = useTranslation('user')\n\n const handleMonthChange = (options, date) => {\n // Fetch availability on month change if setting enabled\n if (!props.showAvailability || !props.lineCount) return\n\n try {\n props.fetchAvailability(cart, {\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n type: options.type,\n starts_at: options.values?.starts_at,\n durationData: duration\n })\n } catch {\n throw new Error('fetch_availability_error')\n }\n }\n\n const debouncedHandleMonthChange = () => {\n if (window.testMode) {\n return handleMonthChange\n } else {\n return promiseDebounce(handleMonthChange, 500)\n }\n }\n\n const handleAvailabilityFetch = (options, day) => {\n let date\n\n day = options?.day || day\n\n if (day) {\n date = day.toDate?.().getDate() ?? day\n }\n\n if (!props.showAvailability || !props.lineCount) return\n\n try {\n props.fetchAvailability(cart, {\n type: options.type,\n day: date,\n starts_at: options.values?.starts_at,\n month: options.values?.starts_at ? new Date(options.values?.starts_at).getMonth() + 1 : undefined,\n year: options.values?.starts_at ? new Date(options.values?.starts_at).getFullYear() : undefined,\n durationData: duration,\n location_id: options.values?.start_location_id\n })\n } catch {\n throw new Error('fetch_availability_error')\n }\n }\n\n const handleChangeDuration = (_duration, durationData) => {\n setDuration(durationData)\n }\n\n return (\n <ReadOnlyModeDisabledComponent>\n <PickerProvider\n initialValues={initialValues}\n minDate={minDate}\n onChange={props.onChange || onChange}\n onValidate={onValidate}\n openingHours={openingHours}\n type=\"cart\"\n validateOnBlur\n >\n <BCartPicker>\n {featureEnabled(FeatureFlags.DELIVERIES) && (\n <FulfillmentType cart={cart} fetchAvailability={handleAvailabilityFetch} />\n )}\n {!featureEnabled(FeatureFlags.DELIVERIES) && (\n <LocationPicker\n type=\"cart\"\n locations={locations}\n WrapperComponent={BCartPicker.Section}\n label={t('user.store.start_and_stop_location')}\n startLocationLabel={t('user.store.start_location')}\n stopLocationLabel={t('user.store.stop_location')}\n />\n )}\n <CartFlowPicker\n {...props}\n availabilities={availabilities}\n onMonthChange={debouncedHandleMonthChange()}\n onOpen={handleAvailabilityFetch}\n intervalInMinutes={intervalInMinutes}\n onDurationChange={handleChangeDuration}\n />\n </BCartPicker>\n </PickerProvider>\n </ReadOnlyModeDisabledComponent>\n )\n}\n\nCartPicker.propTypes = {\n cart: PropTypes.object,\n locations: PropTypes.object,\n availabilities: PropTypes.object,\n initialValues: PropTypes.object,\n lineCount: PropTypes.number,\n showAvailability: PropTypes.bool,\n fetchAvailability: PropTypes.func,\n minDate: PropTypes.object,\n onChange: PropTypes.func,\n onValidate: PropTypes.func,\n setLoading: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = props.cart || state.orm.carts.getById(state.client.cartId)\n\n const locations = state.orm.locations.getAll({ archived_at: [null, undefined] })\n const pickupLocations = locations.filter((location) => location.fulfillment_capabilities.includes('pickup'))\n const deliveryLocations = locations.filter((location) => location.fulfillment_capabilities.includes('delivery'))\n\n const companyCountry = state.settings.get('main_address_attributes.country')\n const companyCountryId = state.settings.get('main_address_attributes.country_id')\n\n const initialValues = {\n starts_at: null,\n stops_at: null,\n start_location_id: null,\n stop_location_id: null,\n delivery_address: {\n address1: '',\n address2: '',\n city: '',\n country: companyCountry || '',\n country_id: companyCountryId || '',\n first_name: '',\n last_name: '',\n region: '',\n province_id: '',\n zipcode: ''\n },\n data: {}\n }\n\n if (cart) {\n Object.assign(initialValues, {\n starts_at: cart.starts_at ? moment(cart.starts_at) : null,\n stops_at: cart.stops_at ? moment(cart.stops_at) : null,\n start_location_id: cart.start_location_id || null,\n stop_location_id: cart.stop_location_id || null,\n data: {\n fulfillment_type: cart.data?.fulfillment_type\n },\n delivery_address: cart.data?.delivery_address || initialValues.delivery_address\n })\n }\n\n if (!initialValues.data.fulfillment_type) {\n if (pickupLocations.size()) {\n initialValues.data.fulfillment_type = 'pickup'\n } else if (deliveryLocations.size()) {\n initialValues.data.fulfillment_type = 'delivery'\n }\n }\n\n return {\n initialValues,\n mode: state.settings.get('store.period_type'),\n useTimes: state.settings.get('store.use_times'),\n format: state.settings.get('dates.format'),\n useAMOrPM: state.settings.get('dates.use_am_pm'),\n minDate: state.client.firstTimeSelectable,\n cart,\n availabilities: state.orm.shop_availabilities.getAll(),\n showAvailability:\n state.settings.get('store.use_availability') && state.settings.get('store.show_cart_availability'),\n availabilityLoading: state.orm.pendingRequests.includes('SHOP_AVAILABILITIES_FETCH_CALENDAR_AVAILABILITY'),\n lineCount: cart?.lines.length\n }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n fetchAvailability: (cart, params) => {\n // No cart - can't check availability\n if (!cart?.created_at) return\n\n // Do not send moment objects in a request (it will serialise and cause a CORS error)\n if (params.starts_at?._isAMomentObject) {\n params.starts_at = params.starts_at.toDate()\n }\n\n const date = new Date(params?.type === 'start' ? cart.starts_at || Date() : cart.stops_at || Date())\n const filter = {\n cart_id: cart.id,\n year: params?.year || date.getFullYear(),\n month: params?.month || date.getMonth() + 1,\n day: params?.day,\n // Always set to start, since we want \"simple, stateless\" availability for now\n // copied from back_office/modules/orders/components/OrderPicker/hooks.js:78\n type: 'start',\n duration_period: params?.durationData?.data?.period,\n start_location_id: params?.location_id\n }\n\n if (params?.starts_at) {\n Object.assign(filter, { starts_at: params?.starts_at })\n }\n\n AvailabilityActions.fetchCalendarAvailability({\n filter,\n apiVersion: 3\n })\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(CartPicker)\n","import { CartPicker } from './styles'\n\nexport default CartPicker\n","import styled from 'styled-components'\n\nexport const CartPicker = styled.div`\n [class*='Period']:has([class^='Portal']:not(:empty)), [class^='Portal']:not(:empty) {\n max-height: 100%;\n height: 100%;\n\n overflow-y: auto;\n }\n\n [class^='Period'] {\n overflow-y: auto;\n }\n\n @media screen and (max-width: 576px) {\n .DayPicker-NavBar {\n display: none;\n }\n }\n\n @media screen and (min-width: 576px) {\n .DayPicker {\n min-height: 350px;\n }\n }\n`\n","// React\nimport React, { useState } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { clsx } from 'clsx'\n\n// Components\nimport { Modal, ModalBody, ModalTitle, ModalClose, ModalFooter } from 'store/components/Modal'\nimport Button from 'ui/components/Button'\nimport Div from 'ui/elements/Div'\nimport ActionGroup from 'ui/blocks/ActionGroup'\nimport CartPicker from './Picker'\nimport BCartPicker from 'store/blocks/CartPicker'\n\n// Hooks\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useIsMobile } from 'shared/utils/useIsMobile'\nimport { useCartPicker } from './hooks'\nimport { CartPickerProvider } from './Provider'\n\nconst CartPickerInner = ({ open, onSaveCallback, onClose, brandingColor, title, productId, withBranding }) => {\n const [promise, setPromise] = useState(null)\n\n const { cart, onSave, isValid, isLoading } = useCartPicker()\n\n const { t } = useTranslation('user')\n const isMobile = useIsMobile()\n\n const handleSave = () => {\n const promise = onSave?.().then(() => {\n if (onSaveCallback) {\n return onSaveCallback()\n }\n\n onClose()\n })\n\n setPromise(promise)\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n modifiers={{\n backdrop: clsx(isMobile && 'no-padding'),\n container: clsx(\n 'background-color-Secondary/Background1',\n isMobile && 'height-100vh max-width-100p width-100p no-border-radius'\n )\n }}\n >\n <ModalBody modifiers=\"height-100p no-padding\">\n <Div modifiers=\"min-height-100p padding-md\">\n <Div modifiers=\"padding-bottom-md\">\n <ModalTitle>{title}</ModalTitle>\n {onClose && <ModalClose onClose={onClose} />}\n </Div>\n <BCartPicker>\n <CartPicker cart={cart} />\n </BCartPicker>\n </Div>\n <ModalFooter>\n <ActionGroup modifiers={clsx('width-100p', isMobile && 'display-flex align-center no-margin no-padding')}>\n <Button\n color={brandingColor || 'primary'}\n onClick={handleSave}\n disabled={!isValid || isLoading}\n promise={promise}\n modifiers={clsx(isMobile && 'width-100p')}\n withBranding={withBranding}\n >\n {(productId && t('user.store.book')) || t('user.store.apply') || 'Apply'}\n </Button>\n </ActionGroup>\n </ModalFooter>\n </ModalBody>\n </Modal>\n )\n}\n\nCartPickerInner.propTypes = {\n open: PropTypes.bool,\n onClose: PropTypes.func,\n brandingColor: PropTypes.string,\n title: PropTypes.any,\n productId: PropTypes.string,\n onSaveCallback: PropTypes.func,\n withBranding: PropTypes.bool\n}\n\nexport const ModalCartPicker = ({ cart, onSave, ...props }) => (\n <CartPickerProvider cart={cart} onSave={onSave}>\n <CartPickerInner {...props} />\n </CartPickerProvider>\n)\n\nModalCartPicker.propTypes = {\n cart: PropTypes.object,\n onSave: PropTypes.func\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { ModalCartPicker } from 'store/modules/cart/CartPicker/Modal'\n\n// Libraries\n\n// Shared\nimport ClientActions from 'store/v2/redux/actions/client'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport getBrandingColor from 'shared/utils/getBrandingColor'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nclass CartPickerContainer extends Component {\n static displayName = 'CartPickerContainer'\n\n static propTypes = {\n cart: PropTypes.object,\n modalOpen: PropTypes.bool,\n brandingColor: PropTypes.string,\n togglePicker: PropTypes.func,\n clearCart: PropTypes.func,\n t: PropTypes.func\n }\n\n componentDidMount = () => {\n this.mobile = window.innerWidth <= 800\n }\n\n handleClearAndClose = () => {\n this.props.clearCart().then(() => this.props.togglePicker(false))\n }\n\n handleClose = () => {\n this.props.togglePicker(false)\n }\n\n render () {\n const { cart, modalOpen, brandingColor, t } = this.props\n\n return (\n <ModalCartPicker\n cart={cart}\n open={modalOpen}\n onClose={this.handleClose}\n brandingColor={brandingColor}\n direction={this.mobile ? 'vertical' : 'horizontal'}\n title={t('user.store.cart_title')}\n />\n )\n }\n}\n\nconst mapStateToProps = (state, _props) => {\n return {\n cart: state.orm.carts.getById(state.client.cartId),\n modalOpen: state.client.modalPickerOpen,\n brandingColor: getBrandingColor()\n }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n togglePicker: ClientActions.toggleModalPicker,\n clearCart: () => {\n CartActions.clear({\n apiVersion: 1\n })\n }\n }\n}\n\nexport default compose(reduxConnect(mapStateToProps, mapDispatchToProps), withTranslation('user'))(CartPickerContainer)\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\n\n// Components\n\n// Shared\nimport ReactCSSTransitionGroup from 'shared/lib/react_css_transition_group'\nimport Format from 'shared/utils/format'\nimport { setUserFrameworkCartData } from 'shared/utils/userFrameworkEvents'\nimport clientActions from 'store/v2/redux/actions/client'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nexport class Launcher extends React.Component {\n static displayName = 'Launcher'\n\n static propTypes = {\n itemCount: PropTypes.number,\n cartOpen: PropTypes.bool,\n toggleCart: PropTypes.func,\n cart: PropTypes.object,\n useTimes: PropTypes.bool,\n usePrices: PropTypes.bool,\n timeFormat: PropTypes.string,\n floating: PropTypes.bool,\n totalPriceAttribute: PropTypes.string,\n currency: PropTypes.object,\n t: PropTypes.func\n }\n\n componentDidUpdate = () => {\n setUserFrameworkCartData()\n }\n\n get style () {\n const { floating } = this.props\n\n if (floating) {\n return {\n position: 'fixed',\n bottom: 15,\n right: 15\n }\n } else {\n return {}\n }\n }\n\n get countLabel () {\n const { itemCount, t } = this.props\n\n if (itemCount === 1) {\n return `${itemCount} ${t('user.store.item')}`\n }\n\n return `${itemCount} ${t('user.store.items')}`\n }\n\n render () {\n const launcherClassNames = []\n const { cart, cartOpen, toggleCart, useTimes, usePrices, timeFormat, itemCount, currency, totalPriceAttribute, t } = this.props\n\n launcherClassNames.push(cartOpen ? 'open' : 'closed')\n\n return (\n <ReactCSSTransitionGroup\n transitionName=\"booqable-launcher\"\n transitionEnterTimeout={300}\n transitionLeaveTimeout={100}\n >\n <div\n key={`booqable-launcher-${cartOpen}`}\n id=\"booqable-launcher\"\n className={launcherClassNames.join(' ')}\n style={this.style}\n onClick={toggleCart.bind(null, !cartOpen)}\n >\n <div className=\"bq-branded\" id=\"booqable-launcher-icon\">\n <i className=\"bq-branded bq-icon-cart fas fa-shopping-cart\" aria-hidden=\"true\" />\n </div>\n <div id=\"booqable-launcher-summary\">\n <div className=\"bq-dates\">\n {cart && cart.starts_at ?\n (\n <span>\n <strong>{Format.date(cart.starts_at, 'shortDate')} </strong>\n <small>{useTimes && Format.date(cart.starts_at, timeFormat)}</small>\n {' - '}\n <strong>{Format.date(cart.stops_at, 'shortDate')} </strong>\n <small>{useTimes && Format.date(cart.stops_at, timeFormat)}</small>\n </span>\n ) :\n (<span>{t('user.store.select_a_period')}</span>)}\n </div>\n <hr />\n <div className=\"bq-summary\">\n {cart && itemCount ?\n (\n <div>\n <span>\n <strong>{this.countLabel}</strong>\n </span>\n {usePrices && (\n <span className=\"bq-total\">\n <strong>\n {Format.money(cart != null ? cart.get(totalPriceAttribute) : undefined, currency)}\n </strong>\n </span>\n )}\n </div>\n ) :\n (<span>{t('user.store.cart_empty')}</span>)}\n </div>\n </div>\n </div>\n </ReactCSSTransitionGroup>\n )\n }\n}\n\nconst mapStateToProps = (state) => {\n let timeFormat, totalPriceAttribute\n\n if (state.settings.get('dates.use_am_pm')) {\n timeFormat = 'hh:mm A'\n } else {\n timeFormat = 'HH:mm'\n }\n\n const cart = state.orm.carts.getById(state.client.cartId)\n const lines = state.orm.lines.getAll({\n id: cart != null ? cart.lines : undefined,\n product_type: ['consumable', 'rental', 'bundle']\n })\n\n const itemCount = lines.map((line) => line.quantity).reduce((a, b) => a + b, 0)\n\n if (state.settings.get('pricing.tax_strategy') === 'inclusive') {\n totalPriceAttribute = 'grand_total_with_tax_in_cents'\n } else {\n totalPriceAttribute = 'grand_total_in_cents'\n }\n\n return {\n floating: state.client.floatingCart,\n cartOpen: state.client.cartOpen,\n cart,\n currency: state.client.currency.toJS(),\n totalPriceAttribute,\n timeFormat,\n useTimes: state.settings.get('store.use_times'),\n usePrices: state.settings.get('store.use_prices'),\n itemCount\n }\n}\n\nconst mapDispatchToProps = () => {\n return {\n toggleCart: (cartOpen) => {\n return clientActions.toggleCart(cartOpen)\n }\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps, mapDispatchToProps))(Launcher)\n","// React\nimport React, { Fragment, useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport FloatingCart from 'store/v2/react/scenes/cart/components/FloatingCart'\nimport CartPicker from 'store/modules/cart/FloatingCart/components/CartPicker'\nimport Launcher from 'store/modules/cart/FloatingCart/components/Launcher'\n\nconst Cart = ({ isShowCartBehavior }) => {\n const [showPicker, setShowPicker] = useState(true)\n\n useEffect(() => {\n if (document.querySelector('bq-date-picker-modal')) {\n setShowPicker(false)\n }\n }, [])\n\n return (\n <div className=\"booqable-component\">\n {isShowCartBehavior && (\n <Fragment>\n <div id=\"booqable-sidebar\">\n <FloatingCart />\n </div>\n <Launcher />\n </Fragment>\n )}\n {showPicker && <CartPicker />}\n </div>\n )\n}\n\nCart.propTypes = {\n isShowCartBehavior: PropTypes.bool\n}\n\nconst mapStateToProps = (state, props) => {\n const isShowCartBehavior = state.settings.get('store.behaviors.add_button') === 'show_cart'\n\n return {\n isShowCartBehavior\n }\n}\n\nexport default reduxConnect(mapStateToProps)(Cart)\n","import { Themed } from './styles'\n\nexport default Themed\n","import styled from 'styled-components'\n\nexport const Themed = styled.div`\n * {\n &:not(i) {\n font-family: ${(props) => props.theme.font.body};\n }\n }\n`\n","\n\n/**\n * Theme for being used in the checkout and store integration.\n */\n\nimport { colors, palette } from 'ui/themes/colors'\n\n// DO NOT USE THESE COLORS! THEY ARE DEPRECATED AND WILL BE REMOVED IN THE FUTURE\nconst deprecatedColors = (brandingColor) => {\n return {\n primary: brandingColor,\n secondary: colors['Text/Secondary'],\n success: colors['Success/Base'],\n info: colors['Accent1/Base'],\n warning: colors['Warning/Base'],\n danger: colors['Danger/Base'],\n\n light: palette.grey[20],\n dark: colors['Text/Primary'],\n\n borderHover: palette.grey[40]\n }\n}\n\nconst color = (brandingColor) => {\n return {\n black: palette.black,\n white: palette.white,\n transparent: 'transparent',\n branding: brandingColor,\n\n // Ease of use colors, corresponding to the Base color of the palette.\n // e.g. blue =~ colors['Primary/Base']\n blue: palette.blue[60],\n green: palette.green[50],\n orange: palette.orange[50],\n red: palette.red[60],\n purple: palette.purple[60],\n grey: palette.grey[30],\n\n ...colors,\n ...deprecatedColors(brandingColor)\n }\n}\n\n/**\n * We use a 4px grid system for spacing. This function calculates the pixel value for a given grid unit.\n * 0.5 grid units = 2px\n * 1 grid unit = 4px\n * 2 grid units = 8px\n * 3 grid units = 12px\n * 4 grid units = 16px\n * 5 grid units = 20px\n * 6 grid units = 24px\n * 7 grid units = 28px\n * 8 grid units = 32px\n * 9 grid units = 36px\n * 10 grid units = 40px\n * 11 grid units = 44px\n * 12 grid units = 48px\n * 16 grid units = 64px\n */\nconst grid = (unit) => {\n if (!Number.isInteger(unit) && unit !== 0.5) {\n throw new Error('Grid units must be integers or 0.5')\n }\n return `${unit * 4}px`\n}\n\nconst units = {\n 0.5: grid(0.5),\n 1: grid(1),\n 2: grid(2),\n 3: grid(3),\n 4: grid(4),\n 5: grid(5),\n 6: grid(6),\n 7: grid(7),\n 8: grid(8),\n 9: grid(9),\n 10: grid(10),\n 11: grid(11),\n 12: grid(12),\n 13: grid(13),\n 14: grid(14),\n 15: grid(15),\n 16: grid(16)\n}\n\nconst font = {\n base: 'Roboto',\n fallback: 'sans-serif',\n mono: 'Monospace',\n fontAwesomeStyle: 'far',\n size: {\n body: '20px',\n xs: '13px !important',\n sm: '13px',\n md: '14px',\n lg: '18px',\n lgplus: '22px',\n xl: '34px',\n xxl: '50px',\n xxxl: '66px'\n },\n weight: {\n light: '300',\n lighter: '400',\n normal: '500',\n semibold: '600',\n bold: '700'\n }\n}\n\nfont.body = `${font.base}, ${font.fallback}`\n\nconst size = {\n borderRadius: {\n xs: '2px',\n sm: '6px',\n md: '6px',\n lg: '6px',\n lgplus: '8px',\n xl: '13px'\n },\n borderWidth: {\n xs: '1px',\n sm: '1px',\n md: '1px',\n lg: '1px'\n },\n controlHeight: {\n xs: '26px',\n sm: '36px',\n md: '42px',\n lg: '50px'\n },\n margin: {\n xs: grid(1),\n sm: grid(3),\n md: grid(4),\n lg: grid(6)\n },\n padding: {\n xs: grid(1),\n sm: grid(3),\n md: grid(4),\n mdplus: grid(5),\n lg: grid(6),\n lgplus: grid(7),\n xl: grid(8),\n xlplus: grid(11),\n xxl: grid(12),\n xxxl: grid(16)\n },\n shadow: {\n sm: 'rgba(0, 0, 0, 0.2) 0px 1px 2px 0px',\n smplus: 'rgba(0, 0, 0, 0.1) 0px 4px 12px 0px',\n md: 'rgba(0, 0, 0, 0.1) 0 6px 14px 0',\n lg: 'rgba(0, 0, 0, 0.1) 0 6px 14px 0'\n },\n screenSizes: {\n xs: '0px',\n sm: '768px',\n md: '992px',\n lg: '1200px',\n xl: '1800px'\n }\n}\n\nconst opacity = {\n disabled: 0.6,\n destroying: 0.4\n}\n\nconst zIndex = [\n 1,\n 100,\n 200,\n 300,\n 400\n]\n\nexport default (brandingColor = '#8fcc40') => {\n return {\n color: color(brandingColor),\n font,\n opacity,\n size,\n zIndex,\n units\n }\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { ThemeProvider, StyleSheetManager } from 'styled-components'\n\n// Components\nimport BThemed from '../blocks/Themed'\n\n// Shared\nimport theme from 'ui/themes/public'\nimport getBrandingColor from 'shared/utils/getBrandingColor'\nimport { shouldForwardProp } from 'shared/utils/shouldForwardProp'\n\nclass Themed extends Component {\n static displayName = 'Themed'\n\n static propTypes = {\n children: PropTypes.node,\n brandingColor: PropTypes.string\n }\n\n render () {\n const { children, brandingColor } = this.props\n\n return (\n <ThemeProvider theme={theme(brandingColor)}>\n <StyleSheetManager shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <BThemed>\n {children}\n </BThemed>\n </StyleSheetManager>\n </ThemeProvider>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n return {\n brandingColor: getBrandingColor()\n }\n}\n\nexport default reduxConnect(mapStateToProps)(Themed)\n","// React\nimport React from 'react'\nimport { Provider } from 'react-redux'\n\n// Components\nimport Cart from 'store/v2/react/components/cart'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class CartScene extends React.Component {\n static displayName = 'CartScene'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <Cart />\n </Themed>\n </Provider>\n )\n }\n}\n","export default {\n findByIdOrSlug (collection, id) {\n let item\n\n if ((item = collection.getById(id))) {\n return item\n } else if ((item = collection.getAll({ slug: id }).first())) {\n return item\n } else {\n return collection.getAll({ legacy_id: parseInt(id) }).first()\n }\n }\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\nimport itemSelectors from 'store/v2/redux/selectors/item'\n\nclass IdFinder extends React.Component {\n static displayName = 'IdFinder'\n\n static propTypes = {\n children: PropTypes.object,\n hideOnLoad: PropTypes.bool\n }\n\n shouldComponentUpdate = (nextProps) => {\n if (this.props.item && nextProps.uiKey === this.props.uiKey) {\n return false\n } else {\n return true\n }\n }\n\n render = () => {\n const { item, hideOnLoad } = this.props\n\n if (!item && hideOnLoad) {\n return null\n } else {\n return this.props.children && React.cloneElement(this.props.children, this.props)\n }\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const item = itemSelectors.findByIdOrSlug(state.orm.product_groups, props.id) ||\n itemSelectors.findByIdOrSlug(state.orm.bundles, props.id) ||\n itemSelectors.findByIdOrSlug(state.orm.items, props.id)\n\n return {\n id: item && item.id,\n item,\n uiKey: props.id\n }\n}\n\nexport default reduxConnect(mapStateToProps)(IdFinder)\n","import { updateUI } from 'shared/redux/interface'\nconst store = window.booqableStore\n\nexport default {\n setItem (id) {\n const action = updateUI('Quickview', { itemId: id })\n\n return store.dispatch(action)\n },\n\n unsetItem () {\n const action = updateUI('Quickview', { itemId: null })\n\n return store.dispatch(action)\n }\n}\n","// React\nimport React from 'react'\nimport { findDOMNode } from 'react-dom'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport FocalImage from 'ui/components/FocalImage'\nimport ProductPrice from './product_price'\n\n// Libraries\nimport _capitalize from 'lodash/capitalize'\nimport _get from 'lodash/get'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport ReactCSSTransitionGroup from 'shared/lib/react_css_transition_group'\nimport quickviewActions from 'store/v2/redux/actions/quickview'\n\nexport class Product extends React.Component {\n static displayName = 'Product'\n\n static propTypes = {\n loading: PropTypes.bool,\n id: PropTypes.string,\n item: PropTypes.object,\n photo: PropTypes.object,\n useAvailability: PropTypes.bool,\n hideProductAvailabilityQuantities: PropTypes.bool,\n hasDates: PropTypes.string,\n hasPrices: PropTypes.any,\n onClick: PropTypes.func,\n openQuickview: PropTypes.func,\n t: PropTypes.func\n }\n\n componentDidMount = () => {\n this.setWidth()\n\n window.addEventListener('resize', this.setWidth, false)\n }\n\n componentWillUnmount = () => {\n window.removeEventListener('resize', this.setWidth)\n }\n\n findAncestor = (el, cls) => {\n while ((el = el.parentElement) && !el.classList.contains(cls));\n\n return el\n }\n\n setWidth = () => {\n // eslint-disable-next-line react/no-find-dom-node\n const node = this.findAncestor(findDOMNode(this), 'booqable-product')\n const container = node?.parentNode\n\n if (!node || !container) return\n\n const width = container.offsetWidth\n let maxPerRow = Math.floor(width / 280)\n\n // Max of 6 per row\n maxPerRow = Math.max(1, Math.min(maxPerRow, 6))\n\n return (node.style.width = 100 / maxPerRow + '%')\n }\n\n renderLoading = () => {\n const { t } = this.props\n\n return (\n <div className=\"booqable-product-wrapper\">\n <div className=\"booqable-product-inner\">\n <ReactCSSTransitionGroup transitionName=\"fade\" transitionEnterTimeout={100} transitionLeaveTimeout={100}>\n <span className=\"bq-no-photo\">\n <i className=\"bq-no-photo bq-icon-image fas fa-image\" />\n </span>\n </ReactCSSTransitionGroup>\n <div className=\"bq-details\">\n <div className=\"bq-product-title-wrapper bq-has-no-prices\">\n <div className=\"bq-product-name\">\n <span className=\"fake-text\">{t('user.store.product_placeholder')}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n renderContent = () => {\n const { id, item, photo, onClick, openQuickview, useAvailability, hideProductAvailabilityQuantities, hasDates, hasPrices, t } = this.props\n\n const preview = _get(photo, 'preview')\n const imageSrc = _get(photo, 'large_url') || item.photo_url\n const imageCoordinates = _get(photo, 'coordinates')\n\n return (\n <div className=\"booqable-product-wrapper\">\n <div className=\"booqable-product-inner\" onClick={onClick.bind(null, id)}>\n <ReactCSSTransitionGroup transitionName=\"fade\" transitionEnterTimeout={100} transitionLeaveTimeout={100}>\n {imageSrc && (\n <FocalImage\n height=\"250px\"\n preview={preview}\n url={imageSrc}\n coordinates={imageCoordinates}\n maintainAspect\n />\n )}\n {!imageSrc && (\n <span className=\"bq-no-photo\">\n <i className=\"bq-no-photo bq-icon-image fas fa-image\" />\n </span>\n )}\n </ReactCSSTransitionGroup>\n <div className=\"bq-details\">\n {useAvailability && hasDates && (\n <ReactCSSTransitionGroup transitionName=\"fade\" transitionEnterTimeout={100} transitionLeaveTimeout={100}>\n {item.available_quantity === null && (\n <span className=\"bq-branded bq-status bq-available\">{_capitalize(t('user.store.available'))}</span>\n )}\n {item.available_quantity === 0 && (\n <span className=\"bq-status bq-unavailable\">{_capitalize(t('user.store.unavailable'))}</span>\n )}\n {item.available_quantity > 0 && (\n hideProductAvailabilityQuantities ?\n (\n <span className=\"bq-branded bq-status bq-available\">\n {_capitalize(t('user.store.available'))}\n </span>\n ) :\n (\n <span className=\"bq-branded bq-status bq-available\">\n <span className=\"bq-status-quantity\">{item.available_quantity} </span>\n {t('user.store.available')}\n </span>\n )\n )}\n </ReactCSSTransitionGroup>\n )}\n <button\n className=\"bq-button bq-branded\"\n data-link=\"true\"\n onClick={openQuickview.bind(null, id)}\n style={{ display: 'none' }}\n >\n <i data-link=\"true\" className=\"bq-icon-cart fas fa-shopping-cart bq-link bq-branded-font-color\" />\n </button>\n <div\n className={`bq-product-title-wrapper ${\n hasPrices || typeof hasPrices === 'number' ? 'bq-has-prices' : 'bq-has-no-prices'\n }`}\n >\n <div title={item.name} className=\"bq-product-name\">\n {item.name}\n </div>\n </div>\n {item && (\n <ProductPrice\n chargeLabel={item.charge_label}\n priceInCents={item.price_each_in_cents}\n priceType={item.price_type}\n productType={item.product_type}\n />\n )}\n </div>\n </div>\n </div>\n )\n }\n\n render () {\n const { loading } = this.props\n\n return loading ? this.renderLoading() : this.renderContent()\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const showPrices = state.settings.get('store.use_prices')\n const item = state.orm.items.getById(props.id)\n const cart = state.orm.carts.getById(state.client.cartId)\n const photo = item && state.orm.photos.getById(item.photo_id)\n\n return {\n loading: !item,\n translations: state.client.get('translations').toJS(),\n item,\n photo,\n useAvailability: state.settings.get('store.use_availability'),\n hideProductAvailabilityQuantities: state.settings.get('store.hide_product_availability_quantities'),\n hasDates: cart?.starts_at && cart?.stops_at,\n hasPrices: showPrices && item?.price_each_in_cents\n }\n}\n\nconst mapDispatchToProps = (_, props) => {\n const openQuickview = (id) => quickviewActions.setItem(id)\n\n return {\n openQuickview,\n onClick: (id, e) => {\n if (props.link && !e.target.getAttribute('data-link')) {\n return (window.location = props.link)\n } else {\n return openQuickview(id)\n }\n }\n }\n}\n\nexport default compose(reduxConnect(mapStateToProps, mapDispatchToProps), withTranslation('user'))(Product)\n","import React from 'react'\nimport { Provider } from 'react-redux'\n\nimport IdFinder from '../id_finder'\nimport Product from '../components/product'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class ProductGroup extends React.Component {\n static displayName = 'ProductGroupContainer'\n\n render = () => {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <IdFinder {...this.props}>\n <Product />\n </IdFinder>\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React from 'react'\nimport { connect as reduxConnect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport _range from 'lodash/range'\n\nclass Pagination extends React.Component {\n static displayName = 'Pagination'\n\n static propTypes = {\n page: PropTypes.any,\n pages: PropTypes.any,\n padding: PropTypes.number,\n showPrev: PropTypes.bool,\n showNext: PropTypes.bool,\n handlePage: PropTypes.func,\n handleNextPage: PropTypes.func,\n handlePrevPage: PropTypes.func\n }\n\n renderPages = () => {\n const allPages = _range(1, (this.props.pages + 1))\n\n const padding = this.props.padding || 2\n const show = padding * 2 + 1\n let till = Math.min(this.props.pages, this.props.page + padding)\n const from = Math.max(0, till - show)\n\n till = from + show\n\n return allPages.slice(from, till).map((page) => {\n const classNames = []\n\n if (page === this.props.page) {\n classNames.push('bq-pagination-current bq-branded')\n }\n\n return (\n <span key={`page-${page}`} className={`bq-pagination-page ${classNames.join(' ')}`}>\n {(page !== this.props.page) && <button onClick={this.props.handlePage.bind(null, page)}>{page}</button>}\n {(page === this.props.page) && page}\n </span>\n )\n })\n }\n\n render () {\n if (this.props.pages <= 1) {\n return null\n }\n\n return (\n <div className=\"booqable-pagination\">\n <div className=\"bq-pagination-inner\">\n {this.props.showPrev && (\n <span className=\"bq-pagination-page bq-pagination-prev\">\n <button onClick={this.props.handlePrevPage}>\n <i className=\"bq-icon-arrow-left2 fas fa-angle-left\" />\n </button>\n </span>\n )}\n {this.renderPages()}\n {this.props.showNext && (\n <span className=\"bq-pagination-page bq-pagination-next\">\n <button onClick={this.props.handleNextPage}>\n <i className=\"bq-icon-arrow-right2 fas fa-angle-right\" />\n </button>\n </span>\n )}\n </div>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const pages = Math.ceil(props.total / props.per)\n\n return {\n pages,\n showPrev: props.page !== 1,\n showNext: props.page !== pages\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n const handlePageChange = (page) => {\n const pages = Math.ceil(props.total / props.per)\n\n if (page >= 1 && page <= pages) {\n return props.onChange(page)\n }\n }\n\n return {\n handlePage (page) {\n return handlePageChange(page)\n },\n handlePrevPage () {\n return handlePageChange(props.page - 1)\n },\n handleNextPage () {\n return handlePageChange(props.page + 1)\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(Pagination)\n","const store = window.booqableStore\n\nexport const setFilterSearchQuery = (value, key = 'global') => {\n store.dispatch({\n type: 'SET_FILTER_SEARCH_QUERY',\n payload: {\n key,\n value\n }\n })\n}\n\nexport const setFilterCollection = (value, key = 'global') => {\n store.dispatch({\n type: 'SET_FILTER_COLLECTION',\n payload: {\n key,\n value\n }\n })\n}\n\nexport const setFilterSortBy = (value, key = 'global') => {\n store.dispatch({\n type: 'SET_FILTER_SORT_BY',\n payload: {\n key,\n value\n }\n })\n}\n\nexport const setFilterFilterBy = (value, key = 'global') => {\n store.dispatch({\n type: 'SET_FILTER_FILTER_BY',\n payload: {\n key,\n value\n }\n })\n}\n\nexport default {\n setFilterSearchQuery,\n setFilterSortBy,\n setFilterFilterBy\n}\n","// React\nimport React, { useRef, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { setFilterSearchQuery } from 'store/v2/redux/actions/filter'\nimport useIsMobile from 'shared/utils/useIsMobile'\n\nconst ProductSearch = ({ t, filterKey = 'global' }) => {\n const ref = useRef()\n\n const [value, setValue] = useState('')\n\n const isMobile = useIsMobile()\n\n const handleInputChange = (e) => {\n setValue(e.target.value)\n\n // Search was cleared manually\n if (e.target.value === '') {\n setFilterSearchQuery('', filterKey)\n }\n }\n\n const handleInputKeyUp = (e) => {\n if (e.key === 'Enter') {\n setFilterSearchQuery(value, filterKey)\n\n if (isMobile) {\n ref.current?.blur()\n }\n }\n }\n\n const handleClearClick = () => {\n setValue('')\n\n setFilterSearchQuery('', filterKey)\n\n ref.current?.focus()\n }\n\n return (\n <div className=\"bq-product-search-component\">\n <div className=\"bq-button bq-branded bq-product-search-icon\">\n <i className=\"bq-icon-search fas fa-search bq-branded-font-color\" />\n </div>\n <input\n type=\"search\"\n className=\"bq-product-search-input bq-branded-focus\"\n placeholder={t('user.store.search_products')}\n ref={ref}\n value={value}\n onChange={handleInputChange}\n onKeyUp={handleInputKeyUp}\n />\n {value && (\n <div className=\"bq-product-search-clear\" onClick={handleClearClick}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </div>\n )}\n </div>\n )\n}\n\nProductSearch.displayName = 'ProductSearch'\n\nProductSearch.propTypes = {\n t: PropTypes.func,\n filterKey: PropTypes.string\n}\n\nconst mapStateToProps = (state, props) => {\n return {\n filterKey: props.searchKey || props.filterKey\n }\n}\n\nconst decoratedComponent = reduxConnect(mapStateToProps)(ProductSearch)\n\nexport default withTranslation('user')(decoratedComponent)\n","import styled, { css } from 'styled-components'\n\nimport { fontWeight, color, size } from 'ui/themes/utils'\n\nimport I from 'ui/elements/I'\n\nexport const Collection = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n font-size: 14px !important;\n line-height: 32px !important;\n font-family: \"Roboto\", sans-serif;\n\n cursor: pointer;\n\n font-weight: ${fontWeight('normal')} !important;\n\n clear: both;\n\n ${({ active }) => active && css`\n font-weight: ${fontWeight('bold')} !important;\n `}\n\n > div {\n flex-grow: 1;\n text-align: left;\n }\n\n > span {\n color: ${color('Text/Secondary')};\n font-weight: ${fontWeight('normal')} !important;\n }\n\n > ${I} {\n padding-right: ${size('padding', 'md')};\n }\n`\n\nexport const CollectionList = styled.ul`\n ${({ noPadding }) => !noPadding && css`\n > li {\n padding-left: 10px;\n }\n `}\n`\n","import { CollectionList, Collection } from './styles'\n\nCollectionList.Collection = Collection\n\nexport default CollectionList\n","import Model from '../models'\n\nexport default Model.Collection.actions\n","// React\nimport React, { useState, Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport _get from 'lodash/get'\n\n// Components\nimport BCollectionList from 'store/modules/product/blocks/CollectionList'\nimport Icon from 'ui/components/Icon'\n\n// Shared\nimport { useTranslation } from 'react-i18next'\nimport { setFilterCollection } from 'store/v2/redux/actions/filter'\nimport CollectionActions from 'store/v2/redux/actions/collection'\n\nconst CollectionList = ({\n collections,\n rootCollections,\n active,\n fetchCollections,\n filterKey = 'global',\n brandColor,\n horizontalRule\n}) => {\n const [open, setOpen] = useState({})\n const { t } = useTranslation('user')\n\n useEffect(() => {\n fetchCollections()\n }, [])\n\n const handleToggleCollection = (collectionId, e) => {\n e?.stopPropagation()\n\n setOpen((prevOpen) => ({\n ...prevOpen,\n [collectionId]: !prevOpen[collectionId]\n }))\n }\n\n const handleFilterByCollection = (collectionId, e) => {\n // If collection is closed open it\n if (!open[collectionId]) {\n handleToggleCollection(collectionId)\n }\n\n e?.nativeEvent.stopImmediatePropagation()\n setFilterCollection(collectionId, filterKey)\n }\n\n const renderCollection = (collection) => {\n const children = collections.getAll({ parent_id: collection.id })\n const isOpen = !!open[collection.id]\n const hasChildren = children.size() > 0\n\n return (\n <li key={collection.id}>\n <BCollectionList.Collection\n onClick={(e) => handleFilterByCollection(collection.id, e)}\n bold={hasChildren}\n active={collection.id === active}\n brandingColor={brandColor}\n >\n {hasChildren && (\n <Icon icon={isOpen ? 'minus' : 'plus'} onClick={(e) => handleToggleCollection(collection.id, e)} />\n )}\n <div>{collection.name}</div>\n {' '}\n <span>{collection.item_count}</span>\n </BCollectionList.Collection>\n\n {hasChildren && isOpen && <BCollectionList>{children.map(renderCollection)}</BCollectionList>}\n </li>\n )\n }\n\n if (rootCollections.size() === 0) return null\n\n return (\n <Fragment>\n {horizontalRule && <hr />}\n <BCollectionList noPadding className=\"bq-sidebar-component\">\n <li>\n <BCollectionList.Collection active={active === null} onClick={(e) => handleFilterByCollection(null, e)}>\n {t('user.store.all_collections')}\n </BCollectionList.Collection>\n <BCollectionList noPadding>{rootCollections.map(renderCollection)}</BCollectionList>\n </li>\n </BCollectionList>\n </Fragment>\n )\n}\n\nCollectionList.propTypes = {\n collections: PropTypes.object,\n rootCollections: PropTypes.object,\n active: PropTypes.string,\n fetchCollections: PropTypes.func,\n filterKey: PropTypes.string,\n horizontalRule: PropTypes.bool,\n brandColor: PropTypes.string\n}\n\nconst mapStateToProps = (state, props) => {\n const filter = state.filter.get(props.filterKey || 'global')\n const collections = state.orm.collections.getAll()\n const rootCollections = collections.getAll({ parent_id: null })\n const brandColor = state.settings.get('store.brand_color')\n\n return {\n active: filter?.get('collection_id'),\n collections,\n rootCollections,\n brandColor\n }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n fetchCollections: () =>\n CollectionActions.fetchAll({\n sort: '-system,depth,position',\n page: {\n size: 1000\n }\n })\n }\n}\n\nexport default compose(reduxConnect(mapStateToProps, mapDispatchToProps))(CollectionList)\n","/* eslint-disable react/no-find-dom-node */\n/* eslint-disable react/jsx-no-target-blank */\n\n// React\nimport React, { Component, Fragment } from 'react'\nimport { findDOMNode } from 'react-dom'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport range from 'lodash/range'\nimport _map from 'lodash/map'\nimport _isEmpty from 'lodash/isEmpty'\nimport { Map } from 'immutable'\nimport { withTranslation, Trans } from 'react-i18next'\n\n// Components\nimport Product from './product'\nimport Pagination from './pagination'\nimport ProductSearch from './product_search'\nimport CollectionList from 'store/modules/product/components/CollectionList'\nimport { ModalCartPicker } from 'store/modules/cart/CartPicker/Modal'\n\n// Shared\nimport ItemActions from 'store/v2/redux/actions/item'\nimport isMobile from 'shared/utils/isMobile'\nimport { getLocalCartId } from 'shared/utils/cart'\n\nexport class ProductList extends Component {\n static displayName = 'ProductList'\n\n static propTypes = {\n items: PropTypes.object,\n hasItems: PropTypes.bool,\n hasDates: PropTypes.any,\n searchVisible: PropTypes.bool,\n collectionsVisible: PropTypes.bool,\n filterKey: PropTypes.string,\n filter: PropTypes.instanceOf(Map),\n per: PropTypes.any,\n loadingItems: PropTypes.number,\n wrapClass: PropTypes.string,\n limit: PropTypes.any,\n tags: PropTypes.string,\n categories: PropTypes.string,\n collections: PropTypes.string,\n searchValue: PropTypes.string,\n cart: PropTypes.object,\n brandingColor: PropTypes.string,\n t: PropTypes.func\n }\n\n state = {\n ids: [],\n loading: true,\n loadingItems: 4,\n total: null,\n page: 1,\n per: this.props.per || 24,\n cartModalOpen: false,\n initialLoaded: false\n }\n\n componentDidMount = () => {\n return this.fetchItems()\n }\n\n componentDidUpdate = (prevProps) => {\n const { filter } = this.props\n\n if (filter && !filter.equals(prevProps.filter)) {\n this.resetFilter()\n }\n }\n\n resetFilter = () => {\n const { filter } = this.props\n\n this.setState({ page: 1 })\n\n return this.fetchItems({ ...filter.toJS(), page: 1 })\n }\n\n fetchItems = (options) => {\n let limit = 0\n const { tags, categories, collections } = this.props\n const { per, page } = this.state\n\n if (options == null) {\n options = {}\n }\n\n this.setState({ loading: true })\n\n const cartId = getLocalCartId()\n\n const params = {\n cart_id: cartId,\n page: {\n number: page,\n per\n }\n }\n\n const filter = {}\n\n if (tags) {\n filter.tag = tags.split(',')\n }\n\n if (categories) {\n filter.category = categories.split(',')\n }\n\n if (collections) {\n filter.collection = collections.split(',')\n }\n\n if (options.page) {\n params.page.number = options.page\n }\n if (per) {\n params.page.per = parseInt(per)\n }\n if (options.q) {\n filter.q = options.q\n }\n\n if (options.category_id) {\n filter.category_id = options.category_id\n }\n\n if (options.collection_id) {\n filter.collection_id = options.collection_id\n // Remove collection filter to avoid conflicts\n filter.collection = []\n }\n\n if (options.filter_by === 'available') {\n filter.available = true\n }\n\n if (this.props.limit) {\n limit = parseInt(this.props.limit)\n\n if (!this.props.per) {\n params.page.number = 1\n params.page.per = limit\n }\n }\n\n return ItemActions.fetchAll({\n include: 'photo',\n filter: !_isEmpty(filter) ? filter : undefined,\n sort: options.sort_by,\n apiVersion: 3,\n ...params\n }).then((response) => {\n this.setState({\n ids: _map(response.payload.normalizedResponse.entities.items, 'id'),\n total: limit || response.payload.response.meta.total_count,\n loading: false,\n initialLoaded: true,\n loadingItems: Math.min(limit || response.payload.response.meta.total_count, params.per)\n })\n })\n }\n\n handlePageChange = (page) => {\n this.fetchItems({ page, ...this.props.filter.toJS() })\n this.setState({ page })\n\n const node = findDOMNode(this)\n\n if (node.scrollIntoView != null) {\n return node.scrollIntoView()\n } else {\n return window.scrollTo(0, 0)\n }\n }\n\n handleModalOpen = () => {\n this.setState({ cartModalOpen: true })\n }\n\n handleModalClose = () => {\n this.setState({ cartModalOpen: false })\n }\n\n renderList = () => {\n const { t } = this.props\n const items = this.props.items.getById(this.state.ids)\n\n if (items.size()) {\n return items.map((item) => {\n return (\n <div className={`booqable-product ${this.props.wrapClass || ''}`} key={item.id} data-id={item.id}>\n <Product id={item.id} />\n </div>\n )\n })\n } else if (this.state.loading) {\n return range(1, this.props.loadingItems || this.state.loadingItems + 1).map((i) => (\n <div key={i} className=\"booqable-product\">\n <Product />\n </div>\n ))\n } else if (this.props.searchValue !== '' || (this.props.hasItems && items.size() === 0)) {\n return <div className=\"booqable-product-list-notice\">{t('user.store.no_products_found_try_filters')}</div>\n } else {\n return (\n <div className=\"cleanstate\">\n {t('user.store.no_products_found')}\n <Trans\n i18nKey=\"user.store.login_to_add_products_or_use_tags\"\n ns=\"user\"\n components={{ Link: <a href=\"https://login.booqable.com\" target=\"_blank\" className=\"bq-branded-font\" /> }}\n />\n </div>\n )\n }\n }\n\n render () {\n const { cart, brandingColor, t } = this.props\n const { cartModalOpen } = this.state\n\n const mobile = isMobile()\n\n return (\n <Fragment>\n <div\n className={`booqable-product-list-wrapper ${\n this.props.collectionsVisible ? 'booqable-product-list-wrapper-with-sidebar' : undefined\n }`}\n >\n {this.props.searchVisible && <ProductSearch filterKey={this.props.filterKey} />}\n {!this.props.hasDates && (\n <div className=\"booqable-product-list-notice clickable\" onClick={this.handleModalOpen}>\n {t('user.store.no_dates_set')}\n </div>\n )}\n {this.renderList()}\n {this.state.initialLoaded && this.state.total > 0 && (\n <Pagination\n total={this.state.total}\n page={this.state.page}\n per={this.state.per}\n onChange={this.handlePageChange}\n />\n )}\n {this.props.collectionsVisible && <CollectionList filterKey={this.props.filterKey} />}\n </div>\n <ModalCartPicker\n cart={cart}\n open={cartModalOpen}\n onClose={this.handleModalClose}\n brandingColor={brandingColor}\n direction={mobile ? 'vertical' : 'horizontal'}\n title={t('user.store.cart_title')}\n />\n </Fragment>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const searchVisible = props.showSearch === 'true'\n const collectionsVisible = props.showCollections === 'true' || props.showCategories === 'true'\n const cart = state.orm.carts.getById(state.client.cartId)\n const filterKey = props.filterKey || 'global'\n const brandingColor = state.settings.get('store.brand_color')\n\n return {\n hasDates: cart && cart.starts_at && cart.stops_at,\n hasItems: state.orm.items.size() > 0,\n items: state.orm.items.getAll(),\n loadingItems: parseInt(props.loadingItems) || parseInt(props.limit),\n searchVisible,\n collectionsVisible,\n filterKey,\n filter: state.filter.get(filterKey),\n cart,\n brandingColor\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(ProductList)\n\nexport default withTranslation('user')(reduxComponent)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Provider } from 'react-redux'\n\nimport ProductList from '../components/product_list'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class List extends React.Component {\n static displayName = 'ListContainer'\n\n static propTypes = {\n searchKey: PropTypes.string\n }\n\n render = () => {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <ProductList {...this.props} filterKey={this.props.searchKey} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","import styled, { css } from 'styled-components'\n\nexport const ProductButton = styled.div`\n`\n\nexport const BundleItems = styled.div`\n max-height: 175px;\n overflow-y: auto;\n\n display: grid;\n grid-template-columns: 50px max-content 1fr;\n\n margin-bottom: 12px !important;\n\n background:\n /* Shadow covers */\n linear-gradient(white 30%, rgba(255,255,255,0)),\n linear-gradient(rgba(255,255,255,0), white 70%) 0 100%,\n\n /* Shadows */\n radial-gradient(50% 0, farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)),\n radial-gradient(50% 100%,farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%;\n background:\n /* Shadow covers */\n linear-gradient(white 30%, rgba(255,255,255,0)),\n linear-gradient(rgba(255,255,255,0), white 70%) 0 100%,\n\n /* Shadows */\n radial-gradient(farthest-side at 50% 0, rgba(0,0,0,.15), rgba(0,0,0,0)),\n radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.15), rgba(0,0,0,0)) 0 100%;\n background-repeat: no-repeat;\n background-color: white;\n background-size: 100% 40px, 100% 40px, 100% 14px, 100% 14px;\n background-attachment: local, local, scroll, scroll;\n`\n\nexport const BundleItemRow = styled.div`\n display: contents;\n`\n\nexport const BundleItemCell = styled.div`\n display: flex;\n align-items: center;\n\n padding: 5px !important;\n\n font-size: 14px !important;\n\n ${({ disabled }) => disabled && css`\n opacity: 0.6;\n `}\n\n /* Need to specificity hack here ;< */\n &&&&&&&{\n select.bq-variation {\n font-size: 14px !important;\n margin-bottom: 0 !important;\n }\n }\n`\n","import { ProductButton, BundleItems, BundleItemRow, BundleItemCell } from './styles'\n\nProductButton.BundleItems = BundleItems\nProductButton.BundleItemRow = BundleItemRow\nProductButton.BundleItemCell = BundleItemCell\n\nexport default ProductButton\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport clone from 'lodash/clone'\nimport isEmpty from 'lodash/isEmpty'\nimport isEqual from 'lodash/isEqual'\n\n// Components\nimport FocalImage from 'ui/components/FocalImage'\nimport Icon from 'ui/components/Icon'\nimport BProductButton from 'store/modules/product/blocks/ProductButton'\n\n// Shared\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\n\nexport class BundleItems extends Component {\n static displayName = 'ProductButtonBundleItems'\n\n static propTypes = {\n bundleItems: PropTypes.object,\n products: PropTypes.object,\n productGroups: PropTypes.object,\n photos: PropTypes.object,\n configuration: PropTypes.object,\n setBundleConfiguration: PropTypes.func\n }\n\n componentDidMount = () => {\n this.chooseInitialConfiguration()\n }\n\n chooseInitialConfiguration = () => {\n const { bundleItems, products, configuration } = this.props\n const newConfiguration = clone(configuration)\n\n bundleItems.forEach((bundleItem) => {\n if (bundleItem.product_id) {\n // Specified BundleItem => Use preconfigured Product\n newConfiguration[bundleItem.id] = bundleItem.product_id\n } else if (isEmpty(configuration[bundleItem.id])) {\n // Unspecified BundleItem => Pick Product based on sorting_weight\n // sorting_weight determines order in which Products are shown under Product>Variations in the Back Office\n const choices = products.getAll({ product_group_id: bundleItem.product_group_id }).sort('sorting_weight')\n newConfiguration[bundleItem.id] = choices.getFirst().id\n }\n })\n\n if (!isEqual(newConfiguration, configuration)) {\n this.props.setBundleConfiguration(newConfiguration)\n }\n }\n\n handleChangeVariation = (bundleItemId, e) => {\n const { configuration } = this.props\n const selectedProductId = e.target.value\n\n const newConfiguration = clone(configuration)\n newConfiguration[bundleItemId] = selectedProductId\n\n this.props.setBundleConfiguration(newConfiguration)\n }\n\n renderSelectVariation = (bundleItemId, products, selectedProduct) => {\n return (\n <div className=\"bq-variation-wrapper\">\n <select\n name=\"variation\"\n className=\"bq-variation\"\n onChange={this.handleChangeVariation.bind(null, bundleItemId)}\n value={selectedProduct || ''}\n >\n {products.map((product) => (\n <option key={`${bundleItemId}-${product.id}`} value={product.id}>\n {product.name}\n </option>\n ))}\n </select>\n <Icon icon=\"angle-down\" />\n </div>\n )\n }\n\n renderItem = (bundleItem) => {\n const { products, productGroups, photos, configuration } = this.props\n const productGroup = productGroups.getById(bundleItem.product_group_id)\n const product = products.getById(bundleItem.product_id)\n const variation = products.getById(configuration[bundleItem.id])\n const item = variation || product || productGroup\n const photo = photos.getById(item.photo_id)\n const choices = products.getAll({ product_group_id: productGroup.id }).sort('sorting_weight')\n\n return (\n <BProductButton.BundleItemRow key={bundleItem.id}>\n <BProductButton.BundleItemCell>\n <FocalImage\n url={(photo && photo.large_url) || NO_PRODUCT_IMAGE}\n preview={photo && photo.preview}\n coordinates={photo && photo.coordinates}\n size=\"40px\"\n />\n </BProductButton.BundleItemCell>\n <BProductButton.BundleItemCell disabled>\n {bundleItem.quantity}x\n </BProductButton.BundleItemCell>\n <BProductButton.BundleItemCell>\n {(!productGroup.has_variations || bundleItem.product_id) &&\n item.name}\n {productGroup.has_variations && !bundleItem.product_id &&\n this.renderSelectVariation(bundleItem.id, choices, configuration[bundleItem.id])}\n </BProductButton.BundleItemCell>\n </BProductButton.BundleItemRow>\n )\n }\n\n render () {\n const { bundleItems } = this.props\n\n return (\n <BProductButton.BundleItems className=\"bq-bundle-contents\">\n {bundleItems.map((item) => this.renderItem(item))}\n </BProductButton.BundleItems>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const bundleItems = state.orm.bundle_items.getAll({ bundle_id: props.item.id })\n const productGroupIds = bundleItems.pluck('product_group_id')\n const productGroups = state.orm.product_groups.getById(productGroupIds)\n const products = state.orm.products.getAll({ product_group_id: productGroupIds })\n\n return {\n bundleItems,\n products,\n productGroups,\n photos: state.orm.photos.getAll()\n }\n}\n\nexport default reduxConnect(mapStateToProps, null)(BundleItems)\n","import styled, { css } from 'styled-components'\n\nimport { size, fontWeight, fontSize, color } from 'ui/themes/utils'\n\nimport Icon from 'ui/blocks/Icon'\nimport P from 'ui/elements/P'\n\nexport const TimeTable = styled.div`\n width: ${({ width }) => width ? `${width}px` : 'auto'};\n\n ${P} {\n font-size: ${fontSize('md')};\n }\n`\n\nexport const ScrollContainer = styled.div`\n height: 360px;\n\n overflow-y: auto;\n\n @media screen and (max-width: 425px) {\n height: 70vh;\n }\n`\n\nexport const Header = styled.div`\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n\n padding: ${size('padding', 'sm')} !important;\n\n border-bottom: ${size('borderWidth')} solid ${color('Misc/Divider')} !important;\n\n & > ${Icon} {\n flex: 0;\n\n cursor: pointer;\n }\n\n & > ${P} {\n font-weight: ${fontWeight('lighter')};\n }\n\n & > ${P}:last-of-type {\n flex: 1;\n\n text-align: center;\n\n margin: 0;\n }\n`\n\nexport const Item = styled.div`\n display: flex;\n align-items: center;\n\n padding: ${size('padding', 'sm')} !important;\n\n ${({ active }) => active && css`\n background: ${color('Primary/Background2')};\n `}\n\n ${({ inOpeningHours }) => !inOpeningHours && css`\n opacity: 0.5;\n `}\n\n & > ${P} {\n margin: 0;\n\n font-weight: ${fontWeight('lighter')};\n }\n\n & > ${P}:first-of-type {\n flex: 1;\n }\n\n & > ${P}:last-of-type {\n text-align: right;\n }\n`\n\nexport const Indicator = styled.div`\n width: 16px;\n height: 16px;\n\n margin-right: ${size('margin', 'xs')} !important;\n\n border-radius: ${size('borderRadius')};\n\n ${({ status }) => {\n let background\n\n if (status) {\n switch (status) {\n case 'available':\n background = color('Success/Outline')\n break\n case 'unavailable':\n background = color('Danger/Base')\n break\n }\n\n return css`\n background-color: ${background};\n `\n } else {\n /* Loading state */\n return css`\n background: #000000;\n opacity: 0.15;\n\n animation: pulse 1.5s infinite ease-in-out;\n\n @keyframes pulse {\n 0% { opacity: 0.05; }\n 50% { opacity: 0.15; }\n 100% { opacity: 0.05; }\n }\n `\n }\n }}\n`\n","import { Header, Indicator, Item, ScrollContainer, TimeTable } from './styles'\n\nTimeTable.Header = Header\nTimeTable.Item = Item\nTimeTable.Indicator = Indicator\nTimeTable.ScrollContainer = ScrollContainer\n\nexport default TimeTable\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport P from 'ui/elements/P'\nimport Loader from 'ui/components/Loader'\nimport BTimeTable from 'store/modules/product/blocks/ProductAvailabilityCalendar/TimeTable'\nimport Icon from 'ui/components/Icon'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Shared\nimport OperatinRuleUtils from 'shared/utils/operating_rules'\nimport { date as dateFormat } from 'shared/utils/format'\nimport moment, { localMomentInUTC } from 'shared/lib/moment'\n\nexport class TimeTable extends Component {\n static displayName = 'TimeTable'\n\n static propTypes = {\n id: PropTypes.string,\n date: PropTypes.any,\n onClose: PropTypes.func,\n fetchAvailability: PropTypes.func,\n quantity: PropTypes.number,\n selected: PropTypes.object,\n availabilities: PropTypes.object,\n showCounts: PropTypes.bool,\n width: PropTypes.number,\n t: PropTypes.func\n }\n\n constructor (props) {\n super(props)\n this.firstOpenElement = React.createRef()\n }\n\n componentDidMount = () => {\n const { date, fetchAvailability } = this.props\n\n fetchAvailability({\n time: date,\n timeTable: true\n })\n }\n\n componentDidUpdate = (prevProps) => {\n if (this.props.availabilities !== prevProps.availabilities) {\n this.firstOpenElement?.current?.scrollIntoView()\n }\n }\n\n render () {\n const { availabilities, onClose, date, selected, showCounts, t } = this.props\n const localDate = localMomentInUTC(date)\n\n let firstOpenElement = availabilities.find((el) => el.inOpeningHours)\n\n return (\n <BTimeTable width={this.props.width}>\n <BTimeTable.Header>\n <Icon icon=\"arrow-left\" onClick={onClose} />\n <P>{dateFormat(localDate, 'date')}</P>\n </BTimeTable.Header>\n <BTimeTable.ScrollContainer>\n {!availabilities && <Loader size=\"md\" />}\n {availabilities.map((availability) => {\n let ref\n\n if (firstOpenElement === availability) {\n ref = this.firstOpenElement\n }\n\n const active = selected.contains(availability.time)\n\n return (\n <BTimeTable.Item key={availability.time} active={active} ref={ref} inOpeningHours={availability.inOpeningHours}>\n <BTimeTable.Indicator className={availability.status} status={availability.status} />\n <P>{dateFormat(availability.time, 'time')}</P>\n {showCounts && <P>{availability.quantity} {t('user.store.available')}</P>}\n {!showCounts && <P>{t(availability.status === 'available' ? 'user.store.available' : 'user.store.unavailable')}</P>}\n </BTimeTable.Item>\n )\n })}\n </BTimeTable.ScrollContainer>\n </BTimeTable>\n )\n }\n}\n\nconst mapStateToProps = (_state, props) => {\n return {\n selected: moment.range(\n moment(props.selected.from),\n moment(props.selected.to)\n ),\n availabilities: props.availabilities.getAll({\n type: 'time'\n }).map((el) => {\n const time = moment(`${el.date} ${el.hour}:${el.minute}`)\n\n return {\n time,\n date: el.date,\n status: el.status,\n quantity: el.quantity,\n inOpeningHours: OperatinRuleUtils.isWithinOpeningHours(time, props.operatingRules, true)\n }\n }).filter((el) => {\n // TODO: In case we want to hide availability outside of opening hours\n // if (!el.inOpeningHours && el.status !== 'unavailable') return false\n const localDate = localMomentInUTC(props.date)\n return moment(el.date).isSame(localDate, 'day')\n }).sortBy((el) => el.time)\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps)(TimeTable)\n\nexport default withTranslation('user')(reduxComponent)\n","import styled from 'styled-components'\nimport Link from 'ui/blocks/Link'\nimport H3 from 'ui/elements/H3'\nimport Label from 'ui/elements/Label'\nimport BQuantityInput from 'ui/blocks/QuantityInput'\n\nimport { size, color, fontSize, fontWeight } from 'ui/themes/utils'\n\nexport const ProductAvailabilityCalendar = styled.div`\n overflow-x: hidden;\n\n .slide-and-fade-enter {\n opacity: 0;\n transform: translateX(100%);\n }\n\n .slide-and-fade-exit {\n opacity: 1;\n transform: translateX(0);\n }\n\n .slide-and-fade-enter-active {\n opacity: 1;\n transform: translateX(0);\n }\n\n .slide-and-fade-exit-active {\n opacity: 0;\n transform: translateX(-100%);\n }\n\n .slide-and-fade-enter-active,\n .slide-and-fade-exit-active {\n transition: all 150ms;\n }\n\n font-family: ${(props) => props.theme.font.body};\n\n .DayPicker-Caption {\n color: ${color('Text/Primary')};\n }\n`\n\nexport const CalendarContainer = styled.div``\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: ${size('padding', 'sm')} ${size('padding', 'sm')} 0 !important;\n\n cursor: pointer;\n\n ${H3} {\n font-size: calc(${fontSize('md')} + 2px);\n font-weight: ${fontWeight('semibold')};\n }\n`\n\nexport const InputContainer = styled.div`\n padding: ${size('padding', 'md')} ${size('padding', 'sm')} 0 !important;\n\n font-weight: ${fontWeight('semibold')} !important;\n\n display: flex;\n\n > div:first-child {\n /* Increase flex-basis to allow 3 digit numbers to be fully visible */\n flex-basis: 28%;\n }\n\n > div:last-child {\n flex-grow: 3;\n\n margin-left: ${size('margin', 'md')};\n }\n\n > div:first-child:last-child {\n margin-left: 0;\n }\n\n .Select__menu {\n margin-top: ${size('margin', 'xs')};\n }\n\n .Select__option {\n padding: ${size('padding', 'xs')} ${size('padding', 'md')};\n font-weight: ${fontWeight('lighter')};\n font-size: ${fontSize('md')};\n }\n\n ${Label} {\n font-weight: ${fontWeight('semibold')};\n font-size: ${fontSize('md')};\n\n margin-bottom: ${size('margin', 'xs')};\n }\n\n ${BQuantityInput.Control} {\n font-size: calc(${fontSize('sm')} + 1px);\n line-height: ${fontSize('lg')} !important;\n }\n`\n\nexport const AvailabilityLink = styled(Link)`\n display: inline-block;\n height: 2em;\n\n text-decoration: underline !important;\n`\n","import { ProductAvailabilityCalendar, InputContainer, AvailabilityLink, Header, CalendarContainer } from './styles'\n\nProductAvailabilityCalendar.InputContainer = InputContainer\nProductAvailabilityCalendar.AvailabilityLink = AvailabilityLink\nProductAvailabilityCalendar.Header = Header\nProductAvailabilityCalendar.CalendarContainer = CalendarContainer\n\nexport default ProductAvailabilityCalendar\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Navigation from 'ui/components/DayPicker/Navigation'\nimport InputField from 'ui/components/InputField'\nimport PickerDay from 'ui/components/Picker/Day'\nimport Popover from 'ui/components/Popover'\nimport Icon from 'ui/components/Icon'\nimport BDatePickerInput from 'ui/blocks/DatePickerInput'\nimport BDayPicker from 'ui/blocks/DayPicker'\nimport H3 from 'ui/elements/H3'\nimport TimeTable from './TimeTable'\nimport PortalWrapper from 'ui/components/PortalWrapper'\nimport BProductAvailabilityCalendar from 'store/modules/product/blocks/ProductAvailabilityCalendar'\nimport Div from 'ui/elements/Div'\n\n// Libraries\nimport DayPicker, { MomentLocaleUtils } from 'react-day-picker'\nimport debounce from 'lodash/debounce'\nimport { CSSTransition, SwitchTransition, config } from 'react-transition-group'\n\n// Shared\nimport { isDayClosed } from 'ui/components/Picker/utils'\nimport useIsMobile from 'shared/utils/useIsMobile'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport moment, { localMoment } from 'shared/lib/moment'\nimport AvailabilityActions from 'store/v2/redux/actions/availability'\nimport { localMomentInUTC } from 'shared/lib/moment'\n\nimport 'react-day-picker/lib/style.css'\n\n// Get and set locale\nlet locale = 'en'\n\nif (navigator.languages !== undefined) {\n locale = navigator.languages[0]\n} else {\n locale = navigator.language\n}\n\nlocale = locale.toLowerCase()\n\nimport(`moment/locale/${locale}`).then(() => {\n moment.locale(locale)\n\n if (window.booqableOptions) {\n window.booqableOptions.locale = locale.split('-')[0]\n }\n})\n .catch((error) => {\n // These locales are the default in moment and\n // not included in as specific locale files.\n // We can discard the error since US English\n // is already loaded.\n if (['en', 'en-us'].includes(locale)) return\n\n throw (error)\n })\n\nclass ProductAvailabilityCalendar extends Component {\n static displayName = 'ProductAvailabilityCalendar'\n\n static propTypes = {\n id: PropTypes.string,\n productConfiguration: PropTypes.object,\n firstDayOfWeek: PropTypes.number,\n translate: PropTypes.bool,\n selected: PropTypes.object,\n availabilities: PropTypes.object,\n locations: PropTypes.object,\n showPast: PropTypes.bool,\n showTimes: PropTypes.bool,\n fetchAvailability: PropTypes.func,\n defaultLocationId: PropTypes.string,\n t: PropTypes.func,\n showCounts: PropTypes.bool,\n operatingRules: PropTypes.object,\n isMobile: PropTypes.bool\n }\n\n state = {\n selectedLocationId: null,\n quantity: 1,\n date: null,\n time: null,\n containerWidth: 0\n }\n\n componentDidMount = () => {\n // disables animations when in test mode\n config.disabled = !!window.testMode\n\n this.handleFetchAvailability = debounce(\n this.fetchAvailability,\n window.testMode ? 0 : 500\n )\n }\n\n componentDidUpdate = (_, prevState) => {\n if (!prevState.time && this.state.time !== prevState.time && this.containerRef) {\n this.setState({ containerWidth: this.containerRef.getBoundingClientRect().width })\n }\n\n if (!this.state.selectedLocationId && this.props.defaultLocationId !== this.state.selectedLocationId) {\n this.setState({ selectedLocationId: this.props.defaultLocationId })\n }\n }\n\n handlePopoverOpen = () => {\n this.setState({ open: true, time: null })\n this.handleFetchAvailability()\n }\n\n handleDayClick = (date, modifiers) => {\n if (modifiers.disabled) return\n\n const { showTimes } = this.props\n\n if (!showTimes) return\n\n this.setState({ time: date })\n }\n\n handleTimeTableClose = () => {\n this.setState({ time: null })\n }\n\n handlePopoverClose = () => {\n this.setState({ open: false })\n }\n\n fetchAvailability = ({ time, timeTable } = {}) => {\n const { id, productConfiguration, selected, fetchAvailability, defaultLocationId, locations } = this.props\n const { selectedLocationId, quantity, date } = this.state\n const queryDate = time || date || (selected?.from && new Date(selected.from)) || new Date()\n const locationId = selectedLocationId || defaultLocationId || locations?.first()?.id\n\n fetchAvailability(id, productConfiguration, {\n date: queryDate,\n locationId,\n quantity,\n timeTable\n })\n }\n\n renderLocationSelect = () => {\n const { locations, defaultLocationId, t } = this.props\n const { selectedLocationId } = this.state\n\n if (!locations || locations.size() <= 1) return null\n\n return (\n <InputField\n type=\"select\"\n data-tid=\"Availability location select\"\n label={t('user.store.start', t('common.start.present'))}\n options={locations.pluckObject({ label: 'name', value: 'id' })}\n field={{\n name: 'location',\n value: selectedLocationId || defaultLocationId,\n onChange: (value) => this.setState({ selectedLocationId: value }, this.handleFetchAvailability)\n }}\n renderNativeOnMobile={false}\n />\n )\n }\n\n renderQuantityInput = () => {\n const { t } = this.props\n const { quantity } = this.state\n\n return (\n <InputField\n type=\"quantity\"\n data-tid=\"Availability quantity\"\n label={t('user.store.quantity', t('common.quantity'))}\n min={1}\n field={{\n name: 'quantity',\n value: quantity,\n onChange: (value) => { this.setState({ quantity: value }, this.handleFetchAvailability) }\n }}\n />\n )\n }\n\n renderDay = (day, modifiers) => {\n const { availabilities, showCounts, showPast, showTimes } = this.props\n\n const availabilityData = availabilities?.getFirst({ type: 'date', date: localMomentInUTC(day).format('YYYY-MM-DD') })\n\n return (\n <PickerDay\n day={day}\n available={availabilityData?.status}\n availableCount={availabilityData?.quantity}\n showCounts={showCounts}\n modifiers={modifiers}\n showAvailability\n showPast={showPast}\n interactive={showTimes}\n />\n )\n }\n\n renderAvailabilityCalendar = () => {\n const { translate, operatingRules, availabilities, showCounts, firstDayOfWeek, isMobile, showTimes, t } = this.props\n\n const modifiers = {}\n const selected = {\n from: new Date()\n }\n\n if (this.props.selected?.from) {\n Object.assign(selected, {\n from: localMoment(this.props.selected.from, true).toDate(),\n to: localMoment(this.props.selected.to, true).toDate()\n })\n\n Object.assign(modifiers, {\n selected,\n selectionStart: selected.from,\n selectionEnd: selected.to,\n from: selected.from,\n to: selected.to,\n past: { before: new Date() }\n })\n } else {\n Object.assign(modifiers, {\n past: { before: new Date() }\n })\n }\n\n return (\n <BProductAvailabilityCalendar\n isMobile={isMobile}\n ref={(ref) => { this.containerRef = ref }}\n className=\"booqable-component\"\n >\n <BProductAvailabilityCalendar.Header onClick={this.handlePopoverClose}>\n <H3>{t('user.store.check_availability', t('common.check_availability'))}</H3>\n {' '}\n <Icon icon=\"times\" style=\"fas\" />\n </BProductAvailabilityCalendar.Header>\n <SwitchTransition>\n <CSSTransition\n key={(this.state.time && showTimes) ? 'time' : 'date'}\n addEndListener={(node, done) => node.addEventListener('transitionend', done, false)}\n classNames=\"slide-and-fade\"\n >\n <>\n {this.state.time && (\n <TimeTable\n fetchAvailability={this.fetchAvailability}\n onClose={this.handleTimeTableClose}\n date={this.state.time}\n quantity={this.state.quantity}\n width={this.state.containerWidth}\n availabilities={availabilities}\n operatingRules={operatingRules}\n selected={selected}\n showCounts={showCounts}\n />\n )}\n {!this.state.time && (\n <BProductAvailabilityCalendar.CalendarContainer>\n <BProductAvailabilityCalendar.InputContainer>\n {this.renderQuantityInput()}\n {this.renderLocationSelect()}\n </BProductAvailabilityCalendar.InputContainer>\n <Div modifiers=\"padding-left-sm padding-right-sm padding-top-md padding-bottom-md\">\n <BDayPicker>\n <DayPicker\n navbarElement={Navigation}\n month={selected.from || new Date()}\n localeUtils={MomentLocaleUtils}\n locale={translate ? locale : 'en'}\n firstDayOfWeek={parseInt(firstDayOfWeek)}\n renderDay={this.renderDay}\n onMonthChange={(date) => this.setState({ date }, this.handleFetchAvailability)}\n onDayClick={this.handleDayClick}\n disabledDays={(date) => isDayClosed({ date: localMomentInUTC(date), openingHours: operatingRules, allowPast: false })}\n modifiers={modifiers}\n from={selected.from}\n to={selected.to}\n className={!showTimes && 'DayPicker--interactionDisabled'}\n />\n </BDayPicker>\n </Div>\n </BProductAvailabilityCalendar.CalendarContainer>\n )}\n </>\n </CSSTransition>\n </SwitchTransition>\n </BProductAvailabilityCalendar>\n )\n }\n\n renderMobile = (open) => {\n const { t } = this.props\n\n return (\n <Fragment>\n <BProductAvailabilityCalendar.AvailabilityLink color=\"dark\" size=\"xs\" onClick={this.handlePopoverOpen}>\n {t('user.store.check_availability', t('common.check_availability'))}\n </BProductAvailabilityCalendar.AvailabilityLink>\n <PortalWrapper open={open}>\n <BDatePickerInput.MobileWrapper>\n {this.renderAvailabilityCalendar(true)}\n </BDatePickerInput.MobileWrapper>\n </PortalWrapper>\n </Fragment>\n )\n }\n\n render () {\n const { open } = this.state\n const { isMobile, t } = this.props\n\n if (isMobile) {\n return this.renderMobile(open)\n } else {\n return (\n <Popover\n content={this.renderAvailabilityCalendar}\n open={open}\n onClose={this.handlePopoverClose}\n method=\"manual\"\n direction=\"right\"\n fallbackPlacements={['left', 'bottom']}\n offset={20}\n fixed\n >\n <BProductAvailabilityCalendar.AvailabilityLink color=\"dark\" size=\"xs\" onClick={this.handlePopoverOpen}>\n {t('user.store.check_availability', t('common.check_availability'))}\n </BProductAvailabilityCalendar.AvailabilityLink>\n </Popover>\n )\n }\n }\n}\n\nconst ProductAvailabilityCalendarWrapper = (props) => {\n const isMobile = useIsMobile()\n\n return <ProductAvailabilityCalendar {...props} isMobile={isMobile} />\n}\n\nconst mapStateToProps = (state, _props) => {\n return {\n locations: state.orm.locations.getAll(),\n firstDayOfWeek: state.settings.get('dates.first_day_of_week'),\n showTimes: state.settings.get('store.use_times')\n }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => ({\n fetchAvailability: (id, configuration, { date, locationId, quantity, timeTable }) => {\n if (!date) return\n\n const filter = {\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n item_id: id,\n start_location_id: locationId,\n quantity,\n configuration\n }\n\n if (timeTable) {\n filter.day = date.getDate()\n }\n\n return AvailabilityActions.fetchItemAvailability({\n apiVersion: 3,\n filter\n })\n }\n})\n\nexport default compose(\n reduxConnect(mapStateToProps, mapDispatchToProps),\n withTranslation('user')\n)(ProductAvailabilityCalendarWrapper)\n","import get from 'lodash/get'\n\nexport default {\n selectedForProductGroup (collection, selectedProductId, productGroupId) {\n let selectedProduct\n\n if (selectedProductId) {\n selectedProduct = collection.getById(selectedProductId)\n } else {\n // TODO: Select available product first\n const products = collection.getAll({ product_group_id: productGroupId })\n\n selectedProduct = products.sortBy(\n (product) => product.price_in_cents || product.price_each_in_cents || get(product, 'price.tile.price_in_cents')\n )\n selectedProduct =\n selectedProduct.filter((product) => product.available_quantity > 0).first() || selectedProduct.first()\n }\n\n return selectedProduct\n }\n}\n","import { updateUI } from 'shared/redux/interface'\n\nconst store = window.booqableStore\n\nexport default {\n addLineQtyUI (line, qty) {\n const newQty = parseInt(line.quantity) + parseInt(qty)\n const action = updateUI(`Line${line.id}`, { quantity: newQty })\n\n return store.dispatch(action)\n }\n}\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport _get from 'lodash/get'\nimport _capitalize from 'lodash/capitalize'\nimport _isEqual from 'lodash/isEqual'\nimport _isNaN from 'lodash/isNaN'\n\n// Components\nimport BundleItems from './BundleItems'\nimport ProductPrice from 'store/v2/react/components/product_price'\nimport InputField from 'ui/components/InputField'\nimport Button from 'ui/components/Button'\nimport Icon from 'ui/components/Icon'\nimport Spacer from 'ui/blocks/Spacer'\nimport ProductAvailabilityCalendar from 'store/modules/product/components/ProductAvailabilityCalendar'\nimport ReadOnlyModeDisabledComponent from 'store/components/ReadOnlyModeDisabledComponent'\n\n// Shared\nimport ReactCSSTransitionGroup from 'shared/lib/react_css_transition_group'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport productSelectors from 'store/v2/redux/selectors/product'\nimport cartActions from 'store/v2/redux/actions/cart'\nimport clientActions from 'store/v2/redux/actions/client'\nimport quickviewActions from 'store/v2/redux/actions/quickview'\nimport lineActions from 'store/v2/redux/actions/line'\nimport BundleActions from 'store/v2/redux/actions/bundle'\nimport ProductGroupActions from 'store/v2/redux/actions/product_group'\nimport { getOperatingRules } from 'shared/utils/operating_rules'\n\nexport class ProductButton extends Component {\n static displayName = 'ProductButton'\n\n static propTypes = {\n item: PropTypes.object,\n productGroup: PropTypes.object,\n products: PropTypes.object,\n bundle: PropTypes.object,\n line: PropTypes.object,\n cart: PropTypes.object,\n useAvailability: PropTypes.bool,\n showProductAvailability: PropTypes.bool,\n hasDates: PropTypes.bool,\n book: PropTypes.func.isRequired,\n onChangeProductId: PropTypes.func,\n availabilities: PropTypes.object,\n operatingRules: PropTypes.object,\n showCounts: PropTypes.bool,\n addButtonUsesCheckoutBehaviour: PropTypes.bool,\n t: PropTypes.func,\n clear: PropTypes.func,\n loading: PropTypes.bool\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n loading: false,\n quantity: 1,\n selectedProductId: null,\n configuration: { products: {} },\n promise: null\n }\n }\n\n componentDidUpdate = (prevProps, prevState) => {\n const cartChanged = prevProps.cart?.updated_at !== this.props.cart?.updated_at\n\n const isBundle = this.props.item.type === 'Bundle'\n const bundleConfigChanged = !_isEqual(prevState.configuration, this.state.configuration)\n\n if (cartChanged) {\n this.loadItemData()\n }\n if (isBundle && (cartChanged || bundleConfigChanged)) {\n this.loadBundlePriceAndAvailability()\n }\n }\n\n get selectedProduct () {\n const { products, item } = this.props\n const { selectedProductId } = this.state\n\n if (item.type !== 'ProductGroup') return null\n\n return productSelectors.selectedForProductGroup(products, selectedProductId, item.id)\n }\n\n loadItemData = () => {\n const { item, cart } = this.props\n\n this.setState({ loading: true })\n\n const callback = () => this.setState({ loading: false, price_each_in_cents: null })\n\n if (item.type === 'ProductGroup') {\n return ProductGroupActions.fetchAll({\n ids: [item.id],\n cart_id: cart && cart.id,\n include: 'photos,products',\n apiVersion: 3\n }).then(callback)\n } else if (item.type === 'Bundle') {\n return BundleActions.fetchAll({\n ids: [item.id],\n cart_id: cart && cart.id,\n include: [\n 'photos',\n 'bundle_items',\n 'bundle_items.product',\n 'bundle_items.product.photo',\n 'bundle_items.product_group',\n 'bundle_items.product_group.products',\n 'bundle_items.product_group.photo',\n 'bundle_items.product_group.products',\n 'bundle_items.product_group.products.photo'\n ].join(','),\n apiVersion: 3\n }).then(callback)\n }\n }\n\n handleBook = () => {\n const { book, clear, addButtonUsesCheckoutBehaviour, line, item, hasDates } = this.props\n const { quantity, selectedProductId, configuration } = this.state\n\n if (!hasDates && addButtonUsesCheckoutBehaviour) {\n return clientActions.toggleModalPicker(true)\n }\n\n this.setState({ loading: true })\n\n let promise\n\n const itemId = selectedProductId || _get(this.selectedProduct, 'id') || item.id\n\n if (addButtonUsesCheckoutBehaviour) {\n promise = clear().then(() => book(itemId, line, quantity, configuration, addButtonUsesCheckoutBehaviour))\n } else {\n promise = book(itemId, line, quantity, configuration, addButtonUsesCheckoutBehaviour)\n }\n\n this.setState({ promise })\n }\n\n handleChangeQuantity = (e) => {\n let { value } = e.target\n\n if (value < 0) {\n value = 1\n }\n\n return this.setState({ quantity: value })\n }\n\n handleChangeVariation = (e) => {\n const id = e.target.value\n\n this.props.onChangeProductId && this.props.onChangeProductId(id)\n\n return this.setState({ selectedProductId: id })\n }\n\n setBundleConfiguration = (newBundleConfiguration) => {\n this.setState({ configuration: { products: newBundleConfiguration } })\n }\n\n loadBundlePriceAndAvailability = () => {\n const { cart, item } = this.props\n const { configuration } = this.state\n\n // Cart MUST be present. Otherwise we get wrong pricing displayed.\n if (!cart) return\n\n BundleActions.configurationAvailability({\n id: item.id,\n products: configuration.products,\n cart_id: cart.id,\n apiVersion: 3\n }).then((response) => {\n this.setState({\n price_each_in_cents: _get(response, 'payload.response.data.configuration.price_each_in_cents'),\n available_quantity: _get(response, 'payload.response.data.configuration.available_quantity')\n })\n })\n }\n\n renderAvailability = () => {\n const {\n useAvailability,\n showProductAvailability,\n availabilities,\n showCounts,\n hasDates,\n item,\n products,\n productGroup,\n bundle,\n cart,\n operatingRules,\n t\n } = this.props\n const { configuration } = this.state\n\n if (!useAvailability) return null\n\n let available\n const product = products && this.selectedProduct\n\n const withProductAvailability =\n useAvailability &&\n showProductAvailability &&\n ['bulk', 'trackable', 'mixed'].includes(item.tracking_type)\n\n if (typeof this.state.available_quantity === 'number') {\n available = this.state.available_quantity\n } else {\n available = (product || item || productGroup || bundle)?.available_quantity\n }\n\n return (\n <Fragment>\n {hasDates && available !== null && (\n <ReactCSSTransitionGroup transitionName=\"fade\" transitionEnterTimeout={100} transitionLeaveTimeout={100}>\n {available > 0 && showCounts && (\n <span className=\"bq-branded bq-status bq-available\">\n {!_get(productGroup, 'has_variations') && (\n <span className=\"bq-status-quantity\">\n {available}\n {' '}\n </span>\n )}\n {t('user.store.available')}\n </span>\n )}\n {available <= 0 && available !== -1 && (\n <span className=\"bq-status bq-unavailable\">\n <span>{_capitalize(t('user.store.unavailable'))}</span>\n </span>\n )}\n {(available === -1 ||\n (!showCounts && available > 0)) && (\n <span className=\"bq-branded bq-status bq-available\">\n <span>{_capitalize(t('user.store.available'))}</span>\n </span>\n )}\n </ReactCSSTransitionGroup>\n )}\n {withProductAvailability && (\n <ProductAvailabilityCalendar\n currentMonth={cart?.starts_at ? new Date(cart?.starts_at) : new Date()}\n availabilities={availabilities.getAll({ item_id: product?.id || item?.id })}\n defaultLocationId={cart?.start_location_id}\n id={product?.id || item?.id}\n productConfiguration={configuration}\n useBusinessHours\n operatingRules={operatingRules}\n showCounts={showCounts}\n selected={{ from: cart?.starts_at, to: cart?.stops_at }}\n />\n )}\n </Fragment>\n )\n }\n\n renderSelectVariation = () => {\n const { useAvailability, showCounts, hasDates, products, productGroup, t } = this.props\n const selectedProductId = this.state.selectedProductId || _get(this.selectedProduct, 'id')\n\n return (\n <div className=\"bq-variation-wrapper\">\n <select\n name=\"variation\"\n className=\"bq-variation\"\n onChange={this.handleChangeVariation}\n value={selectedProductId}\n >\n {products.map((product) => {\n const withAvailability =\n useAvailability &&\n hasDates &&\n product.tracking_type !== 'none' &&\n product.available_quantity !== null &&\n showCounts\n\n return (\n <option key={product.id} value={product.id}>\n {withAvailability ?\n `${product.name.replace(`${productGroup.name} - `, '')} (${\n product.available_quantity\n } ${t('user.store.available')})` :\n product.name.replace(`${productGroup.name} - `, '')}\n </option>\n )\n })}\n </select>\n <Icon icon=\"angle-down\" />\n </div>\n )\n }\n\n render () {\n const { item, productGroup, bundle, useAvailability, hasDates, addButtonUsesCheckoutBehaviour, t } = this.props\n const { quantity, configuration, price_each_in_cents: priceEachInCents } = this.state\n const selectedProduct = this.selectedProduct || bundle || item\n const loading = this.props.loading || this.state.loading\n\n let disabled = quantity <= 0 || _isNaN(quantity)\n\n if (addButtonUsesCheckoutBehaviour && useAvailability && selectedProduct?.tracking_type !== 'none') {\n disabled =\n disabled ||\n (hasDates && !selectedProduct?.available_quantity) ||\n (hasDates && quantity > selectedProduct?.available_quantity)\n }\n\n return (\n <div className=\"booqable-product-button-wrapper\" id={`booqable-product-button-${item && item.id}`}>\n {bundle && (\n <BundleItems\n item={item}\n useAvailability={useAvailability}\n hasDates={hasDates}\n configuration={configuration.products}\n setBundleConfiguration={this.setBundleConfiguration}\n />\n )}\n <div className=\"bq-actions\">\n {_get(productGroup, 'has_variations') && this.renderSelectVariation()}\n <ProductPrice\n chargeLabel={selectedProduct.charge_label}\n priceInCents={priceEachInCents || selectedProduct.price_each_in_cents}\n priceType={selectedProduct.price_type}\n productType={selectedProduct.product_type}\n branded\n />\n {this.renderAvailability()}\n <div className=\"bq-control\">\n <InputField\n field={{\n value: quantity,\n onChange: this.handleChangeQuantity,\n name: 'quantity'\n }}\n type=\"number\"\n size=\"sm\"\n className=\"bq-quantity\"\n />\n <Spacer vertical size=\"xs\" />\n <ReadOnlyModeDisabledComponent>\n <Button\n onClick={this.handleBook}\n promise={this.state.promise}\n size=\"sm\"\n block\n disabled={loading || disabled}\n className={`bq-button ${disabled && 'bq-disabled'}`}\n >\n {addButtonUsesCheckoutBehaviour && (\n <Fragment>\n {hasDates && t('user.store.add_to_cart')}\n {!hasDates && t('user.store.select_a_period')}\n </Fragment>\n )}\n {!addButtonUsesCheckoutBehaviour && t('user.store.add_to_cart')}\n </Button>\n </ReadOnlyModeDisabledComponent>\n </div>\n </div>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const productGroup = state.orm.product_groups.getById(props.item.id)\n\n const hasDates = !!cart?.starts_at && !!cart?.stops_at\n\n return {\n cart,\n productGroup,\n operatingRules: getOperatingRules(state),\n availabilities: state.orm.shop_availabilities,\n useAvailability: state.settings.get('store.use_availability'),\n showProductAvailability: state.settings.get('store.show_product_availability'),\n bundle: state.orm.bundles.getById(props.item.id),\n products: state.orm.products.getAll({ product_group_id: productGroup && productGroup.id }).sort('sorting_weight'),\n showCounts: !state.settings.get('store.hide_product_availability_quantities'),\n addButtonUsesCheckoutBehaviour: state.settings.get('store.behaviors.add_button') === 'checkout',\n hasDates\n }\n}\n\nconst mapDispatchToProps = () => {\n return {\n clear: () => {\n return cartActions.clear({\n apiVersion: 1\n })\n },\n book: (itemId, line, quantity, configuration, addButtonUsesCheckoutBehaviour) => {\n return cartActions.book({ item_id: itemId, quantity, configuration, apiVersion: 1 }).then(() => {\n if (line) {\n lineActions.addLineQtyUI(line, quantity)\n }\n\n const addToCart = () => {\n quickviewActions.unsetItem()\n clientActions.toggleCart(true)\n }\n\n const handleCheckout = () => {\n quickviewActions.unsetItem()\n clientActions.setCheckingOut()\n }\n\n const checkout = () =>\n clientActions.evaluateCartOverdue() ? clientActions.toggleModalPicker(true) : handleCheckout()\n\n const action = addButtonUsesCheckoutBehaviour ? checkout : addToCart\n\n triggerUserFrameworkBookEvent(itemId, quantity)\n\n return setTimeout(action, 150)\n })\n }\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(ProductButton)\n\nexport default withTranslation('user')(reduxComponent)\n","import React from 'react'\nimport { Provider } from 'react-redux'\n\nimport IdFinder from '../id_finder'\nimport ProductButton from 'store/modules/product/components/ProductButton'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class Button extends React.Component {\n static displayName = 'ProductButtonContainer'\n\n render = () => {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <IdFinder {...Object.assign({}, this.props)} hideOnLoad>\n <ProductButton />\n </IdFinder>\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","import styled, { css } from 'styled-components'\n\nimport { fontSize } from 'ui/themes/utils'\n\nexport const ProductImage = styled.div`\n float: left;\n\n width: 250px;\n\n @media (max-width: 534px) {\n width: 100%;\n float: none;\n }\n`\n\nexport const MainImage = styled.div`\n max-height: 100%;\n max-width: 100%;\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n top: 0;\n left: 0;\n\n visibility: hidden;\n\n ${({ visible }) => visible && css`\n visibility: visible;\n `}\n`\n\nexport const MainImageContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 250px;\n height: 250px;\n\n position: relative;\n\n cursor: zoom-in;\n\n ${({ magnify }) => magnify && css`\n cursor: zoom-out;\n `}\n\n ${({ canMagnify }) => !canMagnify && css`\n cursor: default;\n `}\n\n @media (max-width: 534px) {\n width: 100%;\n }\n\n @media (max-height: 550px) {\n height: 200px;\n }\n`\n\nexport const GalleryImages = styled.div`\n position: absolute;\n\n left: ${({ offset }) => offset || 0};\n top: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n transition: left 0.3s ease-in-out;\n`\n\nexport const GalleryImagesContainer = styled.div`\n position: relative;\n overflow: hidden;\n`\n\nexport const GalleryImageContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n margin-left: 5px !important;\n\n overflow: hidden;\n\n border: 1px solid transparent !important;\n\n &:hover {\n border: 1px solid ${({ brandingColor }) => brandingColor};\n cursor: pointer;\n }\n\n ${({ selected }) => selected && css`\n border: 1px solid ${({ brandingColor }) => brandingColor} !important;\n `}\n`\n\nexport const GalleryImage = styled.img`\n max-height: 100%;\n max-width: 100%;\n`\n\nexport const Controls = styled.div`\n font-size: ${fontSize('md')};\n\n transition: opacity 0.3s ease-in-out;\n cursor: pointer;\n\n &:hover {\n opacity: 0.6;\n }\n\n ${({ disabled }) => disabled && css`\n opacity: 0.6;\n cursor: initial;\n pointer-events: none;\n `}\n`\n\nexport const Gallery = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n margin-top: 10px !important;\n\n ${({ size, offset }) => css`\n ${GalleryImagesContainer} {\n /* 5 = gap between images */\n width: ${((size + 5) * 3) + 5}px;\n height: ${size}px;\n }\n\n ${GalleryImageContainer} {\n height: ${size}px;\n width: ${size}px;\n }\n\n ${GalleryImages} {\n left: -${offset * (size + 5)}px;\n }\n `}\n`\n","import {\n ProductImage, MainImage, MainImageContainer,\n Gallery, GalleryImage, GalleryImageContainer,\n Controls, GalleryImages, GalleryImagesContainer\n} from './styles'\n\nProductImage.MainImage = MainImage\nProductImage.MainImageContainer = MainImageContainer\nProductImage.Gallery = Gallery\nProductImage.GalleryImage = GalleryImage\nProductImage.GalleryImageContainer = GalleryImageContainer\nProductImage.Controls = Controls\nProductImage.GalleryImages = GalleryImages\nProductImage.GalleryImagesContainer = GalleryImagesContainer\n\nexport default ProductImage\n","import styled from 'styled-components'\nimport { color, size } from 'ui/themes/utils'\n\nimport ReactInputPosition from 'react-input-position'\n\nexport const ImageMagnify = styled(ReactInputPosition)`\n &&& {\n position: relative;\n overflow: hidden;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n z-index: 10;\n background-color: ${color('white')};\n }\n`\n\nexport const ImageContainer = styled.div`\n &&& {\n display: inline-block;\n\n padding: 2px;\n padding-bottom: 0;\n\n border: ${size('borderWidth')} solid ${color('Misc/Divider')};\n\n z-index: 10;\n background-color: ${color('white')};\n }\n`\n\nexport const Image = styled.img`\n &&& {\n margin-bottom: -2px;\n }\n`\n\nexport const Portal = styled.div`\n &&& {\n width: 100%;\n height: 100%;\n\n position: relative;\n overflow: hidden;\n\n background-image: url(${({ image }) => image});\n background-repeat: no-repeat;\n background-size: cover;\n\n z-index: 1024;\n\n transform: ${({ scale }) => `scale(${scale})`};\n }\n`\n\nexport const PortalContainer = styled.div`\n width: ${({ width }) => width}px;\n height: ${({ height }) => height}px;\n\n overflow: hidden;\n`\n\nexport const MagnifyContainer = styled.div`\n position: absolute;\n top: 30px;\n left: 310px;\n\n background-color: ${color('white')};\n box-shadow: ${size('shadow', 'md')};\n`\n","import { ImageMagnify, ImageContainer, Image, Portal, PortalContainer, MagnifyContainer } from './styles'\n\nImageMagnify.ImageContainer = ImageContainer\nImageMagnify.Image = Image\nImageMagnify.Portal = Portal\nImageMagnify.PortalContainer = PortalContainer\nImageMagnify.MagnifyContainer = MagnifyContainer\n\nexport default ImageMagnify\n","// React\nimport React, { Fragment, useState, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport PropTypes from 'prop-types'\n\nimport BImageMagnify from 'store/modules/product/blocks/ImageMagnify'\n\nimport { interpolateNumber } from 'd3-interpolate'\n\nconst ImageRenderer = (props) => {\n const originalRef = useRef(null)\n\n const [originalDimensions, setOriginalDimensions] = useState(null)\n\n const handleOriginalLoad = ({ target: img }) => {\n setOriginalDimensions({ height: img.offsetHeight, width: img.offsetWidth })\n }\n\n const calculatePosition = (x, y) => {\n const offset = 50 * props.scale\n\n if (!originalRef || !originalRef.current) return '0 0'\n\n const box = originalRef.current.getBoundingClientRect()\n const { width, height } = box\n\n const lo = (x / width) * 100\n const wo = (y / height) * 100\n\n const rx = `calc(${lo}% + ${interpolateNumber(offset, -offset)(lo / 100)}px)`\n const ry = `calc(${wo}% + ${interpolateNumber(offset, -offset)(wo / 100)}px)`\n\n return `${rx} ${ry}`\n }\n\n const imageIsVertical = originalDimensions && originalDimensions.height > (props.size || props.height)\n\n return (\n <Fragment>\n <BImageMagnify.ImageContainer>\n <BImageMagnify.Image\n src={props.originalImage}\n alt={props.imageAlt}\n width={imageIsVertical ? 'auto' : props.size - 6 || props.width - 6}\n height={imageIsVertical ? props.size - 6 || props.height - 6 : 'auto'}\n ref={originalRef}\n onLoad={handleOriginalLoad}\n />\n </BImageMagnify.ImageContainer>\n {originalRef?.current &&\n createPortal(\n <BImageMagnify.PortalContainer width={props.zoomedSize || props.zoomedWidth || props.elementDimensions.width} height={props.zoomedSize || props.zoomedHeight || props.elementDimensions.height}>\n <BImageMagnify.Portal\n image={props.zoomedImage || props.originalImage}\n scale={props.scale || 1.2}\n style={{\n backgroundPosition: calculatePosition(props.activePosition.x, props.activePosition.y)\n }}\n />\n </BImageMagnify.PortalContainer>,\n props.portalTarget || document.body\n )}\n </Fragment>\n )\n}\n\nImageRenderer.propTypes = {\n originalImage: PropTypes.string.isRequired,\n zoomedImage: PropTypes.string,\n imageAlt: PropTypes.string,\n size: PropTypes.number,\n width: PropTypes.number,\n height: PropTypes.number,\n zoomedSize: PropTypes.number,\n zoomedWidth: PropTypes.number,\n zoomedHeight: PropTypes.number,\n elementDimensions: PropTypes.object,\n portalTarget: PropTypes.any,\n activePosition: PropTypes.object,\n scale: PropTypes.number\n}\n\nexport default ImageRenderer\n","// React\nimport React from 'react'\n\n// Libraries\nimport {\n MOUSE_ACTIVATION\n} from 'react-input-position'\n\n// Components\nimport BImageMagnify from 'store/modules/product/blocks/ImageMagnify'\nimport ImageRenderer from './ImageRenderer'\n\nconst ImageMagnify = (props) => {\n return (\n <BImageMagnify\n mouseActivationMethod={MOUSE_ACTIVATION.HOVER}\n cursorStyle=\"zoom-in\"\n cursorStyleActive=\"crosshair\"\n >\n <ImageRenderer {...props} />\n </BImageMagnify>\n )\n}\n\nexport default ImageMagnify\n","import styled, { css } from 'styled-components'\nimport { color, size } from 'ui/themes/utils'\n\nexport const ModalGallery = styled.div`\n position: fixed;\n\n top: 0;\n left: 0;\n\n background-color: ${color('white')};\n\n width: 100vw;\n height: 100vh;\n\n z-index: 99999;\n`\n\nexport const Title = styled.h3`\n text-align: center;\n\n padding: ${size('padding', 'sm')} 0;\n\n line-height: 25px;\n\n width: 75%;\n margin: 0 auto;\n\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`\n\nexport const Wrapper = styled.div`\n display: flex;\n flex-flow: column nowrap;\n\n position: relative;\n\n height: 100%;\n`\n\nexport const ControlWrapper = styled.div`\n display: inline-block;\n\n padding: ${size('padding', 'sm')};\n\n background-color: ${color('white')}80;\n`\n\nexport const Header = styled.div`\n z-index: 1;\n\n ${ControlWrapper} {\n position: absolute;\n top: 0;\n left: 0;\n }\n`\n\nexport const Body = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n padding: ${size('padding', 'sm')};\n\n height: calc(100% - 125px);\n\n position: relative;\n`\n\nexport const Footer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n position: absolute;\n bottom: 0;\n left: 0;\n\n width: 100%;\n\n padding-bottom: ${size('padding', 'sm')};\n`\n\nexport const Controls = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n position: absolute;\n top: 50%;\n left: 0;\n\n width: 100%;\n\n transform: translateY(-50%);\n`\n\nexport const GalleryImages = styled.div`\n position: absolute;\n\n left: ${({ offset }) => offset || 0};\n top: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n transition: left 0.3s ease-in-out;\n`\n\nexport const GalleryImagesContainer = styled.div`\n position: relative;\n overflow: hidden;\n`\n\nexport const Image = styled.img`\n width: ${({ width }) => width};\n height: ${({ height }) => height};\n max-height: 400px;\n\n @media (orientation: landscape) {\n height: 100%;\n width: auto;\n }\n`\n\nexport const GalleryImageContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n margin-left: ${size('margin', 'xs')} !important;\n\n overflow: hidden;\n\n border: ${size('borderWidth')} solid transparent !important;\n\n &:hover {\n border-color: ${({ brandingColor }) => brandingColor};\n cursor: pointer;\n }\n\n ${({ selected }) =>\n selected &&\n css`\n border-color: ${({ brandingColor }) => brandingColor} !important;\n `}\n`\n\nexport const Gallery = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n ${({ size, offset }) => css`\n ${GalleryImagesContainer} {\n /* 5 = gap between images */\n width: ${(size + 5) * 3 + 5}px;\n height: ${size}px;\n }\n\n ${GalleryImageContainer} {\n height: ${size}px;\n width: ${size}px;\n }\n\n ${GalleryImages} {\n left: -${offset * (size * 0.85)}px;\n }\n `}\n`\n","import {\n ModalGallery,\n Wrapper,\n Body,\n Header,\n ControlWrapper,\n Controls,\n Footer,\n Gallery,\n GalleryImageContainer,\n GalleryImagesContainer,\n GalleryImages,\n Title,\n Image\n} from './styles'\n\nModalGallery.Wrapper = Wrapper\nModalGallery.Body = Body\nModalGallery.Header = Header\nModalGallery.ControlWrapper = ControlWrapper\nModalGallery.Controls = Controls\nModalGallery.Footer = Footer\nModalGallery.Gallery = Gallery\nModalGallery.GalleryImageContainer = GalleryImageContainer\nModalGallery.GalleryImagesContainer = GalleryImagesContainer\nModalGallery.GalleryImages = GalleryImages\nModalGallery.Title = Title\nModalGallery.Image = Image\n\nexport default ModalGallery\n","// React\nimport React, { useState, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\n// Libraries\nimport _get from 'lodash/get'\n\n// Components\nimport BModalGallery from 'store/modules/product/blocks/ModalGallery'\nimport Icon from 'ui/components/Icon'\nimport FocalImage from 'ui/components/FocalImage'\n\nconst THUMBNAIL_SIZE = 60\n\nconst ModalGallery = (props) => {\n const [swipe, setSwipe] = useState({})\n const [swiping, setSwiping] = useState(false)\n const [galleryOffset, setGalleryOffset] = useState(0)\n const [dimensions, setDimensions] = useState(null)\n\n useEffect(() => {\n const photoIndex = props.photos.indexOf(props.selectedPhoto)\n\n if (photoIndex <= -1) {\n setGalleryOffset(0)\n } else {\n setGalleryOffset(Math.min(photoIndex, getMaximumOffset()))\n }\n }, [props.selectedPhoto])\n\n const onTouchStart = (e) => {\n const touch = e.touches[0]\n\n setSwipe({ x: touch.clientX })\n }\n\n const onTouchMove = (e) => {\n if (e.changedTouches && e.changedTouches.length) {\n setSwiping(true)\n }\n }\n\n const onTouchEnd = (e) => {\n const touch = e.changedTouches[0]\n const x = touch.clientX - swipe.x\n\n if (swiping && x > 50) {\n props.handlePhotoSelect && props.handlePhotoSelect(-1)\n } else if (swiping && x < 50) {\n props.handlePhotoSelect && props.handlePhotoSelect(1)\n }\n\n setSwiping(false)\n }\n\n const onImageLoad = ({ target: img }) => {\n setDimensions({ height: img.offsetHeight, width: img.offsetWidth })\n }\n\n const getMaximumOffset = () => {\n return Math.max(props.photos.length - 1, 0)\n }\n\n const handleImagesForward = () => {\n if (galleryOffset + 1 > getMaximumOffset()) return null\n\n setGalleryOffset(galleryOffset + 1)\n }\n\n const handleImagesBackward = () => {\n if (galleryOffset - 1 < 0) return null\n\n setGalleryOffset(galleryOffset - 1)\n }\n\n const showGallery = props.photos.length > 0\n const showControls = props.photos.length > 1\n\n const imageIsVertical = dimensions && (dimensions.height / dimensions.width) > 1\n\n return createPortal(\n <BModalGallery>\n <BModalGallery.Wrapper>\n <BModalGallery.Header>\n <BModalGallery.ControlWrapper onTouchEnd={props.onClose}>\n <Icon icon=\"arrow-left\" />\n </BModalGallery.ControlWrapper>\n <BModalGallery.Title>{props.itemTitle}</BModalGallery.Title>\n </BModalGallery.Header>\n <BModalGallery.Body\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n >\n <BModalGallery.Image\n src={props.selectedPhoto.large_url}\n onLoad={onImageLoad}\n width={imageIsVertical ? 'auto' : '100%'}\n height={imageIsVertical ? '100%' : 'auto'}\n />\n {showControls && (\n <BModalGallery.Controls>\n <BModalGallery.ControlWrapper\n onTouchStart={() => {\n props.handlePhotoSelect(-1)\n handleImagesBackward()\n }}\n >\n <Icon icon=\"chevron-left\" />\n </BModalGallery.ControlWrapper>\n <BModalGallery.ControlWrapper\n onTouchStart={() => {\n props.handlePhotoSelect(1)\n handleImagesForward()\n }}\n >\n <Icon icon=\"chevron-right\" />\n </BModalGallery.ControlWrapper>\n </BModalGallery.Controls>\n )}\n </BModalGallery.Body>\n <BModalGallery.Footer>\n {showGallery && (\n <BModalGallery.Gallery size={THUMBNAIL_SIZE} offset={galleryOffset}>\n <BModalGallery.GalleryImagesContainer>\n <BModalGallery.GalleryImages>\n {props.photos.map((photo) => (\n <BModalGallery.GalleryImageContainer\n key={photo.id}\n selected={\n props.selectedPhoto &&\n props.selectedPhoto.id === photo.id\n }\n brandingColor={props.brandingColor}\n onTouchEnd={() => props.onThumbnailPress(photo)}\n >\n <FocalImage\n url={photo.large_url}\n preview={_get(photo, 'preview')}\n coordinates={photo.coordinates}\n size={`${THUMBNAIL_SIZE}px`}\n noBorder\n noBorderRadius\n />\n </BModalGallery.GalleryImageContainer>\n ))}\n </BModalGallery.GalleryImages>\n </BModalGallery.GalleryImagesContainer>\n </BModalGallery.Gallery>\n )}\n </BModalGallery.Footer>\n </BModalGallery.Wrapper>\n </BModalGallery>,\n document.body\n )\n}\n\nexport default ModalGallery\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport _get from 'lodash/get'\nimport _find from 'lodash/find'\nimport _findIndex from 'lodash/findIndex'\n\n// Components\nimport FocalImage from 'ui/components/FocalImage'\nimport Icon from 'ui/components/Icon'\nimport BProductImage from 'store/modules/product/blocks/ProductImage'\nimport ImageMagnify from 'store/modules/product/components/ImageMagnify'\nimport ModalGallery from 'store/modules/product/components/ModalGallery'\n\n// Shared\nimport useIsMobile from 'shared/utils/useIsMobile'\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\n\nconst THUMBNAIL_SIZE = 60\n\nexport class ProductImage extends Component {\n static displayName = 'ProductImage'\n\n static propTypes = {\n defaultPhoto: PropTypes.object,\n // Show this photo\n photoId: PropTypes.string,\n brandingColor: PropTypes.string,\n portalTarget: PropTypes.instanceOf(Element),\n itemTitle: PropTypes.any,\n alt: PropTypes.string,\n isMobile: PropTypes.bool\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n selectedPhoto: null,\n galleryOffset: 0,\n magnify: false,\n showGallery: false,\n hideFocalImages: false\n }\n }\n\n componentDidMount = () => {\n this.componentDidUpdate({})\n }\n\n componentDidUpdate = (prevProps) => {\n const { defaultPhoto, photoId } = this.props\n\n if (photoId !== prevProps.photoId) {\n let newSelectedPhoto\n\n if (photoId) {\n newSelectedPhoto = _find([defaultPhoto, ...this.photos], { id: photoId })\n } else {\n newSelectedPhoto = defaultPhoto\n }\n\n const newState = { selectedPhoto: newSelectedPhoto }\n\n // Makes sure we update the gallery offset if needed\n const photoIndex = this.photos.indexOf(newSelectedPhoto)\n\n if (photoIndex <= -1) {\n newState.galleryOffset = 0\n } else {\n newState.galleryOffset = Math.min(photoIndex, this.maximumOffset)\n }\n\n this.setState(newState)\n }\n }\n\n get maximumOffset () {\n // Displaying 3 images at a time the default product group\n // image + 2 album_photos so maximumOffset is how many images\n // over these 3\n return Math.max(this.photos.length - 2, 0)\n }\n\n get photos () {\n return _get(this.props, 'albumPhotos', [])\n }\n\n handleChangeImage = (photo) => {\n this.setState({ selectedPhoto: photo, magnify: false, hideFocalImages: false })\n }\n\n handleImagesForward = () => {\n const { galleryOffset } = this.state\n\n if (galleryOffset + 1 > this.maximumOffset) return null\n\n this.setState({ galleryOffset: galleryOffset + 1 })\n }\n\n handleImagesBackward = () => {\n const { galleryOffset } = this.state\n\n if (galleryOffset - 1 < 0) return null\n\n this.setState({ galleryOffset: galleryOffset - 1 })\n }\n\n handleClick = () => {\n const { magnify, hideFocalImages } = this.state\n const { defaultPhoto } = this.props\n\n const canMagnify = [defaultPhoto, ...this.photos][0] !== undefined\n\n if (canMagnify) {\n this.setState({ magnify: !magnify, hideFocalImages: !hideFocalImages })\n }\n }\n\n handleTouch = () => {\n const { defaultPhoto } = this.props\n\n const canMagnify = [defaultPhoto, ...this.photos][0] !== undefined\n\n if (canMagnify) {\n this.setState({ showGallery: true })\n }\n }\n\n handleGalleryClose = (e) => {\n e.preventDefault()\n\n this.setState({ showGallery: false })\n }\n\n handleThumbnailPress = (selectedPhoto) => {\n this.setState({ selectedPhoto })\n }\n\n handlePhotoSelect = (direction) => {\n const { selectedPhoto } = this.state\n const { defaultPhoto } = this.props\n\n const photosArray = [defaultPhoto, ...this.photos]\n\n const selectedPhotoURL = (selectedPhoto && selectedPhoto.large_url) || (defaultPhoto && defaultPhoto.large_url)\n\n const currentIndex = _findIndex(photosArray, { large_url: selectedPhotoURL })\n\n if (direction === -1 && currentIndex === 0) return\n\n if (direction === 1 && currentIndex === photosArray.length - 1) return\n\n const newSelectedPhoto = photosArray[currentIndex + direction]\n\n this.setState({ selectedPhoto: newSelectedPhoto })\n }\n\n render () {\n const { selectedPhoto, galleryOffset, magnify, showGallery: showMobileGallery, hideFocalImages } = this.state\n const { defaultPhoto, brandingColor, portalTarget, itemTitle, alt, isMobile } = this.props\n\n const selectedPhotoURL = (selectedPhoto && selectedPhoto.large_url) || (defaultPhoto && defaultPhoto.large_url)\n const selectedLargePhotoURL = (selectedPhoto && selectedPhoto.xlarge_url) || (defaultPhoto && defaultPhoto.xlarge_url)\n\n const showGallery = this.photos.length > 0\n const showControls = this.photos.length > 2\n\n const canMagnify = [defaultPhoto, ...this.photos][0] !== undefined\n\n return (\n <BProductImage>\n <BProductImage.MainImageContainer\n data-tid=\"Main image\"\n onClick={isMobile ? this.handleTouch : this.handleClick}\n magnify={magnify}\n canMagnify={canMagnify}\n >\n {[defaultPhoto, ...this.photos].map((photo, index) => (\n <BProductImage.MainImage visible={!hideFocalImages && selectedPhotoURL === photo?.large_url} key={photo?.id || `no_photo_${index}`}>\n <FocalImage\n url={photo?.large_url || NO_PRODUCT_IMAGE}\n preview={photo?.preview}\n coordinates={photo?.coordinates || { x: 0, y: 0 }}\n size=\"100%\"\n alt={alt}\n noBorder\n noBorderRadius\n />\n </BProductImage.MainImage>\n ))}\n {canMagnify && magnify && !isMobile && (\n <ImageMagnify\n originalImage={selectedPhotoURL}\n zoomedImage={selectedLargePhotoURL}\n portalTarget={portalTarget}\n size={250}\n zoomedSize={350}\n scale={2}\n />\n )}\n {showMobileGallery && isMobile && (\n <ModalGallery\n selectedPhoto={selectedPhoto || defaultPhoto}\n photos={[defaultPhoto, ...this.photos]}\n onClose={this.handleGalleryClose}\n handlePhotoSelect={this.handlePhotoSelect}\n brandingColor={brandingColor}\n itemTitle={itemTitle}\n onThumbnailPress={this.handleThumbnailPress}\n />\n )}\n </BProductImage.MainImageContainer>\n {showGallery && (\n <BProductImage.Gallery size={THUMBNAIL_SIZE} offset={galleryOffset}>\n {showControls && (\n <BProductImage.Controls onClick={this.handleImagesBackward} disabled={galleryOffset <= 0}>\n <Icon icon=\"chevron-left\" />\n </BProductImage.Controls>\n )}\n <BProductImage.GalleryImagesContainer>\n <BProductImage.GalleryImages data-tid=\"Product image gallery\">\n {[defaultPhoto, ...this.photos].map((photo) => (\n <BProductImage.GalleryImageContainer\n key={photo.id}\n onClick={this.handleChangeImage.bind(null, photo)}\n selected={selectedPhoto && selectedPhoto.id === photo.id}\n brandingColor={brandingColor}\n >\n <FocalImage\n url={photo.large_url}\n preview={_get(photo, 'preview')}\n coordinates={photo.coordinates}\n size={`${THUMBNAIL_SIZE}px`}\n noBorder\n noBorderRadius\n />\n </BProductImage.GalleryImageContainer>\n ))}\n </BProductImage.GalleryImages>\n </BProductImage.GalleryImagesContainer>\n {showControls && (\n <BProductImage.Controls onClick={this.handleImagesForward} disabled={galleryOffset >= this.maximumOffset}>\n <Icon icon=\"chevron-right\" />\n </BProductImage.Controls>\n )}\n </BProductImage.Gallery>\n )}\n </BProductImage>\n )\n }\n}\n\nconst ProductImageWrapper = (props) => {\n const isMobile = useIsMobile()\n\n return <ProductImage {...props} isMobile={isMobile} />\n}\n\nconst mapStateToProps = (state, props) => {\n const photos = state.orm.photos\n .getAll({ owner_id: props.ownerId })\n .sort('position')\n .toArray()\n\n const defaultPhoto = photos && photos[0]\n const albumPhotos = photos && photos.slice(1)\n\n return {\n brandingColor: state.settings.get('store.brand_color'),\n defaultPhoto,\n albumPhotos\n }\n}\n\nexport default reduxConnect(mapStateToProps)(ProductImageWrapper)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport uiConnect from 'shared/redux/interface'\nimport { compose } from 'redux'\n\n// Libraries\n\n// Components\nimport ProductButton from 'store/modules/product/components/ProductButton'\nimport ProductImage from 'store/modules/product/components/ProductImage'\nimport BImageMagnify from 'store/modules/product/blocks/ImageMagnify'\n\n// Shared\nimport { triggerUserFrameworkViewProductEvent } from 'shared/utils/userFrameworkEvents'\nimport productSelectors from 'store/v2/redux/selectors/product'\nimport BundleActions from 'store/v2/redux/actions/bundle'\nimport ProductGroupActions from 'store/v2/redux/actions/product_group'\n\nclass ProductDetail extends Component {\n static displayName = 'ProductDetail'\n\n static propTypes = {\n onChangeProductId: PropTypes.func,\n item: PropTypes.object,\n product: PropTypes.object,\n bundleItems: PropTypes.any,\n selectedProductId: PropTypes.string,\n ui: PropTypes.object,\n cart: PropTypes.object\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n triggeredTracking: false,\n hovered: false,\n loading: false\n }\n }\n\n componentDidUpdate = (prevProps) => {\n const { product, bundleItems } = this.props\n\n // On mount window.Booqable.data is not set yet. By keeping track of whether this is triggered,\n // we can use the data in reporting events. In this event we also include Bundle data.\n if (product && !this.state.triggeredTracking) {\n const isBundle = product.type === 'Bundle'\n\n if (isBundle && !bundleItems) return\n\n this.setState({ triggeredTracking: true })\n\n triggerUserFrameworkViewProductEvent(product, isBundle && bundleItems)\n }\n\n if (this.props.ui?.selectedProductId && this.props.ui?.selectedProductId !== prevProps.ui?.selectedProductId) {\n triggerUserFrameworkViewProductEvent(product)\n }\n }\n\n componentDidMount = () => {\n const { product, item } = this.props\n const productDataFresh =\n product?.price_each_in_cents === item?.price_each_in_cents &&\n product?.charge_label === item?.charge_label &&\n product?.available_quantity === item?.available_quantity\n\n if (productDataFresh || window.bqFetchingDetailProducts) return\n\n this.fetchData()\n }\n\n fetchData = () => {\n const { item, cart } = this.props\n\n this.setState({ loading: true })\n\n const callback = () => this.setState({ loading: false })\n\n if (item.type === 'ProductGroup') {\n return ProductGroupActions.fetchAll({\n ids: [item.id],\n cart_id: cart && cart.id,\n include: 'photos,products',\n apiVersion: 3\n }).then(callback)\n } else if (item.type === 'Bundle') {\n return BundleActions.fetchAll({\n ids: [item.id],\n cart_id: cart && cart.id,\n include: [\n 'photos', 'bundle_items', 'bundle_items.product', 'bundle_items.product.photo',\n 'bundle_items.product_group', 'bundle_items.product_group.products',\n 'bundle_items.product_group.photo', 'bundle_items.product_group.products',\n 'bundle_items.product_group.products.photo'\n ].join(','),\n apiVersion: 3\n }).then(callback)\n }\n }\n\n render = () => {\n const { item } = this.props\n const { loading } = this.state\n\n return (\n <div className=\"booqable-product-detail-wrapper\" data-tid=\"Product detail\">\n <ProductImage alt={this.props.product?.name} ownerId={item.id} itemTitle={item.name || null} photoId={this.props.product && this.props.product.photo_id} portalTarget={this.magnifyRef || null} />\n <div className=\"bq-content\">\n <h3 className=\"bq-product-name\">\n {item && item.name}\n </h3>\n {item &&\n (\n <ProductButton\n uiKey={item.id}\n item={item}\n onChangeProductId={this.props.onChangeProductId}\n loading={loading}\n />\n )}\n {item && item.description &&\n <div className=\"bq-product-description rx-reset rx-content\" dangerouslySetInnerHTML={{ __html: item.description }} />}\n <BImageMagnify.MagnifyContainer ref={(ref) => this.magnifyRef = ref} />\n </div>\n </div>\n )\n }\n}\n\nconst uiToProps = {\n state: {\n selectedProductId: null\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const item = props.item || state.orm.items.getById(props.itemId)\n const selectedProduct = productSelectors.selectedForProductGroup(\n state.orm.products.sort('sorting_weight'),\n props.ui != null ? props.ui.selectedProductId : undefined,\n item.id\n )\n const bundle = item.type === 'Bundle' && state.orm.bundles.getById(item.id)\n const bundleItems = bundle && state.orm.bundle_items.getById(bundle.bundle_items)\n\n return {\n item,\n translations: state.client.get('translations').toJS(),\n product: selectedProduct,\n cart: state.orm.carts.getById(state.client.cartId),\n bundle,\n bundleItems\n }\n}\n\nconst mapDispatchToProp = (_, props) => {\n return {\n onChangeProductId (id) {\n return props.updateUI({ selectedProductId: id })\n }\n }\n}\n\nexport default compose(\n uiConnect('ProductDetail', uiToProps),\n reduxConnect(mapStateToProps, mapDispatchToProp)\n)(ProductDetail)\n","import React from 'react'\nimport { Provider } from 'react-redux'\n\nimport IdFinder from '../id_finder'\nimport ProductDetail from '../components/product_detail'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class Detail extends React.Component {\n static displayName = 'ProductDetailContainer'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component booqable-component-product-detail\" style={{ display: 'none' }}>\n <IdFinder {...Object.assign({}, this.props)} hideOnLoad>\n <ProductDetail />\n </IdFinder>\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport uiConnect from 'shared/redux/interface'\nimport { connect as reduxConnect, Provider } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport ProductDetail from '../components/product_detail'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nclass QuickviewInner extends React.Component {\n static displayName = 'QuickviewInner'\n\n static propTypes = {\n item: PropTypes.any,\n itemId: PropTypes.string,\n closeWrapper: PropTypes.func,\n close: PropTypes.func\n }\n\n render () {\n const { itemId, item, closeWrapper, close } = this.props\n\n return (\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <div\n id=\"booqable-quickview-wrapper\"\n className={item ? 'open' : 'closed'}\n key={`booqable-quickview-${item?.id}`}\n onClick={closeWrapper}\n >\n <div id=\"booqable-quickview-inner\">\n <button className=\"bq-close\" onClick={close}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </button>\n {itemId && <ProductDetail uiKey={itemId} itemId={itemId} />}\n </div>\n </div>\n </div>\n )\n }\n}\n\nconst uiToProps = {\n state: {\n itemId: null\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const itemId = props.ui.itemId\n\n return {\n itemId,\n item: state.orm.items.getById(itemId)\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n const close = () => props.updateUI({ itemId: null })\n\n return {\n closeWrapper: (e) => {\n if (e.target.id === 'booqable-quickview-wrapper') {\n return close()\n }\n },\n close\n }\n}\n\nconst QuickviewInnerComposed = compose(\n uiConnect('Quickview', uiToProps),\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(QuickviewInner)\n\nexport default class Quickview extends React.Component {\n static displayName = 'Quickview'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <QuickviewInnerComposed uiKey=\"\" />\n </Themed>\n </Provider>\n )\n }\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Provider } from 'react-redux'\nimport ProductSearch from '../components/product_search'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class ProductSearchContainer extends React.Component {\n static displayName = 'ProductSearchContainer'\n\n static propTypes = {\n searchKey: PropTypes.string\n }\n\n render = () => {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <ProductSearch {...this.props} filterKey={this.props.searchKey} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","import styled, { css } from 'styled-components'\n\nimport { transparentize } from 'ui/themes/utils'\n\nimport BPeriod from '../../blocks/Period'\n\nexport const DateTimeContainer = styled.div`\n &:first-child {\n border-radius: 3px 3px 0 3px;\n }\n\n &:nth-child(2) {\n border-radius: 3px 3px 3px 0;\n }\n\n ${(props) => props.disabled || (props.active ?\n css`\n margin-bottom: -2px !important;\n\n border-bottom: 2px solid !important;\n ${(props) => props.brandingColor ? `border-color: ${props.brandingColor} !important` : ''};\n ` :\n css`\n &:hover {\n margin-bottom: -2px !important;\n\n border-bottom: 2px solid !important;\n\n ${(props) => props.brandingColor ? `border-color: ${transparentize(props.brandingColor, 0.5)} !important` : ''};\n }\n `)}\n`\n\nexport const Container = styled.div`\n position: relative;\n\n display: flex;\n\n ${(props) => props.useAMPM ? 'min-width: 330px' : 'min-width: 270px'};\n\n width: 100%;\n min-height: 50px;\n\n background: #FFFFFF;\n\n border: 1px solid #E9EBED !important;\n border-radius: 3px;\n\n ${DateTimeContainer} {\n width: 100%;\n\n &:first-of-type ${BPeriod.Detail} {\n border-right: 1px solid #E9EBED !important;\n }\n\n ${BPeriod.Detail} {\n display: flex;\n flex-flow: column nowrap;\n justify-content: center;\n\n padding: 10px;\n\n width: 100%;\n height: 100%;\n\n cursor: pointer;\n }\n }\n\n @media screen and (max-width: 320px) {\n display: block;\n min-width: 100%;\n\n ${DateTimeContainer} {\n &:first-child {\n border-bottom: 1px solid #E9EBED !important;\n }\n }\n}\n`\n\nexport const Label = styled.div`\n margin: 4px 0 !important;\n\n font-weight: 500 !important;\n`\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\nimport { ModalCartPicker } from 'store/modules/cart/CartPicker/Modal'\nimport BPeriod from '../../blocks/Period'\n\n// Shared\nimport Format from 'shared/utils/format'\nimport quickviewActions from 'store/v2/redux/actions/quickview'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport ClientActions from 'store/v2/redux/actions/client'\nimport ItemActions from 'store/v2/redux/actions/item'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport { isLocationInputEnabled } from 'ui/components/Picker/utils'\nimport useIsMobile from 'shared/utils/useIsMobile'\n\n// Styles\nimport { Container, DateTimeContainer } from './Base.styles'\n\nexport class SeparateDatePicker extends Component {\n constructor (props) {\n super(props)\n\n this.state = {\n modalOpen: false,\n loading: false\n }\n }\n\n static displayName = 'SeparateDatePicker'\n\n static propTypes = {\n periodType: PropTypes.string,\n useAMOrPM: PropTypes.bool,\n locations: PropTypes.object,\n cart: PropTypes.object,\n timeFormat: PropTypes.string,\n useTimes: PropTypes.bool,\n brandingColor: PropTypes.string,\n productId: PropTypes.string,\n item: PropTypes.object,\n isMobile: PropTypes.bool,\n title: PropTypes.string,\n t: PropTypes.func\n }\n\n componentDidMount = () => {\n const { productId } = this.props\n\n // Fetch item if id set\n if (productId) {\n this.setState({ loading: true })\n ItemActions.fetchAll({\n include: 'photo',\n apiVersion: 3,\n ids: [productId]\n }).then(() => {\n this.setState({ loading: false })\n })\n }\n }\n\n handleSave = () => {\n const { item, productId } = this.props\n\n if (!productId) return\n\n if (!item) {\n // Item not in state as we can't fetch products trough the item endpoint\n // so it's a product and should be booked\n CartActions.book({ item_id: productId, quantity: 1, apiVersion: 1 }).then(() => {\n triggerUserFrameworkBookEvent(productId, 1)\n // Implemented in PR#6092\n ClientActions.setCheckingOut()\n })\n } else {\n quickviewActions.setItem(productId)\n }\n }\n\n handleClose = () => {\n this.setState({ modalOpen: false })\n }\n\n handleOpenModal = () => {\n this.setState({ modalOpen: true })\n }\n\n handleTouch = (e) => {\n e.preventDefault()\n this.handleOpenModal()\n }\n\n render () {\n const {\n useAMOrPM,\n useTimes,\n periodType,\n brandingColor,\n cart,\n locations,\n productId,\n item,\n title,\n isMobile,\n t\n } = this.props\n\n const {\n modalOpen\n } = this.state\n\n const hasLocations = locations.size() > 1\n\n return (\n <Container\n useAMPM={useAMOrPM}\n brandingColor={brandingColor}\n >\n <DateTimeContainer\n onClick={this.handleOpenModal}\n onTouchEnd={this.handleTouch}\n brandingColor={brandingColor}\n className=\"from\"\n >\n {cart && cart.starts_at ?\n (\n <BPeriod.Detail>\n {hasLocations && isLocationInputEnabled('start') && (\n <BPeriod.Location>\n {cart && cart.start_location_id ? locations.getById(cart.start_location_id).name : null}\n </BPeriod.Location>\n )}\n <BPeriod.DateTime>\n {`${Format.date(\n cart ? cart.starts_at : undefined,\n 'MMM D[,] YYYY'\n )}${useTimes ?\n `, ${Format.date(\n cart ? cart.starts_at : undefined,\n this.props.timeFormat\n )}` :\n ''}`}\n </BPeriod.DateTime>\n </BPeriod.Detail>\n ) :\n (\n <BPeriod.Detail>\n <BPeriod.Placeholder>\n {t('user.store.start_date')}\n </BPeriod.Placeholder>\n </BPeriod.Detail>\n )}\n </DateTimeContainer>\n <DateTimeContainer\n onClick={this.handleOpenModal}\n onTouchEnd={this.handleOpenModal}\n disabled={['timeslot_fixed', 'timeslot_duration'].includes(periodType)}\n brandingColor={brandingColor}\n className=\"till\"\n >\n {cart && cart.stops_at ?\n (\n <BPeriod.Detail>\n {hasLocations && isLocationInputEnabled('stop') && (\n <BPeriod.Location>\n {cart && cart.stop_location_id ? locations.getById(cart.stop_location_id).name : null}\n </BPeriod.Location>\n )}\n <BPeriod.DateTime>\n {`${Format.date(\n cart ? cart.stops_at : undefined,\n 'MMM D[,] YYYY'\n )}${useTimes ?\n `, ${Format.date(\n cart ? cart.stops_at : undefined,\n this.props.timeFormat\n )}` :\n ''}`}\n </BPeriod.DateTime>\n </BPeriod.Detail>\n ) :\n (\n <BPeriod.Detail>\n <BPeriod.Placeholder>\n {t('user.store.stop_date')}\n </BPeriod.Placeholder>\n </BPeriod.Detail>\n )}\n </DateTimeContainer>\n <ModalCartPicker\n cart={cart}\n onSave={this.handleSave}\n open={modalOpen}\n onClose={this.handleClose}\n brandingColor={this.props.brandingColor}\n direction={isMobile ? 'vertical' : 'horizontal'}\n isMobile={isMobile}\n title={item?.name || title}\n productId={productId}\n loading={this.state.loading}\n />\n </Container>\n )\n }\n}\n\nconst FunctionalSeparateDatePicker = (props) => {\n const isMobile = useIsMobile()\n\n return <SeparateDatePicker {...props} isMobile={isMobile} />\n}\n\nconst mapStateToProps = (state, props) => {\n const useAMOrPM = state.settings.get('dates.use_am_pm')\n const useTimes = state.settings.get('store.use_times')\n const brandingColor = window.booqableOptions?.primaryColor ?? state.settings.get('store.brand_color')\n const cart = state.orm.carts.getById(state.client.cartId)\n\n let timeFormat = ''\n\n if (useTimes) {\n timeFormat = useAMOrPM ? ' hh:mm A' : ' HH:mm'\n }\n\n return {\n cart,\n useTimes,\n item: state.orm.items.getById(props.productId),\n brandingColor,\n locations: state.orm.locations.getAll().sort('name'),\n timeFormat\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(FunctionalSeparateDatePicker)\n\nexport default withTranslation('user')(reduxComponent)\n","import React from 'react'\nimport { Provider } from 'react-redux'\n\nimport SeparateDatePicker from '../components/separate_date_picker'\nimport Themed from 'store/v2/react/components/Themed'\n\nconst store = window.booqableStore\n\nexport default class SeparateDatePickerContainer extends React.Component {\n static displayName = 'SeparateDatePicker'\n\n render = () => {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <SeparateDatePicker {...this.props} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { Provider } from 'react-redux'\nimport Themed from 'store/v2/react/components/Themed'\n\nimport CollectionList from 'store/modules/product/components/CollectionList'\n\nconst store = window.booqableStore\n\nexport default class CollectionListContainer extends Component {\n static displayName = 'CollectionListContainer'\n\n static propTypes = {\n searchKey: PropTypes.string\n }\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <CollectionList {...this.props} filterKey={this.props.searchKey} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\n\n// Shared\nimport { setFilterSortBy } from 'store/v2/redux/actions/filter'\n\nexport class SortingSelect extends Component {\n static displayName = 'SortingSelect'\n\n static propTypes = {\n sortBy: PropTypes.string,\n handleChangeSortBy: PropTypes.func,\n showPrices: PropTypes.bool,\n t: PropTypes.func\n }\n\n get options () {\n const { showPrices, t } = this.props\n\n let options = [\n {\n label: t('user.store.sorting_standard'),\n value: 'null'\n }\n ]\n\n if (showPrices) {\n options.push(\n {\n label: t('user.store.sorting_price_ascending'),\n value: 'price_each_in_cents'\n },\n {\n label: t('user.store.sorting_price_descending'),\n value: '-price_each_in_cents'\n }\n )\n }\n\n options.push({\n label: t('user.store.sorting_newest'),\n value: '-created_at'\n })\n\n return options\n }\n\n render () {\n const { sortBy, handleChangeSortBy } = this.props\n\n return (\n <div className=\"select-container bq-sorting-select\">\n <select\n name=\"sort\"\n className=\"bq-sort\"\n onChange={handleChangeSortBy}\n value={sortBy}\n >\n {this.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const filter = state.filter.get(props.filterKey || 'global')\n const sortBy = (filter && filter.get('sort_by')) || undefined\n\n return {\n sortBy,\n showPrices: state.settings.get('store.use_prices')\n }\n}\n\nconst mapDispatchToProps = (_dispatch, props) => {\n return {\n handleChangeSortBy: (event) => {\n let value = event.target.value\n\n if (value === 'null') {\n value = null\n }\n\n setFilterSortBy(value, props.filterKey || 'global')\n }\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(SortingSelect)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\n\n// Shared\nimport { setFilterFilterBy } from 'store/v2/redux/actions/filter'\n\nexport class FilterSelect extends Component {\n static displayName = 'FilterSelect'\n\n static propTypes = {\n filterBy: PropTypes.string,\n handleChangeFilter: PropTypes.func,\n useAvailability: PropTypes.bool\n }\n\n get options () {\n const { useAvailability, t } = this.props\n const options = [\n {\n label: t('user.store.filter_all'),\n value: null\n }\n ]\n\n if (useAvailability) {\n options.push(\n {\n label: t('user.store.filter_available'),\n value: 'available'\n }\n )\n }\n\n return options\n }\n\n render () {\n const { filterBy, handleChangeFilter } = this.props\n\n return (\n <div className=\"select-container bq-filter-select\">\n <select\n name=\"filter\"\n className=\"bq-filter\"\n onChange={handleChangeFilter}\n value={filterBy}\n >\n {this.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const filter = state.filter.get(props.filterKey || 'global')\n const filterBy = (filter && filter.get('filter_by')) || undefined\n\n return {\n useAvailability: state.settings.get('store.use_availability'),\n filterBy\n }\n}\n\nconst mapDispatchToProps = (_dispatch, props) => {\n return {\n handleChangeFilter: (event) => {\n const value = event.target.value\n\n setFilterFilterBy(value, props.filterKey || 'global')\n }\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(FilterSelect)\n\nexport default withTranslation('user')(reduxComponent)\n\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport ProductSearch from '../components/product_search'\nimport SortingSelect from 'store/modules/product/components/SortingSelect'\nimport FilterSelect from 'store/modules/product/components/FilterSelect'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class FilterBar extends Component {\n static displayName = 'FilterBar'\n\n static propTypes = {\n filterKey: PropTypes.string,\n searchKey: PropTypes.string\n }\n\n static defaultProps = {\n filterKey: 'global'\n }\n\n render () {\n const filterKey = this.props.searchKey || this.props.filterKey\n\n // TODO: Re-enable filterselect when availability filtering perfomance is improved\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <div className=\"booqable-filter-bar\">\n <ProductSearch filterKey={filterKey} />\n <SortingSelect filterKey={filterKey} />\n {false && <FilterSelect filterKey={filterKey} />}\n </div>\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport SortingSelect from 'store/modules/product/components/SortingSelect'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class SortingSelectContainer extends Component {\n static displayName = 'SortingSelectContainer'\n\n static propTypes = {\n filterKey: PropTypes.string\n }\n\n static defaultProps = {\n filterKey: 'global'\n }\n\n render () {\n const { filterKey } = this.props\n\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <SortingSelect filterKey={filterKey} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport CartPicker from './Picker'\n\n// Shared\nimport { useCartPicker } from './hooks'\nimport { CartPickerProvider } from './Provider'\n\nconst CartPickerInner = (props) => {\n const { cart, onSave, onChange } = useCartPicker()\n\n const handleChange = (values) => {\n onChange(values)\n onSave(values)\n }\n\n return <CartPicker {...props} cart={cart} onChange={handleChange} inline={false} />\n}\n\nexport const InlineCartPicker = ({ cart, onSave, ...props }) => (\n <CartPickerProvider cart={cart} onSave={onSave}>\n <CartPickerInner {...props} />\n </CartPickerProvider>\n)\n\nInlineCartPicker.propTypes = {\n cart: PropTypes.object,\n onSave: PropTypes.func\n}\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport CollectionList from 'store/modules/product/components/CollectionList'\nimport { InlineCartPicker } from 'store/modules/cart/CartPicker/Inline'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class Sidebar extends Component {\n static displayName = 'Sidebar'\n\n static propTypes = {\n filterKey: PropTypes.string\n }\n\n static defaultProps = {\n filterKey: 'global'\n }\n\n render () {\n const { filterKey } = this.props\n\n return (\n <Provider store={store}>\n <Themed>\n <Fragment>\n <InlineCartPicker />\n <div className=\"booqable-component\">\n <CollectionList horizontalRule filterKey={filterKey} />\n </div>\n </Fragment>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport FocalImage from 'ui/components/FocalImage'\nimport ReadOnlyModeDisabledComponent from 'store/components/ReadOnlyModeDisabledComponent'\n\n// Shared\nimport Format from 'shared/utils/format'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nexport class EmbeddableCartLine extends Component {\n static displayName = 'EmbeddableCartLine'\n\n static propTypes = {\n line: PropTypes.object,\n currency: PropTypes.any,\n photo: PropTypes.object,\n useAvailability: PropTypes.bool,\n showPrices: PropTypes.bool,\n hideProductAvailabilityQuantities: PropTypes.bool,\n hasDates: PropTypes.bool,\n quantity: PropTypes.number,\n deleting: PropTypes.bool,\n onIncreaseQuantity: PropTypes.func,\n onDecreaseQuantity: PropTypes.func,\n onRemove: PropTypes.func,\n onInputChange: PropTypes.func,\n t: PropTypes.func\n }\n\n render () {\n const {\n line,\n currency,\n useAvailability,\n showPrices,\n hideProductAvailabilityQuantities,\n hasDates,\n quantity,\n deleting,\n onIncreaseQuantity,\n onDecreaseQuantity,\n onRemove,\n onInputChange,\n t\n } = this.props\n\n const available = line.available_quantity >= quantity\n const statusClass = available ? 'bq-available' : 'bq-unavailable'\n const titleClass = useAvailability ? 'bq-small' : 'bq-large'\n\n if (line.product_type === 'service' || line.quantity === 0) {\n return null\n }\n\n return (\n <tr key={line.id} className=\"bq-cart-item\">\n <td>\n <div className=\"bq-product-photo\">\n {line?.photo && (\n <div>\n <FocalImage\n size=\"40px\"\n preview={line.photo.preview}\n url={line.photo.large_url}\n coordinates={line.photo.coordinates}\n maintainAspect\n />\n </div>\n )}\n {!line?.photo && (\n <span className=\"bq-no-photo\">\n <i className=\"bq-no-photo bq-icon-image fas fa-image\" />\n </span>\n )}\n </div>\n <div className=\"bq-product-info\">\n <div className={`bq-product-name ${titleClass}`}>{line.title}</div>\n {hasDates && useAvailability && (\n <span className={`bq-status-indicator ${statusClass}`}>\n {!hideProductAvailabilityQuantities && (\n <Fragment>\n <span className=\"bq-status-quantity\">{line.available_quantity} </span>\n {t('user.store.available')}\n </Fragment>\n )}\n {hideProductAvailabilityQuantities && (\n t(available ? 'user.store.available' : 'user.store.unavailable')\n )}\n </span>\n )}\n </div>\n </td>\n <td>\n <ReadOnlyModeDisabledComponent>\n <div className={`bq-quantity ${deleting ? 'disabled' : 'enabled'}`}>\n <button className=\"bq-quantity-toggle\" onClick={onDecreaseQuantity}>\n <i className=\"far fa-minus\" />\n </button>\n <input\n type=\"number\"\n className=\"bq-quantity\"\n name=\"quantity\"\n id=\"quantity\"\n value={quantity}\n onChange={onInputChange}\n />\n <button className=\"bq-quantity-toggle\" onClick={onIncreaseQuantity}>\n <i className=\"far fa-plus\" />\n </button>\n </div>\n </ReadOnlyModeDisabledComponent>\n </td>\n <td className=\"bq-cart-total\">\n {showPrices && line.display_price_in_cents > 0 && (\n <span className=\"bq-price\">{Format.money(line.display_price_in_cents, currency)}</span>\n )}\n </td>\n <td>\n <ReadOnlyModeDisabledComponent>\n <button className=\"bq-remove-product\" onClick={deleting ? undefined : onRemove}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </button>\n </ReadOnlyModeDisabledComponent>\n </td>\n </tr>\n )\n }\n}\n\nconst mapStateToProps = (state) => ({ hideProductAvailabilityQuantities: state.settings.get('store.hide_product_availability_quantities') })\n\nconst EnhancedEmbeddableCartLine = compose(\n withTranslation('user'),\n connect(mapStateToProps)\n)(EmbeddableCartLine)\n\nexport default EnhancedEmbeddableCartLine\n","// React\nimport { Component, createElement } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\n\n// Components\n\n// Shared\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport cartActions from 'store/v2/redux/actions/cart'\n\nexport class EmbeddableCartLineContainer extends Component {\n static displayName = 'EmbeddableCartLineContainer'\n\n static propTypes = {\n book: PropTypes.func,\n line: PropTypes.object,\n component: PropTypes.any.isRequired\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n quantity: props.line.quantity,\n deleting: false\n }\n }\n\n handleBook = (quantity) => {\n if (quantity === 0) {\n this.setState({ deleting: true })\n }\n\n if (quantity === -1) {\n return\n }\n\n this.setState({ quantity })\n\n this.props.book(quantity)\n }\n\n handleIncreaseQuantity = () => {\n const { quantity } = this.state\n\n this.handleBook(quantity + 1)\n }\n\n handleDecreaseQuantity = () => {\n const { quantity } = this.state\n\n this.handleBook(quantity - 1)\n }\n\n handleRemove = () => {\n this.handleBook(0)\n }\n\n handleInputChange = ({ target }) => {\n if (target.value) {\n this.handleBook(target.value)\n }\n }\n\n render () {\n const { component, ...otherProps } = this.props\n const { quantity, deleting } = this.state\n\n return createElement(component, {\n quantity,\n deleting,\n onIncreaseQuantity: this.handleIncreaseQuantity,\n onDecreaseQuantity: this.handleDecreaseQuantity,\n onRemove: this.handleRemove,\n onInputChange: this.handleInputChange,\n ...otherProps\n })\n }\n}\n\nconst mapStateToProps = (state, props) => {\n return {\n currency: state.client.currency.toJS(),\n useAvailability: state.settings.get('store.use_availability') && props.line.tracking_type !== 'none',\n showPrices: state.settings.get('store.use_prices'),\n photo: props.line.product && state.orm.photos.getById(props.line.product.photo_id)\n }\n}\n\nconst mapDispatchToProps = (_dispatch, props) => {\n return {\n book: (quantity) => {\n return cartActions.book({\n item_id: props.line.item_id,\n line_id: props.line.id,\n quantity,\n type: 'set',\n apiVersion: 1\n }).then((_response) => {\n const quantityChange = quantity - props.line.quantity\n\n triggerUserFrameworkBookEvent(props.line.item_id, quantityChange)\n })\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(EmbeddableCartLineContainer)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\nimport LineContainer from './LineContainer'\n\n// Shared\n\nexport class EmbeddableCartLinesContainer extends Component {\n static displayName = 'EmbeddableCartLinesContainer'\n\n static propTypes = {\n lines: PropTypes.object,\n hasDates: PropTypes.bool,\n component: PropTypes.any\n }\n\n render () {\n const { lines, hasDates, component, t } = this.props\n\n if (lines.size() <= 0) {\n return <div className=\"bq-clean\">{t('user.store.cart_empty')}</div>\n }\n\n return lines.map((line) => <LineContainer component={component} key={line.id} line={line} hasDates={hasDates} />)\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const hasDates = !!(cart && cart.starts_at && cart.stops_at)\n const lines = state.orm.lines.getAll({ id: cart != null ? cart.lines : undefined })\n\n return {\n lines,\n hasDates\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(EmbeddableCartLinesContainer)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Component\nimport Line from './Line'\nimport LinesContainer from './LinesContainer'\n\nexport class EmbeddableCartLines extends Component {\n static displayName = 'EmbeddableCartLines'\n\n static propTypes = {\n lines: PropTypes.object,\n usePrices: PropTypes.bool,\n t: PropTypes.func\n }\n\n render () {\n const { lines, usePrices, t } = this.props\n\n return (\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <div className=\"bq-cart-items\">\n {lines.size() > 0 && (\n <table>\n <thead>\n <tr>\n <td>{t('user.store.product')}</td>\n <td>{t('user.store.quantity')}</td>\n {usePrices && <td className=\"bq-cart-totals\">{t('user.cart.total')}</td>}\n <td />\n </tr>\n </thead>\n <tbody>\n <LinesContainer component={Line} />\n </tbody>\n </table>\n )}\n {lines.size() <= 0 &&\n <div className=\"bq-clean\">{t('user.store.cart_empty')}</div>}\n </div>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const lines = state.orm.lines.getAll({ id: cart != null ? cart.lines : undefined })\n const usePrices = state.settings.get('store.use_prices')\n\n return { lines, usePrices }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(EmbeddableCartLines)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nexport class EmbeddableCartErrors extends Component {\n static displayName = 'EmbeddableCartErrors'\n\n static propTypes = {\n hasDates: PropTypes.bool,\n cannotCheckout: PropTypes.bool,\n t: PropTypes.func\n }\n\n render () {\n const { hasDates, cannotCheckout, t } = this.props\n\n let errorText\n\n if (hasDates && cannotCheckout) {\n errorText = t('user.store.not_all_products_available')\n }\n\n if (!hasDates) {\n errorText = t('user.store.select_a_period', 'Select a rental period')\n }\n\n if (!errorText) return null\n\n return (\n <div className=\"bq-cart-error\">\n <i className=\"fas fa-exclamation-triangle\" />\n <span>{errorText}</span>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const hasDates = !!(cart && cart.starts_at && cart.stops_at)\n const useAvailability = state.settings.get('store.use_availability')\n\n let cannotCheckout\n\n // Check if we need to calculate if use can checkout\n if (useAvailability) {\n cannotCheckout =\n state.orm.lines\n .getAll({\n id: cart != null ? cart.lines : undefined,\n can_checkout: false\n })\n .size() > 0\n } else {\n cannotCheckout = false\n }\n\n return {\n hasDates,\n cannotCheckout\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(EmbeddableCartErrors)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Components\n\n// Shared\nimport Format from 'shared/utils/format'\n\nexport class EmbeddableCartTotals extends Component {\n static displayName = 'EmbeddableCartTotals'\n\n static propTypes = {\n cart: PropTypes.object,\n currency: PropTypes.any,\n totalPriceAttribute: PropTypes.string,\n t: PropTypes.func\n }\n\n render () {\n const { cart, currency, totalPriceAttribute, t } = this.props\n\n if (!cart || cart.lines.length < 1) return null\n\n return (\n <div className=\"bq-totals\">\n <div className=\"bq-detail bq-strong\">\n <span>{t('user.store.subtotal')}</span>\n <span className=\"bq-amount\">\n {Format.money(\n cart != null ? cart.get(totalPriceAttribute) : undefined,\n currency\n )}\n </span>\n </div>\n\n {(cart != null && cart.get('deposit_in_cents') !== 0) && (\n <div className=\"bq-detail\">\n <span>{t('user.store.security_deposit')}</span>\n <span className=\"bq-amount\">\n {Format.money(\n cart != null ? cart.get('deposit_in_cents') : undefined,\n currency\n )}\n </span>\n </div>\n )}\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, _props) => {\n let totalPriceAttribute\n\n if (state.settings.get('pricing.tax_strategy') === 'inclusive') {\n totalPriceAttribute = 'grand_total_with_tax_in_cents'\n } else {\n totalPriceAttribute = 'grand_total_in_cents'\n }\n\n return {\n currency: state.client.currency != null ? state.client.currency.toJS() : undefined,\n totalPriceAttribute\n }\n}\n\nconst reduxComponent = reduxConnect(mapStateToProps, null)(EmbeddableCartTotals)\n\nexport default withTranslation('user')(reduxComponent)\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Errors from './Errors'\nimport Totals from './Totals'\nimport Services from 'store/components/Services'\nimport { InlineCartPicker } from 'store/modules/cart/CartPicker/Inline'\nimport ReadOnlyModeDisabledComponent from 'store/components/ReadOnlyModeDisabledComponent'\n\n// Shared\nimport clientActions from 'store/v2/redux/actions/client'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nexport class EmbeddableCartSidebar extends Component {\n static displayName = 'EmbeddableCartSidebar'\n\n static propTypes = {\n cart: PropTypes.object,\n checkoutButtonValid: PropTypes.bool,\n checkingOut: PropTypes.bool,\n setCheckingOut: PropTypes.func,\n usePrices: PropTypes.bool,\n showContinueShopping: PropTypes.bool,\n showDatePicker: PropTypes.bool,\n t: PropTypes.func\n }\n\n static defaultProps = {\n showContinueShopping: true,\n showDatePicker: true\n }\n\n handleBack = (event) => {\n window.history.back()\n event?.preventDefault()\n }\n\n render () {\n const {\n cart,\n checkoutButtonValid,\n showDatePicker,\n checkingOut,\n setCheckingOut,\n usePrices,\n showContinueShopping,\n t\n } = this.props\n const checkoutButtonClass = checkoutButtonValid ? 'bq-enabled' : 'bq-disabled'\n\n return (\n <div className=\"bq-cart-sidebar\">\n {showDatePicker && <InlineCartPicker />}\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <Services cart={cart} />\n {usePrices && cart && cart.lines.length > 0 && (\n <Fragment>\n <hr />\n <Totals cart={cart} />\n </Fragment>\n )}\n <hr />\n <Errors />\n {checkingOut && (\n <div className=\"bq-loading-wrapper\">\n <div className=\"bq-loader\" />\n </div>\n )}\n {!checkingOut && (\n <ReadOnlyModeDisabledComponent>\n <button\n onClick={setCheckingOut}\n className={`bq-checkout-button bq-branded bq-button ${checkoutButtonClass}`}\n >\n {t('user.store.checkout')}\n </button>\n </ReadOnlyModeDisabledComponent>\n )}\n {showContinueShopping && (\n <button onClick={this.handleBack} className=\"bq-checkout-button bq-back-button bq-button\">\n {t('user.store.continue_shopping')}\n </button>\n )}\n </div>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n\n let cannotCheckout\n\n const hasDates = !!(cart?.starts_at && cart?.stops_at)\n const useAvailability = state.settings.get('store.use_availability')\n const usePrices = state.settings.get('store.use_prices')\n\n // Check if we need to calculate if use can checkout\n if (useAvailability) {\n cannotCheckout =\n state.orm.lines\n .getAll({\n id: cart?.lines,\n can_checkout: false\n })\n .size() > 0\n } else {\n cannotCheckout = false\n }\n\n const checkoutButtonValid = !!(\n (Number(cart?.lines?.length || 0) > 0) &&\n hasDates &&\n !cannotCheckout &&\n !state.client.cartOverdue\n )\n\n return {\n cart,\n checkingOut: state.client.checkingOut,\n checkoutButtonValid,\n usePrices,\n showContinueShopping: props.continueShopping,\n showDatePicker: props.datepicker\n }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n setCheckingOut: (e) => {\n e.preventDefault()\n\n if (clientActions.evaluateCartOverdue()) return\n\n clientActions.setCheckingOut()\n }\n }\n}\n\nexport default compose(\n reduxConnect(mapStateToProps, mapDispatchToProps),\n withTranslation('user')\n)(EmbeddableCartSidebar)\n","// React\nimport React, { Component, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport FocalImage from 'ui/components/FocalImage'\n\n// Shared\nimport Format from 'shared/utils/format'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nexport class EmbeddableCartMobileLine extends Component {\n static displayName = 'EmbeddableCartMobileLine'\n\n static propTypes = {\n line: PropTypes.object,\n currency: PropTypes.any,\n photo: PropTypes.object,\n useAvailability: PropTypes.bool,\n showPrices: PropTypes.bool,\n hideProductAvailabilityQuantities: PropTypes.bool,\n hasDates: PropTypes.bool,\n quantity: PropTypes.number,\n deleting: PropTypes.bool,\n onIncreaseQuantity: PropTypes.func,\n onDecreaseQuantity: PropTypes.func,\n onRemove: PropTypes.func,\n onInputChange: PropTypes.func,\n t: PropTypes.func\n }\n\n constructor (props) {\n super(props)\n\n this.state = {\n quantity: props.line.quantity,\n deleting: false\n }\n }\n\n render () {\n const {\n line,\n currency,\n useAvailability,\n showPrices,\n hideProductAvailabilityQuantities,\n hasDates,\n quantity,\n deleting,\n onIncreaseQuantity,\n onDecreaseQuantity,\n onRemove,\n onInputChange,\n t\n } = this.props\n\n const available = line.available_quantity >= quantity\n const statusClass = available ? 'bq-available' : 'bq-unavailable'\n\n if (line.product_type === 'service' || line.quantity === 0) {\n return null\n }\n\n return (\n <div className=\"bq-cart-item--mobile\">\n <div className=\"bq-product-photo\">\n {line?.photo && (\n <div>\n <FocalImage\n size=\"40px\"\n preview={line.photo.preview}\n url={line.photo.large_url}\n coordinates={line.photo.coordinates}\n maintainAspect\n />\n </div>\n )}\n {!line?.photo && (\n <span className=\"bq-no-photo\">\n <i className=\"bq-no-photo bq-icon-image fas fa-image\" />\n </span>\n )}\n </div>\n <div className=\"bq-product-info\">\n <div className=\"bq-product-name\">{line.title}</div>\n {hasDates && useAvailability && (\n <span className={`bq-status-indicator ${statusClass}`}>\n {!hideProductAvailabilityQuantities && (\n <Fragment>\n <span className=\"bq-status-quantity\">{line.available_quantity} </span>\n {t('user.store.available')}\n </Fragment>\n )}\n {hideProductAvailabilityQuantities &&\n t(available ? 'user.store.available' : 'user.store.unavailable')}\n </span>\n )}\n <div className={`bq-quantity ${deleting ? 'disabled' : 'enabled'}`}>\n <button className=\"bq-quantity-toggle\" onClick={onDecreaseQuantity}>\n <i className=\"far fa-minus\" />\n </button>\n <input\n type=\"number\"\n className=\"bq-quantity\"\n name=\"quantity\"\n id=\"quantity\"\n value={quantity}\n onChange={onInputChange}\n />\n <button className=\"bq-quantity-toggle\" onClick={onIncreaseQuantity}>\n <i className=\"far fa-plus\" />\n </button>\n </div>\n </div>\n <div className=\"bq-line-total\">\n <button className=\"bq-remove-product\" onClick={deleting ? undefined : onRemove}>\n <i className=\"bq-icon-cross fas fa-times\" />\n </button>\n {showPrices && line.display_price_in_cents > 0 && (\n <span className=\"bq-price\">{Format.money(line.display_price_in_cents, currency)}</span>\n )}\n </div>\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state) => ({ hideProductAvailabilityQuantities: state.settings.get('store.hide_product_availability_quantities') })\n\nconst EnhancedEmbeddableCartMobileLine = compose(\n withTranslation('user'),\n connect(mapStateToProps)\n)(EmbeddableCartMobileLine)\n\nexport default EnhancedEmbeddableCartMobileLine\n","// React\nimport React, { Component } from 'react'\n\n// Libraries\n\n// Components\nimport LinesContainer from '../LinesContainer'\nimport Line from './Line'\n\n// Shared\n\nexport default class EmbeddableCartMobileLines extends Component {\n static displayName = 'EmbeddableCartMobileLines'\n\n render () {\n return (\n <div className=\"bq-cart-items bq-cart-items--mobile\">\n <LinesContainer cleanstate component={Line} />\n </div>\n )\n }\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\n\n// Components\nimport Sidebar from '../Sidebar'\nimport { InlineCartPicker } from 'store/modules/cart/CartPicker/Inline'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\nimport Lines from './Lines'\nimport Spacer from 'ui/blocks/Spacer'\n\n// Shared\n\nexport class EmbeddableCartMobile extends Component {\n static displayName = 'EmbeddableCartMobile'\n\n static propTypes = {\n showPoweredBy: PropTypes.bool,\n t: PropTypes.func\n }\n\n render () {\n const { showPoweredBy } = this.props\n\n return (\n <div className=\"bq-cart bq-cart--mobile\">\n <InlineCartPicker />\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <hr />\n <Lines />\n <Sidebar datepicker={false} />\n <Spacer size=\"md\" vertical />\n {showPoweredBy && (\n <div className=\"bq-poweredby\">\n <PoweredBy logoWidth=\"16px\" />\n </div>\n )}\n </div>\n </div>\n )\n }\n}\n\nexport default EmbeddableCartMobile\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\n\n// Components\nimport Lines from './Lines'\nimport Sidebar from './Sidebar'\nimport Mobile from './Mobile'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\n\n// Shared\nimport { setUserFrameworkCartData } from 'shared/utils/userFrameworkEvents'\n\nclass EmbeddableCart extends Component {\n static displayName = 'EmbeddableCart'\n\n static propTypes = {\n cart: PropTypes.object,\n showPoweredBy: PropTypes.bool,\n t: PropTypes.func\n }\n\n state = {\n triggeredTracking: false,\n renderMobileForDesktop: false\n }\n\n get isMobile () {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||\n this.state.renderMobileForDesktop\n }\n\n componentDidMount () {\n window.addEventListener('resize', this.handleWindowResize)\n }\n\n componentWillUnmount () {\n window.removeEventListener('resize', this.handleWindowResize)\n }\n\n componentDidUpdate = (prevProps) => {\n const { cart } = this.props\n\n if (cart !== prevProps.cart) {\n setUserFrameworkCartData()\n }\n\n // On mount window.Booqable.data is not set yet. By keeping track of whether this is triggered,\n // we can use the data in reporting events\n if (window.Booqable.cartData && !this.state.triggeredTracking) {\n this.setState({ triggeredTracking: true })\n\n window.Booqable._trigger('viewCart')\n }\n }\n\n handleWindowResize = () => {\n const renderMobileForDesktop = window.innerWidth <= 991\n\n if (renderMobileForDesktop !== this.state.renderMobileForDesktop) {\n this.setState({ renderMobileForDesktop })\n }\n }\n\n renderDesktop () {\n const { showPoweredBy } = this.props\n\n return (\n <div className=\"bq-cart\">\n <div className=\"row\">\n <div className=\"col-lg-8 bq-cart__lines\">\n <Lines />\n {showPoweredBy && (\n <div className=\"bq-poweredby\">\n <PoweredBy logoWidth=\"16px\" />\n </div>\n )}\n </div>\n <div className=\"col-lg-4 bq-cart__sidebar\">\n <Sidebar />\n </div>\n </div>\n </div>\n )\n }\n\n renderMobile () {\n const { showPoweredBy } = this.props\n\n return <Mobile showPoweredBy={showPoweredBy} />\n }\n\n render () {\n return this.isMobile ? this.renderMobile() : this.renderDesktop()\n }\n}\n\nconst mapStateToProps = (state) => {\n const cart = state.orm.carts.first()\n\n return {\n cart,\n showPoweredBy: state.settings.get('store.show_powered_by')\n }\n}\n\nexport default reduxConnect(mapStateToProps)(EmbeddableCart)\n","// React\nimport React, { Component } from 'react'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport EmbeddableCart from 'store/modules/cart/EmbeddableCart'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class EmbeddableCartContainer extends Component {\n static displayName = 'EmbeddableCartContainer'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <EmbeddableCart />\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport EmbeddableCartLines from 'store/modules/cart/EmbeddableCart/Lines'\nimport EmbeddableCartMobileLines from 'store/modules/cart/EmbeddableCart/Mobile/Lines'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class EmbeddableCartLinesContainer extends Component {\n static displayName = 'EmbeddableCartLinesContainer'\n\n static propTypes = {\n compact: PropTypes.bool\n }\n\n render () {\n const { compact } = this.props\n\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n {compact ?\n <EmbeddableCartMobileLines /> :\n <EmbeddableCartLines />}\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { Component } from 'react'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport EmbeddableCartSidebar from 'store/modules/cart/EmbeddableCart/Sidebar'\nimport Themed from 'store/v2/react/components/Themed'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class EmbeddableCartSidebarContainer extends Component {\n static displayName = 'EmbeddableCartSidebarContainer'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n <EmbeddableCartSidebar datepicker={false} />\n </div>\n </Themed>\n </Provider>\n )\n }\n}\n","// React\nimport React, { useEffect, useCallback, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport FloatingCart from 'store/v2/react/scenes/cart/components/FloatingCart'\nimport Popover from 'ui/components/Popover'\nimport PortalWrapper from 'ui/components/PortalWrapper'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faShoppingCart as fasShoppingCart } from '@fortawesome/pro-solid-svg-icons'\nimport { faShoppingCart as farShoppingCart } from '@fortawesome/pro-regular-svg-icons'\nimport { faShoppingCart as falShoppingCart } from '@fortawesome/pro-light-svg-icons'\nimport { faShoppingCart as fatShoppingCart } from '@fortawesome/pro-thin-svg-icons'\n\nimport { StyleSheetManager } from 'styled-components'\n\n// Shared\nimport { setUserFrameworkCartData } from 'shared/utils/userFrameworkEvents'\nimport ClientActions from 'store/v2/redux/actions/client'\nimport useIsMobile from 'shared/utils/useIsMobile'\nimport { shouldForwardProp } from 'shared/utils/shouldForwardProp'\n\nconst getIcon = (style) => {\n switch (style) {\n case 'solid':\n return fasShoppingCart\n case 'regular':\n return farShoppingCart\n case 'light':\n return falShoppingCart\n case 'thin':\n return fatShoppingCart\n default:\n return farShoppingCart\n }\n}\n\nconst CartButton = ({ cart, iconStyle, itemCount, cartOpen, toggleCart, href }) => {\n const isMobile = useIsMobile()\n\n const icon = getIcon(iconStyle)\n\n useEffect(() => {\n setUserFrameworkCartData()\n }, [cart])\n\n const renderFloatingCart = useCallback(\n (props) => (\n <div className=\"booqable-component\">\n <FloatingCart inPortal={!isMobile} href={href} {...props} />\n </div>\n ),\n [isMobile, href]\n )\n\n const renderIcon = useCallback(\n () => (\n <StyleSheetManager shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <button onClick={toggleCart} className=\"bq-cart-button\" part=\"bq-cart-wrapper\">\n <FontAwesomeIcon icon={icon} className=\"bq-icon-cart\" part=\"bq-icon-cart\" />\n {itemCount > 0 && (\n <span className=\"bq-cart-button__line-count bq-branded\" part=\"bq-cart-lines\">\n {itemCount}\n </span>\n )}\n </button>\n </StyleSheetManager>\n ),\n [itemCount, icon, toggleCart]\n )\n\n if (isMobile) {\n return (\n <Fragment>\n {renderIcon()}\n <PortalWrapper open={cartOpen}>{renderFloatingCart()}</PortalWrapper>\n </Fragment>\n )\n }\n\n return (\n <Popover\n open={cartOpen}\n onClose={toggleCart}\n method=\"manual\"\n direction=\"bottom-end\"\n content={renderFloatingCart}\n useContentWrapper={false}\n zIndex={9999999}\n >\n {renderIcon()}\n </Popover>\n )\n}\n\nCartButton.propTypes = {\n cart: PropTypes.object,\n itemCount: PropTypes.number,\n isMobile: PropTypes.bool,\n toggleCart: PropTypes.func,\n cartOpen: PropTypes.bool,\n iconStyle: PropTypes.oneOf(['solid', 'regular', 'light', 'thin']),\n href: PropTypes.string\n}\n\nCartButton.displayName = 'CartButton'\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const lines = state.orm.lines.getAll({\n id: cart != null ? cart.lines : undefined,\n product_type: ['consumable', 'rental', 'bundle']\n })\n const cartIsOpen = state.client.cartOpen\n\n const hasDates = !!((cart != null ? cart.starts_at : undefined) && (cart != null ? cart.stops_at : undefined))\n\n const itemCount = lines.map((line) => line.quantity).reduce((a, b) => a + b, 0)\n\n return {\n cart,\n itemCount,\n hasDates,\n cartOpen: state.client.cartOpen,\n locations: state.orm.locations.getAll().sort('name'),\n cartIsOpen\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n toggleCart: () => {\n const state = window.booqableStore.getState()\n const isOpen = state.client.cartOpen\n\n return ClientActions.toggleCart(!isOpen)\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(CartButton)\n","// React\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport CartPicker from 'store/modules/cart/FloatingCart/components/CartPicker'\nimport CartButtonComponent from 'store/modules/cart/CartButton'\n\nexport class CartButton extends Component {\n static displayName = 'CartButton'\n\n static propTypes = {\n isShowCartBehavior: PropTypes.bool\n }\n\n render () {\n const { isShowCartBehavior } = this.props\n\n return (\n <div className=\"booqable-component\" style={{ display: 'none' }}>\n {isShowCartBehavior && <CartButtonComponent {...this.props} />}\n <CartPicker />\n </div>\n )\n }\n}\n\nconst mapStateToProps = (state, props) => {\n const isShowCartBehavior = state.settings.get('store.behaviors.add_button') === 'show_cart'\n\n return {\n isShowCartBehavior\n }\n}\n\nexport default reduxConnect(mapStateToProps)(CartButton)\n","// React\nimport React, { Component } from 'react'\n\n// Libraries\nimport { Provider } from 'react-redux'\n\n// Components\nimport Themed from 'store/v2/react/components/Themed'\nimport CartButton from 'store/v2/react/components/cart_button'\n\n// Shared\n\nconst store = window.booqableStore\n\nexport default class CartButtonContainer extends Component {\n static displayName = 'CartButtonContainer'\n\n render () {\n return (\n <Provider store={store}>\n <Themed>\n <CartButton {...this.props} />\n </Themed>\n </Provider>\n )\n }\n}\n","import styled, { css, createGlobalStyle } from 'styled-components'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --availability-padding: 5px 12px;\n --availability-border-radius: var(--border-radius-lg, 20px);\n\n --availability-available-background-color: var(--color-green, #8fcc40);\n --availability-available-color: var(--color-white, #fff);\n --availability-unavailable-background-color: var(--color-red, #f85454);\n --availability-unavailable-color: var(--color-white, #fff);\n }\n`\n\nexport const Availability = styled.span`\n padding: var(--availability-padding);\n\n border-radius: var(--availability-border-radius);\n\n ${({ available }) => available && css`\n background-color: var(--availability-available-background-color);\n color: var(--availability-available-color);\n `}\n\n ${({ available }) => !available && css`\n background-color: var(--availability-unavailable-background-color);\n color: var(--availability-unavailable-color);\n `}\n`\n","// React\nimport React, { useMemo } from 'react'\nimport { Provider } from 'react-redux'\n\nconst withStore = (Component) => (props) => {\n const store = useMemo(() => window.booqableGetStore(), [])\n\n return (\n <Provider store={store}>\n <Component {...props} />\n </Provider>\n )\n}\n\nexport default withStore\n","// React\nimport React from 'react'\nimport { ThemeProvider } from 'styled-components'\n\n// Shared\nimport theme from 'ui/themes/public'\nimport getBrandingColor from 'shared/utils/getBrandingColor'\n\nconst withTheme = (Component) => (props) =>\n (\n <ThemeProvider theme={theme(getBrandingColor())}>\n <Component {...props} />\n </ThemeProvider>\n )\n\nexport default withTheme\n","// React\nimport React from 'react'\nimport { createRoot } from 'react-dom/client'\n\n// Libraries\nimport { StyleSheetManager } from 'styled-components'\nimport camelCase from 'lodash/camelCase'\nimport retargetEvents from 'react-shadow-dom-retarget-events'\n\n// Shared\nimport { shouldForwardProp } from 'shared/utils/shouldForwardProp'\n\nconst registerCustomElement = (\n name,\n Component,\n { attributes, mountElement = 'div', mountAttributes = {}, styleSheetTarget } = {}\n) => {\n const webComponentClass = class extends HTMLElement {\n constructor () {\n super()\n\n this.mountPoint = document.createElement(mountElement)\n this.mountPoint.className = name\n\n for (const [key, value] of Object.entries(mountAttributes)) {\n this.mountPoint.setAttribute(key, value)\n }\n\n this.attachShadow({ mode: 'open' })\n }\n\n connectedCallback () {\n if (this.isConnected) {\n this.setAttribute('initialized', 'true')\n\n const attrs = attributes?.reduce(\n (acc, key) =>\n Object.assign(acc, {\n [camelCase(key.replace('data-', ''))]:\n this.getAttribute(key) ?? undefined\n }),\n {}\n ) ?? {}\n\n const handleSetAttribute = (name, value) => {\n if (value === null) {\n this.removeAttribute(name)\n } else {\n this.setAttribute(name, value)\n }\n }\n\n this.shadowRoot?.appendChild(this.mountPoint)\n\n const root = createRoot(this.mountPoint)\n\n root.render(\n <StyleSheetManager\n target={styleSheetTarget || this.shadowRoot || undefined}\n shouldForwardProp={shouldForwardProp}\n enableVendorPrefixes\n >\n <Component {...attrs} setAttribute={handleSetAttribute}>{this.childNodes}</Component>\n </StyleSheetManager>\n )\n\n retargetEvents(this.shadowRoot)\n }\n }\n\n disconnectedCallback () {\n if (!this.isConnected) {\n this.shadowRoot?.removeChild(this.mountPoint)\n }\n }\n }\n\n if (!customElements.get(name)) {\n customElements.define(name, webComponentClass)\n }\n}\n\nexport default registerCustomElement\n","import axios from 'axios'\nimport qs from 'qs'\n\nconst request = axios.create({\n baseURL: window.booqableOptions.apiURL\n})\n\nrequest.interceptors.request.use((config) => {\n config.paramsSerializer = (params) => {\n return qs.stringify(params, {\n arrayFormat: 'brackets',\n encode: false\n })\n }\n\n return config\n})\n\nexport default request\n","import request from './'\n\nexport const getAvailabilities = ({ ids, startsAt, stopsAt, startLocationId }) => {\n return request({\n method: 'POST',\n url: '/api/boomerang/availabilities',\n data: {\n filter: {\n item_id: ids,\n from: startsAt,\n till: stopsAt,\n location_id: startLocationId\n }\n }\n })\n}\n\nexport const getAvailability = ({ id, startsAt, stopsAt, startLocationId, configuration }) => {\n return request({\n method: 'POST',\n url: '/api/boomerang/availabilities',\n data: {\n filter: {\n item_id: id,\n from: startsAt,\n till: stopsAt,\n location_id: startLocationId,\n configuration\n }\n }\n })\n}\n","// Libraries\nimport _debounce from 'lodash/debounce'\n\n// Shared\nimport { getAvailabilities, getAvailability } from 'shop-components/api/availability'\n\nlet ids = []\n\nconst availabilitiesRequest = ({ dispatch, ...params }) => {\n dispatch({\n type: 'PRODUCT_AVAILABILITIES_FETCH_START'\n })\n\n getAvailabilities({ ids, ...params })\n .then(({ data: { data } }) => {\n const availabilities = data.map(({ attributes }) => attributes)\n\n dispatch({ type: 'PRODUCT_AVAILABILITIES_FETCH_SUCCESS', payload: { records: availabilities } })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_AVAILABILITIES_FETCH_ERROR'\n })\n })\n\n ids = []\n}\n\nconst availabilityRequest = ({ dispatch, ...params }) => {\n dispatch({\n type: 'PRODUCT_AVAILABILITIES_FETCH_START'\n })\n\n getAvailability(params)\n .then(({ data: { data } }) => {\n const availabilities = data.map(({ attributes }) => attributes)\n\n dispatch({ type: 'PRODUCT_AVAILABILITIES_FETCH_SUCCESS', payload: { records: availabilities } })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_AVAILABILITIES_FETCH_ERROR'\n })\n })\n}\n\nconst fetchAvailabilitiesDebounced = _debounce(availabilitiesRequest, 50)\n\nconst fetchAvailabilityDebounced = _debounce(availabilityRequest, 50)\n\n// Bulk fetch actions are debounced to prevent multiple requests\nexport const fetchAvailabilities = ({ id, ...params }) => (dispatch) => {\n if (!ids.includes(id)) {\n ids.push(id)\n }\n\n return fetchAvailabilitiesDebounced({ ...params, dispatch })\n}\n\nexport const fetchAvailability = (params) => (dispatch) => {\n return fetchAvailabilityDebounced({ ...params, dispatch })\n}\n\nexport const fetchVariationAvailability = ({ productId, ...params }) => (dispatch) => {\n dispatch({\n type: 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_START'\n })\n\n getAvailabilities(params)\n .then(({ data: { data } }) => {\n const availabilities = data.map(({ attributes }) => ({ ...attributes }))\n\n dispatch({\n type: 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_SUCCESS',\n payload: { records: availabilities, productId }\n })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_ERROR'\n })\n })\n}\n","// React\nimport React, { Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Skeleton from 'ui/blocks/Skeleton'\nimport { HostStyles, Availability } from './styles'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { fetchAvailabilities } from 'shop-components/redux/actions/availability'\n\nconst ProductAvailability = ({\n productId,\n isLoading,\n availability,\n cart,\n fetchProductAvailabilities,\n hideAvailability,\n setAttribute,\n t\n}) => {\n useEffect(() => {\n if (productId && !!cart.startsAt && !!cart.stopsAt && !!cart.startLocationId) {\n fetchProductAvailabilities({\n id: productId,\n startsAt: cart.startsAt,\n stopsAt: cart.stopsAt,\n startLocationId: cart.startLocationId\n })\n }\n }, [cart.startsAt, cart.stopsAt, cart.startLocationId])\n\n useEffect(() => {\n if (!cart.startsAt || !cart.stopsAt || !availability) {\n setAttribute('visible', false)\n } else {\n setAttribute('visible', true)\n }\n }, [cart.startsAt, cart.stopsAt, availability])\n\n if (isLoading) return <Skeleton width={150} />\n\n if (!cart.startsAt || !cart.stopsAt || !availability) return null\n\n const availableString = hideAvailability ?\n t('user.store.available') :\n `${availability.plannable} ${t('user.store.available')?.toLowerCase?.()}`\n\n return (\n <Fragment>\n <HostStyles />\n <Availability available={!!availability?.plannable}>\n {availability?.plannable ? availableString : t('user.store.unavailable')}\n </Availability>\n </Fragment>\n )\n}\n\nProductAvailability.displayName = 'ProductAvailability'\n\nProductAvailability.propTypes = {\n availability: PropTypes.object,\n isLoading: PropTypes.bool,\n hideAvailability: PropTypes.bool,\n cart: PropTypes.object,\n productId: PropTypes.string,\n fetchProductAvailabilities: PropTypes.func,\n setAttribute: PropTypes.func,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n let availability\n\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart?.id)\n\n const item = state.items.records[props.productId]\n\n if (item?.products?.length > 1 && item?.type !== 'bundles') {\n availability = item?.products?.find(({ id }) => id === item.variation_id)?.availability\n } else {\n availability = item?.availability\n }\n\n return {\n cart: {\n id: cart?.id ?? window.booqableOptions.cart?.id,\n startsAt: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stopsAt: cart?.stops_at ?? window.booqableOptions.cart?.till,\n startLocationId: cart?.start_location_id ?? window.booqableOptions.cart?.startLocationId\n },\n isLoading: state.items.loading && !availability,\n availability,\n hideAvailability: state.settings.get('store.hide_product_availability_quantities')\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => ({\n fetchProductAvailabilities: (attributes) => dispatch(fetchAvailabilities(attributes))\n})\n\nconst decoratedComponent = compose(\n withStore,\n withTranslation('user'),\n withTheme,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductAvailability)\n\nregisterCustomElement('bq-product-availability', decoratedComponent, {\n mountElement: 'span',\n attributes: ['product-id']\n})\n\nexport default decoratedComponent\n","// Libraries\nimport _debounce from 'lodash/debounce'\n\n// Shared\nimport { getPrices, getPrice } from 'shop-components/api/price'\n\nlet ids = []\n\nconst pricesRequest = ({ cartId, dispatch }) => {\n dispatch({\n type: 'PRODUCT_PRICES_FETCH_START'\n })\n\n getPrices({ ids, cartId })\n .then(({ data: { data } }) => {\n const prices = data.map(({ attributes }) => attributes)\n\n dispatch({ type: 'PRODUCT_PRICES_FETCH_SUCCESS', payload: { records: prices } })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_PRICES_FETCH_ERROR'\n })\n })\n\n ids = []\n}\n\nconst priceRequest = ({ id, cartId, configuration, dispatch }) => {\n dispatch({\n type: 'PRODUCT_PRICES_FETCH_START'\n })\n\n getPrice({ id, configuration, cartId })\n .then(({ data: { data } }) => {\n const prices = data.map(({ attributes }) => attributes)\n\n dispatch({ type: 'PRODUCT_PRICES_FETCH_SUCCESS', payload: { records: prices, method: 'configuration' } })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_PRICES_FETCH_ERROR'\n })\n })\n}\n\nconst fetchPricesDebounced = _debounce(pricesRequest, 50)\n\nconst fetchPriceDebounced = _debounce(priceRequest, 50)\n\nexport const fetchPrices = ({ id, cartId }) => (dispatch) => {\n if (!ids.includes(id)) {\n ids.push(id)\n }\n\n return fetchPricesDebounced({ cartId, dispatch })\n}\n\nexport const fetchPrice = ({ id, cartId, configuration }) => (dispatch) => {\n return fetchPriceDebounced({ id, cartId, configuration, dispatch })\n}\n","import request from './'\n\nexport const getPrices = ({ ids, cartId }) => {\n return request({\n method: 'POST',\n url: '/api/boomerang/prices',\n data: {\n filter: {\n item_id: ids,\n cart_id: cartId\n }\n }\n })\n}\n\nexport const getPrice = ({ id, cartId, configuration }) => {\n return request({\n method: 'POST',\n url: '/api/boomerang/prices',\n data: {\n filter: {\n item_id: id,\n cart_id: cartId,\n configuration\n }\n }\n })\n}\n","// React\nimport React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Skeleton from 'ui/blocks/Skeleton'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { fetchPrice, fetchPrices } from 'shop-components/redux/actions/price'\nimport { money } from 'shared/utils/format'\n\nconst ProductPrice = ({\n productId,\n isLoading,\n price,\n defaultPrice,\n cart,\n product,\n fetchProductPrice,\n fetchProductPrices,\n currency\n}) => {\n useEffect(() => {\n if (product?.id && cart?.id && (product?.variation_id || product?.configuration)) {\n return fetchProductPrice({\n cartId: cart.id,\n id: product.variation_id || product.id,\n configuration: product.configuration\n })\n }\n\n if (productId && cart?.id) {\n fetchProductPrices({\n cartId: cart.id,\n id: productId\n })\n }\n }, [productId, product?.id, product?.variation_id, product?.configuration, cart.id, cart.startsAt, cart.stopsAt])\n\n if (isLoading) return <Skeleton width={100} />\n\n if (price) return money(price, currency)\n\n if (defaultPrice) return defaultPrice\n\n return null\n}\n\nProductPrice.displayName = 'ProductPrice'\n\nProductPrice.propTypes = {\n productId: PropTypes.string,\n product: PropTypes.object,\n price: PropTypes.number,\n isLoading: PropTypes.bool,\n defaultPrice: PropTypes.string,\n cart: PropTypes.object,\n fetchProductPrice: PropTypes.func,\n fetchProductPrices: PropTypes.func,\n currency: PropTypes.object\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart?.id)\n const product = state.items.records[props.productId]\n const price = product?.price?.price_each_in_cents\n\n return {\n cart: {\n id: cart?.id ?? window.booqableOptions.cart?.id,\n startsAt: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stopsAt: cart?.stops_at ?? window.booqableOptions.cart?.till\n },\n currency: window.booqableOptions.currency,\n isLoading: state.items.loading && !price,\n price,\n product\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => ({\n fetchProductPrice: (attributes) => dispatch(fetchPrice(attributes)),\n fetchProductPrices: (attributes) => dispatch(fetchPrices(attributes))\n})\n\nconst decoratedComponent = compose(\n withStore,\n withTheme,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductPrice)\n\nregisterCustomElement('bq-product-price', decoratedComponent, {\n mountElement: 'span',\n attributes: ['product-id', 'default-price']\n})\n\nexport default decoratedComponent\n","// React\nimport React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Skeleton from 'ui/blocks/Skeleton'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { fetchPrice, fetchPrices } from 'shop-components/redux/actions/price'\n\nconst ProductPriceLabel = ({\n productId,\n label,\n isLoading,\n defaultLabel,\n cart,\n product,\n fetchProductPrices,\n fetchProductPrice\n}) => {\n useEffect(() => {\n if (product?.id && cart?.id && (product?.variation_id || product?.configuration)) {\n return fetchProductPrice({\n cartId: cart.id,\n id: product.variation_id || product.id,\n configuration: product.configuration\n })\n }\n\n if (productId && cart?.id) {\n fetchProductPrices({\n cartId: cart.id,\n id: productId\n })\n }\n }, [productId, product?.id, product?.variation_id, product?.configuration, cart.id, cart.startsAt, cart.stopsAt])\n\n if (isLoading) return <Skeleton width={150} />\n\n if (label) return label\n\n if (defaultLabel) return defaultLabel\n\n return null\n}\n\nProductPriceLabel.displayName = 'ProductPriceLabel'\n\nProductPriceLabel.propTypes = {\n productId: PropTypes.string,\n label: PropTypes.any,\n isLoading: PropTypes.bool,\n defaultLabel: PropTypes.any,\n cart: PropTypes.object,\n product: PropTypes.object,\n fetchProductPrices: PropTypes.func,\n fetchProductPrice: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart?.id)\n const product = state.items.records[props.productId]\n const type = product?.price?.product_type\n const label = type === 'consumable' ? props.t('user.store.buy') : product?.price?.charge_label\n\n return {\n cart: {\n id: cart?.id ?? window.booqableOptions.cart?.id,\n startsAt: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stopsAt: cart?.stops_at ?? window.booqableOptions.cart?.till\n },\n isLoading: state.items.loading && !label,\n label,\n product\n }\n}\n\nconst mapDispatchToProps = (dispatch, _props) => ({\n fetchProductPrice: (attributes) => dispatch(fetchPrice(attributes)),\n fetchProductPrices: (attributes) => dispatch(fetchPrices(attributes))\n})\n\nconst decoratedComponent = compose(\n withStore,\n withTranslation('user'),\n withTheme,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductPriceLabel)\n\nregisterCustomElement('bq-product-price-label', decoratedComponent, {\n mountElement: 'span',\n attributes: ['product-id', 'default-label']\n})\n\nexport default decoratedComponent\n","import styled, { createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --variation-select-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --variation-select-color: var(--color-typo, ${color('text')});\n --variation-select-background-color: var(--color-white, ${color('white')});\n --variation-select-font-size: 13px;\n --variation-select-font-family: var(--font-body, sans-serif);\n\n --variation-select-padding: 0 30px 0 10px;\n\n --variation-select-control-height: 38px;\n\n --variation-select-border-radius: 6px;\n }\n`\n\nconst Wrapper = styled.div`\n position: relative;\n\n svg {\n position: absolute;\n\n top: 50%;\n right: 10px;\n transform: translateY(-50%);\n\n width: 14px;\n height: 14px;\n\n pointer-events: none;\n }\n`\n\nconst Select = styled.select`\n border: var(--variation-select-border);\n\n background-color: var(--variation-select-background-color);\n color: var(--variation-select-color);\n\n font-family: var(--variation-select-font-family);\n font-size: var(--variation-select-font-size);\n\n padding: var(--variation-select-padding);\n\n width: 100%;\n height: var(--variation-select-control-height);\n\n border-radius: var(--variation-select-border-radius);\n\n appearance: none;\n`\n\nWrapper.Select = Select\n\nexport default Wrapper\n","// React\nimport React, { Fragment, useCallback, useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport BVariationSelect, { HostStyles } from './styles'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faChevronDown as farChevronDown } from '@fortawesome/pro-regular-svg-icons'\nimport _sortBy from 'lodash/sortBy'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { fetchPrice } from 'shop-components/redux/actions/price'\nimport { fetchVariationAvailability } from 'shop-components/redux/actions/availability'\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\n\nconst ProductVariationsSelect = ({\n name,\n productId,\n variations,\n defaultVariation,\n withAvailability,\n cart,\n fetchProductPrice,\n fetchAvailability,\n setVariation,\n t\n}) => {\n const [selected, setSelected] = useState(defaultVariation?.id)\n\n const handleSelectVariation = useCallback(\n (id) => {\n setVariation(productId, id)\n setSelected(id)\n },\n [productId, setVariation]\n )\n\n useEffect(() => {\n if (!selected && defaultVariation?.id) {\n handleSelectVariation(defaultVariation?.id)\n }\n }, [selected, defaultVariation?.id, handleSelectVariation])\n\n useEffect(() => {\n if (!(selected && cart.id)) return\n\n fetchProductPrice({ id: selected, cartId: cart.id })\n }, [selected, cart.id, cart.startsAt, cart.stopsAt])\n\n useEffect(() => {\n if (!(productId && variations?.length && cart.startsAt && cart.stopsAt && cart.startLocationId)) return\n\n fetchAvailability({\n ids: variations.map(({ id }) => id),\n productId,\n startsAt: cart.startsAt,\n stopsAt: cart.stopsAt,\n startLocationId: cart.startLocationId\n })\n }, [productId, variations?.length, cart.startsAt, cart.stopsAt, cart.startLocationId])\n\n if (!variations || variations?.length <= 1) return null\n\n return (\n <Fragment>\n <HostStyles />\n <BVariationSelect>\n <BVariationSelect.Select\n className=\"variations-select\"\n name=\"variation\"\n value={selected}\n onChange={(e) => handleSelectVariation(e.target.value)}\n >\n {variations.map((variation) => {\n return (\n <option key={variation.id} value={variation.id}>\n {`${variation.name.replace(`${name} - `, '')}${\n withAvailability && variation.availability ?\n ` (${variation.availability.plannable} ${t('user.store.available')})` :\n ''\n }`}\n </option>\n )\n })}\n </BVariationSelect.Select>\n <FontAwesomeIcon icon={farChevronDown} />\n </BVariationSelect>\n </Fragment>\n )\n}\n\nProductVariationsSelect.propTypes = {\n productId: PropTypes.string.isRequired,\n name: PropTypes.string,\n cart: PropTypes.object,\n variations: PropTypes.array,\n defaultVariation: PropTypes.object,\n withAvailability: PropTypes.bool,\n fetchProductPrice: PropTypes.func,\n fetchAvailability: PropTypes.func,\n setVariation: PropTypes.func,\n t: PropTypes.func\n}\n\nProductVariationsSelect.displayName = 'ProcuctVariationsSelect'\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart?.id)\n const hasDates = !!(cart?.starts_at && cart?.stops_at)\n\n const item = state.items.records[props.productId]\n // Sort by price first (base_price_in_cents)\n const priceSortedVariants = _sortBy(item?.products, 'base_price_in_cents')\n // then by sorting_weight as a tiebreaker\n const variations = _sortBy(item?.products, 'sorting_weight')\n const defaultVariation = priceSortedVariants?.[0]\n\n const withAvailability =\n hasDates &&\n item?.tracking_type !== 'none' &&\n SettingsUtils.get('store.use_availability') &&\n !SettingsUtils.get('store.hide_product_availability_quantities')\n\n return {\n cart: {\n id: cart?.id ?? window.booqableOptions.cart?.id,\n startsAt: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stopsAt: cart?.stops_at ?? window.booqableOptions.cart?.till,\n startLocationId: cart?.start_location_id ?? window.booqableOptions.cart?.start_location_id\n },\n name: item?.name,\n variations,\n defaultVariation,\n withAvailability\n }\n}\n\nconst mapDispatchToProps = (dispatch) => ({\n fetchProductPrice: ({ id, cartId }) => dispatch(fetchPrice({ id, cartId })),\n fetchAvailability: (attributes) => dispatch(fetchVariationAvailability(attributes)),\n setVariation: (id, variationId) => dispatch({ type: 'PRODUCT_UPDATE_VARIATION', payload: { id, variationId } })\n})\n\nconst decoratedComponent = compose(\n withStore,\n withTheme,\n withTranslation('user'),\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductVariationsSelect)\n\nregisterCustomElement('bq-product-variations-select', decoratedComponent, {\n attributes: ['product-id']\n})\n\nexport default decoratedComponent\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport ProductAvailabilityCalendar from 'store/modules/product/components/ProductAvailabilityCalendar'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { getOperatingRules } from 'shared/utils/operating_rules'\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\n\nconst AvailabilityCalendar = ({ itemId, cart, configuration, locations, availabilities, operatingRules, showCounts }) => (\n <ProductAvailabilityCalendar\n id={itemId}\n productConfiguration={{ products: configuration }}\n currentMonth={cart?.starts_at ? new Date(cart.starts_at) : new Date()}\n availabilities={availabilities}\n defaultLocationId={locations.start?.id}\n operatingRules={operatingRules}\n showCounts={showCounts}\n selected={{ from: cart?.starts_at, to: cart?.stops_at }}\n useBusinessHours\n />\n)\n\nAvailabilityCalendar.propTypes = {\n item: PropTypes.object,\n cart: PropTypes.object,\n configuration: PropTypes.object,\n locations: PropTypes.object,\n availabilities: PropTypes.object,\n operatingRules: PropTypes.object,\n showCounts: PropTypes.bool\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart.id)\n const locations = {\n start: state.orm.locations.getById(cart?.start_location_id ?? window.booqableOptions.cart.startLocationId),\n stop: state.orm.locations.getById(cart?.stop_location_id ?? window.booqableOptions.cart.stopLocationId)\n }\n\n const item = state.items.records[props.productId]\n let itemId = item?.variation_id\n itemId ||= item?.type === 'product_groups' ? item?.products?.[0]?.id : item?.id\n\n const availabilities = state.orm.shop_availabilities.getAll({\n item_id: itemId\n })\n\n const configuration = item?.configuration\n\n const operatingRules = getOperatingRules(state)\n const showCounts = !SettingsUtils.get('store.hide_product_availability_quantities')\n\n return {\n item,\n itemId,\n configuration,\n cart,\n locations,\n availabilities,\n operatingRules,\n showCounts\n }\n}\n\nconst decoratedComponent = compose(withStore, withTheme, reduxConnect(mapStateToProps))(AvailabilityCalendar)\n\nregisterCustomElement('bq-product-availability-calendar', decoratedComponent, {\n attributes: ['product-id'],\n mountElement: 'span',\n styleSheetTarget: document.head\n})\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport Skeleton from 'ui/blocks/Skeleton'\n\nconst statusColors = {\n success: '--add-button-button-color',\n error: '--add-button-error-color'\n}\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --add-button-button-color: var(--color-accent-background, ${color('branding')});\n --add-button-button-label-color: var(--color-accent-foreground, ${color('white')});\n\n --add-button-success-color: var(--color-green, ${color('Success/Base')});\n --add-button-error-color: var(--color-red, ${color('Danger/Base')});\n\n --add-button-label-weight: 700;\n --add-button-label-family: var(--font-body, sans-serif);\n\n --add-button-input-border-radius: 6px;\n --add-button-button-border-radius: 6px;\n\n --add-button-control-button-color: var(--color-typo, ${color('text')});\n\n --add-button-input-color: var(--color-typo, ${color('text')});\n --add-button-input-background-color: var(--color-white, ${color('white')});\n --add-button-input-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --add-button-control-height: 48px;\n\n --add-button-input-padding: 8px 12px;\n --add-button-input-width: 110px;\n\n --add-button-button-padding: 0 14px;\n --add-button-button-width: 100%;\n --add-button-button-max-width: 400px;\n\n --add-button-gap: 6px;\n }\n\n * {\n box-sizing: border-box;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n }\n`\n\nconst Wrapper = styled.div`\n display: flex;\n align-items: center;\n\n gap: var(--add-button-gap);\n\n width: 100%;\n`\n\nconst ButtonLabel = styled.span`\n color: var(--add-button-button-label-color);\n\n font-family: var(--add-button-label-family);\n font-weight: var(--add-button-label-weight);\n`\n\nconst ButtonOverlay = styled.div`\n position: absolute;\n\n width: 100%;\n height: 100%;\n\n top: 0;\n left: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n max-height: 18px;\n max-width: 18px;\n\n height: 100%;\n width: 100%;\n\n &.loading {\n animation: spin 1s linear infinite;\n }\n }\n`\n\nconst Button = styled.button`\n display: block;\n position: relative;\n\n width: var(--add-button-button-width);\n height: var(--add-button-control-height);\n\n max-width: var(--add-button-button-max-width);\n\n padding: var(--add-button-button-padding);\n\n background-color: var(--add-button-button-color);\n color: var(--add-button-button-label-color);\n\n border: none;\n border-radius: var(--add-button-button-border-radius);\n\n cursor: pointer;\n\n &:hover {\n box-shadow: inset 0px 0px 400px 110px rgba(0, 0, 0, 0.12);\n }\n\n transition: all 0.2s ease-in-out;\n\n ${({ loading }) =>\n loading &&\n css`\n cursor: progress;\n\n ${ButtonLabel} {\n opacity: 0;\n visibility: hidden;\n }\n `}\n\n ${({ disabled }) =>\n disabled &&\n css`\n cursor: not-allowed;\n\n opacity: 0.6;\n `}\n\n ${({ status }) =>\n status &&\n css`\n background-color: var(${statusColors[status]});\n\n ${ButtonLabel} {\n opacity: 0;\n visibility: hidden;\n }\n `}\n`\n\nconst InputWrapper = styled.div`\n position: relative;\n`\n\nconst Input = styled.input`\n display: block;\n\n width: var(--add-button-input-width);\n height: var(--add-button-control-height);\n\n color: var(--add-button-input-color);\n background-color: var(--add-button-input-background-color);\n\n padding: var(--add-button-input-padding);\n margin: 0;\n\n border: var(--add-button-input-border);\n border-radius: var(--add-button-input-border-radius);\n\n font-family: sans-serif;\n\n appearance: textfield;\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n appearance: none;\n margin: 0;\n }\n`\n\nconst Controls = styled.div`\n position: absolute;\n\n display: flex;\n flex-direction: column;\n\n top: 0;\n right: 0;\n bottom: 0;\n\n border-top-right-radius: var(--add-button-input-border-radius);\n border-bottom-right-radius: var(--add-button-input-border-radius);\n\n border-left: var(--add-button-input-border);\n`\n\nconst Control = styled.button`\n flex: 1 1 auto;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n padding: 0 15px;\n\n border: none;\n\n background-color: transparent;\n\n cursor: pointer;\n\n svg {\n width: 12px;\n height: 12px;\n\n fill: var(--add-button-control-button-color);\n color: var(--add-button-control-button-color);\n }\n`\n\nconst SkeletonContainer = styled(Wrapper)`\n ${Skeleton} {\n height: var(--add-button-control-height);\n width: var(--add-button-button-width);\n\n border-radius: var(--add-button-button-border-radius);\n }\n`\n\nWrapper.Button = Button\nWrapper.ButtonLabel = ButtonLabel\nWrapper.ButtonOverlay = ButtonOverlay\nWrapper.InputWrapper = InputWrapper\nWrapper.Input = Input\nWrapper.Controls = Controls\nWrapper.Control = Control\nWrapper.SkeletonContainer = SkeletonContainer\n\nexport default Wrapper\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport BProductButton from './styles'\nimport Skeleton from 'ui/blocks/Skeleton'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faSpinnerThird as farSpinnerThird,\n faCheck as farCheck,\n faTimes as farTimes\n} from '@fortawesome/pro-regular-svg-icons'\n\nconst Button = ({ loading, disabled, status, behavior, onClick, label }) => {\n if (!behavior) {\n return (\n <BProductButton.SkeletonContainer>\n <Skeleton />\n </BProductButton.SkeletonContainer>\n )\n }\n\n return (\n <BProductButton.Button\n onClick={onClick}\n disabled={disabled}\n loading={loading || undefined}\n status={status}\n className=\"bq-button\"\n >\n <BProductButton.ButtonLabel>{label}</BProductButton.ButtonLabel>\n {loading && (\n <BProductButton.ButtonOverlay>\n <FontAwesomeIcon className=\"loading\" icon={farSpinnerThird} size=\"sm\" />\n </BProductButton.ButtonOverlay>\n )}\n {status === 'success' && (\n <BProductButton.ButtonOverlay>\n <FontAwesomeIcon icon={farCheck} size=\"sm\" />\n </BProductButton.ButtonOverlay>\n )}\n {status === 'error' && (\n <BProductButton.ButtonOverlay>\n <FontAwesomeIcon icon={farTimes} size=\"sm\" />\n </BProductButton.ButtonOverlay>\n )}\n </BProductButton.Button>\n )\n}\n\nButton.propTypes = {\n onClick: PropTypes.func,\n loading: PropTypes.bool,\n disabled: PropTypes.bool,\n status: PropTypes.oneOf(['success', 'error']),\n behavior: PropTypes.oneOf(['show_cart', 'checkout']),\n label: PropTypes.any\n}\n\nexport default Button\n","import request from './'\n\n// Universal action supporting product groups, products and bundles\nexport const getItem = (id) => {\n return request({\n method: 'GET',\n url: `/api/boomerang/items/${id}`,\n params: {\n include: ['photo', 'bundle_items.product_group.products.photo', 'products', 'products.photo']\n }\n })\n}\n","// Libraries\nimport _debounce from 'lodash/debounce'\n\n// Shared\nimport { getItem } from 'shop-components/api/items'\n\nexport const composeItem = ({ data, included }) => {\n const item = {\n id: data.id,\n type: data.type,\n ...data.attributes,\n photos: [],\n products: []\n }\n\n included.forEach(({ id, type, attributes, relationships }) => {\n switch (type) {\n case 'bundle_items': {\n if (data.type !== 'bundles') return\n\n const productGroup = included.find(({ id: _id }) => _id === relationships.product_group.data.id)\n const photo = included.find(({ id: _id }) => _id === productGroup.attributes.photo_id)\n const products = productGroup.relationships.products.data\n .map(({ id }) => ({\n id,\n ...included.find(({ id: _id }) => _id === id).attributes\n }))\n .map((product) => {\n const photo = included.find(({ id: _id }) => _id === product.photo_id)?.attributes\n\n if (photo) {\n return {\n ...product,\n photo\n }\n }\n\n return product\n })\n\n if (photo && !item.photos.find(({ id: _id }) => _id === photo.id)) {\n item.photos.push({\n id: photo.id,\n ...photo.attributes\n })\n }\n\n item.products.push({\n id,\n ...attributes,\n product_group: {\n id: productGroup.id,\n ...productGroup.attributes,\n products\n }\n })\n\n break\n }\n case 'products': {\n if (data.type !== 'product_groups') return\n\n const photo = included.find(({ id: _id }) => _id === attributes.photo_id)\n\n if (photo && !item.photos.find(({ id: _id }) => _id === photo.id)) {\n item.photos.push({\n id: photo.id,\n ...photo.attributes\n })\n }\n\n item.products.push({\n id,\n ...attributes\n })\n\n break\n }\n }\n })\n\n return item\n}\n\nconst fetchRequest = (id, dispatch) => {\n dispatch({\n type: 'PRODUCTS_FETCH_START',\n payload: { id }\n })\n\n getItem(id).then(({ data }) => {\n const item = composeItem(data)\n\n dispatch({ type: 'PRODUCTS_FETCH_SUCCESS', payload: { records: [item] } })\n })\n}\n\nconst fetchDebounced = _debounce(fetchRequest, 50)\n\nexport const fetchItem = (id) => (dispatch) => {\n return fetchDebounced(id, dispatch)\n}\n\nexport const updateConfiguration = ({ id, itemId, variationId }) => (dispatch) => {\n dispatch({\n type: 'PRODUCT_UPDATE_CONFIGURATION',\n payload: { id, itemId, variationId }\n })\n}\n","// React\nimport React, { Fragment, useState, useCallback, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport BProductButton, { HostStyles } from './styles'\nimport Button from './Button'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPlus as farPlus, faMinus as farMinus } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport ClientActions from 'store/v2/redux/actions/client'\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\nimport { fetchItem } from 'shop-components/redux/actions/item'\n\nconst ProductButton = ({ item, behavior, hasDates, useAvailability, bookProduct, fetchItem, clearCart, label, t }) => {\n const [quantity, setQuantity] = useState(1)\n const [loading, setLoading] = useState(false)\n const [status, setStatus] = useState(null)\n\n useEffect(() => {\n fetchItem()\n }, [])\n\n let disabled = quantity <= 0 || isNaN(quantity) || loading\n\n if (behavior === 'checkout' && useAvailability) {\n const available = item?.availability?.plannable\n\n disabled = disabled || (hasDates && !available) || (hasDates && quantity > available)\n }\n\n const handleBook = useCallback(async () => {\n let timeout\n let id\n\n if (item.type === 'bundles') {\n id = item.id\n } else {\n id = item.variation_id || item.products[0].id\n }\n\n setLoading(true)\n\n if (behavior === 'checkout') {\n await clearCart()\n }\n\n await bookProduct({ id, quantity, configuration: item.configuration })\n .then(() => {\n setStatus('success')\n })\n .catch(() => {\n setStatus('error')\n })\n .finally(() => {\n setLoading(false)\n\n timeout = setTimeout(() => {\n setStatus(null)\n }, 3000)\n })\n\n return () => {\n clearTimeout(timeout)\n }\n }, [item, quantity])\n\n const handleButtonClick = useCallback(() => {\n if (!hasDates && behavior === 'checkout') {\n return ClientActions.toggleModalPicker(true)\n }\n\n handleBook()\n }, [handleBook, hasDates, behavior])\n\n const handleInputFocus = useCallback(({ target }) => {\n target.select()\n }, [])\n\n const handleChangeQuantity = useCallback(({ target: { value } }) => {\n if (value && !isNaN(value)) {\n setQuantity(parseInt(value))\n }\n }, [])\n\n const handleIncreaseQuantity = useCallback(() => {\n setQuantity((prev) => prev + 1)\n }, [])\n\n const handleDecreaseQuantity = useCallback(() => {\n setQuantity((prev) => {\n if (prev === 0) return prev\n\n return prev - 1\n })\n }, [])\n\n return (\n <Fragment>\n <HostStyles />\n <BProductButton>\n <BProductButton.InputWrapper>\n <BProductButton.Input\n value={quantity}\n onChange={handleChangeQuantity}\n onFocus={handleInputFocus}\n name=\"quantity\"\n type=\"number\"\n className=\"bq-quantity\"\n min=\"1\"\n />\n <BProductButton.Controls>\n <BProductButton.Control onClick={handleIncreaseQuantity}>\n <FontAwesomeIcon icon={farPlus} size=\"sm\" />\n </BProductButton.Control>\n <BProductButton.Control disabled={quantity <= 1} onClick={handleDecreaseQuantity}>\n <FontAwesomeIcon icon={farMinus} size=\"sm\" />\n </BProductButton.Control>\n </BProductButton.Controls>\n </BProductButton.InputWrapper>\n <Button\n label={t(label)}\n onClick={handleButtonClick}\n loading={loading}\n disabled={disabled}\n status={status}\n behavior={behavior}\n />\n </BProductButton>\n </Fragment>\n )\n}\n\nProductButton.propTypes = {\n item: PropTypes.object,\n behavior: PropTypes.oneOf(['show_cart', 'checkout']),\n hasDates: PropTypes.bool,\n useAvailability: PropTypes.bool,\n bookProduct: PropTypes.func,\n clearCart: PropTypes.func,\n fetchItem: PropTypes.func,\n label: PropTypes.any,\n t: PropTypes.func\n}\n\nProductButton.displayName = 'ProductButton'\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const item = state.items.records[props.productId]\n\n const behavior = SettingsUtils.get('store.behaviors.add_button')\n const useAvailability = SettingsUtils.get('store.use_availability') && item?.tracking_type !== 'none'\n const hasDates = !!cart?.starts_at && !!cart?.stops_at\n\n let label = 'user.store.add_to_cart'\n\n if (behavior === 'checkout' && !hasDates) {\n label = 'user.store.select_a_period'\n }\n\n return { item, behavior, hasDates, label, useAvailability }\n}\n\nconst mapDispatchToProps = (dispatch, props) => ({\n fetchItem: () => dispatch(fetchItem(props.productId)),\n clearCart: () => CartActions.clear(),\n bookProduct: ({ id, quantity, configuration }) =>\n CartActions.book({ item_id: id, quantity, configuration: { products: configuration } }).then(() => {\n const toggleCart = () => ClientActions.toggleCart(true)\n const togglePicker = () =>\n ClientActions.evaluateCartOverdue() ? ClientActions.toggleModalPicker(true) : ClientActions.setCheckingOut()\n\n const action = SettingsUtils.get('store.behaviors.add_button') === 'show_cart' ? toggleCart : togglePicker\n\n triggerUserFrameworkBookEvent(id, quantity)\n\n return setTimeout(action, 150)\n })\n})\n\nconst decoratedComponent = compose(\n withTranslation('user'),\n withTheme,\n withStore,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductButton)\n\nregisterCustomElement('bq-product-button', decoratedComponent, {\n attributes: ['product-id']\n})\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { color } from 'ui/themes/utils'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n /* Colors */\n --date-picker-icon-color: var(--color-accent-foreground, #ffffff);\n --date-picker-background-color: var(--color-white, #ffffff);\n --date-picker-text-color: var(--color-typo, #0c2747);\n --date-picker-placeholder-color: var(--color-placeholder, #0c27471a);\n --date-picker-cleanstate-background-color: var(--color-accent-background, #395db8);\n --date-picker-cleanstate-text-color: var(--color-accent-foreground, #ffffff);\n --date-picker-error-color: var(--color-red, #f85454);\n\n /* Sizes */\n --date-picker-wrapper-padding: 0.5rem;\n --date-picker-cleanstate-padding: 0.75rem 1.25rem;\n --date-picker-section-padding: 0.75rem;\n --date-picker-title-size: 1.125rem;\n --date-picker-title-line-height: 1.75rem;\n --date-picker-text-size: 1rem;\n --date-picker-text-line-height: 1.5rem;\n --date-picker-border-radius: 0.5rem;\n\n /* Other styles */\n --date-picker-box-shadow: 0 1px 2px rgba(33, 59, 71, 0.12), 0 4px 12px rgba(33, 59, 71, 0.12);\n --date-picker-section-border: 1px solid ${color('Misc/Divider')};\n\n --date-picker-cleanstate-alignment: left;\n --date-picker-alignment: left;\n\n @media (min-width: 820px) {\n --date-picker-wrapper-padding: 1rem;\n }\n }\n`\n\nconst DatePicker = styled.div`\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n font-family: var(--font-body);\n`\n\nconst Icon = styled(FontAwesomeIcon)`\n max-width: 24px;\n width: 100%;\n\n color: var(--date-picker-icon-color);\n`\n\nconst CalendarIcon = styled(Icon)`\n max-height: 24px;\n\n margin-right: 16px;\n`\n\nconst ChevronIcon = styled(Icon)`\n max-width: 12px;\n`\n\nconst Cleanstate = styled.div`\n display: flex;\n align-items: center;\n\n text-align: var(--date-picker-cleanstate-alignment);\n\n background-color: var(--date-picker-cleanstate-background-color);\n\n padding: var(--date-picker-cleanstate-padding);\n\n border-radius: var(--date-picker-border-radius);\n\n cursor: pointer;\n\n min-height: 56px;\n`\n\nconst CleanstateLabels = styled.div`\n width: 100%;\n margin-right: 16px;\n\n color: var(--date-picker-cleanstate-text-color);\n`\n\nconst CleanstateTitle = styled.div`\n font-size: var(--date-picker-title-size);\n line-height: var(--date-picker-title-line-height);\n font-weight: 600;\n\n color: var(--color-accent-foreground);\n`\n\nconst CleanstateLabel = styled.div`\n font-size: var(--date-picker-text-size);\n line-height: var(--date-picker-text-line-height);\n color: var(--color-accent-foreground);\n`\n\nconst Wrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n\n background-color: var(--date-picker-background-color);\n\n padding: var(--date-picker-wrapper-padding) 0;\n\n box-shadow: var(--date-picker-box-shadow);\n border-radius: var(--date-picker-border-radius);\n\n text-align: var(--date-picker-alignment);\n`\n\nconst SectionGroup = styled.div`\n display: flex;\n flex-grow: 1;\n cursor: pointer;\n`\n\nconst Section = styled.div`\n flex: 1 1 0;\n padding: 0 var(--date-picker-section-padding);\n border-right: var(--date-picker-section-border);\n`\n\nconst Label = styled.p`\n font-size: var(--date-picker-text-size);\n line-height: var(--date-picker-text-line-height);\n\n color: var(--date-picker-text-color);\n\n font-weight: 600;\n\n @media (min-width: 820px) {\n display: block;\n }\n`\n\nconst Value = styled.p`\n font-size: var(--date-picker-text-size);\n line-height: var(--date-picker-text-line-height);\n\n color: var(--date-picker-text-color);\n\n font-weight: 400;\n\n ${({ isPlaceholder }) => isPlaceholder && css`\n font-size: var(--date-picker-text-size);\n line-height: var(--date-picker-text-line-height);\n font-weight: 400;\n color: var(--date-picker-placeholder-color);\n `}\n\n ${({ isValid }) => !isValid && css`\n color: var(--date-picker-error-color);\n `}\n`\n\nDatePicker.Icon = Icon\nDatePicker.CalendarIcon = CalendarIcon\nDatePicker.ChevronIcon = ChevronIcon\nDatePicker.Cleanstate = Cleanstate\nDatePicker.CleanstateLabels = CleanstateLabels\nDatePicker.CleanstateTitle = CleanstateTitle\nDatePicker.CleanstateLabel = CleanstateLabel\nDatePicker.Wrapper = Wrapper\nDatePicker.Section = Section\nDatePicker.SectionGroup = SectionGroup\nDatePicker.Label = Label\nDatePicker.Value = Value\n\nexport default DatePicker\n","// React\nimport { useEffect, useCallback } from 'react'\n\n// Hooks\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useSearchParam } from 'shared/utils/useSearchParam'\nimport { useSelector } from 'react-redux'\n\n// Shared\nimport CartActions from 'store/v2/redux/actions/cart'\nimport ClientActions from 'store/v2/redux/actions/client'\n\nexport const useDatePicker = () => {\n const shouldOpenPicker = useSearchParam('open-picker')\n\n const behavior = useSettings('store.behaviors.add_button')\n\n const isOpen = useSelector((state) => state.client.modalPickerOpen)\n\n const toggle = useCallback((state) => {\n ClientActions.toggleModalPicker(state)\n }, [])\n\n const close = useCallback(() => {\n switch (behavior) {\n case 'show_cart': {\n ClientActions.toggleModalPicker(false)\n break\n }\n case 'checkout': {\n CartActions.clear()\n ClientActions.toggleModalPicker(false)\n break\n }\n }\n }, [behavior])\n\n // Effect to check if we should open picker based on the URL search param\n useEffect(() => {\n if (!shouldOpenPicker) return\n\n toggle(true)\n }, [])\n\n return {\n isOpen,\n toggle,\n close,\n behavior\n }\n}\n","// React\nimport React, { Fragment, useMemo } from 'react'\nimport { compose } from 'redux'\n\n// Components\nimport BDatePicker, { HostStyles } from './styles'\n\n// Libraries\nimport { faCalendar as falCalendar, faChevronRight as falChevronRight } from '@fortawesome/pro-light-svg-icons'\n\n// Hooks\nimport { useOrm, shallowEqual } from 'shared/utils/useOrm'\nimport { useOpeningHours } from 'shared/utils/useOpeningHours'\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useDatePicker } from './hooks'\nimport { useSelector } from 'react-redux'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport { isLocationInputEnabled, isDaySelectable, isTimeSelectable } from 'ui/components/Picker/utils'\n\nconst getLabelKey = (pricingEnabled, availabilityEnabled) => {\n if (pricingEnabled && availabilityEnabled) {\n return 'user.store.view_prices_and_availability'\n }\n\n if (pricingEnabled && !availabilityEnabled) {\n return 'user.store.view_prices'\n }\n\n if (!pricingEnabled && availabilityEnabled) {\n return 'user.store.view_availability'\n }\n}\n\nconst Button = () => {\n const openingHours = useOpeningHours()\n\n const cartId = useSelector((state) => state.client.cartId)\n\n const cart = useOrm('carts', (carts) => {\n return carts.getById(cartId || window.booqableOptions.cart?.id)\n })\n const locations = useOrm('locations', (locations) => {\n return {\n count: locations.size(),\n start: locations.getById(cart?.start_location_id ?? window.booqableOptions.cart?.startLocationId),\n stop: locations.getById(cart?.stop_location_id ?? window.booqableOptions.cart?.stopLocationId)\n }\n }, shallowEqual)\n\n const useTimes = useSettings('store.use_times')\n const useAMOrPM = useSettings('dates.use_am_pm')\n const isPricingEnabled = useSettings('pricing.enabled')\n const isAvailabilityEnabled = useSettings('store.use_availability')\n\n const { toggle } = useDatePicker()\n\n const dates = {\n start: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stop: cart?.stops_at ?? window.booqableOptions.cart?.till\n }\n\n const isDelivery = cart?.data?.fulfillment_type === 'delivery'\n\n const isStartValid = useMemo(\n () =>\n isDaySelectable({\n type: 'start',\n openingHours,\n date: dates.start,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }) &&\n isTimeSelectable({\n type: 'start',\n openingHours,\n date: dates.start,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }),\n [dates.start, dates.stop, openingHours]\n )\n\n const isStopValid = useMemo(\n () =>\n isDaySelectable({\n type: 'stop',\n openingHours,\n date: dates.stop,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }) &&\n isTimeSelectable({\n type: 'stop',\n openingHours,\n date: dates.stop,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }),\n [dates.start, dates.stop, openingHours]\n )\n\n const { t } = useTranslation('user')\n\n const hasLocations = locations.count > 1 && (isLocationInputEnabled('start') || isLocationInputEnabled('stop'))\n const hasData = hasLocations ?\n !!dates.start && !!dates.stop && !!locations.start && !!locations.stop :\n !!dates.start && !!dates.stop\n\n let timeFormat = ''\n\n if (useTimes) {\n timeFormat = useAMOrPM ? ' hh:mm A' : ' HH:mm'\n }\n\n const labelKey = getLabelKey(isPricingEnabled, isAvailabilityEnabled)\n\n if (!cart) return null\n\n if (!hasData) {\n return (\n <Fragment>\n <HostStyles />\n <BDatePicker>\n <BDatePicker.Cleanstate onClick={() => toggle(true)}>\n <BDatePicker.CalendarIcon icon={falCalendar} />\n <BDatePicker.CleanstateLabels>\n <BDatePicker.CleanstateTitle>{t('user.store.select_a_period')}</BDatePicker.CleanstateTitle>\n <BDatePicker.CleanstateLabel>{labelKey ? t(labelKey) : '...'}</BDatePicker.CleanstateLabel>\n </BDatePicker.CleanstateLabels>\n <BDatePicker.ChevronIcon icon={falChevronRight} />\n </BDatePicker.Cleanstate>\n </BDatePicker>\n </Fragment>\n )\n }\n\n return (\n <Fragment>\n <HostStyles />\n <BDatePicker>\n <BDatePicker.Wrapper onClick={() => toggle(true)} hasLocations={hasLocations}>\n <BDatePicker.SectionGroup>\n <BDatePicker.Section>\n <BDatePicker.Label>{isDelivery ? t('user.store.timeslot_from') : t('user.store.start_date')}</BDatePicker.Label>\n <BDatePicker.Value isPlaceholder={!dates.start} isValid={isStartValid}>\n {dates.start && (\n <Fragment>\n {FormatUtils.date(dates.start, 'MMM D[,] YYYY')}\n {useTimes && FormatUtils.date(dates.start, timeFormat)}\n </Fragment>\n )}\n {!dates.start && t('user.store.pick_date')}\n </BDatePicker.Value>\n </BDatePicker.Section>\n <BDatePicker.Section>\n <BDatePicker.Label>{isDelivery ? t('user.store.timeslot_until') : t('user.store.stop_date')}</BDatePicker.Label>\n <BDatePicker.Value isPlaceholder={!dates.stop} isValid={isStopValid}>\n {dates.stop && (\n <Fragment>\n {FormatUtils.date(dates.stop, 'MMM D[,] YYYY')}\n {useTimes && FormatUtils.date(dates.stop, timeFormat)}\n </Fragment>\n )}\n {!dates.stop && t('user.store.pick_date')}\n </BDatePicker.Value>\n </BDatePicker.Section>\n </BDatePicker.SectionGroup>\n {hasLocations && !isDelivery && (\n <BDatePicker.SectionGroup>\n <BDatePicker.Section>\n <BDatePicker.Label>{t('user.store.start_location')}</BDatePicker.Label>\n <BDatePicker.Value isPlaceholder={!locations.start} isValid>\n {locations.start?.name ?? t('user.store.start_location')}\n </BDatePicker.Value>\n </BDatePicker.Section>\n <BDatePicker.Section>\n <BDatePicker.Label>{t('user.store.stop_location')}</BDatePicker.Label>\n <BDatePicker.Value isPlaceholder={!locations.stop} isValid>\n {locations.stop?.name ?? t('user.store.stop_location')}\n </BDatePicker.Value>\n </BDatePicker.Section>\n </BDatePicker.SectionGroup>\n )}\n </BDatePicker.Wrapper>\n </BDatePicker>\n </Fragment>\n )\n}\n\nconst decoratedComponent = compose(\n withStore,\n withTheme\n)(Button)\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n /* Colors */\n --date-picker-icon-color: var(--color-accent-foreground, #ffffff);\n --date-picker-background-color: var(--color-white, #ffffff);\n --date-picker-text-color: var(--color-typo, #0c2747);\n --date-picker-border-color: var(--color-accent-background, #395db8);\n --date-picker-error-color: var(--color-red, #f85454);\n\n /* Sizes */\n --date-picker-wrapper-padding: 0.5rem;\n --date-picker-text-size: 1.125rem;\n --date-picker-text-weight: 600;\n --date-picker-text-line-height: 1.75rem;\n --date-picker-border-radius: 0.5rem;\n }\n`\n\nconst DatePicker = styled.div`\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n font-family: var(--font-body);\n`\n\nconst Icon = styled(FontAwesomeIcon)`\n max-width: 14px;\n width: 100%;\n\n color: var(--date-picker-icon-color);\n`\n\nconst CalendarIcon = styled(Icon)`\n max-height: 24px;\n\n margin-right: 12px;\n`\n\nconst Wrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n margin: auto;\n width: 512px;\n max-width: 100%;\n\n background-color: var(--date-picker-background-color);\n\n padding: var(--date-picker-wrapper-padding);\n\n border: 1px solid var(--date-picker-border-color);\n\n border-radius: var(--date-picker-border-radius);\n\n cursor: pointer;\n\n @media (max-width: 820px) {\n width: 100%;\n }\n`\n\nconst WrapperWithData = styled(Wrapper)`\n @media (max-width: 426px) {\n flex-direction: column;\n align-items: start;\n }\n`\n\nconst Text = styled.div`\n font-size: var(--date-picker-text-size);\n line-height: var(--date-picker-text-line-height);\n font-weight: var(--date-picker-text-weight);\n\n color: var(--date-picker-text-color);\n`\n\nconst ExpandedTitle = styled.span`\n @media (max-width: 426px) {\n display: none;\n }\n`\n\nconst Location = styled(Text)`\n border-right: 1px solid var(--date-picker-border-color);\n padding-right: 12px;\n margin-right: 12px;\n\n @media (max-width: 426px) {\n border-right: 0px none;\n padding-right: 0px;\n margin-right: 0px;\n }\n`\n\nconst Dates = styled(Text)`\n ${({ isValid }) => !isValid && css`\n color: var(--date-picker-error-color);\n `}\n\n @media (max-width: 426px) {\n font-weight: 400;\n }\n`\n\nDatePicker.Wrapper = Wrapper\nDatePicker.WrapperWithData = WrapperWithData\nDatePicker.CalendarIcon = CalendarIcon\nDatePicker.Text = Text\nDatePicker.ExpandedTitle = ExpandedTitle\nDatePicker.Location = Location\nDatePicker.Dates = Dates\n\nexport default DatePicker\n","// React\nimport React, { Fragment, useMemo } from 'react'\nimport { compose } from 'redux'\n\n// Components\nimport BDatePicker, { HostStyles } from './styles-next'\n\n// Libraries\nimport { faCalendar as farCalendar } from '@fortawesome/pro-regular-svg-icons'\n\n// Hooks\nimport { useOrm, shallowEqual } from 'shared/utils/useOrm'\nimport { useOpeningHours } from 'shared/utils/useOpeningHours'\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useDatePicker } from './hooks'\nimport { useSelector } from 'react-redux'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport { isLocationInputEnabled, isDaySelectable, isTimeSelectable } from 'ui/components/Picker/utils'\n\nconst getLabelKey = (pricingEnabled, availabilityEnabled) => {\n if (pricingEnabled && availabilityEnabled) {\n return 'user.store.view_prices_and_availability'\n }\n\n if (pricingEnabled && !availabilityEnabled) {\n return 'user.store.view_prices'\n }\n\n if (!pricingEnabled && availabilityEnabled) {\n return 'user.store.view_availability'\n }\n}\n\nconst ButtonNext = () => {\n const openingHours = useOpeningHours()\n\n const cartId = useSelector((state) => state.client.cartId)\n\n const cart = useOrm('carts', (carts) => {\n return carts.getById(cartId || window.booqableOptions.cart?.id)\n })\n const locations = useOrm('locations', (locations) => {\n return {\n count: locations.size(),\n start: locations.getById(cart?.start_location_id ?? window.booqableOptions.cart?.startLocationId),\n stop: locations.getById(cart?.stop_location_id ?? window.booqableOptions.cart?.stopLocationId)\n }\n }, shallowEqual)\n\n const useTimes = useSettings('store.use_times')\n const useAMOrPM = useSettings('dates.use_am_pm')\n const isPricingEnabled = useSettings('pricing.enabled')\n const isAvailabilityEnabled = useSettings('store.use_availability')\n\n const { toggle } = useDatePicker()\n\n const dates = {\n start: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stop: cart?.stops_at ?? window.booqableOptions.cart?.till\n }\n\n const isDelivery = cart?.data?.fulfillment_type === 'delivery'\n\n const isStartValid = useMemo(\n () =>\n isDaySelectable({\n type: 'start',\n openingHours,\n date: dates.start,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }) &&\n isTimeSelectable({\n type: 'start',\n openingHours,\n date: dates.start,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }),\n [dates.start, dates.stop, openingHours]\n )\n\n const isStopValid = useMemo(\n () =>\n isDaySelectable({\n type: 'stop',\n openingHours,\n date: dates.stop,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }) &&\n isTimeSelectable({\n type: 'stop',\n openingHours,\n date: dates.stop,\n values: {\n starts_at: dates.start,\n stops_at: dates.stop\n }\n }),\n [dates.start, dates.stop, openingHours]\n )\n\n const { t } = useTranslation('user')\n\n const hasLocations = locations.count > 1 && (isLocationInputEnabled('start') || isLocationInputEnabled('stop'))\n const hasData = hasLocations ?\n !!dates.start && !!dates.stop && !!locations.start && !!locations.stop :\n !!dates.start && !!dates.stop\n\n let timeFormat = ''\n\n if (useTimes) {\n timeFormat = useAMOrPM ? ' hh:mm A' : ' HH:mm'\n }\n\n const labelKey = getLabelKey(isPricingEnabled, isAvailabilityEnabled)\n\n if (!cart) return null\n\n if (!hasData) {\n return (\n <Fragment>\n <HostStyles />\n <BDatePicker>\n <BDatePicker.Wrapper onClick={() => toggle(true)}>\n <BDatePicker.CalendarIcon icon={farCalendar} />\n <BDatePicker.Text>\n {t('user.store.select_a_period')}\n {labelKey && <BDatePicker.ExpandedTitle>; {t(labelKey)}</BDatePicker.ExpandedTitle>}\n </BDatePicker.Text>\n </BDatePicker.Wrapper>\n </BDatePicker>\n </Fragment>\n )\n }\n\n return (\n <Fragment>\n <HostStyles />\n <BDatePicker>\n <BDatePicker.WrapperWithData onClick={() => toggle(true)}>\n {hasLocations && !isDelivery && (\n <BDatePicker.Location>\n {locations.start?.name ?? t('user.store.start_location')}\n </BDatePicker.Location>\n )}\n <BDatePicker.Dates isValid={isStartValid && isStopValid}>\n {dates.start && (\n <Fragment>\n {FormatUtils.date(dates.start, 'MMM D[,] YYYY')}\n {useTimes && FormatUtils.date(dates.start, timeFormat)}\n </Fragment>\n )}\n - \n {dates.stop && (\n <Fragment>\n {FormatUtils.date(dates.stop, 'MMM D[,] YYYY')}\n {useTimes && FormatUtils.date(dates.stop, timeFormat)}\n </Fragment>\n )}\n </BDatePicker.Dates>\n </BDatePicker.WrapperWithData>\n </BDatePicker>\n </Fragment>\n )\n}\n\nconst decoratedComponent = compose(\n withStore,\n withTheme\n)(ButtonNext)\n\nexport default decoratedComponent\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport Button from './Button'\nimport ButtonNext from './ButtonNext'\n\n// Shared\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\n\nconst DatePicker = ({ version }) => {\n return version === 'next' ? <ButtonNext /> : <Button />\n}\n\nDatePicker.propTypes = {\n version: PropTypes.string\n}\n\nregisterCustomElement('bq-date-picker', DatePicker, {\n attributes: ['version']\n})\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { ModalCartPicker } from 'store/modules/cart/CartPicker/Modal'\n\n// Hooks\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useDatePicker } from './hooks'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useIsMobile } from 'shared/utils/useIsMobile'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\n\nconst Modal = () => {\n const { isOpen, toggle, close } = useDatePicker()\n\n const cartId = useSelector((state) => state.client.cartId)\n const cart = useOrm('carts', (carts) => carts.getById(cartId || window.booqableOptions.cart?.id))\n const brandingColor = useSettings('store.brand_color')\n\n const isMobile = useIsMobile()\n\n const { t } = useTranslation('user')\n\n const handleSave = () => {\n toggle(false)\n }\n\n if (!cart) return null\n\n return (\n <ModalCartPicker\n open={isOpen}\n cart={cart}\n onClose={close}\n onSaveCallback={handleSave}\n direction={isMobile ? 'vertical' : 'horizontal'}\n brandingColor={brandingColor}\n title={t('user.store.cart_title')}\n />\n )\n}\n\nModal.displayName = 'DatePickerModal'\n\nModal.propTypes = {\n cart: PropTypes.object,\n open: PropTypes.bool,\n onClose: PropTypes.func,\n brandingColor: PropTypes.string,\n t: PropTypes.func\n}\n\nconst decoratedComponent = compose(withStore, withTheme)(Modal)\n\nregisterCustomElement('bq-date-picker-modal', decoratedComponent, {\n styleSheetTarget: document.body\n})\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport BButton from 'ui/blocks/Button'\n\nexport const HostStyles = createGlobalStyle`\n :host, :root {\n --minicart-accent-color: var(--color-accent-background, ${color('branding')});\n --minicart-accent-text-color: var(--color-accent-foreground, ${color('white')});\n --minicart-accent-outline: var(--color-outline, ${color('Text/Primary')});\n --minicart-typo-color: var(--color-primary-foreground, ${color('Text/Primary')});\n --minicart-background-color: var(--color-primary-background, ${color('white')});\n --minicart-header-color: var(--color-accent-foreground, ${color('white')});\n --minicart-warning-color: ${color('Danger/Base')};\n /* Use HEX with alpha to get background colour */\n --minicart-warning-background-color: ${color('Danger/Base')}22;\n --minicart-border-radius: var(--border-radius-sm, 8px);\n --minicart-border-color: var(--color-border, ${color('Misc/Divider')});\n --minicart-padding: var(--horizontal-padding, 16px);\n --minicart-image-width: 56px;\n --minicart-z-index: 9999;\n\n --minicart-font: var(--font-body, Source Sans Pro, sans-serif);\n --minicart-font-size: 14px;\n --minicart-font-weight-normal: 400;\n --minicart-font-weight-bold: 600;\n }\n`\n\nexport const MiniCart = styled.div`\n position: fixed;\n\n top: 0;\n right: 0;\n\n display: none;\n flex-direction: column;\n\n height: 100%;\n width: 100%;\n\n min-height: 440px;\n min-width: 300px;\n\n background: var(--minicart-background-color);\n color: var(--minicart-typo-color);\n\n border-radius: var(--minicart-border-radius);\n box-shadow: 0 5px 40px rgba(0,0,0,0.16)!important;\n\n transition: all 100ms ease-in;\n\n overflow: hidden;\n overscroll-behavior: none;\n pointer-events: auto;\n\n font-family: var(--minicart-font);\n font-size: var(--minicart-font-size);\n\n ${({ open }) => open && css`\n display: flex;\n `}\n\n ${({ portal }) => portal && css`\n position: relative;\n width: 380px;\n height: 780px;\n max-height: 80vh;\n bottom: 0;\n right: 0;\n `}\n\n svg {\n height: 1em;\n }\n\n z-index: var(--minicart-z-index);\n`\n\nexport const Head = styled.div`\n border-radius: var(--minicart-border-radius) var(--minicart-border-radius) 0 0;\n width: 100%;\n z-index: 1;\n\n background: var(--minicart-accent-color);\n color: var(--minicart-header-color);\n\n p {\n margin: 0;\n color: var(--minicart-header-color);\n }\n\n`\n\nexport const Close = styled.a`\n cursor: pointer;\n\n position: absolute;\n right: 0;\n top: 0;\n\n padding: var(--minicart-padding);\n`\n\nexport const Title = styled.div`\n position: relative;\n\n display: flex;\n justify-content: space-between;\n\n padding: var(--minicart-padding);\n\n border-top-right-radius: var(--mincart-border-radius);\n border-top-left-radius: var(--mincart-border-radius);\n\n z-index: 2;\n`\n\nexport const Lines = styled.div`\n position: relative;\n\n flex-grow: 1;\n\n width: 100%;\n\n overflow-x: hidden;\n overflow-y: auto;\n\n overscroll-behavior: none;\n\n z-index: 0;\n\n & > ul {\n list-style: none;\n margin: 0;\n margin-block-start: 0;\n margin-block-end: 0;\n padding-inline: 0;\n }\n`\n\nexport const Notice = styled.div`\n display: flex;\n\n align-items: center;\n\n gap: var(--minicart-padding);\n\n padding: var(--minicart-padding);\n margin: var(--minicart-padding);\n margin-bottom: 0;\n\n background: var(--minicart-warning-background-color);\n color: var(--minicart-warning-color);\n\n font-size: var(--minicart-font-size);\n\n border-radius: var(--minicart-border-radius);\n\n ${({ inSummary }) => inSummary && css`\n margin-left: 0;\n margin-right: 0;\n margin-top: 0.8em;\n `}\n`\n\nexport const Cleanstate = styled.div`\n margin-top: 50%;\n\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n\n text-align: center;\n\n\n font-size: 1.1em;\n line-height: 1.6em;\n\n gap: var(--minicart-padding);\n\n ${BButton} button {\n background-color: var(--minicart-accent-color) !important;\n }\n\n svg {\n color: var(--minicart-accent-color);\n fill: var(--minicart-accent-color);\n }\n`\n\nexport const Summary = styled.div`\n position: relative;\n\n width: 100%;\n padding: var(--minicart-padding) 0;\n border-top: 1px solid var(--minicart-border-color);\n\n background: var(--minicart-background-color);\n\n box-shadow: 0px -4px 12px rgba(33, 59, 71, 0.12);\n box-sizing: border-box;\n\n z-index: 3;\n`\n\nexport const Detail = styled.div`\n font-size: var(--minicart-font-size);\n line-height: 1.4em;\n\n ${({ bold }) => bold && css`\n font-weight: var(--minicart-font-weight-bold);\n `}\n`\n\nexport const Amount = styled.span`\n float: right;\n`\n\nexport const PoweredBy = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 100%;\n\n padding-top: 16px;\n\n svg {\n filter: grayscale(100%);\n\n #icon {\n fill: var(--minicart-typo-color);\n }\n }\n\n &:hover {\n svg {\n filter: grayscale(0);\n }\n }\n\n a {\n display: flex;\n align-items: center;\n\n gap: 12px;\n\n font-size: 12px;\n color: var(--minicart-typo-color);\n\n opacity: 0.8;\n\n text-decoration: none;\n line-height: 20px;\n\n &:hover, &:active {\n opacity: 1;\n }\n }\n`\n\nexport const Button = styled.button`\n display: block;\n width: 100%;\n\n padding: 0.75em;\n\n border: none;\n border-radius: var(--minicart-border-radius);\n text-align: center;\n\n font-size: var(--minicart-font-size);\n font-weight: var(--minicart-font-weight-bold);\n\n text-decoration: none;\n cursor: pointer;\n\n background: var(--minicart-accent-color);\n color: var(--minicart-accent-text-color);\n border: 1px solid;\n border-color: var(--minicart-accent-color);\n\n ${({ invert }) => invert && css`\n border-color: var(--minicart-accent-outline);\n color: var(--minicart-accent-outline);\n background: var(--minicart-background-color);\n `}\n\n ${({ disabled }) => disabled && css`\n opacity: 0.5;\n pointer-events: none;\n `}\n`\n\nexport const CheckoutButtons = styled.div`\n display: flex;\n align-items: center;\n\n padding: 0 var(--minicart-padding);\n\n gap: var(--minicart-padding);\n\n margin-top: 0.8em;\n\n span {\n width: 100%;\n }\n`\n\nexport const CheckoutTotals = styled.div`\n padding: 0 var(--minicart-padding);\n`\n\nMiniCart.Head = Head\nMiniCart.Title = Title\nMiniCart.Lines = Lines\nMiniCart.Summary = Summary\nMiniCart.Detail = Detail\nMiniCart.Amount = Amount\nMiniCart.Close = Close\nMiniCart.Cleanstate = Cleanstate\nMiniCart.PoweredBy = PoweredBy\nMiniCart.CheckoutButtons = CheckoutButtons\nMiniCart.CheckoutTotals = CheckoutTotals\nMiniCart.Button = Button\nMiniCart.Notice = Notice\n\nexport default MiniCart\n","import styled, { css } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport FocalImage from 'ui/blocks/FocalImage'\n\nexport const Line = styled.div`\n position: relative;\n\n padding: var(--minicart-padding);\n\n font-size: var(--minicart-font-size);\n\n border-bottom: 1px solid var(--minicart-border-color);\n\n z-index: 2;\n\n &:last-child {\n border-bottom: 0;\n /* Extra margin so you can always see the last item */\n /* without overlapping with the services/powered by */\n margin-bottom: 90px;\n }\n`\n\nexport const Remove = styled.a`\n cursor: pointer;\n`\n\nexport const Image = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: var(--minicart-image-width);\n height: var(--minicart-image-width);\n\n & > ${FocalImage} {\n width: var(--minicart-image-width);\n height: var(--minicart-image-width);\n\n border-radius: var(--minicart-border-radius);\n }\n\n & > span {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: var(--minicart-image-width);\n height: var(--minicart-image-width);\n\n background: var(--color-image-placeholder, #fbfdfc);\n border: 1px solid var(--minicart-border-color);\n border-radius: var(--minicart-border-radius);\n }\n`\n\nexport const Quantity = styled.div`\n display: flex;\n\n align-items: center;\n\n line-height: 1.4em;\n\n user-select: none;\n\n /* Quantity number */\n & > span {\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 3.4em;\n height: 2.4em;\n\n border-top: 1px solid var(--minicart-border-color);\n border-bottom: 1px solid var(--minicart-border-color);\n }\n`\n\nexport const QuantityButton = styled.a`\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 2.4em;\n height: 2.4em;\n\n border: 1px solid var(--minicart-border-color);\n\n cursor: pointer;\n\n svg {\n opacity: 60%;\n }\n\n &:hover, &:active {\n svg {\n opacity: 100%;\n }\n }\n`\n\nexport const ProductName = styled.div`\n font-weight: var(--minicart-font-weight-bold);\n line-height: 1.4em;\n\n ${({ large }) => large && css`\n font-size: calc(1em + 1px);\n margin-bottom: 1.2em;\n `}\n`\n\nexport const Details = styled.div`\n display: flex;\n\n gap: 0.85em;\n\n & > div:not(${Image}) {\n width: 100%;\n }\n`\n\nexport const StatusIndicator = styled.span`\n margin-top: 0.3em;\n\n font-size: 0.85em;\n line-height: 1.2em;\n\n color: var(--color-primary-foreground);\n\n &::before {\n display: inline-block;\n content: '';\n\n width: 0.7em;\n height: 0.7em;\n\n margin-right: 0.3em;\n\n border-radius: 100%;\n\n ${({ available }) => available ?\n css`\n background: ${color('Success/Base')};\n ` :\n css`\n background: ${color('Danger/Base')};\n `}\n }\n`\n\nexport const Price = styled.div`\n display: flex;\n align-items: center;\n\n p {\n align-self: center;\n font-weight: var(--minicart-font-weight-bold);\n }\n\n svg {\n margin-right: 0.5em;\n }\n`\n\nexport const DetailContainer = styled.div`\n display: flex;\n justify-content: space-between;\n\n ${({ center }) => center && css`\n align-items: center;\n `}\n\n &:last-child {\n margin-top: calc(var(--minicart-padding) / 2);\n }\n`\n\nexport const BundleContents = styled.div`\n margin-top: var(--minicart-padding);\n`\n\nexport const BundleContentsTitle = styled.div`\n cursor: pointer;\n\n & > span {\n margin-right: 0.5em;\n }\n`\n\nexport const BundleContentsItem = styled.div`\n display: flex;\n align-items: center;\n\n gap: calc(var(--minicart-padding) / 2);\n margin-top: calc(var(--minicart-padding) / 2);\n\n ${Image} {\n width: calc(var(--minicart-image-width) / 2);\n height: calc(var(--minicart-image-width) / 2);\n\n ${FocalImage} {\n width: calc(var(--minicart-image-width) / 2);\n height: calc(var(--minicart-image-width) / 2);\n border-radius: calc(var(--minicart-border-radius) / 2);\n }\n\n span {\n width: calc(var(--minicart-image-width) / 2);\n height: calc(var(--minicart-image-width) / 2);\n border-radius: calc(var(--minicart-border-radius) / 2);\n }\n }\n`\n\nexport const BundleContentsQuantity = styled.div`\n /* TODO: Get this color somewhere else */\n color: ${color('Text/Secondary')};\n`\n\nLine.Remove = Remove\nLine.Quantity = Quantity\nLine.QuantityButton = QuantityButton\nLine.ProductName = ProductName\nLine.Details = Details\nLine.StatusIndicator = StatusIndicator\nLine.Image = Image\nLine.Price = Price\nLine.DetailContainer = DetailContainer\nLine.BundleContents = BundleContents\nLine.BundleContentsTitle = BundleContentsTitle\nLine.BundleContentsItem = BundleContentsItem\nLine.BundleContentsQuantity = BundleContentsQuantity\n\nexport default Line\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport BLine from 'shop-components/components/MiniCart/styles/Line'\nimport FocalImage from 'ui/components/FocalImage'\n\n// Shared\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\n\nconst BundleItem = ({ product, photo, quantity }) => {\n if (!product) return null\n\n return (\n <BLine.BundleContentsItem>\n <BLine.Image>\n <FocalImage coordinates={photo?.coordinates ?? { x: 0, y: 0 }} url={photo?.url ?? NO_PRODUCT_IMAGE} />\n </BLine.Image>\n <BLine.BundleContentsQuantity>{quantity}x</BLine.BundleContentsQuantity>\n <div>{product.name}</div>\n </BLine.BundleContentsItem>\n )\n}\n\nBundleItem.displayName = 'BundleItem'\n\nBundleItem.propTypes = {\n product: PropTypes.object,\n photo: PropTypes.object,\n quantity: PropTypes.number\n}\n\nconst mapStateToProps = (state, props) => {\n const product = state.orm.products.getById(props.id)\n const photo = state.orm.photos.getById(product?.photo_id)\n\n return {\n product,\n photo\n }\n}\n\nexport default reduxConnect(mapStateToProps)(BundleItem)\n","// React\nimport React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faChevronDown as farChevronDown,\n faChevronUp as farChevronUp,\n faSpinnerThird as farSpinnerThird\n} from '@fortawesome/pro-regular-svg-icons'\n\n// Components\nimport BLine from 'shop-components/components/MiniCart/styles/Line'\nimport BundleItem from './BundleItem'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport ItemActions from 'back_office/v2/redux/actions/item_actions'\n\nexport const BundleContents = ({ line, fetchItems, t }) => {\n const [open, setOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n const handleToggleOpen = () => {\n if (!loaded && !open) {\n setLoading(true)\n\n fetchItems(line.items.map((item) => item.item_id))\n .then(() => {\n setOpen(true)\n setLoaded(true)\n })\n .finally(() => {\n setLoading(false)\n })\n\n return\n }\n\n setOpen((prev) => !prev)\n }\n\n return (\n <BLine.BundleContents>\n <BLine.BundleContentsTitle onClick={handleToggleOpen}>\n {t('user.store.bundle_contents')}\n {' '}\n {line.items?.length > 0 && <span>({line.items.length})</span>}\n {!loading && <FontAwesomeIcon icon={open ? farChevronUp : farChevronDown} />}\n {loading && <FontAwesomeIcon icon={farSpinnerThird} spin />}\n </BLine.BundleContentsTitle>\n {open && line.items.map(({ item_id: id, quantity }, index) => (\n <BundleItem\n key={`${id}-${index}`}\n id={id}\n quantity={quantity}\n />\n ))}\n </BLine.BundleContents>\n )\n}\n\nBundleContents.displayName = 'LineBundleContents'\n\nBundleContents.propTypes = {\n line: PropTypes.object,\n fetchItems: PropTypes.func,\n t: PropTypes.func\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n fetchItems: (ids) => {\n return ItemActions.fetchAll({\n apiVersion: '4',\n include: ['photo'],\n filter: {\n id: ids\n },\n page: {\n size: 1000\n }\n })\n }\n }\n}\n\nexport default compose(reduxConnect(null, mapDispatchToProps), withTranslation('user'))(BundleContents)\n","// React\nimport React, { Fragment, useState, useEffect, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport _debounce from 'lodash/debounce'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faCircleInfo as farCircleInfo,\n faImage as farImage,\n faMinus as farMinus,\n faPlus as farPlus\n} from '@fortawesome/pro-regular-svg-icons'\nimport { faTimes as fasTimes } from '@fortawesome/pro-solid-svg-icons'\n\n// Components\nimport BundleContents from './BundleContents'\nimport BLine from 'shop-components/components/MiniCart/styles/Line'\nimport Tooltip from 'ui/components/Tooltip'\nimport FocalImage from 'ui/components/FocalImage'\n\n// Shared\nimport Format from 'shared/utils/format'\nimport cartActions from 'store/v2/redux/actions/cart'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\n\nexport const Line = ({ line, useAvailability, hasDates, t, currency, showPrices, hideProductAvailabilityQuantities, updateLineQuantity }) => {\n const [quantity, setQuantity] = useState(line.quantity || 1)\n const [deleting, setDeleting] = useState(false)\n const available = line.available_quantity >= quantity\n\n useEffect(() => {\n setQuantity(line.quantity)\n }, [line])\n\n const debouncedUpdateLineQuantity = useCallback(\n window.testMode ? updateLineQuantity : _debounce(updateLineQuantity, 1500),\n []\n )\n\n const handleRemoveLine = () => {\n setDeleting(true)\n updateLineQuantity(0)\n }\n\n const handleIncreaseQuantity = () => {\n const newQuantity = quantity + 1\n\n setQuantity(newQuantity)\n debouncedUpdateLineQuantity(newQuantity)\n }\n\n const handleDecreaseQuantity = () => {\n const newQuantity = quantity - 1\n\n if (newQuantity <= 0) {\n handleRemoveLine()\n } else {\n setQuantity(newQuantity)\n debouncedUpdateLineQuantity(newQuantity)\n }\n }\n\n if (line.line_type === 'delivery_rate') return null\n\n return (\n <BLine key={line.title}>\n <BLine.Details>\n <BLine.Image>\n {line?.photo_url && (\n <FocalImage url={line.photo_url} />\n )}\n {!line?.photo_url && (\n <span>\n <FontAwesomeIcon icon={farImage} size=\"lg\" />\n </span>\n )}\n </BLine.Image>\n <div>\n <BLine.DetailContainer center>\n <div>\n <BLine.ProductName large={!useAvailability}>{line.title}</BLine.ProductName>\n {hasDates && useAvailability && (\n <BLine.StatusIndicator available={available}>\n {!hideProductAvailabilityQuantities && (\n <Fragment>\n <span>{line.available_quantity}</span> {t('user.store.available')}\n </Fragment>\n )}\n {hideProductAvailabilityQuantities && (\n <Fragment>\n {t(available ? 'user.store.available' : 'user.store.unavailable')}\n </Fragment>\n )}\n </BLine.StatusIndicator>\n )}\n </div>\n <BLine.Remove data-tid=\"Remove product\" onClick={deleting ? null : handleRemoveLine}>\n <FontAwesomeIcon icon={fasTimes} />\n </BLine.Remove>\n </BLine.DetailContainer>\n <BLine.DetailContainer>\n <BLine.Quantity>\n <BLine.QuantityButton onClick={deleting ? null : handleDecreaseQuantity}>\n <FontAwesomeIcon icon={farMinus} />\n </BLine.QuantityButton>\n <span>{quantity}</span>\n <BLine.QuantityButton onClick={handleIncreaseQuantity}>\n <FontAwesomeIcon icon={farPlus} />\n </BLine.QuantityButton>\n </BLine.Quantity>\n {showPrices && line.display_price_in_cents > 0 && (\n <BLine.Price>\n {showPrices && !line.discountable && (\n <Tooltip direction=\"bottom\" content={t('user.store.not_discountable_hint')}>\n <FontAwesomeIcon icon={farCircleInfo} />\n </Tooltip>\n )}\n <p>{Format.money(line.display_price_in_cents, currency)}</p>\n </BLine.Price>\n )}\n </BLine.DetailContainer>\n </div>\n </BLine.Details>\n {line.product_type === 'bundle' && <BundleContents line={line} />}\n </BLine>\n )\n}\n\nLine.propTypes = {\n line: PropTypes.object,\n useAvailability: PropTypes.bool,\n hasDates: PropTypes.bool,\n currency: PropTypes.object,\n showPrices: PropTypes.bool,\n hideProductAvailabilityQuantities: PropTypes.bool,\n updateLineQuantity: PropTypes.func,\n t: PropTypes.func\n}\n\nLine.displayName = 'Line'\n\nconst mapStateToProps = (state, props) => {\n return {\n currency: state.client.currency.toJS(),\n useAvailability: state.settings.get('store.use_availability') && props.line.tracking_type !== 'none',\n showPrices: state.settings.get('store.use_prices'),\n hideProductAvailabilityQuantities: state.settings.get('store.hide_product_availability_quantities')\n }\n}\n\nconst mapDispatchToProps = (_, props) => {\n return {\n updateLineQuantity: (quantity) => {\n if (quantity < 0) {\n return\n }\n\n return cartActions\n .book({\n item_id: props.line.item_id,\n line_id: props.line.id,\n quantity,\n type: 'set'\n })\n .then(() => {\n const quantityChange = quantity - props.line.quantity\n\n triggerUserFrameworkBookEvent(props.line.item_id, quantityChange)\n })\n }\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps, mapDispatchToProps))(Line)\n","// React\nimport React, { Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\n\n// Components\nimport BMiniCart from 'shop-components/components/MiniCart/styles'\nimport Button from 'ui/components/Button'\nimport Line from './Line'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faTriangleExclamation as farTriangleExclamation,\n faSpinnerThird as farSpinnerThird\n} from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport clientActions from 'store/v2/redux/actions/client'\n\nexport const Lines = ({ hasDates, cannotCheckout, lines, toggleCart, showPoweredBy, loading, t }) => {\n useEffect(() => {\n return () => {\n clientActions.setCartScroll(0)\n }\n }, [])\n\n return (\n <Fragment>\n {hasDates && cannotCheckout && (\n <BMiniCart.Notice>\n <FontAwesomeIcon icon={farTriangleExclamation} size=\"lg\" />\n {t('user.store.not_all_products_available')}\n </BMiniCart.Notice>\n )}\n {lines.size() > 0 && !loading && (\n <ul>\n <li>\n {lines.map((line) => {\n return <Line key={line.id} line={line} hasDates={hasDates} />\n })}\n </li>\n </ul>\n )}\n {!lines.size() && (\n <BMiniCart.Cleanstate>\n {loading && (\n <FontAwesomeIcon icon={farSpinnerThird} spin />\n )}\n {!loading && (\n <Fragment>\n {t('user.store.cart_empty')}\n <Button onClick={toggleCart.bind(null, false)} size=\"sm\">\n {t('user.store.continue_shopping')}\n </Button>\n </Fragment>\n )}\n </BMiniCart.Cleanstate>\n )}\n {lines.size() === 0 && showPoweredBy && (\n <BMiniCart.PoweredBy cleanstate>\n <PoweredBy logoWidth=\"24px\" />\n </BMiniCart.PoweredBy>\n )}\n </Fragment>\n )\n}\n\nLines.displayName = 'Lines'\nLines.propTypes = {\n hasDates: PropTypes.bool,\n cannotCheckout: PropTypes.bool,\n lines: PropTypes.object,\n toggleCart: PropTypes.func,\n showPoweredBy: PropTypes.bool,\n loading: PropTypes.bool,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const { cartOpen } = state.client\n\n return {\n cartOpen,\n lines: state.orm.lines.getAll({ id: props.cart?.lines }).filter(({ product_type: type }) => type !== 'service'),\n showPoweredBy: state.settings.get('store.show_powered_by')\n }\n}\n\nexport default compose(\n withTranslation('user'),\n reduxConnect(mapStateToProps)\n)(Lines)\n","import styled from 'styled-components'\nimport { size } from 'ui/themes/utils'\n\nimport Icon from 'ui/blocks/Icon'\n\nexport const Period = styled.div`\n cursor: pointer;\n\n ${Icon} {\n font-size: 12px;\n margin: 0 ${size('margin', 'xs')};\n\n &:last-child {\n margin-right: 0;\n }\n }\n`\n\nexport const Details = styled.div`\n display: flex;\n flex-flow: row nowrap;\n\n align-items: center;\n\n gap: ${size('margin', 'sm')};\n\n font-size: 14px;\n text-align: left;\n`\n\nexport const Detail = styled.div`\n flex: 1;\n\n &:last-child {\n text-align: right;\n }\n`\n\nexport const Location = styled.p`\n font-size: 12px !important;\n line-height: 16px;\n font-weight: 400 !important;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`\n\nexport const DateTime = styled.p`\n font-size: 13px !important;\n line-height: 16px;\n font-weight: 600 !important;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:first-letter {\n text-transform: uppercase;\n }\n`\n\nexport const ChoosePeriod = styled.p`\n width: 100%;\n`\n\nexport const Dates = styled.div`\n width: calc(100% - var(--minicart-padding) * 2);\n\n padding: 14px !important;\n\n font-size: 12px !important;\n line-height: 16px !important;\n text-align: center;\n\n background: rgba(0, 0, 0, 0.16);\n border-radius: 8px;\n`\n\nconst DatesBase = styled.div`\n position: relative;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n padding-bottom: var(--minicart-padding);\n`\n\nexport const WithDates = styled(DatesBase)`\n ${Icon} {\n line-height: 16px;\n align-self: flex-start;\n\n &:last-child {\n position: absolute;\n\n top: 50%;\n right: ${size('padding', 'md')};\n\n transform: translateY(-50%);\n }\n }\n`\n\nexport const NoDates = styled(DatesBase)`\n ${Icon} {\n &:last-child {\n position: absolute;\n\n top: 50%;\n right: ${size('padding', 'md')};\n\n transform: translateY(-50%);\n }\n }\n`\n\nexport const Placeholder = styled.p`\n font-size: 14px !important;\n`\n\nPeriod.Dates = Dates\nPeriod.Details = Details\nPeriod.Detail = Detail\nPeriod.Location = Location\nPeriod.DateTime = DateTime\nPeriod.NoDates = NoDates\nPeriod.WithDates = WithDates\nPeriod.ChoosePeriod = ChoosePeriod\nPeriod.Placeholder = Placeholder\n\nexport default Period\n","// React\nimport React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport BPeriod from '../styles/Period'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowRight as farArrowRight } from '@fortawesome/pro-regular-svg-icons'\n\n// Libraries\nimport { withTranslation } from 'shared/utils/withTranslation'\n\n// Shared\n\nimport Format from 'shared/utils/format'\nimport ClientActions from 'store/v2/redux/actions/client'\n\nexport const Period = ({\n autoOpenedModal,\n onAutoModal,\n hasDates,\n open,\n modalOpen,\n openDatePicker,\n cart,\n locations,\n useTimes,\n t,\n timeFormat\n}) => {\n useEffect(() => {\n if (!autoOpenedModal && open && !hasDates && !modalOpen) {\n onAutoModal(() => {\n openDatePicker()\n })\n }\n }, [autoOpenedModal, open, hasDates, modalOpen])\n\n const handleOpenModal = () => {\n openDatePicker()\n }\n\n const hasLocations = locations.size() > 1\n\n return (\n <BPeriod data-tid=\"Select dates\" onClick={handleOpenModal}>\n {hasDates && (\n <BPeriod.WithDates className=\"bq-selected-dates\">\n <BPeriod.Dates>\n <BPeriod.Details>\n <BPeriod.Detail>\n <BPeriod.DateTime>\n {Format.date(cart?.starts_at, 'date')}\n {useTimes && `, ${Format.date(cart?.starts_at, timeFormat)}`}\n </BPeriod.DateTime>\n {hasLocations && (\n <BPeriod.Location>\n {cart?.start_location_id ? locations.getById(cart.start_location_id)?.name : null}\n </BPeriod.Location>\n )}\n </BPeriod.Detail>\n <FontAwesomeIcon icon={farArrowRight} />\n <BPeriod.Detail>\n <BPeriod.DateTime>\n {Format.date(cart?.stops_at, 'date')}\n {useTimes && `, ${Format.date(cart?.stops_at, timeFormat)}`}\n </BPeriod.DateTime>\n {hasLocations && (\n <BPeriod.Location>\n {cart?.stop_location_id ? locations.getById(cart.stop_location_id)?.name : null}\n </BPeriod.Location>\n )}\n </BPeriod.Detail>\n </BPeriod.Details>\n </BPeriod.Dates>\n </BPeriod.WithDates>\n )}\n {!hasDates && (\n <BPeriod.NoDates className=\"bq-branded-border\">\n <BPeriod.Dates>\n <BPeriod.ChoosePeriod>{t('user.store.select_a_period')}</BPeriod.ChoosePeriod>\n </BPeriod.Dates>\n </BPeriod.NoDates>\n )}\n </BPeriod>\n )\n}\n\nPeriod.displayName = 'Period'\n\nPeriod.propTypes = {\n cart: PropTypes.object,\n hasDates: PropTypes.bool,\n useTimes: PropTypes.bool,\n timeFormat: PropTypes.string,\n locations: PropTypes.object,\n openDatePicker: PropTypes.func,\n onAutoModal: PropTypes.func,\n autoOpenedModal: PropTypes.bool,\n open: PropTypes.bool,\n modalOpen: PropTypes.bool,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n let timeFormat\n\n if (state.settings.get('dates.use_am_pm')) {\n timeFormat = 'hh:mm A'\n } else {\n timeFormat = 'HH:mm'\n }\n\n return {\n locale: state.client.locale,\n timeFormat,\n useTimes: state.settings.get('store.use_times'),\n open: state.client.cartOpen,\n modalOpen: state.client.modalPickerOpen\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n openDatePicker: () => ClientActions.toggleModalPicker(true)\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps, mapDispatchToProps))(Period)\n","import styled, { css } from 'styled-components'\nimport { size } from 'ui/themes/utils'\n\nexport const Services = styled.div`\n padding: 0 var(--minicart-padding);\n padding-bottom: 12px;\n margin-bottom: 16px;\n\n border-bottom: 1px solid var(--minicart-border-color);\n\n color: var(--minicart-typo-color);\n\n font-size: var(--minicart-font-size);\n\n height: ${({ open, headerHeight }) => open ?\n css`150px` :\n css`${headerHeight}px`\n };\n max-height: 150px;\n\n overflow: ${({ open }) => open ? 'auto' : 'hidden'};\n position: relative;\n\n transition: height 0.3s ease, max-height 0.3s ease;\n`\n\nexport const Header = styled.div`\n display: grid;\n grid-template-columns: 1fr repeat(2, max-content);\n gap: ${size('margin', 'xs')};\n\n position: sticky;\n top: 0;\n left: 0;\n\n padding-bottom: var(--minicart-padding);\n background-image: ${({ open }) => css`linear-gradient(\n to bottom,\n var(--minicart-background-color) 60%,\n color-mix(in srgb, var(--minicart-background-color) ${open ? 0 : 100}%, transparent)\n )`};\n\n align-items: center;\n justify-content: space-between;\n\n font-size: var(--minicart-font-size);\n\n cursor: pointer;\n`\n\nexport const Title = styled.span``\n\nexport const Total = styled.span`\n font-weight: var(--minicart-font-weight-bold);\n`\n\nexport const Service = styled.div`\n display: flex;\n align-items: center;\n\n label {\n margin: 0;\n }\n\n & > span {\n margin-right: 0.9em;\n cursor: pointer;\n }\n\n & > span:last-child {\n margin-left: auto;\n margin-right: 0;\n\n font-weight: var(--minicart-font-weight-bold);\n\n cursor: default;\n }\n\n &:not(:last-child) {\n margin-bottom: 0.7em;\n }\n`\n\nServices.Header = Header\nServices.Service = Service\nServices.Title = Title\nServices.Total = Total\n\nexport default Services\n","// React\nimport React, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Libraries\n\n// Components\nimport BServices from 'shop-components/components/MiniCart/styles/Services'\nimport Checkbox from 'ui/components/Checkbox'\nimport ProductPrice from 'store/v2/react/components/product_price'\n\n// Shared\nimport cartActions from 'store/v2/redux/actions/cart'\nimport { triggerUserFrameworkBookEvent } from 'shared/utils/userFrameworkEvents'\n\nexport const Service = ({ inCart, toggleService, service, line, hasPrice }) => {\n const [checked, setChecked] = useState(false)\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n setChecked(inCart)\n }, [inCart])\n\n const handleChangeService = () => {\n if (loading) return\n\n const value = !checked\n\n setChecked((prev) => !prev)\n setLoading(true)\n\n toggleService(value).then(() => {\n setChecked(inCart)\n setLoading(false)\n })\n }\n\n const renderPrice = () => {\n return (\n <ProductPrice\n chargeLabel={(line || service).charge_label}\n priceInCents={line?.display_price_in_cents || service?.price_in_cents}\n priceType={(line || service).price_type}\n productType={(line || service).product_type}\n />\n )\n }\n\n return (\n <BServices.Service>\n <span>\n <Checkbox\n id={service.id}\n field={{\n value: checked,\n onChange: handleChangeService\n }}\n disabled={loading}\n />\n </span>\n <span onClick={handleChangeService}>{service.name}</span>\n {hasPrice && <span>{renderPrice()}</span>}\n </BServices.Service>\n )\n}\n\nService.displayName = 'Service'\nService.propTypes = {\n service: PropTypes.object.isRequired,\n line: PropTypes.object,\n inCart: PropTypes.bool.isRequired,\n toggleService: PropTypes.func.isRequired,\n hasPrice: PropTypes.bool\n}\n\nconst mapStateToProps = (state, props) => {\n const hasPrice =\n props.service &&\n props.service.price_in_cents >= 0 &&\n props.service.price_in_cents !== null &&\n props.service.price_type !== 'none'\n\n return {\n line: props.lines.getAll({ item_id: props.service.id }).reverse().first(),\n hasPrice\n }\n}\n\nconst mapDispatchToProps = (state, props) => {\n const book = (quantity) => {\n return cartActions\n .book({\n item_id: props.service.id,\n quantity,\n type: 'set'\n })\n .then((response) => {\n const quantityChange = quantity === 0 ? -1 : 1\n\n triggerUserFrameworkBookEvent(props.service.id, quantityChange)\n })\n }\n\n return {\n toggleService: (value) => {\n if (value) {\n return book(1)\n } else {\n return book(0)\n }\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(Service)\n","// React\nimport React, { useState, useEffect, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport _intersection from 'lodash/intersection'\n\n// Components\nimport BServices from 'shop-components/components/MiniCart/styles/Services'\nimport Service from './Service'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faChevronUp as farChevronUp, faChevronDown as farChevronDown } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport ProductGroupActions from 'store/v2/redux/actions/product_group'\n\nexport const Services = ({ cart, lines, currency, services, servicesPrice, cartItemIds, t }) => {\n const prevCartRef = useRef(cart)\n const headerElementRef = useRef(null)\n\n const [open, setOpen] = useState(true)\n\n useEffect(() => {\n ProductGroupActions.fetchServices({ cart_id: cart.id })\n }, [cart.id])\n\n useEffect(() => {\n const previousCart = prevCartRef.current\n const newCart = !previousCart && cart\n const fromChanged = cart && !newCart ? previousCart.starts_at !== cart.starts_at : false\n const tillChanged = cart && !newCart ? previousCart.stops_at !== cart.stops_at : false\n\n if (cart && (newCart || fromChanged || tillChanged)) {\n ProductGroupActions.fetchServices({ cart_id: cart ? cart.id : undefined })\n }\n\n prevCartRef.current = cart\n }, [cart])\n\n const isServiceInCart = (serviceId) => {\n return cartItemIds.includes(serviceId)\n }\n\n const handleToggleOpen = () => {\n setOpen((prev) => !prev)\n }\n\n const renderServices = () => {\n return services.map((service) => (\n <Service key={service.id} lines={lines} service={service} inCart={isServiceInCart(service.id)} />\n ))\n }\n\n if (!services?.size()) {\n return null\n }\n\n return (\n <BServices open={open} headerHeight={headerElementRef.current?.getBoundingClientRect().height}>\n <BServices.Header ref={headerElementRef} open={open} onClick={handleToggleOpen}>\n <BServices.Title>{t('user.store.additional_services')}</BServices.Title>\n <BServices.Total>{FormatUtils.money(servicesPrice, currency)}</BServices.Total>\n <FontAwesomeIcon icon={open ? farChevronUp : farChevronDown} />\n </BServices.Header>\n {renderServices()}\n </BServices>\n )\n}\n\nServices.displayName = 'ServiceLines'\nServices.propTypes = {\n cart: PropTypes.object,\n currency: PropTypes.object,\n lines: PropTypes.object,\n services: PropTypes.object,\n servicesPrice: PropTypes.number,\n cartItemIds: PropTypes.object,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const currency = state.client.currency.toJS()\n const lines = state.orm.lines.getAll({ id: props.cart?.lines })\n const cartItemIds = lines.map((line) => line.item_id)\n const services = state.orm.product_groups.getAll({ product_type: 'service', show_in_store: true })\n const enabledServices = state.orm.products\n .getAll({ product_type: 'service', product_group_id: services.pluck('id') })\n .sortBy((service) => services.getById(service.product_group_id).sorting_weight)\n\n const selectedServices = lines.getAll({ item_id: _intersection(cartItemIds.toArray(), enabledServices.pluck('id')) })\n const servicesPrice = selectedServices.toArray().reduce((sum, { display_price_in_cents: price }) => sum + price, 0)\n\n return {\n currency,\n lines,\n services: enabledServices,\n servicesPrice,\n cartItemIds\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps))(Services)\n","// Hooks\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useSelector } from 'react-redux'\n\n// Shared\nimport previewUrlComposer from 'shared/utils/previewUrlComposer'\n\nexport const useCart = () => {\n const cartId = useSelector((state) => state.client.cartId)\n const companySlug = useSelector((state) => state.client.getIn(['company', 'slug']))\n\n const cart = useOrm('carts', (carts) => carts.getById(cartId))\n\n const taxStrategy = useSettings('pricing.tax_strategy')\n const showPrices = useSettings('store.use_prices')\n\n const currency = useSelector((state) => state.client.currency)\n\n const isOverdue = useSelector((state) => state.client.cartOverdue)\n const isEmpty = useOrm('lines', (lines) => {\n return lines.getAll({\n id: cart?.lines,\n product_type: ['rental', 'consumable', 'bundle']\n }).size() === 0\n })\n\n const searchParams = new URLSearchParams(window.location.search)\n const viewCartHref = window.booqableOptions.preview ?\n previewUrlComposer({ slug: companySlug, themeId: searchParams.get('theme_id'), key: 'templates/cart.json' }) :\n cart?.cart_url\n\n let totalPriceAttribute\n\n if (taxStrategy === 'inclusive') {\n totalPriceAttribute = 'grand_total_with_tax_in_cents'\n } else {\n totalPriceAttribute = 'grand_total_in_cents'\n }\n\n return {\n cart,\n totalPriceAttribute,\n showPrices,\n taxStrategy,\n currency: currency?.toJS(),\n isOverdue,\n isEmpty,\n viewCartHref\n }\n}\n","// React\nimport React, { Fragment, useState, useCallback, useEffect } from 'react'\nimport { compose } from 'redux'\n\n// Components\nimport BMiniCart, { HostStyles } from 'shop-components/components/MiniCart/styles'\nimport Lines from 'shop-components/components/MiniCart/components/Lines'\nimport Period from 'shop-components/components/MiniCart/components/Period'\nimport Services from 'shop-components/components/MiniCart/components/Services'\nimport { PoweredBy } from 'shop-components/components/PoweredBy'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faTimes as farTimes,\n faTriangleExclamation as farTriangleExclamation\n} from '@fortawesome/pro-regular-svg-icons'\n\n// Hooks\nimport { useCart } from 'shop-components/utils/useCart'\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useSelector } from 'react-redux'\nimport { useSettings } from 'shared/utils/useSettings'\nimport { useIsMobile } from 'shared/utils/useIsMobile'\n\n// Shared\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport ClientActions from 'store/v2/redux/actions/client'\nimport LineActions from 'back_office/v2/redux/actions/line_actions'\nimport Format from 'shared/utils/format'\n\nexport const MiniCart = () => {\n let cannotCheckout = false\n\n const isMobile = useIsMobile()\n\n const [autoOpenedModal, setAutoOpenedModal] = useState(false)\n const [isLoading, setIsLoading] = useState(true)\n\n const { cart, totalPriceAttribute, showPrices, isOverdue, viewCartHref } = useCart()\n\n const currency = useSelector((state) => state.client.currency)?.toJS()\n\n const locations = useOrm('locations', (locations) => {\n return locations.getAll().sort('name')\n })\n const lines = useOrm('lines', (lines) => {\n return lines.getAll({ id: cart?.lines }).filter(({ product_type: type }) => type !== 'service')\n })\n const unavailableLines = useOrm('lines', (lines) => {\n return lines\n .getAll({\n id: cart?.lines,\n can_checkout: false\n })\n .filter((line) => line.line_type !== 'delivery_rate')\n })\n\n const showPoweredBy = useSettings('store.show_powered_by')\n const useAvailability = useSettings('store.use_availability')\n\n const isCartOpen = useSelector((state) => state.client.cartOpen)\n const isCheckingOut = useSelector((state) => state.client.checkingOut)\n\n const { t } = useTranslation('user')\n\n useEffect(() => {\n const fetchLines = async (cartId) => {\n return LineActions.fetchAll({\n apiVersion: 'boomerang',\n include: [\n 'item',\n 'item.photo',\n 'item.bundle_items',\n 'item.bundle_items.product',\n 'item.bundle_items.product.photo'\n ],\n filter: {\n owner_id: cartId\n }\n })\n }\n\n if (cart?.id) {\n fetchLines(cart.id).finally(() => {\n setIsLoading(false)\n })\n }\n }, [cart?.id])\n\n const hasDates = !!(cart?.starts_at && cart?.stops_at)\n\n if (useAvailability) {\n cannotCheckout = unavailableLines.size() > 0\n }\n\n const isCheckoutButtonValid = !!(cart?.lines.length && hasDates && !cannotCheckout && !isOverdue)\n\n // Needs to live in parent state as Period gets unmounted\n // on some transitions losing state\n const onAutoModal = useCallback(\n (callback) => {\n setAutoOpenedModal(true)\n callback?.()\n },\n [setAutoOpenedModal]\n )\n\n const setCheckingOut = (e) => {\n e.preventDefault()\n\n if (ClientActions.evaluateCartOverdue()) return\n\n ClientActions.setCheckingOut()\n }\n\n const toggleCart = (cartOpen) => {\n return ClientActions.toggleCart(cartOpen)\n }\n\n const viewCart = () => {\n window.location = window.Booqable.decorateLinkForTracking(viewCartHref)\n }\n\n return (\n <Fragment>\n <HostStyles />\n <BMiniCart open={isCartOpen} portal={!isMobile} data-tid=\"Mini cart\">\n <BMiniCart.Head>\n <BMiniCart.Title>\n <div>{t('user.store.cart_title')}</div>\n <BMiniCart.Close onClick={toggleCart.bind(null, false)}>\n <FontAwesomeIcon icon={farTimes} />\n </BMiniCart.Close>\n </BMiniCart.Title>\n <Period\n cart={cart}\n hasDates={hasDates}\n locations={locations}\n autoOpenedModal={autoOpenedModal}\n onAutoModal={onAutoModal}\n />\n </BMiniCart.Head>\n <BMiniCart.Lines>\n <Lines\n toggleCart={toggleCart}\n cart={cart}\n cannotCheckout={cannotCheckout}\n hasDates={hasDates}\n loading={isLoading}\n />\n </BMiniCart.Lines>\n {lines?.size() > 0 && (\n <BMiniCart.Summary>\n <Services cart={cart} showPoweredBy={showPoweredBy} />\n {showPrices && (\n <BMiniCart.CheckoutTotals>\n <BMiniCart.Detail bold>\n <span>{t('user.store.subtotal')}</span>\n <BMiniCart.Amount>{Format.money(cart?.get(totalPriceAttribute), currency)}</BMiniCart.Amount>\n </BMiniCart.Detail>\n\n {cart?.get('deposit_in_cents') > 0 && (\n <BMiniCart.Detail>\n <span>{t('user.store.security_deposit')}</span>\n <BMiniCart.Amount>{Format.money(cart.get('deposit_in_cents'), currency)}</BMiniCart.Amount>\n </BMiniCart.Detail>\n )}\n\n {isOverdue && (\n <BMiniCart.Notice inSummary>\n <FontAwesomeIcon icon={farTriangleExclamation} size=\"lg\" />\n {t('user.checkout.dates_in_past')}\n </BMiniCart.Notice>\n )}\n </BMiniCart.CheckoutTotals>\n )}\n <BMiniCart.CheckoutButtons>\n {viewCartHref && (\n <BMiniCart.Button onClick={viewCart} invert>\n {t('user.store.view_cart')}\n </BMiniCart.Button>\n )}\n <BMiniCart.Button onClick={setCheckingOut} disabled={!isCheckoutButtonValid || isCheckingOut}>\n {t('user.store.checkout')}\n </BMiniCart.Button>\n </BMiniCart.CheckoutButtons>\n {showPoweredBy && (\n <BMiniCart.PoweredBy>\n <PoweredBy logoWidth=\"24px\" />\n </BMiniCart.PoweredBy>\n )}\n </BMiniCart.Summary>\n )}\n </BMiniCart>\n </Fragment>\n )\n}\n\nregisterCustomElement('bq-minicart', compose(withStore, withTheme)(MiniCart))\n\nexport default MiniCart\n","// React\nimport React from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport Img from 'ui/elements/Img'\nimport FocalImage from 'ui/components/FocalImage'\n\n// Shared\nimport { optimizeImageUrl } from 'shared/utils/optimizeImageUrl'\n\nconst OptimizedImage = ({ focal, src, ...otherProps }) => {\n const optimizedSrc = optimizeImageUrl(src, { ...otherProps })\n\n if (focal) {\n return <FocalImage {...otherProps} url={optimizedSrc} coordinates={focal} />\n }\n\n return <Img {...otherProps} src={optimizedSrc} />\n}\n\nOptimizedImage.displayName = 'OptimizedImage'\n\nOptimizedImage.propTypes = {\n src: PropTypes.string.isRequired,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n quality: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n format: PropTypes.oneOf(['jpg', 'jpeg', 'png', 'webp']),\n focal: PropTypes.shape({\n x: PropTypes.any,\n y: PropTypes.any\n })\n}\n\nexport default OptimizedImage\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport FocalImage from 'ui/blocks/FocalImage'\nimport OptimizedImage from './components/OptimizedImage'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n /* Gallery */\n --product-gallery-direction: column;\n --product-gallery-gap: 12px;\n\n /* Large Preview */\n --product-gallery-preview-gap: 8px;\n --product-gallery-preview-border-radius: 0;\n\n /* Controls */\n --product-gallery-control-size: 40px;\n --product-gallery-control-padding: 0 10px;\n --product-gallery-control-border-radius: 6px;\n --product-gallery-control-background-color: ${color('white')}66;\n --product-gallery-control-icon-size: 20px;\n --product-gallery-control-icon-color: var(--color-typo, ${color('black')});\n --product-gallery-control-filter: blur(3px);\n\n /* Thumbnails */\n --product-gallery-thumbnail-direction: row;\n --product-gallery-thumbnail-border-radius: 6px;\n --product-gallery-thumbnail-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n --product-gallery-active-thumbnail-border: 1px solid var(--color-accent-background, ${color('branding')});\n --product-gallery-thumbnail-size: 64px;\n }\n\n * {\n box-sizing: border-box;\n }\n`\n\nconst ProductGallery = styled.div`\n display: flex;\n flex-direction: var(--product-gallery-direction);\n\n gap: var(--product-gallery-gap);\n`\n\nconst Wrapper = styled.div`\n position: relative;\n`\n\nconst Inner = styled.div`\n display: flex;\n align-items: center;\n\n overflow-x: auto;\n overflow-y: hidden;\n\n scroll-snap-type: x mandatory;\n\n gap: var(--horizontal-padding, 16px);\n\n position: relative;\n\n -ms-overflow-style: none;\n scrollbar-width: none;\n\n -webkit-overflow-scrolling: touch;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n ${({ noGap }) => noGap && css`\n gap: 0;\n `}\n`\n\nconst Item = styled.div`\n scroll-snap-align: start end;\n scroll-snap-stop: always;\n\n min-width: 100%;\n width: 100%;\n`\n\nconst Image = styled(OptimizedImage)`\n display: block;\n\n width: 100%;\n\n border-radius: var(--product-gallery-preview-border-radius);\n`\n\nconst Controls = styled.div`\n position: absolute;\n\n top: 50%;\n left: 0;\n right: 0;\n transform: translateY(-50%);\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n padding: var(--product-gallery-control-padding);\n\n pointer-events: none;\n\n z-index: 1000;\n`\n\nconst Control = styled.button`\n width: var(--product-gallery-control-size);\n height: var(--product-gallery-control-size);\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n border: none;\n border-radius: var(--product-gallery-control-border-radius);\n\n cursor: pointer;\n\n background-color: var(--product-gallery-control-background-color);\n backdrop-filter: var(--product-gallery-control-filter);\n\n pointer-events: all;\n\n svg {\n width: var(--product-gallery-control-icon-size);\n height: var(--product-gallery-control-icon-size);\n\n fill: var(--product-gallery-control-icon-color);\n color: var(--product-gallery-control-icon-color);\n }\n\n ${({ hidden }) => hidden && css`\n visibility: hidden;\n\n pointer-events: none;\n `}\n\n ${({ small }) => small && css`\n width: calc(var(--product-gallery-control-size) / 2);\n height: calc(var(--product-gallery-control-size) / 2);\n\n svg {\n width: calc(var(--product-gallery-control-icon-size) / 2);\n height: calc(var(--product-gallery-control-icon-size) / 2);\n }\n `}\n`\n\nconst ThumbnailsInner = styled.div`\n display: flex;\n align-items: center;\n\n flex-direction: var(--product-gallery-thumbnail-direction);\n\n gap: var(--product-gallery-preview-gap);\n`\n\nconst Thumbnail = styled.div`\n ${FocalImage} {\n width: var(--product-gallery-thumbnail-size);\n height: var(--product-gallery-thumbnail-size);\n\n border-radius: var(--product-gallery-thumbnail-border-radius);\n border: var(--product-gallery-thumbnail-border);\n\n cursor: pointer;\n\n transition: border 0.2s ease-in-out;\n\n ${({ isActive }) => isActive && css`\n border: var(--product-gallery-active-thumbnail-border);\n `}\n }\n`\n\nProductGallery.Wrapper = Wrapper\nProductGallery.Inner = Inner\nProductGallery.Item = Item\nProductGallery.Image = Image\nProductGallery.Controls = Controls\nProductGallery.Control = Control\nProductGallery.ThumbnailsInner = ThumbnailsInner\nProductGallery.Thumbnail = Thumbnail\n\nexport default ProductGallery\n","import request from './'\n\nexport const getPhoto = (id) => {\n return request({\n method: 'GET',\n url: `/api/boomerang/photos/${id}`\n })\n}\n\nexport const getPhotos = ({ ownerId }) => {\n return request({\n method: 'GET',\n url: '/api/boomerang/photos',\n params: {\n filter: {\n owner_id: ownerId\n }\n }\n })\n}\n","import { getPhoto, getPhotos } from 'shop-components/api/photo'\n\nexport const fetchPhoto = (id) => (dispatch) => {\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_START'\n })\n\n getPhoto(id)\n .then(({ data: { data } }) => {\n const photo = {\n id: data.id,\n ...data.attributes\n }\n\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_SUCCESS',\n payload: { records: [photo] }\n })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_ERROR'\n })\n })\n}\n\nexport const fetchPhotos = (ownerId) => (dispatch) => {\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_START'\n })\n\n getPhotos({ ownerId })\n .then(({ data: { data } }) => {\n const records = data.map(({ id, attributes }) => ({\n id,\n ...attributes\n }))\n\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_SUCCESS',\n payload: { records }\n })\n })\n .catch(() => {\n dispatch({\n type: 'PRODUCT_IMAGES_FETCH_ERROR'\n })\n })\n}\n","// React\nimport React, { Fragment, useEffect, useRef, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport BProductGallery, { HostStyles } from './styles'\nimport OptimizedImage from './components/OptimizedImage'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faChevronLeft as farChevronLeft, faChevronRight as farChevronRight } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport { fetchPhotos } from 'shop-components/redux/actions/photo'\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\n\nconst ProductGallery = ({\n item,\n photos,\n variationId,\n variations,\n fetchPhotos,\n enableThumbnails = 'true',\n enableControls = 'true',\n infiniteScroll = 'true'\n}) => {\n const listenerReady = useRef(false)\n const innerRef = useRef()\n const thumbnailsWrapperRef = useRef()\n const thumbnailsInnerRef = useRef()\n\n const [currentIndex, setIndex] = useState(variationId && variations ? null : 0)\n\n const withInfiniteScroll = infiniteScroll === 'true'\n const withControls = enableControls === 'true'\n const withThumbnails = enableThumbnails === 'true'\n\n useEffect(() => {\n if (!item?.id) return\n\n fetchPhotos()\n }, [item?.id])\n\n useEffect(() => {\n if (photos?.length && !listenerReady.current) {\n // Reset scroll offset on gallery init to prevent invalid index to be calculated\n innerRef.current.scrollLeft = 0\n\n const handleInnerScroll = () => {\n const width = innerRef.current.offsetWidth\n const offset = innerRef.current.scrollLeft\n const index = Math.round(offset / width)\n\n handleSnapToThumbnail(index)\n\n setIndex(index)\n }\n\n innerRef.current?.addEventListener('scroll', handleInnerScroll)\n innerRef.current?.addEventListener('touchmove', handleInnerScroll)\n\n listenerReady.current = true\n\n return () => {\n innerRef.current?.removeEventListener('scroll', handleInnerScroll)\n innerRef.current?.removeEventListener('touchmove', handleInnerScroll)\n\n listenerReady.current = false\n }\n }\n }, [photos])\n\n useEffect(() => {\n if (variationId && variations) {\n const currentPhotoId = variations.find((variation) => variation.id === variationId)?.photo_id\n const currentPhotoIndex = photos.findIndex((photo) => photo.id === currentPhotoId)\n\n if (currentPhotoIndex > -1) {\n handleSnapToPhoto(currentPhotoIndex)\n }\n }\n }, [variationId, variations, photos])\n\n const handleSnapToThumbnail = (index) => {\n const width = thumbnailsInnerRef.current?.offsetWidth / photos.length\n const height = thumbnailsInnerRef.current?.offsetHeight / photos.length\n\n thumbnailsWrapperRef.current?.scrollTo({\n left: width * index - width,\n top: height * index - height,\n behavior: 'smooth'\n })\n }\n\n const handleSnapToPhoto = (index, behavior = 'smooth') => {\n const width = innerRef.current?.offsetWidth\n const offset = width * index\n\n innerRef.current?.scrollTo({\n left: offset,\n behavior\n })\n\n handleSnapToThumbnail(index)\n\n setIndex(index)\n }\n\n const handleSnapToNextPhoto = () => {\n if (currentIndex < photos.length - 1) {\n handleSnapToPhoto(currentIndex + 1)\n }\n\n if (currentIndex === photos.length - 1 && withInfiniteScroll) {\n handleSnapToPhoto(0)\n }\n }\n\n const handleSnapToPrevPhoto = () => {\n if (currentIndex > 0) {\n handleSnapToPhoto(currentIndex - 1)\n }\n\n if (currentIndex === 0 && withInfiniteScroll) {\n handleSnapToPhoto(photos.length - 1)\n }\n }\n\n return (\n <Fragment>\n <HostStyles />\n {!!photos?.length && (\n <BProductGallery>\n <BProductGallery.Wrapper>\n <BProductGallery.Inner ref={innerRef} noGap>\n {photos?.map((photo) => {\n return (\n <BProductGallery.Item key={photo.id}>\n <BProductGallery.Image src={photo.url} alt=\"\" />\n </BProductGallery.Item>\n )\n })}\n </BProductGallery.Inner>\n {withControls && photos?.length > 1 && (\n <BProductGallery.Controls>\n <BProductGallery.Control\n onClick={handleSnapToPrevPhoto}\n data-direction=\"prev\"\n disabled={currentIndex === 0 && !withInfiniteScroll}\n >\n <FontAwesomeIcon icon={farChevronLeft} />\n </BProductGallery.Control>\n <BProductGallery.Control\n onClick={handleSnapToNextPhoto}\n data-direction=\"next\"\n disabled={currentIndex === photos?.length - 1 && !withInfiniteScroll}\n >\n <FontAwesomeIcon icon={farChevronRight} />\n </BProductGallery.Control>\n </BProductGallery.Controls>\n )}\n </BProductGallery.Wrapper>\n {withThumbnails && photos?.length > 1 && (\n <BProductGallery.Wrapper>\n <BProductGallery.Inner ref={thumbnailsWrapperRef}>\n <BProductGallery.ThumbnailsInner ref={thumbnailsInnerRef}>\n {photos\n .filter(({ url }) => !!url)\n .map((photo, index) => {\n const isActive = currentIndex === index\n\n return (\n <BProductGallery.Thumbnail\n key={photo.id}\n isActive={isActive}\n data-index={index + 1}\n data-active={isActive}\n onClick={() => handleSnapToPhoto(index)}\n >\n <OptimizedImage src={photo.url} focal={photo.coordinates} alt=\"\" width=\"120\" height=\"120\" />\n </BProductGallery.Thumbnail>\n )\n })}\n </BProductGallery.ThumbnailsInner>\n </BProductGallery.Inner>\n </BProductGallery.Wrapper>\n )}\n </BProductGallery>\n )}\n </Fragment>\n )\n}\n\nProductGallery.propTypes = {\n item: PropTypes.object,\n photos: PropTypes.array,\n variationId: PropTypes.string,\n variations: PropTypes.array,\n fetchPhotos: PropTypes.func,\n enableThumbnails: PropTypes.oneOf(['true', 'false']),\n enableControls: PropTypes.oneOf(['true', 'false']),\n infiniteScroll: PropTypes.oneOf(['true', 'false'])\n}\n\nconst mapStateToProps = (state, props) => {\n const item = state.items.records[props.productId]\n\n return {\n item,\n photos: item?.photos,\n variationId: item?.variation_id,\n variations: item?.products\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => ({\n fetchPhotos: () => dispatch(fetchPhotos(props.productId))\n})\n\nconst decoratedComponent = compose(\n withStore,\n withTheme,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(ProductGallery)\n\nregisterCustomElement('bq-product-gallery', decoratedComponent, {\n attributes: ['product-id', 'enable-thumbnails', 'enable-controls', 'infinite-scroll']\n})\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport FocalImage from 'ui/blocks/FocalImage'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --variation-select-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n --variation-select-color: var(--color-typo, ${color('text')});\n --variation-select-background-color: var(--color-white, ${color('white')});\n --variation-select-font-size: 13px;\n --variation-select-font-family: var(--font-body, sans-serif);\n --variation-select-padding: 0 30px 0 10px;\n --variation-select-control-height: 38px;\n --variation-select-border-radius: 6px;\n\n --bundle-items-image-size: 50px;\n --bundle-items-image-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n --bundle-items-image-border-radius: 6px;\n\n --bundle-items-cell-padding: 5px;\n\n --bundle-items-font-size: 15px;\n --bundle-items-font-family: var(--font-body, sans-serif);\n\n --bundle-items-background-color: var(--color-primary-background, ${color('white')});\n --bundle-items-color: var(--color-primary-foreground, ${color('text')});\n }\n\n * {\n box-sizing: border-box;\n }\n`\n\nconst BundleItems = styled.div`\n position: relative;\n\n background-color: var(--bundle-items-background-color);\n`\n\nconst Inner = styled.div`\n display: grid;\n grid-template-columns: max-content max-content 1fr;\n\n overflow-y: auto;\n\n ${({ height }) => height && css`\n max-height: ${height}px;\n `}\n`\n\nconst BundleItem = styled.div`\n display: contents;\n\n ${FocalImage} {\n width: var(--bundle-items-image-size);\n height: var(--bundle-items-image-size);\n\n border: var(--bundle-items-image-border);\n border-radius: var(--bundle-items-image-border-radius);\n }\n`\n\nconst BundleItemCell = styled.div`\n display: flex;\n align-items: center;\n\n padding: var(--bundle-items-cell-padding);\n\n font-size: var(--bundle-items-font-size);\n font-family: var(--bundle-items-font-family);\n\n color: var(--bundle-items-color);\n\n &:first-child {\n padding-left: 0;\n }\n\n &:last-child {\n padding-right: 0;\n }\n`\n\nconst BundleItemSelectWrapper = styled.div`\n position: relative;\n\n width: 100%;\n\n svg {\n position: absolute;\n\n color: var(--variation-select-color);\n fill: var(--variation-select-color);\n\n top: 50%;\n right: 10px;\n transform: translateY(-50%);\n\n width: 14px;\n height: 14px;\n\n pointer-events: none;\n }\n`\n\nconst BundleItemSelect = styled.select`\n border: var(--variation-select-border);\n\n color: var(--variation-select-color);\n background-color: var(--variation-select-background-color);\n\n font-size: var(--variation-select-font-size);\n font-family: var(--variation-select-font-family);\n\n padding: var(--variation-select-padding);\n\n width: 100%;\n height: var(--variation-select-control-height);\n\n border-radius: var(--variation-select-border-radius);\n\n appearance: none;\n`\n\nconst ScrollGradient = styled.div`\n position: absolute;\n\n left: 0;\n right: 0;\n\n height: 50px;\n width: 100%;\n\n z-index: 100;\n\n pointer-events: none;\n\n opacity: 0;\n\n background-image: linear-gradient(\n to bottom,\n color-mix(in srgb, var(--bundle-items-background-color) 0%, transparent) 15%,\n var(--bundle-items-background-color)\n );\n\n transition: opacity 0.15s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n\n ${({ visible }) => visible && css`\n opacity: 1;\n `}\n\n ${({ side }) => {\n switch (side) {\n case 'top':\n return css`\n top: 0;\n background-image: linear-gradient(\n to top,\n color-mix(in srgb, var(--bundle-items-background-color) 0%, transparent) 15%,\n var(--bundle-items-background-color)\n );\n `\n case 'bottom':\n return css`\n bottom: 0;\n background-image: linear-gradient(\n to bottom,\n color-mix(in srgb, var(--bundle-items-background-color) 0%, transparent) 15%,\n var(--bundle-items-background-color)\n );\n `\n }\n }}\n`\n\nBundleItems.Inner = Inner\nBundleItems.BundleItem = BundleItem\nBundleItems.BundleItemCell = BundleItemCell\nBundleItems.BundleItemSelectWrapper = BundleItemSelectWrapper\nBundleItems.BundleItemSelect = BundleItemSelect\nBundleItems.ScrollGradient = ScrollGradient\n\nexport default BundleItems\n","// React\nimport React, { useState, useEffect, useCallback, memo } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport BBundleItems from './styles'\nimport FocalImage from 'ui/components/FocalImage'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faChevronDown as farChevronDown } from '@fortawesome/pro-regular-svg-icons'\n\n// Libraries\nimport _sortBy from 'lodash/sortBy'\n\n// Shared\nimport { updateConfiguration } from 'shop-components/redux/actions/item'\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\n\nconst getItem = (item, selected) => {\n const variation = item.product_group?.products?.find((p) => p.id === selected)\n const product = item.product_group?.products?.find((p) => p.id === item.product_id)\n const productGroup = item.product_group\n\n return variation || product || productGroup\n}\n\nconst BundleItem = ({ productId, cart, bundleItem, updateConfiguration }) => {\n const [selected, setSelected] = useState('')\n\n const item = getItem(bundleItem, selected)\n const variations = _sortBy(\n bundleItem.product_group?.products?.filter(({ archived_at: archivedAt }) => !archivedAt),\n 'sorting_weight'\n )\n const photo = variations.find((p) => p.id === selected)?.photo\n\n const handleSetSelected = useCallback(\n (id) => {\n if (cart?.id && id !== selected) {\n setSelected(id)\n updateConfiguration({ id: productId, itemId: bundleItem.id, variationId: id })\n }\n },\n [selected, productId, bundleItem.id, cart]\n )\n\n useEffect(() => {\n const defaultVariation = variations.find(({ id }) => id === bundleItem.product_id) || variations[0]\n\n if (!selected && defaultVariation?.id) {\n handleSetSelected(defaultVariation.id)\n }\n }, [bundleItem, selected, variations, handleSetSelected])\n\n return (\n <BBundleItems.BundleItem key={bundleItem.id}>\n <BBundleItems.BundleItemCell part=\"bundle-item__image\">\n <FocalImage url={photo?.url || NO_PRODUCT_IMAGE} preview={photo?.preview} coordinates={photo?.coordinates} />\n </BBundleItems.BundleItemCell>\n <BBundleItems.BundleItemCell>{bundleItem.quantity}x</BBundleItems.BundleItemCell>\n <BBundleItems.BundleItemCell>\n {(!bundleItem.product_group.has_variations || bundleItem.product_id) && item.name}\n {bundleItem.product_group.has_variations && !bundleItem.product_id && (\n <BBundleItems.BundleItemSelectWrapper>\n <BBundleItems.BundleItemSelect\n className=\"bundle-item__select\"\n name={`variation-${bundleItem.id}`}\n id={`variation-${bundleItem.id}`}\n value={selected}\n onChange={({ target }) => handleSetSelected(target.value)}\n >\n {variations.map((variation) => (\n <option key={variation.id} value={variation.id}>\n {variation.name}\n </option>\n ))}\n </BBundleItems.BundleItemSelect>\n <FontAwesomeIcon icon={farChevronDown} />\n </BBundleItems.BundleItemSelectWrapper>\n )}\n </BBundleItems.BundleItemCell>\n </BBundleItems.BundleItem>\n )\n}\n\nBundleItem.propTypes = {\n productId: PropTypes.string,\n cart: PropTypes.object,\n bundleItem: PropTypes.object,\n updateConfiguration: PropTypes.func\n}\n\nconst mapStateToProps = (state, _props) => ({\n cart: state.orm.carts.getById(state.client.cartId ?? window.booqableOptions.cart?.id)\n})\n\nconst mapDispatchToProps = (dispatch, _props) => ({\n updateConfiguration: (attributes) => dispatch(updateConfiguration(attributes))\n})\n\nconst decoratedComponent = reduxConnect(mapStateToProps, mapDispatchToProps)(BundleItem)\n\nexport default memo(decoratedComponent)\n","// React\nimport React, { Fragment, useState, useEffect, useCallback, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Item from './Item'\nimport BBundleItems, { HostStyles } from './styles'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { fetchPrice } from 'shop-components/redux/actions/price'\nimport { fetchAvailability } from 'shop-components/redux/actions/availability'\n\nconst CONTAINER_HEIGHT = 220\n\nconst BundleItems = ({ productId, items, cart, bundle, fetchPrice, fetchAvailability }) => {\n const ref = useRef()\n\n const [displayTopGradient, setDisplayTopGradient] = useState(false)\n const [displayBottomGradient, setDisplayBottomGradient] = useState(false)\n\n useEffect(() => {\n if (cart.id && bundle?.id) {\n fetchPrice({\n cartId: cart.id,\n id: bundle.id,\n configuration: bundle.configuration\n })\n }\n\n if (cart.startsAt && cart.stopsAt && cart.startLocationId) {\n fetchAvailability({\n startsAt: cart.startsAt,\n stopsAt: cart.stopsAt,\n startLocationId: cart.startLocationId,\n id: productId,\n configuration: bundle?.configuration\n })\n }\n }, [cart.id, cart.startsAt, cart.stopsAt, bundle?.configuration])\n\n useEffect(() => {\n const handleInnerScroll = () => {\n if (ref.current?.scrollTop + CONTAINER_HEIGHT >= ref.current?.scrollHeight) {\n setDisplayBottomGradient(false)\n setDisplayTopGradient(true)\n } else {\n setDisplayBottomGradient(true)\n setDisplayTopGradient(false)\n }\n }\n\n if (ref.current?.scrollHeight > CONTAINER_HEIGHT) {\n setDisplayBottomGradient(true)\n }\n\n ref.current?.addEventListener('scroll', handleInnerScroll)\n\n return () => {\n ref.current?.removeEventListener('scroll', handleInnerScroll)\n }\n }, [items])\n\n const renderBundleItem = useCallback(\n (item) => <Item key={item.id} productId={productId} bundleItem={item} />,\n [productId]\n )\n\n return (\n <Fragment>\n <HostStyles />\n {items?.length && (\n <BBundleItems>\n <BBundleItems.ScrollGradient visible={displayTopGradient} side=\"top\" />\n <BBundleItems.Inner height={CONTAINER_HEIGHT} ref={ref}>\n {items.map(renderBundleItem)}\n </BBundleItems.Inner>\n <BBundleItems.ScrollGradient visible={displayBottomGradient} side=\"bottom\" />\n </BBundleItems>\n )}\n </Fragment>\n )\n}\n\nBundleItems.propTypes = {\n productId: PropTypes.string.isRequired,\n cart: PropTypes.object,\n bundle: PropTypes.object,\n items: PropTypes.array,\n fetchPrice: PropTypes.func,\n fetchAvailability: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId || window.booqableOptions.cart?.id)\n const bundle = state.items.records[props.productId]\n\n return {\n cart: {\n id: cart?.id ?? window.booqableOptions.cart?.id,\n startsAt: cart?.starts_at ?? window.booqableOptions.cart?.from,\n stopsAt: cart?.stops_at ?? window.booqableOptions.cart?.till,\n startLocationId: cart?.start_location_id ?? window.booqableOptions?.startLocationId\n },\n bundle,\n items: bundle?.products\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => ({\n fetchPrice: (attributes) => dispatch(fetchPrice(attributes)),\n fetchAvailability: (attributes) => dispatch(fetchAvailability(attributes))\n})\n\nconst decoratedComponent = compose(withStore, withTheme, reduxConnect(mapStateToProps, mapDispatchToProps))(BundleItems)\n\nregisterCustomElement('bq-bundle-items', decoratedComponent, {\n attributes: ['product-id']\n})\n\nexport default decoratedComponent\n","import styled, { createGlobalStyle, css } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport Skeleton from 'ui/blocks/Skeleton'\nimport FocalImage from 'ui/blocks/FocalImage'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --lines-empty-text-color: var(--color-primary-foreground, ${color('Text/Primary')});\n\n --line-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --line-image-size: var(--cart-line-image-size, 60px);\n --line-image-border-radius: var(--cart-line-image-border-radius, 6px);\n --line-image-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --line-icon-color: var(--color-primary-foreground, #0c2747);\n --line-control-border-radius: var(--cart-line-control-border-radius, 6px);\n --line-control-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n --line-input-color: var(--color-primary-foreground, #0c2747);\n\n --line-availability-border: 1px solid;\n --line-availability-border-color-available: var(--color-green, ${color('Success/Base')});\n --line-availability-border-color-unavailable: var(--color-red, ${color('Danger/Base')});\n --line-availability-color-available: var(--color-green, ${color('Success/Base')});\n --line-availability-color-unavailable: var(--color-red, ${color('Danger/Base')});\n --line-availability-background-color-available: transparent;\n --line-availability-background-color-unavailable: transparent;\n\n --line-title-color: var(--color-primary-foreground, ${color('Text/Primary')});\n --line-title-font-size: 16px;\n\n --line-price-color: var(--color-primary-foreground, ${color('Text/Primary')});\n --line-price-font-size: 16px;\n\n --line-variations-color: var(--color-primary-foreground-lightened, ${color('Text/Secondary')});\n --line-variations-font-size: 14px;\n\n --line-toggle-color: var(--color-primary-foreground, ${color('branding')});\n --line-toggle-font-size: 16px;\n\n --line-bundle-item-quantity-color: var(--color-primary-foreground, ${color('Text/Secondary')});\n --line-bundle-item-quantity-font-size: 16px;\n --line-bundle-item-quantity-background: var(--color-primary-background, ${color('white')});\n\n --line-bundle-item-name-color: var(--color-primary-foreground, ${color('Text/Primary')});\n --line-bundle-item-name-font-size: 16px;\n }\n`\n\nexport const Lines = styled.div`\n display: grid;\n grid-template-columns: max-content 1fr max-content max-content;\n\n border-top: var(--line-border);\n\n * {\n box-sizing: border-box;\n }\n\n ${FocalImage} {\n width: var(--line-image-size);\n height: var(--line-image-size);\n\n border-radius: var(--line-image-border-radius);\n border: var(--line-image-border);\n }\n`\n\nexport const EmptyText = styled.h3`\n display: inline-block;\n\n color: var(--lines-empty-text-color);\n`\n\nexport const Cell = styled.div`\n padding: 20px 12px;\n\n border-bottom: var(--line-border);\n`\n\nexport const Image = styled(Cell)`\n grid-column: 1 / 2;\n\n padding-left: 0;\n\n @media screen and (max-width: 576px) {\n border: none;\n\n padding-bottom: 0;\n }\n`\n\nexport const Info = styled(Cell)`\n grid-column: 2 / 3;\n\n @media screen and (max-width: 576px) {\n border: none;\n\n padding-bottom: 0;\n }\n`\n\nexport const Availability = styled.span`\n display: inline-block;\n\n font-family: var(--font-body);\n font-size: 14px;\n font-weight: 600;\n\n margin: 8px 0;\n padding: 2px 8px;\n\n border: var(--line-availability-border);\n border-radius: 20px;\n\n ${({ available }) =>\n available ?\n css`\n border-color: var(--line-availability-border-color-available);\n color: var(--line-availability-color-available);\n background-color: var(--line-availability-background-color-available);\n ` :\n css`\n border-color: var(--line-availability-border-color-unavailable);\n color: var(--line-availability-color-unavailable);\n background-color: var(--line-availability-background-color-unavailable);\n `}\n`\n\nexport const Controls = styled(Cell)`\n display: flex;\n\n gap: 4px;\n\n grid-column: 3 / 4;\n\n padding-right: 0;\n\n @media screen and (max-width: 576px) {\n grid-column: 1 / 3;\n }\n\n ${({ withRightOffset }) => withRightOffset && css`\n padding-right: 12px;\n `}\n`\n\nexport const ActionButton = styled.button`\n border: none;\n background: none;\n\n width: 40px;\n height: 40px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n margin-right: 8px;\n\n cursor: pointer;\n\n svg {\n width: 18px;\n height: 18px;\n\n fill: var(--line-icon-color);\n color: var(--line-icon-color);\n }\n`\n\nexport const QuantityButton = styled(ActionButton)`\n border: var(--line-control-border);\n border-radius: var(--line-control-border-radius);\n\n background-color: var(--line-bundle-item-quantity-background);\n\n margin-right: 0;\n\n svg {\n width: 14px;\n height: 14px;\n\n fill: var(--line-icon-color);\n color: var(--line-icon-color);\n }\n`\n\nexport const QuantityInput = styled.input`\n border: none;\n border: var(--line-control-border);\n\n background-color: var(--line-bundle-item-quantity-background);\n\n color: var(--line-input-color);\n\n border-radius: var(--line-control-border-radius);\n\n font-size: 14px;\n line-height: 20px;\n\n text-align: center;\n\n min-height: 40px;\n max-height: 40px;\n width: 60px;\n`\n\nexport const Price = styled(Cell)`\n display: flex;\n justify-content: flex-end;\n align-items: flex-start;\n\n padding-top: 30px;\n padding-right: 0;\n\n font-family: var(--font-body);\n font-size: var(--line-price-font-size);\n color: var(--line-price-color);\n\n ${Skeleton} {\n display: block;\n }\n\n grid-column: 4 / 5;\n\n @media screen and (max-width: 576px) {\n grid-column: 3 / 4;\n }\n`\n\nexport const Title = styled.h3`\n font-family: var(--font-heading);\n font-size: 16px;\n\n font-size: var(--line-title-font-size);\n color: var(--line-title-color);\n\n margin: 0;\n`\n\nexport const Variations = styled.p`\n font-family: var(--font-body);\n font-size: var(--line-variations-font-size);\n\n color: var(--line-variations-color);\n\n margin: 0;\n`\n\nexport const Contents = styled.div``\n","import styled from 'styled-components'\n\nimport FocalImage from 'ui/blocks/FocalImage'\n\nexport const BundleItem = styled.div`\n display: flex;\n align-items: center;\n\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n\n ${FocalImage} {\n width: 32px;\n height: 32px;\n }\n`\n\nexport const Toggle = styled.div`\n display: flex;\n align-items: center;\n\n cursor: pointer;\n\n margin-bottom: 8px;\n\n gap: 4px;\n\n svg {\n width: 16px;\n height: 16px;\n\n fill: var(--line-toggle-color);\n color: var(--line-toggle-color);\n }\n`\n\nexport const ToggleText = styled.span`\n font-family: var(--font-body);\n font-size: var(--line-toggle-font-size);\n\n font-weight: 600;\n\n color: var(--line-toggle-color);\n`\n\nexport const Quantity = styled.span`\n font-family: var(--font-body);\n font-size: var(--line-bundle-item-quantity-font-size);\n\n color: var(--line-bundle-item-quantity-color);\n`\n\nexport const Name = styled.span`\n font-family: var(--font-body);\n font-size: var(--line-bundle-item-name-font-size);\n\n color: var(--line-bundle-item-name-color);\n`\n","// React\nimport React, { useState, useCallback, Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { BundleItem, Quantity, Name, Toggle, ToggleText } from './styles'\nimport FocalImage from 'ui/components/FocalImage'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faChevronUp as farChevronUp, faChevronDown as farChevronDown } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nconst BundleContents = ({ data, products, photos, t }) => {\n const [open, setOpen] = useState(false)\n\n const handleToggle = useCallback(() => {\n setOpen((prev) => !prev)\n }, [])\n\n return (\n <Fragment>\n <Toggle onClick={handleToggle}>\n <ToggleText>\n {t('user.cart.bundle_contents')} ({data.length})\n </ToggleText>\n <FontAwesomeIcon icon={open ? farChevronUp : farChevronDown} />\n </Toggle>\n {open &&\n data.map((item) => {\n const product = products.getById(item.item_id)\n\n if (!product) return null\n\n const photo = photos.getById(product?.photo_id)\n\n return (\n <BundleItem key={product.id}>\n <FocalImage\n coordinates={photo?.coordinates ?? { x: 0, y: 0 }}\n url={photo?.url ?? NO_PRODUCT_IMAGE}\n size=\"32px\"\n />\n <Quantity>{item.quantity}x</Quantity>\n <Name>{product.name}</Name>\n </BundleItem>\n )\n })}\n </Fragment>\n )\n}\n\nBundleContents.displayName = 'BundleContents'\n\nBundleContents.propTypes = {\n data: PropTypes.array,\n products: PropTypes.object,\n photos: PropTypes.object,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n const products = state.orm.products\n const photos = state.orm.photos\n\n return { products, photos }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps))(BundleContents)\n","// React\nimport React, { Fragment, useCallback, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport {\n Controls,\n ActionButton,\n QuantityButton,\n QuantityInput,\n Price,\n Image,\n Info,\n Title,\n Variations,\n Contents,\n Availability\n} from './styles'\nimport FocalImage from 'ui/components/FocalImage'\nimport Skeleton from 'ui/blocks/Skeleton'\nimport BundleContents from './BundleContents'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMinus as farMinus, faPlus as farPlus } from '@fortawesome/pro-regular-svg-icons'\nimport { faTrash as falTrash } from '@fortawesome/pro-light-svg-icons'\n\nimport _debounce from 'lodash/debounce'\n\n// Shared\nimport { Settings as SettingsUtils, Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport NO_PRODUCT_IMAGE from '@assets/images/no-product-image.png'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nconst Line = ({\n line,\n product,\n currency,\n type,\n hasDates,\n useAvailability,\n hideAvailabilityQuantity,\n showPrices,\n updateLine,\n t\n}) => {\n const [quantity, setQuantity] = useState(line?.quantity)\n const [loading, setLoading] = useState(false)\n\n const handleUpdateQuantity = useCallback(\n (quantity, skipQuantityUpdate) => {\n if (quantity === '') {\n if (!skipQuantityUpdate) {\n setQuantity(1)\n }\n\n updateLine(line, 1).finally(() => setLoading(false))\n } else {\n if (!skipQuantityUpdate) {\n setQuantity(quantity)\n }\n\n updateLine(line, quantity).finally(() => setLoading(false))\n }\n },\n [line]\n )\n\n const debounceUpdateQuantity = _debounce(handleUpdateQuantity, 500)\n\n const handleUpdateInputQuantity = useCallback(({ target }) => {\n setQuantity(target.value)\n\n debounceUpdateQuantity(target.value)\n }, [])\n\n const handleIncreaseQuantity = useCallback((quantity) => {\n setLoading(true)\n setQuantity(quantity + 1)\n\n debounceUpdateQuantity(quantity + 1, true)\n }, [])\n\n const handleDecreaseQuantity = useCallback((quantity) => {\n setLoading(true)\n setQuantity(quantity - 1)\n\n debounceUpdateQuantity(quantity - 1, true)\n }, [])\n\n const handleDeleteLine = useCallback(() => {\n updateLine(line, 0)\n }, [line])\n\n if (!line || !product) return null\n\n const available = line.available_quantity >= quantity\n\n return (\n <Fragment>\n <Image>\n <FocalImage\n coordinates={line.photo?.coordinates ?? { x: 0, y: 0 }}\n url={line.photo?.large_url ?? NO_PRODUCT_IMAGE}\n size=\"60px\"\n />\n </Image>\n <Info>\n <Title>{product.group_name || product.name}</Title>\n {product.variation_values && <Variations>{product.variation_values.join(',')}</Variations>}\n {hasDates && useAvailability && (\n <Availability available={available}>\n {!hideAvailabilityQuantity && (\n <Fragment>\n {line.available_quantity} {t('user.store.available')}\n </Fragment>\n )}\n {hideAvailabilityQuantity && t(available ? 'user.store.available' : 'user.store.unavailable')}\n </Availability>\n )}\n {type === 'bundle' && (\n <Contents>\n <BundleContents data={line.items} />\n </Contents>\n )}\n </Info>\n <Controls withRightOffset={showPrices}>\n <ActionButton data-tid={`${product.group_name || product.name}: delete line`} onClick={handleDeleteLine}>\n <FontAwesomeIcon icon={falTrash} />\n </ActionButton>\n <QuantityButton\n data-tid={`${product.group_name || product.name}: decrease quantity`}\n onClick={() => handleDecreaseQuantity(quantity)}\n >\n <FontAwesomeIcon icon={farMinus} />\n </QuantityButton>\n <QuantityInput\n data-tid={`${product.group_name || product.name}: quantity input`}\n value={quantity}\n onChange={handleUpdateInputQuantity}\n />\n <QuantityButton\n data-tid={`${product.group_name || product.name}: increase quantity`}\n onClick={() => handleIncreaseQuantity(quantity)}\n >\n <FontAwesomeIcon icon={farPlus} />\n </QuantityButton>\n </Controls>\n {showPrices && (\n <Price>{loading ? <Skeleton width={60} /> : FormatUtils.money(line.display_price_in_cents, currency)}</Price>\n )}\n </Fragment>\n )\n}\n\nLine.displayName = 'Line'\n\nLine.propTypes = {\n line: PropTypes.object,\n product: PropTypes.object,\n currency: PropTypes.object,\n type: PropTypes.oneOf(['rental', 'bundle']),\n hasDates: PropTypes.bool,\n useAvailability: PropTypes.bool,\n hideAvailabilityQuantity: PropTypes.bool,\n showPrices: PropTypes.bool,\n updateLine: PropTypes.func,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, props) => {\n let product\n\n const cartId = state.client.cartId\n const currency = state.client.currency.toJS()\n\n const cart = state.orm.carts.getById(cartId)\n const line = state.orm.lines.getById(props.id)\n const type = line?.product?.product_type\n\n const hasDates = !!cart.starts_at && !!cart.stops_at\n const useAvailability = SettingsUtils.get('store.use_availability') && line?.tracking_type !== 'none'\n const hideAvailabilityQuantity = SettingsUtils.get('store.hide_product_availability_quantities')\n const showPrices = SettingsUtils.get('store.use_prices')\n\n switch (type) {\n case 'bundle':\n product = state.orm.bundles.getById(line?.product.id)\n break\n case undefined:\n product = null\n break\n default:\n product = state.orm.products.getById(line?.product.id)\n break\n }\n\n return { line, product, currency, type, useAvailability, hasDates, hideAvailabilityQuantity, showPrices }\n}\n\nconst mapDispatchToProps = () => {\n return {\n updateLine: (line, quantity) =>\n CartActions.book({\n item_id: line.item_id,\n line_id: line.id,\n quantity,\n type: 'set'\n })\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(mapStateToProps, mapDispatchToProps))(Line)\n","// React\nimport React from 'react'\n\n// Components\nimport { Controls, Image, Info, Lines, Price } from './styles'\nimport Skeleton from 'ui/blocks/Skeleton'\n\nconst LinesSkeleton = () => {\n return (\n <Lines>\n <Image>\n <Skeleton width={60} height={60} modifiers=\"border-radius-md\" />\n </Image>\n <Info>\n <Skeleton height={24} modifiers=\"display-flex width-100 margin-bottom-xs\" noCenter />\n <Skeleton height={24} modifiers=\"width-75\" noCenter />\n </Info>\n <Controls />\n <Price>\n <Skeleton height={18} modifiers=\"width-50\" />\n </Price>\n </Lines>\n )\n}\n\nexport default LinesSkeleton\n","// React\nimport React, { Fragment, useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport Line from './Line'\nimport LinesSkeleton from './LineSkeleton'\nimport { Lines as LinesContainer, EmptyText, HostStyles } from './styles'\nimport Div from 'ui/elements/Div'\n\n// Libraries\nimport _flatten from 'lodash/flatten'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport ItemActions from 'back_office/v2/redux/actions/item_actions'\nimport LineActions from 'back_office/v2/redux/actions/line_actions'\n\nconst Lines = ({ cartId, lines, fetchLines, fetchContents, t }) => {\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n setLoading(true)\n\n fetchLines(cartId)\n .then(({ payload }) => {\n const ids = _flatten(\n payload.response.data.map(({ attributes }) => attributes.items.map(({ item_id: id }) => id))\n )\n\n if (!ids.length) return\n\n fetchContents(ids)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [cartId])\n\n if (loading) {\n return (\n <Fragment>\n <HostStyles />\n <LinesSkeleton />\n </Fragment>\n )\n }\n\n if (!lines.size()) {\n return (\n <Fragment>\n <HostStyles />\n <Div modifiers=\"display-flex justify-center align-center padding-top-lg padding-bottom-lg\">\n <EmptyText>{t('user.cart.empty')}</EmptyText>\n </Div>\n </Fragment>\n )\n }\n\n return (\n <Fragment>\n <HostStyles />\n <LinesContainer>\n {lines?.map((line) => (\n <Line key={line.id} id={line.id} />\n ))}\n </LinesContainer>\n </Fragment>\n )\n}\n\nLines.propTypes = {\n cartId: PropTypes.string,\n lines: PropTypes.object,\n fetchLines: PropTypes.func,\n fetchContents: PropTypes.func,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state, _props) => {\n const cartId = state.client.cartId\n\n const cart = state.orm.carts.getById(cartId)\n const lines = state.orm.lines.getAll({ id: cart?.lines }).filter(({ product_type: type }) => type !== 'service')\n\n return { cartId, lines }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n fetchLines: (id) => {\n return LineActions.fetchAll({\n apiVersion: 'boomerang',\n include: [\n 'item',\n 'item.photo',\n 'item.bundle_items',\n 'item.bundle_items.product',\n 'item.bundle_items.product.photo'\n ],\n filter: {\n owner_id: id\n }\n })\n },\n fetchContents: (ids) => {\n return ItemActions.fetchAll({\n apiVersion: 'boomerang',\n include: ['photo'],\n filter: {\n id: ids,\n archived: false\n }\n })\n }\n }\n}\n\nconst decoratedComponent = compose(\n withStore,\n withTheme,\n withTranslation('user'),\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(Lines)\n\nregisterCustomElement('bq-cart-lines', decoratedComponent)\n\nexport default decoratedComponent\n","import styled, { createGlobalStyle, css } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport H3 from 'ui/elements/H3'\nimport P from 'ui/elements/P'\nimport Div from 'ui/elements/Div'\nimport Label from 'ui/elements/Label'\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --services-container-background: transparent;\n --services-container-padding: 16px;\n --services-container-border-radius: 8px;\n --services-container-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --services-text-color: var(--color-primary-foreground, ${color('Text/Primary')});\n\n --service-checkbox-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n --service-checkbox-border-radius: 4px;\n --service-checkbox-size: 20px;\n --service-checkbox-color: ${color('white')};\n --service-checkbox-color-checked: var(--color-accent-background, ${color('branding')});\n --service-checkbox-icon-color: var(--color-accent-foreground, ${color('white')});\n\n --service-title-font-size: 18px;\n --service-name-font-size: 16px;\n --service-price-font-size: 16px;\n }\n\n * {\n box-sizing: border-box;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n }\n`\n\nexport const Container = styled(Div)`\n position: relative;\n\n background: var(--services-container-background);\n border: var(--services-container-border);\n\n padding: var(--services-container-padding);\n\n border-radius: var(--services-container-border-radius);\n`\n\nexport const Title = styled(H3)`\n font-family: var(--font-body);\n font-weight: 600;\n font-size: var(--service-title-font-size);\n\n margin-bottom: 14px;\n\n color: var(--services-text-color);\n`\n\nexport const ServiceContainer = styled(Div)`\n display: grid;\n grid-template-columns: max-content 1fr;\n grid-gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n ${({ hasPrice }) =>\n hasPrice &&\n css`\n grid-template-columns: max-content 1fr max-content;\n `}\n\n ${({ loading }) =>\n loading &&\n css`\n grid-template-columns: max-content 1fr max-content;\n `}\n`\n\nexport const Name = styled(Div)`\n display: flex;\n align-items: center;\n\n ${Label} {\n font-family: var(--font-body);\n font-size: var(--service-name-font-size);\n font-weight: 400;\n\n cursor: pointer;\n\n margin: 0;\n\n color: var(--services-text-color);\n }\n\n ${({ disabled }) =>\n disabled &&\n css`\n opacity: 0.7;\n `}\n`\n\nexport const Checkbox = styled(Div)`\n width: var(--service-checkbox-size);\n height: var(--service-checkbox-size);\n\n cursor: pointer;\n\n border-radius: var(--service-checkbox-border-radius);\n border: var(--service-checkbox-border);\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n padding: 2px;\n\n background-color: var(--service-checkbox-color);\n\n svg {\n max-width: 100%;\n max-height: 100%;\n\n width: 100%;\n\n color: var(--service-checkbox-icon-color);\n fill: var(--service-checkbox-icon-color);\n\n visibility: hidden;\n }\n`\n\nexport const CheckboxContainer = styled(Div)`\n position: relative;\n\n & > input[type='checkbox'] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n visibility: hidden;\n\n &:checked + ${Checkbox} {\n background-color: var(--service-checkbox-color-checked);\n\n svg {\n visibility: visible;\n }\n }\n }\n`\n\nexport const Price = styled(P)`\n font-family: var(--font-body);\n font-weight: 700;\n font-size: var(--service-price-font-size);\n\n color: var(--services-text-color);\n\n text-align: right;\n\n margin: 0;\n\n ${({ disabled }) =>\n disabled &&\n css`\n opacity: 0.7;\n `}\n`\n","// React\nimport React, { useEffect, useState, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\n\n// Components\nimport { Name, Checkbox, CheckboxContainer, Price, ServiceContainer } from './styles'\nimport Input from 'ui/elements/Input'\nimport Label from 'ui/elements/Label'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck as farCheck } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport { fetchPrices } from 'shop-components/redux/actions/price'\nimport { money } from 'shared/utils/format'\nimport CartActions from 'store/v2/redux/actions/cart'\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\n\nconst Service = ({ cart, service, fetchPrice, toggleService, dates, inCart, price, currency, hasPrice }) => {\n const [checked, setChecked] = useState(inCart)\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (service?.id && cart?.id) {\n fetchPrice({ id: service.id, cartId: cart.id })\n }\n }, [dates.start, dates.stop, service?.id, cart?.id])\n\n useEffect(() => {\n if (inCart !== checked) {\n setChecked(inCart)\n }\n }, [inCart, checked])\n\n const handleToggleService = useCallback(() => {\n const value = !checked\n\n setLoading(true)\n setChecked((prev) => !prev)\n\n toggleService({ id: service.id, value })\n .catch(() => {\n setChecked((prev) => !prev)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [checked, service?.id])\n\n if (!service) return null\n\n return (\n <ServiceContainer hasPrice={price && hasPrice}>\n <Label htmlFor={service.id} modifiers=\"no-margin\">\n <CheckboxContainer>\n <Input\n id={service.id}\n type=\"checkbox\"\n value={checked}\n checked={checked}\n onChange={handleToggleService}\n disabled={loading}\n />\n <Checkbox>\n <FontAwesomeIcon icon={farCheck} />\n </Checkbox>\n </CheckboxContainer>\n </Label>\n <Name disabled={!checked}>\n <Label htmlFor={service.id}>{service.name}</Label>\n </Name>\n {price && hasPrice && <Price disabled={!checked}>{money(price.price_each_in_cents, currency)}</Price>}\n </ServiceContainer>\n )\n}\n\nService.propTypes = {\n service: PropTypes.object,\n cart: PropTypes.object,\n fetchPrice: PropTypes.func,\n toggleService: PropTypes.func,\n dates: PropTypes.object,\n price: PropTypes.object,\n currency: PropTypes.object,\n inCart: PropTypes.bool,\n hasPrice: PropTypes.bool\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const dates = { start: cart?.starts_at, stop: cart?.stops_at }\n\n const price = state.items.records[props.service?.product_group_id]?.price\n const currency = window.booqableOptions.currency\n\n const hasPrice =\n price?.price_each_in_cents >= 0 &&\n price?.price_each_in_cents !== null &&\n props.service?.price_type !== 'none' &&\n props.service?.price_type !== null &&\n SettingsUtils.get('store.use_prices')\n\n return { dates, cart, price, currency, hasPrice }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n const book = ({ id, quantity }) =>\n CartActions.book({\n item_id: id,\n quantity,\n type: 'set'\n })\n\n return {\n fetchPrice: (params) => dispatch(fetchPrices(params)),\n toggleService: ({ id, value }) => {\n if (value) {\n return book({ id, quantity: 1 })\n } else {\n return book({ id, quantity: 0 })\n }\n }\n }\n}\n\nexport default reduxConnect(mapStateToProps, mapDispatchToProps)(Service)\n","// React\nimport React, { Fragment, useEffect, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { HostStyles, Container, Title } from './styles'\nimport Service from './Service'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport ItemActions from 'back_office/v2/redux/actions/item_actions'\nimport LineActions from 'back_office/v2/redux/actions/line_actions'\n\nconst Services = ({ cartId, services, itemIds, fetchLines, fetchServices, title, t }) => {\n useEffect(() => {\n if (!cartId) return\n\n // We need to fetch both services and lines\n // because we need to know which services are already added to the cart\n fetchLines(cartId).then(() => {\n fetchServices()\n })\n }, [cartId])\n\n const isServiceInCart = useCallback((serviceId) => itemIds.includes(serviceId), [itemIds])\n\n if (!services.size()) return null\n\n return (\n <Fragment>\n <HostStyles />\n <Container>\n <Title>{title || t('user.store.additional_services')}</Title>\n {services?.map((service) => {\n const inCart = isServiceInCart(service.id)\n\n return <Service key={service.id} service={service} inCart={inCart} />\n })}\n </Container>\n </Fragment>\n )\n}\n\nServices.propTypes = {\n cartId: PropTypes.string,\n services: PropTypes.object,\n itemIds: PropTypes.object,\n fetchLines: PropTypes.func,\n fetchServices: PropTypes.func,\n t: PropTypes.func,\n // Element attributes\n title: PropTypes.any\n}\n\nconst mapStateToProps = (state, _props) => {\n const cartId = state.client.cartId\n const cart = state.orm.carts.getById(cartId)\n\n const lines = state.orm.lines.getAll({ id: cart?.lines })\n const itemIds = lines.map((line) => line.item_id)\n\n const enabledServices = state.orm.product_groups.getAll({\n product_type: 'service',\n show_in_store: true,\n archived_at: null\n })\n const services = state.orm.products\n .getAll({ product_type: 'service', product_group_id: enabledServices.pluck('id') })\n .sortBy((product) => enabledServices.getById(product.product_group_id)?.sorting_weight)\n\n return { cartId, services, itemIds }\n}\n\nconst mapDispatchToProps = (_dispatch, _props) => {\n return {\n fetchLines: (id) => {\n return LineActions.fetchAll({\n apiVersion: 'boomerang',\n include: [\n 'item',\n 'item.photo',\n 'item.bundle_items',\n 'item.bundle_items.product',\n 'item.bundle_items.product.photo'\n ],\n filter: {\n owner_id: id\n }\n })\n },\n fetchServices: () => {\n return ItemActions.fetchAll({\n apiVersion: 'boomerang',\n filter: { services: true, archived: false, show_in_store: true },\n page: {\n number: 1,\n size: 100\n }\n })\n }\n }\n}\n\nconst decoratedComponent = compose(\n withStore,\n withTheme,\n withTranslation('user'),\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(Services)\n\nregisterCustomElement('bq-cart-services', decoratedComponent, {\n attributes: ['title']\n})\n\nexport default decoratedComponent\n","import styled, { createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nimport P from 'ui/elements/P'\nimport Hr from 'ui/elements/Hr'\n\nconst BaseGrid = styled.div`\n display: grid;\n grid-template-columns: 1fr max-content;\n grid-gap: 8px;\n\n ${P} {\n margin: 0;\n }\n`\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --totals-text-color: var(--color-primary-foreground, ${color('Text/Primary')});\n\n --totals-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --totals-breakdown-font-size: 16px;\n --totals-breakdown-font-weight: 400;\n\n --totals-total-font-size: 20px;\n --totals-total-font-weight: 700;\n\n --totals-error-padding: 16px;\n --totals-error-border-radius: 8px;\n --totals-error-background-color: #FFEAEF;\n --totals-error-color: var(--color-red, ${color('Danger/Base')});\n --totals-error-gap: 16px;\n --totals-error-font-size: 16px;\n --totals-error-font-weight: 400;\n }\n\n ${Hr} {\n border: none;\n border-top: var(--totals-border);\n }\n`\n\nexport const Breakdown = styled(BaseGrid)`\n ${P} {\n font-family: var(--font-body);\n font-size: var(--totals-breakdown-font-size);\n font-weight: var(--totals-breakdown-font-weight);\n\n color: var(--totals-text-color);\n }\n`\n\nexport const Total = styled(BaseGrid)`\n ${P} {\n font-family: var(--font-body);\n font-size: var(--totals-total-font-size);\n font-weight: var(--totals-total-font-weight);\n\n color: var(--totals-text-color);\n }\n`\n\nexport const Error = styled.div`\n display: grid;\n grid-template-columns: max-content 1fr;\n align-items: center;\n\n padding: var(--totals-error-padding);\n\n border-radius: var(--totals-error-border-radius);\n\n background-color: var(--totals-error-background-color);\n\n gap: var(--totals-error-gap);\n\n svg {\n width: 20px;\n height: 20px;\n\n fill: var(--totals-error-color);\n color: var(--totals-error-color);\n }\n\n ${P} {\n margin: 0;\n\n font-family: var(--font-body);\n font-size: var(--totals-error-font-size);\n font-weight: var(--totals-error-font-weight);\n\n color: var(--totals-error-color);\n }\n`\n","// React\nimport React, { Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport Spacer from 'ui/blocks/Spacer'\nimport { Error } from './styles'\nimport P from 'ui/elements/P'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faExclamationTriangle as fasExclamationTriangle } from '@fortawesome/pro-regular-svg-icons'\n\n// Hooks\nimport { useCart } from 'shop-components/utils/useCart'\nimport { useOrm } from 'shared/utils/useOrm'\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useSettings } from 'shared/utils/useSettings'\n\nexport const Errors = ({ onError }) => {\n let errorText\n let cannotCheckout = false\n\n const { cart, isOverdue, isEmpty } = useCart()\n\n const useAvailability = useSettings('store.use_availability')\n\n const unavailableLines = useOrm('lines', (lines) => {\n return lines\n .getAll({\n id: cart?.lines,\n can_checkout: false\n })\n .filter((line) => line.line_type !== 'delivery_rate')\n })\n\n const { t } = useTranslation('user')\n\n const hasDates = !!(cart?.starts_at && cart?.stops_at)\n\n if (hasDates && cannotCheckout) {\n errorText = t('user.store.not_all_products_available')\n }\n\n if (!hasDates) {\n errorText = t('user.store.select_a_period', 'Select a rental period')\n }\n\n if (isOverdue) {\n errorText = t('user.checkout.dates_in_past')\n }\n\n if (useAvailability) {\n cannotCheckout = unavailableLines.size() > 0\n }\n\n useEffect(() => {\n if (errorText || isEmpty) {\n onError(errorText || true)\n } else {\n onError(null)\n }\n }, [errorText, isEmpty])\n\n if (!errorText) return null\n\n return (\n <Fragment>\n <Error>\n <FontAwesomeIcon icon={fasExclamationTriangle} />\n <P>{errorText}</P>\n </Error>\n <Spacer />\n </Fragment>\n )\n}\n\nErrors.displayName = 'Errors'\n\nErrors.propTypes = {\n onError: PropTypes.func\n}\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nconst statusColors = {\n error: '--book-button-error-color'\n}\n\nexport const HostStyles = createGlobalStyle`\n :host {\n --book-button-button-color: var(--color-accent-background, ${color('branding')});\n --book-button-button-label-color: var(--color-accent-foreground, ${color('white')});\n\n --secondary-button-button-color: var(--color-primary-background, ${color('white')});\n --secondary-button-button-label-color: var(--color-primary-foreground, ${color('Text/Primary')});\n --secondary-button-button-border: 1px solid var(--color-border, ${color('Misc/Divider')});\n\n --book-button-error-color: var(--color-red, ${color('Danger/Base')});\n\n --book-button-label-weight: 700;\n\n --book-button-input-border-radius: 6px;\n --book-button-button-border-radius: 6px;\n\n --book-button-control-height: 48px;\n\n --book-button-button-padding: 0 14px;\n --book-button-button-width: 100%;\n }\n\n * {\n box-sizing: border-box;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n }\n`\n\nexport const Label = styled.span`\n color: var(--book-button-button-label-color);\n\n font-weight: var(--book-button-label-weight);\n`\n\nexport const Overlay = styled.div`\n position: absolute;\n\n width: 100%;\n height: 100%;\n\n top: 0;\n left: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n max-height: 18px;\n max-width: 18px;\n\n height: 100%;\n width: 100%;\n\n &.loading {\n animation: spin 1s linear infinite;\n }\n }\n`\n\nexport const Button = styled.button`\n display: block;\n position: relative;\n\n width: var(--book-button-button-width);\n height: var(--book-button-control-height);\n\n padding: var(--book-button-button-padding);\n\n background-color: var(--book-button-button-color);\n color: var(--book-button-button-label-color);\n\n border: none;\n border-radius: var(--book-button-button-border-radius);\n\n cursor: pointer;\n\n &:hover {\n box-shadow: inset 0px 0px 400px 110px rgba(0, 0, 0, 0.12);\n }\n\n transition: all 0.2s ease-in-out;\n\n ${({ loading }) =>\n loading &&\n css`\n cursor: progress;\n\n ${Label} {\n opacity: 0;\n visibility: hidden;\n }\n `}\n\n ${({ disabled }) =>\n disabled &&\n css`\n cursor: not-allowed;\n\n opacity: 0.6;\n `}\n\n ${({ status }) =>\n status &&\n css`\n background-color: var(${statusColors[status]});\n\n ${Label} {\n opacity: 0;\n visibility: hidden;\n }\n `}\n\n ${({ secondary }) =>\n secondary &&\n css`\n background-color: var(--secondary-button-button-color);\n\n border: var(--secondary-button-button-border);\n\n ${Label} {\n color: var(--secondary-button-button-label-color);\n }\n `}\n`\n","// React\nimport React, { Fragment, useState, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { Button as ButtonContainer, HostStyles, Label, Overlay } from './styles'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faSpinnerThird as farSpinnerThird, faTimes as farTimes } from '@fortawesome/pro-regular-svg-icons'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport ClientActions from 'store/v2/redux/actions/client'\n\nconst CheckoutButton = ({ disabled, t, book }) => {\n const [loading, setLoading] = useState(false)\n const [status, setStatus] = useState(null)\n\n const handleBook = useCallback(() => {\n let timeout\n\n setLoading(true)\n\n book()\n .catch(() => {\n setStatus('error')\n })\n .finally(() => {\n setLoading(false)\n timeout = setTimeout(() => {\n setStatus(null)\n }, 3000)\n })\n\n return () => {\n clearTimeout(timeout)\n }\n }, [])\n\n return (\n <Fragment>\n <HostStyles />\n <ButtonContainer\n onClick={loading || disabled ? undefined : handleBook}\n disabled={disabled}\n loading={loading ? true : undefined}\n status={status}\n className=\"bq-button\"\n >\n <Label>{t('user.store.checkout')}</Label>\n {loading && (\n <Overlay>\n <FontAwesomeIcon className=\"loading\" icon={farSpinnerThird} size=\"sm\" />\n </Overlay>\n )}\n {status === 'error' && (\n <Overlay>\n <FontAwesomeIcon icon={farTimes} size=\"sm\" />\n </Overlay>\n )}\n </ButtonContainer>\n </Fragment>\n )\n}\n\nCheckoutButton.displayName = 'Button'\n\nCheckoutButton.propTypes = {\n disabled: PropTypes.bool,\n book: PropTypes.func,\n t: PropTypes.func\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n book: () => {\n return new Promise((resolve, reject) => {\n if (ClientActions.evaluateCartOverdue()) {\n reject(new Error('Cart is overdue'))\n } else {\n ClientActions.setCheckingOut()\n\n resolve()\n }\n })\n }\n }\n}\n\nexport default compose(withTranslation('user'), reduxConnect(null, mapDispatchToProps))(CheckoutButton)\n","// React\nimport { useCallback } from 'react'\n\nexport const useNavigation = () => {\n const backToStore = useCallback(() => {\n const previewing = window.location.pathname.includes('/preview')\n const backUrl = window.booqableOptions?.cart.backToStoreUrl\n\n if (previewing || !backUrl) {\n return window.history.back()\n }\n\n return window.location.replace(backUrl)\n }, [])\n\n return { backToStore }\n}\n","// React\nimport React, { Fragment, useCallback } from 'react'\nimport PropTypes from 'prop-types'\n\n// Components\nimport { Button as ButtonContainer, HostStyles, Label } from './styles'\n\n// Shared\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { useNavigation } from 'shop-components/utils/navigation'\n\nconst BackToStoreButton = ({ disabled, t }) => {\n const { backToStore } = useNavigation()\n\n const handleGoBackToStore = useCallback((e) => {\n e?.preventDefault()\n\n backToStore()\n }, [])\n\n return (\n <Fragment>\n <HostStyles />\n <ButtonContainer\n onClick={disabled ? undefined : handleGoBackToStore}\n disabled={disabled}\n className=\"bq-button\"\n secondary\n >\n <Label>{t('user.store.continue_shopping')}</Label>\n </ButtonContainer>\n </Fragment>\n )\n}\n\nBackToStoreButton.displayName = 'Button'\n\nBackToStoreButton.propTypes = {\n disabled: PropTypes.bool,\n t: PropTypes.func\n}\n\nexport default withTranslation('user')(BackToStoreButton)\n","// React\nimport React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Components\nimport { Breakdown } from './styles'\nimport P from 'ui/elements/P'\nimport Hr from 'ui/elements/Hr'\n\n// Shared\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\nimport { withTranslation } from 'shared/utils/withTranslation'\n\nconst Discounts = ({ lines, currency }) => {\n if (!lines.length) return null\n\n return (\n <Fragment>\n <Breakdown>\n {lines.map(({ key, label, value }) => (\n <Fragment key={key}>\n <P>{label}</P>\n <P>{FormatUtils.money(value, currency)}</P>\n </Fragment>\n ))}\n </Breakdown>\n <Hr />\n </Fragment>\n )\n}\n\nDiscounts.propTypes = {\n lines: PropTypes.array,\n currency: PropTypes.object\n}\n\nconst mapStateToProps = (state, props) => {\n const lines = []\n\n const currency = state.client.currency.toJS()\n const coupon = state.orm.coupons.getById(props.cart.coupon_id)\n const discountLabel = props.t('user.checkout.discount')\n\n if (props.cart.discount_percentage !== 0) {\n lines.push({\n key: 'cart',\n label: props.t('user.auth.account_discount'),\n value: props.cart.discount_in_cents * -1\n })\n }\n\n if (coupon) {\n let label\n const value = props.cart.coupon_discount_in_cents * -1\n\n if (coupon.coupon_type === 'percentage') {\n label = `${props.t('user.checkout.coupon')}: ${coupon.value}% ${discountLabel.toLowerCase()}`\n } else {\n label = `${props.t('user.checkout.coupon')} ${discountLabel.toLowerCase()}`\n }\n\n lines.push({ key: 'coupon', label, value })\n }\n\n return {\n lines,\n currency\n }\n}\n\nexport default compose(\n withTranslation('user'),\n reduxConnect(mapStateToProps)\n)(Discounts)\n","// React\nimport React, { Fragment, useState } from 'react'\nimport { compose } from 'redux'\n\n// Components\nimport { Breakdown, HostStyles, Total } from './styles'\nimport P from 'ui/elements/P'\nimport Spacer from 'ui/blocks/Spacer'\nimport Div from 'ui/elements/Div'\nimport { Errors } from './Errors'\nimport CheckoutButton from './Buttons/Checkout'\nimport BackToStoreButton from './Buttons/BackToStore'\nimport Discounts from './Discounts'\n\n// Hooks\nimport { useTranslation } from 'shared/utils/useTranslation'\nimport { useCart } from 'shop-components/utils/useCart'\n\n// Shared\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport { Format as FormatUtils } from 'back_office/v2/utils/utils'\n\nconst Totals = () => {\n const [error, setError] = useState(null)\n\n const { cart, totalPriceAttribute, showPrices, currency } = useCart()\n\n const { t } = useTranslation('user')\n\n if (!cart?.lines) return null\n\n return (\n <Fragment>\n <HostStyles />\n <Div>\n {showPrices && (\n <Fragment>\n <Discounts cart={cart} />\n <Total>\n <P>{t('user.store.subtotal')}</P>\n <P>{FormatUtils.money(cart[totalPriceAttribute], currency)}</P>\n </Total>\n {cart.deposit_in_cents > 0 && (\n <Fragment>\n <Spacer size=\"xs\" />\n <Breakdown>\n <P>{t('user.store.security_deposit')}</P>\n <P>{FormatUtils.money(cart.deposit_in_cents, currency)}</P>\n </Breakdown>\n </Fragment>\n )}\n <Spacer />\n </Fragment>\n )}\n <Errors onError={setError} />\n <CheckoutButton disabled={!!error} />\n <Spacer />\n <BackToStoreButton />\n </Div>\n </Fragment>\n )\n}\n\nconst decoratedComponent = compose(withTheme, withStore)(Totals)\n\nregisterCustomElement('bq-cart-totals', decoratedComponent)\n\nexport default decoratedComponent\n","import styled, { css, createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nexport const HostStyles = createGlobalStyle`\n :host, :root {\n --minicart-launcher-height: 60px;\n --minicart-launcher-open-width: 325px;\n --minicart-launcher-bottom: 16px;\n --minicart-launcher-right: 16px;\n --minicart-launcher-accent-color: var(--color-accent-background, ${color('branding')});\n --minicart-launcher-background-color: var(--color-accent-foreground, ${color('white')});\n --minicart-launcher-border-radius: var(--border-radius-sm, 8px);\n --minicart-launcher-padding: 8px;\n --minicart-launcher-font-size: 13px;\n --minicart-launcher-icon-size: 26px;\n --minicart-launcher-font: var(--font-body, --minicart-font, Source Sans Pro, sans-serif);\n --minicart-launcher-shadow: 0px 4px 12px 0px ${color('black')};\n }\n`\n\nexport const Launcher = styled.div`\n display: flex;\n position: fixed;\n\n right: var(--minicart-launcher-right);\n bottom: var(--minicart-launcher-bottom);\n\n height: var(--minicart-launcher-height);\n width: var(--minicart-launcher-height);\n\n font-family: var(--minicart-launcher-font);\n\n overflow: hidden;\n\n border-radius: var(--minicart-launcher-border-radius);\n\n cursor: pointer;\n\n transition: width 0.5s ease-in-out 0.1s;\n transition-delay: 0.5s;\n\n box-shadow: var(--minicart-launcher-shadow);\n\n &:hover {\n ${({ cartOpen }) => !cartOpen && css`\n width: var(--minicart-launcher-open-width);\n `}\n }\n\n`\n\nexport const MiniCartContainer = styled.div`\n position: fixed;\n right: 16px;\n bottom: 84px;\n`\n\nexport const Icon = styled.div`\n display: flex;\n\n justify-content: center;\n align-items: center;\n\n height: var(--minicart-launcher-height);\n min-width: var(--minicart-launcher-height);\n\n color: var(--minicart-launcher-background-color);\n background: var(--minicart-launcher-accent-color);\n\n > svg {\n font-size: var(--minicart-launcher-icon-size);\n height: var(--minicart-launcher-icon-size);\n width: var(--minicart-launcher-icon-size);\n }\n`\n\nexport const Summary = styled.div`\n padding: var(--minicart-launcher-padding);\n\n font-size: var(--minicart-launcher-font-size);\n\n width: calc(var(--minicart-launcher-open-width) - var(--minicart-launcher-height));\n /* Akwardly split line to please eslint */\n min-width: calc(var(--minicart-launcher-open-width) - var(--minicart-launcher-height)\n - (var(--minicart-launcher-padding) * 2));\n`\n\nexport const Dates = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n > svg {\n font-size: var(--minicart-launcher-font-size);\n height: var(--minicart-launcher-font-size);\n width: var(--minicart-launcher-font-size);\n }\n`\n\nexport const Details = styled.div`\n > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n`\n\nLauncher.MiniCartContainer = MiniCartContainer\nLauncher.Icon = Icon\nLauncher.Summary = Summary\nLauncher.Dates = Dates\nLauncher.Details = Details\n\nexport default Launcher\n","// React\nimport React, { Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCartShopping as fasCartShopping, faArrowRight as fasArrowRight } from '@fortawesome/pro-solid-svg-icons'\n\n// Components\nimport BLauncher, { HostStyles } from './styles'\nimport MiniCart from 'shop-components/components/MiniCart'\n\n// Shared\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport Format from 'shared/utils/format'\nimport { setUserFrameworkCartData } from 'shared/utils/userFrameworkEvents'\nimport ClientActions from 'store/v2/redux/actions/client'\n\nconst Launcher = ({\n cart,\n cartOpen,\n toggleCart,\n useTimes,\n usePrices,\n timeFormat,\n itemCount,\n currency,\n totalPriceAttribute,\n t\n}) => {\n useEffect(() => {\n setUserFrameworkCartData()\n }, [cart])\n\n return (\n <Fragment>\n <HostStyles />\n {cart && (\n <BLauncher.MiniCartContainer>\n <MiniCart inPortal t={t} />\n </BLauncher.MiniCartContainer>\n )}\n <BLauncher\n key={`booqable-launcher-${cartOpen}`}\n id=\"booqable-launcher\"\n cartOpen={cartOpen}\n onClick={toggleCart.bind(null, !cartOpen)}\n >\n <BLauncher.Icon>\n <FontAwesomeIcon icon={fasCartShopping} size=\"lg\" />\n </BLauncher.Icon>\n <BLauncher.Summary id=\"booqable-launcher-summary\">\n <BLauncher.Details>\n {cart?.starts_at ?\n (\n <BLauncher.Dates>\n <span>\n {Format.date(cart.starts_at)}\n {useTimes && Format.date(cart.starts_at, timeFormat)}\n </span>\n <FontAwesomeIcon icon={fasArrowRight} />\n <span>\n {Format.date(cart.stops_at)}\n {useTimes && Format.date(cart.stops_at, timeFormat)}\n </span>\n </BLauncher.Dates>\n ) :\n (\n <BLauncher.Dates>{t('user.store.select_a_period')}</BLauncher.Dates>\n )}\n </BLauncher.Details>\n <hr />\n <BLauncher.Details>\n {cart && itemCount ?\n (\n <div>\n <span>\n {itemCount} {t('common.resources.item', { count: itemCount })}\n </span>\n {usePrices && (\n <span className=\"bq-total\">{Format.money(cart?.get(totalPriceAttribute), currency)}</span>\n )}\n </div>\n ) :\n (\n <span>{t('user.store.cart_empty')}</span>\n )}\n </BLauncher.Details>\n </BLauncher.Summary>\n </BLauncher>\n </Fragment>\n )\n}\n\nLauncher.displayName = 'MiniCartLauncher'\n\nLauncher.propTypes = {\n cartOpen: PropTypes.bool,\n toggleCart: PropTypes.func,\n cart: PropTypes.object,\n useTimes: PropTypes.bool,\n usePrices: PropTypes.bool,\n timeFormat: PropTypes.string,\n totalPriceAttribute: PropTypes.string,\n currency: PropTypes.object,\n itemCount: PropTypes.number,\n t: PropTypes.func\n}\n\nconst mapStateToProps = (state) => {\n let timeFormat, totalPriceAttribute\n\n if (state.settings.get('dates.use_am_pm')) {\n timeFormat = 'hh:mm A'\n } else {\n timeFormat = 'HH:mm'\n }\n\n const cart = state.orm.carts.getById(state.client.cartId)\n const lines = state.orm.lines.getAll({ id: cart?.lines, product_type: ['consumable', 'rental', 'bundle'] })\n\n const itemCount = lines.map((line) => line.quantity).reduce((a, b) => a + b, 0)\n\n if (state.settings.get('pricing.tax_strategy') === 'inclusive') {\n totalPriceAttribute = 'grand_total_with_tax_in_cents'\n } else {\n totalPriceAttribute = 'grand_total_in_cents'\n }\n\n return {\n cartOpen: state.client.cartOpen,\n cart,\n currency: state.client.currency,\n totalPriceAttribute,\n timeFormat,\n useTimes: state.settings.get('store.use_times'),\n usePrices: state.settings.get('store.use_prices'),\n itemCount\n }\n}\n\nconst mapDispatchToProps = () => {\n return {\n toggleCart: (cartOpen) => {\n return ClientActions.toggleCart(cartOpen)\n },\n closePicker: () => {\n return ClientActions.toggleModalPicker(false)\n }\n }\n}\n\nconst decoratedComponent = compose(\n withTranslation('user'),\n withTheme,\n withStore,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(Launcher)\n\nregisterCustomElement('bq-minicart-launcher', decoratedComponent)\n\nexport default decoratedComponent\n","import styled, { createGlobalStyle } from 'styled-components'\nimport { color } from 'ui/themes/utils'\n\nexport const HostStyles = createGlobalStyle`\n :host, :root {\n /* Container variables */\n --minicart-button-size: 24px;\n --minicart-button-color: var(--color-primary-foreground, ${color('white')});\n --minicart-button-hover-color: var(--color-primary-foreground, ${color('white')});\n --minicart-button-hover-opacity: 0.6;\n --minicart-button-transition-duration: 0ms;\n\n /* Updated container variables */\n --minicart-button-transition-property: none;\n --minicart-button-transition-timing-function: linear;\n --minicart-button-transition-delay: 0ms;\n --minicart-button-outer-padding: 0px;\n --minicart-button-outer-border: none;\n --minicart-button-outer-hover-border: none;\n --minicart-button-outer-border-radius: 0px;\n --minicart-button-outer-background: transparent;\n --minicart-button-outer-background-hover: transparent;\n --minicart-button-outer-transition: none;\n\n /* Badge variables */\n --minicart-button-badge-color: var(--color-accent-foreground, ${color('white')});\n --minicart-button-border-radius: 12px;\n --minicart-button-padding: 4px;\n --minicart-button-font: var(--font-body, --minicart-font, Source Sans Pro, sans-serif);\n --minicart-button-font-size: 12px;\n --minicart-button-accent-color: var(--color-accent-background, ${color('branding')});\n --minicart-button-badge-size: 16px;\n }\n`\n\nexport const Button = styled.div`\n position: relative;\n\n border: var(--minicart-button-outer-border);\n border-radius: var(--minicart-button-outer-border-radius);\n background: var(--minicart-button-outer-background);\n\n padding: var(--minicart-button-outer-padding);\n\n color: var(--minicart-button-color);\n\n cursor: pointer;\n\n > svg {\n height: var(--minicart-button-size);\n width: var(--minicart-button-size);\n }\n\n &:hover {\n color: var(--minicart-button-hover-color);\n\n border: var(--minicart-button-outer-hover-border);\n background: var(--minicart-button-outer-background-hover);\n\n > svg {\n opacity: var(--minicart-button-hover-opacity);\n }\n }\n\n transition-property: var(--minicart-button-transition-property);\n transition-duration: var(--minicart-button-transition-duration);\n transition-timing-function: var(--minicart-button-transition-timing-function);\n transition-delay: var(--minicart-button-transition-delay);\n`\n\nexport const Badge = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n position: absolute;\n bottom: 50%;\n left: 50%;\n\n min-height: var(--minicart-button-badge-size);\n min-width: var(--minicart-button-badge-size);\n aspect-ratio: 1/1;\n\n padding: var(--minicart-button-padding);\n\n border-radius: var(--minicart-button-border-radius);\n\n background: var(--minicart-button-accent-color);\n color: var(--minicart-button-badge-color);\n\n font-family: var(--minicart-button-font);\n font-size: var(--minicart-button-font-size);\n font-weight: 600;\n line-height: var(--minicart-button-badge-size);\n white-space: nowrap;\n text-wrap: nowrap;\n\n user-select: none;\n`\n\nButton.Badge = Badge\n\nexport default Button\n","// React\nimport React, { Fragment, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect as reduxConnect } from 'react-redux'\nimport { compose } from 'redux'\n\n// Libraries\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faShoppingCart as fasShoppingCart } from '@fortawesome/pro-solid-svg-icons'\nimport { faShoppingCart as farShoppingCart } from '@fortawesome/pro-regular-svg-icons'\nimport { faShoppingCart as falShoppingCart } from '@fortawesome/pro-light-svg-icons'\nimport { faShoppingCart as fatShoppingCart } from '@fortawesome/pro-thin-svg-icons'\n\nimport { StyleSheetManager } from 'styled-components'\n\n// Components\nimport BMiniCartButton, { HostStyles } from './styles'\nimport MiniCart from 'shop-components/components/MiniCart'\nimport Popover from 'ui/components/Popover'\nimport PortalWrapper from 'ui/components/PortalWrapper'\n\n// Shared\nimport { Settings as SettingsUtils } from 'back_office/v2/utils/utils'\nimport registerCustomElement from 'shop-components/utils/registerCustomElement'\nimport withStore from 'shop-components/utils/withStore'\nimport withTheme from 'shop-components/utils/withTheme'\nimport { withTranslation } from 'shared/utils/withTranslation'\nimport { setUserFrameworkCartData } from 'shared/utils/userFrameworkEvents'\nimport ClientActions from 'store/v2/redux/actions/client'\nimport useIsMobile from 'shared/utils/useIsMobile'\nimport { shouldForwardProp } from 'shared/utils/shouldForwardProp'\n\nconst getIcon = (style) => {\n switch (style) {\n case 'solid':\n return fasShoppingCart\n case 'regular':\n return farShoppingCart\n case 'light':\n return falShoppingCart\n case 'thin':\n return fatShoppingCart\n default:\n return farShoppingCart\n }\n}\n\nconst MiniCartButton = ({ cart, cartOpen, toggleCart, iconStyle, itemCount }) => {\n const isMobile = useIsMobile()\n const icon = getIcon(iconStyle)\n\n useEffect(() => {\n setUserFrameworkCartData()\n }, [cart])\n\n const renderCartButton = () => {\n return (\n <Fragment>\n <HostStyles />\n <BMiniCartButton\n key=\"booqable-minicart-button\"\n id=\"booqable-minicart-button\"\n onClick={toggleCart.bind(null, !cartOpen)}\n >\n <FontAwesomeIcon icon={icon} size=\"lg\" />\n {itemCount > 0 && <BMiniCartButton.Badge>{itemCount}</BMiniCartButton.Badge>}\n </BMiniCartButton>\n </Fragment>\n )\n }\n\n const renderMiniCart = () => {\n return (\n <StyleSheetManager target={document.body} shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <MiniCart />\n </StyleSheetManager>\n )\n }\n\n if (isMobile) {\n return (\n <Fragment>\n <PortalWrapper open={cartOpen}>\n <StyleSheetManager target={document.body} shouldForwardProp={shouldForwardProp} enableVendorPrefixes>\n <MiniCart />\n </StyleSheetManager>\n </PortalWrapper>\n {renderCartButton()}\n </Fragment>\n )\n }\n\n return (\n <Popover\n open={cartOpen}\n onClose={toggleCart.bind(null, false)}\n method=\"manual\"\n direction=\"bottom-end\"\n content={renderMiniCart}\n useContentWrapper={false}\n zIndex={9999999}\n >\n {renderCartButton()}\n </Popover>\n )\n}\n\nMiniCartButton.displayName = 'MiniCartButton'\n\nMiniCartButton.propTypes = {\n cart: PropTypes.object,\n cartOpen: PropTypes.bool,\n toggleCart: PropTypes.func,\n itemCount: PropTypes.number,\n iconStyle: PropTypes.oneOf(['solid', 'regular', 'light', 'thin'])\n}\n\nconst mapStateToProps = (state, props) => {\n const cart = state.orm.carts.getById(state.client.cartId)\n const lines = state.orm.lines.getAll({ id: cart?.lines, product_type: ['consumable', 'rental', 'bundle'] })\n\n const itemCount = lines.map((line) => line.quantity).reduce((a, b) => a + b, 0)\n\n return {\n isShowCartBehavior: SettingsUtils.get('store.behaviors.add_button') === 'show_cart',\n cart,\n cartOpen: state.client.cartOpen,\n itemCount\n }\n}\n\nconst mapDispatchToProps = (dispatch, props) => {\n return {\n toggleCart: (cartOpen) => {\n return ClientActions.toggleCart(cartOpen)\n }\n }\n}\n\nconst decoratedComponent = compose(\n withTranslation('user'),\n withTheme,\n withStore,\n reduxConnect(mapStateToProps, mapDispatchToProps)\n)(MiniCartButton)\n\nregisterCustomElement('bq-minicart-button', decoratedComponent, {\n attributes: ['icon-style']\n})\n\nexport default decoratedComponent\n","\n\nimport React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport cuid from 'cuid'\nimport Cookie from 'js-cookie'\nimport getFingerprint from 'shared/utils/get_fingerprint'\n\nimport LocaleActions from 'store/v2/redux/actions/locale'\nimport clientActions from 'store/v2/redux/actions/client'\nimport ItemActions from 'store/v2/redux/actions/item'\nimport BundleActions from 'store/v2/redux/actions/bundle'\nimport ProductGroupActions from 'store/v2/redux/actions/product_group'\nimport getProvider from 'store/v2/get_provider'\nimport { initShopTracking } from 'shared/utils/userFrameworkEvents'\n\nimport Cart from './scenes/cart'\nimport ProductGroup from './scenes/product_group'\nimport ProductList from './scenes/product_list'\nimport ProductButton from 'store/v2/react/scenes/product_button'\nimport ProductDetail from './scenes/product_detail'\nimport Quickview from './scenes/quickview'\nimport ProductSearch from './scenes/product_search'\nimport SeparateDatePicker from './scenes/separate_date_picker'\nimport CollectionList from './scenes/collection_list'\nimport FilterBar from './scenes/filter_bar'\nimport SortingSelect from './scenes/sorting_select'\nimport Sidebar from './scenes/sidebar'\nimport EmbeddableCart from './scenes/embeddable_cart'\nimport EmbeddableCartLines from './scenes/embeddable_cart_lines'\nimport EmbeddableCartSidebar from './scenes/embeddable_cart_sidebar'\nimport CartButton from './scenes/cart_button'\n\nimport 'shop-components/components/ProductAvailability'\nimport 'shop-components/components/ProductPrice/Price'\nimport 'shop-components/components/ProductPrice/Label'\nimport 'shop-components/components/ProductVariationsSelect'\nimport 'shop-components/components/ProductAvailabilityCalendar'\nimport 'shop-components/components/ProductButton'\nimport 'shop-components/components/DatePicker'\nimport 'shop-components/components/DatePicker/Modal'\nimport 'shop-components/components/MiniCart'\nimport 'shop-components/components/ProductGallery'\nimport 'shop-components/components/BundleItems'\nimport 'shop-components/components/CartLines'\nimport 'shop-components/components/CartServices'\nimport 'shop-components/components/CartTotals'\nimport 'shop-components/components/MiniCartLauncher'\nimport 'shop-components/components/MiniCartButton'\n\n// Set storeProvider for tracking\nif (!window.booqableOptions.storeProvider) {\n if (getProvider.isWix()) {\n window.booqableOptions.storeProvider = 'Wix'\n } else if (getProvider.isWeebly()) {\n window.booqableOptions.storeProvider = 'Weebly'\n } else if (getProvider.isSquarespace()) {\n window.booqableOptions.storeProvider = 'Squarespace'\n } else if (getProvider.isShopify()) {\n window.booqableOptions.storeProvider = 'Shopify'\n }\n}\n\nlet cartId\n\n// Migrate 'old' cookie to localStorage\nif ((cartId = Cookie.get('cartId'))) {\n localStorage.bqCartId = cartId\n Cookie.remove('cartId')\n}\n\nif ((cartId = localStorage.bqCartId)) {\n clientActions.setCartId(cartId)\n}\n\nconst booqableRoots = []\n\n// memoize root elements\nlet cartRoot, quickviewRoot\n\nwindow.initBooqableComponents = function () {\n for (const root of Array.from(booqableRoots)) {\n root?.unmount()\n }\n\n // For fetching product card data\n const cardIds = []\n\n // For fetching button/detail data\n const detailIds = []\n\n const initializeLocale = () => {\n let locale\n\n if (navigator.language != null) {\n locale = navigator.language\n } else if (navigator.languages != null) {\n locale = navigator.languages[0]\n }\n\n return LocaleActions.set(locale)\n }\n\n const initializeLauncher = () => {\n if (window.booqableOptions.disableLauncher) {\n return\n }\n\n const embeddableCartElements = {\n 'booqable-cart-button': document.querySelector('.booqable-cart-button'),\n 'booqable-embeddable-cart': document.querySelector('.booqable-embeddable-cart'),\n 'booqable-embeddable-cart-lines': document.querySelector('.booqable-embeddable-cart-lines'),\n 'booqable-embeddable-cart-sidebar': document.querySelector('.booqable-embeddable-cart-sidebar'),\n 'bq-minicart': document.querySelector('bq-minicart'),\n 'bq-minicart-launcher': document.querySelector('bq-minicart-launcher'),\n 'bq-minicart-button': document.querySelector('bq-minicart-button'),\n 'bq-date-picker': document.querySelector('bq-date-picker'),\n 'bq-date-picker-modal': document.querySelector('bq-date-picker-modal')\n }\n\n const usedEmbeddableCartElements = Object.entries(embeddableCartElements).filter(([_, v]) => v !== null)\n\n if (usedEmbeddableCartElements.length > 0) {\n // We save the embeddableCartElements key to the booqableOptions objects for tracking purposes\n window.booqableOptions.embeddableCartElements = Object.keys(\n Object.fromEntries(usedEmbeddableCartElements)\n ).join(', ')\n\n // Embeddable cart is being used, don't use launcher\n return\n }\n\n // # Initialize the cart launcher\n let launcher\n\n if (!(launcher = document.getElementById('booqable-cart'))) {\n launcher = document.createElement('div')\n launcher.setAttribute('id', 'booqable-cart')\n document.body.appendChild(launcher)\n clientActions.setFloatingCart()\n }\n\n const component = <Cart />\n\n cartRoot = cartRoot || createRoot(document.getElementById('booqable-cart'))\n cartRoot.render(component)\n\n return launcher.setAttribute('initialized', 'true')\n }\n\n const initializeProductQuickview = () => {\n // # Initialize quickview\n const quickview = document.createElement('div')\n\n quickview.setAttribute('id', 'booqable-quickview')\n document.body.appendChild(quickview)\n\n const component = <Quickview />\n\n quickviewRoot = quickviewRoot || createRoot(document.getElementById('booqable-quickview'))\n\n return quickviewRoot.render(component)\n }\n\n const initializeLegacy = () => {\n // # Support for legacy v1 components\n const legacyComponents = document.getElementsByClassName('booqable-product-component')\n\n return Array.from(legacyComponents).map((node) => (node.className += ' booqable-product-button'))\n }\n\n const initializeProducts = () => {\n const products = document.getElementsByClassName('booqable-product')\n\n const result = []\n\n for (const node of Array.from(products)) {\n if (node.parentElement.className !== 'booqable-product-list') {\n // Get product group id\n const { id } = node.dataset\n\n cardIds.push(id)\n\n const component = <ProductGroup {...node.dataset} />\n const root = createRoot(node)\n\n root.render(component)\n result.push(booqableRoots.push(root))\n } else {\n result.push(undefined)\n }\n }\n\n return result\n }\n\n const initializeProductButtons = () => {\n // # Render all products buttons\n const productButtons = document.getElementsByClassName('booqable-product-button')\n\n const result = []\n\n for (const node of Array.from(productButtons)) {\n const { dataset } = node\n // Get product group id\n const { id } = dataset\n\n dataset.uiKey = id\n dataset.productGroupId = id\n detailIds.push(id)\n\n const component = <ProductButton {...dataset} />\n const root = createRoot(node)\n\n root.render(component)\n result.push(booqableRoots.push(root))\n }\n\n return result\n }\n\n const initializeProductDetails = () => {\n // # Render all product details\n const productDetails = document.getElementsByClassName('booqable-product-detail')\n\n const result = []\n\n for (const node of Array.from(productDetails)) {\n const { dataset } = node\n // Get product group id\n const { id } = dataset\n\n dataset.uiKey = id\n dataset.productGroupId = id\n detailIds.push(id)\n\n const component = <ProductDetail {...dataset} />\n const root = createRoot(node)\n\n root.render(component)\n result.push(booqableRoots.push(root))\n }\n\n return result\n }\n\n const initializeProductLists = () => {\n // # Render Product List component\n const productLists = document.getElementsByClassName('booqable-product-list')\n\n const result = []\n\n for (const node of Array.from(productLists)) {\n const props = node.dataset\n\n props.uiKey = cuid()\n\n const component = <ProductList {...props} />\n const root = createRoot(node)\n\n root.render(component)\n result.push(booqableRoots.push(root))\n }\n\n return result\n }\n\n const initializeProductSearch = () => {\n // # Render product search component\n const productSearches = document.getElementsByClassName('booqable-product-search')\n\n const result = []\n\n for (const node of Array.from(productSearches)) {\n const props = node.dataset\n\n props.uiKey = cuid()\n\n const component = <ProductSearch {...props} />\n const root = createRoot(node)\n\n root.render(component)\n result.push(booqableRoots.push(root))\n }\n\n return result\n }\n\n const initializeStandardComponents = () => {\n const result = []\n const components = {\n 'booqable-datepicker': SeparateDatePicker,\n 'booqable-categories': CollectionList,\n 'booqable-collections': CollectionList,\n 'booqable-bar': FilterBar,\n 'booqable-sort': SortingSelect,\n // Re-enable when availability filtering performance is improved\n // 'booqable-filter': FilterSelect,\n 'booqable-sidebar': Sidebar,\n 'booqable-embeddable-cart': EmbeddableCart,\n 'booqable-embeddable-cart-lines': EmbeddableCartLines,\n 'booqable-embeddable-cart-sidebar': EmbeddableCartSidebar,\n 'booqable-cart-button': CartButton\n }\n\n Object.keys(components).forEach((className) => {\n const nodes = document.getElementsByClassName(className)\n\n for (const node of Array.from(nodes)) {\n const props = node.dataset\n const Component = components[className]\n const root = createRoot(node)\n\n root.render(<Component {...props} />)\n result.push(booqableRoots.push(root))\n }\n })\n\n return result\n }\n\n initializeLocale()\n initializeLauncher()\n initializeProductQuickview()\n initializeLegacy()\n initializeProducts()\n initializeProductButtons()\n initializeProductDetails()\n initializeProductLists()\n initializeProductSearch()\n initializeStandardComponents()\n\n // # Fetch all product groups on the page\n if (cardIds.length > 0) {\n if (!window.bqFetchingProducts) {\n window.bqFetchingProducts = true\n\n ItemActions.fetchAll({ ids: cardIds, cart_id: cartId, include: 'photo', apiVersion: 3 })\n .then(() => {\n window.bqFetchingProducts = false\n }).catch((e) => {\n window.bqFetchingProducts = false\n\n if (e === 'Online reservations are disabled') {\n booqableRoots.forEach((root) => root?.unmount())\n\n cartRoot = cartRoot || createRoot(document.getElementById('booqable-cart'))\n cartRoot.unmount()\n }\n })\n }\n }\n\n if (detailIds.length > 0) {\n window.bqFetchingDetailProducts = true\n\n const actions = []\n\n actions.push(ProductGroupActions.fetchAll({\n ids: detailIds,\n cart_id: cartId,\n include: 'photos,products',\n apiVersion: 3\n }))\n\n actions.push(BundleActions.fetchAll({\n ids: detailIds,\n cart_id: cartId,\n include: [\n 'photos',\n 'bundle_items',\n 'bundle_items.product',\n 'bundle_items.product.photo',\n 'bundle_items.product_group',\n 'bundle_items.product_group.products',\n 'bundle_items.product_group.photo',\n 'bundle_items.product_group.products',\n 'bundle_items.product_group.products.photo'\n ].join(','),\n apiVersion: 3\n }))\n\n Promise.all(actions)\n .then(() => {\n window.bqFetchingDetailProducts = false\n })\n .catch(() => {\n window.bqFetchingDetailProducts = false\n })\n }\n}\n\ngetFingerprint((fingerprint) => {\n window.fingerprint = fingerprint\n window.initBooqableComponents()\n\n clientActions.initialize().then(() => {\n initShopTracking()\n })\n})\n","import ReduxModel from 'shared/lib/orm/reduxModel'\n\nconst Model = {}\n\nModel.Cart = ReduxModel('Cart', {\n defaultValues: {},\n hasMany: {\n lines: { namespace: Model }\n },\n hasOne: {\n coupon: { namespace: Model }\n }\n})\n\nModel.Line = ReduxModel('Line', {\n defaultValues: {},\n belongsTo: {\n cart: { namespace: Model }\n }\n})\n\nModel.ProductGroup = ReduxModel('ProductGroup', {\n defaultValues: {},\n hasMany: {\n products: { foreignKey: 'product_group_id', namespace: Model },\n album_photos: { namespace: Model, modelName: 'Photo' }\n\n },\n hasOne: {\n photo: { namespace: Model }\n }\n})\n\nModel.Product = ReduxModel('Product', {\n defaultValues: {},\n belongsTo: {\n product_group: { namespace: Model }\n }\n})\n\nModel.Item = ReduxModel('Item', {\n apiVersion: 3\n})\n\nModel.Bundle = ReduxModel('Bundle', {\n apiVersion: 3\n})\n\nModel.BundleItem = ReduxModel('BundleItem', {\n apiVersion: 3\n})\n\nModel.Location = ReduxModel('Location', {\n apiVersion: 3\n})\n\nModel.Availability = ReduxModel('ShopAvailability')\n\nModel.OperatingDateTime = ReduxModel('OperatingDateTime')\n\nModel.OperatingRule = ReduxModel('OperatingRule')\n\nModel.Photo = ReduxModel('Photo')\n\nModel.Collection = ReduxModel('Collection')\n\nModel.Coupon = ReduxModel('Coupon')\n\nexport default Model\n","import Immutable from 'immutable'\n\nconst Record = Immutable.Record({\n floatingCart: false,\n cartOpen: false,\n modalPickerOpen: false,\n cartScroll: 0,\n cartId: null,\n periodPickerOpen: false,\n checkingOut: false,\n currency: Immutable.Map(),\n translations: Immutable.Map(),\n company: Immutable.Map(),\n custom_fields: {},\n enabledFeatures: [],\n locale: 'en',\n cartOverdue: false,\n firstTimeSelectable: undefined,\n defaultStartTime: undefined,\n defaultStopTime: undefined,\n readOnlyMode: false\n})\n\nconst initialState = new Record()\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case 'CARTS_SET_PERIOD_SUCCESS':\n case 'CARTS_FETCH_SUCCESS':\n case 'CARTS_BOOK_SUCCESS':\n case 'CARTS_UPDATE_SUCCESS': {\n const { id } = action.payload.response.cart\n const data = action.payload.response.meta\n\n data.cartId = id\n localStorage.bqCartId = id\n\n return state.merge({\n cartId: id,\n company: data.company,\n currency: data.currency,\n custom_fields: data.custom_fields,\n enabledFeatures: data.features_enabled,\n translations: data.translations\n })\n }\n case 'LOCALE_SET':\n return state.merge({\n locale: action.payload.locale\n })\n case 'DEFAULT_TIMES_INITIALIZED':\n return state.merge(action.payload)\n case 'SET_CART_ID':\n return state.merge(action.payload)\n case 'SET_FLOATING_CART':\n return state.merge(action.payload)\n case 'TOGGLE_CART':\n return state.merge(action.payload)\n case 'TOGGLE_PICKER':\n return state.merge(action.payload)\n case 'TOGGLE_PERIOD_PICKER':\n return state.merge(action.payload)\n case 'SET_CART_SCROLL':\n return state.merge(action.payload)\n case 'SET_CHECKING_OUT':\n return state.merge({ checkingOut: action.payload !== undefined ? action.payload : true })\n case 'SET_CART_OVERDUE':\n return state.merge({ cartOverdue: action.payload })\n case 'SET_READ_ONLY_MODE':\n return state.set('readOnlyMode', action.payload.read_only_mode)\n default:\n return state\n }\n}\n","import { Map } from 'immutable'\n\nconst initialState = Map({\n global: Map({\n q: '',\n collection_id: null,\n sort_by: null,\n filter_by: null\n })\n})\n\nexport default (state = initialState, action) => {\n switch (action.type) {\n case 'SET_FILTER_SEARCH_QUERY':\n {\n const key = action.payload.key\n const previousValue = state.get(key)\n const value = previousValue ? previousValue.merge({ q: action.payload.value }) : { q: action.payload.value }\n\n return state.merge({ [key]: value })\n }\n case 'SET_FILTER_COLLECTION':\n {\n const key = action.payload.key\n const previousValue = state.get(key)\n const value = previousValue ?\n previousValue.merge({ collection_id: action.payload.value }) :\n { collection_id: action.payload.value }\n\n return state.merge({ [key]: value })\n }\n case 'SET_FILTER_SORT_BY':\n {\n const key = action.payload.key\n const previousValue = state.get(key)\n const value = previousValue ?\n previousValue.merge({ sort_by: action.payload.value }) :\n { sort_by: action.payload.value }\n\n return state.merge({ [key]: value })\n }\n case 'SET_FILTER_FILTER_BY':\n {\n const key = action.payload.key\n const previousValue = state.get(key)\n const value = previousValue ?\n previousValue.merge({ filter_by: action.payload.value }) :\n { filter_by: action.payload.value }\n\n return state.merge({ [key]: value })\n }\n case 'SETTINGS_INITIALIZED':\n {\n const settings = action.payload.settings\n\n return state.map(\n (key) => key.merge({ sort_by: settings['store.default_sort'], filter_by: settings['store.default_filter'] })\n )\n }\n default:\n return state\n }\n}\n","import _uniqBy from 'lodash/uniqBy'\nimport _sortBy from 'lodash/sortBy'\n\nconst initialState = {\n loading: false,\n records: {}\n}\n\nconst itemsReducer = (state = initialState, action) => {\n switch (action.type) {\n case 'PRODUCTS_FETCH_START':\n case 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_START':\n case 'PRODUCT_AVAILABILITIES_FETCH_START':\n case 'PRODUCT_PRICES_FETCH_START':\n case 'PRODUCT_IMAGES_FETCH_START':\n return {\n ...state,\n loading: true\n }\n case 'PRODUCTS_FETCH_ERROR':\n case 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_ERROR':\n case 'PRODUCT_AVAILABILITIES_FETCH_ERROR':\n case 'PRODUCT_PRICES_FETCH_ERROR':\n case 'PRODUCT_IMAGES_FETCH_ERROR':\n return {\n ...state,\n loading: false\n }\n // Fetching products\n case 'PRODUCTS_FETCH_SUCCESS': {\n const records = action.payload.records.reduce((state, item) => {\n const existing = state[item.id]\n\n if (existing) {\n return {\n ...state,\n [item.id]: {\n ...existing,\n ...item\n }\n }\n }\n\n return {\n ...state,\n [item.id]: item\n }\n }, state.records)\n\n return {\n loading: false,\n records\n }\n }\n // Fetching product availabilities\n case 'PRODUCT_AVAILABILITIES_FETCH_SUCCESS': {\n const records = action.payload.records.reduce((state, availability) => {\n const existing = state[availability.item_id]\n\n if (existing) {\n return {\n ...state,\n [availability.item_id]: {\n ...existing,\n availability\n }\n }\n }\n\n return {\n ...state,\n [availability.item_id]: {\n id: availability.item_id,\n availability\n }\n }\n }, state.records)\n\n return {\n loading: false,\n records\n }\n }\n // Fetching product variation availabilities\n case 'PRODUCT_VARIATION_AVAILABILITIES_FETCH_SUCCESS': {\n const records = action.payload.records.reduce((state, availability) => {\n const existing = state[action.payload.productId]\n\n if (existing) {\n const products = existing.products.map((product) => {\n if (product.id === availability.item_id) {\n return {\n ...product,\n availability\n }\n }\n\n return product\n })\n\n return {\n ...state,\n [action.payload.productId]: {\n ...existing,\n products\n }\n }\n }\n\n return {\n ...state,\n [action.payload.productId]: {\n id: action.payload.productId,\n products: [\n {\n id: availability.item_id,\n availability\n }\n ]\n }\n }\n }, state.records)\n\n return {\n loading: false,\n records\n }\n }\n // Fetching product prices\n case 'PRODUCT_PRICES_FETCH_SUCCESS': {\n const records = action.payload.records.reduce((state, price) => {\n const existing = state[price.item_id]\n\n if (existing) {\n // If the price was updated by changing configuration,\n // we don't want to override it if the new price is not a configuration price\n if (existing.method === 'configuration' && action.payload.method !== 'configuration') return state\n\n return {\n ...state,\n [price.item_id]: {\n ...existing,\n price,\n ...(action.payload.method === 'configuration' && { method: 'configuration' })\n }\n }\n }\n\n return {\n ...state,\n [price.item_id]: {\n id: price.item_id,\n price,\n ...(action.payload.method === 'configuration' && { method: 'configuration' })\n }\n }\n }, state.records)\n\n return {\n loading: false,\n records\n }\n }\n // Fetching product images\n case 'PRODUCT_IMAGES_FETCH_SUCCESS': {\n const records = action.payload.records.reduce((state, image) => {\n const existing = state[image.owner_id]\n\n if (existing) {\n return {\n ...state,\n [image.owner_id]: {\n ...existing,\n photos: _sortBy(_uniqBy([...existing.photos, image], 'id'), 'position')\n }\n }\n }\n\n return {\n ...state,\n [image.owner_id]: {\n id: image.owner_id,\n photos: [image]\n }\n }\n }, state.records)\n\n return {\n loading: false,\n records\n }\n }\n // Updating product variation\n case 'PRODUCT_UPDATE_VARIATION': {\n const { id, variationId } = action.payload\n\n const records = { ...state.records, [id]: { ...state.records[id], variation_id: variationId } }\n\n return {\n ...state,\n records\n }\n }\n // Updating product configuration\n case 'PRODUCT_UPDATE_CONFIGURATION': {\n const { id, itemId, variationId } = action.payload\n\n const records = {\n ...state.records,\n [id]: {\n ...state.records[id],\n configuration: {\n ...state.records[id].configuration,\n [itemId]: variationId\n }\n }\n }\n\n return {\n ...state,\n records\n }\n }\n default:\n return state\n }\n}\n\nexport default itemsReducer\n","import { reducer as interfaceReducer } from 'shared/redux/interface'\n\nimport ORM from 'shared/lib/orm/orm'\n\nimport clientReducer from './client'\nimport settingsReducer from 'shared/redux/reducers/settings'\nimport filterReducer from './filter'\nimport itemsReducer from 'shop-components/redux/reducers/items'\n\nconst rootReducer = (state = {}, action) => ({\n orm: ORM.reducer(state.orm, action, state),\n\n client: clientReducer(state.client, action, state),\n interface: interfaceReducer(state.interface, action, state),\n settings: settingsReducer(state.settings, action, state),\n filter: filterReducer(state.filter, action, state),\n items: itemsReducer(state.items, action, state)\n})\n\nexport default rootReducer\n","import { applyMiddleware, compose, createStore } from 'redux'\n\nimport rootReducer from './reducers/index'\nimport thunkMiddleware from 'redux-thunk'\n\nconst middleware = []\n\nmiddleware.push(thunkMiddleware)\n\nlet enhancer = applyMiddleware(...middleware)\n\nif (window.__REDUX_DEVTOOLS_EXTENSION__ != null) {\n enhancer = compose(\n enhancer,\n typeof window.__REDUX_DEVTOOLS_EXTENSION__ === 'function' ? window.__REDUX_DEVTOOLS_EXTENSION__() : undefined\n )\n}\n\nconst store = createStore(rootReducer, {}, enhancer)\n\nexport default store\n","import styled, { css } from 'styled-components'\nimport { size } from 'ui/themes/utils'\n\nimport Div from 'ui/elements/Div'\n\nexport const ActionGroup = styled(Div)`\n text-align: right;\n\n > *:not(:first-child) {\n margin-left: ${size('margin')};\n }\n\n * {\n display: inline-block;\n }\n\n ${(props) => props.float && css`\n float: right;\n `}\n\n ${(props) => props.left && css`\n text-align: left;\n `}\n\n ${({ flex }) => flex && css`\n display: flex;\n `}\n\n ${({ align }) => align && css`\n align-items: ${align};\n `}\n\n ${({ justify }) => justify && css`\n justify-content: ${justify};\n `}\n\n ${({ spacing }) => spacing && css`\n > *:not(:first-child) {\n margin-left: ${size('margin', spacing)};\n }\n `}\n`\n","import styled from 'styled-components'\nimport { injectModifiers } from 'ui/themes/utils'\nimport modifiers from 'ui/themes/modifiers'\n\nconst Img = styled.img`\n ${({ theme }) => injectModifiers(modifiers(theme))}\n`\n\nexport default Img\n"],"names":["CookieNotice","init","config","translations","en","CookieConsent","run","this","_settings","showPreferencesModal","showPreferences","servicesTable","services","Booqable","_apps","marketing","forEach","app","find","service","name","push","domain","desc","description","_services","map","label","filter","reduce","acc","_refreshAppConsent","cookie","tracking","includes","onConsent","onDeny","self","defaults","hideFromBots","navigator","webdriver","autoShow","categories","necessary","enabled","readOnly","language","default","onChange","Object","assign","undefined","window","imageFocus","require","location","pathname","origin","value","localStorage","setItem","getItem","initBooqableComponents","setCartData","data","cartData","_events","on","event","callback","context","hasOwnProperty","_trigger","args","Array","prototype","slice","call","arguments","callbacks","i","length","apply","off","listener","loadScript","src","_isScriptLoaded","tag","document","createElement","async","getElementsByTagName","appendChild","unloadScript","_findScript","removeChild","jQuery","_defer","$","querySelector","_once","func","didRun","TypeError","condition","method","attempt","setTimeout","_prependChild","parentElement","element","insertBefore","firstChild","essential","_initApps","entries","_","apps","_consentToAllApps","registerApp","category","appConfig","Error","_gtag","type","gtag","_prepare_gtag_event_data","currency","items","item","item_id","item_name","quantity","price","setupGoogleAnalytics","trackingId","defaultPageTracking","defaultEvents","options","linker","accept_incoming","dataLayer","Date","_setupGoogleAnalyticsDefaultPageTracking","_setupGoogleAnalyticsDefaultEvents","page_title","send_to","grandTotalWithTax","event_data","coupon","cartId","tax","_fbq","fbq","_prepare_fbq_event_data","contents","id","content_name","setupFacebook","fbId","f","b","e","n","t","s","callMethod","queue","loaded","version","parentNode","_setupFacebookDefaultEvents","setupIntercom","appId","intercomSettings","app_id","w","ic","Intercom","d","c","l","x","q","attachEvent","addEventListener","_loadIntercom","decorateLinkForTracking","link","ga","trackers","getAll","tracker","gaplugins","Linker","decorate","querySelectorAll","form","button","submitter","classList","contains","setAttribute","booqableStore","booqableGetStore","elementDataset","Promise","Bluebird","Model","accounting","cuid","warnings","onPossiblyUnhandledRejection","error","message","fingerPrintOptions","excludes","fonts","screenResolution","availableScreenResolution","store","locale","setLocale","booqableOptions","split","moment","tryLoadLocales","locales","then","dispatch","payload","loadLocale","catch","substring","toLowerCase","notSupported","localeWithSubstring","join","API","prefix","apiURL","getLocalCartId","cart","bqCartId","starts_at","startsAt","OperatinRuleUtils","isTimeSelectable","Cart","createAction","params","provider","storeProvider","pathName","startsWith","previewing","get","apiVersion","put","createResource","getBrandingColor","primaryColor","SettingUtils","clientActions","initialize","cartActions","fetch","source","embeddable_cart_elements","embeddableCartElements","action","settings","response","meta","OperatingRule","hydrate","operating_rules","Location","locations","evaluateCartOverdue","brandingColor","brandingUtils","resolve","_reject","defaultStartTime","TimeUtils","defaultStopTime","state","getState","startType","useTimes","firstTimeSelectable","OperatingRuleUtils","initializeDefaultTimes","setFloatingCart","floatingCart","toggleCart","open","cartOpen","toggleModalPicker","modalPickerOpen","setCartScroll","pixels","cartScroll","setCheckingOut","client","orm","carts","getById","checkoutURL","checkout_url","checkoutDomain","match","replace","checkoutURLwithSearch","search","setCartId","overdue","cartUtils","Item","actions","fetchAllOnPage","products","getElementsByClassName","itemIds","specificIds","node","from","dataset","Bundle","fetchAll","ids","cart_id","ProductGroup","include","post","productIds","isSquarespace","iterator","createNodeIterator","head","NodeFilter","SHOW_COMMENT","filterNone","curNode","nextNode","nodeValue","isWix","metaNode","content","isWeebly","_W","isShopify","Shopify","FILTER_ACCEPT","triggerUserFrameworkBookEvent","productId","_store","currencySettings","session","line","lines","first","price_each_in_cents","product","Math","abs","triggerUserFrameworkViewProductEvent","iso_code","price_in_cents","setUserFrameworkCartData","coupon_id","coupons","orderId","order_id","deposit","deposit_in_cents","couponDiscount","coupon_discount_in_cents","toBePaid","to_be_paid_in_cents","totalDueLater","total_due_later_in_cents","grandtotal","grand_total_in_cents","grand_total_with_tax_in_cents","tax_values","taxValue","value_in_cents","prev","current","identifier","title","Period","styled","div","withConfig","displayName","Icon","size","Details","Detail","p","DateTime","ChoosePeriod","DatesBase","WithDates","NoDates","Placeholder","Component","static","PropTypes","hasDates","timeFormat","autoOpenedModal","onAutoModal","modalOpen","togglePicker","componentDidUpdate","prevProps","props","handleOpenModal","render","hasLocations","React","BPeriod","className","onClick","start_location_id","Format","icon","stop_location_id","stops_at","reduxComponent","reduxConnect","mapStateToProps","mapDispatchToProps","ClientActions","withTranslation","Line","updateUI","useAvailability","decreaseQty","increaseQty","showPrices","hideProductAvailabilityQuantities","remove","ui","deleting","style","opacity","transform","componentDidMount","available","available_quantity","statusClass","titleClass","product_type","key","photo_url","Fragment","discountable","display_price_in_cents","compose","uiConnect","persist","toJS","tracking_type","_dispatch","book","line_id","quantityChange","newQuantity","Delay","initial","children","period","constructor","super","getDerivedStateFromProps","setProps","setState","prevState","Logo","width","height","viewBox","xmlns","stroke","strokeWidth","fill","fillRule","propTypes","PoweredBy","logoWidth","useTranslation","href","featureEnabled","FeatureFlags","EQUIPMENT_RENTAL_SOFTWARE_LINK","target","rel","easing","stiffness","damping","Lines","cannotCheckout","nonServiceCartLinesCount","showPoweredBy","componentWillUnmount","ReactCSSTransitionGroup","transitionName","transitionEnterTimeout","transitionLeaveTimeout","transitionAppear","transitionEnter","component","delayed","Motion","defaultStyle","v","spring","uiKey","testMode","bind","pluck","ProductPrice","chargeLabel","priceInCents","show","productType","priceType","FormatUtils","usePrices","hasPrice","Services","Service","disabled","css","Label","span","fontSize","fontWeight","index","inCart","toggleService","loading","setLoading","useState","checked","setChecked","handleChangeService","useCallback","console","finally","BServices","SettingsUtils","charge_label","price_type","Switch","field","withActiveEffect","relative","block","_state","reverse","CartActions","fetchServices","useEffect","isServiceInCart","serviceId","enabledServices","product_groups","show_in_store","product_group_id","sortBy","sorting_weight","ProductGroupActions","color","Overdue","BOverdue","FloatingCart","totalPriceAttribute","checkingOut","viewCartHref","checkoutButtonValid","cartOverdue","inPortal","renderCheckoutButton","checkoutButtonClass","checkoutButton","tooltipContent","Tooltip","direction","floatingCartClasses","StyleSheetManager","body","shouldForwardProp","enableVendorPrefixes","slug","getIn","searchParams","URLSearchParams","preview","previewUrlComposer","themeId","cart_url","can_checkout","sort","preventDefault","Backdrop","Div","theme","font","Body","Header","Footer","Container","Close","Button","Modal","onClose","modifiers","nodeRef","useRef","useLayoutEffect","originalStyle","getComputedStyle","overflow","useLockScroll","handleBackdropClick","currentTarget","Transition","in","timeout","enter","exit","PortalWrapper","backdrop","container","isRequired","ModalClose","forwardRef","ref","ModalHeader","_extends","ModalTitle","H3","ModalBody","ModalFooter","UserAddressesSelect","addresses","selectedAddress","setSelectedAddress","useFormikContext","address","Select","option","setValues","values","delivery_address_property_id","delivery_address","pick","forceValue","forceOnChange","DeliveryFulfillmentForm","userAddresses","setUserAddresses","isUserAuthenticated","setIsUserAuthenticated","tOrEmptyString","Trans","useSelector","useOrm","countries","toArray","provinces","isAuthEnabled","useSettings","authUri","user_login_url","encodeURIComponent","userAddressesUrl","axios","properties","fetchCountriesAndProvinces","AddressFields","defaultFormLayout","addressFieldsOrder","skipValidation","featureDisabled","NEW_ADDRESS_VALIDATION","invalidExistingAddressWarning","fieldTranslationPrefix","errorKey","selectPlaceholder","initialValues","addressIdentifier","fieldDebounce","Span","i18nKey","components","Link","A","fetchDeliveryOptionsRequest","deliveryAddress","apiUrl","delivery","skip_checkout_validation","skip_shortage_validation","CartPickerContext","createContext","onSave","onValidate","isValid","isLoading","CartPickerProvider","setIsValid","setIsLoading","previousCart","usePrevious","behavior","defaultStartLocationId","defaultStopLocationId","handleChange","newValues","handleValidate","valid","handleSave","nextValues","DELIVERIES","fulfillment_type","update","ItemActions","Provider","useCartPicker","useContext","useDeliveryOptions","fetchAvailability","onError","resetError","isFirstMount","formattedDeliveryAddress","useMemo","perform","fetchDeliveryOptions","useCachedQuery","queryFn","cache","Map","previousKey","has","onSuccess","cached","onLoading","result","set","err","rates","isDelivery","isEmpty","country","address1","zipcode","city","keys","errors","valuesAreEqual","isEqual","all","request","useSearchParam","paramName","paramValue","setParamValue","handleUrlChange","removeEventListener","FulfillmentType","deliveryError","setDeliveryError","fulfillmentTab","pickupLocations","archived_at","fulfillment_capabilities","deliveryLocations","showFulfillmentTypeSelect","isPickup","setFieldValue","fulfillmentType","country_id","setFieldError","setErrors","BCartPicker","Section","FontAwesomeIcon","farTriangleExclamation","FulfillmentTypeSelect","Field","inputModifiers","radioGroup","radioGroupIcon","radioGroupLabel","disableStyling","LocationPicker","handleLocationChange","ReadOnlyModeDisabledComponent","readOnlyMode","maxWidth","pointerEvents","Availability","CartPicker","availabilities","minDate","duration","setDuration","openingHours","useOpeningHours","intervalInMinutes","transformer","parseInt","handleMonthChange","date","showAvailability","lineCount","year","getFullYear","month","getMonth","durationData","handleAvailabilityFetch","day","toDate","getDate","location_id","PickerProvider","validateOnBlur","WrapperComponent","startLocationLabel","stopLocationLabel","CartFlowPicker","onMonthChange","promiseDebounce","onOpen","onDurationChange","handleChangeDuration","_duration","address2","first_name","last_name","region","province_id","mode","format","useAMOrPM","shop_availabilities","availabilityLoading","pendingRequests","_props","created_at","_isAMomentObject","duration_period","AvailabilityActions","fetchCalendarAvailability","CartPickerInner","onSaveCallback","withBranding","promise","setPromise","isMobile","useIsMobile","clsx","ActionGroup","ModalCartPicker","CartPickerContainer","clearCart","mobile","innerWidth","handleClearAndClose","handleClose","clear","Launcher","itemCount","floating","position","bottom","right","countLabel","launcherClassNames","a","isShowCartBehavior","showPicker","setShowPicker","deprecatedColors","primary","secondary","colors","success","info","warning","danger","light","palette","grey","dark","borderHover","black","white","transparent","branding","blue","green","orange","red","purple","grid","unit","Number","isInteger","units","base","fallback","mono","fontAwesomeStyle","xs","sm","md","lg","lgplus","xl","xxl","xxxl","weight","lighter","normal","semibold","bold","borderRadius","borderWidth","controlHeight","margin","padding","mdplus","xlplus","shadow","smplus","screenSizes","destroying","zIndex","Themed","ThemeProvider","BThemed","CartScene","findByIdOrSlug","collection","legacy_id","IdFinder","hideOnLoad","shouldComponentUpdate","nextProps","itemSelectors","bundles","itemId","unsetItem","Product","photo","hasPrices","openQuickview","setWidth","findAncestor","el","cls","findDOMNode","offsetWidth","maxPerRow","floor","max","min","renderLoading","renderContent","_get","imageSrc","imageCoordinates","FocalImage","url","coordinates","maintainAspect","_capitalize","display","photos","photo_id","quickviewActions","getAttribute","Pagination","page","pages","showPrev","showNext","handlePage","handleNextPage","handlePrevPage","renderPages","allPages","_range","till","classNames","ceil","total","per","handlePageChange","setFilterSearchQuery","setFilterSortBy","setFilterFilterBy","ProductSearch","filterKey","setValue","placeholder","onKeyUp","blur","handleClearClick","focus","decoratedComponent","searchKey","Collection","active","I","CollectionList","ul","noPadding","collections","rootCollections","fetchCollections","brandColor","horizontalRule","setOpen","handleToggleCollection","collectionId","stopPropagation","prevOpen","handleFilterByCollection","nativeEvent","stopImmediatePropagation","setFilterCollection","renderCollection","parent_id","isOpen","hasChildren","BCollectionList","item_count","CollectionActions","ProductList","hasItems","searchVisible","collectionsVisible","loadingItems","wrapClass","limit","tags","searchValue","cartModalOpen","initialLoaded","fetchItems","equals","resetFilter","number","category_id","collection_id","filter_by","_isEmpty","sort_by","_map","normalizedResponse","entities","total_count","scrollIntoView","scrollTo","handleModalOpen","handleModalClose","renderList","range","ns","showSearch","showCollections","showCategories","List","ProductButton","BundleItems","BundleItemRow","BundleItemCell","bundleItems","productGroups","configuration","setBundleConfiguration","chooseInitialConfiguration","newConfiguration","clone","bundleItem","product_id","choices","getFirst","handleChangeVariation","bundleItemId","selectedProductId","renderSelectVariation","selectedProduct","renderItem","productGroup","BProductButton","large_url","NO_PRODUCT_IMAGE","has_variations","bundle_items","bundle_id","productGroupIds","TimeTable","P","ScrollContainer","inOpeningHours","Indicator","status","background","selected","showCounts","firstOpenElement","time","timeTable","localDate","localMomentInUTC","BTimeTable","dateFormat","Loader","availability","to","hour","minute","operatingRules","isSame","ProductAvailabilityCalendar","CalendarContainer","InputContainer","BQuantityInput","Control","AvailabilityLink","languages","productConfiguration","firstDayOfWeek","translate","showPast","showTimes","defaultLocationId","selectedLocationId","containerWidth","handleFetchAvailability","debounce","containerRef","getBoundingClientRect","handlePopoverOpen","handleDayClick","handleTimeTableClose","handlePopoverClose","locationId","renderLocationSelect","InputField","pluckObject","renderNativeOnMobile","renderQuantityInput","renderDay","availabilityData","PickerDay","availableCount","interactive","renderAvailabilityCalendar","localMoment","selectionStart","selectionEnd","past","before","BProductAvailabilityCalendar","SwitchTransition","CSSTransition","addEndListener","done","BDayPicker","DayPicker","navbarElement","Navigation","localeUtils","MomentLocaleUtils","onDayClick","disabledDays","isDayClosed","allowPast","renderMobile","BDatePickerInput","MobileWrapper","Popover","fallbackPlacements","offset","fixed","ProductAvailabilityCalendarWrapper","fetchItemAvailability","selectedForProductGroup","productGroupId","addLineQtyUI","qty","newQty","bundle","showProductAvailability","onChangeProductId","addButtonUsesCheckoutBehaviour","cartChanged","updated_at","isBundle","bundleConfigChanged","_isEqual","loadItemData","loadBundlePriceAndAvailability","productSelectors","BundleActions","handleBook","handleChangeQuantity","newBundleConfiguration","configurationAvailability","renderAvailability","withProductAvailability","currentMonth","useBusinessHours","withAvailability","priceEachInCents","_isNaN","branded","Spacer","vertical","getOperatingRules","lineActions","checkout","addToCart","ProductImage","MainImage","visible","MainImageContainer","magnify","canMagnify","GalleryImages","GalleryImagesContainer","GalleryImageContainer","GalleryImage","img","Controls","Gallery","ImageMagnify","ReactInputPosition","ImageContainer","Image","Portal","image","scale","PortalContainer","MagnifyContainer","ImageRenderer","originalRef","originalDimensions","setOriginalDimensions","imageIsVertical","BImageMagnify","originalImage","alt","imageAlt","onLoad","handleOriginalLoad","offsetHeight","createPortal","zoomedSize","zoomedWidth","elementDimensions","zoomedHeight","zoomedImage","backgroundPosition","calculatePosition","y","box","lo","wo","interpolateNumber","activePosition","portalTarget","mouseActivationMethod","MOUSE_ACTIVATION","HOVER","cursorStyle","cursorStyleActive","ModalGallery","Title","h3","Wrapper","ControlWrapper","swipe","setSwipe","swiping","setSwiping","galleryOffset","setGalleryOffset","dimensions","setDimensions","photoIndex","indexOf","selectedPhoto","getMaximumOffset","showGallery","showControls","BModalGallery","onTouchEnd","itemTitle","onTouchStart","touch","touches","clientX","onTouchMove","changedTouches","handlePhotoSelect","onImageLoad","handleImagesBackward","handleImagesForward","onThumbnailPress","noBorder","noBorderRadius","defaultPhoto","photoId","Element","hideFocalImages","newSelectedPhoto","_find","newState","maximumOffset","handleChangeImage","handleClick","handleTouch","handleGalleryClose","handleThumbnailPress","photosArray","selectedPhotoURL","currentIndex","_findIndex","showMobileGallery","selectedLargePhotoURL","xlarge_url","BProductImage","ProductImageWrapper","owner_id","ownerId","albumPhotos","ProductDetail","triggeredTracking","hovered","bqFetchingDetailProducts","fetchData","magnifyRef","dangerouslySetInnerHTML","__html","mapDispatchToProp","QuickviewInner","closeWrapper","close","QuickviewInnerComposed","Quickview","ProductSearchContainer","DateTimeContainer","transparentize","useAMPM","SeparateDatePicker","periodType","isLocationInputEnabled","FunctionalSeparateDatePicker","SeparateDatePickerContainer","CollectionListContainer","SortingSelect","handleChangeSortBy","FilterSelect","filterBy","handleChangeFilter","FilterBar","SortingSelectContainer","inline","InlineCartPicker","Sidebar","EmbeddableCartLine","onIncreaseQuantity","onDecreaseQuantity","onRemove","onInputChange","connect","EmbeddableCartLineContainer","handleIncreaseQuantity","handleDecreaseQuantity","handleRemove","handleInputChange","otherProps","_response","EmbeddableCartLinesContainer","LineContainer","EmbeddableCartLines","LinesContainer","EmbeddableCartErrors","errorText","EmbeddableCartTotals","EmbeddableCartSidebar","showContinueShopping","showDatePicker","handleBack","history","back","Totals","Errors","continueShopping","datepicker","EmbeddableCartMobileLine","EmbeddableCartMobileLines","cleanstate","EmbeddableCartMobile","EmbeddableCart","renderMobileForDesktop","test","userAgent","handleWindowResize","renderDesktop","Mobile","EmbeddableCartContainer","compact","EmbeddableCartSidebarContainer","CartButton","iconStyle","fasShoppingCart","farShoppingCart","falShoppingCart","fatShoppingCart","getIcon","renderFloatingCart","renderIcon","part","useContentWrapper","cartIsOpen","CartButtonComponent","CartButtonContainer","HostStyles","createGlobalStyle","registerCustomElement","attributes","mountElement","mountAttributes","styleSheetTarget","webComponentClass","HTMLElement","mountPoint","attachShadow","connectedCallback","isConnected","attrs","camelCase","handleSetAttribute","removeAttribute","shadowRoot","createRoot","childNodes","retargetEvents","disconnectedCallback","customElements","define","baseURL","interceptors","use","paramsSerializer","qs","arrayFormat","encode","getAvailabilities","stopsAt","startLocationId","fetchAvailabilitiesDebounced","_debounce","availabilitiesRequest","records","fetchAvailabilityDebounced","availabilityRequest","getAvailability","ProductAvailability","fetchProductAvailabilities","hideAvailability","Skeleton","availableString","plannable","withStore","withTheme","variation_id","fetchAvailabilities","fetchPricesDebounced","pricesRequest","getPrices","prices","fetchPriceDebounced","priceRequest","getPrice","fetchPrices","fetchPrice","defaultPrice","fetchProductPrice","fetchProductPrices","money","ProductPriceLabel","defaultLabel","select","ProductVariationsSelect","variations","defaultVariation","setVariation","setSelected","handleSelectVariation","BVariationSelect","variation","farChevronDown","priceSortedVariants","_sortBy","fetchVariationAvailability","variationId","AvailabilityCalendar","start","stop","stopLocationId","statusColors","ButtonLabel","ButtonOverlay","InputWrapper","Input","input","SkeletonContainer","farSpinnerThird","farCheck","farTimes","fetchDebounced","fetchRequest","composeItem","included","relationships","_id","product_group","bookProduct","fetchItem","setQuantity","setStatus","isNaN","clearTimeout","handleButtonClick","handleInputFocus","onFocus","farPlus","farMinus","DatePicker","CalendarIcon","ChevronIcon","Cleanstate","CleanstateLabels","CleanstateTitle","CleanstateLabel","SectionGroup","Value","isPlaceholder","useDatePicker","shouldOpenPicker","toggle","count","shallowEqual","isPricingEnabled","isAvailabilityEnabled","dates","isStartValid","isDaySelectable","isStopValid","hasData","labelKey","availabilityEnabled","pricingEnabled","getLabelKey","BDatePicker","falCalendar","falChevronRight","WrapperWithData","Text","ExpandedTitle","Dates","ButtonNext","farCalendar","MiniCart","portal","Head","Notice","inSummary","BButton","Summary","Amount","invert","CheckoutButtons","CheckoutTotals","Remove","Quantity","QuantityButton","ProductName","large","StatusIndicator","Price","DetailContainer","center","BundleContents","BundleContentsTitle","BundleContentsItem","BundleContentsQuantity","BundleItem","BLine","setLoaded","handleToggleOpen","farChevronUp","spin","updateLineQuantity","setDeleting","debouncedUpdateLineQuantity","handleRemoveLine","line_type","farImage","fasTimes","farCircleInfo","BMiniCart","openDatePicker","farArrowRight","headerHeight","Total","Checkbox","servicesPrice","cartItemIds","prevCartRef","headerElementRef","newCart","fromChanged","tillChanged","selectedServices","_intersection","sum","useCart","companySlug","taxStrategy","isOverdue","setAutoOpenedModal","unavailableLines","isCartOpen","isCheckingOut","LineActions","fetchLines","isCheckoutButtonValid","viewCart","OptimizedImage","focal","optimizedSrc","optimizeImageUrl","Img","quality","ProductGallery","Inner","noGap","hidden","small","ThumbnailsInner","Thumbnail","isActive","fetchPhotos","getPhotos","enableThumbnails","enableControls","infiniteScroll","listenerReady","innerRef","thumbnailsWrapperRef","thumbnailsInnerRef","setIndex","withInfiniteScroll","withControls","withThumbnails","scrollLeft","handleInnerScroll","round","handleSnapToThumbnail","currentPhotoId","currentPhotoIndex","findIndex","handleSnapToPhoto","left","top","BProductGallery","handleSnapToPrevPhoto","farChevronLeft","handleSnapToNextPhoto","farChevronRight","BundleItemSelectWrapper","BundleItemSelect","ScrollGradient","side","updateConfiguration","archivedAt","handleSetSelected","BBundleItems","memo","displayTopGradient","setDisplayTopGradient","displayBottomGradient","setDisplayBottomGradient","scrollTop","scrollHeight","renderBundleItem","EmptyText","Cell","Info","withRightOffset","ActionButton","QuantityInput","Variations","Contents","Toggle","ToggleText","Name","handleToggle","hideAvailabilityQuantity","updateLine","handleUpdateQuantity","skipQuantityUpdate","debounceUpdateQuantity","handleUpdateInputQuantity","handleDeleteLine","group_name","variation_values","falTrash","LinesSkeleton","noCenter","fetchContents","_flatten","archived","ServiceContainer","CheckboxContainer","handleToggleService","htmlFor","BaseGrid","Hr","Breakdown","fasExclamationTriangle","Overlay","CheckoutButton","ButtonContainer","reject","BackToStoreButton","backToStore","backUrl","backToStoreUrl","handleGoBackToStore","Discounts","discountLabel","discount_percentage","discount_in_cents","coupon_type","setError","MiniCartContainer","BLauncher","fasCartShopping","fasArrowRight","closePicker","Badge","MiniCartButton","renderCartButton","BMiniCartButton","renderMiniCart","getProvider","Cookie","booqableRoots","cartRoot","quickviewRoot","root","unmount","cardIds","detailIds","initializeLocale","LocaleActions","initializeLauncher","disableLauncher","usedEmbeddableCartElements","fromEntries","launcher","getElementById","initializeProductQuickview","quickview","initializeLegacy","legacyComponents","initializeProducts","initializeProductButtons","productButtons","initializeProductDetails","productDetails","initializeProductLists","productLists","initializeProductSearch","productSearches","initializeStandardComponents","nodes","bqFetchingProducts","Fingerprint2","fingerprint","getFingerprint","googleAnalytics","facebookPixel","initShopTracking","ReduxModel","defaultValues","hasMany","namespace","hasOne","belongsTo","foreignKey","album_photos","modelName","OperatingDateTime","Photo","Coupon","initialState","Immutable","periodPickerOpen","company","custom_fields","enabledFeatures","merge","features_enabled","read_only_mode","global","previousValue","itemsReducer","existing","_uniqBy","rootReducer","ORM","reducer","clientReducer","interface","interfaceReducer","settingsReducer","filterReducer","middleware","thunkMiddleware","enhancer","applyMiddleware","__REDUX_DEVTOOLS_EXTENSION__","createStore","float","flex","align","justify","spacing","injectModifiers"],"sourceRoot":""}