{"mappings":"yYAAA,IAAAA,EAAAC,EAAA,gDAmBE,MAAAC,EAAAC,KAEF,EAAAH,EAAAI,WAAA,kBAAAD,EAAA,IAKQA,GAaNE,EAAA,KACA,MAAAC,GAAA,EAAAN,EAAAO,WAAA,mBAEF,GAAA,cAAAD,EAKE,OAAMA,GASAE,EAAoB,QAAER,EAAIS,cAAQ,qCAGtC,WACAH,EAAOD,KAAA,WAAS,OAAMK,QAAAC,OAAA,kBAAS,wEAEjC,MAAAC,EAAAN,EAAA,CAEFH,GAAAG,GAKE,GACA,OAAM,EAAAO,EAASC,KAAAC,EAAAC,OAAAC,SAAAC,aAAA,CAAaN,OAAIA,IAAUO,MAAGC,IAAElB,EAAUkB,EAAAC,IAAG,CAErDC,SAAA,EACLF,KAASA,qBAMP,CAAYG,EAAMC,GAAI,WACtBlB,EAAKD,IACLO,EAAMN,EAAyB,CAC/BH,GAAAG,GACA,CAEAH,GAAA,iBAEEU,EAAUY,MAAEV,EAAAC,OAAAC,SAAAS,eAAA,SACZ,CACCC,KAAAC,KAAAC,UAAA,CACIN,KAERX,OAAMA,UACLQ,MACgBA,EAAAC,iBACTG,QACLM,EAAAV,EACDW,EAAAD,MAAAA,OAAA,EAAAA,EAAAE,UACL,IAAAC,EAAA,MAAAF,EAAAA,EAAAA,EAAAG,OAAA,GAAA,YAEI,EAAAC,EAAAC,UAAAD,EAAAE,OAAAC,qBAAA,CACEC,KAAMnB,EAAKa,WAAEA,EAAGO,SAAAjB,EAAAkB,oBAIdnB,SAAQ,aACHoB,KAAsBpB,SAAA,EAE3BoB,MAAMA,uBAIRvC,UACDS,EAAA,CACLT,GAAAA,GAGA,OAAM,EAAAU,EAASY,MAAAV,EAAAC,OAAAC,SAAA0B,mBAAA,QAAI/B,IAAGO,MAAAC,IACf,UACL,EAEMA,KAAIA,aACCsB,KAAsBpB,SAAA,EAE3BoB,MAAMA,wBA+B0CnB,UAAGjB,EAACD,KAAA,SACxDC,EAAO,OAAAI,QAAAC,OAAA,UAAE,QAAe,8EAEzBC,EAAW,CACVT,GAAAG,cAEEmB,MAAKV,EAAAC,OAAAC,SAAA2B,gBAAA,SACL,CACDjB,KAAAC,KAAAC,UAAA,CACLN,YAOmBX,IAAGO,MAAAC,KACtB,EAAOe,EAAAC,UAAID,EAAAE,OAAMQ,uBAAU,MACzBzB,IAGE,CACEE,SAAA,EACAiB,KAAAnB,aAEFsB,IAAS,CAAgBpB,SAAA,EAErBoB,MAAMA,wBAQhB,CAAAvC,EAAA8B,KAKE,MAAMrB,EAAQ,CACVT,GAACA,UAGD,EACEU,EAAAiC,KAAA/B,EAAqEC,OAAAC,SAAA8B,oBAAA,CACtEnC,OAAAA,IAGLO,MAAMC,KAAW,EAAAe,EAAWC,UAAED,EAAAE,OAAAW,yBAAA,CAAef,WAAQA,EAAGO,SAAAP,MAAAA,OAAA,EAAAA,EAAAQ,mBAG/C,CAAInB,SAAS,iBAGd,CACJA,SAAA,EACAoB,MAAOA,sBAMLO,UACD3C,EAAAD,KAAA,KACL,IAAAC,EAAA,OAAAI,QAAAC,OAAA,CAEFW,SAAA,EAKEoB,MAAM,8EAGF9B,EAAS,CACTsC,YACED,EACD9C,GAAAG,UAGY,EAAAO,EAAaY,MAAAV,EAAAC,OAAAC,SAAAkC,kBAAA,CAAWC,QAAI,CAAWC,SAAA,UAGtDzC,IAECO,MAAKC,KACJ,EAAAe,EAAAC,UAASD,EAAAE,OAAOiB,mBACT,CAAEhC,SAAS,MAEnBiC,OAAMb,IACE,CACLpB,SAAS,QACToB,wBAiBIO,UACR3C,EAASD,KAAO,SAChBC,EAAA,OAAiBI,QAAEC,OAAA,CACnBW,SAAA,EAEFoB,MAAO,gFAEG,aACPO,EAEA9C,GAAKG,UAEJ,EAAOO,EAAAY,MAAAV,EAAAC,OAAAC,SAAAuC,oBAAA,QAAE5C,iBAAsBuB,EAAAC,UAAAD,EAAAE,OAAAiB,mBAE1B,CACLhC,SAAO,iBAGL,CACDA,SAAA,EACLoB,MAAAA,qBAW4E,CAAAe,EAAAC,EAAAC,EAAAC,KAE9E,MAAMjC,EAAA,CACJkC,WAAAJ,EACAK,IAAAJ,EAEFK,QAAAJ,oBACEC,cAEAnC,MAAAV,EAAAC,OAAAgD,SAAAC,yBAAA,oBAEApC,UAAAF,qBAGAS,UAAAD,EAAAE,OAAA6B,0BAAA9C,aAEA,wBAID,+TA5LOjB,UACDS,EAAA,CACLT,GAAAA,GAOA,OAAM,EAAAU,EAAWY,MAAAV,EAAAC,OAAAC,SAAAkD,wBAAA,CACbvD,OAACA,UAEDQ,IAEE,CACDE,SAAA,EAGCF,KAAMA,MAAoBmC,OAAAb,IAEzB,CACLpB,SAAS,EACPoB,MAAMA,6CCtJL,SAAS0B,EAAUC,GACxB,MAAMC,EAAOD,EAAQ,IAEfE,EADgBC,mBAAmBC,SAASC,QACzBC,MAAM,KAC/B,IAAK,IAAIC,KAAKL,EAAI,CAChB,KAAuB,MAAhBK,EAAEC,OAAO,IACdD,EAAIA,EAAEE,UAAU,GAElB,GAAwB,IAApBF,EAAEG,QAAQT,GACZ,OAAOM,EAAEE,UAAUR,EAAKpC,OAAQ0C,EAAE1C,QAGtC,MAAO,GAGF,SAAS8C,EAAUX,EAAeY,EAAgBC,GACvD,MAAMC,EAAI,IAAIC,KACd,IAAIC,EAAU,QACQ,IAAXH,IACTC,EAAEG,QAAQH,EAAEI,UAAY,MAAAL,GACxBG,EAAU,WAAaF,EAAEK,cAAgB,KAE3Cf,SAASC,OAASL,EAAQ,IAAMY,EAAS,IAAMI,EAAU,SAGpD,SAASI,EAAapB,GAC3B,MAAMqB,EAAO,IAAIN,KACjBM,EAAKJ,QAAQI,EAAKH,WAAY,OAC9Bd,SAASC,OAASL,EAAQ,cAAgBqB,EAAKF,cAAgB,iYC5BjE,MAAMG,EAAS,CACbrD,qBAAsB,uBACtBU,yBAA0B,2BAC1BH,uBAAwB,yBACxBS,kBAAmB,oBACnBY,0BAA2B,4BAC3B0B,4BAA6B,8BAC7BC,sBAAuB,wBACvBC,cAAe,gBACfC,YAAa,cACbC,eAAgB,iBAChBC,YAAa,cACbC,kCAAmC,oCACnCC,8BAA+B,gCAC/BC,uBAAwB,yBACxBC,kBAAmB,oBACnBC,oBAAqB,sBACrBC,YAAa,cACbC,kBAAkB,qBAGdC,EAAW,CAACC,EAActF,KAC1BA,EACFuF,OAAOC,cAAc,IAAIC,YAAYH,EAAM,CAAEI,OAAQ1F,KAErDuF,OAAOC,cAAc,IAAIG,MAAML,KAI7BM,EAAY,CAChBN,EACAO,KAEAN,OAAOO,iBAAiBR,EAAMO,IAG1BE,EAAc,CAClBT,EACAO,KAEAN,OAAOS,oBAAoBV,EAAMO","sources":["scripts/src/api/basketAPI.ts","scripts/src/cookie/index.ts","scripts/src/api/events.ts"],"sourcesContent":["import { deleteCookie, getCookie, setCookie } from \"../cookie/\";\r\nimport { routes } from \"./config\";\r\nimport { dispatch, events } from \"./events\";\r\nimport { del, get, post } from \"./request\";\r\nimport {\r\n IBasket,\r\n IBasketItem,\r\n TAddBasketItem,\r\n TGetBasket,\r\n TGetWishlistStatus\r\n} from \"./types\";\r\n\r\n/**\r\n * Saves the basket ID for persistence between sessions\r\n * @returns {string} the id returned\r\n */\r\nconst saveBasketId = (id: string) => {\r\n setCookie(\"neptuneBasketId\", id, 30);\r\n return id;\r\n};\r\n\r\n/**\r\n * Get the current basket ID if it exists\r\n * @returns {string || undefined} basketID string or undefined if not available.\r\n */\r\nconst getBasketId = () => {\r\n const basketId = getCookie(\"neptuneBasketId\");\r\n if (basketId === \"undefined\") {\r\n return undefined;\r\n }\r\n\r\n return basketId;\r\n};\r\n\r\n/**\r\n * Deletes the basket ID for persistence between sessions\r\n * @returns {string} the id returned\r\n */\r\nconst deleteBasketId = () => {\r\n deleteCookie(\"neptuneBasketId\");\r\n};\r\n\r\n/**\r\n * Get the current basket if it exists.\r\n * @returns {promose} POJO for the users basket\r\n */\r\nconst getBasket: TGetBasket = () => {\r\n const basketId = getBasketId() || null;\r\n if (!basketId) {\r\n return Promise.reject({\r\n success: false,\r\n error:\r\n \"You currently have no basket, please add an item to create a basket\"\r\n });\r\n }\r\n\r\n const params = basketId ? { id: basketId } : {};\r\n\r\n return get(routes.Checkout.GetCartAsync, { params }).then(data => {\r\n saveBasketId(data.Id);\r\n return { success: true, data };\r\n });\r\n};\r\n\r\n/**\r\n * Add can item to the users basket and saves the basketID if one doesn't exist.\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst addBasketItem: TAddBasketItem = (item, openBasket = true) => {\r\n const basketId = getBasketId();\r\n const params = basketId ? { id: basketId } : { id: \"null\" };\r\n\r\n return post(routes.Checkout.AddToCartAsync, {\r\n options: {\r\n body: JSON.stringify([item])\r\n },\r\n params\r\n })\r\n .then(data => {\r\n saveBasketId(data.Id);\r\n data.openBasket = openBasket;\r\n const basket = data as IBasket;\r\n const basketItems = basket?.CartLines;\r\n var basketItem =\r\n basketItems != null ? basketItems[basketItems.length - 1] : null;\r\n dispatch(events.ITEM_ADDED_TO_BASKET, {\r\n cart: data,\r\n basketItem: basketItem, \r\n quantity: item.SelectedQuantity\r\n });\r\n return { success: true };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\nconst addWishlistItem: TGetWishlistStatus = (id: string) => {\r\n const params = { id };\r\n return post(routes.Checkout.AddToWishlistAsync, {\r\n params\r\n })\r\n .then(data => {\r\n return { success: true, data };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\nconst removeWishlistItem: TGetWishlistStatus = (id: string) => {\r\n const params = { id };\r\n return post(routes.Checkout.RemoveFromWishlistAsync, {\r\n params\r\n })\r\n .then(data => {\r\n return { success: true, data };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Update an item in the basket\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst updateBasketItem = (item: IBasketItem) => {\r\n const basketId = getBasketId() || null;\r\n if (!basketId) {\r\n return Promise.reject({\r\n success: false,\r\n error:\r\n \"You currently have no basket, please add an item to create a basket\"\r\n });\r\n }\r\n\r\n const params = { id: basketId };\r\n\r\n return post(routes.Checkout.UpdateCartAsync, {\r\n options: {\r\n body: JSON.stringify([item])\r\n },\r\n params\r\n })\r\n .then(data => {\r\n dispatch(events.ITEM_UPDATED_IN_BASKET, { cart: data });\r\n return { success: true, cart: data };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Remove an item from the basket\r\n * @returns {promise} - resolves to sucess or failure object\r\n */\r\nconst removeBasketItem = (id: number, basketItem?: IBasketItem) => {\r\n const params = { id };\r\n return del(routes.Checkout.RemoveCartItemAsync, {\r\n params\r\n })\r\n .then(data => {\r\n dispatch(events.ITEM_REMOVED_FROM_BASKET, { \r\n basketItem: basketItem,\r\n quantity: basketItem?.SelectedQuantity\r\n });\r\n return { success: true };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Apply a promocode to a basket\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst applyPromoCode = (promoCode: string) => {\r\n const basketId = getBasketId() || null;\r\n if (!basketId) {\r\n return Promise.reject({\r\n success: false,\r\n error:\r\n \"You currently have no basket, please add an item to create a basket\"\r\n });\r\n }\r\n\r\n const params = { voucherCode: promoCode, id: basketId };\r\n\r\n return post(routes.Checkout.ApplyVoucherAsync, {\r\n options: { noToast: true },\r\n params\r\n })\r\n .then(data => {\r\n dispatch(events.PROMO_CODE_CHANGE);\r\n return { success: true };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * UNApply a promocode to a basket\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst unApplyPromoCode = (promoCode: string) => {\r\n const basketId = getBasketId() || null;\r\n if (!basketId) {\r\n return Promise.reject({\r\n success: false,\r\n error:\r\n \"You currently have no basket, please add an item to create a basket\"\r\n });\r\n }\r\n\r\n const params = { voucherCode: promoCode, id: basketId };\r\n\r\n return post(routes.Checkout.UnApplyVoucherAsync, {\r\n params\r\n })\r\n .then(data => {\r\n dispatch(events.PROMO_CODE_CHANGE);\r\n return { success: true };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Apply a gift card to the basket\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst applyGiftCard = (\r\n giftCardNumber: string,\r\n pin: string,\r\n culture: string,\r\n isAlreadyRedeemed: boolean\r\n) => {\r\n const body = {\r\n GiftCardNo: giftCardNumber,\r\n Pin: pin,\r\n Culture: culture,\r\n IsAlreadyRedeemed: isAlreadyRedeemed\r\n };\r\n\r\n return post(routes.GiftCard.PerformBalanceCheckAsync, {\r\n options: {\r\n body: JSON.stringify(body)\r\n }\r\n })\r\n .then(data => {\r\n dispatch(events.APPLY_GIFT_CARD_TO_BASKET, data);\r\n return { success: true, data };\r\n })\r\n .catch(error => {\r\n return {\r\n success: false,\r\n error\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * UnApply a gift card to the basket\r\n * @returns {promise} - resolves to sucess of failure object\r\n */\r\nconst unApplyGiftCard = (giftCardNumber: string) => {\r\n dispatch(events.UNAPPLY_GIFT_CARD_TO_BASKET, giftCardNumber);\r\n};\r\n\r\nconst getBasketValues = () =>\r\n (document.querySelector(\"[data-basket-total-rrp]\") as HTMLElement)?.dataset;\r\n\r\nconst refreshBasket = () => {\r\n dispatch(events.REFRESH_BASKET);\r\n};\r\n\r\nexport default {\r\n getBasket,\r\n addBasketItem,\r\n addWishlistItem,\r\n updateBasketItem,\r\n removeBasketItem,\r\n applyPromoCode,\r\n unApplyPromoCode,\r\n applyGiftCard,\r\n getBasketId,\r\n refreshBasket,\r\n getBasketValues,\r\n unApplyGiftCard,\r\n removeWishlistItem\r\n};\r\n\r\n// Exports for testing\r\nexport { saveBasketId, getBasketId, deleteBasketId };\r\n","export function getCookie(cname: string) {\r\n const name = cname + \"=\";\r\n const decodedCookie = decodeURIComponent(document.cookie);\r\n const ca = decodedCookie.split(\";\");\r\n for (let c of ca) {\r\n while (c.charAt(0) === \" \") {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return \"\";\r\n}\n\r\nexport function setCookie(cname: string, cvalue: string, exdays?: number) {\r\n const d = new Date();\r\n let expires = \"\";\r\n if (typeof exdays !== \"undefined\") {\r\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\r\n expires = \"expires=\" + d.toUTCString() + \";\";\r\n }\r\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \"path=/\";\r\n}\r\n\r\nexport function deleteCookie(cname: string) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + -1 * 24 * 60 * 60 * 1000);\r\n document.cookie = cname + \"=; expires=\" + date.toUTCString() + \"; path=/\";\r\n}\r\n","const events = {\r\n ITEM_ADDED_TO_BASKET: \"ITEM_ADDED_TO_BASKET\",\r\n ITEM_REMOVED_FROM_BASKET: \"ITEM_REMOVED_FROM_BASKET\",\r\n ITEM_UPDATED_IN_BASKET: \"ITEM_UPDATED_IN_BASKET\",\r\n PROMO_CODE_CHANGE: \"PROMO_CODE_CHANGE\",\r\n APPLY_GIFT_CARD_TO_BASKET: \"APPLY_GIFT_CARD_TO_BASKET\",\r\n UNAPPLY_GIFT_CARD_TO_BASKET: \"UNAPPLY_GIFT_CARD_TO_BASKET\",\r\n CAROUSEL_SLIDE_CHANGE: \"CAROUSEL_SLIDE_CHANGE\",\r\n CAROUSEL_INIT: \"CAROUSEL_INIT\",\r\n CLOSE_MODAL: \"CLOSE_MODAL\",\r\n REFRESH_BASKET: \"REFRESH_BASKET\", \r\n OPEN_SEARCH: \"OPEN_SEARCH\",\r\n APPLY_HOTSPOTS_TO_APPENDED_SLIDES: \"APPLY_HOTSPOTS_TO_APPENDED_SLIDES\",\r\n CUSTOMIZATION_DROPDOWN_OPENED: \"CUSTOMIZATION_DROPDOWN_OPENED\",\r\n ITEM_ADDED_TO_WISHLIST: \"ITEM_ADDED_TO_WISHLIST\",\r\n AVAILABILITY_VIEW: \"AVAILABILITY_VIEW\",\r\n PRODUCT_DETAIL_VIEW: \"PRODUCT_DETAIL_VIEW\",\r\n SITE_SEARCH: \"SITE_SEARCH\",\r\n PRODUCTPAGE_ERROR:\"PRODUCTPAGE_ERROR\",\r\n};\r\n\r\nconst dispatch = (type: string, data?: any) => {\r\n if (data) {\r\n window.dispatchEvent(new CustomEvent(type, { detail: data }));\r\n } else {\r\n window.dispatchEvent(new Event(type));\r\n }\r\n};\r\n\r\nconst subscribe = (\r\n type: string,\r\n callback: EventListenerOrEventListenerObject\r\n) => {\r\n window.addEventListener(type, callback);\r\n};\r\n\r\nconst unsubscribe = (\r\n type: string,\r\n callback: EventListenerOrEventListenerObject\r\n) => {\r\n window.removeEventListener(type, callback);\r\n};\r\n\r\nexport { dispatch, subscribe, unsubscribe, events };\r\n"],"names":["$kvRm3","parcelRequire","$82d653bb75bbead8$export$228bcba1b4278f7c","id","setCookie","$82d653bb75bbead8$export$905d7d5d81aec95","basketId","getCookie","$82d653bb75bbead8$export$2527d0a99815ad15","deleteCookie","Promise","reject","params","$e4FXt","get","$hhkG7","routes","Checkout","GetCartAsync","then","data","Id","success","item","openBasket","post","AddToCartAsync","body","JSON","stringify","basket","basketItems","CartLines","basketItem","length","$aOilU","dispatch","events","ITEM_ADDED_TO_BASKET","cart","quantity","SelectedQuantity","error","AddToWishlistAsync","UpdateCartAsync","ITEM_UPDATED_IN_BASKET","del","RemoveCartItemAsync","ITEM_REMOVED_FROM_BASKET","promoCode","voucherCode","ApplyVoucherAsync","options","noToast","PROMO_CODE_CHANGE","catch","UnApplyVoucherAsync","giftCardNumber","pin","culture","isAlreadyRedeemed","GiftCardNo","Pin","Culture","GiftCard","PerformBalanceCheckAsync","APPLY_GIFT_CARD_TO_BASKET","RemoveFromWishlistAsync","$c99b31b288a7b6c3$export$4be65e66cfa2648a","cname","name","ca","decodeURIComponent","document","cookie","split","c","charAt","substring","indexOf","$c99b31b288a7b6c3$export$110700823644f4a6","cvalue","exdays","d","Date","expires","setTime","getTime","toUTCString","$c99b31b288a7b6c3$export$b43e45590305ffaa","date","$82b9fe20f672efc6$export$4bf9923669ad6c63","UNAPPLY_GIFT_CARD_TO_BASKET","CAROUSEL_SLIDE_CHANGE","CAROUSEL_INIT","CLOSE_MODAL","REFRESH_BASKET","OPEN_SEARCH","APPLY_HOTSPOTS_TO_APPENDED_SLIDES","CUSTOMIZATION_DROPDOWN_OPENED","ITEM_ADDED_TO_WISHLIST","AVAILABILITY_VIEW","PRODUCT_DETAIL_VIEW","SITE_SEARCH","PRODUCTPAGE_ERROR","$82b9fe20f672efc6$export$635e15bbd66f01ea","type","window","dispatchEvent","CustomEvent","detail","Event","$82b9fe20f672efc6$export$ec068583843480e7","callback","addEventListener","$82b9fe20f672efc6$export$f500693cef883ffd","removeEventListener"],"version":3,"file":"basketAPI.b7a19cdb.js.map"}