{"version":3,"sources":["estore/cart/cart-service.ts"],"names":["cartEventPublisher","ImageMode","EventActionResult","Notify","CartService","constructor","this","_isPrivateAction","_includeVat","window","globalSettings","displayPricesIncludingVat","_notify","instance","_detailedCartData","couponCodes","products","summary","freeShippingInfo","_siteCartData","_showErrorMessage","errorMessage","error","emptyCart","clearCartEventData","PublicEStore","then","data","status","Ok","cartEmptied","result","detailedCartInfo","imageWidth","_getDetailedCartInfo","Promise","resolve","reject","getDetailedCartInfo","Pad","getSiteCartInfo","_getSiteCartInfo","removeFromCart","tempOrderLineID","removeFromCartContract","removeFromCartEventData","cartItemsRemoved","addToCart","productId","quantity","updateCartQuantity","productID","updateCartEventData","cartQuantityUpdated","resetDetailedCartInfoCache","resetSiteCartInfoCache","createOffer","response","fetch","method","mode","cache","credentials","headers","Content-Type","json","ok","success","offerId","location","href","message","Message"],"mappings":"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","file":"cart-service.js","sourcesContent":["import { CartItemsAddedResultEventData, CartItemsRemovedResultEventData, CartItemsResultEventData } from \"../../common/pubsub/models/cart-items-result-event-data.js\";\r\nimport { IDetailedCartInfo } from \"./interfaces/detailed-cart-info.js\";\r\nimport { cartEventPublisher } from \"../../common/pubsub/cart-event-pub-sub.js\";\r\nimport { ImageMode } from \"../../common/interfaces/image-mode.js\";\r\nimport { EventActionResult } from \"../../common/pubsub/models/event-data-base.js\";\r\nimport { RemoveFromCartItemContract } from \"../../common/public-estore/remove-from-cart-contract.js\";\r\nimport { UpdateCartQuantityItemContract } from \"../../common/public-estore/update-cart-quantity-contract.js\";\r\nimport { Notify } from \"../../../components-shared/utils/notify.js\";\r\n\r\nexport class CartService {\r\n private static instance: CartService | null = null;\r\n\r\n constructor() {\r\n if (!CartService.instance) {\r\n CartService.instance = this;\r\n } \r\n\r\n this._detailedCartData = {\r\n couponCodes: [],\r\n products: [],\r\n summary: null,\r\n freeShippingInfo: null,\r\n }\r\n\r\n this._siteCartData = {\r\n couponCodes: [],\r\n products: [],\r\n summary: null,\r\n freeShippingInfo: null,\r\n }\r\n return CartService.instance as CartService;\r\n }\r\n\r\n private _getDetailedCartInfo: Promise;\r\n private _getSiteCartInfo: Promise;\r\n private _isPrivateAction:boolean = true; // What is it? Developers told that it requried to be checked, could be useless.\r\n private _includeVat:boolean = window.globalSettings.displayPricesIncludingVat;\r\n private _detailedCartData: IDetailedCartInfo;\r\n private _siteCartData: IDetailedCartInfo;\r\n private _notify = new Notify(); \r\n\r\n private _showErrorMessage(errorMessage: string){\r\n this._notify.error(errorMessage);\r\n } \r\n \r\n /* #region Public */\r\n public async emptyCart() : Promise{\r\n const clearCartEventData = await window.PublicEStore.emptyCart(this._isPrivateAction).then((data) => data);\r\n\r\n if (clearCartEventData.status === EventActionResult.Ok) {\r\n cartEventPublisher.cartEmptied(clearCartEventData);\r\n }\r\n\r\n return clearCartEventData.result.detailedCartInfo;\r\n }\r\n\r\n public async detailedCartInfo(_includeVat:boolean = true, _isPrivateAction:boolean = true, imageWidth:number = 64) : Promise{\r\n if (!this._getDetailedCartInfo) {\r\n this._getDetailedCartInfo = new Promise((resolve, reject)=>{\r\n // The line below returns cache result is one more request fired. \r\n // Resolves the issue when webcomponent based on CartController included in the component based on CartController, ex: free-shipping-progress-bar in cart-sidebar-v1\r\n // Creates an issue if timed out request needs to be fired again, then resetDetailedCartInfoCache() should be called before forced request.\r\n // Probably can be done better.\r\n this._detailedCartData.summary ? resolve(this._detailedCartData) : \r\n window.PublicEStore\r\n .getDetailedCartInfo(_includeVat, _isPrivateAction, imageWidth, ImageMode.Pad)\r\n .then((data) => {\r\n if(data.status === EventActionResult.Ok){\r\n this._detailedCartData = data.result.detailedCartInfo;\r\n resolve(this._detailedCartData);\r\n } else {\r\n reject(data);\r\n }\r\n this._getDetailedCartInfo = null;\r\n }, (error) => {\r\n reject(error)\r\n this._getDetailedCartInfo = null;\r\n })\r\n });\r\n }\r\n return this._getDetailedCartInfo;\r\n }\r\n\r\n public async getSiteCartInfo(_includeVat:boolean = true, _isPrivateAction:boolean = true, imageWidth:number = 60) : Promise{\r\n if (!this._getSiteCartInfo) {\r\n this._getSiteCartInfo = new Promise((resolve, reject)=>{\r\n // The line below returns cache result is one more request fired. \r\n // Resolves the issue when webcomponent based on CartController included in the component based on CartController, ex: free-shipping-progress-bar in cart-sidebar-v1\r\n // Creates an issue if timed out request needs to be fired again, then resetDetailedCartInfoCache() should be called before forced request.\r\n // Probably can be done better.\r\n this._siteCartData.summary ? resolve(this._siteCartData) : \r\n window.PublicEStore\r\n .getSiteCartInfo(_includeVat, _isPrivateAction, imageWidth, ImageMode.Pad)\r\n .then((data) => {\r\n if(data.status === EventActionResult.Ok){\r\n this._siteCartData = data.result.detailedCartInfo;\r\n resolve(this._siteCartData);\r\n } else {\r\n reject(data);\r\n }\r\n this._getSiteCartInfo = null;\r\n }, (error) => {\r\n reject(error)\r\n this._getSiteCartInfo = null;\r\n })\r\n });\r\n }\r\n return this._getSiteCartInfo;\r\n }\r\n\r\n public async removeFromCart(tempOrderLineID: number) : Promise {\r\n try{\r\n const removeFromCartContract = {\r\n tempOrderLineID: tempOrderLineID,\r\n } as RemoveFromCartItemContract;\r\n\r\n const removeFromCartEventData = await window.PublicEStore.removeFromCart(removeFromCartContract, this._isPrivateAction).then((data) => data);\r\n\r\n if (removeFromCartEventData.result) {\r\n cartEventPublisher.cartItemsRemoved(removeFromCartEventData);\r\n }\r\n\r\n return removeFromCartEventData;\r\n\r\n } catch (error){\r\n throw error;\r\n }\r\n }\r\n\r\n public async addToCart(productId: number, quantity: number) : Promise{\r\n const addToCartContract = {\r\n productId: productId,\r\n //imageId: $prodContainer.data(dataNames.imageId),\r\n quantity: quantity,\r\n //fraction: $prodContainer.find('.' + classes.fractionInput).val(),\r\n //customFields: customFields\r\n };\r\n\r\n const addToCartEventData = await window.PublicEStore.addToCart(addToCartContract, this._includeVat, this._isPrivateAction);\r\n\r\n return addToCartEventData;\r\n }\r\n\r\n public async updateCartQuantity(productId: number, quantity: number, productID: number) : Promise{\r\n const udpateCartQuantityContract = {\r\n tempOrderLineID: productId,\r\n quantity: quantity,\r\n productID: productID,\r\n } as UpdateCartQuantityItemContract;\r\n\r\n const updateCartEventData = await window.PublicEStore.updateCartQuantity(udpateCartQuantityContract, this._isPrivateAction);\r\n\r\n if (updateCartEventData.result) {\r\n cartEventPublisher.cartQuantityUpdated(updateCartEventData);\r\n }\r\n\r\n return updateCartEventData;\r\n }\r\n\r\n public resetDetailedCartInfoCache() {\r\n this._getDetailedCartInfo = null;\r\n this._detailedCartData.summary = null;\r\n }\r\n\r\n public resetSiteCartInfoCache() {\r\n this._getSiteCartInfo = null;\r\n this._siteCartData.summary = null;\r\n }\r\n\r\n public async createOffer() {\r\n const requestInit = {\r\n method: \"POST\",\r\n mode: \"cors\",\r\n cache: \"no-cache\",\r\n credentials: \"same-origin\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n }\r\n } as RequestInit;\r\n\r\n const response = await fetch(`/api/shopping-cart/create-offer`, requestInit);\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n const errorMessage = result.message ? result.message : result.Message ? result.Message : \"An error occurred while creating the offer\";\r\n this._showErrorMessage(errorMessage);\r\n return;\r\n }\r\n\r\n if (result.success && result.offerId) {\r\n window.location.href = \"/Startup/Common/Default.aspx?offerId=\"+result.offerId;\r\n }\r\n }\r\n\r\n /* #endregion */\r\n}"]}