{"version":3,"sources":["webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/Pill.jsx","webpack:///./app/javascript/components/Filters/ElasticSearch.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/AnnualMileage.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/InitialPayment.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/ContractLength.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Manufacturer.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Model.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/FuelType.jsx","webpack:///./app/javascript/components/EligibilityChecker/steps.js","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Transmission.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Budget.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/BodyType.jsx","webpack:///./app/javascript/components/Filters/ModelFiltersContext.jsx","webpack:///./app/javascript/components/Filters/utils.js","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Seats.jsx","webpack:///./app/javascript/components/Filters/QuickDeliveryToggle.jsx","webpack:///./app/javascript/components/Filters/PromotionalToggle.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/Pills.jsx","webpack:///./app/javascript/components/Filters/InStockToggle.jsx","webpack:///./app/javascript/components/Filters/CategoryFilters.jsx","webpack:///./app/javascript/components/Filters/VanBodytypeFilter.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters.jsx","webpack:///./app/javascript/components/DerivativeFilters/DerivativeFilters.jsx","webpack:///./app/javascript/components/EligibilityChecker/Step.jsx","webpack:///./app/javascript/components/EligibilityChecker/FinalScreen.jsx","webpack:///./app/javascript/components/Filters/AllSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/BodyTypeFilters.jsx","webpack:///./app/javascript/components/Filters/BudgetFilters.jsx","webpack:///./app/javascript/components/Filters/DesktopModelFilters.jsx","webpack:///./app/javascript/components/Filters/ElectricSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Range.jsx","webpack:///./app/javascript/components/Filters/EstimatedDeliveryDropdown.jsx","webpack:///./app/javascript/components/Filters/FilterControls.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/ElectricPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/MakePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/FuelTypePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/BudgetPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/BodyTypePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/TransmissionPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/SeatsPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/TermPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/MileagePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/InitialPaymentPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/EstimatedDeliveryPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/InStockPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/PromotionalPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/FunderPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/RangePills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/PayloadPills.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/filterPills/LoadLengthPills.jsx","webpack:///./app/javascript/components/Filters/SortByDropdown.jsx","webpack:///./app/javascript/components/Filters/FundersDropdown.jsx","webpack:///./app/javascript/components/Filters/ShortTermSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/StockOffersFilters.jsx","webpack:///./app/javascript/components/Filters/VanSpecialOffersFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/Payload.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/LoadLength.jsx","webpack:///./app/javascript/components/Filters/MobileFilterControls.jsx","webpack:///./app/javascript/components/Filters/MobileModelFilters.jsx","webpack:///./app/javascript/components/Filters/ModelPills.jsx","webpack:///./app/javascript/components/DerivativeFilters/PricingFilters.jsx","webpack:///./app/javascript/components/EligibilityChecker/EligibilityChecker.jsx","webpack:///./app/javascript/components/EnquireNow/EnquireNow.jsx","webpack:///./app/javascript/components/Filters/FiltersWrapper.jsx","webpack:///./app/javascript/components/Filters/MobileFilterActions.jsx","webpack:///./app/javascript/components/Filters/ModelFiltersWrapper.jsx","webpack:///./app/javascript/components/Filters/OptionList.jsx","webpack:///./app/javascript/components/Filters/SortByFilters.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/EstimatedDelivery.jsx","webpack:///./app/javascript/components/Filters/SpecialOffersFilters/InStock.jsx"],"names":["Pill","category","value","label","dismissable","isMake","isLast","gaFilterName","dispatch","useDispatch","className","classnames","onClick","event","persist","type","payload","form","target","closest","setTimeout","dispatchEvent","Event","bubbles","cancelable","defaultProps","ElasticSearchContext","createContext","PRICE_FILTERS","PRICES_FILTERS_COUNT","ElasticSearchProvider","path","labelMapping","children","useState","allElasticSearchOptions","setAllElasticSearchOptions","availableElasticSearchOptions","setAvailableElasticSearchOptions","initialLoadCompleted","useRef","defaultSelectedFilters","getQueryStringParameters","selectedFilters","useSelector","state","filterControls","filters","filterParams","objectToQueryStringParameters","getAvailableCounts","data","counts","key","Object","prototype","hasOwnProperty","call","startsWith","replace","prices","doc_count","count","useEffect","fetchInitialData","a","current","axios","get","params","response","initialResponse","console","error","fetchFilteredData","filteredResponse","availableData","Provider","allFiltersFor","name","priceFilterName","allBuckets","availableBuckets","allOptions","availableOptions","includes","buckets","map","bucket","toString","option","enabled","find","o","deals","key_as_string","availableBucket","indexOf","availableFiltersFor","hasAnyOption","b","props","setSelectedFilter","checked","newSelectedFilters","push","length","index","splice","filter","item","setSelectedBodytype","removeSelectedFilters","Array","isArray","forEach","nameItem","setSingleCheckboxFilter","useElasticSearch","context","useContext","Error","ElasticSearchWrapper","store","AnnualMileage","options","isDesktop","withoutButton","elasticSearchProps","parseFloat","toLocaleString","sort","selected","title","allText","InitialPayment","concat","ContractLength","monthLabel","Manufacturer","Model","split","reverse","prelabel","join","undefined","disabled","FuelType","optionsOrder","sortedOptions","steps","image","mobileImage","icon","icon1","columns","question","description","icon2","score","icon3","icon4","icon5","icon6","finalScreenData","Transmission","Budget","BodyType","ModelFiltersContext","ModelFiltersProvider","isVans","controller","initialData","setInitialData","setAvailableData","dispatchAndUpdateCountElements","document","querySelectorAll","element","innerText","url","timer","clearTimeout","observer","MutationObserver","derivativesRows","querySelector","moreButton","rowCount","classList","add","remove","observe","childList","disconnect","contextValue","aggregations","availableOption","cheapest_motr","useModelFilters","ModelFiltersWrapper","showPromotionalToggle","showPromotion","action","filterOptions","default","Seats","QuickDeliveryToggle","isDesktopVersion","elasticSearch","style","flexShrink","marginTop","labelPosition","defaultChecked","quickDelivery","PromotionalToggle","lowerCaseValue","toLowerCase","greenToggle","selectedFilter","promotion_name","Pills","memo","InStockToggle","width","stock","CategoryFilters","categoryType","isOpen","isFixed","handleVisible","useCallback","filtersRect","getBoundingClientRect","isAtTop","top","isWideScreen","window","innerWidth","zIndex","addEventListener","removeEventListener","filtersWrapper","classNames","VanBodytypeFilter","sliderRef","selectedSlide","setSelectedSlide","match","fromEntries","entries","keys","slider","ScrollSnapSlider","prev","next","updateArrows","toggle","scrollLeft","offsetWidth","scrollWidth","slideTo","slide","src","ArrowLeftIcon","alt","srcSet","ref","allSelected","hybrid_or_electric","isAll","isElectric","htmlFor","id","onChange","handleSelect","ArrowRightIcon","SpecialOffersFilters","DerivativeOptions","dataGroups","setSelected","setData","dependentFields","alwaysEnabledFilters","isOptionDisabled","filterName","activeData","isAlwaysEnabled","activeOptions","getDataFromJSON","json","reduce","object","groupName","UpdateData","SelectFilter","updatedState","selectedField","selectedFieldName","unselectFields","fieldName","unselectWhenSelected","onUpdateDataEvent","detail","derivativeJSON","dataGroup","true","false","StepComponent","stepData","onAnswer","onNext","onPrevious","stepNumber","currentValue","currentStep","errorMessage","media","step","e","FinalScreen","href","pushData","stepName","AllSpecialOffersFilters","heading","BodytypeFilters","BudgetFilters","AllModelFilters","modelFilters","noWrap","ElectricSpecialOffersFilters","Range","EstimatedDeliveryDropdown","FilterControls","isAdmin","isOnlySortVisible","fundersVisible","pillsRef","arrowLeftRef","arrowRightRef","theme","totalCounts","isEmpty","setIsEmpty","filterList","setFilterList","isOverflown","setIsOverflown","filterControlsForm","filterWrapperRect","height","Math","max","clientWidth","filtersWithoutDefaults","customer_type","sort_by","showEstimatedDelivery","showFunders","showQuickDelivery","shouldShowFeature","showPromotionalStock","marginLeft","display","gap","ElectricPills","MakePills","make","makeIndex","makes","Fragment","model","modelIndex","models","FuelTypePills","display_fueltype","BudgetPills","monthly_prices","BodyTypePills","bodytype_categories","TransmissionPills","transmission","SeatsPills","TermPills","term","MileagePills","mileage","floor","InitialPaymentPills","initial_payment","EstimatedDeliveryPills","estimated_delivery","InStockPills","PromotionalPills","FunderPills","funder","PayloadPills","LoadLengthPills","load_length","SortByDropdown","open","setOpen","dropdownRef","handleOutsideClicks","contains","field","replaceAll","handleClick","FundersDropdown","ShortTermSpecialOffersFilters","StockOffersFilters","VanSpecialOffersFilters","Payload","LoadLength","ClearAllButton","fill","viewBox","xmlns","d","MobileFilterControls","showOnlyInStock","showOnlyPromotional","showSingleToggle","clearAll","MobileModelFilters","useMemo","ModelPills","clearAllButton","mobile","trim","PricingFilters","noValidate","acceptCharset","method","placeholder","EligibilityChecker","eligibilityChecker","allAnswered","areAllQuestionsAnswered","currentScore","calculateCurrentScore","stepsData","about_you","address_history","employment_status","employment_history","affordability","credit_history","finalScreen","setFinalScreen","setErrorMessage","componentRef","Image","values","screen","componentTop","innerHeight","scrollTo","scrollY","behavior","stepComponentData","setEligibilityAnswer","goToNextStep","goToPreviousStep","EligibilityCheckerProvider","EnquireNow","postURL","channelID","isPersonal","geotargetly","pricing","personal_sources","business_sources","featured_deal","offer_id","derivative_id","initial_payment_months","salesAdmin","vehicleId","vehicleStatus","query","Deal","offerId","selectedOfferId","derivativeId","selectedTerm","contractLength","selectedMileage","annualMileage","maintenanceSelected","initialPaymentMonths","initialMonths","selectedOptionIds","actuallySelectedOptionIds","firstName","lastName","businessName","email","telephone","source","disposal","soon","time","comments","timeTrading","businessType","fleetSize","mailList","authenticity_token","leadType","setState","geotargetlyInit","useForm","mode","reValidateMode","register","handleSubmit","errors","getValues","formRef","onSubmit","content","formName","isVan","isShortTerm","form_name","lease_type","signup","monthlyPrice","item_name","item_brand","item_variant","item_category","item_category2","item_category3","fueltype","price","duration","annual_miles","initial_payment_duration","initial_payment_price","initialPaymentPrice","maintenance","maintenance_price","maintainedMonthlyPrice","user_data","phone_number","submit","labelText","required","hasError","first_name","last_name","company_name","contact_business_type","variant","text","contact_fleet_size","pattern","contact_email","validate","isValidNumber","contact_telephone","contact_time","lead_type","contact_source","on_dark","EnquireNowWrapper","FiltersWrapper","actionName","controllerName","useWindowSize","specialOffersFiltersPortal","categoryFiltersPortal","specialOffersPortalElement","getElementById","categoryPortalElement","vehiclesPortalElement","ReactDOM","createPortal","MobileFilterActions","preventDefault","submitForm","MobileFilterActionsWrapper","ModelFilters","mobileFiltersPortal","mobileFiltersElement","OptionList","Item","gaEventAction","gaFilterOption","propTypes","PropTypes","string","isRequired","bool","oneOf","node","func","SortByFilters","onSelect","SortByFiltersWrapper","EstimatedDelivery","InStock","getLabel"],"mappings":"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","file":"js/application~567d3491-0ce2a2722ecc9b805843.chunk.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport classnames from 'classnames';\n\nfunction Pill({ category, value, label = value, dismissable, isMake, isLast, gaFilterName }) {\n const dispatch = useDispatch();\n\n const handleDismiss = (event) => {\n event.persist();\n\n if (dismissable) {\n dispatch({\n type: 'SET_FILTER',\n payload: { category, value },\n });\n\n const form = event.target.closest('form');\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 100);\n }\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div\n className={classnames('drv-pill', {\n 'drv-pill--close': dismissable,\n 'drv-pill--make': isMake,\n 'drv-pill--last': isLast,\n })}\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"pill_deleted\"\n data-ga-filters-filter-name={gaFilterName}\n data-ga-filters-filter-option={value}\n onClick={handleDismiss}\n >\n {label}\n </div>\n );\n}\n\nPill.propTypes = {\n category: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n // eslint-disable-next-line react/require-default-props\n label: PropTypes.string,\n dismissable: PropTypes.bool,\n isMake: PropTypes.bool,\n isLast: PropTypes.bool,\n gaFilterName: PropTypes.string,\n};\n\nPill.defaultProps = {\n dismissable: true,\n isMake: false,\n isLast: false,\n gaFilterName: '',\n};\n\nexport default Pill;\n","/* eslint-disable eqeqeq */\nimport React, { useState, useEffect, createContext, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport store from '../../store/store';\nimport { getQueryStringParameters, objectToQueryStringParameters } from '../../utils';\n\n// Create a context\nconst ElasticSearchContext = createContext(null);\n\nconst PRICE_FILTERS = ['monthly_prices', 'term', 'mileage', 'initial_payment', 'funder'];\n\nconst PRICES_FILTERS_COUNT = ['monthly_prices', 'funder'];\n\n// Context provider component\nexport const ElasticSearchProvider = ({ path, labelMapping, children }) => {\n const [allElasticSearchOptions, setAllElasticSearchOptions] = useState({});\n const [availableElasticSearchOptions, setAvailableElasticSearchOptions] = useState({});\n\n const initialLoadCompleted = useRef(false);\n\n const defaultSelectedFilters = {\n ...getQueryStringParameters(),\n };\n\n const { filters: selectedFilters } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n\n const setSelectedFilter = (event) => {\n const { name, value, checked, type } = event.target;\n\n const newSelectedFilters = { ...selectedFilters };\n\n if (checked) {\n if (type === 'radio') {\n newSelectedFilters[name] = value;\n } else if (type === 'checkbox') {\n newSelectedFilters[name] = newSelectedFilters[name] || [];\n newSelectedFilters[name].push(value);\n }\n } else if (type === 'radio') {\n delete newSelectedFilters[name];\n } else if (type === 'checkbox') {\n if (newSelectedFilters[name].length === 1) {\n // Delete the whole entry if there's only one left\n delete newSelectedFilters[name];\n } else {\n // Remove item from array\n const index = newSelectedFilters[name].indexOf(value);\n newSelectedFilters[name].splice(index, 1);\n }\n\n // Remove models when make is unselected\n if (name === 'make[]' && newSelectedFilters['make_model_range[]']) {\n newSelectedFilters['make_model_range[]'] = newSelectedFilters['make_model_range[]'].filter((item) => {\n return item.indexOf(value) !== 0;\n });\n }\n }\n\n dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n };\n\n const setSelectedBodytype = (event) => {\n dispatch({ type: 'SET_BODYTYPE_FILTERS', payload: event.target.value });\n };\n\n const setSingleCheckboxFilter = (event) => {\n const { name, value, checked } = event.target;\n const newSelectedFilters = { ...selectedFilters };\n if (checked) {\n newSelectedFilters[name] = value;\n } else {\n delete newSelectedFilters[name];\n }\n dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n };\n\n const removeSelectedFilters = (name) => {\n const newSelectedFilters = { ...selectedFilters };\n\n if (Array.isArray(name)) {\n name.forEach((nameItem) => delete newSelectedFilters[nameItem]);\n } else {\n delete newSelectedFilters[name];\n }\n\n dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n };\n\n const filterParams = objectToQueryStringParameters(selectedFilters);\n\n const initialiseReduxState = () => {\n dispatch({ type: 'INITIALISE_FILTERS', payload: defaultSelectedFilters });\n };\n\n const getAvailableCounts = (data) => {\n const counts = {};\n\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n if (key.startsWith('prices.')) {\n counts[key.replace('prices.', '')] = data[key].prices[key].doc_count;\n } else {\n counts[key] = data[key].doc_count;\n }\n }\n }\n\n counts.count = data.count;\n\n return counts;\n };\n\n useEffect(() => {\n const fetchInitialData = async () => {\n if (path && !initialLoadCompleted.current) {\n try {\n const initialResponse = await axios.get(`${path}.json`, {\n params: { response: 'json' },\n });\n setAllElasticSearchOptions(initialResponse.data);\n initialiseReduxState();\n initialLoadCompleted.current = true;\n } catch (error) {\n console.error('Failed to fetch initial ElasticSearch options', error);\n }\n }\n };\n\n fetchInitialData();\n }, [path]);\n\n useEffect(() => {\n const fetchFilteredData = async () => {\n if (path) {\n try {\n const filteredResponse = await axios.get(`${path}.json?${filterParams}`, {\n params: { response: 'json' },\n });\n const availableData = filteredResponse.data;\n\n if (availableData) {\n dispatch({\n type: 'TOTAL_COUNTS',\n payload: getAvailableCounts(availableData),\n });\n setAvailableElasticSearchOptions(availableData);\n }\n } catch (error) {\n console.error('Failed to fetch filtered ElasticSearch options', error);\n }\n }\n };\n\n fetchFilteredData();\n }, [filterParams]);\n\n const allFiltersFor = (name) => {\n let priceFilterName;\n let allBuckets;\n let availableBuckets;\n let allOptions;\n let availableOptions;\n\n if (PRICE_FILTERS.includes(name)) {\n priceFilterName = `prices.${name}`;\n if (!allElasticSearchOptions[priceFilterName] || !availableElasticSearchOptions[priceFilterName]) return [];\n\n allBuckets = allElasticSearchOptions[priceFilterName].prices[priceFilterName][name].buckets;\n availableBuckets = availableElasticSearchOptions[priceFilterName].prices[priceFilterName][name].buckets;\n allOptions = allBuckets.map((bucket) => bucket.key.toString());\n availableOptions = availableBuckets.map((bucket) => bucket.key.toString());\n return allOptions.map((option) => ({\n value: (labelMapping && labelMapping[option]) || option,\n label: option,\n enabled: availableBuckets.find((o) => o.key == option)\n ? availableBuckets.find((o) => o.key == option).doc_count > 0\n : false,\n count:\n PRICES_FILTERS_COUNT.includes(name) &&\n availableBuckets.find((o) => o.key == option) &&\n availableBuckets.find((o) => o.key == option).deals.doc_count,\n }));\n }\n if (!allElasticSearchOptions[name] || !availableElasticSearchOptions[name]) return [];\n\n allBuckets = allElasticSearchOptions[name].buckets;\n availableBuckets = availableElasticSearchOptions[name].buckets;\n allOptions = allBuckets.map((bucket) => bucket.key_as_string || bucket.key.toString());\n availableOptions = availableBuckets.map((bucket) => bucket.key_as_string || bucket.key.toString());\n\n return allOptions.map((option) => {\n const availableBucket = availableBuckets.find((o) => o.key == option || o.key_as_string == option);\n return {\n value: option,\n enabled: availableOptions.indexOf(option) > -1,\n count: (!!availableBucket && availableBucket.doc_count) || 0,\n };\n });\n };\n\n const hasAnyOption = (name, value) => {\n if (!allElasticSearchOptions[name]) return false;\n // eslint-disable-next-line eqeqeq\n const bucket = allElasticSearchOptions[name].buckets.find((b) => b.key_as_string === value || b.key == value);\n if (!bucket) return false;\n return bucket.doc_count > 0;\n };\n\n const availableFiltersFor = (name) => {\n if (!availableElasticSearchOptions[name]) return [];\n\n return availableElasticSearchOptions[name].buckets.map((bucket) => ({\n value: bucket.key_as_string || bucket.key,\n count: bucket.doc_count,\n }));\n };\n\n // Provide the context with the values\n return (\n <ElasticSearchContext.Provider\n // TODO: fix eslint error instead of disabling it\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n allFiltersFor,\n availableFiltersFor,\n hasAnyOption,\n props: {\n selectedFilters,\n setSelectedFilter,\n setSelectedBodytype,\n removeSelectedFilters,\n setSingleCheckboxFilter,\n },\n }}\n >\n {children}\n </ElasticSearchContext.Provider>\n );\n};\n\n// Hook to use the context\nexport const useElasticSearch = () => {\n const context = useContext(ElasticSearchContext);\n if (!context) {\n throw new Error('useElasticSearch must be used within a ElasticSearchProvider');\n }\n return context;\n};\n\nElasticSearchProvider.propTypes = {\n path: PropTypes.string,\n labelMapping: PropTypes.shape({}),\n children: PropTypes.node,\n};\n\nElasticSearchProvider.defaultProps = {\n path: '',\n labelMapping: {},\n children: null,\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\n// Wrapper component to include Redux Provider\nexport default function ElasticSearchWrapper(props) {\n return (\n <Provider store={store}>\n <ElasticSearchProvider {...props} />\n </Provider>\n );\n}\n/* eslint-enable */\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst AnnualMileage = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n options = options.map((option) => {\n const label = `${parseFloat(option.value).toLocaleString('en-GB')} miles`;\n\n return { ...option, label };\n });\n\n options.sort((a, b) => a.value - b.value);\n\n const selected =\n elasticSearchProps.selectedFilters[name] &&\n options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n const count = selected ? selected.label : '';\n\n return (\n <FilterDrawerItem\n title=\"Annual mileage\"\n allText=\"Any\"\n count={count}\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n withoutButton={withoutButton}\n />\n );\n};\n\nAnnualMileage.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n withoutButton: PropTypes.bool,\n};\n\nAnnualMileage.defaultProps = {\n options: [],\n isDesktop: false,\n withoutButton: false,\n};\n\nexport default AnnualMileage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst InitialPayment = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n options = options.map((option) => {\n let label = `${parseFloat(option.value).toLocaleString('en-GB')} month`;\n\n if (option.value !== '1') {\n label = label.concat('s');\n }\n\n return { ...option, label };\n });\n\n options.sort((a, b) => a.value - b.value);\n\n const selected =\n elasticSearchProps.selectedFilters[name] &&\n options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n const count = selected ? selected.label : '';\n\n return (\n <FilterDrawerItem\n title=\"Initial payment\"\n allText=\"Any\"\n count={count}\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n withoutButton={withoutButton}\n />\n );\n};\n\nInitialPayment.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n withoutButton: PropTypes.bool,\n};\n\nInitialPayment.defaultProps = {\n options: [],\n isDesktop: false,\n withoutButton: false,\n};\n\nexport default InitialPayment;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst ContractLength = ({ name, options, isDesktop, withoutButton, elasticSearchProps }) => {\n options = options.map((option) => {\n const monthLabel = option.value === '60' ? 'months (Finance Lease Only)' : 'months';\n const label = `${option.value} ${monthLabel}`;\n\n return { ...option, label };\n });\n\n options.sort((a, b) => a.value - b.value);\n\n const selected =\n elasticSearchProps.selectedFilters[name] &&\n options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n const count = selected ? selected.label : '';\n\n return (\n <FilterDrawerItem\n title=\"Contract length\"\n allText=\"Any\"\n count={count}\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n withoutButton={withoutButton}\n />\n );\n};\n\nContractLength.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n withoutButton: PropTypes.bool,\n};\n\nContractLength.defaultProps = {\n options: [],\n isDesktop: false,\n withoutButton: false,\n};\n\nexport default ContractLength;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Manufacturer = ({ title, name, options, isDesktop, elasticSearchProps }) => {\n const removeSelectedFilters = () => {\n // also remove the Model when Manufacturer is set to All\n elasticSearchProps.removeSelectedFilters([name, 'make_model_range[]']);\n };\n\n return (\n <FilterDrawerItem\n title={title}\n name={name}\n options={options}\n elasticSearchProps={{ ...elasticSearchProps, removeSelectedFilters }}\n isDesktop={isDesktop}\n />\n );\n};\n\nManufacturer.propTypes = {\n title: PropTypes.string,\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nManufacturer.defaultProps = {\n title: 'Manufacturer',\n options: [],\n isDesktop: false,\n};\n\nexport default Manufacturer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Model = ({ name, options, isDesktop, elasticSearchProps }) => {\n // e.g. \"Audi, A3\" is the Make and Model separated by ', '\n const modelNameValueSeparator = ', ';\n\n options = options.map((option) => {\n // we reverse these so that \"label\" always exists even if the split fails\n // e.g. an option value of \"Audi A3\" here would give us label = \"Audi A3\" and prelabel = undefined\n // while an option value of \"Audi, A3\" here would give us label = \"A3\" and prelabel = \"Audi\"\n\n // the use of 2 in the split ensures we always get a maximum of 2 parts\n const [label, prelabel] = option.value.split(modelNameValueSeparator, 2).reverse();\n\n return { ...option, prelabel, label };\n });\n\n const count = elasticSearchProps.selectedFilters[name]\n ? elasticSearchProps.selectedFilters[name].map((value) => value.replace(modelNameValueSeparator, ' ')).join(', ')\n : undefined;\n const disabled = !elasticSearchProps.selectedFilters['make[]'];\n\n return (\n <FilterDrawerItem\n title=\"Model\"\n name={name}\n count={count}\n options={options}\n disabled={disabled}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nModel.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nModel.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Model;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst FuelType = ({ name, options, isDesktop, elasticSearchProps }) => {\n const optionsOrder = ['Electric', 'Hybrid', 'Petrol', 'Diesel', 'Plug-in Hybrid', 'Other'].reverse();\n\n // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n // so we reverse both lists so that the missing options are last instead.\n\n const sortedOptions = [...options]\n .sort((a, b) => {\n return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n })\n .reverse();\n\n return (\n <FilterDrawerItem\n title=\"Fuel type\"\n name={name}\n options={sortedOptions}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nFuelType.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nFuelType.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default FuelType;\n","// Asset Imports\nimport icon1 from '../../../assets/images/ec-icon-1.svg';\nimport icon2 from '../../../assets/images/ec-icon-2.svg';\nimport icon3 from '../../../assets/images/ec-icon-3.svg';\nimport icon4 from '../../../assets/images/ec-icon-4.svg';\nimport icon5 from '../../../assets/images/ec-icon-5.svg';\nimport icon6 from '../../../assets/images/ec-icon-6.svg';\n\nexport const steps = [\n {\n name: 'about_you',\n title: 'About you',\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/mztobcwtkqgyuwizfhhz',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/mztobcwtkqgyuwizfhhz',\n icon: icon1,\n columns: 2,\n question: 'Are you over 18?',\n description: 'You must be 18 years old or older to apply for finance for a lease vehicle.',\n options: [\n {\n label: 'Over 18 years old',\n value: 'over_18',\n description: 'I confirm I am 18 years old or older.',\n },\n {\n label: 'Under 18 years old',\n value: 'under_18',\n description: 'I am not yet 18 years old.',\n },\n ],\n },\n {\n name: 'address_history',\n title: 'Address History',\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ljuo2o6yuxvsahpxnuwo',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/qra9mfl1fjuzezijmghv',\n icon: icon2,\n columns: 2,\n question: 'How many years address history can you provide?',\n description: 'A minimum of 3 years address history is required to assess your application.',\n options: [\n {\n label: '0 to 2 years',\n value: '0_to_2',\n description: 'Address history available',\n score: 3,\n },\n {\n label: '2 to 3 years',\n value: '2_to_3',\n description: 'Address history available',\n score: 3,\n },\n {\n label: '3 to 5 years',\n value: '3_to_5',\n description: 'Address history available',\n score: 1,\n },\n {\n label: 'Over 5 years',\n value: 'over_5',\n description: 'Address history available',\n score: 1,\n },\n ],\n },\n {\n name: 'employment_status',\n title: 'Employment status',\n columns: 3,\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/xq3zjs5belrtyg3zyda6',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/xq3zjs5belrtyg3zyda6',\n icon: icon3,\n question: 'What best describes your employment status?',\n options: [\n {\n label: 'Full time',\n value: 'full_time',\n description: '',\n score: 1,\n },\n {\n label: 'Part time',\n value: 'part_time',\n description: '',\n score: 1,\n },\n {\n label: 'Contractor',\n value: 'contractor',\n description: '',\n score: 1,\n },\n {\n label: 'Self employed',\n value: 'self_employed',\n description: '',\n score: 1,\n },\n {\n label: 'Unemployed',\n value: 'unemployed',\n description: '',\n score: 2,\n },\n {\n label: 'Home maker',\n value: 'home_maker',\n description: '',\n score: 2,\n },\n {\n label: 'Retired',\n value: 'retired',\n description: '',\n score: 2,\n },\n ],\n },\n {\n name: 'employment_history',\n title: 'Employment history',\n columns: 1,\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/kl6c4byj5hjqc95yh4a2',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/dpeaguo0rioued6igaxj',\n icon: icon4,\n question: 'How many years of employment / regular income history can you provide?',\n options: [\n {\n label: '0 to 3 years',\n value: '0_to_3',\n description: 'I can provide up to 3 years of employment / income history.',\n score: 2,\n },\n {\n label: '3 to 5 years',\n value: '3_to_5',\n description: 'I can provide between 3 and 5 years of employment / income history.',\n score: 1,\n },\n {\n label: 'Over 5 years',\n value: 'over_5',\n description: 'I can provide over 5 years of employment / income history.',\n score: 1,\n },\n ],\n },\n {\n name: 'affordability',\n title: 'Affordability',\n columns: 1,\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/m5ibecrzlm5mh3pdz6e3',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/m5ibecrzlm5mh3pdz6e3',\n icon: icon5,\n question: 'Do you have regular income to afford the monthly lease payments?',\n options: [\n {\n label: 'Yes',\n value: 'yes',\n description: 'I have regular income and can afford monthly lease payments.',\n score: 1,\n },\n {\n label: 'No',\n value: 'no',\n description: 'I do not currently have regular income.',\n score: 3,\n },\n ],\n },\n {\n name: 'credit_history',\n title: 'Credit history',\n columns: 1,\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/afiicxzrshidv23ziiyi',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/afiicxzrshidv23ziiyi',\n icon: icon6,\n question: 'Do you have adverse credit on your credit report?',\n description: 'For example any missed payments, CCJs, IVA scheme, bankruptcy.',\n options: [\n {\n label: 'Yes',\n value: 'yes',\n description: 'I do have adverse credit on my credit report.',\n score: 3,\n },\n {\n label: 'No',\n value: 'no',\n description: 'No I do not have any adverse credit on my credit report.',\n score: 1,\n },\n {\n label: 'Not sure',\n value: 'not_sure',\n description: 'I am not sure whether I have have any adverse credit on my credit report.',\n score: 2,\n },\n ],\n },\n];\n\nexport const finalScreenData = {\n 1: {\n title: 'Great news!',\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/exbdp4mpsrcvtx3kzjfo',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/rkm4okms8lc0x4n7i2xu',\n description: `Your answers indicate you'll be eligible for finance with our panel of lenders. Let's look at the best deal for you now.`,\n },\n 2: {\n title: 'Thanks for your answers!',\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ttrpmgoszaulb0icigiz',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/giyvchujk1szh1ffyrib',\n description: `There's a good chance we'll be able to find a deal to suit you. Contact us now to look at the best offers available for you now.`,\n },\n 3: {\n title: 'Thanks for your answers!',\n image:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/v4dn14iaajdnfbzaklf1',\n mobileImage:\n 'https://res.cloudinary.com/ho5waxsnl/image/upload/f_auto,q_auto/v1/eligibility-checker/ybur61axjtr55vg8mmta',\n description: 'We have some lenders who may consider your application. Please contact us to discuss further.',\n },\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Transmission = ({ name, options, isDesktop, elasticSearchProps }) => {\n return (\n <FilterDrawerItem\n title=\"Gearbox\"\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nTransmission.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nTransmission.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Transmission;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Budget = ({ name, options, isDesktop, elasticSearchProps }) => {\n const selected =\n elasticSearchProps.selectedFilters[name] &&\n options.find((option) => option.value === elasticSearchProps.selectedFilters[name]);\n const count = selected ? selected.label : '';\n\n return (\n <FilterDrawerItem\n title=\"Budget\"\n name={name}\n allText=\"Any\"\n options={options}\n count={count}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nBudget.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nBudget.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Budget;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\n\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst BodyType = ({ name, options, sort, isDesktop, elasticSearchProps }) => {\n const optionsOrder = ['Pickup', 'Small Van', 'Medium Van', 'Large Van', 'Luton', 'Dropside', 'Tipper'].reverse();\n\n // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n // so we reverse both lists so that the missing options are last instead.\n\n const sortedOptions =\n sort === 'custom'\n ? [...options]\n .sort((a, b) => {\n return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n })\n .reverse()\n : options;\n\n return (\n <FilterDrawerItem\n title=\"Body type\"\n name={name}\n options={sortedOptions}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nBodyType.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n sort: PropTypes.string,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nBodyType.defaultProps = {\n options: [],\n sort: '',\n isDesktop: false,\n};\n\nexport default BodyType;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState, useEffect, createContext, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport axios from 'axios';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport store from '../../store/store';\nimport { getQueryStringParameters, objectToQueryStringParameters } from '../../utils';\n\nconst ModelFiltersContext = createContext(null);\n\nconst PRICE_FILTERS = ['initial_payment', 'mileage', 'term'];\n\nexport const ModelFiltersProvider = ({ path, children, isVans, controller }) => {\n const [initialData, setInitialData] = useState(null);\n const [availableData, setAvailableData] = useState(null);\n const initialLoadCompleted = useRef(false);\n\n const defaultSelectedFilters = {\n ...getQueryStringParameters(),\n };\n\n const { filters: selectedFilters } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_IS_VANS', payload: isVans });\n dispatch({ type: 'SET_CONTROLLER', payload: controller });\n }, [dispatch, isVans, controller]);\n\n const setSelectedFilter = (event) => {\n const { name, value } = event.target;\n const newSelectedFilters = { ...selectedFilters };\n\n if (value) {\n newSelectedFilters[name] = value;\n } else {\n delete newSelectedFilters[name];\n }\n\n dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n };\n\n const removeSelectedFilters = (name) => {\n const newSelectedFilters = { ...selectedFilters };\n\n if (Array.isArray(name)) {\n name.forEach((nameItem) => delete newSelectedFilters[nameItem]);\n } else {\n delete newSelectedFilters[name];\n }\n\n dispatch({ type: 'SET_FILTERS', payload: newSelectedFilters });\n };\n\n const filterParams = objectToQueryStringParameters(selectedFilters);\n\n const initialiseReduxState = () => {\n dispatch({ type: 'INITIALISE_FILTERS', payload: defaultSelectedFilters });\n };\n\n const dispatchAndUpdateCountElements = (count) => {\n dispatch({\n type: 'TOTAL_COUNTS',\n payload: { count },\n });\n\n const countElements = document.querySelectorAll('#item-count-element');\n countElements.forEach((element) => {\n element.innerText = `- ${count} vehicles found`;\n });\n };\n\n // Fetch initial data on component mount or when URL parameters change\n useEffect(() => {\n const fetchInitialData = async () => {\n if (path && !initialLoadCompleted.current) {\n try {\n const url = `${path}.json`;\n const response = await axios.get(url);\n setInitialData(response.data);\n setAvailableData(response.data);\n\n initialiseReduxState();\n\n // Update count elements if there are no filters applied\n if (!filterParams && response.data?.deals?.count !== undefined) {\n dispatchAndUpdateCountElements(response.data.deals.count);\n }\n\n initialLoadCompleted.current = true;\n } catch (error) {\n console.error('Failed to fetch initial model data', error);\n }\n }\n };\n\n fetchInitialData();\n }, [path, filterParams]);\n\n // Fetch filtered data when filters change\n useEffect(() => {\n const fetchFilteredData = async () => {\n if (path && initialLoadCompleted.current) {\n try {\n const response = await axios.get(`${path}.json?${filterParams}`);\n setAvailableData(response.data);\n\n if (response.data?.deals?.count !== undefined) {\n dispatchAndUpdateCountElements(response.data.deals.count);\n }\n } catch (error) {\n console.error('Failed to fetch filtered model data', error);\n }\n }\n };\n\n const timer = setTimeout(() => {\n if (initialLoadCompleted.current) {\n fetchFilteredData();\n }\n }, 0);\n\n return () => clearTimeout(timer);\n }, [filterParams]);\n\n useEffect(() => {\n const observer = new MutationObserver(() => {\n const derivativesRows = document.querySelector('.g-derivatives__rows');\n const moreButton = document.querySelector('.g-derivatives__more');\n\n if (derivativesRows && moreButton) {\n const rowCount = derivativesRows.children.length;\n const totalCount = availableData?.deals?.count || 0;\n\n if (totalCount > rowCount) {\n moreButton.classList.add('g-derivatives__more--show');\n } else {\n moreButton.classList.remove('g-derivatives__more--show');\n }\n }\n });\n\n const derivativesRows = document.querySelector('.g-derivatives__rows');\n if (derivativesRows) {\n observer.observe(derivativesRows, { childList: true });\n }\n\n return () => observer.disconnect();\n }, [availableData?.deals?.count]);\n\n const allFiltersFor = (name) => {\n if (!initialData?.aggregations?.[name]) return [];\n\n const allOptions = initialData.aggregations[name];\n const availableOptions = availableData?.aggregations?.[name] || [];\n\n return allOptions.map((option) => {\n const availableOption = availableOptions.find((o) => o.key === option.key);\n return {\n value: option.key.toString(),\n label: option.key.toString(),\n enabled: PRICE_FILTERS.includes(name) ? true : !!availableOption,\n count: PRICE_FILTERS.includes(name) ? 0 : availableOption?.doc_count || 0,\n cheapest_motr: option.cheapest_motr?.value,\n selected: selectedFilters[name] === option.key.toString(),\n };\n });\n };\n\n const hasAnyOption = (name, value) => {\n if (!initialData?.aggregations?.[name]) return false;\n const option = initialData.aggregations[name].find((o) => o.key.toString() === value.toString());\n return !!option && option.doc_count > 0;\n };\n\n const availableFiltersFor = (name) => {\n if (!availableData?.aggregations?.[name]) return [];\n\n return availableData.aggregations[name].map((option) => ({\n value: option.key.toString(),\n count: option.doc_count,\n }));\n };\n\n // TODO: fix eslint error instead of disabling it\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const contextValue = {\n allFiltersFor,\n availableFiltersFor,\n hasAnyOption,\n props: {\n selectedFilters,\n setSelectedFilter,\n removeSelectedFilters,\n },\n };\n\n return <ModelFiltersContext.Provider value={contextValue}>{children}</ModelFiltersContext.Provider>;\n};\n\nexport const useModelFilters = () => {\n const context = useContext(ModelFiltersContext);\n if (!context) {\n throw new Error('useModelFilters must be used within a ModelFiltersProvider');\n }\n return context;\n};\n\nModelFiltersProvider.propTypes = {\n path: PropTypes.string,\n children: PropTypes.node,\n isVans: PropTypes.bool,\n controller: PropTypes.string,\n};\n\nModelFiltersProvider.defaultProps = {\n path: '',\n children: null,\n isVans: false,\n controller: '',\n};\n\nexport default function ModelFiltersWrapper(props) {\n return (\n <Provider store={store}>\n <ModelFiltersProvider {...props} />\n </Provider>\n );\n}\n","export const showPromotionalToggle = ({ showPromotion, controller, action, value, hasAnyOption }) => {\n return (\n showPromotion &&\n controller === 'specials' &&\n action !== 'promotional_collection' &&\n hasAnyOption('promotion_name', value)\n );\n};\n\nexport const filterOptions = (controller, action) => {\n let options = [];\n\n if (controller === 'specials') {\n if (action === 'short_term') {\n options = [\n { name: 'Price lowest first', value: '', default: true },\n { name: 'Price highest first', value: 'price|desc' },\n { name: 'Recently added', value: 'created_at|asc' },\n { name: 'Recommended', value: 'position|asc' },\n ];\n } else {\n options = [\n { name: 'Price lowest first', value: 'price|asc' },\n { name: 'Price highest first', value: 'price|desc' },\n { name: 'Recently added', value: 'created_at|asc' },\n { name: 'Recommended', value: '', default: true },\n ];\n }\n } else if (controller === 'vehicles') {\n options = [\n { name: 'Price lowest first', value: '', default: true },\n { name: 'Price highest first', value: 'price|desc' },\n { name: 'Recently added', value: 'recently_added|asc' },\n { name: 'Newest', value: 'model_year|asc' },\n { name: 'Oldest', value: 'model_year|desc' },\n ];\n } else {\n options = [\n { name: 'Price lowest first', value: ``, default: true },\n { name: 'Price highest first', value: `price|desc` },\n { name: 'Newest', value: 'created_at|asc' },\n { name: 'Oldest', value: 'created_at|desc' },\n ];\n }\n\n return options;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Seats = ({ name, options, isDesktop, elasticSearchProps }) => {\n return (\n <FilterDrawerItem\n title=\"No of seats\"\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nSeats.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nSeats.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Seats;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\n\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst QuickDeliveryToggle = ({ isDesktopVersion }) => {\n const elasticSearch = useElasticSearch();\n\n return (\n <div style={{ flexShrink: 0, marginTop: '3px' }}>\n <ToggleCheckbox\n name=\"quick_delivery\"\n value=\"true\"\n label=\"Quick delivery\"\n labelPosition=\"left\"\n isDesktopVersion={isDesktopVersion}\n defaultChecked={\n !!elasticSearch.props.selectedFilters && elasticSearch.props.selectedFilters.quickDelivery === 'true'\n }\n setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n selectedFilters={elasticSearch.props.selectedFilters}\n />\n </div>\n );\n};\n\nQuickDeliveryToggle.propTypes = {\n isDesktopVersion: PropTypes.bool.isRequired,\n};\n\nexport default QuickDeliveryToggle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst PromotionalToggle = ({ isDesktopVersion, value }) => {\n const elasticSearch = useElasticSearch();\n const lowerCaseValue = value.toLowerCase();\n\n return (\n <div style={{ flexShrink: 0, marginTop: '3px' }}>\n <ToggleCheckbox\n name=\"promotion_name\"\n value={lowerCaseValue}\n greenToggle\n isDesktopVersion={isDesktopVersion}\n label=\"EV miles offer\"\n labelPosition=\"left\"\n defaultChecked={\n !!elasticSearch.props.selectedFilter &&\n elasticSearch.props.selectedFilters.promotion_name.includes(lowerCaseValue)\n }\n selectedFilters={elasticSearch.props.selectedFilters}\n setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n />\n </div>\n );\n};\n\nPromotionalToggle.propTypes = {\n isDesktopVersion: PropTypes.bool.isRequired,\n value: PropTypes.string.isRequired,\n};\n\nexport default PromotionalToggle;\n","import React, { memo } from 'react';\nimport PropTypes from 'prop-types';\n\nimport ElectricPills from './ElectricPills';\nimport MakePills from './MakePills';\nimport FuelTypePills from './FuelTypePills';\nimport BudgetPills from './BudgetPills';\nimport BodyTypePills from './BodyTypePills';\nimport TransmissionPills from './TransmissionPills';\nimport SeatsPills from './SeatsPills';\nimport TermPills from './TermPills';\nimport MileagePills from './MileagePills';\nimport InitialPaymentPills from './InitialPaymentPills';\nimport EstimatedDeliveryPills from './EstimatedDeliveryPills';\nimport InStockPills from './InStockPills';\nimport PromotionalPills from './PromotionalPills';\nimport FunderPills from './FunderPills';\nimport RangePills from './RangePills';\nimport PayloadPills from './PayloadPills';\nimport LoadLengthPills from './LoadLengthPills';\n\nconst Pills = memo(({ selectedFilters, labelMapping }) => {\n return (\n <>\n <EstimatedDeliveryPills selectedFilters={selectedFilters} />\n <InStockPills selectedFilters={selectedFilters} />\n <PromotionalPills selectedFilters={selectedFilters} />\n <InitialPaymentPills selectedFilters={selectedFilters} />\n <ElectricPills selectedFilters={selectedFilters} />\n <FuelTypePills selectedFilters={selectedFilters} />\n <MakePills selectedFilters={selectedFilters} />\n <RangePills selectedFilters={selectedFilters} />\n <PayloadPills selectedFilters={selectedFilters} />\n <LoadLengthPills selectedFilters={selectedFilters} />\n <BudgetPills selectedFilters={selectedFilters} labelMapping={labelMapping} />\n <BodyTypePills selectedFilters={selectedFilters} />\n <TransmissionPills selectedFilters={selectedFilters} />\n <SeatsPills selectedFilters={selectedFilters} />\n <TermPills selectedFilters={selectedFilters} />\n <MileagePills selectedFilters={selectedFilters} />\n <FunderPills selectedFilters={selectedFilters} />\n </>\n );\n});\n\nPills.propTypes = {\n selectedFilters: PropTypes.shape({}).isRequired,\n labelMapping: PropTypes.shape({}).isRequired,\n};\n\nexport default Pills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useElasticSearch } from './ElasticSearch';\n\nimport ToggleCheckbox from '../ui/ToggleCheckbox';\n\nconst InStockToggle = ({ isDesktopVersion }) => {\n const elasticSearch = useElasticSearch();\n\n return (\n <div style={{ width: '200px', flexShrink: 0, marginTop: '3px' }}>\n <ToggleCheckbox\n name=\"stock\"\n value=\"true\"\n label=\"Hide reserved\"\n labelPosition=\"left\"\n isDesktopVersion={isDesktopVersion}\n defaultChecked={!!elasticSearch.props.selectedFilters && elasticSearch.props.selectedFilters.stock === 'true'}\n setSingleCheckboxFilter={elasticSearch.props.setSingleCheckboxFilter}\n selectedFilters={elasticSearch.props.selectedFilters}\n />\n </div>\n );\n};\n\nInStockToggle.propTypes = {\n isDesktopVersion: PropTypes.bool.isRequired,\n};\n\nexport default InStockToggle;\n","import React, { useEffect, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport classNames from 'classnames';\n\nimport BudgetFilters from './BudgetFilters';\nimport BodyTypeFilters from './BodyTypeFilters';\n\nconst CategoryFilters = ({ isDesktop, categoryType, isVans, controller }) => {\n const { isOpen, isFixed } = useSelector((state) => state.filterControls);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_OPEN', payload: true });\n dispatch({ type: 'SET_IS_VANS', payload: isVans });\n dispatch({ type: 'SET_CONTROLLER', payload: controller });\n }, [dispatch, isVans, controller]);\n\n const handleVisible = useCallback(() => {\n const filtersRect = document.querySelector('.drv-filter-desktop').getBoundingClientRect();\n const isAtTop = filtersRect.top <= 48;\n const isWideScreen = window.innerWidth > 1500;\n\n // If the state of isFixed needs to change, update it\n if (isFixed !== isAtTop) {\n dispatch({ type: 'SET_FIXED', payload: isAtTop });\n\n // When isFixed changes to true, or when scrolling up past the sticky point\n if ((isAtTop && !isOpen) || !isAtTop) {\n dispatch({ type: 'SET_OPEN', payload: true });\n }\n }\n\n // Ensure search bar layering is correct\n const search = document.querySelector('.g-search');\n search.style.zIndex = filtersRect.top <= 49 && isWideScreen ? '1' : '4';\n }, [dispatch, isFixed, isOpen]);\n\n useEffect(() => {\n if (isDesktop) {\n document.addEventListener('scroll', handleVisible);\n document.addEventListener('resize', handleVisible);\n return () => {\n document.removeEventListener('scroll', handleVisible);\n document.removeEventListener('resize', handleVisible);\n };\n }\n }, [isDesktop, handleVisible]);\n\n useEffect(() => {\n if (isDesktop) {\n const filtersWrapper = document.querySelector('.drv-filter-desktop');\n if (isOpen) {\n filtersWrapper.classList.add('drv-filter-desktop--open');\n filtersWrapper.classList.remove('drv-filter-desktop--hidden');\n } else {\n filtersWrapper.classList.remove('drv-filter-desktop--open');\n filtersWrapper.classList.add('drv-filter-desktop--hidden');\n }\n }\n }, [isOpen, isDesktop]);\n\n return (\n <div className={`${isDesktop ? 'drv-desktop-filter-group' : ''}`}>\n <ul\n className={classNames([\n isDesktop ? 'drv-desktop-filters' : 'drv-mobile-filters',\n !isOpen && isDesktop && isFixed ? 'drv-desktop-filters--closed' : '',\n categoryType === 'BodytypeCategory' ? 'drv-desktop-filters--bodytype' : '',\n ])}\n >\n {(function () {\n switch (categoryType) {\n case 'BudgetCategory':\n return <BudgetFilters isDesktop={isDesktop} />;\n case 'BodytypeCategory':\n return <BodyTypeFilters isDesktop={isDesktop} />;\n default:\n }\n })()}\n </ul>\n </div>\n );\n};\n\nCategoryFilters.propTypes = {\n isDesktop: PropTypes.bool,\n categoryType: PropTypes.string,\n isVans: PropTypes.bool,\n controller: PropTypes.string,\n};\n\nCategoryFilters.defaultProps = {\n isDesktop: false,\n categoryType: '',\n isVans: false,\n controller: '',\n};\n\nexport default CategoryFilters;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport classnames from 'classnames';\nimport { ScrollSnapSlider } from 'scroll-snap-slider';\n\nimport { useElasticSearch } from './ElasticSearch';\nimport { getQueryStringParameters } from '../../utils';\nimport ArrowLeftIcon from '../../../assets/images/arrow-left-white.svg';\nimport ArrowRightIcon from '../../../assets/images/arrow-right-white.svg';\n\nconst VanBodytypeFilter = ({ isDesktop }) => {\n const dispatch = useDispatch();\n const sliderRef = useRef();\n const [selectedSlide, setSelectedSlide] = useState();\n const options = [\n { label: 'All vans', value: '', category: '' },\n { label: 'Small', value: 'Small Van', category: 'bodytype_categories[]' },\n { label: 'Medium', value: 'Medium Van', category: 'bodytype_categories[]' },\n { label: 'Large', value: 'Large Van', category: 'bodytype_categories[]' },\n { label: 'Pickup', value: 'Pickup', category: 'bodytype_categories[]' },\n {\n label: 'Conversions',\n value: 'Conversions',\n category: 'bodytype_categories[]',\n },\n { label: 'Electric', value: 'true', category: 'hybrid_or_electric' },\n ];\n\n const elasticSearch = useElasticSearch();\n\n // Navigate to selected slide if filter is selected on page load\n useEffect(() => {\n const params = getQueryStringParameters();\n const match =\n params &&\n Object.fromEntries(\n Object.entries(params).filter(\n ([key]) => key.includes('hybrid_or_electric') || key.includes('bodytype_categories[]'),\n ),\n );\n const value =\n Object.keys(match).length !== 0 && options.map((option) => option.value).indexOf(Object.entries(match)[0][1]);\n setSelectedSlide(value);\n }, []);\n\n const handleSelect = (event) => {\n switch (event.target.name) {\n case '':\n dispatch({ type: 'RESET_FILTERS' });\n break;\n case 'hybrid_or_electric':\n dispatch({ type: 'SET_ELECTRIC' });\n break;\n default:\n elasticSearch.props.setSelectedBodytype(event);\n break;\n }\n\n const form = event.target.closest('form');\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 100);\n };\n\n useEffect(() => {\n const slider = new ScrollSnapSlider(sliderRef.current);\n\n const prev = document.querySelector('.drv-filter-van-bodytypes .indicators .arrow.prev');\n const next = document.querySelector('.drv-filter-van-bodytypes .indicators .arrow.next');\n\n const updateArrows = function () {\n prev.classList.toggle('disabled', sliderRef.current.scrollLeft === 0);\n next.classList.toggle(\n 'disabled',\n sliderRef.current.scrollLeft + sliderRef.current.offsetWidth === sliderRef.current.scrollWidth,\n );\n };\n\n prev.addEventListener('click', () => {\n slider.slideTo(slider.slide - 1);\n });\n\n next.addEventListener('click', () => {\n slider.slideTo(slider.slide + 1);\n });\n\n slider.addEventListener('slide-pass', updateArrows);\n slider.addEventListener('slide-stop', updateArrows);\n\n if (selectedSlide) slider.slideTo(selectedSlide);\n }, [sliderRef, selectedSlide]);\n\n return (\n <div\n className={classnames('drv-filter-van-bodytypes', {\n 'drv-filter-van-bodytypes__mobile': !isDesktop,\n 'drv-filter-van-bodytypes__desktop': isDesktop,\n })}\n >\n <div className=\"drv-filter-van-bodytypes__title\">Choose your body type</div>\n <div className=\"indicators prev\">\n <button type=\"button\" className=\"arrow prev disabled\">\n <img src={ArrowLeftIcon} alt=\"\" srcSet=\"\" />\n </button>\n </div>\n <div ref={sliderRef} className=\"scroll-snap-slider bodytype-slider\">\n {options.map(({ value, label, category }, index) => {\n const selected = elasticSearch.props.selectedFilters[category]?.includes(value);\n const allSelected =\n !elasticSearch.props.selectedFilters['bodytype_categories[]'] &&\n !elasticSearch.props.selectedFilters.hybrid_or_electric;\n const isAll = category === '';\n const isElectric = category === 'hybrid_or_electric';\n\n return (\n <label\n key={value}\n htmlFor={`${category}-${label}`}\n className={classnames(\n `scroll-snap-slide drv-filter-van-bodytypes__button drv-filter-van-bodytypes__button--${\n label === 'All vans' ? 'all' : label.toLowerCase()\n }`,\n {\n 'drv-filter-van-bodytypes__button--selected': selected || (isAll && allSelected),\n 'drv-filter-van-bodytypes__button--electric': isElectric,\n },\n )}\n >\n <input\n type=\"checkbox\"\n name={category}\n id={`${category}-${label}`}\n data-index={index}\n data-action=\"click->ga#push\"\n data-ga-parent-title=\"Body Type\"\n data-ga-event-action=\"selectedFilter\"\n data-ga-filter-option={label}\n value={value}\n checked={isAll ? allSelected : selected}\n onChange={(event) => handleSelect(event)}\n />\n <div className=\"icon\" />\n {label}\n </label>\n );\n })}\n </div>\n <div className=\"indicators next\">\n <button type=\"button\" className=\"arrow next\">\n <img src={ArrowRightIcon} alt=\"\" srcSet=\"\" />\n </button>\n </div>\n </div>\n );\n};\n\nVanBodytypeFilter.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default VanBodytypeFilter;\n","import React, { useEffect, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport classNames from 'classnames';\n\nimport AllSpecialOffersFilters from './AllSpecialOffersFilters';\nimport ShortTermSpecialOffersFilters from './ShortTermSpecialOffersFilters';\nimport ElectricSpecialOffersFilters from './ElectricSpecialOffersFilters';\nimport StockOffersFilters from './StockOffersFilters';\nimport VanSpecialOffersFilters from './VanSpecialOffersFilters';\n\nconst SpecialOffersFilters = ({ isDesktop, action, isVans, controller }) => {\n const { isOpen, isFixed } = useSelector((state) => state.filterControls);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_IS_VANS', payload: isVans });\n dispatch({ type: 'SET_CONTROLLER', payload: controller });\n }, [dispatch, isVans, controller]);\n\n const handleVisible = useCallback(() => {\n const filtersRect = document.querySelector('.drv-filter-desktop').getBoundingClientRect();\n const isAtTop = filtersRect.top <= 48;\n const isWideScreen = window.innerWidth > 1500;\n\n // Update isFixed only if its state needs to change\n if (isFixed !== isAtTop) {\n dispatch({ type: 'SET_FIXED', payload: isAtTop });\n }\n\n // Handle isOpen state\n if (isAtTop) {\n // Dispatch SET_OPEN only when transitioning from not fixed to fixed\n if (!isFixed && isOpen) {\n dispatch({ type: 'SET_OPEN', payload: false });\n }\n } else if (isOpen) {\n // Reset isOpen to false when scrolling back up past the sticky point\n // and only if isOpen is currently true\n dispatch({ type: 'SET_OPEN', payload: false });\n }\n\n // Ensure search bar layering is correct\n const search = document.querySelector('.g-search');\n search.style.zIndex = filtersRect.top <= 49 && isWideScreen ? '1' : '4';\n }, [dispatch, isFixed, isOpen]);\n\n useEffect(() => {\n if (isDesktop) {\n document.addEventListener('scroll', handleVisible);\n document.addEventListener('resize', handleVisible);\n return () => {\n document.removeEventListener('scroll', handleVisible);\n document.removeEventListener('resize', handleVisible);\n };\n }\n }, [isDesktop, handleVisible, isOpen]);\n\n useEffect(() => {\n if (isDesktop) {\n const filtersWrapper = document.querySelector('.drv-filter-desktop');\n if (filtersWrapper) {\n if (isOpen) {\n filtersWrapper.classList.add('drv-filter-desktop--open');\n } else {\n filtersWrapper.classList.remove('drv-filter-desktop--open');\n }\n }\n }\n }, [isOpen, isDesktop]);\n\n return (\n <div className={`${isDesktop ? 'drv-desktop-filter-group' : ''}`}>\n <ul\n className={classNames([\n isDesktop ? 'drv-desktop-filters' : 'drv-mobile-filters',\n !isOpen && isDesktop && isFixed ? 'drv-desktop-filters--condensed' : '',\n ])}\n >\n {(() => {\n switch (action) {\n case 'all':\n case 'used':\n case 'promotional_collection':\n return <AllSpecialOffersFilters isDesktop={isDesktop} />;\n case 'short_term':\n case 'subscription':\n return <ShortTermSpecialOffersFilters isDesktop={isDesktop} />;\n case 'electric':\n return <ElectricSpecialOffersFilters isDesktop={isDesktop} />;\n case 'vans':\n return <VanSpecialOffersFilters isDesktop={isDesktop} />;\n case 'stock':\n return <StockOffersFilters isDesktop={isDesktop} />;\n default:\n }\n })()}\n </ul>\n </div>\n );\n};\n\nSpecialOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n action: PropTypes.string.isRequired,\n isVans: PropTypes.bool,\n controller: PropTypes.string,\n};\n\nSpecialOffersFilters.defaultProps = {\n isVans: false,\n controller: '',\n};\n\nexport default SpecialOffersFilters;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { getQueryStringParameters } from '../../utils';\n\nconst DerivativeOptions = ({ dataGroups }) => {\n const [selected, setSelected] = useState(getQueryStringParameters());\n const [data, setData] = useState({});\n // const [state, setState] = useState({\n // selected: getQueryStringParameters(),\n // data: {},\n // });\n\n const dependentFields = {\n // the value fields will be unselected when you select the key field\n 'search[make]': ['search[model_range]', 'search[model]', 'search[trim]'],\n };\n\n const alwaysEnabledFilters = {\n // you can force filters to never have their options disabled\n // e.g.\n // 'make': true,\n };\n\n const unselectWhenSelected = (selectedField, state) => {\n const selectedFieldName = selectedField.name;\n const unselectFields = dependentFields[selectedFieldName];\n\n if (unselectFields) {\n const form = selectedField.closest('form');\n unselectFields.forEach((fieldName) => {\n if (form[fieldName]) form[fieldName].value = '';\n delete state.selected[fieldName];\n });\n }\n };\n\n const isOptionDisabled = (filterName, option, activeData) => {\n const isAlwaysEnabled = alwaysEnabledFilters[filterName];\n if (typeof isAlwaysEnabled !== 'undefined') return !isAlwaysEnabled;\n\n const activeOptions = activeData[filterName];\n return activeOptions && activeOptions.length > 0 && activeOptions.indexOf(option) === -1;\n };\n\n const getDataFromJSON = (json) => {\n const getKeys = (groupName) => {\n if (!json[groupName]) return null;\n return json[groupName].buckets.map(({ key, key_as_string }) => key_as_string || key);\n };\n\n // convert the array of dataGroups into an object including each group's filter values\n return dataGroups.reduce((object, { key: value }) => ({ ...object, [value]: getKeys(value) }), {});\n };\n\n const UpdateData = (json) => {\n setData(getDataFromJSON(json));\n };\n\n const SelectFilter = (event) => {\n const updatedState = { ...{ selected, data } };\n\n // select this field\n updatedState.selected[event.target.name] = event.target.value;\n\n // some fields might need to be unselected when this field is selected\n unselectWhenSelected(event.target, updatedState);\n\n event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true }));\n\n setData(updatedState.data);\n setSelected(updatedState.selected);\n };\n\n const onUpdateDataEvent = (event) => {\n UpdateData(event.detail);\n };\n\n useEffect(() => {\n // always get the filterable values from the page on load\n UpdateData(window.derivativeJSON);\n\n // listen out for more filterable values being sent back from Ajax responses after filtering\n document.addEventListener('derivatives#update-data', onUpdateDataEvent);\n\n // unbind the event listener when this component unmounts\n return () => document.removeEventListener('derivatives#update-data', onUpdateDataEvent);\n }, []);\n\n return (\n <>\n {dataGroups.map(({ key: dataGroup, name }) => {\n const options = data && data[dataGroup] ? data[dataGroup] : [];\n if (options.length === 0) return null;\n\n return (\n <div className=\"form-group select optional\" key={dataGroup}>\n <label className=\"select optional\" htmlFor={`search[${dataGroup}]`}>\n {name}\n </label>\n <select\n className=\"form-control select optional\"\n name={`search[${dataGroup}]`}\n id={`search[${dataGroup}]`}\n onChange={SelectFilter}\n value={selected[`search[${dataGroup}]`]}\n >\n <option value=\"\" />\n {options.map((item) => (\n <option disabled={isOptionDisabled(dataGroup, item, data)} key={item} value={item}>\n {{\n true: 'Yes',\n false: 'No',\n }[item] || item}\n </option>\n ))}\n </select>\n </div>\n );\n })}\n </>\n );\n};\n\nDerivativeOptions.propTypes = {\n dataGroups: PropTypes.arrayOf(\n PropTypes.shape({\n key: PropTypes.string,\n name: PropTypes.string,\n }),\n ).isRequired,\n};\n\nexport default DerivativeOptions;\n","/* eslint-disable react/forbid-prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst StepComponent = ({\n stepData,\n onAnswer,\n onNext,\n onPrevious,\n stepNumber,\n currentValue,\n steps,\n currentStep,\n errorMessage,\n}) => {\n return (\n <div className=\"c-survey-modern\">\n <div className=\"c-survey-modern__background\">\n <picture className=\"responsive-background\">\n <source media=\"(min-width: 992px)\" srcSet={stepData.image} />\n <source media=\"(max-width: 991px)\" srcSet={stepData.mobileImage} />\n <img src={stepData.image} alt=\"Background\" className=\"responsive-background__image\" />\n </picture>\n </div>\n <div className=\"c-survey-modern__content\">\n <div className=\"c-survey-modern__inner-wrapper\">\n <div className=\"c-survey-modern__progress-wrapper\">\n <div className=\"c-progress-steps-modern\">\n {steps.map((step, index) => (\n <>\n <div\n key={step.name}\n className={classNames(\n 'c-progress-steps-modern__step',\n index === currentStep && 'c-progress-steps-modern__step--active',\n )}\n >\n <div className=\"c-progress-steps-modern__circle\">\n <i className=\"c-progress-steps-modern__icon\">\n <img src={step.icon} alt={step.title} />\n </i>\n </div>\n </div>\n {index !== steps.length - 1 && <div className=\"c-progress-steps-modern__line\" />}\n </>\n ))}\n </div>\n </div>\n <span className=\"c-survey-modern__step\">Step {stepNumber + 1} / 6</span>\n <h4 className=\"c-survey-modern__heading\">{stepData.title}</h4>\n <p className=\"c-survey-modern__question\">{stepData.question}</p>\n {stepData.description && <p className=\"c-survey-modern__description\">{stepData.description}</p>}\n <div\n className={classNames({\n 'c-survey-modern__options': true,\n 'c-survey-modern__options--2-cols': stepData.columns === 2,\n 'c-survey-modern__options--3-cols': stepData.columns === 3,\n })}\n >\n {stepData.options.map((option) => (\n <div className=\"c-radio-as-button\" key={option.value}>\n <input\n type=\"radio\"\n className=\"c-radio-as-button__input\"\n id={option.value}\n value={option.value}\n name={stepData.name}\n checked={option.value === currentValue}\n onChange={(e) => onAnswer(stepData.name, e.target.value, option.score)}\n />\n <label className=\"c-radio-as-button__label\" htmlFor={option.value}>\n <span>{option.label}</span>\n {option.description && <small>{option.description}</small>}\n </label>\n </div>\n ))}\n </div>\n <div className=\"c-survey-modern__actions\">\n <button className=\"c-survey-modern__prev-button\" onClick={() => onPrevious()}>\n Previous step\n </button>\n <span>or</span>\n <button className=\"c-survey-modern__next-button\" onClick={() => onNext()}>\n Next step\n </button>\n {errorMessage && <div className=\"c-survey-modern__error\">{errorMessage}</div>}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nStepComponent.propTypes = {\n stepData: PropTypes.shape({\n image: PropTypes.string.isRequired,\n mobileImage: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n question: PropTypes.string.isRequired,\n description: PropTypes.string,\n columns: PropTypes.number.isRequired,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n description: PropTypes.string,\n }),\n ).isRequired,\n name: PropTypes.string.isRequired,\n }).isRequired,\n onAnswer: PropTypes.func.isRequired,\n onNext: PropTypes.func.isRequired,\n onPrevious: PropTypes.func.isRequired,\n stepNumber: PropTypes.number.isRequired,\n currentValue: PropTypes.string,\n steps: PropTypes.array.isRequired,\n currentStep: PropTypes.string.isRequired,\n errorMessage: PropTypes.string,\n};\n\nStepComponent.defaultProps = {\n currentValue: '',\n errorMessage: '',\n};\n\nexport default StepComponent;\n","/* eslint-disable react/forbid-prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { pushData } from '../../ga/eligibility-checker-ga-data';\n\nconst FinalScreen = ({ image, mobileImage, title, description, score }) => {\n return (\n <div className=\"c-survey-modern\">\n <div className=\"c-survey-modern__background c-survey-modern__background--final\">\n <picture className=\"responsive-background\">\n <source media=\"(min-width: 992px)\" srcSet={image} />\n <source media=\"(max-width: 991px)\" srcSet={mobileImage} />\n <img src={image} alt=\"Background\" className=\"responsive-background__image\" />\n </picture>\n </div>\n <div className=\"c-survey-modern__content c-survey-modern__content--final\">\n <div className=\"c-survey-modern__inner-wrapper\">\n <h4\n className={classNames(\n 'c-survey-modern__heading c-survey-modern__heading--large',\n score === 1 && 'c-survey-modern__heading--green',\n )}\n >\n {title}\n </h4>\n <p className=\"c-survey-modern__final-description\">{description}</p>\n <div>\n <a\n href=\"/special-offers\"\n className=\"c-survey-modern__deals-link\"\n onClick={() => {\n pushData({\n step: 6,\n stepName: 'result',\n action: 'viewed_lease_deals',\n });\n }}\n >\n View lease deals\n </a>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FinalScreen;\n\nFinalScreen.propTypes = {\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n image: PropTypes.string.isRequired,\n mobileImage: PropTypes.string.isRequired,\n score: PropTypes.number.isRequired,\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst AllSpecialOffersFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_THEME', payload: '' });\n }, []);\n\n return (\n <>\n <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n <FuelType\n name=\"display_fueltype[]\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Manufacturer\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <BodyType\n name=\"bodytype_categories[]\"\n options={elasticSearch.allFiltersFor('bodytype_categories')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Transmission\n name=\"transmission\"\n options={elasticSearch.allFiltersFor('transmission')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Seats\n name=\"vehicle_seating_capacity[]\"\n options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n\n <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n <Budget\n name=\"monthly_prices\"\n options={elasticSearch.allFiltersFor('monthly_prices')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <ContractLength\n name=\"term\"\n options={elasticSearch.allFiltersFor('term')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <AnnualMileage\n name=\"mileage\"\n options={elasticSearch.allFiltersFor('mileage')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={elasticSearch.allFiltersFor('initial_payment')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n </>\n );\n};\n\nAllSpecialOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default AllSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterList from '../ui/FilterList';\nimport Make from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst BodytypeFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n return (\n <FilterList heading=\"Choose vehicle details\" isDesktop={isDesktop}>\n <FuelType\n name=\"display_fueltype\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Make\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Transmission\n name=\"transmission\"\n options={elasticSearch.allFiltersFor('transmission')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n );\n};\n\nBodytypeFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default BodytypeFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterList from '../ui/FilterList';\nimport Make from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst BudgetFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n return (\n <FilterList heading=\"Choose vehicle details\" isDesktop={isDesktop}>\n <FuelType\n name=\"display_fueltype\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Make\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <Transmission\n name=\"transmission\"\n options={elasticSearch.allFiltersFor('transmission')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n <BodyType\n name=\"bodytype_categories[]\"\n options={elasticSearch.allFiltersFor('bodytype_categories')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n );\n};\n\nBudgetFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default BudgetFilters;\n","import React from 'react';\n\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\n\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst AllModelFilters = () => {\n const modelFilters = useModelFilters();\n\n return (\n <ul className=\"drv-ui drv-model-filters drv-model-filters--desktop pt-0\">\n <FilterDrawerItem\n title=\"Trim level\"\n name=\"trim\"\n options={modelFilters.allFiltersFor('trim')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n noWrap\n />\n\n <FilterDrawerItem\n title=\"Fuel type\"\n name=\"display_fueltype\"\n options={modelFilters.allFiltersFor('display_fueltype')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n />\n\n <FilterDrawerItem\n title=\"Gearbox\"\n name=\"transmission\"\n options={modelFilters.allFiltersFor('transmission')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={modelFilters.allFiltersFor('initial_payment')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n />\n\n <AnnualMileage\n name=\"mileage\"\n options={modelFilters.allFiltersFor('mileage')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n />\n\n <ContractLength\n name=\"term\"\n options={modelFilters.allFiltersFor('term')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n />\n </ul>\n );\n};\n\nexport default AllModelFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Range from './SpecialOffersFilters/Range';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst ElectricSpecialOffersFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_THEME', payload: 'electric' });\n }, []);\n\n return (\n <>\n <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n <FuelType\n name=\"display_fueltype[]\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Manufacturer\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <BodyType\n name=\"bodytype_categories[]\"\n options={elasticSearch.allFiltersFor('bodytype_categories')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Range\n name=\"range[]\"\n options={elasticSearch.allFiltersFor('range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Seats\n name=\"vehicle_seating_capacity[]\"\n options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n\n <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n <Budget\n name=\"monthly_prices\"\n options={elasticSearch.allFiltersFor('monthly_prices')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <ContractLength\n name=\"term\"\n options={elasticSearch.allFiltersFor('term')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={elasticSearch.allFiltersFor('initial_payment')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <AnnualMileage\n name=\"mileage\"\n options={elasticSearch.allFiltersFor('mileage')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n </>\n );\n};\n\nElectricSpecialOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default ElectricSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Range = ({ name, options, isDesktop, elasticSearchProps }) => {\n const optionsOrder = [\n 'Up to 100 miles',\n '100-200 miles',\n '200-300 miles',\n '300-400 miles',\n '400 miles and above',\n ].reverse();\n\n // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n // so we reverse both lists so that the missing options are last instead.\n\n const sortedOptions = [...options]\n .sort((a, b) => {\n return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n })\n .reverse();\n\n return (\n <FilterDrawerItem\n title=\"Battery range\"\n name={name}\n options={sortedOptions}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nRange.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nRange.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Range;\n","import React from 'react';\nimport { useElasticSearch } from './ElasticSearch';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\n\nconst EstimatedDeliveryDropdown = () => {\n const elasticSearch = useElasticSearch();\n\n return (\n <div style={{ width: '244px', flexShrink: 0 }}>\n <FilterDrawerItem\n title=\"Estimated delivery\"\n allText=\"Anytime\"\n name=\"estimated_delivery\"\n options={elasticSearch.allFiltersFor('estimated_delivery')}\n elasticSearchProps={elasticSearch.props}\n isDesktop\n />\n </div>\n );\n};\n\nexport default EstimatedDeliveryDropdown;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { ScrollSnapSlider } from '../scrollSnapSlider';\n\nimport Pills from './SpecialOffersFilters/filterPills/Pills';\nimport { shouldShowFeature } from '../../splitTesting';\nimport { showPromotionalToggle } from './utils';\n\nimport SortByDropdown from './SortByDropdown';\nimport EstimatedDeliveryDropdown from './EstimatedDeliveryDropdown';\nimport QuickDeliveryToggle from './QuickDeliveryToggle';\nimport PromotionalToggle from './PromotionalToggle';\nimport FundersDropdown from './FundersDropdown';\nimport ArrowLeftIcon from '../../../assets/images/arrow-left.svg';\nimport ArrowRightIcon from '../../../assets/images/arrow-right.svg';\nimport { useElasticSearch } from './ElasticSearch';\nimport InStockToggle from './InStockToggle';\n\nconst FilterControls = ({\n labelMapping,\n isAdmin,\n path,\n controller,\n action,\n isOnlySortVisible,\n fundersVisible,\n showPromotion,\n className,\n}) => {\n const pillsRef = useRef();\n const arrowLeftRef = useRef();\n const arrowRightRef = useRef();\n\n const { hasAnyOption } = useElasticSearch();\n\n const { isOpen, isFixed, filters, theme, totalCounts } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n const [isEmpty, setIsEmpty] = useState(true);\n const [filterList, setFilterList] = useState([]);\n const [isOverflown, setIsOverflown] = useState(false);\n\n const clearAll = (event) => {\n const form = event.target.closest('form');\n\n dispatch({ type: 'RESET_FILTERS' });\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n const handleOpen = () => {\n dispatch({ type: 'SET_OPEN', payload: !isOpen });\n };\n\n useEffect(() => {\n const filterControlsForm = document.querySelector('.filter-controls');\n const filterWrapper = document.querySelector('.drv-filter-desktop');\n const filterWrapperRect = filterWrapper.getBoundingClientRect() || 0;\n\n if (isOpen && isFixed) {\n filterControlsForm.style.top = `${filterWrapperRect.height + 48}px`;\n } else if (['specials', 'vehicles'].includes(controller)) {\n filterControlsForm.style.top = `${Math.max(filterWrapperRect.height, 125) + 32}px`;\n } else {\n filterControlsForm.style.top = '48px';\n }\n }, [isOpen, isFixed]);\n\n useEffect(() => {\n setFilterList(Object.keys(filters));\n }, [filters]);\n\n useEffect(() => {\n setIsOverflown(pillsRef.current.scrollWidth > pillsRef.current.clientWidth);\n }, [filters, isFixed]);\n\n useEffect(() => {\n const filtersWithoutDefaults = filters;\n delete filtersWithoutDefaults.customer_type;\n delete filtersWithoutDefaults.sort_by;\n\n if (Object.keys(filtersWithoutDefaults).length === 0) {\n setIsEmpty(true);\n } else {\n setIsEmpty(false);\n }\n }, [filters, filterList.map((name) => `filters[${name}]`)]);\n\n useEffect(() => {\n // eslint-disable-next-line no-new\n new ScrollSnapSlider(pillsRef.current, arrowLeftRef.current, arrowRightRef.current);\n }, []);\n\n const showEstimatedDelivery = isAdmin && controller === 'specials' && !isOnlySortVisible;\n const showFunders = isAdmin && fundersVisible;\n\n const showQuickDelivery = shouldShowFeature('stock') && hasAnyOption('stock', 'true');\n const showPromotionalStock = showPromotionalToggle({\n showPromotion,\n controller,\n action,\n value: 'eon promotion',\n hasAnyOption,\n });\n\n return (\n <div\n className={classnames('drv-filter-controls__desktop', `${className}`, {\n [`drv-filter-controls--${theme}`]: theme,\n 'drv-filter-controls__desktop--fixed': isFixed,\n })}\n >\n {!isOnlySortVisible && (\n <button className=\"drv-filter-controls__expand drv-button drv-button--blue\" type=\"button\" onClick={handleOpen}>\n {isOpen ? 'Hide' : 'Expand'} Filters\n </button>\n )}\n <div className=\"pills-group\">\n <span className=\"results-count\">{totalCounts.count} results</span>\n <div className={`indicators prev ${!isOverflown || isFixed ? 'hidden' : ''}`}>\n <button ref={arrowLeftRef} type=\"button\" className=\"arrow prev disabled\">\n <img src={ArrowLeftIcon} alt=\"\" srcSet=\"\" />\n </button>\n </div>\n <div ref={pillsRef} data-ga-filters className=\"drv-pills drv-pills-slider\">\n <Pills selectedFilters={filters} labelMapping={labelMapping} />\n </div>\n <div className={`indicators next ${!isOverflown || isFixed ? 'hidden' : ''}`}>\n <button ref={arrowRightRef} type=\"button\" className=\"arrow next\">\n <img src={ArrowRightIcon} alt=\"\" srcSet=\"\" />\n </button>\n </div>\n {!isEmpty && (\n <button\n type=\"button\"\n className={classnames('drv-filter-controls__clear drv-link', {\n [`drv-link--${theme}`]: theme,\n 'drv-link--gold': !theme,\n })}\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"cleared_all_filters\"\n onClick={clearAll}\n >\n Clear all\n </button>\n )}\n {controller === 'specials' && (\n <div style={{ marginLeft: '50px', display: 'flex', gap: '1rem' }}>\n {!isAdmin && showQuickDelivery && <QuickDeliveryToggle isDesktopVersion path={path} />}\n {showPromotionalStock && <PromotionalToggle isDesktopVersion value=\"eon promotion\" />}\n </div>\n )}\n {controller === 'vehicles' && (\n <div style={{ marginLeft: '50px', display: 'flex', gap: '1rem' }}>\n <InStockToggle isDesktopVersion path={path} />\n </div>\n )}\n </div>\n {showFunders && <FundersDropdown path={path} />}\n {showEstimatedDelivery && <EstimatedDeliveryDropdown path={path} />}\n <SortByDropdown controller={controller} action={action} />\n </div>\n );\n};\n\nFilterControls.propTypes = {\n className: PropTypes.string,\n labelMapping: PropTypes.shape({}).isRequired,\n isAdmin: PropTypes.bool,\n path: PropTypes.string.isRequired,\n controller: PropTypes.string.isRequired,\n action: PropTypes.string.isRequired,\n isOnlySortVisible: PropTypes.bool,\n fundersVisible: PropTypes.bool,\n showPromotion: PropTypes.bool,\n};\n\nFilterControls.defaultProps = {\n className: '',\n isAdmin: false,\n isOnlySortVisible: false,\n fundersVisible: false,\n showPromotion: true,\n};\n\nexport default FilterControls;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst ElectricPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.hybrid_or_electric && (\n <Pill category=\"hybrid_or_electric\" label=\"Electric\" value={selectedFilters.hybrid_or_electric} />\n )\n );\n};\n\nElectricPills.propTypes = {\n selectedFilters: PropTypes.shape({\n hybrid_or_electric: PropTypes.string,\n }).isRequired,\n};\n\nexport default ElectricPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst MakePills = ({ selectedFilters }) => {\n return (\n !!selectedFilters['make[]'] &&\n selectedFilters['make[]'].map((make, makeIndex, makes) => (\n <React.Fragment key={make}>\n <Pill\n category=\"make[]\"\n value={make}\n gaFilterName=\"manufacturer\"\n isMake\n isLast={\n makeIndex + 1 === makes.length &&\n selectedFilters['make_model_range[]'] &&\n !selectedFilters['make_model_range[]'].filter((model) => model.startsWith(make)).length\n }\n />\n\n {selectedFilters['make_model_range[]'] &&\n selectedFilters['make_model_range[]']\n .filter((model) => model.startsWith(make))\n .map((model, modelIndex, models) => (\n <Pill\n key={model}\n category=\"make_model_range[]\"\n gaFilterName=\"model\"\n label={model.replace(`${make},`, '')}\n value={model}\n isLast={makeIndex + 1 === makes.length && modelIndex + 1 === models.length}\n />\n ))}\n </React.Fragment>\n ))\n );\n};\n\nMakePills.propTypes = {\n selectedFilters: PropTypes.shape({\n 'make_model_range[]': PropTypes.arrayOf(PropTypes.string),\n }).isRequired,\n};\n\nexport default MakePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst FuelTypePills = ({ selectedFilters }) => {\n return (\n <>\n {selectedFilters['display_fueltype[]'] &&\n selectedFilters['display_fueltype[]'].map((value) => (\n <Pill key={value} category=\"display_fueltype[]\" value={value} gaFilterName=\"fuel_type\" />\n ))}\n {selectedFilters.display_fueltype && (\n <Pill category=\"display_fueltype\" value={selectedFilters.display_fueltype} />\n )}\n </>\n );\n};\n\nFuelTypePills.propTypes = {\n selectedFilters: PropTypes.shape({\n 'display_fueltype[]': PropTypes.arrayOf(PropTypes.string),\n display_fueltype: PropTypes.string,\n }).isRequired,\n};\n\nexport default FuelTypePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst BudgetPills = ({ selectedFilters, labelMapping }) => {\n const getKeyByValue = (object, value) => {\n return Object.keys(object).find((key) => object[key] === value);\n };\n\n return (\n !!selectedFilters.monthly_prices && (\n <Pill\n category=\"monthly_prices\"\n label={getKeyByValue(labelMapping, selectedFilters.monthly_prices)}\n value={selectedFilters.monthly_prices}\n gaFilterName=\"budget\"\n />\n )\n );\n};\n\nBudgetPills.propTypes = {\n selectedFilters: PropTypes.shape({\n monthly_prices: PropTypes.string,\n }).isRequired,\n labelMapping: PropTypes.shape({}).isRequired,\n};\n\nexport default BudgetPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst BodyTypePills = ({ selectedFilters }) => {\n return (\n <>\n {selectedFilters['bodytype_categories[]'] &&\n selectedFilters['bodytype_categories[]'].map((value) => (\n <Pill key={value} category=\"bodytype_categories[]\" value={value} gaFilterName=\"body_type\" />\n ))}\n {selectedFilters.bodytype_categories && (\n <Pill category=\"bodytype_categories\" value={selectedFilters.bodytype_categories} />\n )}\n </>\n );\n};\n\nBodyTypePills.propTypes = {\n selectedFilters: PropTypes.shape({\n bodytype_categories: PropTypes.string,\n 'bodytype_categories[]': PropTypes.arrayOf(PropTypes.string),\n }).isRequired,\n};\n\nexport default BodyTypePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst TransmissionPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.transmission && (\n <Pill category=\"transmission\" value={selectedFilters.transmission} gaFilterName=\"gearbox\" />\n )\n );\n};\n\nTransmissionPills.propTypes = {\n selectedFilters: PropTypes.shape({\n transmission: PropTypes.string,\n }).isRequired,\n};\n\nexport default TransmissionPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst SeatsPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters['vehicle_seating_capacity[]'] &&\n selectedFilters['vehicle_seating_capacity[]'].map((value) => (\n <Pill\n key={value}\n category=\"vehicle_seating_capacity[]\"\n label={`${value} seats`}\n value={value}\n gaFilterName=\"no_of_seats\"\n />\n ))\n );\n};\n\nSeatsPills.propTypes = {\n selectedFilters: PropTypes.shape({\n 'vehicle_seating_capacity[]': PropTypes.arrayOf(PropTypes.string),\n }).isRequired,\n};\n\nexport default SeatsPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst TermPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.term && (\n <Pill\n category=\"term\"\n label={`${selectedFilters.term} month term`}\n value={selectedFilters.term}\n gaFilterName=\"contract_length\"\n />\n )\n );\n};\n\nTermPills.propTypes = {\n selectedFilters: PropTypes.shape({\n term: PropTypes.string,\n }).isRequired,\n};\n\nexport default TermPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst MileagePills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.mileage && (\n <Pill\n category=\"mileage\"\n label={`${Math.floor(selectedFilters.mileage).toLocaleString('en-GB')} miles`}\n value={selectedFilters.mileage}\n gaFilterName=\"annual_mileage\"\n />\n )\n );\n};\n\nMileagePills.propTypes = {\n selectedFilters: PropTypes.shape({\n mileage: PropTypes.string,\n }).isRequired,\n};\n\nexport default MileagePills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst InitialPaymentPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.initial_payment && (\n <Pill\n category=\"initial_payment\"\n label={`${selectedFilters.initial_payment} Month initial payment`}\n value={selectedFilters.initial_payment}\n gaFilterName=\"initial_payment\"\n />\n )\n );\n};\n\nInitialPaymentPills.propTypes = {\n selectedFilters: PropTypes.shape({\n initial_payment: PropTypes.string,\n }).isRequired,\n};\n\nexport default InitialPaymentPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst EstimatedDeliveryPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.estimated_delivery && (\n <Pill\n category=\"estimated_delivery\"\n label={`${selectedFilters.estimated_delivery} delivery`}\n value={selectedFilters.estimated_delivery}\n />\n )\n );\n};\n\nEstimatedDeliveryPills.propTypes = {\n selectedFilters: PropTypes.shape({\n estimated_delivery: PropTypes.string,\n }).isRequired,\n};\n\nexport default EstimatedDeliveryPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst InStockPills = ({ selectedFilters }) => {\n return !!selectedFilters.stock && <Pill category=\"stock\" label=\"In Stock\" value={selectedFilters.stock} />;\n};\n\nInStockPills.propTypes = {\n selectedFilters: PropTypes.shape({\n stock: PropTypes.string,\n }).isRequired,\n};\n\nexport default InStockPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Pill from './Pill';\n\nconst PromotionalPills = ({ selectedFilters }) => {\n if (!selectedFilters.promotion_name) return null;\n\n return <Pill value={selectedFilters.promotion_name.toString()} label=\"EV Miles Offer\" category=\"promotion_name\" />;\n};\n\nPromotionalPills.propTypes = {\n selectedFilters: PropTypes.shape({\n promotion_name: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n }).isRequired,\n};\n\nexport default PromotionalPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst FunderPills = ({ selectedFilters }) => {\n return !!selectedFilters.funder && <Pill category=\"funder\" value={selectedFilters.funder} />;\n};\n\nFunderPills.propTypes = {\n selectedFilters: PropTypes.shape({\n funder: PropTypes.string,\n }).isRequired,\n};\n\nexport default FunderPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst Range = ({ selectedFilters }) => {\n return (\n !!selectedFilters['range[]'] &&\n selectedFilters['range[]'].map((value) => <Pill key={value} category=\"range[]\" value={value} />)\n );\n};\n\nRange.propTypes = {\n selectedFilters: PropTypes.shape({\n transmission: PropTypes.string,\n }).isRequired,\n};\n\nexport default Range;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst PayloadPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.payload && (\n <Pill category=\"payload\" label={`${selectedFilters.payload}`} value={selectedFilters.payload} />\n )\n );\n};\n\nPayloadPills.propTypes = {\n selectedFilters: PropTypes.shape({\n payload: PropTypes.string,\n }).isRequired,\n};\n\nexport default PayloadPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Pill from './Pill';\n\nconst LoadLengthPills = ({ selectedFilters }) => {\n return (\n !!selectedFilters.load_length && (\n <Pill category=\"load_length\" label={`${selectedFilters.load_length}`} value={selectedFilters.load_length} />\n )\n );\n};\n\nLoadLengthPills.propTypes = {\n selectedFilters: PropTypes.shape({\n load_length: PropTypes.string,\n }).isRequired,\n};\n\nexport default LoadLengthPills;\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getQueryStringParameters } from '../../utils';\nimport { filterOptions } from './utils';\n\nconst SortByDropdown = ({ controller, action }) => {\n const options = filterOptions(controller, action);\n const { sort_by } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n\n const [open, setOpen] = useState(false);\n const dropdownRef = useRef();\n\n const handleOutsideClicks = (event) => {\n if (open && dropdownRef.current && !dropdownRef.current.contains(event.target)) {\n setOpen(false);\n }\n };\n\n useEffect(() => {\n dispatch({\n type: 'SET_SORT_BY',\n payload: getQueryStringParameters().sort_by || options.filter((option) => option.default)[0].value,\n });\n }, []);\n\n useEffect(() => {\n document.addEventListener('mousedown', handleOutsideClicks);\n return () => {\n document.removeEventListener('mousedown', handleOutsideClicks);\n };\n }, [open]);\n\n const handleClick = (event) => {\n event.persist();\n dispatch({\n type: 'SET_SORT_BY',\n payload: options.find((field) => field.value === event.target.value).value,\n });\n setOpen(false);\n setTimeout(() => {\n event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n return (\n <div className={`drv-filter-controls__sort ${open ? 'drv-filter-controls__sort--open' : ''}`} ref={dropdownRef}>\n <button type=\"button\" className=\"drv-button drv-button--blue\" onClick={() => setOpen(!open)}>\n Sort by\n </button>\n <div className=\"drv-filter-controls__sort-options\">\n {options &&\n options.map((field) => {\n return (\n <li key={field.value} className=\"drv-filter-option\">\n <input\n type=\"radio\"\n id={field.name}\n name=\"sort_by\"\n className=\"drv-checkbox drv-checkbox--radio\"\n data-action=\"ga-filters#push\"\n data-ga-filters-event-action=\"sort_applied\"\n data-ga-filters-sort-applied={field.name.toLowerCase().replaceAll(' ', '_')}\n value={field.value}\n checked={sort_by === field.value}\n onChange={(event) => {\n handleClick(event);\n }}\n />\n\n <label htmlFor={field.name} className=\"drv-filter-option__label drv-ml-1\">\n {field.name}\n </label>\n </li>\n );\n })}\n </div>\n </div>\n );\n};\n\nSortByDropdown.propTypes = {\n controller: PropTypes.string,\n action: PropTypes.string,\n};\n\nSortByDropdown.defaultProps = {\n controller: '',\n action: '',\n};\n\nexport default SortByDropdown;\n","import React from 'react';\nimport { useElasticSearch } from './ElasticSearch';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\n\nconst FundersDropdown = () => {\n const elasticSearch = useElasticSearch();\n\n return (\n <div style={{ width: '230px', flexShrink: 0 }}>\n <FilterDrawerItem\n title=\"Funders\"\n allText=\"Any\"\n name=\"funder\"\n options={elasticSearch.allFiltersFor('funder')}\n elasticSearchProps={elasticSearch.props}\n isDesktop\n />\n </div>\n );\n};\n\nexport default FundersDropdown;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport Budget from './SpecialOffersFilters/Budget';\n\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport BodyType from './SpecialOffersFilters/BodyType';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport Seats from './SpecialOffersFilters/Seats';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst ShortTermSpecialOffersFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_THEME', payload: '' });\n }, []);\n\n return (\n <>\n <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n <FuelType\n name=\"display_fueltype[]\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Manufacturer\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Budget\n name=\"monthly_prices\"\n options={elasticSearch.allFiltersFor('monthly_prices')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <BodyType\n name=\"bodytype_categories[]\"\n options={elasticSearch.allFiltersFor('bodytype_categories')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Transmission\n name=\"transmission\"\n options={elasticSearch.allFiltersFor('transmission')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Seats\n name=\"vehicle_seating_capacity[]\"\n options={elasticSearch.allFiltersFor('vehicle_seating_capacity')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n\n <FilterList heading=\"Contract options\" isDesktop={isDesktop}>\n <AnnualMileage\n name=\"mileage\"\n options={elasticSearch.allFiltersFor('mileage')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={elasticSearch.allFiltersFor('initial_payment')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n </>\n );\n};\n\nShortTermSpecialOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default ShortTermSpecialOffersFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\n\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst StockOffersFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_THEME', payload: '' });\n }, []);\n\n return (\n <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n <ContractLength\n name=\"term\"\n options={elasticSearch.allFiltersFor('term')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <AnnualMileage\n name=\"mileage\"\n options={elasticSearch.allFiltersFor('mileage')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={elasticSearch.allFiltersFor('initial_payment')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n );\n};\n\nStockOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default StockOffersFilters;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\n\nimport FilterList from '../ui/FilterList';\n\nimport Budget from './SpecialOffersFilters/Budget';\nimport Manufacturer from './SpecialOffersFilters/Manufacturer';\nimport Model from './SpecialOffersFilters/Model';\nimport Payload from './SpecialOffersFilters/Payload';\nimport LoadLength from './SpecialOffersFilters/LoadLength';\nimport FuelType from './SpecialOffersFilters/FuelType';\nimport Transmission from './SpecialOffersFilters/Transmission';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport { useElasticSearch } from './ElasticSearch';\n\nconst VanSpecialOffersFilters = ({ isDesktop }) => {\n const elasticSearch = useElasticSearch();\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({ type: 'SET_THEME', payload: '' });\n }, []);\n\n return (\n <>\n <FilterList heading=\"Vehicle options\" isDesktop={isDesktop}>\n <Manufacturer\n name=\"make[]\"\n options={elasticSearch.allFiltersFor('make')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Model\n name=\"make_model_range[]\"\n options={elasticSearch.availableFiltersFor('make_model_range')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <FuelType\n name=\"display_fueltype[]\"\n options={elasticSearch.allFiltersFor('display_fueltype')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Transmission\n name=\"transmission\"\n options={elasticSearch.allFiltersFor('transmission')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <Payload\n name=\"payload\"\n options={elasticSearch.allFiltersFor('payload')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <LoadLength\n name=\"load_length\"\n options={elasticSearch.allFiltersFor('load_length')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n\n <FilterList heading=\"Leasing options\" isDesktop={isDesktop}>\n <Budget\n name=\"monthly_prices\"\n options={elasticSearch.allFiltersFor('monthly_prices')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <ContractLength\n name=\"term\"\n options={elasticSearch.allFiltersFor('term')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <InitialPayment\n name=\"initial_payment\"\n options={elasticSearch.allFiltersFor('initial_payment')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n\n <AnnualMileage\n name=\"mileage\"\n options={elasticSearch.allFiltersFor('mileage')}\n elasticSearchProps={elasticSearch.props}\n isDesktop={isDesktop}\n />\n </FilterList>\n </>\n );\n};\n\nVanSpecialOffersFilters.propTypes = {\n isDesktop: PropTypes.bool.isRequired,\n};\n\nexport default VanSpecialOffersFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst Payload = ({ name, options, isDesktop, elasticSearchProps }) => {\n const optionsOrder = ['Up to 1000mm', '500kg - 1000kg', '1000kg - 1500 kg'].reverse();\n\n // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n // so we reverse both lists so that the missing options are last instead.\n\n const sortedOptions = [...options]\n .sort((a, b) => {\n return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n })\n .reverse();\n\n return (\n <FilterDrawerItem\n title=\"Payload\"\n name={name}\n options={sortedOptions}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nPayload.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nPayload.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default Payload;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst LoadLength = ({ name, options = [], isDesktop, elasticSearchProps }) => {\n const optionsOrder = ['Up to 1000mm', '1000mm - 2400mm', '2400mm - 3000mm', '3000mm - 4000mm'].reverse();\n\n // .reverse() -> we want all of the options not in this list to be last, but the default with the below sort is that they're first.\n // so we reverse both lists so that the missing options are last instead.\n\n const sortedOptions = [...options]\n .sort((a, b) => {\n return optionsOrder.indexOf(a.value) - optionsOrder.indexOf(b.value);\n })\n .reverse();\n\n return (\n <FilterDrawerItem\n title=\"Load Length\"\n name={name}\n options={sortedOptions}\n elasticSearchProps={elasticSearchProps}\n isDesktop={isDesktop}\n />\n );\n};\n\nLoadLength.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n isDesktop: PropTypes.bool,\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nLoadLength.defaultProps = {\n options: [],\n isDesktop: false,\n};\n\nexport default LoadLength;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Pills from './SpecialOffersFilters/filterPills/Pills';\nimport QuickDeliveryToggle from './QuickDeliveryToggle';\nimport PromotionalToggle from './PromotionalToggle';\nimport { shouldShowFeature } from '../../splitTesting';\nimport { useElasticSearch } from './ElasticSearch';\nimport InStockToggle from './InStockToggle';\n\nimport { showPromotionalToggle } from './utils';\n\nconst ClearAllButton = ({ onClick, theme }) => (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <span\n className={classnames('drv-link', {\n 'drv-link--gold': !theme,\n [`drv-link--${theme}`]: theme,\n })}\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"cleared_all_filters\"\n onClick={onClick}\n >\n Clear all\n <svg\n fill={theme === 'electric' ? '#00a3e0' : '#ac8c30'}\n height=\"20\"\n viewBox=\"228.61 210.78 10.21 12.02\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m233.71817501636602,222.80117904990522 c-2.8198594488203526,0 -5.10526180267334,-2.39004047670465 -5.10526180267334,-5.343179495041285 s2.2854023538529873,-5.343179495041285 5.10526180267334,-5.343179495041285 l0,-1.3352021604064999 l2.9201778432428833,1.8040021347066384 l-2.9201778432428833,1.6168557087302022 l0,-1.2514356213533258 c-2.377137526869774,0 -4.311553131788969,2.022983649566763 -4.311553131788969,4.50895943336427 c0,2.4859757837975067 1.9344156049191952,4.50895943336427 4.311553131788969,4.50895943336427 s4.311553131788969,-2.0062992483332227 4.311553131788969,-4.50895943336427 l0.7937086708843714,0 c0,2.9614812189534057 -2.2854023538529873,5.343179495041285 -5.10526180267334,5.343179495041285 z\" />\n </svg>\n </span>\n);\n\nClearAllButton.propTypes = {\n onClick: PropTypes.func.isRequired,\n theme: PropTypes.string,\n};\n\nClearAllButton.defaultProps = {\n theme: '',\n};\n\nconst MobileFilterControls = ({ labelMapping, showPromotion, controller, action, path }) => {\n const pillsRef = useRef();\n const { hasAnyOption } = useElasticSearch();\n\n const { filters, totalCounts, theme } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n const [isEmpty, setIsEmpty] = useState(true);\n const [filterList, setFilterList] = useState([]);\n\n const showQuickDelivery = shouldShowFeature('stock') && controller === 'specials' && hasAnyOption('stock', 'true');\n const showPromotionalStock = showPromotionalToggle({\n showPromotion,\n controller,\n action,\n value: 'eon promotion',\n hasAnyOption,\n });\n\n const showOnlyInStock = showQuickDelivery && !showPromotionalStock;\n const showOnlyPromotional = showPromotionalStock && !showQuickDelivery;\n const showSingleToggle = showOnlyInStock || showOnlyPromotional;\n\n const clearAll = (event) => {\n const form = event.target.closest('form');\n\n dispatch({ type: 'RESET_FILTERS' });\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n useEffect(() => {\n setFilterList(Object.keys(filters));\n }, [filters]);\n\n useEffect(() => {\n const filtersWithoutDefaults = filters;\n delete filtersWithoutDefaults.customer_type;\n delete filtersWithoutDefaults.sort_by;\n\n if (Object.keys(filtersWithoutDefaults).length === 0) {\n setIsEmpty(true);\n } else {\n setIsEmpty(false);\n }\n }, [filters, filterList.map((name) => `filters[${name}]`)]);\n\n return (\n <>\n {showQuickDelivery && showPromotionalStock && (\n <div className=\"drv-filter-toggles\">\n <QuickDeliveryToggle isDesktopVersion={false} />\n <PromotionalToggle isDesktopVersion={false} value=\"eon promotion\" />\n </div>\n )}\n {controller === 'vehicles' && (\n <div className=\"drv-filter-toggles\">\n <InStockToggle path={path} isDesktopVersion={false} />\n </div>\n )}\n <div\n className={classnames('drv-filter-controls__mobile', {\n [`drv-filter-controls--${theme}`]: theme,\n })}\n >\n <div className=\"drv-filter-controls__mobile--primary\">\n <div>\n <span className=\"drv-filter-controls__result-count\">{totalCounts.count}</span> results\n </div>\n {!isEmpty && ((showQuickDelivery && showPromotionalStock) || controller !== 'specials') && (\n <ClearAllButton onClick={clearAll} theme={theme} />\n )}\n {showOnlyPromotional && <PromotionalToggle isDesktopVersion={false} value=\"eon promotion\" />}\n {showOnlyInStock && <QuickDeliveryToggle isDesktopVersion={false} />}\n </div>\n {!isEmpty && (\n <div className=\"pills-group\">\n <div ref={pillsRef} className=\"drv-pills\">\n <Pills selectedFilters={filters} labelMapping={labelMapping} />\n </div>\n {!isEmpty && showSingleToggle && <ClearAllButton onClick={clearAll} theme={theme} />}\n </div>\n )}\n </div>\n </>\n );\n};\n\nMobileFilterControls.propTypes = {\n labelMapping: PropTypes.shape({}).isRequired,\n showPromotion: PropTypes.bool.isRequired,\n controller: PropTypes.string.isRequired,\n action: PropTypes.string.isRequired,\n path: PropTypes.string.isRequired,\n};\n\nexport default MobileFilterControls;\n","import React, { useMemo } from 'react';\nimport FilterDrawerItem from '../ui/FilterDrawerItem';\nimport AnnualMileage from './SpecialOffersFilters/AnnualMileage';\nimport InitialPayment from './SpecialOffersFilters/InitialPayment';\nimport ContractLength from './SpecialOffersFilters/ContractLength';\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst MobileModelFilters = () => {\n const modelFilters = useModelFilters();\n\n const withoutButton = useMemo(() => true, []);\n\n return (\n <div className=\"drv-ui\">\n <hr className=\"drv-hr\" />\n <h4 className=\"d-flex justify-content-center mt-4 drv-text-subheading drv-text-semi-bold\">\n Choose your vehicle options\n </h4>\n <ul className=\"drv-model-filters drv-model-filters--mobile\">\n <FilterDrawerItem\n title=\"Trim level\"\n name=\"trim\"\n options={modelFilters.allFiltersFor('trim')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n <FilterDrawerItem\n title=\"Fuel type\"\n name=\"display_fueltype\"\n options={modelFilters.allFiltersFor('display_fueltype')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n <FilterDrawerItem\n title=\"Gearbox\"\n name=\"transmission\"\n options={modelFilters.allFiltersFor('transmission')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n </ul>\n <hr />\n <h4 className=\"d-flex justify-content-center drv-text-subheading drv-text-semi-bold\">\n Choose your contract options\n </h4>\n <ul className=\"drv-model-filters drv-model-filters--mobile\">\n <InitialPayment\n name=\"initial_payment\"\n options={modelFilters.allFiltersFor('initial_payment')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n <AnnualMileage\n name=\"mileage\"\n options={modelFilters.allFiltersFor('mileage')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n <ContractLength\n name=\"term\"\n options={modelFilters.allFiltersFor('term')}\n elasticSearchProps={modelFilters.props}\n isDesktop\n withoutButton={withoutButton}\n />\n </ul>\n </div>\n );\n};\n\nexport default MobileModelFilters;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Pill from './SpecialOffersFilters/filterPills/Pill';\nimport { useModelFilters } from './ModelFiltersContext';\n\nconst ModelPills = () => {\n const {\n props: { selectedFilters },\n } = useModelFilters();\n const dispatch = useDispatch();\n const [isEmpty, setIsEmpty] = useState(true);\n const { totalCounts } = useSelector((state) => state.filterControls);\n\n const clearAll = (event) => {\n const form = event.target.closest('form');\n\n dispatch({ type: 'RESET_FILTERS' });\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n useEffect(() => {\n const filtersWithoutDefaults = { ...selectedFilters };\n delete filtersWithoutDefaults.customer_type;\n delete filtersWithoutDefaults.sort_by;\n\n setIsEmpty(Object.keys(filtersWithoutDefaults).length === 0);\n }, [selectedFilters]);\n\n const clearAllButton = (options) => {\n const className = options?.mobile ? 'd-lg-none' : 'd-none d-lg-block';\n\n return (\n !isEmpty && (\n <button\n className={`${className} drv-filter-controls__clear drv-link drv-link--gold`}\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"cleared_all_filters\"\n onClick={clearAll}\n >\n Clear all\n </button>\n )\n );\n };\n\n return (\n <>\n <div className=\"drv-filter-controls__mobile--primary mb-3 mt-2 align-items-end\">\n <div className=\"d-lg-none\">\n <span className=\"drv-filter-controls__result-count\">{totalCounts.count}</span> results\n </div>\n {clearAllButton({ mobile: true })}\n </div>\n <div className=\"d-flex justify-content-between mb-3\">\n <div data-ga-filters className=\"drv-pills drv-pills-slider\">\n {selectedFilters.trim && <Pill category=\"trim\" value={selectedFilters.trim} />}\n {selectedFilters.display_fueltype && (\n <Pill category=\"display_fueltype\" value={selectedFilters.display_fueltype} gaFilterName=\"fuel_type\" />\n )}\n {selectedFilters.transmission && (\n <Pill category=\"transmission\" value={selectedFilters.transmission} gaFilterName=\"gearbox\" />\n )}\n {selectedFilters.initial_payment && (\n <Pill\n category=\"initial_payment\"\n label={`${selectedFilters.initial_payment} Month initial payment`}\n value={selectedFilters.initial_payment}\n gaFilterName=\"initial_payment\"\n />\n )}\n {selectedFilters.mileage && (\n <Pill\n category=\"mileage\"\n label={`${Math.floor(selectedFilters.mileage).toLocaleString('en-GB')} miles`}\n value={selectedFilters.mileage}\n gaFilterName=\"annual_mileage\"\n />\n )}\n {selectedFilters.term && (\n <Pill\n category=\"term\"\n label={`${selectedFilters.term} month term`}\n value={selectedFilters.term}\n gaFilterName=\"contract_length\"\n />\n )}\n </div>\n {clearAllButton()}\n </div>\n </>\n );\n};\n\nexport default ModelPills;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n// Component Imports\nimport DerivativeFilters from './DerivativeFilters';\n\nconst PricingFilters = ({ path }) => {\n const dataGroups = [\n { key: 'channels', name: 'Channels' },\n { key: 'condition', name: 'Condition' },\n { key: 'managed_by', name: 'Managed by' },\n { key: 'make', name: 'Make' },\n { key: 'model_range', name: 'Model range' },\n { key: 'model', name: 'Model' },\n { key: 'trim', name: 'Trim' },\n { key: 'model_year', name: 'Model year' },\n { key: 'transmission', name: 'Transmission' },\n { key: 'display_fueltype', name: 'Fuel type' },\n { key: 'bodytype_categories', name: 'Bodytype' },\n { key: 'winning_funders', name: 'Winning funder' },\n { key: 'funder_special', name: 'Funder special' },\n { key: 'total_care', name: 'Total care' },\n { key: 'published_state', name: 'Visible state of derivative' },\n { key: 'available_deals', name: 'Deal is published and live' },\n { key: 'published_unavailable_deals', name: 'Deal is published but not live' },\n { key: 'draft_deals', name: 'Deal is in draft' },\n { key: 'stock_deals', name: 'Deal is in stock' },\n ];\n\n return (\n <form\n noValidate=\"novalidate\"\n className=\"simple_form search\"\n action=\"/backoffice/derivatives/pricing\"\n acceptCharset=\"UTF-8\"\n data-remote=\"true\"\n method=\"get\"\n >\n <div className=\"form-group string optional search_keywords\">\n <label className=\"string optional\" htmlFor=\"search_keywords\">\n Cap ID or code\n </label>\n <input\n className=\"form-control string optional\"\n placeholder=\"e.g 012345\"\n type=\"text\"\n name=\"search[keywords]\"\n id=\"search_keywords\"\n />\n </div>\n\n <div className=\"form-group string optional\">\n <label className=\"string optional\" htmlFor=\"date_range\">\n Date standard deal was last updated\n </label>\n <input\n className=\"form-control string optional datepicker\"\n type=\"text\"\n name=\"search[date_range]\"\n id=\"date_range\"\n />\n </div>\n\n <div className=\"form-group hidden search_sort_by\">\n <input className=\"form-control hidden\" name=\"search[sort_by]\" type=\"hidden\" id=\"search_sort_by\" />\n </div>\n\n <DerivativeFilters dataGroups={dataGroups} path={path} />\n\n <input\n className=\"btn btn-success mt-3 w-100\"\n type=\"submit\"\n name=\"commit\"\n value=\"Save Search\"\n data-disable-with=\"Save Search\"\n />\n </form>\n );\n};\n\nPricingFilters.propTypes = {\n path: PropTypes.string.isRequired,\n};\n\nexport default PricingFilters;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useEffect, useState, useRef } from 'react';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport { goToNextStep, goToPreviousStep, setEligibilityAnswer } from '../../store/reducers/eligibility-checker';\nimport { areAllQuestionsAnswered, calculateCurrentScore } from '../../store/selectors';\nimport { finalScreenData, steps } from './steps';\nimport { pushData } from '../../ga/eligibility-checker-ga-data';\nimport store from '../../store/store';\nimport Step from './Step';\nimport FinalScreen from './FinalScreen';\n\nconst preloadImages = () => {\n steps.forEach((step) => {\n const img = new Image();\n img.src = step.image;\n const mobileImg = new Image();\n mobileImg.src = step.mobileImage;\n });\n Object.values(finalScreenData).forEach((screen) => {\n const img = new Image();\n img.src = screen.image;\n const mobileImg = new Image();\n mobileImg.src = screen.mobileImage;\n });\n};\n\nconst EligibilityChecker = () => {\n const dispatch = useDispatch();\n const currentStep = useSelector((state) => state.eligibilityChecker.currentStep);\n const allAnswered = useSelector((state) => areAllQuestionsAnswered(state.eligibilityChecker));\n const currentScore = useSelector((state) => calculateCurrentScore(state.eligibilityChecker, steps));\n const stepsData = useSelector((state) => ({\n about_you: state.eligibilityChecker.about_you,\n address_history: state.eligibilityChecker.address_history,\n employment_status: state.eligibilityChecker.employment_status,\n employment_history: state.eligibilityChecker.employment_history,\n affordability: state.eligibilityChecker.affordability,\n credit_history: state.eligibilityChecker.credit_history,\n }));\n const [finalScreen, setFinalScreen] = useState(null);\n const [errorMessage, setErrorMessage] = useState('');\n const componentRef = useRef(null);\n\n useEffect(() => {\n preloadImages();\n }, []);\n\n useEffect(() => {\n const topBarHeight = 130;\n const componentTop = componentRef.current.getBoundingClientRect().top;\n if (componentTop < topBarHeight || componentTop > window.innerHeight) {\n window.scrollTo({\n top: componentTop + window.scrollY - topBarHeight,\n behavior: 'smooth',\n });\n }\n }, [currentStep, finalScreen]);\n\n const handleNextStep = () => {\n const stepName = steps[currentStep].name;\n const currentValue = stepsData[stepName];\n\n if (currentStep === 0 && currentValue !== 'over_18') {\n setErrorMessage('You must be over 18 to proceed.');\n return;\n }\n\n if (currentValue === '') {\n setErrorMessage('Please select an answer');\n return;\n }\n\n setErrorMessage('');\n pushData({\n step: currentStep,\n stepName,\n action: 'next step',\n currentValue,\n });\n\n if (allAnswered) {\n setFinalScreen(currentScore);\n } else {\n dispatch(goToNextStep());\n }\n };\n\n const handlePreviousStep = () => {\n setErrorMessage(''); // Reset error message when going back\n const stepName = steps[currentStep].name;\n pushData({\n step: currentStep,\n stepName,\n action: 'previous step',\n currentValue: stepsData[stepName],\n });\n\n dispatch(goToPreviousStep());\n };\n\n const handleSetAnswer = (step, value, score) => {\n setErrorMessage(''); // Reset error message when a value is selected\n dispatch(setEligibilityAnswer(step, value, score));\n };\n\n const stepComponentData = steps[currentStep];\n\n return (\n <div ref={componentRef}>\n {finalScreen ? (\n <FinalScreen\n title={finalScreenData[finalScreen].title}\n image={finalScreenData[finalScreen].image}\n mobileImage={finalScreenData[finalScreen].mobileImage}\n description={finalScreenData[finalScreen].description}\n score={finalScreen}\n />\n ) : (\n <Step\n stepData={stepComponentData}\n stepNumber={currentStep}\n currentValue={stepsData[stepComponentData.name]}\n onAnswer={handleSetAnswer}\n onNext={handleNextStep}\n onPrevious={handlePreviousStep}\n steps={steps}\n currentStep={currentStep}\n errorMessage={errorMessage}\n />\n )}\n </div>\n );\n};\n\nexport default function EligibilityCheckerProvider(props) {\n return (\n <Provider store={store}>\n <EligibilityChecker {...props} />\n </Provider>\n );\n}\n","/* eslint-disable react/require-default-props */\nimport React, { useState, useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useForm } from 'react-hook-form';\nimport { isValidNumber } from 'libphonenumber-js';\nimport { Provider, useSelector } from 'react-redux';\n\nimport store from '../../store/store';\n\n// Component Imports\nimport FormField from '../Forms/FormField';\nimport OptOut from '../Forms/OptOut';\n\nimport { pushData } from '../../ga/form_ga_data';\n\nimport { selectedOfferId, geotargetlyInit } from '../Deal/helpers';\n\nconst EnquireNow = ({\n postURL,\n channelID,\n isPersonal,\n geotargetly,\n pricing,\n personal_sources,\n business_sources,\n featured_deal,\n offer_id,\n derivative_id,\n initial_payment_months,\n term,\n mileage,\n salesAdmin,\n vehicleId,\n vehicleStatus,\n}) => {\n // React Redux hooks\n const query = useSelector((state) => state.Deal);\n const offerId = offer_id || selectedOfferId(query);\n\n const derivativeId = derivative_id || query.derivativeId;\n const selectedTerm = query.contractLength || term;\n const selectedMileage = (query.annualMileage > 0 ? query.annualMileage : 5000) || mileage;\n const { maintenanceSelected } = query;\n const initialPaymentMonths = initial_payment_months || query.initialMonths;\n const selectedOptionIds = query.selected.actuallySelectedOptionIds;\n\n const [state, setState] = useState({\n firstName: '',\n lastName: '',\n businessName: '',\n email: '',\n telephone: '',\n source: '',\n disposal: '',\n soon: '',\n time: '',\n comments: '',\n timeTrading: '',\n businessType: '',\n fleetSize: '',\n mailList: false,\n authenticity_token: '',\n disabled: false,\n leadType: '',\n });\n\n useEffect(() => {\n if (geotargetly) {\n geotargetlyInit(document, 'script');\n }\n }, []);\n\n const { register, handleSubmit, errors, getValues } = useForm({\n mode: 'onBlur',\n reValidateMode: 'onBlur',\n });\n\n const formRef = useRef(null);\n\n const handleFormSubmission = () => {\n if (state.disabled) {\n return;\n }\n\n setState({\n ...state,\n disabled: true,\n authenticity_token: document.querySelector('[name=csrf-token]').content,\n });\n\n let formName = 'Car Enquiry';\n if (query.isVan) {\n formName = 'Van Enquiry';\n }\n if (query.isShortTerm) {\n formName = 'Short Term';\n }\n\n pushData({\n form_name: formName,\n lease_type: isPersonal ? 'Personal' : 'Business',\n signup: !getValues('contact_opt_out'),\n value: query.monthlyPrice,\n item: {\n item_name: query.model,\n item_brand: query.make,\n item_variant: query.trim,\n item_category: query.isVan ? 'Van' : 'Car',\n item_category2: query.transmission,\n item_category3: query.fueltype,\n price: query.price,\n duration: query.contractLength,\n annual_miles: query.annualMileage,\n initial_payment_duration: query.initialMonths,\n initial_payment_price: query.initialPaymentPrice,\n maintenance: query.maintenanceSelected,\n maintenance_price:\n query.maintainedMonthlyPrice && Math.max(0, query.maintainedMonthlyPrice - query.monthlyPrice),\n },\n user_data: {\n email: getValues('contact_email'),\n phone_number: getValues('contact_telephone'),\n },\n });\n\n setTimeout(() => {\n formRef.current.submit();\n }, 1000);\n };\n\n return (\n <form\n className=\"c-modal-enquire-now__form bootstrap-form\"\n onSubmit={handleSubmit(handleFormSubmission)}\n noValidate\n ref={formRef}\n action={postURL}\n method=\"post\"\n >\n <input type=\"hidden\" name=\"authenticity_token\" value={state.authenticity_token} />\n <input type=\"hidden\" name=\"channel_id\" value={channelID} />\n\n {!!offerId && <input type=\"hidden\" name=\"offer_id\" value={offerId} />}\n\n {(!!derivative_id || !offerId) && <input type=\"hidden\" name=\"derivative_id\" value={derivativeId} />}\n\n {!offerId && <input type=\"hidden\" name=\"term\" value={selectedTerm} />}\n\n {!offerId && <input type=\"hidden\" name=\"mileage\" value={selectedMileage} />}\n\n {!!maintenanceSelected && <input type=\"hidden\" name=\"maintenance_selected\" value={maintenanceSelected} />}\n\n {!!initialPaymentMonths && <input type=\"hidden\" name=\"initial_payment_months\" value={initialPaymentMonths} />}\n\n {vehicleId && <input type=\"hidden\" name=\"vehicle_id\" value={vehicleId} />}\n\n <div className={`geotargetlygeocontent${geotargetly}`}>\n <input type=\"hidden\" name=\"office\" />\n </div>\n\n {selectedOptionIds.length > 0 &&\n selectedOptionIds.map((option) => (\n <input type=\"hidden\" name=\"selected_option_ids[]\" value={option} key={option} />\n ))}\n\n {pricing && <input type=\"hidden\" name=\"pricing\" value={pricing} />}\n\n {featured_deal && <input type=\"hidden\" name=\"featured_deal\" value={featured_deal} />}\n\n <div className=\"b-form-row\">\n <FormField\n labelText=\"First name\"\n placeholder=\"First name\"\n id=\"first_name\"\n type=\"text\"\n onChange={(event) => setState({ ...state, firstName: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.first_name}\n value={state.firstName}\n errorMessage=\"Please enter your first name\"\n />\n <FormField\n labelText=\"Last name\"\n placeholder=\"Last name\"\n id=\"last_name\"\n type=\"text\"\n onChange={(event) => setState({ ...state, lastName: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.last_name}\n value={state.lastName}\n errorMessage=\"Please enter your last name\"\n />\n {!isPersonal && (\n <>\n <FormField\n labelText=\"Business name\"\n placeholder=\"Business name\"\n id=\"company_name\"\n type=\"text\"\n onChange={(event) => setState({ ...state, businessName: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.company_name}\n value={state.businessName}\n errorMessage=\"Please enter your business name\"\n />\n <FormField\n labelText=\"Business Type\"\n id=\"contact_business_type\"\n onChange={(event) => setState({ ...state, businessType: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.contact_business_type}\n value={state.businessType}\n variant=\"select\"\n options={[\n { value: '', text: 'Business type' },\n { value: 'Limited Company', text: 'Limited Company' },\n { value: 'Sole Trader', text: 'Sole Trader' },\n {\n value: 'Partnership Four Partners',\n text: 'Partnership (4+ partners)',\n },\n {\n value: 'Partnership Two Three Partners',\n text: 'Partnership (2-3 partners)',\n },\n {\n value: 'Limited Liability Partnership',\n text: 'Limited Liability Partnership',\n },\n { value: 'PLC', text: 'PLC' },\n ]}\n errorMessage=\"Please select your business type.\"\n />\n <FormField\n labelText=\"Fleet size\"\n id=\"contact_fleet_size\"\n onChange={(event) => setState({ ...state, fleetSize: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.contact_fleet_size}\n value={state.fleetSize}\n variant=\"select\"\n options={[\n { value: '', text: 'Fleet size' },\n { value: '1to9', text: '1-9' },\n { value: '10to49', text: '10-49' },\n { value: '50', text: '50+' },\n ]}\n errorMessage=\"Please select your fleet size.\"\n />\n </>\n )}\n <FormField\n labelText=\"Email\"\n placeholder=\"Email\"\n id=\"contact_email\"\n type=\"text\"\n onChange={(event) => setState({ ...state, email: event.target.value })}\n ref={register({\n required: true,\n pattern:\n /^(([^<>()[\\]\\\\.,;:\\s@']+(\\.[^<>()[\\]\\\\.,;:\\s@']+)*)|('.+'))@(([[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n })}\n hasError={!!errors.contact_email}\n value={state.email}\n errorMessage=\"Please enter a valid email address.\"\n />\n <FormField\n labelText=\"Telephone\"\n placeholder=\"Telephone\"\n id=\"contact_telephone\"\n type=\"text\"\n onChange={(event) => setState({ ...state, telephone: event.target.value })}\n ref={register({\n required: true,\n validate: (value) => isValidNumber(value, 'GB'),\n })}\n hasError={!!errors.contact_telephone}\n value={state.telephone}\n errorMessage=\"Please enter a valid telephone number.\"\n />\n {isPersonal && (\n <FormField\n labelText=\"Preferred contact time\"\n id=\"contact_time\"\n onChange={(event) => setState({ ...state, time: event.target.value })}\n ref={register({ required: false })}\n hasError={!!errors.contact_time}\n value={state.time}\n variant=\"select\"\n options={[\n { value: '', text: 'Contact time' },\n { value: 'Any', text: 'Any' },\n { value: 'Morning', text: 'Morning' },\n { value: 'Afternoon', text: 'Afternoon' },\n { value: 'After 6pm', text: 'After 6pm' },\n ]}\n errorMessage=\"Please select your preferred contact time.\"\n />\n )}\n {salesAdmin && (\n <FormField\n labelText=\"Lead type\"\n id=\"lead_type\"\n onChange={(event) => setState({ ...state, leadType: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.lead_type}\n value={state.leadType}\n variant=\"select\"\n options={[\n { value: '', text: 'Select lead type' },\n { value: 'Incoming Call', text: 'Incoming Call' },\n { value: 'Commversion Cold', text: 'Commversion Cold' },\n { value: 'Commversion Warm', text: 'Commversion Warm' },\n ]}\n errorMessage=\"Please select lead type.\"\n />\n )}\n {salesAdmin && (\n <FormField\n labelText=\"Select source\"\n id=\"contact_source\"\n onChange={(event) => setState({ ...state, source: event.target.value })}\n ref={register({ required: true })}\n hasError={!!errors.contact_source}\n value={state.source}\n variant=\"select\"\n options={[\n { value: '', text: 'Select source' },\n ...(isPersonal ? personal_sources : business_sources).map((source) => ({ value: source, text: source })),\n ]}\n errorMessage=\"Please select a source.\"\n />\n )}\n <FormField\n labelText=\"Comments\"\n id=\"contact_comments\"\n placeholder=\"Comments\"\n onChange={(event) => setState({ ...state, comments: event.target.value })}\n value={state.comments}\n />\n </div>\n <div className=\"b-form-row\">\n <div className=\"col-12\">\n <div className=\"c-modal-enquire-now__action\">\n <button className=\"b-btn b-btn-shadowless b-btn-green\" type=\"submit\" disabled={state.disabled}>\n {(() => {\n if (state.disabled) return 'Sending...';\n if (vehicleStatus === 'reserved') return 'Notify me';\n return 'Send my enquiry';\n })()}\n </button>\n </div>\n </div>\n </div>\n\n <OptOut on_dark ref={register({ required: false })} />\n </form>\n );\n};\n\nconst enquireNowPropTypes = {\n postURL: PropTypes.string.isRequired,\n channelID: PropTypes.string.isRequired,\n isPersonal: PropTypes.bool.isRequired,\n geotargetly: PropTypes.string,\n pricing: PropTypes.string,\n personal_sources: PropTypes.arrayOf(PropTypes.string),\n business_sources: PropTypes.arrayOf(PropTypes.string),\n featured_deal: PropTypes.string,\n offer_id: PropTypes.string,\n derivative_id: PropTypes.string,\n initial_payment_months: PropTypes.string,\n term: PropTypes.number,\n mileage: PropTypes.number,\n salesAdmin: PropTypes.bool,\n vehicleId: PropTypes.string,\n vehicleStatus: PropTypes.string,\n};\n\nEnquireNow.propTypes = enquireNowPropTypes;\n\nexport default function EnquireNowWrapper({\n postURL,\n channelID,\n isPersonal,\n geotargetly,\n pricing,\n personal_sources,\n business_sources,\n featured_deal,\n offer_id,\n derivative_id,\n initial_payment_months,\n term,\n mileage,\n salesAdmin,\n vehicleId,\n vehicleStatus,\n}) {\n return (\n <Provider store={store}>\n <EnquireNow\n postURL={postURL}\n channelID={channelID}\n isPersonal={isPersonal}\n geotargetly={geotargetly}\n pricing={pricing}\n personal_sources={personal_sources}\n business_sources={business_sources}\n featured_deal={featured_deal}\n offer_id={offer_id}\n derivative_id={derivative_id}\n initial_payment_months={initial_payment_months}\n term={term}\n mileage={mileage}\n salesAdmin={salesAdmin}\n vehicleId={vehicleId}\n vehicleStatus={vehicleStatus}\n />\n </Provider>\n );\n}\n\nEnquireNowWrapper.propTypes = enquireNowPropTypes;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport VanBodytypeFilter from './VanBodytypeFilter';\nimport CategoryFilters from './CategoryFilters';\nimport SpecialOffersFilters from './SpecialOffersFilters';\nimport FilterControls from './FilterControls';\nimport MobileFilterControls from './MobileFilterControls';\nimport ElasticSearchWrapper from './ElasticSearch';\nimport { useWindowSize } from '../../hooks';\n\nconst FiltersWrapper = ({\n actionName,\n isVans,\n showPromotion,\n controllerName,\n path,\n isPersonal,\n categoryType,\n labelMapping,\n isAdmin,\n}) => {\n const [width] = useWindowSize();\n const specialOffersFiltersPortal = (\n <SpecialOffersFilters\n isPersonal={isPersonal}\n labelMapping={labelMapping}\n path={path}\n isDesktop={false}\n action={actionName}\n isVans={isVans}\n controller={controllerName}\n />\n );\n\n const categoryFiltersPortal = (\n <CategoryFilters\n path={path}\n isPersonal={isPersonal}\n isDesktop={false}\n categoryType={categoryType}\n isVans={isVans}\n controller={controllerName}\n />\n );\n const specialOffersPortalElement = document.getElementById('special-offers-filters-portal');\n const categoryPortalElement = document.getElementById('category-filters-portal');\n const vehiclesPortalElement = document.getElementById('vehicles-filters-portal');\n\n return (\n <ElasticSearchWrapper path={path} isPersonal={isPersonal} labelMapping={labelMapping}>\n <>\n {width <= 1200 &&\n isVans &&\n controllerName === 'specials' &&\n actionName !== 'vans_electric' &&\n actionName !== 'short_term' && <VanBodytypeFilter path={path} isDesktop={false} />}\n <div className=\"drv-filter-triggers\">\n <div className=\"drv-filter-triggers__trigger drv-filter-triggers__trigger--filter\">\n <button href=\"#\" data-drawer=\".g-drawer--filter\">\n Filters\n </button>\n </div>\n <div className=\"drv-filter-triggers__trigger drv-filter-triggers__trigger--sort\">\n <button href=\"#\" data-drawer=\".g-drawer--sort\">\n Sort by\n </button>\n </div>\n </div>\n <MobileFilterControls\n labelMapping={labelMapping}\n isAdmin={isAdmin}\n controller={controllerName}\n action={actionName}\n path={path}\n showPromotion={showPromotion}\n className=\"\"\n />\n {actionName !== 'vans_electric' && (\n <>\n {width > 1200 && isVans && controllerName === 'specials' && actionName !== 'short_term' && (\n <VanBodytypeFilter path={path} isDesktop />\n )}\n {controllerName === 'categories' && (\n <div className=\"drv-filter-desktop\">\n <CategoryFilters\n path={path}\n isPersonal={isPersonal}\n isDesktop\n categoryType={categoryType}\n isVans={isVans}\n controller={controllerName}\n />\n </div>\n )}\n {['specials', 'vehicles'].includes(controllerName) && (\n <div className=\"drv-filter-desktop\">\n <SpecialOffersFilters\n isPersonal={isPersonal}\n labelMapping={labelMapping}\n path={path}\n isDesktop\n action={actionName}\n isVans={isVans}\n showPromotion={showPromotion}\n controller={controllerName}\n />\n </div>\n )}\n </>\n )}\n <div className=\"filter-controls\">\n <FilterControls\n labelMapping={labelMapping}\n isAdmin={isAdmin}\n path={path}\n controller={controllerName}\n action={actionName}\n showPromotion={showPromotion}\n isOnlySortVisible={actionName === 'vans_electric'}\n fundersVisible={actionName === 'all'}\n />\n </div>\n {specialOffersPortalElement\n ? ReactDOM.createPortal(specialOffersFiltersPortal, specialOffersPortalElement)\n : null}\n {categoryPortalElement ? ReactDOM.createPortal(categoryFiltersPortal, categoryPortalElement) : null}\n {vehiclesPortalElement ? ReactDOM.createPortal(specialOffersFiltersPortal, vehiclesPortalElement) : null}\n </>\n </ElasticSearchWrapper>\n );\n};\n\nFiltersWrapper.propTypes = {\n actionName: PropTypes.string.isRequired,\n isVans: PropTypes.bool.isRequired,\n showPromotion: PropTypes.bool.isRequired,\n controllerName: PropTypes.string.isRequired,\n path: PropTypes.string.isRequired,\n isPersonal: PropTypes.bool.isRequired,\n categoryType: PropTypes.oneOfType([PropTypes.string, PropTypes.oneOf([null])]),\n labelMapping: PropTypes.shape({}).isRequired,\n isAdmin: PropTypes.bool.isRequired,\n};\n\nFiltersWrapper.defaultProps = {\n categoryType: null,\n};\n\nexport default FiltersWrapper;\n","import React from 'react';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport classnames from 'classnames';\nimport store from '../../store/store';\nimport Button from '../ui/Button';\n\nconst MobileFilterActions = () => {\n const dispatch = useDispatch();\n const { totalCounts, theme, isVans, controller } = useSelector((state) => state.filterControls);\n\n const clearAll = (event) => {\n const form = event.target.closest('form');\n\n dispatch({ type: 'RESET_FILTERS' });\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n const submitForm = (event) => {\n event.preventDefault();\n const form = document.querySelector(`#${controller}-filters`);\n\n setTimeout(() => {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <span\n className={classnames('drv-link', 'drv-mb-4', {\n 'drv-link--gold': !theme,\n [`drv-link--${theme}`]: theme,\n })}\n data-action=\"ga#push\"\n data-ga-filter-name=\"Clear all\"\n onClick={clearAll}\n >\n Clear all\n <svg\n fill={theme === 'electric' ? '#00a3e0' : '#ac8c30'}\n height=\"20\"\n viewBox=\"228.61 210.78 10.21 12.02\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m233.71817501636602,222.80117904990522 c-2.8198594488203526,0 -5.10526180267334,-2.39004047670465 -5.10526180267334,-5.343179495041285 s2.2854023538529873,-5.343179495041285 5.10526180267334,-5.343179495041285 l0,-1.3352021604064999 l2.9201778432428833,1.8040021347066384 l-2.9201778432428833,1.6168557087302022 l0,-1.2514356213533258 c-2.377137526869774,0 -4.311553131788969,2.022983649566763 -4.311553131788969,4.50895943336427 c0,2.4859757837975067 1.9344156049191952,4.50895943336427 4.311553131788969,4.50895943336427 s4.311553131788969,-2.0062992483332227 4.311553131788969,-4.50895943336427 l0.7937086708843714,0 c0,2.9614812189534057 -2.2854023538529873,5.343179495041285 -5.10526180267334,5.343179495041285 z\" />\n </svg>\n </span>\n <Button\n variant={theme || 'primary'}\n data-action=\"click->ga-filters#push\"\n data-ga-filters-event-action=\"applied_filters_mobile\"\n data-drawer-action=\"close\"\n onClick={(e) => submitForm(e)}\n >\n View {totalCounts.count} {isVans ? 'vans' : 'cars'}\n </Button>\n </>\n );\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\nexport default function MobileFilterActionsWrapper(props) {\n return (\n <Provider store={store}>\n <MobileFilterActions {...props} />\n </Provider>\n );\n}\n/* eslint-enable */\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport ModelFiltersWrapper from './ModelFiltersContext';\nimport DesktopModelFilters from './DesktopModelFilters';\nimport ModelPills from './ModelPills';\nimport MobileModelFilters from './MobileModelFilters';\n\nconst ModelFilters = ({ path, controllerName, isVans }) => {\n const mobileFiltersPortal = <MobileModelFilters />;\n const mobileFiltersElement = document.getElementById('mobile-model-filters-portal');\n\n return (\n <ModelFiltersWrapper path={path} controller={controllerName} isVans={isVans}>\n <DesktopModelFilters />\n <ModelPills />\n {mobileFiltersElement ? ReactDOM.createPortal(mobileFiltersPortal, mobileFiltersElement) : null}\n </ModelFiltersWrapper>\n );\n};\n\nModelFilters.propTypes = {\n path: PropTypes.string.isRequired,\n controllerName: PropTypes.string.isRequired,\n isVans: PropTypes.bool.isRequired,\n};\n\nexport default ModelFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst OptionList = ({ children }) => {\n return <ul className=\"g-drawer__list\">{children}</ul>;\n};\n\nOptionList.propTypes = {\n children: PropTypes.node.isRequired,\n};\n\nOptionList.Item = ({\n id,\n name,\n value,\n label,\n checked,\n onChange,\n disabled,\n type,\n gaEventAction,\n gaFilterName,\n gaFilterOption,\n}) => {\n return (\n <li className=\"g-drawer__item\">\n <div className={type === 'radio' ? 'custom-radio' : 'custom-checkbox'}>\n <input\n className=\"custom-control-input\"\n type={type}\n id={id}\n name={name}\n defaultChecked={checked}\n value={value}\n onChange={onChange}\n disabled={disabled}\n data-action=\"ga-filters#push\"\n data-ga-filters-event-action={gaEventAction}\n data-ga-filters-filter-name={gaFilterName}\n data-ga-filters-filter-option={gaFilterOption}\n />\n\n <label className=\"custom-control-label\" htmlFor={id}>\n {label}\n </label>\n </div>\n </li>\n );\n};\n\nOptionList.Item.propTypes = {\n id: PropTypes.string.isRequired,\n name: PropTypes.string,\n value: PropTypes.string.isRequired,\n checked: PropTypes.bool,\n label: PropTypes.oneOf([PropTypes.string, PropTypes.node]).isRequired,\n onChange: PropTypes.func,\n disabled: PropTypes.bool,\n type: PropTypes.oneOf(['checkbox', 'radio']),\n gaEventAction: PropTypes.string,\n gaFilterName: PropTypes.string,\n gaFilterOption: PropTypes.string,\n};\n\nOptionList.Item.defaultProps = {\n name: '',\n type: 'radio',\n checked: false,\n onChange: () => {},\n disabled: false,\n gaEventAction: '',\n gaFilterName: '',\n gaFilterOption: '',\n};\n\nexport default OptionList;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Provider, useDispatch, useSelector } from 'react-redux';\nimport { getQueryStringParameters } from '../../utils';\nimport store from '../../store/store';\nimport { filterOptions } from './utils';\n\n// Component Imports\nimport SortOption from '../ui/SortOption';\n\nconst SortByFilters = ({ controller, action }) => {\n const options = filterOptions(controller, action);\n\n const { sort_by } = useSelector((state) => state.filterControls);\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch({\n type: 'SET_SORT_BY',\n payload: getQueryStringParameters().sort_by || options.filter((option) => option.default)[0].value,\n });\n }, []);\n\n const handleClick = (event) => {\n event.persist();\n dispatch({\n type: 'SET_SORT_BY',\n payload: options.find((field) => field.value === event.target.value).value,\n });\n setTimeout(() => {\n event.target.closest('form').dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n }, 1);\n\n // close sort drawer\n event.target.closest('.g-drawer').classList.remove('drawer-open');\n document.querySelector('body').classList.remove('has-drawer');\n document.querySelector('.drawer-overlay').style.display = 'none';\n };\n\n return (\n <div className=\"drv-sort\">\n {options &&\n options.map((field) => {\n return (\n <SortOption\n key={field.value}\n type=\"radio\"\n value={field.value}\n name=\"sort_by\"\n label={field.name}\n enabled\n selected={sort_by === field.value}\n onSelect={(event) => {\n handleClick(event);\n }}\n id={`${field.name}-mobile`}\n />\n );\n })}\n </div>\n );\n};\n\nSortByFilters.propTypes = {\n controller: PropTypes.string,\n action: PropTypes.string,\n};\n\nSortByFilters.defaultProps = {\n controller: '',\n action: '',\n};\n\n/* eslint-disable react/jsx-props-no-spreading */\nexport default function SortByFiltersWrapper(props) {\n return (\n <Provider store={store}>\n <SortByFilters {...props} />\n </Provider>\n );\n}\n/* eslint-enable */\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst EstimatedDelivery = ({ name, options = [], elasticSearchProps }) => {\n const count = elasticSearchProps.selectedFilters[name] ? elasticSearchProps.selectedFilters[name] : 'Anytime';\n\n return (\n <FilterDrawerItem\n title=\"Estimated delivery\"\n allText=\"Anytime\"\n count={count}\n name={name}\n options={options}\n elasticSearchProps={elasticSearchProps}\n />\n );\n};\n\nEstimatedDelivery.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nEstimatedDelivery.defaultProps = {\n options: [],\n};\n\nexport default EstimatedDelivery;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport FilterDrawerItem from '../../ui/FilterDrawerItem';\nimport { elasticSearchFilterOptionPropTypes, elasticSearchPropsPropTypes } from '../../../propTypes/elasticSearch';\n\nconst InStock = ({ name, options, elasticSearchProps }) => {\n const getLabel = (value) => (value === 'true' ? 'Yes' : 'No');\n\n const count = elasticSearchProps.selectedFilters[name]\n ? getLabel(elasticSearchProps.selectedFilters[name])\n : undefined;\n\n options = options.map((option) => ({ ...option, label: getLabel(option.value) }));\n\n return (\n <FilterDrawerItem\n title=\"In stock?\"\n name={name}\n count={count}\n options={options}\n elasticSearchProps={elasticSearchProps}\n />\n );\n};\n\nInStock.propTypes = {\n name: PropTypes.string.isRequired,\n options: PropTypes.arrayOf(elasticSearchFilterOptionPropTypes),\n elasticSearchProps: elasticSearchPropsPropTypes.isRequired,\n};\n\nInStock.defaultProps = {\n options: [],\n};\n\nexport default InStock;\n"],"sourceRoot":""}