{"version":3,"sources":["components/ListPricingTiers/ListPricingTiers.tsx","components/Admin/App.provider.tsx","modules/volusion-client/volusion-client.ts","modules/volusion-actions/volusion-actions.ts","components/CategoryPricingTierDisplay/CategoryPricingTierDisplay.tsx","components/Modal.tsx","components/CategoryPricingTierDisplay/CategoryPricingTierDisplay.module.css","serviceWorker.ts","modules/cart-controller/cart-controller.ts","pages/routes.tsx","components/Modal.module.css","components/Admin/App.context.tsx","components/ListPricingTiers/ListPricingTiers.module.css"],"names":["ListPricingTiers","props","_this","Object","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","call","render","_this$state","state","data","currentPage","headerRow","pCodeIndex","findIndex","x","toString","toLowerCase","react_default","a","createElement","className","s","ListPricingTiersContainer","Input","placeholder","SearchBar","onChange","handleSearchInput","length","Fragment","Table","celled","ListTable","Header","Row","map","l","HeaderCell","key","Body","i","onClick","handleRowClicked","oo","Cell","Footer","colSpan","Menu","floated","pagination","Item","as","icon","changePage","Math","max","Icon","name","Segment","_ref","asyncToGenerator","regenerator_default","mark","_callee","page","_this$props","quantityDiscountsClient","itemsPerPage","searchValue","wrap","_context","prev","next","load","sent","abrupt","setState","array","stop","_x","apply","arguments","_ref2","_callee2","e","value","_this$props2","isDataLoaded","_context2","target","_x2","productCode","volusionClient","getPricingTiers","pricingTierData","contextOverrides","selectedProduct","ProductCode","ProductID","ProductName","ProductPrice","pricingTiers","pTierQuantity","OptionsDesc","split","quantity","parseFloat","price","Price","filter","notEmpty","history","push","console","error","_context4","t0","currentData","toConsumableArray","shift","productCodeIndex","totalDataInThisQuery","pCode","indexOf","slice","concat","totalPages","floor","c","m","last","left","right","range","rangeWithDots","_i","_range","Component","undefined","contextType","AppContext","defaultProps","withRouter","App_context","Consumer","assign","VolusionClient","options","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_3__","basePath","searchProductsApi","searchCustomersApi","putPricingTiersApi","getProductPricingTiersApi","getPricingTiersApi","isProductInWishlistApi","getPricingTiersCountApi","isLoggedInAPI","storeURL","searchCustomers","bind","searchProducts","xmlToJson","extractData","addFieldToObject","fetch","method","cache","credentials","headers","Content-Type","body","then","res","json","IsLoggedIn","customerID","encodeURIComponent","Date","now","text","DOMParser","parseFromString","xml","Error","getElementsByTagName","htmlCollection","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__","_this2","pageSize","product_code","_this3","_this4","callback","filtered","keys","foundProductCode","total","dataStream","Stream","reduce","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default","_callee6","previousPromise","currentProduct","tiers","percent2","_context6","forEach","j","productcode","emit","_this5","_x6","_x7","Promise","resolve","search","_this6","warn","_this7","xmlElement","_this8","childNodes","node","nodeName","nodeValue","textContent","elements","Array","isArray","oldVal","VolusionActions","baseUrl","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_2__","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__","window","location","index","r","orderDetails","document","addToCartURL","getUrl","_getCart","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","d","updateCartTotal","updateProductCartCountTotals","cartTotal","Totals","CartTotal","elesToChange","querySelectorAll","ele","innerHTML","Products","getAttribute","foundItemInCart","find","toUpperCase","cartQuantity","parseInt","Quantity","String","eleParent","parentElement","style","color","_postToCart","_callee3","payload","response","_context3","getCart","products","url","item","option","optionCategoryDisplayType","optionCategoryID","optionID","_addToEmailWhenBackInStockList","_callee4","emailAddress","_x3","_x4","_getLoggedInStatus","_callee5","_context5","_getCustomerEmail","buttonClasses","BasketButton","join","getSmallestTierQuantity","initialCartData","foundProduct","initialQuantity","smallestTierQuantity","Number","MAX_SAFE_INTEGER","tierQuantity","trim","CategoryPricingTierDisplay","setShowModal","titleHTML","availabilityHTML","isInStock","customerEmail","volusionActions","_useState","useState","_useState2","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__","setQuantity","handleAddToCart","previousItemInCart","cartData","additionalQuantityAlreadyInCart","combinedQuantity","highestPricingTier","addToCartData","ID","OptionCatID","removeFromCart","ProductIndex","t1","postToCart","DisplayCartPopupBegin","_x5","react__WEBPACK_IMPORTED_MODULE_3___default","PricingTierOuterContainer","ProductTitle","dangerouslySetInnerHTML","__html","PricingTierContainer","TableContainer","AvailabilityContainer","Availability","Qty","QtyTitle","type","min","QtyValue","defaultValue","quantityStr","handleQuantityChange","InitialQuantity","data-v-observable","data-product-code","addToEmailWhenBackInStockList","MeTextInButton","_Modal__WEBPACK_IMPORTED_MODULE_5__","setIsShowingExternal","onClose","Modal","_Users_drogon_work_sparks_wholesale_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","isShowing","setIsShowing","react__WEBPACK_IMPORTED_MODULE_1___default","ModalContent","ModalBody","Close","module","exports","Hidden","Boolean","hostname","match","CartController","quantityDiscountOptionCategoryID","process","href","getCartData","optionSelectLinks","setAttribute","Options","checkoutButton","querySelector","visibility","cartDataWithPricingTiersPromises","productPriceTokens","productPrice","unitPrice","SalePrice","objectSpread","UnitPrice","all","cartDataWithPricingTierResponses","cartDataWithPricingTiers","productsToUpdate","productToUpdate","minimumQuantityToAddToOrder","quantityThatNeedsToBeInCart","StockStatus","MAX_VALUE","productValueAtThisTier","toFixed","cartPrice","isNaN","removeIndex","addToCart","sort","b","addTheseToCart","navigateToCart","cartController","__webpack_require__","hideCorrectOptionsOnCartPage","classList","contains","updatePricing","navigator","serviceWorker","ready","registration","unregister","animatetop","ModalHeader","ModalFooter","__webpack_exports__","react__WEBPACK_IMPORTED_MODULE_0__","n","React","createContext"],"mappings":"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","file":"static/js/main.78c3191c.chunk.js","sourcesContent":["\nimport React, { Component } from 'react'; // let's also import Component\nimport s from './ListPricingTiers.module.css';\nimport { AppContext, AppContextProps } from '../Admin/App.context';\nimport { Table, Menu, Icon, Input, Segment } from 'semantic-ui-react';\nimport { withRouter, RouteComponentProps } from 'react-router';\nimport { GetPricingTiersResponse } from '../../modules/volusion-client/interfaces';\nimport { ContextOverrides } from '../AddPricingTiers/AddPricingTiers';\nimport { withAppContext } from '../Admin/App.provider';\n// import { SingleProductPricingTier } from '../AddPricingTiers/AddPricingTiers.context';\ntype ListPricingTiersState = {\n data: (string | number)[][],\n currentPage: number,\n searchValue: string;\n}\n\ntype ListPricingTiersProps = {\n itemsPerPage: number,\n} & RouteComponentProps & AppContextProps\n\nclass ListPricingTiers extends Component {\n static contextType = AppContext;\n static defaultProps = {\n itemsPerPage: 20\n }\n constructor(props: ListPricingTiersProps) {\n super(props);\n this.state = {\n data : [],\n currentPage: 1,\n searchValue: '',\n }\n }\n\n async componentDidMount(){\n const { quantityDiscountsClient, itemsPerPage } = this.props;\n const { currentPage } = this.state;\n const isDataLoaded = await quantityDiscountsClient.load(currentPage, itemsPerPage);\n if(!isDataLoaded){\n return;\n }\n this.setState({\n data: quantityDiscountsClient.array\n });\n }\n\n render = () => {\n const { data, currentPage } = this.state;\n const headerRow = data[0];\n const pCodeIndex = headerRow && headerRow.findIndex(x => x.toString().toLowerCase() === 'productcode');\n return (\n
\n \n {\n data.length > 0 \n ? (\n \n \n \n \n { data[0] && data[0].map( (x,l) => {x} ) }\n \n \n \n {\n data.map( (x,i) => {\n if(i === 0){\n return null;\n }\n return (\n \n this.handleRowClicked(x[pCodeIndex].toString())}\n key={'row-'+ i}\n > \n { x.map( (l,oo) => {l} ) }\n \n )}\n )\n }\n \n \n \n \n \n this.changePage(Math.max(1,currentPage-1))}>\n \n \n this.changePage(currentPage+1) }>\n \n \n \n \n \n \n
\n
\n )\n : No Results\n }\n
\n )\n }\n\n changePage = async (page: number) => {\n const { quantityDiscountsClient, itemsPerPage } = this.props;\n const { searchValue } = this.state;\n const isDataLoaded = await quantityDiscountsClient.load(page, itemsPerPage, searchValue);\n if(!isDataLoaded){\n return;\n }\n this.setState({\n data: quantityDiscountsClient.array,\n currentPage: page,\n });\n }\n handleSearchInput = async (e: { target: { value: any; }; }) => {\n const value = e.target.value;\n const { quantityDiscountsClient, itemsPerPage } = this.props;\n const isDataLoaded = await quantityDiscountsClient.load(1, itemsPerPage, value);\n this.setState({\n data: isDataLoaded ? quantityDiscountsClient.array : [],\n searchValue: value,\n currentPage: 1,\n });\n }\n\n private async handleRowClicked(productCode:string) {\n const { volusionClient } = this.props;\n let pricingTierData: GetPricingTiersResponse[];\n try {\n pricingTierData = await volusionClient.getPricingTiers(productCode);\n const contextOverrides: ContextOverrides = {\n selectedProduct: {\n ProductCode: productCode,\n ProductID: '000',\n ProductName: pricingTierData[0].ProductName,\n ProductPrice: pricingTierData[0].ProductPrice,\n },\n pricingTiers: pricingTierData.map(x => {\n const pTierQuantity = x.OptionsDesc.split('---')[1];\n if (!pTierQuantity) {\n return undefined;\n }\n return {\n quantity: parseFloat(pTierQuantity),\n price: parseFloat(x.Price)\n };\n }).filter(notEmpty),\n }\n this.props.history.push('/edit/' + productCode, {\n contextOverrides\n });\n } catch(e) {\n console.error(e);\n }\n }\n\n private setUpPagination(data: (string | number)[][], headerRow: (string | number)[], searchValue: string, currentPage: number, itemsPerPage: number) {\n let currentData = [...data];\n currentData.shift();\n const productCodeIndex = headerRow.findIndex(x => typeof x === 'string' && x.toLowerCase() === 'productcode');\n currentData = currentData.filter(x => {\n if (!searchValue) {\n return true;\n }\n const pCode = x[productCodeIndex];\n if (typeof pCode !== 'string') {\n return false;\n }\n return pCode.toLowerCase().indexOf(searchValue.toLowerCase()) >= 0;\n });\n const totalDataInThisQuery = currentData.length;\n currentData = currentData.slice(currentPage * itemsPerPage, (currentPage + 1) * itemsPerPage);\n currentData = [headerRow].concat(currentData);\n const totalPages = Math.floor((totalDataInThisQuery) / itemsPerPage);\n const page = pagination(currentPage, totalPages);\n return { currentData, page, totalPages };\n }\n}\n\nfunction pagination(c:number, m:number) {\n var current = c,\n last = m,\n delta = 2,\n left = current - delta,\n right = current + delta + 1,\n range = [],\n rangeWithDots = [],\n l;\n\n for (let i = 1; i <= last; i++) {\n if (i === 1 || i === last || (i >= left && i < right)) {\n range.push(i);\n }\n }\n\n for (let i of range) {\n if (l) {\n if (i - l === 2) {\n rangeWithDots.push(l + 1);\n } else if (i - l !== 1) {\n rangeWithDots.push('...');\n }\n }\n rangeWithDots.push(i);\n l = i;\n }\n\n return rangeWithDots;\n}\n\nexport function notEmpty(value: TValue | null | undefined): value is TValue {\n return value !== null && value !== undefined;\n}\n\nexport default withRouter(withAppContext(ListPricingTiers));","\nimport React, { ComponentType } from 'react';\nimport { AppContext } from './App.context';\n\nexport function withAppContext(Component: ComponentType){\n return (props: T) => (\n \n {({ \n volusionClient,\n quantityDiscountsClient,\n }) => \n \n }\n \n )\n};","import { VolusionClientOptions, GetCustomerResponse, GetProductResponse, GetPricingTiersResponse, IsProductInWishListResponse, GetPricingTiersCountResponse } from './interfaces';\nimport { Row } from 'neat-csv';\nimport { Stream } from 'stream';\n\nexport default class VolusionClient {\n private basePath: string;\n private searchProductsApi: string;\n private searchCustomersApi: string;\n private putPricingTiersApi: string;\n private getProductPricingTiersApi: string;\n private getPricingTiersApi: string;\n private isProductInWishlistApi: string;\n private getPricingTiersCountApi: string;\n private isLoggedInAPI: string;\n\n constructor(options?: VolusionClientOptions) {\n this.basePath = ((options && options.storeURL) || '') + ((options && options.basePath) || '/v/endpoints/');\n this.searchProductsApi = (options && options.searchProductsApi) || 'search-products.asp';\n this.searchCustomersApi = (options && options.searchCustomersApi) || 'search-customer.asp'\n this.putPricingTiersApi = (options && options.putPricingTiersApi) || 'put-pricing-tiers.asp'\n this.getProductPricingTiersApi = (options && options.getProductPricingTiersApi) || 'get-product-pricing-tiers.asp'\n this.getPricingTiersApi = (options && options.getPricingTiersApi) || 'get-pricing-tiers.asp'\n this.getPricingTiersCountApi = (options && options.getPricingTiersCountApi) || 'get-pricing-tiers-count.asp'\n this.isProductInWishlistApi = (options && options.isProductInWishlistApi) || 'is-product-in-wishlist.asp'\n this.isLoggedInAPI = (options && options.isLoggedInAPI) || '/ajax_receiver.asp?system=isloggedin';\n\n this.searchCustomers = this.searchCustomers.bind(this);\n this.searchProducts = this.searchProducts.bind(this);\n this.xmlToJson = this.xmlToJson.bind(this);\n this.extractData = this.extractData.bind(this);\n this.addFieldToObject = this.addFieldToObject.bind(this);\n }\n\n\n async getLoggedInStatus() {\n return fetch(`${this.isLoggedInAPI}`, {\n method: 'POST',\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/json',\n },\n body: null,\n })\n .then(res => res.json())\n .then(data => {\n return data.IsLoggedIn;\n });\n }\n\n async isProductInWishlist(productCode: string, customerID: string | number): Promise {\n return await fetch(\n `${this.basePath}${\n this.isProductInWishlistApi\n }?product_code=${encodeURIComponent(\n productCode,\n )}&customer_id=${encodeURIComponent(customerID)}&_=${Date.now()}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('WishLists'));\n })\n .then(\n htmlCollection => [...htmlCollection] as IsProductInWishListResponse[],\n );\n }\n\n async getPricingTierCount(): Promise {\n return await fetch(\n `${this.basePath}${this.getPricingTiersCountApi}?_=${Date.now()}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('Options'));\n })\n .then(htmlCollection => [...htmlCollection] as GetPricingTiersCountResponse[] )\n }\n\n async getAllPricingTiers(page=1, pageSize=20, product_code: string=''): Promise {\n return await fetch(\n `${this.basePath}${this.getPricingTiersApi}?_=${Date.now()}&page=${page}&page_size=${pageSize}&product_code=${product_code}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('Options'));\n })\n .then(htmlCollection => [...htmlCollection] as GetPricingTiersResponse[] )\n }\n\n async getPricingTiers(productCode: string): Promise {\n return await fetch(\n `${this.basePath}${this.getProductPricingTiersApi}?product_code=${productCode}&_=${Date.now()}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('Options'));\n })\n .then(htmlCollection => [...htmlCollection] as GetPricingTiersResponse[] )\n }\n\n async addPricingTiersToProducts(pricingTiers: Row[], callback: (a: unknown, b: Stream) => unknown){\n const filtered = pricingTiers\n .filter( x => {\n const keys = Object.keys(x);\n const foundProductCode = keys.indexOf('productcode') >= 0;\n const hasPricingTierOrMinimumQuantity = keys.length >= 2;\n return hasPricingTierOrMinimumQuantity && foundProductCode;\n });\n\n let i = 0;\n let total = filtered.length;\n const dataStream = new Stream();\n callback(null, dataStream);\n \n await filtered.reduce( async (previousPromise, currentProduct) => {\n let tiers = '';\n Object.keys(currentProduct)\n .filter(quantity => quantity !== 'productcode' && currentProduct[quantity])\n .forEach((quantity,j) => {\n tiers += `\n \n ${quantity}\n ${currentProduct[quantity]}\n \n `;\n });\n let xml = `\n \n ${currentProduct.productcode}\n ${tiers}\n `;\n try {\n await previousPromise;\n } catch (e){\n console.error(e);\n }\n const percent2 = ((i/total) * 100);\n i+=1;\n dataStream.emit('data', percent2);\n return fetch(`${this.basePath}${this.putPricingTiersApi}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'text/xml',\n },\n body: xml,\n })\n .then(res => res.text())\n }, Promise.resolve(''));\n dataStream.emit('end', 100);\n }\n \n async searchCustomers(search: string): Promise{\n\n return await fetch(\n `${this.basePath}${this.searchCustomersApi}?search=${search}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('Customers'));\n })\n .then(htmlCollection => [...htmlCollection] as GetCustomerResponse[] )\n };\n \n\n async searchProducts(search: string): Promise{\n if (!search) {\n console.warn('Missing required parameter: search');\n throw new Error('Missing required parameter: search');\n }\n\n return await fetch(\n `${this.basePath}${this.searchProductsApi}?search=${search}`,\n )\n .then(res => res.text())\n .then(text => {\n const domParser = new DOMParser();\n return domParser.parseFromString(text, 'text/xml');\n })\n .then(xml => {\n if (!xml) {\n throw new Error('Unable to parse text as xml');\n }\n return this.extractData(xml.getElementsByTagName('Products'));\n })\n .then(htmlCollection => [...htmlCollection] as GetProductResponse[])\n };\n\n xmlToJson(xmlElement: Element | ChildNode) {\n let data = {};\n xmlElement &&\n xmlElement.childNodes &&\n [...xmlElement.childNodes].forEach(node => {\n if (node.nodeName && !node.nodeValue) {\n if (node.childNodes.length > 1) {\n this.addFieldToObject(data, node, this.xmlToJson(node));\n } else {\n this.addFieldToObject(data, node, node.textContent);\n }\n }\n });\n return data;\n }\n /**\n * Converts array of xml tags to htmlCollection\n * @param {Array} elements all tags and info from the returned xml\n * @returns {Object} htmlCollection from returned xml\n */\n extractData(elements:HTMLCollectionOf) {\n let extractedData = (elements && [...elements].map(this.xmlToJson)) || [];\n return extractedData;\n }\n \n addFieldToObject(data: any, node: ChildNode, value: any) {\n if (!data[node.nodeName]) {\n data[node.nodeName] = value;\n } else if (Array.isArray(data[node.nodeName])) {\n data[node.nodeName].push(value);\n } else {\n const oldVal = data[node.nodeName];\n data[node.nodeName] = [oldVal, value];\n }\n }\n}\n\n\n\n// function chunk(array: T[], size: number) {\n// const chunked_arr = [];\n// for (let i = 0; i < array.length; i++) {\n// const last = chunked_arr[chunked_arr.length - 1];\n// if (!last || last.length === size) {\n// chunked_arr.push([array[i]]);\n// } else {\n// last.push(array[i]);\n// }\n// }\n// return chunked_arr;\n// }\n","import { GetCartResponse } from '../volusion-client/interfaces';\n\nexport class VolusionActions {\n private baseUrl: string;\n constructor(baseUrl: string){\n this.baseUrl = baseUrl;\n }\n\n navigateToCart(){\n window.location.assign(\n `${this.baseUrl}/shoppingcart.asp`\n )\n }\n\n removeFromCart(index: string | number){\n // returns promise\n return fetch(`${this.baseUrl}/shoppingcart.asp?remove=${index}`, {\n method: 'GET',\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n body: undefined,\n }).then(r => r.text());\n }\n\n /**\n * Calls getUrl() and postToCart(). Directs whether the cart is added to synchronously\n * or asynchronously. Redirects to card if sync - returns promise if async\n * @param {Object} [orderDetails=[]] Elements with keys for productCode and quantity\n * @param {Boolean} [sync=true] True is sync GET | False is async POST fetch\n */\n\n addToCart(orderDetails:CartDetail[]) {\n return document.location.assign(\n this.addToCartURL(orderDetails),\n );\n }\n addToCartURL(orderDetails: CartDetail[]): string {\n return `${this.baseUrl}/shoppingcart.asp?${this.getUrl(orderDetails)}`;\n }\n\n async getCart(): Promise {\n return fetch(`/ajaxcart.asp?_=${Date.now()}`, {\n method: 'GET',\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/json',\n },\n body: null,\n })\n .then(res => res.json())\n .then(d => d as GetCartResponse)\n .then(d => {\n this.updateCartTotal(d);\n this.updateProductCartCountTotals(d);\n return d;\n });\n }\n\n private updateCartTotal(d: GetCartResponse) {\n const cartTotal = d.Totals && d.Totals[0] && d.Totals[0].CartTotal;\n const elesToChange = document.querySelectorAll('[data-v-observable=\"cart-total\"]');\n if (elesToChange && elesToChange.length) {\n elesToChange.forEach(ele => {\n (ele as HTMLElement).innerHTML = cartTotal;\n });\n }\n }\n\n private updateProductCartCountTotals(d: GetCartResponse) {\n const elesToChange = document.querySelectorAll('[data-v-observable=\"product-count\"]');\n if(!(elesToChange && elesToChange.length && d.Products.length)){\n return;\n }\n elesToChange.forEach( ele => {\n const productCode = ele.getAttribute('data-product-code');\n if(!productCode){\n return;\n }\n const foundItemInCart = d.Products.find(x => x.ProductCode.toUpperCase() === productCode.toUpperCase());\n let cartQuantity = 0;\n if(foundItemInCart) {\n cartQuantity = parseInt(foundItemInCart.Quantity || '0') || 0;\n }\n (ele as HTMLElement).innerHTML = String(cartQuantity);\n const eleParent = (ele as HTMLElement).parentElement;\n if(eleParent){\n eleParent.style.color = cartQuantity === 0 ? 'black' : 'green';\n }\n });\n }\n\n /**\n * Calls getUrl, Submits post req for products to the cart, and Redirects to cart.\n * @param {String} [baseUrl=''] Base url for the website\n * @param {Object} [payload=[]] Elements with keys for productCode and quantity\n */\n\n async postToCart(payload:CartDetail[]) {\n // returns promise\n const response = await fetch(`${this.baseUrl}/shoppingcart.asp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n body: this.getUrl(payload),\n })\n .then( r => r.text())\n .then(async r => {\n return await this.getCart();\n });\n return response;\n }\n\n /**\n * Creates query string for url or payload\n * @param {Object} [products=[]] Elements with keys for productCode and quantity\n */\n\n getUrl(products:CartDetail[]) {\n // eslint-disable-next-line no-debugger\n debugger;\n let url = '';\n products &&\n products.forEach((item, i) => {\n if (i > 0) {\n url += '&';\n }\n\n url += `ProductCode=${item.productCode.toUpperCase()}&Qty.${item.productCode.toUpperCase()}=${encodeURIComponent(\n item.quantity,\n )}`;\n\n /**************************************\n * add in the logic here for options\n **************************************/\n if (item.options) {\n item.options.forEach(option => {\n if (option.optionCategoryDisplayType === 'DROPDOWN') {\n url += `&SELECT___${encodeURIComponent(\n item.productCode.toUpperCase(),\n )}___${encodeURIComponent(\n option.optionCategoryID,\n )}=${encodeURIComponent(option.optionID)}`.toUpperCase();\n } else if (option.optionCategoryDisplayType === 'TEXTBOX') {\n url += `&TEXTBOX___${encodeURIComponent(\n option.optionID,\n )}___${encodeURIComponent(\n item.productCode,\n )}___${encodeURIComponent(\n option.optionCategoryID,\n )}=${encodeURIComponent(\n item.productCode || '',\n )}`.toUpperCase();\n }\n });\n }\n });\n return url;\n }\n\n async addToEmailWhenBackInStockList(productCode: string, emailAddress: string){\n return fetch(`${this.baseUrl}/Email_Me_When_Back_In_Stock.asp?ProductCode=${encodeURIComponent(productCode)}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n },\n body: `EmailAddress=${ encodeURIComponent(emailAddress)}&reCapFix=true&btnSubmit=Submit`,\n }).then(r => r.text());\n }\n\n\n async getLoggedInStatus() {\n return fetch(`${this.baseUrl}/ajax_receiver.asp?system=isloggedin&_=${Date.now()}`, {\n method: 'POST',\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/json',\n },\n body: null,\n })\n .then(res => res.json())\n .then(data => {\n return data.IsLoggedIn === true;\n });\n\n }\n async getCustomerEmail(): Promise {\n return fetch(`${this.baseUrl}/api/v1/users/current`, {\n method: 'GET',\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/json',\n },\n body: null,\n })\n .then(res => res.json())\n .then(d => d as CurrentUserResponse);\n }\n\n addToWishlistURL(productCode: string) {\n return `/WishList.asp?WL_Action=add&ProductCode=${encodeURIComponent(\n productCode,\n )}`\n }\n}\n\nexport type CurrentUserResponse = {\n exceptions: never[ ],\n warnings: never[ ],\n errors: never[ ],\n data: {\n isAnonymous: null,\n firstName: string,\n id: number,\n email: string,\n storeCreditAvailable: number,\n lastName: string,\n }\n}\n\nexport type AddOption = {\n optionCategoryDisplayType: 'DROPDOWN' | 'TEXTBOX', \n optionID: string, \n optionCategoryID: string\n}\n\nexport type CartDetail = { \n productCode: string, \n quantity: string,\n options?: AddOption[],\n}","import React, { useState, Dispatch, SetStateAction } from 'react';\nimport { GetPricingTiersResponse, GetCartResponseProduct, GetCartResponse } from '../../modules/volusion-client/interfaces';\nimport { VolusionActions, CartDetail } from '../../modules/volusion-actions/volusion-actions';\n\nimport s from './CategoryPricingTierDisplay.module.css'\nimport VolusionClient from '../../modules/volusion-client/volusion-client';\nimport { Modal } from '../Modal';\nimport { QuantityDiscountData } from '../../modules/quantity-discount-product-display/quantity-discount-product-display';\n\ntype CategoryPricingTierDisplayProps = {\n titleHTML: () => string;\n availabilityHTML: () => string;\n productCode: string;\n pricingTierData: GetPricingTiersResponse[];\n isInStock: boolean;\n customerEmail: string,\n volusionActions: VolusionActions, \n volusionClient: VolusionClient,\n initialCartData: GetCartResponse,\n initialQuantity: number,\n}\n\nconst buttonClasses = [s.BasketButton, \"vCSS_input_addtocart\",\"btn btn-primary\", \"btn-lg\",\"btn_addtocart\"].join(' ');\n\nexport const getSmallestTierQuantity = (\n pricingTierData: GetPricingTiersResponse[] | QuantityDiscountData[], \n productCode: string,\n initialCartData?: GetCartResponse, \n) => {\n const foundProduct = initialCartData && initialCartData.Products.find( x => x.ProductCode.toUpperCase() === productCode.toUpperCase());\n const initialQuantity = foundProduct ? parseInt(foundProduct.Quantity) : 0;\n let smallestTierQuantity = Number.MAX_SAFE_INTEGER;\n for(let i=0; i < pricingTierData.length; i++ ){\n const currentData = pricingTierData[i];\n let tierQuantity = -1;\n if(currentData['OptionsDesc']){\n tierQuantity = parseInt((currentData as GetPricingTiersResponse).OptionsDesc.split('---')[1].trim());\n } else if (currentData['quantity'] !== undefined) {\n tierQuantity = parseInt((currentData as QuantityDiscountData).quantity);\n }\n if(tierQuantity === -1) {\n continue;\n }\n\n tierQuantity = Math.max(0, tierQuantity - initialQuantity);\n if(!currentData) {\n continue\n };\n if(tierQuantity < smallestTierQuantity ){\n smallestTierQuantity = tierQuantity;\n }\n }\n if(smallestTierQuantity === Number.MAX_SAFE_INTEGER){\n smallestTierQuantity = 0;\n }\n return smallestTierQuantity;\n}\n\n\nconst CategoryPricingTierDisplay: React.FC = ({ \n titleHTML, \n availabilityHTML, \n productCode, \n pricingTierData, \n isInStock, \n customerEmail, \n volusionActions, \n volusionClient,\n initialCartData,\n initialQuantity,\n}) => { \n\n\n const smallestTierQuantity = getSmallestTierQuantity(pricingTierData, productCode, initialCartData);\n const [quantity, setQuantity] = useState(smallestTierQuantity);\n let setShowModal: Dispatch>;\n\n let setUpExternalShowModal = (x: Dispatch>) => {\n setShowModal = x;\n }\n\n const handleAddToCart = async (\n volusionClient: VolusionClient, \n pricingTierData: GetPricingTiersResponse[], \n volusionActions: VolusionActions,\n quantity: number,\n productCode: string,\n ) => { \n let previousItemInCart: GetCartResponseProduct | undefined;\n let cartData: GetCartResponse | undefined;\n try {\n cartData = await volusionActions.getCart();\n previousItemInCart = cartData.Products.find( x => x.ProductCode.toUpperCase() === productCode.toUpperCase() ) as GetCartResponseProduct;\n } catch (e){\n console.error(e);\n }\n if(!cartData){\n return;\n }\n const smallestTierQuantity = getSmallestTierQuantity(pricingTierData, productCode, cartData)\n const additionalQuantityAlreadyInCart = previousItemInCart ? parseInt(previousItemInCart.Quantity) : 0;\n const combinedQuantity = Math.max(quantity + additionalQuantityAlreadyInCart, smallestTierQuantity, 1);\n\n let highestPricingTier = null;\n for( let i=0; i < pricingTierData.length; i++ ){\n const currentData = pricingTierData[i];\n const tierQuantity = currentData.OptionsDesc.split('---')[1].trim();\n if(!currentData) {continue};\n if(combinedQuantity >= parseInt(tierQuantity) ){\n highestPricingTier = currentData;\n }\n }\n\n const addToCartData = {\n productCode,\n quantity: String(combinedQuantity),\n } as CartDetail;\n\n if(highestPricingTier){\n addToCartData.options = [\n {\n optionCategoryDisplayType: 'DROPDOWN',\n optionID: highestPricingTier.ID,\n optionCategoryID: highestPricingTier.OptionCatID\n }\n ]\n }\n\n if(previousItemInCart){\n try {\n await volusionActions.removeFromCart(previousItemInCart.ProductIndex);\n } catch (e){\n console.error(e);\n }\n }\n\n await volusionActions.postToCart([addToCartData])\n window.DisplayCartPopupBegin && window.DisplayCartPopupBegin();\n setQuantity(Math.max(quantity, smallestTierQuantity));\n }\n\n const handleQuantityChange = (\n initialQuantity: number,\n quantityStr: string, \n initialCartData: GetCartResponse, \n pricingTierData: GetPricingTiersResponse[], \n productCode: string\n ) => {\n const quantity = parseInt(quantityStr);\n // const smallestTierQuantity = getSmallestTierQuantity(pricingTierData, productCode, initialCartData);\n // setQuantity(Math.max(quantity, smallestTierQuantity));\n setQuantity(Math.max(quantity, 0));\n }\n\n return (\n
\n
\n
\n
\n
\n \n \n \n \n \n { pricingTierData.map( data => {\n const tierQuantity = data.OptionsDesc.split('---')[1].trim();\n return (\n \n \n \n \n )\n })}\n
QTY£ / Item
{tierQuantity}+£{ data.Price }
\n
\n
\n
\n
\n Qty:\n \n handleQuantityChange(quantity, e.target.value, initialCartData, pricingTierData, productCode)\n }\n /> \n \n {initialQuantity} in basket\n \n
\n
\n {\n isInStock \n ? handleAddToCart(volusionClient, pricingTierData, volusionActions, quantity, productCode)}\n >\n Add To Basket\n \n : {\n await volusionActions.addToEmailWhenBackInStockList(productCode, customerEmail);\n setShowModal(true);\n }}\n >\n Email Me When Back In Stock\n \n }\n {\n setShowModal(false);\n }}\n />\n
\n
);\n}\n\nexport default CategoryPricingTierDisplay;\n","\nimport React, { useState, Dispatch, SetStateAction } from 'react'; // let's also import Component\nimport s from './Modal.module.css'\n\ntype ModalProps = {\n setIsShowingExternal?: (x: Dispatch>) => unknown\n onClose?: () => unknown;\n text: string;\n}\n\nconst Modal = ({setIsShowingExternal, text, onClose}:ModalProps) => {\n const [isShowing, setIsShowing ] = useState(false);\n setIsShowingExternal && setIsShowingExternal(setIsShowing);\n\n if(!isShowing){\n return ()\n }\n return (\n
\n
\n {/*
\n

Modal Header

\n
*/}\n
\n {\n setIsShowing(false);\n onClose && onClose();\n }}>×\n
{text}
\n
\n {/*
\n

Modal Footer

\n
*/}\n
\n
\n )\n}\n\nexport {Modal};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"PricingTierOuterContainer\":\"CategoryPricingTierDisplay_PricingTierOuterContainer__1GWKd\",\"PricingTierContainer\":\"CategoryPricingTierDisplay_PricingTierContainer__1sOyL\",\"TableContainer\":\"CategoryPricingTierDisplay_TableContainer__2Qv3x\",\"AvailabilityContainer\":\"CategoryPricingTierDisplay_AvailabilityContainer__14mck\",\"Availability\":\"CategoryPricingTierDisplay_Availability__r27IS\",\"Qty\":\"CategoryPricingTierDisplay_Qty__h7o8a\",\"QtyTitle\":\"CategoryPricingTierDisplay_QtyTitle__1O39h\",\"QtyValue\":\"CategoryPricingTierDisplay_QtyValue__mX-4V\",\"BasketButton\":\"CategoryPricingTierDisplay_BasketButton__Xv_fa\",\"InitialQuantity\":\"CategoryPricingTierDisplay_InitialQuantity__2vlRd\",\"MeTextInButton\":\"CategoryPricingTierDisplay_MeTextInButton__194DN\",\"Hidden\":\"CategoryPricingTierDisplay_Hidden__1LvFa\"};","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import VolusionClient from '../volusion-client/volusion-client';\nimport { notEmpty } from '../../components/ListPricingTiers/ListPricingTiers';\nimport { VolusionActions, CartDetail } from '../volusion-actions/volusion-actions';\nimport { GetCartResponse } from '../volusion-client/interfaces';\nimport { getSmallestTierQuantity } from '../../components/CategoryPricingTierDisplay/CategoryPricingTierDisplay';\n\nexport interface CartControllerOptions {\n volusionClient: VolusionClient;\n volusionActions: VolusionActions;\n}\n\nexport default class CartController {\n private readonly volusionClient: VolusionClient;\n private readonly volusionActions: VolusionActions;\n private cartData: GetCartResponse | undefined;\n\n private readonly quantityDiscountOptionCategoryID =\n process.env.REACT_APP_QUANTITY_DISCOUNT_OPTION_CATEGORY || '45';\n constructor(options?: CartControllerOptions) {\n this.volusionClient =\n (options && options.volusionClient) || new VolusionClient();\n this.volusionActions =\n (options && options.volusionActions) || new VolusionActions(process.env.REACT_APP_STORE_URL || '');\n }\n\n async hideCorrectOptionsOnCartPage(){\n if(window.location.href.toLowerCase().indexOf('shoppingcart.asp') === -1){\n return;\n }\n try {\n const cartData = await this.getCartData();\n \n const optionSelectLinks = document.querySelectorAll('a.cart-item-name + a');\n [...optionSelectLinks].forEach( (ele, i) => {\n ele.setAttribute('hidden','')\n const itemHasPricingTierOption = cartData.Products[i].Options.find(x => x[0].indexOf('Quantity Discount') >= 0 );\n if(!itemHasPricingTierOption){\n return;\n }\n ele.setAttribute('hidden','');\n })\n\n } catch (e) {\n console.error(e);\n }\n }\n\n async updatePricing() {\n const checkoutButton = document.querySelector('[name=\"btn_checkout_guest\"]');\n if(checkoutButton){\n (checkoutButton as HTMLElement).style.visibility = 'hidden'\n }\n const cartData = await this.getCartData();\n const cartDataWithPricingTiersPromises = cartData.Products.map(async x => {\n const pricingTiers = await this.volusionClient.getPricingTiers(\n x.ProductCode,\n );\n if (!(pricingTiers && pricingTiers.length)) {\n return undefined;\n }\n if(parseFloat(pricingTiers[0].SalePrice || '0') > 0 ) {\n return;\n }\n\n const productPriceTokens = x.ProductPrice.match(/^(?:£|£)(.*?)$/)\n const productPrice = productPriceTokens && productPriceTokens[1];\n if(!productPrice){\n return;\n }\n const unitPrice = pricingTiers[0].ProductPrice;\n return {\n ...x,\n ProductPrice: productPrice,\n UnitPrice: unitPrice,\n pricingTiers,\n };\n });\n let cartDataWithPricingTierResponses = await Promise.all(\n cartDataWithPricingTiersPromises,\n );\n const cartDataWithPricingTiers = cartDataWithPricingTierResponses.filter(\n notEmpty,\n );\n const productsToUpdate = cartDataWithPricingTiers.map(productToUpdate => {\n let highestPricingTier = null;\n \n const minimumQuantityToAddToOrder = getSmallestTierQuantity(productToUpdate.pricingTiers, productToUpdate.ProductCode, cartData);\n // productToUpdate.Quantity = String(Math.max(minimumQuantity, parseInt(productToUpdate.Quantity)));\n const quantityThatNeedsToBeInCart = Math.min(\n parseInt(productToUpdate.Quantity) + minimumQuantityToAddToOrder, \n (parseInt(productToUpdate.pricingTiers[0].StockStatus) || Number.MAX_VALUE) // Accounts for the case when the tier is larger than the stock available.\n );\n\n for (let i = 0; i < productToUpdate.pricingTiers.length; i++) {\n const currentData = productToUpdate.pricingTiers[i];\n const quantity = currentData.OptionsDesc.split('---')[1];\n if(!quantity){\n continue;\n }\n if (quantityThatNeedsToBeInCart >= parseInt(quantity)) {\n highestPricingTier = currentData;\n }\n }\n if(!highestPricingTier){\n return undefined;\n }\n const productValueAtThisTier = parseFloat((parseInt(productToUpdate.Quantity) * parseFloat( highestPricingTier.Price)).toFixed(2));\n const cartPrice = parseFloat(productToUpdate.ProductPrice);\n if(\n !isNaN(productValueAtThisTier) && \n !isNaN(cartPrice) && \n productValueAtThisTier === cartPrice && \n minimumQuantityToAddToOrder === 0\n ){\n return undefined;\n }\n return {\n removeIndex: productToUpdate.ProductIndex,\n addToCart: {\n productCode: productToUpdate.ProductCode,\n quantity: String(quantityThatNeedsToBeInCart),\n options: [{\n optionCategoryDisplayType: 'DROPDOWN',\n optionCategoryID: this.quantityDiscountOptionCategoryID,\n optionID: highestPricingTier.ID,\n }]\n } as CartDetail\n }\n }).filter(notEmpty);\n\n if(checkoutButton){\n (checkoutButton as HTMLElement).style.visibility = 'visible'\n }\n\n if(!productsToUpdate.length){\n return;\n }\n\n await productsToUpdate\n .map( x => parseInt(x.removeIndex) )\n .sort((a,b) => b-a)\n .reduce( async (previousPromise, index) => {\n try {\n await previousPromise;\n } catch (e){\n console.error(e);\n }\n return this.volusionActions.removeFromCart(index)\n }, Promise.resolve(''))\n \n const addTheseToCart = productsToUpdate.map( x => x.addToCart )\n await this.volusionActions.postToCart(addTheseToCart);\n this.volusionActions.navigateToCart();\n }\n\n private async getCartData() {\n if(this.cartData){\n return this.cartData;\n }\n return this.volusionActions.getCart();\n }\n}\n","import CartController from '../modules/cart-controller/cart-controller';\n\nexport default (async () => {\n const cartController = new CartController();\n\n if ( \n window.location.href.toLowerCase().indexOf('-p/') >= 0 || \n window.location.href.toLowerCase().indexOf('_p/') >= 0 || \n window.location.href.toLowerCase().indexOf('productdetails') >= 0 \n ) {\n await import('./product');\n }\n else if ( \n window.location.href.toLowerCase().indexOf('-s/') >= 0 || \n window.location.href.toLowerCase().indexOf('_s/') >= 0 ||\n window.location.href.toLowerCase().indexOf('searchresults.asp') >= 0\n ) {\n await import('./category');\n } else if (window.location.href.toLowerCase().indexOf('shoppingcart.asp') >= 0){\n cartController.hideCorrectOptionsOnCartPage();\n } else if (\n document.body && \n document.body.classList && \n document.body.classList.contains('admin-interface')) {\n await import('./admin');\n }\n\n try {\n await cartController.updatePricing();\n } catch (e) {\n console.error(e);\n }\n\n return true;\n})();","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Modal\":\"Modal_Modal__KtEB3\",\"ModalContent\":\"Modal_ModalContent__2ifBY\",\"animatetop\":\"Modal_animatetop__37k_J\",\"ModalHeader\":\"Modal_ModalHeader__1oR15\",\"ModalBody\":\"Modal_ModalBody__3K69r\",\"ModalFooter\":\"Modal_ModalFooter__1JiY6\",\"Close\":\"Modal_Close__3OM1R\"};","import React from 'react';\n\n/**\n * Put all imported modules here.\n */\n\nimport VolusionClient from '../../modules/volusion-client/volusion-client';\nimport QuantityDiscountsClient from '../../modules/quantity-discounts-client/quantity-discounts-client';\nexport type AppContextProps = { \n volusionClient: VolusionClient,\n quantityDiscountsClient: QuantityDiscountsClient,\n};\n\nexport const AppContext = React.createContext>({});\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ListPricingTiersContainer\":\"ListPricingTiers_ListPricingTiersContainer__U620M\",\"ListTable\":\"ListPricingTiers_ListTable__1azaO\",\"SearchBar\":\"ListPricingTiers_SearchBar__1bTBq\"};"],"sourceRoot":""}