{"version":3,"file":"static/js/30b7ea401cc5c908d1fe.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/data-actions/get-bonus-coupons-info.ts?50ab","webpack://mattressfirm/./src/Utilities/get-bonus-items.tsx?8ce8","webpack://mattressfirm/./src/Utilities/mfrm-add-promo-code.ts?9171","webpack://mattressfirm/./src/actions/BonusItemDataServiceEntities.g.ts?cf80","webpack://mattressfirm/./src/actions/BonusItemDataActionExtension.g.ts?22ff","webpack://mattressfirm/./src/actions/user-defined-promocode.action.ts?c234","webpack://mattressfirm/./src/data-actions/mfrm-mfi-bonusitem.action.ts?15d0","webpack://mattressfirm/./src/data-actions/promocode-applied-in-progress.action.ts?91e5","webpack://mattressfirm/./src/modules/mfrm-cart/utils/cart-utils.ts?3c24","webpack://mattressfirm/./src/themes/mattressfirm/views/components/cartlineitem.component.tsx?f5e0","webpack://mattressfirm/./src/themes/mattressfirm/views/components/promocode.component.tsx?3230"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n// tslint:disable-next-line: no-duplicate-imports\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CacheType } from '@msdyn365-commerce/retail-proxy';\r\nimport { mFIGetBonusItemsDetailAsync } from '../actions/BonusItemDataActionExtension.g';\r\nimport { IMFIBonusItemsResponse, IMFIGetBonusItemsParameters } from '../actions/BonusItemDataServiceEntities.g';\r\nimport { hasArray } from '../Utilities/emtpyChecker';\r\nimport { _getMFIGetBonusItems } from '../Utilities/get-bonus-items';\r\n\r\n/**\r\n * GetBonusCouponInfo Input Action\r\n */\r\n\r\nexport class GetBonusCouponInfoInput implements Msdyn365.IActionInput {\r\n public cartId?: string;\r\n public coupons?: string[];\r\n\r\n constructor(cartId: string, coupons: string[]) {\r\n this.cartId = cartId;\r\n this.coupons = coupons;\r\n }\r\n public getCacheKey = () => `Get-Coupon-Info-${this.coupons}`;\r\n public getCacheObjectType = () => `GetCouponInfo`;\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\nexport async function getCouponInfo(input: GetBonusCouponInfoInput, ctx: IActionContext): Promise {\r\n const requestBodyMFIBonus: IMFIGetBonusItemsParameters = {\r\n CartId: input.cartId,\r\n Coupons: input.coupons\r\n };\r\n let result = null;\r\n if (requestBodyMFIBonus && requestBodyMFIBonus.CartId && hasArray(requestBodyMFIBonus.Coupons)) {\r\n try {\r\n if (!result) {\r\n result = await mFIGetBonusItemsDetailAsync({ callerContext: ctx }, requestBodyMFIBonus);\r\n if (result) {\r\n return result;\r\n }\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >getCouponInfo,\r\n id: 'get-bonus-coupon-info'\r\n});\r\n","import { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { mFIGetBonusCouponsDetailsAsync } from '../actions/BonusItemDataActionExtension.g';\r\nimport { IMFIBonusItemsDetailsEntity, IMFIBonusItemsResponse, IMFIGetBonusItemsParameters } from '../actions/BonusItemDataServiceEntities.g';\r\nimport getCouponInfo, { GetBonusCouponInfoInput } from '../data-actions/get-bonus-coupons-info';\r\nimport { MFIbonusitemsInput } from '../data-actions/mfrm-mfi-bonusitem.action';\r\n\r\nexport const _getBonusCouponsDetails = async (context: ICoreContext>, bonusCoupons: string) => {\r\n if (bonusCoupons === '') {\r\n try {\r\n const result = await mFIGetBonusCouponsDetailsAsync({ callerContext: context.actionContext }, bonusCoupons);\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// export const _getBonusCouponsDetails;\r\n// Optional paremater mfiBonusItems used to pass state shared mfiBonusItems API response to prevent duplicate calls\r\nexport const _getMFIGetBonusItems = async (context: ICoreContext>, bonusItemParams: IMFIGetBonusItemsParameters, mfiBonusItems?: IMFIBonusItemsDetailsEntity[] | undefined) => {\r\n if (bonusItemParams) {\r\n try {\r\n let result: IMFIBonusItemsResponse | null;\r\n\r\n // Check if this coupon is new to previously applied promos, then call API\r\n const isDifferentCouponApplied = mfiBonusItems?.find(mfiBonusItem => {\r\n return bonusItemParams?.Coupons?.find(bonusItemParam => bonusItemParam !== mfiBonusItem.Coupon);\r\n });\r\n if (mfiBonusItems !== undefined && mfiBonusItems.length > 0 && !isDifferentCouponApplied) {\r\n const mfiBonusItemsResponseObject: IMFIBonusItemsResponse = {\r\n BonusItemsDetails: mfiBonusItems\r\n };\r\n result = mfiBonusItemsResponseObject;\r\n } else {\r\n /* result = await mFIGetBonusItemsDetailAsync({ callerContext: context.actionContext }, bonusItemParams);\r\n console.log({result}); */\r\n\r\n /// Use data action\r\n result = await getCouponInfo(\r\n new GetBonusCouponInfoInput(bonusItemParams.CartId!, bonusItemParams.Coupons!),\r\n context.actionContext\r\n );\r\n context.actionContext.update(new MFIbonusitemsInput(), result?.BonusItemsDetails);\r\n\r\n }\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\n// export default _getMFIGetBonusItems;\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICartActionResultWithCart } from '@msdyn365-commerce/global-state';\r\nimport { addDiscountCodeAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { Cart, CartLine, Coupon, DiscountLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n/***\r\n * VSI Customization start\r\n * ICartActionSubStatusMfrm is used to send out custom message against exception codes\r\n * received against the addDiscountCodeAsync API for scenarios mentioned against\r\n * story number #6563 on ADO\r\n */\r\nexport declare type ICartActionStatusMfrm =\r\n | 'MAXQUANTITY'\r\n | 'NOTFOUND'\r\n | 'ALREADYADDED'\r\n | 'NOCONTENT'\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'QUANTITYLIMITS'\r\n | 'Microsoft_Dynamics_Commerce_Runtime_NotStartedCouponCode'\r\n | 'Microsoft_Dynamics_Commerce_Runtime_ExpiredCouponCode'\r\n | 'DoesNotApply'\r\n | 'Microsoft_Dynamics_Commerce_Runtime_ExclusiveCouponCannotBeAppliedWithOtherCoupons'\r\n | 'Microsoft_Dynamics_Commerce_Runtime_CouponExceedsDefinedUsageLimits'\r\n | 'Microsoft_Dynamics_Commerce_Runtime_ExceededUsageLimitCouponCode';\r\n\r\nexport interface ICartActionResultWithCartMfrm extends ICartActionResultWithCart {\r\n mfrmstatus?: ICartActionStatusMfrm;\r\n}\r\n/* VSI Customization end */\r\n\r\nexport default async function addPromoCode(\r\n cart: Readonly,\r\n promoCode: string,\r\n actionContext: IActionContext\r\n): Promise {\r\n if (!cart) {\r\n return { cart: undefined, status: 'FAILED' };\r\n }\r\n\r\n /*if (hasPromoCode(cart, promoCode)) {\r\n return { cart: undefined, status: 'FAILED', substatus: 'ALREADYADDED' };\r\n }*/\r\n if (cart.CartLines && hasPromoCodeMfrm(cart.CartLines, promoCode)) {\r\n return { cart: undefined, status: 'FAILED', substatus: 'ALREADYADDED' };\r\n }\r\n\r\n return addDiscountCodeAsync({ callerContext: actionContext }, cart.Id, promoCode)\r\n .then(newCart => {\r\n // Retail server will still return success if a promo code is not valid,\r\n // but it won't actually add that promo code. So need to check if promo\r\n // code is actually in the new cart\r\n if (hasPromoCode(newCart, promoCode)) {\r\n /* VSI Customization start */\r\n // Check the DiscountLines in case of success to find if a promo code has acutually\r\n // got applied on a cartLine, in case it did not get applied return error\r\n // code DoesNotApply\r\n if (newCart.CartLines && !hasPromoCodeMfrm(newCart.CartLines, promoCode)) {\r\n return { cart: newCart, mfrmstatus: 'DoesNotApply' };\r\n }\r\n /* VSI Customization end */\r\n // return { cart: newCart, status: 'SUCCESS' };\r\n /* VSI Customization start */\r\n return { cart: newCart, status: 'SUCCESS' };\r\n /* VSI Customization end */\r\n } else {\r\n // return { cart: undefined, status: 'FAILED' };\r\n /* VSI Customization start */\r\n return { cart: undefined, status: 'FAILED' };\r\n /* VSI Customization end */\r\n }\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.warning(error);\r\n\r\n // return { cart: undefined, status: 'FAILED' };\r\n /* VSI Customization start */\r\n // Overriding default behavior of sending FAILED status; actual error code of exception\r\n // will be send back to the promocode.component.tsx to show custom error message\r\n return { cart: undefined, status: error.message, substatus: error.name, mfrmstatus: error.name };\r\n /* VSI Customization end */\r\n });\r\n}\r\n\r\nfunction hasPromoCode(cart: Cart, code: string): boolean {\r\n const codes = cart.Coupons\r\n ? cart.Coupons.map((coupon: Coupon) => {\r\n return coupon.Code!.toLowerCase();\r\n })\r\n : [];\r\n return codes.indexOf(code.toLowerCase()) > -1;\r\n}\r\n\r\n/* VSI Customization start\r\n\r\n This function is to facilitate custom message scenario for MFRM\r\n normally addDiscountCodeAsync return cart with Coupon/Promo applied\r\n even qualifying product is not in the cart. This method will check all\r\n cartLines to see if cartLine itself has Coupon/Promo available in discountLine\r\n on DiscountCode property. Based upon results of this function Does not apply cases\r\n will be executed.\r\n*/\r\nfunction hasPromoCodeMfrm(cartLines: CartLine[], code: string): boolean {\r\n const codes: string[] = [];\r\n cartLines.map((cartLine: CartLine) => {\r\n const discountLines = cartLine.DiscountLines;\r\n discountLines &&\r\n discountLines.map((discountLine: DiscountLine) => {\r\n discountLine.DiscountCode && discountLine.DiscountCode.length > 0 && codes.push(discountLine.DiscountCode.toLowerCase());\r\n });\r\n });\r\n\r\n return codes.indexOf(code.toLowerCase()) > -1;\r\n}\r\n/* VSI Customization end */\r\n","// tslint:disable\r\nimport * as EntityClasses from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport * as Entities from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\n/**\r\n * MFIGetBonusItemsParameters entity interface.\r\n */\r\nexport interface IMFIGetBonusItemsParameters {\r\n CartId?: string;\r\n Coupons?: string[];\r\n // Id: number;\r\n ExtensionProperties?: Entities.CommerceProperty[];\r\n}\r\n\r\n/**\r\n * MFIBonusItemsDetailsEntity entity interface.\r\n */\r\nexport interface IMFIBonusItemsDetailsEntity {\r\n Coupon?: string;\r\n IsBonusCoupon?: string;\r\n CouponMessage?: string;\r\n Items?: IMFIQualifyingItemDetails[];\r\n Id: number;\r\n ExtensionProperties?: Entities.CommerceProperty[];\r\n}\r\n\r\n/**\r\n * MFIQualifyingItemDetails entity interface.\r\n */\r\nexport interface IMFIQualifyingItemDetails {\r\n QualifyingItemId?: string;\r\n QualifyingProductId?: string;\r\n BonusProductQty: number;\r\n BonusItems?: IMFIBonusItemDetails[];\r\n }\r\n\r\n /**\r\n * MFIBonusItemDetails entity interface.\r\n */\r\n export interface IMFIBonusItemDetails {\r\n QualifyingProductId?: string;\r\n QualifyingItemId?: string;\r\n BonusItemId?: string;\r\n BonusProductId?: string;\r\n Name?: string;\r\n AdditionToCart?: string;\r\n AdjustedPrice: number;\r\n BasePrice: number;\r\n CustomerContextualPrice: number;\r\n DiscountAmount: number;\r\n DiscountTypeValue: number;\r\n DiscountType?: string;\r\n PrimaryImageUrl: string;\r\n ProductTypeValue: number;\r\n DealPriceOrDiscountPercentage: number;\r\n BonusCalculatedDiscountPrice: number;\r\n Coupon?: string;\r\n }\r\n\r\n /**\r\n * MFIGetBonusCouponsDetailsResponse entity interface.\r\n */\r\n export interface IMFIGetBonusCouponsDetailsResponse {\r\n BonusCoupons?: IMFIBonusCouponsDetail[];\r\n}\r\n\r\n/**\r\n * MFIBonusItemsResponse entity interface.\r\n */\r\nexport interface IMFIBonusItemsResponse {\r\n BonusItemsDetails?: IMFIBonusItemsDetailsEntity[];\r\n Message?: string;\r\n}\r\n\r\n/**\r\n * MFIBonusCouponsDetail entity interface.\r\n */\r\nexport interface IMFIBonusCouponsDetail {\r\n BonusCoupon?: string;\r\n BonusCouponMessage?: string;\r\n ChildCoupons?: string[];\r\n}\r\n\r\n/**\r\n * MFIGetBonusItemsParameters entity class.\r\n */\r\nexport class MFIGetBonusItemsParametersExtensionClass implements IMFIGetBonusItemsParameters {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public CartId: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Coupons: string[];\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Id: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ExtensionProperties: Entities.CommerceProperty[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.CartId = odataObject.CartId;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Coupons = undefined;\r\n if (odataObject.Coupons) {\r\n this.Coupons = [];\r\n for (let i = 0; i < odataObject.Coupons.length; i++) {\r\n if (odataObject.Coupons[i]) {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Coupons[i] = odataObject.Coupons[i];\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Coupons[i] = undefined;\r\n }\r\n }\r\n }\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Id = odataObject.Id;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties = undefined;\r\n if (odataObject.ExtensionProperties) {\r\n this.ExtensionProperties = [];\r\n for (let i = 0; i < odataObject.ExtensionProperties.length; i++) {\r\n if (odataObject.ExtensionProperties[i]) {\r\n if (odataObject.ExtensionProperties[i]['@odata.type']) {\r\n let className: string = odataObject.ExtensionProperties[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.ExtensionProperties[i] = new EntityClasses[className](odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n this.ExtensionProperties[i] = new EntityClasses.CommercePropertyClass(odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * MFIBonusItemsDetailsEntity entity class.\r\n */\r\nexport class MFIBonusItemsDetailsEntityExtensionClass implements IMFIBonusItemsDetailsEntity {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Coupon: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public IsBonusCoupon: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public CouponMessage: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Items: IMFIQualifyingItemDetails[];\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Id: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ExtensionProperties: Entities.CommerceProperty[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Coupon = odataObject.Coupon;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.IsBonusCoupon = odataObject.IsBonusCoupon;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.CouponMessage = odataObject.CouponMessage;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Items = undefined;\r\n if (odataObject.Items) {\r\n this.Items = [];\r\n for (let i = 0; i < odataObject.Items.length; i++) {\r\n if (odataObject.Items[i]) {\r\n if (odataObject.Items[i]['@odata.type']) {\r\n let className: string = odataObject.Items[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.Items[i] = new EntityClasses[className](odataObject.Items[i]);\r\n }\r\n } else {\r\n this.Items[i] = new MFIQualifyingItemDetailsExtensionClass(odataObject.Items[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Items[i] = undefined;\r\n }\r\n }\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Id = odataObject.Id;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties = undefined;\r\n if (odataObject.ExtensionProperties) {\r\n this.ExtensionProperties = [];\r\n for (let i = 0; i < odataObject.ExtensionProperties.length; i++) {\r\n if (odataObject.ExtensionProperties[i]) {\r\n if (odataObject.ExtensionProperties[i]['@odata.type']) {\r\n let className: string = odataObject.ExtensionProperties[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.ExtensionProperties[i] = new EntityClasses[className](odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n this.ExtensionProperties[i] = new EntityClasses.CommercePropertyClass(odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * MFIQualifyingItemDetails entity class.\r\n */\r\nexport class MFIQualifyingItemDetailsExtensionClass implements IMFIQualifyingItemDetails {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public QualifyingItemId: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public QualifyingProductId: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusProductQty: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusItems: IMFIBonusItemDetails[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.QualifyingItemId = odataObject.QualifyingItemId;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.QualifyingProductId = odataObject.QualifyingProductId;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusProductQty = odataObject.BonusProductQty ? parseFloat(odataObject.BonusProductQty) : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusItems = undefined;\r\n if (odataObject.BonusItems) {\r\n this.BonusItems = [];\r\n for (let i = 0; i < odataObject.BonusItems.length; i++) {\r\n if (odataObject.BonusItems[i]) {\r\n if (odataObject.BonusItems[i]['@odata.type']) {\r\n let className: string = odataObject.BonusItems[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.BonusItems[i] = new EntityClasses[className](odataObject.BonusItems[i]);\r\n }\r\n } else {\r\n this.BonusItems[i] = new MFIBonusItemDetailsExtensionClass(odataObject.BonusItems[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusItems[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * MFIBonusItemDetails entity class.\r\n */\r\nexport class MFIBonusItemDetailsExtensionClass implements IMFIBonusItemDetails {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusItemId: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusProductId: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Name: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public AdditionToCart: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public AdjustedPrice: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BasePrice: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public CustomerContextualPrice: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public DiscountAmount: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public DiscountTypeValue: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public DiscountType: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public DealPriceOrDiscountPercentage: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusCalculatedDiscountPrice: number;\r\n\r\n public PrimaryImageUrl: string;\r\n\r\n public ProductTypeValue: number;\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusItemId = odataObject.BonusItemId;\r\n\r\n this.PrimaryImageUrl = odataObject.PrimaryImageUrl;\r\n\r\n this.ProductTypeValue = odataObject.ProductTypeValue;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusProductId = odataObject.BonusProductId;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Name = odataObject.Name;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.AdditionToCart = odataObject.AdditionToCart;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.AdjustedPrice = odataObject.AdjustedPrice ? parseFloat(odataObject.AdjustedPrice) : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BasePrice = odataObject.BasePrice ? parseFloat(odataObject.BasePrice) : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.CustomerContextualPrice = odataObject.CustomerContextualPrice ? parseFloat(odataObject.CustomerContextualPrice) : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.DiscountAmount = odataObject.DiscountAmount ? parseFloat(odataObject.DiscountAmount) : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.DiscountTypeValue = odataObject.DiscountTypeValue;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.DiscountType = odataObject.DiscountType;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.DealPriceOrDiscountPercentage = odataObject.DealPriceOrDiscountPercentage\r\n ? parseFloat(odataObject.DealPriceOrDiscountPercentage)\r\n : 0;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusCalculatedDiscountPrice = odataObject.BonusCalculatedDiscountPrice\r\n ? parseFloat(odataObject.BonusCalculatedDiscountPrice)\r\n : 0;\r\n }\r\n}\r\n\r\n/**\r\n * MFIGetBonusCouponsDetailsResponse entity class.\r\n */\r\nexport class MFIGetBonusCouponsDetailsResponseExtensionClass implements IMFIGetBonusCouponsDetailsResponse {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusCoupons: IMFIBonusCouponsDetail[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusCoupons = undefined;\r\n if (odataObject.BonusCoupons) {\r\n this.BonusCoupons = [];\r\n for (let i = 0; i < odataObject.BonusCoupons.length; i++) {\r\n if (odataObject.BonusCoupons[i]) {\r\n if (odataObject.BonusCoupons[i]['@odata.type']) {\r\n let className: string = odataObject.BonusCoupons[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.BonusCoupons[i] = new EntityClasses[className](odataObject.BonusCoupons[i]);\r\n }\r\n } else {\r\n this.BonusCoupons[i] = new MFIBonusCouponsDetailExtensionClass(odataObject.BonusCoupons[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusCoupons[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * MFIBonusItemsResponse entity class.\r\n */\r\nexport class MFIBonusItemsResponseExtensionClass implements IMFIBonusItemsResponse {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusItemsDetails: IMFIBonusItemsDetailsEntity[];\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Message: string;\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusItemsDetails = undefined;\r\n if (odataObject.BonusItemsDetails) {\r\n this.BonusItemsDetails = [];\r\n for (let i = 0; i < odataObject.BonusItemsDetails.length; i++) {\r\n if (odataObject.BonusItemsDetails[i]) {\r\n if (odataObject.BonusItemsDetails[i]['@odata.type']) {\r\n let className: string = odataObject.BonusItemsDetails[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.BonusItemsDetails[i] = new EntityClasses[className](odataObject.BonusItemsDetails[i]);\r\n }\r\n } else {\r\n this.BonusItemsDetails[i] = new MFIBonusItemsDetailsEntityExtensionClass(odataObject.BonusItemsDetails[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusItemsDetails[i] = undefined;\r\n }\r\n }\r\n }\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Message = odataObject.Message;\r\n }\r\n}\r\n\r\n/**\r\n * MFIBonusCouponsDetail entity class.\r\n */\r\nexport class MFIBonusCouponsDetailExtensionClass implements IMFIBonusCouponsDetail {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusCoupon: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public BonusCouponMessage: string;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ChildCoupons: string[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusCoupon = odataObject.BonusCoupon;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.BonusCouponMessage = odataObject.BonusCouponMessage;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ChildCoupons = undefined;\r\n if (odataObject.ChildCoupons) {\r\n this.ChildCoupons = [];\r\n for (let i = 0; i < odataObject.ChildCoupons.length; i++) {\r\n if (odataObject.ChildCoupons[i]) {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ChildCoupons[i] = odataObject.ChildCoupons[i];\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ChildCoupons[i] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n * THIS FILE IS AN AUTOGENERATED TYPESCRIPT PROXY EXTENSION.\r\n * TO USE THIS FILE, IT MUST BE ADDED TO A D365COMMERCE APPLICATION\r\n */\r\n// tslint:disable\r\nimport { AsyncResult, callActionOrExecute, DataServiceQuery, IContext, IDataServiceRequest } from '@msdyn365-commerce/retail-proxy';\r\n// @ts-ignore\r\nimport * as EntityClasses from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport * as DataServiceEntities from '../actions/BonusItemDataServiceEntities.g';\r\n\r\n// @ts-ignore\r\nfunction bonusItemsQuery(id?: number): DataServiceQuery {\r\n const key = id ? { Id: id } : null;\r\n return new DataServiceQuery(\r\n 'BonusItems',\r\n 'MFIGetBonusItemsParameters',\r\n DataServiceEntities.MFIGetBonusItemsParametersExtensionClass,\r\n key\r\n );\r\n}\r\n\r\nexport function createMFIGetBonusCouponsDetailsInput(bonusCoupons: string): IDataServiceRequest {\r\n const query = bonusItemsQuery();\r\n return query.createDataServiceRequestForOperation(\r\n 'MFIGetBonusCouponsDetails',\r\n true,\r\n DataServiceEntities.MFIGetBonusCouponsDetailsResponseExtensionClass,\r\n 'false',\r\n { bypassCache: 'get', returnEntity: 'DataServiceEntities.IMFIGetBonusCouponsDetailsResponse' },\r\n { bonusCoupons: bonusCoupons }\r\n );\r\n}\r\n\r\nexport function mFIGetBonusCouponsDetailsAsync(\r\n context: IContext,\r\n bonusCoupons: string\r\n): AsyncResult {\r\n const request = createMFIGetBonusCouponsDetailsInput(bonusCoupons);\r\n return callActionOrExecute(request, context.callerContext);\r\n}\r\n\r\nexport function createMFIGetBonusItemsDetailInput(bonusItemParams: DataServiceEntities.IMFIGetBonusItemsParameters): IDataServiceRequest {\r\n const query = bonusItemsQuery();\r\n return query.createDataServiceRequestForOperation(\r\n 'MFIGetBonusItemsDetail',\r\n true,\r\n DataServiceEntities.MFIBonusItemsResponseExtensionClass,\r\n 'false',\r\n { bypassCache: 'get', returnEntity: 'DataServiceEntities.IMFIBonusItemsResponse' },\r\n { bonusItemParams: bonusItemParams }\r\n );\r\n}\r\n\r\nexport function mFIGetBonusItemsDetailAsync(\r\n context: IContext,\r\n bonusItemParams: DataServiceEntities.IMFIGetBonusItemsParameters\r\n): AsyncResult {\r\n const request = createMFIGetBonusItemsDetailInput(bonusItemParams);\r\n return callActionOrExecute(request, context.callerContext);\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\n/**\r\n * UserDefinedPromocode Input Action\r\n */\r\nexport class UserDefinedPromocodeInput implements Msdyn365.IActionInput {\r\n\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `userDefinedPromoCodes`;\r\n public getCacheObjectType = () => 'userDefinedPromoCodes';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IUserDefinedPromocodeData {\r\n userDefinedPromos: string[];\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new UserDefinedPromocodeInput();\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: UserDefinedPromocodeInput, ctx: Msdyn365.IActionContext): Promise {\r\n // const apiSettings = Msdyn365.msdyn365Commerce.apiSettings;\r\n\r\n // TODO: Uncomment the below line to get the value from a service\r\n // const response = await Msdyn365.sendRequest('/get/example/id/1', 'get');\r\n return { userDefinedPromos: [] };\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // TODO: Give your data action a unique id\r\n id: 'UserDefinedPromocode',\r\n input: createInput\r\n // TODO: Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMFIBonusItemsDetailsEntity } from '../actions/BonusItemDataServiceEntities.g';\r\n\r\n/**\r\n * MfrmNotification Input Action\r\n */\r\n\r\nexport class MFIbonusitemsInput implements Msdyn365.IActionInput {\r\n public getCacheKey = () => `mfibonusitems`;\r\n public getCacheObjectType = () => 'mfibonusitems';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\nexport interface IMFIBonusItems {\r\n bonusItems: IMFIBonusItemsDetailsEntity[] | undefined;\r\n}\r\n\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new MFIbonusitemsInput();\r\n};\r\n\r\nasync function action(input: MFIbonusitemsInput, ctx: Msdyn365.IActionContext): Promise {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const bonusItems: IMFIBonusItemsDetailsEntity[] | undefined = [];\r\n return bonusItems;\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n id: 'MFIbonusitems',\r\n input: createInput\r\n});\r\n\r\n","import { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nexport interface IPromoCodeAppliedOnCartState {\r\n isInProcess?: boolean;\r\n}\r\n\r\n/**\r\n * SampleState - action input\r\n */\r\nexport class PromoCodeAppliedOnCartInput implements IActionInput {\r\n public getCacheKey = () => `PromoCodeAppliedOnCartInput`;\r\n public getCacheObjectType = () => 'PromoCodeAppliedOnCartInput';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * SampleState - action\r\n */\r\nexport async function updatePromoCodeAppliedOnCartProgressAction(input: PromoCodeAppliedOnCartInput, ctx: IActionContext): Promise {\r\n return { isInProcess: undefined };\r\n}\r\n\r\n/**\r\n * SampleState - create new input for create action\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new PromoCodeAppliedOnCartInput();\r\n};\r\n\r\n/**\r\n * SampleState - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >updatePromoCodeAppliedOnCartProgressAction,\r\n input: createInput\r\n});","import MsDyn365, { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport dayjs from 'dayjs';\r\nimport Cookies from 'universal-cookie';\r\nimport { IMFIGetBonusCouponsDetailsResponse } from '../../../actions/BonusItemDataServiceEntities.g';\r\nimport { IMFICartLine, IMFICLDeliveryScheduleParameters } from '../../../actions/CoreProductDataServiceEntities.g';\r\nimport { hasArray } from '../../../Utilities/emtpyChecker';\r\nimport _getDeliveryByMessage from '../../../Utilities/get-delivery-by-message';\r\nimport { _getSoonestDeliveryDate } from '../../../Utilities/product-search-result-utils';\r\nimport { IProductBonusItems } from '../mfrm-cart';\r\nimport { IMfrmCartData } from '../mfrm-cart.data';\r\nimport { IMfrmCartProps } from '../mfrm-cart.props.autogenerated';\r\n\r\nexport interface IBasketCookieCartInfo {\r\n productId: number;\r\n itemId: string;\r\n quantity: number;\r\n}\r\nexport interface IBasketCookie {\r\n firstName?: string;\r\n lastName?: string;\r\n email?: string;\r\n phoneNumber?: string;\r\n address1?: string;\r\n address2?: string;\r\n cartId?: string;\r\n selectedDeliveryService?: number;\r\n EmailMeCheckbox?: boolean;\r\n cartDataInfo?: IBasketCookieCartInfo[];\r\n}\r\n\r\nexport interface IProductDetails {\r\n productQuantity?: string[];\r\n quantity?: string;\r\n subTotal?: string;\r\n}\r\n\r\nexport interface ICartProductUrl {\r\n productImageUrl?: string[];\r\n productURL?: string[];\r\n cartUrl?: string;\r\n}\r\n\r\nexport interface IProductDetailsData {\r\n quantity?: number | undefined;\r\n subTotal?: number | undefined;\r\n productQuantity?: string[];\r\n productSize?: string[];\r\n productIDsArray?: string[];\r\n productNameArray?: string[];\r\n productPriceArray?: string[];\r\n variantRecord?: (string | undefined)[]\r\n productCatgoryArray?: (string | undefined)[]\r\n productBrandName?: (string | undefined)[]\r\n productDiscountArray?: (string | undefined)[]\r\n cartProductPriceArray?: string[];\r\n\r\n\r\n}\r\n\r\nexport const isOneOfChildBonusCoupons = (discountCode: string, appliedCoupon: string) => {\r\n if (MsDyn365.isBrowser) {\r\n const getLocalstorageBonusCoupons = localStorage.getItem('bonusCouponsDetail');\r\n if (getLocalstorageBonusCoupons) {\r\n const bonusCouponsArray: IMFIGetBonusCouponsDetailsResponse[] = getLocalstorageBonusCoupons && JSON.parse(getLocalstorageBonusCoupons);\r\n // props.data.cartLine.DiscountLines && props.data.cartLine.DiscountLines.map((userDefinePromo) => {\r\n for (const bonusCoupons of bonusCouponsArray) {\r\n // bonusCouponsArray.map((bonusCoupons) => {\r\n if (bonusCoupons.BonusCoupons) {\r\n for (const coupons of bonusCoupons.BonusCoupons) {\r\n // bonusCoupons.BonusCoupons?.map((coupons) => {\r\n if ((coupons.BonusCoupon === appliedCoupon) && coupons.ChildCoupons) {\r\n for (const childCoupons of coupons.ChildCoupons) {\r\n // coupons.ChildCoupons?.map((childCoupons) => {\r\n if (childCoupons === discountCode) {\r\n return true;\r\n }\r\n // });\r\n }\r\n }\r\n // });\r\n }\r\n }\r\n // });\r\n }\r\n // });\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const _coreProductATPCall = async (props: IMfrmCartProps, recordId: number, itemId: string | undefined, quantity: number): Promise => {\r\n const { context } = props;\r\n const cookies = new Cookies();\r\n const zipcode = cookies.get('zip_code');\r\n const itemLinesArray = [];\r\n\r\n const itemLines: IMFICartLine = {\r\n ItemId: itemId,\r\n Quantity: quantity,\r\n VariantRecordId: recordId.toString()\r\n };\r\n\r\n itemLinesArray.push(itemLines);\r\n const date = new Date();\r\n const currentDate = date.setDate(date.getDate());\r\n const requestBody: IMFICLDeliveryScheduleParameters = {\r\n InventoryType: 'Delivery',\r\n Weeks: props.context.app.config.weeksPDPforATPCall,\r\n StoreId: '',\r\n Page: 'pdp',\r\n RequestedDate: dayjs(currentDate).format('MM/DD/YYYY'),\r\n ZipCode: zipcode,\r\n ItemLines: itemLinesArray\r\n };\r\n let outOfMarket = '';\r\n const outOfMarketMsg = props.context.app.config.responseMessageForItemOutOfMarketZip;\r\n const msgOutOfMarket = outOfMarketMsg?.slice(0, 38);\r\n const result = await _getDeliveryByMessage(requestBody, context, false);\r\n const resultmMSg = result?.Message?.slice(12, 50);\r\n if (msgOutOfMarket === resultmMSg || props.context.app.config.responseMessageForItemOutOfMarketOOZ === resultmMSg?.slice(0, 31)) {\r\n outOfMarket = 'yes';\r\n }\r\n const deliveryDetails = (result?.ATPInventoryData && result?.ATPInventoryData.length > 0) ? _getSoonestDeliveryDate(result?.ATPInventoryData) : undefined;\r\n let msg = deliveryDetails ? deliveryDetails.deliveryByMessage : props.context.app.config.defaultDeliveryMessage ? props.context.app.config.defaultDeliveryMessage : '';\r\n if (msg === undefined || msg === '') {\r\n msg = props.context.app.config.defaultDeliveryMessage;\r\n }\r\n return `${itemId ? itemId : ''},${recordId.toString()},${msg} ,${outOfMarket},${deliveryDetails?.locationId}`;\r\n\r\n};\r\n\r\nexport const _coreProductATPCallCheckForOOM = async (context: ICoreContext>, recordId: number, itemId: string | undefined, quantity: number, updatedZipCode: string): Promise => {\r\n const cookies = new Cookies();\r\n const zipcode = (updatedZipCode && updatedZipCode.length > 0 && updatedZipCode !== '00000') ? updatedZipCode : cookies.get('zip_code');\r\n const itemLinesArray = [];\r\n\r\n const itemLines: IMFICartLine = {\r\n ItemId: itemId,\r\n Quantity: quantity,\r\n VariantRecordId: recordId.toString()\r\n };\r\n\r\n itemLinesArray.push(itemLines);\r\n const date = new Date();\r\n const currentDate = date.setDate(date.getDate());\r\n const requestBody: IMFICLDeliveryScheduleParameters = {\r\n InventoryType: 'Delivery',\r\n Weeks: context.app.config.weeksPDPforATPCall,\r\n StoreId: '',\r\n Page: 'pdp',\r\n RequestedDate: dayjs(currentDate).format('MM/DD/YYYY'),\r\n ZipCode: zipcode,\r\n ItemLines: itemLinesArray\r\n };\r\n let outOfMarket = '';\r\n const outOfMarketMsg = context.app.config.responseMessageForItemOutOfMarketZip;\r\n const msgOutOfMarket = outOfMarketMsg?.slice(0, 38);\r\n const result = await _getDeliveryByMessage(requestBody, context, false);\r\n const resultmMSg = result?.Message?.slice(12, 50);\r\n if (msgOutOfMarket === resultmMSg || context.app.config.responseMessageForItemOutOfMarketOOZ === resultmMSg?.slice(0, 31)) {\r\n outOfMarket = 'yes';\r\n }\r\n\r\n const deliveryDetails = (result?.ATPInventoryData && result?.ATPInventoryData.length > 0) ? _getSoonestDeliveryDate(result?.ATPInventoryData) : undefined;\r\n\r\n let msg = deliveryDetails ? deliveryDetails.deliveryByMessage : context.app.config.defaultDeliveryMessage ? context.app.config.defaultDeliveryMessage : '';\r\n if (msg === undefined || msg === '') {\r\n msg = context.app.config.defaultDeliveryMessage;\r\n }\r\n return `${itemId ? itemId : ''},${recordId.toString()},${msg} ,${outOfMarket},${deliveryDetails?.locationId}`;\r\n\r\n};\r\n\r\nconst findIndexOfItemInArray = (cartLines: CartLine[], prodId: string) => {\r\n if (cartLines && cartLines.length) {\r\n for (let c = 0; c < cartLines.length; c++) {\r\n if (cartLines[c].ProductId?.toString() === prodId) {\r\n return c;\r\n }\r\n }\r\n }\r\n return -1;\r\n};\r\nconst arraymove = (arr: CartLine[], fromIndex: number, toIndex: number) => {\r\n const element = arr[fromIndex];\r\n arr.splice(fromIndex, 1);\r\n arr.splice(toIndex, 0, element);\r\n return arr;\r\n};\r\nexport const reshuffleItems = (cartLines: CartLine[]) => {\r\n const cls: CartLine[] = cartLines;\r\n if (MsDyn365.isBrowser) {\r\n const bonusItemsInfoStr = localStorage.getItem('BonusItemProduct');\r\n if (bonusItemsInfoStr && bonusItemsInfoStr.length) {\r\n const bonusItems = JSON.parse(bonusItemsInfoStr);\r\n if (bonusItems && bonusItems.length) {\r\n const testVarStruct = bonusItems;\r\n for (const obj of testVarStruct) {\r\n const deets = obj.BonusItemsDetails;\r\n for (const dt of deets) {\r\n // const coupon = dt.Coupon;\r\n const itms = dt.Items;\r\n for (const it of itms) {\r\n const items = it.BonusItems;\r\n // const qItemId = it.QualifyingItemId;\r\n // const qpId = it.QualifyingProductId;\r\n for (const itm of items) {\r\n // itm.QualifyingItemId = qItemId;\r\n // itm.Coupon = coupon;\r\n // itm.QualifyingProductId = qpId;\r\n for (let c = 0; c < cls.length; c++) {\r\n if (cls[c].ProductId?.toString() === itm.BonusProductId) {\r\n const getLocalStorage = localStorage.getItem('selectedBonasItems');\r\n let selectedBonusItemArray: IProductBonusItems[] = [];\r\n if (getLocalStorage) {\r\n selectedBonusItemArray = JSON.parse(getLocalStorage);\r\n }\r\n let isSelectedManually = false;\r\n if (hasArray(selectedBonusItemArray)) {\r\n for (const sbi of selectedBonusItemArray) {\r\n if (hasArray(sbi.children)) {\r\n for (const childd of sbi.children) {\r\n if ((childd.BonusProductId?.toString() === itm.BonusProductId) && sbi.parentId) {\r\n const prodIndex = findIndexOfItemInArray(cls, sbi.parentId.toString());\r\n arraymove(cls, c, prodIndex + 1);\r\n isSelectedManually = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!isSelectedManually) {\r\n const prodIndex = findIndexOfItemInArray(cls, itm.QualifyingProductId);\r\n arraymove(cls, c, prodIndex + 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return cls;\r\n};\r\n\r\nexport const getSetBasketCookie = (method: string, context: ICoreContext<{ [x: string]: any; }>, basketCookieData?: IBasketCookie, cartLines?: CartLine[]) => {\r\n const cookie = new Cookies();\r\n if (method === 'get') {\r\n return cookie.get('mfrm_basket_cookie');\r\n } else {\r\n const date = new Date();\r\n const cartSessionExpiration = (context.app && context.app.platform && context.app.platform.cartSessionExpiration) || 0;\r\n try {\r\n if (basketCookieData) {\r\n const cartSessionExpirationDateInDays = parseInt(cartSessionExpiration, 10);\r\n date.setDate(date.getDate() + cartSessionExpirationDateInDays);\r\n if (cartLines) {\r\n const cartDataInfo: IBasketCookieCartInfo[] = [];\r\n for (const cln of cartLines) {\r\n cartDataInfo.push({ productId: cln.ProductId ? cln.ProductId : -1, itemId: cln.ItemId ? cln.ItemId : '', quantity: cln.Quantity ? cln.Quantity : 0 });\r\n }\r\n basketCookieData.cartDataInfo = cartDataInfo;\r\n }\r\n cookie.set('mfrm_basket_cookie', basketCookieData, { expires: date });\r\n const cartId = cookie.get('_msdyn365___cart_');\r\n cookie.set('_msdyn365___cart_', cartId, { expires: date });\r\n cookie.set('last_cart_expiry_time', date);\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return basketCookieData;\r\n};\r\n\r\nexport const resetBasketCookie = () => {\r\n const cookie = new Cookies();\r\n const date = new Date();\r\n date.setDate(date.getDate() - 1);\r\n cookie.set('mfrm_basket_cookie', {}, { expires: date });\r\n};\r\n\r\n\r\nexport const setTealiumCartVariables = (name: string, context: ICoreContext<{ [x: string]: any; }>, productDetails?: IProductDetails | IProductDetailsData | ICartProductUrl) => {\r\n const cookie = new Cookies();\r\n const date = new Date();\r\n const cartSessionExpiration = (context.app && context.app.platform && context.app.platform.cartSessionExpiration) || 0;\r\n try {\r\n if (productDetails) {\r\n const cartSessionExpirationDateInDays = parseInt(cartSessionExpiration, 10);\r\n date.setDate(date.getDate() + cartSessionExpirationDateInDays);\r\n cookie.set(`${name}`, productDetails, { expires: date });\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n return setTealiumCartVariables;\r\n};","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IProductSpecificationData } from '@msdyn365-commerce-modules/product-specification/src/modules/product-specification/product-specification.data';\r\nimport { getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, DiscountLine, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\n/* VSI customization START */\r\nimport { IMFIBonusCouponsDetail, IMFIBonusItemDetails, IMFIBonusItemsResponse, IMFIGetBonusCouponsDetailsResponse } from '../../../../actions/BonusItemDataServiceEntities.g';\r\nimport {IProductWithAttribute} from '../../../../data-actions/get-product-attributes-cartlines';\r\nimport { ICoreDeliveryByMessage, IProductBonusItems, IProductBonusWithBrandName } from '../../../../modules/mfrm-cart/mfrm-cart';\r\nimport {hasArray} from '../../../../Utilities/emtpyChecker';\r\nimport {parseBrandName} from '../../../../Utilities/get-product-brand';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { isOneOfChildBonusCoupons } from '../../../../modules/mfrm-cart/utils/cart-utils';\r\n/* VSI customization END */\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** String for amount key */\r\n amountString?: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n /** display string for product link */\r\n productPageLinkAriaLabel: string;\r\n /** Aria label for the decrement button in quanitity component */\r\n decrementButtonAriaLabel?: string;\r\n /** Aria label for the increment button in quanitity component */\r\n incrementButtonAriaLabel?: string;\r\n /** original text screenreader */\r\n originalPriceText: string;\r\n /** current text screenreader */\r\n currentPriceText: string;\r\n /** shipping Charges Text */\r\n shippingChargesText: string;\r\n /** Outofstock text Text */\r\n outOfStockMsgText: string;\r\n /** remove from cart Text */\r\n removeFromCartText: string;\r\n /** similar available products Text */\r\n similarAvailableProductText: string;\r\n /** Aria Label Text for product */\r\n productAriaText: string;\r\n variantAriaText: string;\r\n promoAriaText: string;\r\n priceAriaText: string;\r\n discountPercentageAriaText: string;\r\n editGiftCtaText: string;\r\n dialogAriaText: string;\r\n removeButtonAriaText: string;\r\n appliedPromoText: string;\r\n notAppliedPromoText: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product?: SimpleProduct;\r\n productSpecification?: IProductSpecificationData;\r\n productAttributes: IProductWithAttribute[] | undefined;\r\n}\r\n\r\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n /** Error message to show in place of quantity */\r\n errorMessage?: string;\r\n /** Display mode to use */\r\n displayMode?: CartLineDisplayMode;\r\n /** Inventory information label */\r\n inventoryInformationLabel?: string;\r\n /** Inventory information class name */\r\n inventoryLabelClassName?: string;\r\n /** Flag to show/hide shipping charges for line items */\r\n showShippingChargesForLineItems?: boolean;\r\n /** Boolean flag to indicate if cart state status is ready */\r\n isCartStateReady?: boolean;\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n /* VSI customization START */\r\n bonusItemsProductDetails?: IMFIBonusItemsResponse[];\r\n GiftCtaButton?: boolean;\r\n mfrmCtaGiftText?: string;\r\n mfrmBonusModalHeading?: string;\r\n mfrmBonusSubHeading?: string;\r\n mfrmBonusAppliedCodeText?: string;\r\n mfrmAddItemToCartText?: string;\r\n sendStateValue?: IProductBonusItems[];\r\n productId?: number;\r\n deliveryByMessagesCore: ICoreDeliveryByMessage[];\r\n deliveryByMessageSPDS: ICoreDeliveryByMessage[];\r\n hideDeliveryMessage:boolean;\r\n // tslint:disable-next-line\r\n ctaGiftHandler?(cartLine: CartLine, actionContext: any): void;\r\n recievedBonusProductFromCartLine?(productId: number | undefined, bonusModalProduct: IMFIBonusItemDetails[], productQuantityCount: number): void;\r\n setCartLine?(obj: IProductBonusItems): void;\r\n /* VSI customization END */\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n onEditGift?(): void;\r\n}\r\n\r\ninterface IDimensionStrings {\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** String for amount key */\r\n amountString?: string;\r\n}\r\n\r\nconst isQualifying = (cl: CartLine, coupon: string): boolean => {\r\n const getLocalStorage = localStorage.getItem('BonusItemProduct');\r\n let bonusItemArray: IMFIBonusItemsResponse[] = [];\r\n if (getLocalStorage) {\r\n const localStorageBonusInfo = getLocalStorage && JSON.parse(getLocalStorage);\r\n // get bonus item array from localstorage\r\n if(!hasArray(localStorageBonusInfo)) {\r\n if(localStorageBonusInfo && hasArray(localStorageBonusInfo.BonusItemsDetails)) {\r\n bonusItemArray = [localStorageBonusInfo];\r\n }\r\n } else {\r\n bonusItemArray = localStorageBonusInfo;\r\n }\r\n if(!hasArray(bonusItemArray)) {\r\n return false;\r\n }\r\n // get bonus item array from localstorage\r\n for(const bonusItemsArray of bonusItemArray) {\r\n // bonusItemArray.map((bonusItemsArray) => {\r\n // bonus product array against applied promocode\r\n if(bonusItemArray && bonusItemsArray.BonusItemsDetails) {\r\n for(const bonusItemDetail of bonusItemsArray.BonusItemsDetails) {\r\n // bonusItemsArray.BonusItemsDetails?.map((bonusItemDetail) => {\r\n // bonus item details array with items of parent product\r\n if(bonusItemDetail && bonusItemDetail.Items && (bonusItemDetail.Coupon?.toUpperCase() === coupon.toUpperCase())) {\r\n for(const item of bonusItemDetail.Items) {\r\n // bonusItemDetail.Items?.map((item) => {\r\n // check if cartlineId is equal to parent or qualifying Id\r\n if (item.QualifyingItemId === cl.ItemId && item.QualifyingProductId?.toString() === cl.ProductId?.toString()) {\r\n return true;\r\n }\r\n // });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\nexport const _isABonusCoupon = (appliedPromoCoupons: string): boolean => {\r\n let checkBonusCoupons: boolean | undefined = false;\r\n const getLocalstorageBonusCoupons = localStorage.getItem('bonusCouponsDetail');\r\n if (getLocalstorageBonusCoupons) {\r\n const bonusCouponsArray: IMFIGetBonusCouponsDetailsResponse[] = getLocalstorageBonusCoupons && JSON.parse(getLocalstorageBonusCoupons);\r\n bonusCouponsArray?.map(coupons => {\r\n checkBonusCoupons = coupons.BonusCoupons?.some(item => item.BonusCoupon?.toUpperCase() === appliedPromoCoupons.toUpperCase() || (item.BonusCoupon && isOneOfChildBonusCoupons(appliedPromoCoupons, item.BonusCoupon)));\r\n return checkBonusCoupons;\r\n });\r\n }\r\n return checkBonusCoupons;\r\n};\r\n\r\nconst getUniqueCouponsString = (props: ICartLineProps, isGiftCoupon?: IMFIBonusCouponsDetail[], discountLines?: DiscountLine[]) => {\r\n const couponsStringArray: string[] = [];\r\n if(hasArray(isGiftCoupon) && hasArray(discountLines)) {\r\n discountLines?.map((discountLine, index) => {\r\n isGiftCoupon?.map((coupons, ind) => {\r\n if(!(coupons.BonusCoupon && isQualifying(props.data.cartLine, coupons.BonusCoupon) && _isABonusCoupon(coupons.BonusCoupon))) {\r\n let promoStr = '';\r\n const bonusCouponStr = discountLine.DiscountCode && (discountLine.DiscountCode === coupons.BonusCoupon || (coupons.BonusCoupon && _isABonusCoupon(coupons.BonusCoupon) && isOneOfChildBonusCoupons(discountLine.DiscountCode, coupons.BonusCoupon))) && (discountLine.EffectiveAmount && discountLine.EffectiveAmount > 0) ? (coupons.BonusCoupon ? coupons.BonusCoupon : '') : '';\r\n const str = `${bonusCouponStr} ${(discountLine.DiscountCode && (discountLine.DiscountCode === coupons.BonusCoupon || (coupons.BonusCoupon && _isABonusCoupon(coupons.BonusCoupon) && isOneOfChildBonusCoupons(discountLine.DiscountCode, coupons.BonusCoupon))) && (discountLine.EffectiveAmount && discountLine.EffectiveAmount > 0)? `${props.resources.appliedPromoText}` : '')}`;\r\n promoStr = promoStr + str;\r\n if(!couponsStringArray.includes(promoStr)) {\r\n couponsStringArray.push(promoStr);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n return couponsStringArray;\r\n};\r\nconst CartLineItemFunctions = {\r\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n if (!Product || !Product.Dimensions) {\r\n return [];\r\n }\r\n return Product.Dimensions.map((productDimension, index) => {\r\n const addComma = (Product && Product.Dimensions && Product.Dimensions.length > 1 && (Product.Dimensions.length - 2) === index) ? '' : ' ,';\r\n if (productDimension.DimensionTypeValue === 1) {\r\n return (\r\n
\r\n {/** VSI Customization - Start - 14-12-2020 */}\r\n {/** Commented span for label in cart variants */}\r\n {/* {DimensionStrings.colorString} */}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n {/* */}\r\n {addComma}\r\n {/** VSI Customzation - End - 14-12-2020 */}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n
\r\n {/** VSI Customization - Start - 14-12-2020 */}\r\n {/** Commented span for label in cart variants */}\r\n {/* {DimensionStrings.configString} */}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n {/* */}\r\n {addComma}\r\n {/** VSI Customzation - End - 14-12-2020 */}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n
\r\n {/** VSI Customization - Start - 14-12-2020 */}\r\n {/** Commented span for label in cart variants */}\r\n {/* {DimensionStrings.sizeString} */}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n {/* */}\r\n {addComma}\r\n {/** VSI Customzation - End - 14-12-2020 */}\r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n
\r\n {/** VSI Customization - Start - 14-12-2020 */}\r\n {/** Commented span for label in cart variants */}\r\n {/* {DimensionStrings.styleString} */}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n {/* */}\r\n {addComma}\r\n {/** VSI Customzation - End - 14-12-2020 */}\r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n getProductVariants: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n return Product.Dimensions?.map((productDimension) => {\r\n switch (productDimension.DimensionTypeValue) {\r\n case 2:\r\n case 4:\r\n return '';\r\n default:\r\n return productDimension.DimensionValue && productDimension.DimensionValue.Value;\r\n }\r\n });\r\n },\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n const isGiftCoupon: IMFIBonusCouponsDetail[] = [];\r\n let bonusCouponsArray: IMFIGetBonusCouponsDetailsResponse[] = [];\r\n let flagBonus: boolean = false;\r\n if(MsDyn365.isBrowser) {\r\n const getLocalstorageBonusCoupons = localStorage.getItem('bonusCouponsDetail');\r\n if (getLocalstorageBonusCoupons) {\r\n bonusCouponsArray = getLocalstorageBonusCoupons && JSON.parse(getLocalstorageBonusCoupons);\r\n props.data.cartLine.DiscountLines && props.data.cartLine.DiscountLines.map((userDefinePromo) => {\r\n flagBonus = false;\r\n bonusCouponsArray.map((bonusCoupons) => {\r\n bonusCoupons.BonusCoupons?.map((coupons) => {\r\n if (coupons.BonusCoupon === userDefinePromo.DiscountCode) {\r\n isGiftCoupon.push(coupons);\r\n } else {\r\n coupons.ChildCoupons?.map((childCoupons) => {\r\n if (childCoupons === userDefinePromo.DiscountCode) {\r\n flagBonus = true;\r\n if (isGiftCoupon.indexOf(coupons) === -1) {\r\n isGiftCoupon.push(coupons);\r\n }\r\n }\r\n });\r\n }\r\n\r\n return [];\r\n });\r\n });\r\n const defaultBonus: IMFIBonusCouponsDetail = {\r\n BonusCoupon: userDefinePromo.DiscountCode\r\n };\r\n if (isGiftCoupon.indexOf(defaultBonus) === -1) {\r\n !flagBonus && isGiftCoupon.push(defaultBonus);\r\n }\r\n });\r\n }\r\n }\r\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\r\n return null;\r\n }\r\n const uniqueCoupons = getUniqueCouponsString(props, isGiftCoupon, props.data.cartLine.DiscountLines);\r\n return (\r\n <>\r\n {uniqueCoupons.map((coupons, ind) => {\r\n return (\r\n
\r\n \r\n {coupons}\r\n \r\n
\r\n );\r\n })\r\n }\r\n \r\n );\r\n },\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n if (!props.inventoryInformationLabel) {\r\n return null;\r\n }\r\n const inventoryCssName = props.inventoryLabelClassName ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}` : 'msc-cart-line__product-inventory-label';\r\n return (\r\n {props.inventoryInformationLabel}\r\n );\r\n },\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!cartline.DeliveryMode && channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode) ? true : false;\r\n } else {\r\n hasShippingMethod = !!cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode ? true : false;\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (shippingChargeLines.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\r\n }, 0);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n \r\n {priceComponent}\r\n \r\n \r\n );\r\n },\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter((chargeline) => !chargeline.IsShipping);\r\n\r\n return otherCharges && otherCharges.map((otherCharge, key) => {\r\n return otherCharge && otherCharge.CalculatedAmount ? (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n ) : '';\r\n }) || undefined;\r\n }\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length cyclomatic-complexity\r\nconst CartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine, productAttributes } = props.data;\r\n const [isShowProductModal, setIsShowProductModal] = React.useState(false);\r\n const promoRef = React.useRef(null);\r\n // const [selectedBonusItems, setselectedBonusItems] = React.useState(props?.sendStateValue);\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const imageSettings = props.imageSettings;\r\n imageSettings.cropFocalRegion = !ObjectExtensions.isNullOrUndefined(imageSettings);\r\n const { inputQuantityAriaLabel, productPageLinkAriaLabel, productAriaText, variantAriaText, promoAriaText, priceAriaText, discountPercentageAriaText, discountStringText, editGiftCtaText, dialogAriaText } = props.resources;\r\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const productDimensionVariants = product && CartLineItemFunctions.getProductVariants(product, destructDimensionStrings)?.toString();\r\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const attr = hasArray(productAttributes)?.find(p => p?.productId === product?.RecordId)?.attributeValue;\r\n const brandName = parseBrandName(attr, props.context.app.config.brandBackofficeAttributePdp, product?.RecordId);\r\n const productWithBrandName = product ? brandName ? `${brandName} ${product.Name}` : product.Name : cartLine.Description;\r\n if(MsDyn365.isBrowser) {\r\n const getALLCouponsDetailsWithoutParse = localStorage.getItem('bonusCouponsDetail');\r\n const getALLCouponsDetailsWithParse: IMFIGetBonusCouponsDetailsResponse[] = [];\r\n getALLCouponsDetailsWithParse.push(getALLCouponsDetailsWithoutParse && JSON.parse(getALLCouponsDetailsWithoutParse));\r\n }\r\n let bonusItemArray: IMFIBonusItemsResponse[] = [];\r\n let bonusItemProduct: boolean = false;\r\n let editGiftCta: boolean = false;\r\n let showModal: boolean = false;\r\n let parentProduct: boolean = false;\r\n const alredySelectedInModal: IMFIBonusItemDetails[] = [];\r\n\r\n const _generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n {props.errorMessage}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(props.data.cartLine, parseInt(event.target.value, 10));\r\n }\r\n };\r\n\r\n const _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n\r\n // tslint:disable-next-line:react-a11y-role-has-required-aria-props\r\n nodes.push();\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (quantity: number, currentQuantity: number | undefined): JSX.Element => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n /* VSI Customization - Start - 14-12-2020 */\r\n /** Added this fucntion for formatting of prices */\r\n const formatCurrency = (price: number | undefined): string | undefined => {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price);\r\n };\r\n /** VSI Customization - Start */\r\n\r\n if (props.bonusItemsProductDetails && props.bonusItemsProductDetails.length === 0) {\r\n if(MsDyn365.isBrowser) {\r\n const getLocalstorage = localStorage.getItem('BonusItemProduct');\r\n if (getLocalstorage) {\r\n bonusItemArray = JSON.parse(getLocalstorage);\r\n }\r\n }\r\n } else {\r\n if (props.bonusItemsProductDetails) {\r\n bonusItemArray = props.bonusItemsProductDetails;\r\n }\r\n }\r\n const BonusDetailsArray: IMFIBonusItemsResponse[] = bonusItemArray;\r\n hasArray(bonusItemArray)?.map((bonusitemdetail: IMFIBonusItemsResponse) => {\r\n bonusitemdetail.BonusItemsDetails?.map((bonusitem) => {\r\n\r\n // Map on child Bonus items if availible\r\n bonusitem.Items?.map((item) => {\r\n if (item.QualifyingItemId === cartLine.ItemId) {\r\n parentProduct = true;\r\n // addGiftCTA = true;\r\n // setAddtoCart(true);\r\n }\r\n\r\n // Map on child Bonus items if availible\r\n item.BonusItems?.map((currentItem) => {\r\n if (currentItem.BonusItemId === cartLine.ItemId && currentItem.BonusProductId?.toString() === cartLine.ProductId?.toString()) {\r\n alredySelectedInModal.push(currentItem);\r\n if (cartLine.DiscountLines && cartLine.DiscountLines.length > 0) {\r\n for(const dl of props.data.cartLine.DiscountLines!) {\r\n if(dl.DiscountCode && dl.DiscountCode.length && (_isABonusCoupon(dl.DiscountCode))) {\r\n bonusItemProduct = true;\r\n }\r\n }\r\n }\r\n if (currentItem.AdditionToCart === 'Manual') {\r\n if (cartLine.DiscountLines && cartLine.DiscountLines.length > 0) {\r\n for(const dl of props.data.cartLine.DiscountLines!) {\r\n if(dl.DiscountCode && dl.DiscountCode.length && _isABonusCoupon(dl.DiscountCode)) {\r\n editGiftCta = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n const trueProductModal = () => {\r\n setIsShowProductModal(true);\r\n };\r\n const falseProductModal = () => {\r\n setIsShowProductModal(false);\r\n };\r\n\r\n // Add gift CTA handler for bonus product\r\n const _addGiftItems = () => {\r\n if (props.ctaGiftHandler) {\r\n props.ctaGiftHandler(props.data?.cartLine, props.context);\r\n const getLocalStorage = localStorage.getItem('BonusItemProduct');\r\n let bonusItemArrayForModal: IMFIBonusItemsResponse[] = [];\r\n // let showModal:boolean = false;\r\n if (getLocalStorage) {\r\n bonusItemArrayForModal = JSON.parse(getLocalStorage);\r\n bonusItemArrayForModal?.map((bonusitemdetail) => {\r\n bonusitemdetail.BonusItemsDetails?.map((bonusitem) => {\r\n bonusitem.Items?.map((item) => {\r\n item.BonusItems?.map(async (productItem) => {\r\n if (productItem.AdditionToCart === 'Manual') {\r\n showModal = true;\r\n }\r\n });\r\n });\r\n });\r\n });\r\n if (showModal) {\r\n trueProductModal();\r\n }\r\n }\r\n }\r\n if(props.onEditGift) {\r\n props.onEditGift();\r\n }\r\n };\r\n\r\n const _renderImages = (BonusProduct: IMFIBonusItemDetails) => {\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=95&h=76&m=6`, w: 0, h: 0 }\r\n },\r\n disableLazyLoad: true\r\n };\r\n if (BonusProduct) {\r\n const bonusFallbackImageUrl = getFallbackImageUrl(BonusProduct.BonusItemId, props.context.actionContext.requestContext.apiSettings);\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n let totalBonusSelectedItems: number;\r\n let userSelectedItems: number | undefined;\r\n let productParentQuantityCount: number = 1;\r\n let couponsApplied: string | undefined;\r\n let selectedParentProduct: IProductBonusItems = { parentId: undefined, children: [] };\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n const _createModal = () => {\r\n let parentId: number | undefined = props?.productId;\r\n let parentState: IProductBonusItems[] | undefined = props?.sendStateValue;\r\n if (isShowProductModal) {\r\n // tslint:disable-next-line: max-line-length\r\n BonusDetailsArray.map((bonusDetails) => bonusDetails.BonusItemsDetails?.map((bonusItemDetails) => bonusItemDetails.Items?.map((items) => items.BonusItems?.sort((previousDiscountedPrice,nextDiscountedPrice)=> previousDiscountedPrice.BonusCalculatedDiscountPrice - nextDiscountedPrice.BonusCalculatedDiscountPrice).map((bonusitem) => {\r\n if (Number(bonusitem?.BonusProductId) === props?.productId) {\r\n parentId = Number(items?.QualifyingProductId);\r\n }\r\n }))));\r\n if (parentId) {\r\n props?.sendStateValue && props?.sendStateValue.length > 0 && props?.sendStateValue?.map(obj => {\r\n if (parentId === Number(obj?.parentId)) {\r\n selectedParentProduct = obj;\r\n }\r\n });\r\n } else {\r\n parentId = props?.productId;\r\n parentState = props?.sendStateValue;\r\n }\r\n }\r\n let showProductModalLocal = true;\r\n hasArray(BonusDetailsArray)?.map((bonusDetails: IMFIBonusItemsResponse) => bonusDetails.BonusItemsDetails?.map((bonusItemDetails) => {\r\n if(bonusItemDetails.Items && bonusItemDetails.Items.length && bonusItemDetails.Items.length > 0) {\r\n bonusItemDetails.Items.map((bonusItem) => {\r\n if(parentId && bonusItem.QualifyingProductId === parentId.toString()) {\r\n couponsApplied = bonusItemDetails.Coupon;\r\n bonusItem.BonusItems && bonusItem.BonusItems.length && bonusItem.BonusItems.map((bonusProduct) => {\r\n if(bonusProduct.AdditionToCart === 'Auto') {\r\n showProductModalLocal = false;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }));\r\n\r\n if(!showProductModalLocal) {\r\n return ('');\r\n }\r\n return (isShowProductModal && (\r\n \r\n \r\n \r\n

{props.mfrmBonusModalHeading}

\r\n

{props.mfrmBonusSubHeading} {props.mfrmBonusAppliedCodeText} {couponsApplied}

\r\n
\r\n {BonusDetailsArray.map((bonusDetails) => bonusDetails.BonusItemsDetails?.map((bonusItemDetails) => bonusItemDetails.Items?.map((items) => {\r\n !selectedParentProduct?.parentId && parentState && parentState.length > 0 && parentState?.map(obj => {\r\n if (parentId === Number(obj?.parentId)) {\r\n selectedParentProduct = obj;\r\n }\r\n });\r\n if (Number(items?.QualifyingProductId) === parentId) {\r\n return items.BonusItems?.map((bonusitem) => {\r\n const selected = selectedParentProduct && selectedParentProduct.children.filter(itemsSelected => itemsSelected.BonusProductId === bonusitem.BonusProductId);\r\n totalBonusSelectedItems = items.BonusProductQty;\r\n userSelectedItems = selectedParentProduct?.children?.length;\r\n if (items.QualifyingItemId === cartLine.ItemId && cartLine.Quantity) {\r\n productParentQuantityCount = cartLine.Quantity;\r\n }\r\n let productBrandName = '';\r\n const getLocalStorage = localStorage.getItem('bonusItmesWithBrand');\r\n let bonusItemBrandArray: IProductBonusWithBrandName[] = [];\r\n if (getLocalStorage) {\r\n bonusItemBrandArray = JSON.parse(getLocalStorage);\r\n }\r\n const checkBrandName = bonusItemBrandArray.find(item => item.productId === Number(bonusitem.BonusProductId))?.brandName;\r\n if(checkBrandName) {\r\n productBrandName = checkBrandName;\r\n }\r\n // userSelectedItems === totalBonusSelectedItems ? addGiftCTA = false : addGiftCTA = true;\r\n // const slectedClass = selected && selected.length > 0 ? 'selected msc-gift__bonus-block' : (userSelectedItems === totalBonusSelectedItems && selected && selected.length === 0) ? 'disabled msc-gift__bonus-block' : 'msc-gift__bonus-block';\r\n const slectedClass = selected && selected.length > 0 ? 'selected msc-gift__bonus-block' : (userSelectedItems === totalBonusSelectedItems && selected && selected.length === 0) ? 'msc-gift__bonus-block' : 'msc-gift__bonus-block';\r\n\r\n return (\r\n // tslint:disable-next-line: jsx-no-lambda max-line-length\r\n // \r\n );\r\n });\r\n } else {\r\n return;\r\n }\r\n })))}\r\n
\r\n
\r\n \r\n
{userSelectedItems} of {totalBonusSelectedItems} items selected
\r\n
\r\n _sendBonusProductToCart(parentState, parentId)}\r\n >\r\n {props.mfrmAddItemToCartText}\r\n \r\n
\r\n
\r\n \r\n ));\r\n };\r\n\r\n const _selectedProductBonusItemsWithParentKey = (selectedArr: IProductBonusItems[] | undefined, parentId: number | undefined) => {\r\n let children: IMFIBonusItemDetails[] = [];\r\n selectedArr && selectedArr?.length > 0 && selectedArr?.map(obj => {\r\n if (obj.parentId === parentId) {\r\n children = obj.children;\r\n }\r\n });\r\n return children;\r\n };\r\n\r\n const _getSelectedBonusItems = (selectedItem: IMFIBonusItemDetails, parentId: number | undefined, parentState: IProductBonusItems[] | undefined) => {\r\n // let selectedItemsArray: IMFIBonusItemDetails[] | undefined = [...props?.sendStateValue] || [];\r\n let selectedItemsArray: IMFIBonusItemDetails[] | undefined = _selectedProductBonusItemsWithParentKey(parentState, parentId) || [];\r\n const newArr = [...selectedItemsArray];\r\n // const removeIndex = newArr.map((item) => item.BonusItemId).indexOf(selectedItem?.BonusItemId);\r\n let removeIndex = -1;\r\n hasArray(newArr)?.map((item, itemIndex) => {\r\n if(item.BonusItemId === selectedItem.BonusItemId && item.BonusProductId === selectedItem.BonusProductId) {\r\n removeIndex = itemIndex;\r\n }\r\n });\r\n if (removeIndex > -1) {\r\n newArr.splice(removeIndex, 1);\r\n selectedItemsArray = [...newArr];\r\n } else {\r\n if(hasArray(selectedItemsArray) && selectedItemsArray.length === totalBonusSelectedItems) {\r\n const intermediateArray = [...selectedItemsArray];\r\n intermediateArray.splice(0, 1);\r\n selectedItemsArray = [...intermediateArray];\r\n }\r\n selectedItemsArray.push(selectedItem);\r\n }\r\n const obj = {\r\n parentId: parentId,\r\n children: [...selectedItemsArray]\r\n };\r\n // const obj = {\r\n // parentId: parentId,\r\n // children: [selectedItem]\r\n // };\r\n props?.setCartLine && props?.setCartLine(obj);\r\n };\r\n\r\n const _sendBonusProductToCart = (parentState: IProductBonusItems[] | undefined, parentId: number | undefined) => {\r\n const finalBonusItemsSelected: IMFIBonusItemDetails[] | undefined = _selectedProductBonusItemsWithParentKey(parentState, parentId) || [];\r\n // const finalBonusItemsSelected = [...props?.sendStateValue];\r\n if (props.recievedBonusProductFromCartLine) {\r\n props?.recievedBonusProductFromCartLine(parentId, finalBonusItemsSelected, productParentQuantityCount);\r\n falseProductModal();\r\n }\r\n };\r\n /** VSI Customziation - End */\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (props.isOutOfStock) {\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n let discountPercentage = 0;\r\n if (props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && props.data.cartLine.NetPrice && props.data.cartLine.NetPrice > 0) {\r\n discountPercentage = Math.round((props.data.cartLine.DiscountAmount / props.data.cartLine.NetPrice) * 100);\r\n }\r\n const initialPrice = isSalesLine ? formatCurrency(props.data.cartLine.Price) : formatCurrency(props.data.cartLine.NetPrice);\r\n const discountedPrice = isSalesLine ? formatCurrency(props.data.cartLine.NetPrice) : formatCurrency(props.data.cartLine.NetAmountWithoutTax);\r\n\r\n if (props.isQuantityEditable && !props.data.product?.IsGiftCard) {\r\n if (errorMessage) {\r\n nodes.push(errorMessage);\r\n }\r\n /* VSI Customization - Start - */\r\n // tslint:disable-next-line\r\n nodes.push(
{_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity)}
);\r\n /* VSI Customization - END -*/\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n {errorMessage}\r\n {props.data.cartLine.Quantity}\r\n
\r\n );\r\n }\r\n\r\n /* VSI Customization - Start - 14-12-2020 */\r\n /** Displayed discount with actual price strikethrough */\r\n\r\n const discountSaveText = props.resources.discountStringText;\r\n nodes.push(\r\n
\r\n {`${resources.currentPriceText} ${(discountPercentage >= 100) ? 'FREE' : discountedPrice}, ${!!discountPercentage && discountPercentage > 0 ? `${resources.originalPriceText}, ${bonusItemProduct ? initialPrice : initialPrice}`: ''}`}\r\n \r\n {!!discountPercentage && discountPercentage > 0 &&\r\n \r\n }\r\n
\r\n );\r\n /* VSI Customization - End - 14-12-2020 */\r\n return nodes;\r\n };\r\n\r\n /* VSI Customization - Start - 17-12-2020 */\r\n /* Splitted generate quantity and price methods into two for html & css structure */\r\n const _generateQuantity = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (props.isOutOfStock) {\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (props.isQuantityEditable) {\r\n if (errorMessage) {\r\n nodes.push(errorMessage);\r\n }\r\n nodes.push(_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity));\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n {errorMessage}\r\n {props.data.cartLine.Quantity}\r\n
\r\n );\r\n }\r\n return nodes;\r\n };\r\n\r\n const _generateAddGiftCta = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n if(props.GiftCtaButton) {\r\n nodes.push(\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generatePrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (props.isOutOfStock) {\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n let discountPercentage = 0;\r\n if (props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && props.data.cartLine.NetPrice && props.data.cartLine.NetPrice > 0) {\r\n discountPercentage = Math.round((props.data.cartLine.DiscountAmount / props.data.cartLine.NetPrice) * 100);\r\n }\r\n const initialPrice = isSalesLine ? formatCurrency(props.data.cartLine.Price) : formatCurrency(props.data.cartLine.NetPrice);\r\n const discountedPrice = isSalesLine ? formatCurrency(props.data.cartLine.NetPrice) : formatCurrency(props.data.cartLine.NetAmountWithoutTax);\r\n const discountSaveText = props.resources.discountStringText;\r\n nodes.push(\r\n
\r\n {`${resources.currentPriceText} ${(discountPercentage >= 100) ? 'FREE' : discountedPrice}, ${!!discountPercentage && discountPercentage > 0 ? `${resources.originalPriceText}, ${bonusItemProduct ? initialPrice : initialPrice}` : ''}`}\r\n \r\n {!!discountPercentage && discountPercentage > 0 &&\r\n \r\n }\r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n /* VSI Customization - End - 17-12-2020 */\r\n\r\n if (props.displayMode === 'COMPACT') {\r\n const reducedDimensions: string = product?.Dimensions ? product.Dimensions.reduce(\r\n (str, productDimension) => {\r\n if (productDimension.DimensionValue && productDimension.DimensionValue.Value) {\r\n if (str) {\r\n return `${str}, ${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return `${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return str;\r\n },\r\n '') : '';\r\n return (\r\n
\r\n \r\n {/* VSI Customization - Start - 16-12-2020 */}\r\n {/** Anchor tag added for click image redirect to pdp */}\r\n
\r\n \r\n
\r\n {/* VSI Customization - End - 16-12-2020 */}\r\n
\r\n
\r\n {productWithBrandName}\r\n {reducedDimensions !== '' ?\r\n
{reducedDimensions}
:\r\n ''\r\n }\r\n {\r\n _generateQuantityAndPrice()\r\n }\r\n
\r\n
\r\n );\r\n }\r\n const discountedPrice1 = isSalesLine ? formatCurrency(props.data.cartLine.NetPrice) : formatCurrency(props.data.cartLine.NetAmountWithoutTax);\r\n let delMsgCore = '';\r\n let delMsgSpDS = '';\r\n if(props.deliveryByMessagesCore !== undefined && props.deliveryByMessagesCore.length > 0) {\r\n for(const dmCore of props.deliveryByMessagesCore) {\r\n if(dmCore.variantID === product?.RecordId.toString()) {\r\n delMsgCore = dmCore.deliveryByMessage;\r\n }\r\n }\r\n }\r\n if(props.deliveryByMessageSPDS !== undefined && props.deliveryByMessageSPDS.length > 0) {\r\n for(const dmSpDs of props.deliveryByMessageSPDS) {\r\n if(dmSpDs.variantID === product?.RecordId.toString()) {\r\n delMsgSpDS = dmSpDs.deliveryByMessage;\r\n }\r\n }\r\n }\r\n const promoCodesText = `${promoRef.current?.innerText ? `${promoAriaText}, ${promoRef.current?.innerText?.split('\\n').join(', ')}.`: ''}`;\r\n const deliveryMessageText = !props.hideDeliveryMessage && delMsgSpDS.length > 0 ? delMsgSpDS : delMsgCore;\r\n const initialPrice = isSalesLine ? formatCurrency(props.data.cartLine.Price) : formatCurrency(props.data.cartLine.NetPrice);\r\n const discountedPrice = isSalesLine ? formatCurrency(props.data.cartLine.NetPrice) : formatCurrency(props.data.cartLine.NetAmountWithoutTax);\r\n let discountPercentage = 0;\r\n if (props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && props.data.cartLine.NetPrice && props.data.cartLine.NetPrice > 0) {\r\n discountPercentage = Math.round((props.data.cartLine.DiscountAmount / props.data.cartLine.NetPrice) * 100);\r\n }\r\n const productPriceAriaLabel = discountPercentage > 0 ? `${(discountPercentage >= 100) ? 'FREE' : discountedPrice} ${format(discountPercentageAriaText, `${discountPercentage}${discountStringText}` || '')} ${initialPrice}` : initialPrice;\r\n const productAriaLabel = `${productAriaText}, ${productWithBrandName}. ${promoCodesText} ${variantAriaText}, ${productDimensionVariants} ${deliveryMessageText?.replace(/\\s+$/, '')}. ${priceAriaText}, ${productPriceAriaLabel}. ${productPageLinkAriaLabel}`;\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n {/* VSI Customization - Start - 16-12-2020 */}\r\n {/** Anchor tag added for click image redirect to pdp */}\r\n
\r\n \r\n
\r\n {/* VSI Customization - End - 16-12-2020 */}\r\n
\r\n
\r\n \r\n {/* productDimension.DimensionValue && productDimension.DimensionValue.Value */}\r\n {productWithBrandName}\r\n \r\n {parentProduct && props.data.cartLine.DiscountAmount === 0 ? '' :
{renderDisountLines}
}\r\n {productDimensions && productDimensions.length > 0 ?\r\n <>\r\n
{productDimensions}
\r\n {!props.hideDeliveryMessage &&

\r\n {delMsgSpDS.length > 0 ? delMsgSpDS : delMsgCore}\r\n

\r\n }\r\n :\r\n ''\r\n }\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems &&
\r\n {renderShippingLabel}\r\n
}\r\n {renderOtherCharges}\r\n
\r\n {editGiftCta && }\r\n
\r\n\r\n
\r\n {\r\n _generateQuantityAndPrice()\r\n }\r\n {/* VSI Customization\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems &&
\r\n {renderShippingLabel}\r\n
}\r\n {renderOtherCharges}\r\n VSI Customization */}\r\n
\r\n
\r\n {/** VSI Customization - Start */}\r\n {/** changed structre of html for mobile view */}\r\n
\r\n
\r\n {_generateQuantity()}\r\n
\r\n
\r\n {editGiftCta && }\r\n
\r\n {_generatePrice()}\r\n
\r\n {/** VSI Customization - End - 17-12-2020 */}\r\n \r\n {_generateAddGiftCta()}\r\n {_createModal()}\r\n \r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport const CartLineItemComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'CartLineItem',\r\n { component: CartLine, ...CartLineItemFunctions }\r\n);\r\n\r\nexport default CartLineItemComponent;\r\n","import * as React from 'react';\r\n\r\nimport { Button, getPayloadObject, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport MsDyn365, { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState, getCartState } from '@msdyn365-commerce/global-state';\r\nimport { addCartLinesAsync, updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { Cart, CartLine, DiscountLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport uuid from 'uuid';\r\n// VSI Customization - starts\r\nimport { IMFIBonusCouponsDetail, IMFIBonusItemsDetailsEntity, IMFIBonusItemsResponse, IMFIGetBonusCouponsDetailsResponse, IMFIGetBonusItemsParameters } from '../../../../actions/BonusItemDataServiceEntities.g';\r\nimport { UserDefinedPromocodeInput } from '../../../../actions/user-defined-promocode.action';\r\n//import { INotification, MfrmNotificationInput } from '../../../../data-actions/mfrm-notification.action';\r\nimport { INotification } from '../../../../data-actions/mfrm-notification.action';\r\nimport { hasArray } from '../../../../Utilities/emtpyChecker';\r\nimport { _getMFIGetBonusItems } from '../../../../Utilities/get-bonus-items';\r\nimport addPromoCode from '../../../../Utilities/mfrm-add-promo-code';\r\nimport { callUtagLink } from '../../../../Utilities/analytics/utagCaller';\r\nimport { PromoCodeAppliedOnCartInput } from '../../../../data-actions/promocode-applied-in-progress.action';\r\nimport { _isABonusCoupon } from './cartlineitem.component';\r\nimport { MFIbonusitemsInput } from '../../../../data-actions/mfrm-mfi-bonusitem.action';\r\nimport { default as LoadingButton } from 'mfcl/Button';\r\n// VSI Customization - ends\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n // VSI Customization - {#52133}\r\n appliedPromoText: string;\r\n notAppliedPromoText: string;\r\n // VSI Customization - {#52133} End\r\n\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n // VSI Customization - starts\r\n notifications?: INotification[] | undefined;\r\n mfrmExpiredPromoCodeErrorText: string;\r\n mfrmDoesNotApplyToCartPromoCodeErrorText: string;\r\n mfrmCannotBeCombinedPromoCodeErrorText: string;\r\n mfrmUsageLimitPromoCodeErrorText: string;\r\n // VSI Customization - End\r\n promoCodeApplyCallback?(): void;\r\n bonusItemsStateShare?: IMFIBonusItemsDetailsEntity[] | undefined;\r\n}\r\n\r\nexport interface IPromoCodeComponent extends IComponent { }\r\n\r\nconst PromoCodeComponentActions = {};\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n // VSI Customization - starts\r\n isPromoEnable: boolean;\r\n showPromoAppliedMessage: boolean;\r\n promoCodeArray?: string[];\r\n promoLoading: boolean;\r\n // VSI Customization - ends\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass PromoCode extends React.Component {\r\n public readonly payLoad: IPayLoad;\r\n // VSI Customization - starts\r\n public bonusCouponsArray: IMFIGetBonusCouponsDetailsResponse[] = [];\r\n public isBonusCoupon: boolean = false;\r\n public promoCouponsArray: string[] = [];\r\n public appliedPromos: string[] = [];\r\n private focusInput: React.RefObject;\r\n private appliedPromoCodes: string[] = [];\r\n private allActualBonusCoupons: string[] = [];\r\n private timer: NodeJS.Timeout | null;\r\n // VSI Customization - ends\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n // VSI Customization - starts\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false,\r\n promoLoading: false\r\n };\r\n\r\n this.timer = null;\r\n this.focusInput = React.createRef();\r\n // VSI Customization - ends\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (this.timer) {\r\n clearTimeout(this.timer);\r\n }\r\n }\r\n // VSI Customization - starts\r\n public async componentDidMount(): Promise {\r\n const {\r\n context: {\r\n actionContext,\r\n request\r\n }\r\n } = this.props;\r\n if (request.query?.utm_promo) {\r\n const cartState = await getCartState(actionContext);\r\n if (cartState) {\r\n await this._applyPromotion(cartState, request.query?.utm_promo);\r\n }\r\n }\r\n }\r\n public componentDidUpdate(prevProps: IPromoCodeProps, prevState: IPromoCodeState): void {\r\n if (prevState.promoCodeInputValue !== this.state.promoCodeInputValue) {\r\n this.setState({\r\n error: ''\r\n });\r\n }\r\n this._getBonusCouponsArray();\r\n // this._isBonusItemProductExists();\r\n }\r\n // VSI Customization - ends\r\n\r\n public render(): JSX.Element {\r\n // VSI Customization - starts\r\n const { isPromoEnable } = this.state;\r\n if (MsDyn365.isBrowser) {\r\n // All promocodes ENTERED by customer\r\n const previousPromoCode = localStorage.getItem('promoCode');\r\n\r\n if (previousPromoCode) {\r\n this.appliedPromos = previousPromoCode && JSON.parse(previousPromoCode);\r\n } else if (!hasArray(previousPromoCode)) {\r\n this.appliedPromos = [];\r\n }\r\n }\r\n // VSI Customization - {#52133} - Changes for Accessibility Only\r\n return (\r\n
\r\n {this._renderAppliedPromoCode(this.props)}\r\n {isPromoEnable && (\r\n <>\r\n {/*
{this.props.promoCodeHeadingText}
*/}\r\n {this._renderForm(\r\n this.props.promoPlaceholderText,\r\n this.props.promoCodeApplyButtonText,\r\n this.props.cart,\r\n this.props.promoCodeHeadingText\r\n )}\r\n

\r\n {this.state.error}\r\n

\r\n {this.state.showPromoAppliedMessage &&

promo code applied

}\r\n \r\n )}\r\n \r\n {isPromoEnable ? 'Cancel' : `Add promo code`}\r\n \r\n
\r\n // VSI Customization - ends\r\n );\r\n }\r\n // VSI Customization - starts\r\n private _handleOnClick = () => {\r\n this.setState({ isPromoEnable: !this.state.isPromoEnable });\r\n if (!this.state.isPromoEnable) {\r\n MsDyn365.isBrowser &&\r\n setTimeout(() => {\r\n this.focusInput.current?.focus();\r\n });\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n // this.props.context.actionContext.update(new UserDefinedPromocodeInput(), {userDefinedPromos: this.appliedPromos});\r\n }\r\n };\r\n // VSI Customization - ends\r\n\r\n private readonly _onInputChange = (e: React.ChangeEvent) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value,\r\n error,\r\n canApply: !!e.target.value\r\n });\r\n };\r\n // VSI Customization - {#52133} - temp disable cyclomatic-complexity\r\n // tslint:disable: cyclomatic-complexity\r\n private updateCartlineQuantity = async (appliedPromo: string, cartState: ICartState | undefined): Promise => {\r\n // Check if there is already bonusItem applied, then a combined payload will be passed to API in cart.tsx\r\n const getLocalStorage = localStorage.getItem('BonusItemProduct');\r\n const previousAppliedPromo: IMFIBonusItemsDetailsEntity[] | undefined = getLocalStorage && JSON.parse(getLocalStorage);\r\n\r\n\r\n let bonusItemDeets: IMFIBonusItemsDetailsEntity[] | undefined;\r\n\r\n if (previousAppliedPromo && previousAppliedPromo.length > 0) {\r\n bonusItemDeets = this.props.bonusItemsStateShare;\r\n } else {\r\n const bonusItemsResponse: IMFIBonusItemsResponse | null = await _getMFIGetBonusItems(this.props.context, { CartId: this.props.cart?.cart.Id, Coupons: [appliedPromo.toUpperCase()] }, this.props.bonusItemsStateShare);\r\n bonusItemDeets = bonusItemsResponse?.BonusItemsDetails;\r\n\r\n }\r\n this.props.context.actionContext.update(new MFIbonusitemsInput(), bonusItemDeets);\r\n // this.props.context.actionContext.update(new MFIbonusitemsInput(), { bonusItems: bonusItemsResponse?.BonusItemsDetails, message: bonusItemsResponse?.Message });\r\n\r\n let requiresUpdateCartLines = false;\r\n const cartLinesToBeAddedLater: CartLine[] = [];\r\n if (bonusItemDeets) {\r\n for (const bid of bonusItemDeets) {\r\n const items = bid.Items;\r\n if (items) {\r\n for (const it of items) {\r\n const bItems = it.BonusItems;\r\n if (bItems) {\r\n for (const bi of bItems) {\r\n let qualifyingItemQuantity = -1;\r\n if (hasArray(cartState?.cart.CartLines)) {\r\n for (const cl of cartState!.cart.CartLines!) {\r\n if (cl.ItemId === it.QualifyingItemId && cl.ProductId?.toString() === it.QualifyingProductId?.toString()) {\r\n qualifyingItemQuantity = cl.Quantity ? cl.Quantity : 0;\r\n }\r\n }\r\n }\r\n if (qualifyingItemQuantity > 0) {\r\n if (hasArray(cartState?.cart.CartLines)) {\r\n for (const cl of cartState!.cart.CartLines!) {\r\n if (cl.ItemId === bi.BonusItemId && cl.ProductId?.toString() === bi.BonusProductId?.toString()) {\r\n if (cl.Quantity !== qualifyingItemQuantity) {\r\n if (cl.Quantity && (cl.Quantity > qualifyingItemQuantity)) {\r\n const laterToBeAddedCL = {\r\n ProductId: cl.ProductId,\r\n // ProductTypeValue: 5,\r\n EntryMethodTypeValue: 5,\r\n ItemId: cl.ItemId,\r\n Quantity: cl.Quantity - qualifyingItemQuantity\r\n };\r\n cartLinesToBeAddedLater.push(laterToBeAddedCL);\r\n }\r\n cl.Quantity = qualifyingItemQuantity;\r\n requiresUpdateCartLines = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (requiresUpdateCartLines) {\r\n await updateCartLinesAsync({ callerContext: this.props.context.actionContext }, cartState?.cart.Id ? cartState.cart.Id : '', cartState?.cart.CartLines);\r\n await cartState?.refreshCart({});\r\n }\r\n return cartLinesToBeAddedLater;\r\n };\r\n\r\n /* private getBonusItemsInfo = async (coupon: string): Promise => {\r\n const requestBodyMFIBonus: IMFIGetBonusItemsParameters = {\r\n CartId: this.props.cart?.cart.Id,\r\n Coupons: [coupon.toUpperCase()]\r\n };\r\n const bonusItemsProducts = await _getMFIGetBonusItems(this.props.context, requestBodyMFIBonus);\r\n return bonusItemsProducts;\r\n }; */\r\n\r\n private checkQualifying = (coupon: string, bonusItemCouponResponse: IMFIBonusItemsResponse | null) => {\r\n if (bonusItemCouponResponse === undefined || bonusItemCouponResponse === null) {\r\n return false;\r\n }\r\n const bonusItemArray: IMFIBonusItemsResponse[] = [bonusItemCouponResponse];\r\n const cls = this.props.cart?.cart.CartLines;\r\n if (hasArray(cls)) {\r\n // get bonus item array from localstorage\r\n for (const bonusItemsArray of bonusItemArray) {\r\n // bonusItemArray.map((bonusItemsArray) => {\r\n // bonus product array against applied promocode\r\n if (bonusItemArray && bonusItemsArray.BonusItemsDetails) {\r\n for (const bonusItemDetail of bonusItemsArray.BonusItemsDetails) {\r\n // bonusItemsArray.BonusItemsDetails?.map((bonusItemDetail) => {\r\n // bonus item details array with items of parent product\r\n if (bonusItemDetail && bonusItemDetail.Items && (bonusItemDetail.Coupon?.toUpperCase() === coupon.toUpperCase())) {\r\n for (const item of bonusItemDetail.Items) {\r\n // bonusItemDetail.Items?.map((item) => {\r\n // check if cartlineId is equal to parent or qualifying Id\r\n for (const cartlineToUpdate of cls!) {\r\n if (item.QualifyingItemId === cartlineToUpdate.ItemId && item.QualifyingProductId?.toString() === cartlineToUpdate.ProductId?.toString()) {\r\n return true;\r\n }\r\n }\r\n // });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n /* private promoCodeExistsInLocalStorage = (promoCode: string) => {\r\n const getLocalStorage = localStorage.getItem('BonusItemProduct');\r\n let bonusItemArray: IMFIBonusItemsResponse[] = [];\r\n const cls = this.props.cart?.cart.CartLines;\r\n if (getLocalStorage && hasArray(cls)) {\r\n const localStorageBonusInfo = getLocalStorage && JSON.parse(getLocalStorage);\r\n // get bonus item array from localstorage\r\n if (!hasArray(localStorageBonusInfo)) {\r\n if (localStorageBonusInfo && hasArray(localStorageBonusInfo.BonusItemsDetails)) {\r\n bonusItemArray = [localStorageBonusInfo];\r\n } else {\r\n return;\r\n }\r\n } else {\r\n bonusItemArray = localStorageBonusInfo;\r\n }\r\n for (const bonusItemsArray of bonusItemArray) {\r\n // bonusItemArray.map((bonusItemsArray) => {\r\n // bonus product array against applied promocode\r\n if (bonusItemArray && bonusItemsArray.BonusItemsDetails) {\r\n for (const bonusItemDetail of bonusItemsArray.BonusItemsDetails) {\r\n // bonusItemsArray.BonusItemsDetails?.map((bonusItemDetail) => {\r\n // bonus item details array with items of parent product\r\n if (bonusItemDetail && bonusItemDetail.Items && (bonusItemDetail.Coupon?.toUpperCase() === promoCode.toUpperCase())) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }; */\r\n\r\n // VSI Customization - {#52133} - temp disable max-func-body-length\r\n // tslint:disable: max-func-body-length\r\n private readonly _applyPromotion = async (cartState: ICartState | undefined, utm_promo?: string) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n this.setState({ promoLoading: true });\r\n const appliedPromo = utm_promo ? utm_promo : this.state.promoCodeInputValue;\r\n\r\n if (this.isOneOfDisabledPromos(appliedPromo)) {\r\n if (!this.appliedPromos) {\r\n this.appliedPromos = [];\r\n }\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n const previousPromoCode = localStorage.getItem('promoCode');\r\n if (previousPromoCode) {\r\n this.promoCouponsArray = previousPromoCode && JSON.parse(previousPromoCode);\r\n if (this.promoCouponsArray.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.promoCouponsArray.push(appliedPromo);\r\n }\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.appliedPromos.push(appliedPromo.toUpperCase());\r\n }\r\n } else {\r\n this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.appliedPromos.push(appliedPromo.toUpperCase());\r\n }\r\n // this.props.context.actionContext.update(new UserDefinedPromocodeInput(), {userDefinedPromos: this.promoCouponsArray});\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n this.setState({\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false\r\n });\r\n } else {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n }\r\n this.setState({ promoLoading: false });\r\n return;\r\n }\r\n // VSI Customization - starts\r\n const promoData: INotification = {\r\n id: uuid.v4(),\r\n type: 'promocode',\r\n value: '',\r\n status: ''\r\n };\r\n let notificationItems: INotification[] = [];\r\n if (this.props.notifications && this.props.notifications.length) {\r\n notificationItems = [...this.props.notifications];\r\n }\r\n // VSI Customization - starts\r\n // check promo code applied array if existing item is there or not.\r\n\r\n const checkIsBonusCoupons = this._isBonusCoupons(appliedPromo);\r\n const mfrmCartState: Readonly = this.props.cart?.cart;\r\n // const bonusLocalStorage = this.promoCodeExistsInLocalStorage(appliedPromo);\r\n const bonusLocalStorage = _isABonusCoupon(appliedPromo);\r\n let cartLinesToBeAddedLater: CartLine[] = [];\r\n\r\n let bonusItemsInfo: IMFIBonusItemsResponse | null;\r\n if (bonusLocalStorage) {\r\n // bonusItemsInfo = await this.getBonusItemsInfo(appliedPromo);\r\n cartLinesToBeAddedLater = await this.updateCartlineQuantity(appliedPromo, cartState);\r\n }\r\n\r\n // cartState.addPromoCode({ promoCode: appliedPromo })\r\n this.props.context.actionContext.update(new PromoCodeAppliedOnCartInput(), { isInProcess: true });\r\n addPromoCode(mfrmCartState, appliedPromo, this.props.context.actionContext)\r\n .then(async result => {\r\n this.props.context.actionContext.update(new PromoCodeAppliedOnCartInput(), { isInProcess: false });\r\n this.setState({ promoLoading: false });\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n const previousPromoCode = localStorage.getItem('promoCode');\r\n if (previousPromoCode) {\r\n this.promoCouponsArray = previousPromoCode && JSON.parse(previousPromoCode);\r\n if (this.promoCouponsArray.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.promoCouponsArray.push(appliedPromo);\r\n }\r\n } else {\r\n this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.appliedPromos.push(appliedPromo.toUpperCase());\r\n }\r\n // this.props.context.actionContext.update(new UserDefinedPromocodeInput(), {userDefinedPromos: this.promoCouponsArray});\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n promoData.value = appliedPromo;\r\n this.setState({\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false\r\n });\r\n promoData.status = result.status;\r\n notificationItems.unshift(promoData);\r\n //this.props.context.actionContext.update(new MfrmNotificationInput(), notificationItems);\r\n // this._handleOnClick();\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n await callUtagLink({\r\n event: 'add-remove-promos',\r\n event_category: 'add/remove promos',\r\n event_action: 'Add promo code click',\r\n event_label: `${appliedPromo}: ${this.props.duplicatePromoCodeErrorText}`,\r\n event_noninteraction: 'false'\r\n });\r\n } else {\r\n if (checkIsBonusCoupons) {\r\n const upr = this.getUniqueAppliedPromos(this.props);\r\n let bonusPrAlreadyAdded = false;\r\n for (const apr of upr) {\r\n if (apr.toUpperCase() === appliedPromo.toUpperCase()) {\r\n bonusPrAlreadyAdded = true;\r\n }\r\n }\r\n if (bonusPrAlreadyAdded) {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n // @ts-ignore\r\n await callUtagLink({\r\n event: 'add-remove-promos',\r\n event_category: 'add/remove promos',\r\n event_action: 'Add promo code click',\r\n event_label: `${appliedPromo}: ${this.props.duplicatePromoCodeErrorText}`,\r\n event_noninteraction: 'false'\r\n });\r\n } else {\r\n const previousPromoCode = localStorage.getItem('promoCode');\r\n if (previousPromoCode) {\r\n this.promoCouponsArray = previousPromoCode && JSON.parse(previousPromoCode);\r\n if (this.promoCouponsArray.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n checkIsBonusCoupons && this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n } else {\r\n // cartState.refreshCart({});\r\n this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n }\r\n // this.props.context.actionContext.update(new UserDefinedPromocodeInput(), {userDefinedPromos: this.promoCouponsArray});\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.appliedPromos.push(appliedPromo.toUpperCase());\r\n }\r\n promoData.value = appliedPromo;\r\n if (bonusLocalStorage) {\r\n promoData.status = this._qualifyingExists(appliedPromo) ? 'SUCCESS' : (this.isD365Applied(appliedPromo) ? 'SUCCESS' : 'NOT_APPLIED');\r\n } else {\r\n promoData.status = this.checkQualifying(appliedPromo, bonusItemsInfo) ? 'SUCCESS' : (this.isD365Applied(appliedPromo) ? 'SUCCESS' : 'NOT_APPLIED');\r\n }\r\n notificationItems.unshift(promoData);\r\n //this.props.context.actionContext.update(new MfrmNotificationInput(), notificationItems);\r\n checkIsBonusCoupons\r\n ? this.setState({\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false\r\n })\r\n : this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n } else {\r\n // commented next for #6563\r\n // this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n if (this.appliedPromos.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.appliedPromos.push(appliedPromo.toUpperCase());\r\n }\r\n /* start #6563 */\r\n const previousPromoCode = localStorage.getItem('promoCode');\r\n if (previousPromoCode) {\r\n this.promoCouponsArray = previousPromoCode && JSON.parse(previousPromoCode);\r\n if (this.promoCouponsArray.indexOf(appliedPromo.toUpperCase()) === -1) {\r\n this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n } else {\r\n // cartState.refreshCart({});\r\n this.promoCouponsArray.push(appliedPromo.toUpperCase());\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n }\r\n let exceptionCustomMessage = this.props.invalidPromoCodeErrorText;\r\n switch (result.mfrmstatus) {\r\n case 'Microsoft_Dynamics_Commerce_Runtime_NotStartedCouponCode':\r\n case 'DoesNotApply':\r\n exceptionCustomMessage = this.props.mfrmDoesNotApplyToCartPromoCodeErrorText; // `This promo doesn't apply to your cart.`;\r\n break;\r\n\r\n case 'Microsoft_Dynamics_Commerce_Runtime_ExpiredCouponCode':\r\n exceptionCustomMessage = this.props.mfrmExpiredPromoCodeErrorText; // `We're sorry, this promo has expired.`;\r\n break;\r\n\r\n case 'Microsoft_Dynamics_Commerce_Runtime_ExclusiveCouponCannotBeAppliedWithOtherCoupons':\r\n exceptionCustomMessage = this.props.mfrmCannotBeCombinedPromoCodeErrorText; // `This promo can't be combined with other promos in your cart.`;\r\n break;\r\n\r\n case 'Microsoft_Dynamics_Commerce_Runtime_CouponExceedsDefinedUsageLimits':\r\n case 'Microsoft_Dynamics_Commerce_Runtime_ExceededUsageLimitCouponCode':\r\n exceptionCustomMessage = this.props.mfrmUsageLimitPromoCodeErrorText; // `We're sorry, this promotion is no longer valid.`;\r\n break;\r\n\r\n default:\r\n exceptionCustomMessage = this.props.invalidPromoCodeErrorText;\r\n }\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n await callUtagLink({\r\n event: 'add-remove-promos',\r\n event_category: 'add/remove promos',\r\n event_action: 'Add promo code click',\r\n event_label: `${appliedPromo}: ${exceptionCustomMessage}`,\r\n event_noninteraction: 'false'\r\n });\r\n this.setState({ error: exceptionCustomMessage });\r\n if (this.state.error) {\r\n this.timer = setTimeout(function () {\r\n // eslint-disable-next-line no-eval\r\n eval(\r\n `var elems = document.querySelectorAll('.uiButton.helpButtonEnabled, .minimizedContainer.helpButton, .sidebarHeader.minimizedContainer'); if(elems != undefined && elems.length > 0) { if(elems.length > 1){elems[1].click()} else {elems[0].click()}}`\r\n );\r\n }, 1000);\r\n }\r\n /* end #6563 */\r\n }\r\n }\r\n await cartState.refreshCart({});\r\n this.props.context.actionContext.update(new UserDefinedPromocodeInput(), { userDefinedPromos: this.appliedPromos });\r\n if (hasArray(cartLinesToBeAddedLater)) {\r\n await addCartLinesAsync({ callerContext: this.props.context.actionContext }, cartState?.cart.Id ? cartState.cart.Id : '', cartLinesToBeAddedLater);\r\n await cartState.refreshCart({});\r\n }\r\n // VSI Customization - ends\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText, promoLoading: false });\r\n });\r\n // VSI Customization - {#52133} - re-enable cyclomatic-complexity and max-func-body-length\r\n // tslint:enable: cyclomatic-complexity\r\n // tslint:enable: max-func-body-length\r\n };\r\n\r\n private readonly _renderForm = (\r\n promoPlaceholderText: string,\r\n promoCodeApplyButtonText: string,\r\n cartState: ICartState | undefined,\r\n promoCodeLabelText: string\r\n ) => {\r\n const _onSubmit = (event: React.FormEvent) => {\r\n event.preventDefault();\r\n /* eslint-disable @typescript-eslint/no-floating-promises */\r\n this._applyPromotion(cartState);\r\n };\r\n // VSI Customization - starts\r\n // const _applyPromotion = (event: React.MouseEvent) => {this._applyPromotion(cartState);};\r\n // const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n \r\n {this.state.promoLoading ?\r\n :\r\n \r\n }\r\n {/* \r\n {promoCodeApplyButtonText}\r\n */}\r\n
\r\n
\r\n \r\n );\r\n // VSI Customization - ends\r\n };\r\n\r\n private _updateBonusItems = (bonusItemsParams: string[], cartState: ICartState | undefined) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n if (cartState.cart.Id) {\r\n localStorage.removeItem('BonusItemProduct');\r\n const requestBodyMFIBonus: IMFIGetBonusItemsParameters = {\r\n CartId: cartState.cart.Id,\r\n Coupons: bonusItemsParams\r\n };\r\n const getBonusItemsProducts = _getMFIGetBonusItems(this.props.context, requestBodyMFIBonus, this.props.bonusItemsStateShare);\r\n getBonusItemsProducts.then(async (bonusItemsResponse) => {\r\n if (bonusItemsResponse !== undefined) {\r\n localStorage.setItem('BonusItemProduct', JSON.stringify(bonusItemsResponse));\r\n }\r\n }).catch((e) => {\r\n console.log('Error', e);\r\n });\r\n return;\r\n }\r\n };\r\n\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n // VSI Customization - starts\r\n let notificationItems: INotification[] = [];\r\n if (this.props.notifications && this.props.notifications.length) {\r\n notificationItems = [...this.props.notifications];\r\n }\r\n const promoData: INotification = {\r\n id: uuid.v4(),\r\n type: 'promocode',\r\n value: '',\r\n status: ''\r\n };\r\n // VSI Customization - end\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n if (this.isOneOfDisabledPromos(code)) {\r\n // check promo code applied array if existing item is there or not\r\n let currentPromoArray: string[] = [];\r\n const getLocalPromoValue = localStorage.getItem('promoCode');\r\n this.promoCouponsArray = getLocalPromoValue && JSON.parse(getLocalPromoValue);\r\n if (getLocalPromoValue) {\r\n currentPromoArray = this.promoCouponsArray.filter(items => items?.toUpperCase() !== code.toUpperCase());\r\n this.promoCouponsArray = currentPromoArray;\r\n }\r\n\r\n if (currentPromoArray.length === 0) {\r\n localStorage.removeItem('BonusItemProduct');\r\n localStorage.removeItem('promoCode');\r\n this.promoCouponsArray = [];\r\n this.setState({\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false\r\n });\r\n cartState.refreshCart({});\r\n } else if (currentPromoArray.length > 0) {\r\n localStorage.removeItem('promoCode');\r\n let BonusCouponCount = 0;\r\n const bonusItemsParams: string[] = [];\r\n currentPromoArray.map((item) => {\r\n const checkIsBonusCoupons = this._isBonusCoupons(item);\r\n if (checkIsBonusCoupons) {\r\n bonusItemsParams.push(item);\r\n BonusCouponCount++;\r\n }\r\n });\r\n if (BonusCouponCount === 0) {\r\n localStorage.removeItem('BonusItemProduct');\r\n } else {\r\n this._updateBonusItems(bonusItemsParams, cartState);\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n cartState.refreshCart({});\r\n } else {\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n this.props.context.actionContext.update(new UserDefinedPromocodeInput(), { userDefinedPromos: this.promoCouponsArray });\r\n }\r\n this.setState({ error: '' });\r\n return;\r\n }\r\n this.props.context.actionContext.update(new PromoCodeAppliedOnCartInput(), { isInProcess: true });\r\n cartState\r\n .removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(async result => {\r\n this.props.context.actionContext.update(new PromoCodeAppliedOnCartInput(), { isInProcess: false });\r\n if (result.status === 'SUCCESS') {\r\n // check promo code applied array if existing item is there or not\r\n let currentPromoArray: string[] = [];\r\n const getLocalPromoValue = localStorage.getItem('promoCode');\r\n this.promoCouponsArray = getLocalPromoValue && JSON.parse(getLocalPromoValue);\r\n if (getLocalPromoValue) {\r\n currentPromoArray = this.promoCouponsArray.filter(items => items?.toUpperCase() !== code.toUpperCase());\r\n this.promoCouponsArray = currentPromoArray;\r\n }\r\n\r\n if (currentPromoArray.length === 0) {\r\n localStorage.removeItem('BonusItemProduct');\r\n localStorage.removeItem('promoCode');\r\n this.promoCouponsArray = [];\r\n this.setState({\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false,\r\n isPromoEnable: false,\r\n showPromoAppliedMessage: false\r\n });\r\n await cartState.refreshCart({});\r\n } else if (currentPromoArray.length > 0) {\r\n localStorage.removeItem('promoCode');\r\n let BonusCouponCount = 0;\r\n const bonusItemsParams: string[] = [];\r\n currentPromoArray.map((item) => {\r\n const checkIsBonusCoupons = this._isBonusCoupons(item);\r\n if (checkIsBonusCoupons) {\r\n bonusItemsParams.push(item);\r\n BonusCouponCount++;\r\n }\r\n });\r\n if (BonusCouponCount === 0) {\r\n localStorage.removeItem('BonusItemProduct');\r\n } else {\r\n this._updateBonusItems(bonusItemsParams, cartState);\r\n }\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n await cartState.refreshCart({});\r\n } else {\r\n localStorage.setItem('promoCode', JSON.stringify(this.promoCouponsArray));\r\n this.props.context.actionContext.update(new UserDefinedPromocodeInput(), { userDefinedPromos: this.promoCouponsArray });\r\n }\r\n this.setState({ error: '' });\r\n // VSI Customization - starts\r\n promoData.value = code;\r\n promoData.status = 'error';\r\n notificationItems.unshift(promoData);\r\n //this.props.context.actionContext.update(new MfrmNotificationInput(), notificationItems);\r\n // VSI Customization - ends\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n };\r\n\r\n private isD365Coupon = (coupon: string, props: IPromoCodeProps) => {\r\n const cart = props.cart?.cart;\r\n if (cart && hasArray(cart.Coupons)) {\r\n for (const cp of cart.Coupons!) {\r\n if (cp.Code?.toUpperCase() === coupon?.toUpperCase()) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n private getUniqueAppliedPromos = (props: IPromoCodeProps): string[] => {\r\n const uniqueAppliedPromos: string[] = [];\r\n if (hasArray(this.appliedPromos)) {\r\n for (const ap of this.appliedPromos) {\r\n const includesValue = uniqueAppliedPromos.some(element => {\r\n return element.toUpperCase() === ap.toUpperCase();\r\n });\r\n if ((!includesValue) && (this._isBonusCoupons(ap) || this.isD365Coupon(ap, props) || this.isOneOfDisabledPromos(ap))) {\r\n uniqueAppliedPromos.push(ap);\r\n }\r\n }\r\n }\r\n return uniqueAppliedPromos;\r\n };\r\n\r\n private _qualifyingExists = (coupon: string): boolean => {\r\n const getLocalStorage = localStorage.getItem('BonusItemProduct');\r\n let bonusItemArray: IMFIBonusItemsResponse[] = [];\r\n const cls = this.props.cart?.cart.CartLines;\r\n if (getLocalStorage && hasArray(cls)) {\r\n const localStorageBonusInfo = getLocalStorage && JSON.parse(getLocalStorage);\r\n // get bonus item array from localstorage\r\n if (!hasArray(localStorageBonusInfo)) {\r\n if (localStorageBonusInfo && hasArray(localStorageBonusInfo.BonusItemsDetails)) {\r\n bonusItemArray = [localStorageBonusInfo];\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n bonusItemArray = localStorageBonusInfo;\r\n }\r\n // get bonus item array from localstorage\r\n for (const bonusItemsArray of bonusItemArray) {\r\n // bonusItemArray.map((bonusItemsArray) => {\r\n // bonus product array against applied promocode\r\n if (bonusItemArray && bonusItemsArray.BonusItemsDetails) {\r\n for (const bonusItemDetail of bonusItemsArray.BonusItemsDetails) {\r\n // bonusItemsArray.BonusItemsDetails?.map((bonusItemDetail) => {\r\n // bonus item details array with items of parent product\r\n if (bonusItemDetail && bonusItemDetail.Items && (bonusItemDetail.Coupon?.toUpperCase() === coupon.toUpperCase())) {\r\n for (const item of bonusItemDetail.Items) {\r\n // bonusItemDetail.Items?.map((item) => {\r\n // check if cartlineId is equal to parent or qualifying Id\r\n for (const cartlineToUpdate of cls!) {\r\n if (item.QualifyingItemId === cartlineToUpdate.ItemId && item.QualifyingProductId?.toString() === cartlineToUpdate.ProductId?.toString()) {\r\n return true;\r\n }\r\n }\r\n // });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n private isD365Applied = (coupon: string) => {\r\n const cart = this.props.cart?.cart;\r\n const bonusCoupon = this.bonusCouponsArray && this.bonusCouponsArray[0] && this.bonusCouponsArray[0].BonusCoupons?.find(item => item.BonusCoupon?.toUpperCase() === coupon.toUpperCase());\r\n if (cart && hasArray(cart.CartLines)) {\r\n for (const cl of cart.CartLines!) {\r\n if (hasArray(cl.DiscountLines)) {\r\n for (const dl of cl.DiscountLines!) {\r\n if (dl.DiscountCode?.toUpperCase() === coupon.toUpperCase()) {\r\n return true;\r\n }\r\n else if (bonusCoupon && bonusCoupon.ChildCoupons) {\r\n for (const child of bonusCoupon.ChildCoupons){\r\n if (dl.DiscountCode?.toUpperCase() === child.toUpperCase()) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n private isOneOfDisabledPromos = (appliedPromo: string): boolean => {\r\n const disabledPromos = this.props.context.app.config.disabledPromosNames;\r\n if (disabledPromos) {\r\n const splittedDisabledPromos = disabledPromos.split(',');\r\n for (const disabledPromo of splittedDisabledPromos) {\r\n if (appliedPromo.trim().toUpperCase() === disabledPromo.trim().toUpperCase()) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n const promoAppliedList: string[] = [];\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n let hasOneOfDisabledPromos = false;\r\n if (this.appliedPromos && this.appliedPromos.length) {\r\n for (const apr of this.appliedPromos) {\r\n if (this.isOneOfDisabledPromos(apr) && props.cart?.cart && props.cart.cart?.CartLines && props.cart?.cart?.CartLines?.length) {\r\n hasOneOfDisabledPromos = true;\r\n }\r\n }\r\n }\r\n if (!hasOneOfDisabledPromos) {\r\n if (MsDyn365.isBrowser) {\r\n localStorage.setItem('promo_code_apply_list', JSON.stringify(promoAppliedList));\r\n }\r\n return;\r\n }\r\n }\r\n const _removePromotion = (event: React.MouseEvent) => { this._removePromotion(props.cart, event); };\r\n // 6563 VSI Customization - start\r\n // get applied promo codes based upon discountLines in cartLines\r\n this.promoCouponsArray = props.cart?.cart && props.cart?.cart.CartLines ? this._getAppliedPromoCodes(props.cart?.cart.CartLines) : [];\r\n // VSI Customization - end\r\n return (\r\n <>\r\n {/* VSI Customization - starts */}\r\n {/*
\r\n
{this.props.appliedPromoCodeHeadingText}
\r\n \r\n
*/}\r\n {/* VSI Customization - ends */}\r\n {// TODO Code will change this after promo message story completed\r\n // props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n this.appliedPromos &&\r\n this.getUniqueAppliedPromos(props).map((coupon: string) => {\r\n // this.promoCouponsArray && this.promoCouponsArray.map((coupon: string) => {\r\n let notApplied = !this._qualifyingExists(coupon);\r\n if (notApplied) {\r\n notApplied = !this.isD365Applied(coupon);\r\n }\r\n // let applied = true;\r\n // if (this.promoCouponsArray){\r\n // const includesValue = this.promoCouponsArray.some(element => {\r\n // return element.toUpperCase() === coupon.toUpperCase();\r\n // });\r\n // if(includesValue) {\r\n // applied = false;\r\n // }\r\n // }\r\n\r\n const className = notApplied ? 'msc-promo-code__line-value msc-text-error' : 'msc-promo-code__line-value';\r\n if (!notApplied) {\r\n // VSI Customization - {#52133} - change coupon text\r\n const dataCoupon = `${coupon} ${props.appliedPromoText}`;\r\n if (!promoAppliedList.includes(dataCoupon)) {\r\n promoAppliedList.push(dataCoupon);\r\n }\r\n }\r\n localStorage.setItem('promo_code_apply_list', JSON.stringify(promoAppliedList));\r\n const disabledPromoMessage = this.props.context.app.config.disabledPromosNotAppliedText ? this.props.context.app.config.disabledPromosNotAppliedText.replace('{coupon}', coupon.toUpperCase()) : `${coupon} not applied. Call, chat online or visit a store to redeem offer`;\r\n return (\r\n
\r\n
\r\n {/* VSI Customization - starts + {#52133} */}\r\n {/* {notApplied ? `${coupon.toUpperCase()} ${this.props.notAppliedPromoText}` : `${coupon.toUpperCase()} ${this.props.appliedPromoText}`} */}\r\n {this.isOneOfDisabledPromos(coupon.toUpperCase()) ? disabledPromoMessage : (notApplied ? `${coupon.toUpperCase()} ${this.props.notAppliedPromoText}` : `${coupon.toUpperCase()} ${this.props.appliedPromoText}`)}\r\n {/* (\r\n ) */}\r\n {/* VSI Customization - ends */}\r\n
\r\n \r\n {props.removePromoText}\r\n \r\n
\r\n // VSI Customization - {#52133} - added-aria-label to button End\r\n );\r\n })}\r\n \r\n );\r\n };\r\n\r\n // VSI Customization - START\r\n private _getBonusCouponsArray = () => {\r\n if (MsDyn365.isBrowser) {\r\n const getLocalstorageBonusCoupons = localStorage.getItem('bonusCouponsDetail');\r\n if (getLocalstorageBonusCoupons) {\r\n this.bonusCouponsArray = getLocalstorageBonusCoupons && JSON.parse(getLocalstorageBonusCoupons);\r\n }\r\n }\r\n };\r\n\r\n private _isBonusCoupons = (appliedPromoCoupons: string): boolean => {\r\n let checkBonusCoupons: boolean | undefined = false;\r\n this.bonusCouponsArray?.map(coupons => {\r\n checkBonusCoupons = coupons.BonusCoupons?.some(item => item.BonusCoupon?.toUpperCase() === appliedPromoCoupons.toUpperCase());\r\n return checkBonusCoupons;\r\n });\r\n return checkBonusCoupons;\r\n };\r\n // VSI Customization - END\r\n\r\n /* VSI Customization start\r\n This function will loop over the discountLines to filter out the\r\n exact applied promo codes and return the array to list the\r\n actual applied promo codes.\r\n */\r\n private _getAppliedPromoCodes(cartLines: CartLine[]): string[] {\r\n this.appliedPromoCodes = [];\r\n const discountLinePromoCodes: string[] = [];\r\n // get bonus coupon details set on property bonusCouponsArray\r\n this._getBonusCouponsArray();\r\n // get the bonus coupon details and set the data for applied\r\n // bonus coupons\r\n const bonusCouponDetails = this._setBonusCouponDetails();\r\n cartLines.map((cartLine: CartLine) => {\r\n const discountLines = cartLine.DiscountLines;\r\n const cartCoupons = this.props.cart?.cart.Coupons;\r\n discountLines\r\n ? discountLines.map((discountLine: DiscountLine) => {\r\n const codeValue = discountLine.DiscountCode!;\r\n codeValue &&\r\n codeValue.length > 0 &&\r\n discountLinePromoCodes.indexOf(codeValue) === -1 &&\r\n discountLinePromoCodes.push(codeValue);\r\n\r\n const isBonusCoupon = this.allActualBonusCoupons.indexOf(codeValue) > -1;\r\n // check parent name of the bonus coupon\r\n // end check parent name of the bonus coupon\r\n if (isBonusCoupon && codeValue && bonusCouponDetails.length > 0 && bonusCouponDetails[0][codeValue].length > 0) {\r\n // only insert in applied if not already\r\n if (this.appliedPromoCodes.indexOf(bonusCouponDetails[0][codeValue]) === -1) {\r\n this.appliedPromoCodes.push(bonusCouponDetails[0][codeValue]);\r\n }\r\n } else if (!isBonusCoupon && cartCoupons) {\r\n cartCoupons.map(coupon => {\r\n const currentCouponCode = coupon.Code;\r\n currentCouponCode &&\r\n discountLinePromoCodes.indexOf(currentCouponCode) > -1 &&\r\n this.appliedPromoCodes.indexOf(currentCouponCode) === -1 &&\r\n this.appliedPromoCodes.push(currentCouponCode);\r\n });\r\n }\r\n })\r\n : [];\r\n });\r\n return this.appliedPromoCodes;\r\n }\r\n\r\n /* This function will set the data for all actual bouns coupons which are basically\r\n childs of actual bonus coupon on allActualBounsCoupons property and will return\r\n an array of object containing child to parent bonus coupon relationship\r\n like C-purpleKing (child) : PURPLE (parent)\r\n */\r\n private _setBonusCouponDetails = () => {\r\n const bonusDetails = this.bonusCouponsArray;\r\n const childToParentBonusCoupons = [];\r\n this.allActualBonusCoupons = [];\r\n if (bonusDetails && bonusDetails.length > 0) {\r\n const newObject = {};\r\n bonusDetails[0].BonusCoupons &&\r\n bonusDetails[0].BonusCoupons.map((bonusCoupon: IMFIBonusCouponsDetail) => {\r\n const childCoupons = bonusCoupon.ChildCoupons;\r\n if (childCoupons && childCoupons.length > 0) {\r\n childCoupons.map(childCoupon => {\r\n newObject[childCoupon];\r\n newObject[childCoupon] = bonusCoupon.BonusCoupon;\r\n this.allActualBonusCoupons.push(childCoupon);\r\n });\r\n }\r\n });\r\n Object.keys(newObject).length > 0 && childToParentBonusCoupons.push(newObject);\r\n }\r\n\r\n return childToParentBonusCoupons;\r\n };\r\n /* VSI Customization end */\r\n}\r\n\r\n// @ts-ignore\r\nexport const PromoCodeComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'PromoCode',\r\n { component: PromoCode, ...PromoCodeComponentActions }\r\n);\r\n\r\nexport default PromoCodeComponent;\r\n"],"names":["GetBonusCouponInfoInput","constructor","cartId","coupons","getCacheKey","this","getCacheObjectType","dataCacheType","Msdyn365","action","async","input","ctx","requestBodyMFIBonus","CartId","Coupons","result","hasArray","mFIGetBonusItemsDetailAsync","callerContext","error","console","log","id","_getMFIGetBonusItems","context","bonusItemParams","mfiBonusItems","isDifferentCouponApplied","find","mfiBonusItem","bonusItemParam","Coupon","undefined","length","BonusItemsDetails","getCouponInfo","actionContext","update","MFIbonusitemsInput","addPromoCode","cart","promoCode","CartLines","hasPromoCodeMfrm","status","substatus","addDiscountCodeAsync","Id","then","newCart","code","map","coupon","Code","toLowerCase","indexOf","hasPromoCode","mfrmstatus","catch","telemetry","warning","message","name","cartLines","codes","cartLine","discountLines","DiscountLines","discountLine","DiscountCode","push","MFIGetBonusItemsParametersExtensionClass","odataObject","i","ExtensionProperties","className","substr","lastIndexOf","concat","EntityClasses","MFIBonusItemsDetailsEntityExtensionClass","IsBonusCoupon","CouponMessage","Items","MFIQualifyingItemDetailsExtensionClass","QualifyingItemId","QualifyingProductId","BonusProductQty","parseFloat","BonusItems","MFIBonusItemDetailsExtensionClass","BonusItemId","PrimaryImageUrl","ProductTypeValue","BonusProductId","Name","AdditionToCart","AdjustedPrice","BasePrice","CustomerContextualPrice","DiscountAmount","DiscountTypeValue","DiscountType","DealPriceOrDiscountPercentage","BonusCalculatedDiscountPrice","MFIGetBonusCouponsDetailsResponseExtensionClass","BonusCoupons","MFIBonusCouponsDetailExtensionClass","MFIBonusItemsResponseExtensionClass","Message","BonusCoupon","BonusCouponMessage","ChildCoupons","bonusItemsQuery","key","DataServiceQuery","DataServiceEntities","mFIGetBonusCouponsDetailsAsync","bonusCoupons","request","createDataServiceRequestForOperation","bypassCache","returnEntity","createMFIGetBonusCouponsDetailsInput","callActionOrExecute","createMFIGetBonusItemsDetailInput","UserDefinedPromocodeInput","userDefinedPromos","args","PromoCodeAppliedOnCartInput","updatePromoCodeAppliedOnCartProgressAction","isInProcess","createObservableDataAction","inputData","isOneOfChildBonusCoupons","discountCode","appliedCoupon","MsDyn365","getLocalstorageBonusCoupons","localStorage","getItem","bonusCouponsArray","JSON","parse","childCoupons","_coreProductATPCall","props","recordId","itemId","quantity","zipcode","Cookies","get","itemLinesArray","itemLines","ItemId","Quantity","VariantRecordId","toString","date","Date","currentDate","setDate","getDate","requestBody","InventoryType","Weeks","app","config","weeksPDPforATPCall","StoreId","Page","RequestedDate","dayjs","format","ZipCode","ItemLines","outOfMarket","outOfMarketMsg","responseMessageForItemOutOfMarketZip","msgOutOfMarket","slice","_getDeliveryByMessage","resultmMSg","responseMessageForItemOutOfMarketOOZ","deliveryDetails","ATPInventoryData","_getSoonestDeliveryDate","msg","deliveryByMessage","defaultDeliveryMessage","locationId","_coreProductATPCallCheckForOOM","updatedZipCode","cookies","findIndexOfItemInArray","prodId","c","ProductId","arraymove","arr","fromIndex","toIndex","element","splice","reshuffleItems","cls","bonusItemsInfoStr","bonusItems","testVarStruct","obj","deets","dt","itms","it","items","itm","getLocalStorage","selectedBonusItemArray","isSelectedManually","sbi","children","childd","parentId","prodIndex","getSetBasketCookie","method","basketCookieData","cookie","cartSessionExpiration","platform","cartSessionExpirationDateInDays","parseInt","cartDataInfo","cln","productId","set","expires","resetBasketCookie","setTealiumCartVariables","productDetails","_isABonusCoupon","appliedPromoCoupons","checkBonusCoupons","some","item","toUpperCase","getUniqueCouponsString","isGiftCoupon","couponsStringArray","index","ind","cl","bonusItemArray","localStorageBonusInfo","bonusItemsArray","bonusItemDetail","isQualifying","data","promoStr","bonusCouponStr","EffectiveAmount","resources","appliedPromoText","includes","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","productDimension","addComma","DimensionTypeValue","React","RecordId","DimensionValue","Value","getProductVariants","renderDiscountLines","flagBonus","userDefinePromo","defaultBonus","uniqueCoupons","title","renderInventoryLabel","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","renderShippingLabel","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","DeliveryMode","PickupDeliveryModeCodes","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","priceComponent","PriceComponent","price","freePriceText","typeName","shippingChargesText","renderOtherCharges","otherCharges","chargeline","otherCharge","Description","CartLineItemComponent","msdyn365Commerce","component","isSalesLine","productUrl","product","productAttributes","isShowProductModal","setIsShowProductModal","promoRef","destructDimensionStrings","sizeString","colorString","styleString","configString","amountString","fallbackImageUrl","getFallbackImageUrl","requestContext","apiSettings","imageSettings","cropFocalRegion","ObjectExtensions","inputQuantityAriaLabel","productPageLinkAriaLabel","productAriaText","variantAriaText","promoAriaText","priceAriaText","discountPercentageAriaText","discountStringText","editGiftCtaText","dialogAriaText","productDimensions","productDimensionVariants","renderDisountLines","payLoad","getPayloadObject","telemetryContent","prodAttribute","getTelemetryAttributes","attr","p","attributeValue","brandName","parseBrandName","brandBackofficeAttributePdp","productWithBrandName","getALLCouponsDetailsWithoutParse","bonusItemProduct","editGiftCta","showModal","parentProduct","alredySelectedInModal","_generateErrorMessage","errorMessage","_updateQuantity","event","quantityOnChange","target","value","_generateSelectMenu","currentQuantity","onChange","disabled","nodes","_generateMenu","formatCurrency","cultureFormatter","bonusItemsProductDetails","getLocalstorage","BonusDetailsArray","bonusitemdetail","bonusitem","currentItem","dl","falseProductModal","_addGiftItems","ctaGiftHandler","bonusItemArrayForModal","productItem","onEditGift","totalBonusSelectedItems","userSelectedItems","couponsApplied","productParentQuantityCount","selectedParentProduct","_selectedProductBonusItemsWithParentKey","selectedArr","_getSelectedBonusItems","selectedItem","parentState","selectedItemsArray","newArr","removeIndex","itemIndex","intermediateArray","setCartLine","_sendBonusProductToCart","finalBonusItemsSelected","recievedBonusProductFromCartLine","_generateQuantityAndPrice","isOutOfStock","discountPercentage","NetPrice","Math","round","initialPrice","Price","discountedPrice","NetAmountWithoutTax","isQuantityEditable","IsGiftCard","classNames","quantityDisplayString","maxQuantity","discountSaveText","currentPriceText","originalPriceText","displayMode","reducedDimensions","str","href","tabIndex","Image","role","src","primaryImageUrl","altText","gridSettings","fallBackSrc","bypassHideOnFailure","discountedPrice1","delMsgCore","delMsgSpDS","deliveryByMessagesCore","dmCore","variantID","deliveryByMessageSPDS","dmSpDs","promoCodesText","current","innerText","split","join","deliveryMessageText","hideDeliveryMessage","productPriceAriaLabel","productAriaLabel","replace","ref","showShippingChargesForLineItems","onClick","_generateQuantity","_generatePrice","GiftCtaButton","mfrmCtaGiftText","_generateAddGiftCta","sendStateValue","bonusDetails","bonusItemDetails","sort","previousDiscountedPrice","nextDiscountedPrice","Number","showProductModalLocal","bonusItem","bonusProduct","Modal","autoFocus","fade","isOpen","horizontalPosition","verticalPosition","zIndex","toggle","applicationNode","ModalHeader","ModalBody","mfrmBonusModalHeading","mfrmBonusSubHeading","mfrmBonusAppliedCodeText","selected","itemsSelected","productBrandName","bonusItemBrandArray","checkBrandName","slectedClass","BonusProduct","defaultImageSettings","viewports","xs","q","w","h","disableLazyLoad","bonusFallbackImageUrl","loadFailureBehavior","_renderImages","ModalFooter","mfrmAddItemToCartText","_createModal","PromoCodeComponentActions","PromoCode","state","super","isBonusCoupon","promoCouponsArray","appliedPromos","appliedPromoCodes","allActualBonusCoupons","_handleOnClick","setState","isPromoEnable","setTimeout","focusInput","focus","promoCodeInputValue","canApply","_onInputChange","e","updateCartlineQuantity","appliedPromo","cartState","previousAppliedPromo","bonusItemDeets","bonusItemsStateShare","bonusItemsResponse","requiresUpdateCartLines","cartLinesToBeAddedLater","bid","bItems","bi","qualifyingItemQuantity","laterToBeAddedCL","EntryMethodTypeValue","updateCartLinesAsync","refreshCart","checkQualifying","bonusItemCouponResponse","cartlineToUpdate","_applyPromotion","utm_promo","promoLoading","isOneOfDisabledPromos","previousPromoCode","setItem","stringify","showPromoAppliedMessage","duplicatePromoCodeErrorText","promoData","uuid","type","notificationItems","notifications","checkIsBonusCoupons","_isBonusCoupons","mfrmCartState","bonusLocalStorage","bonusItemsInfo","unshift","callUtagLink","event_category","event_action","event_label","event_noninteraction","upr","getUniqueAppliedPromos","bonusPrAlreadyAdded","apr","_qualifyingExists","isD365Applied","invalidPromoCodeErrorText","exceptionCustomMessage","mfrmDoesNotApplyToCartPromoCodeErrorText","mfrmExpiredPromoCodeErrorText","mfrmCannotBeCombinedPromoCodeErrorText","mfrmUsageLimitPromoCodeErrorText","timer","eval","addCartLinesAsync","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","promoCodeLabelText","onSubmit","preventDefault","LoadingButton","color","loading","size","_updateBonusItems","bonusItemsParams","removeItem","_removePromotion","currentTarget","getAttribute","currentPromoArray","getLocalPromoValue","BonusCouponCount","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","isD365Coupon","cp","uniqueAppliedPromos","ap","bonusCoupon","child","disabledPromos","disabledPromosNames","splittedDisabledPromos","disabledPromo","trim","_renderAppliedPromoCode","promoAppliedList","hasOneOfDisabledPromos","_getAppliedPromoCodes","notApplied","dataCoupon","disabledPromoMessage","disabledPromosNotAppliedText","notAppliedPromoText","Button","removePromoText","_getBonusCouponsArray","_setBonusCouponDetails","childToParentBonusCoupons","newObject","childCoupon","Object","keys","TelemetryConstant","isCollapseOpen","componentWillUnmount","clearTimeout","query","getCartState","componentDidUpdate","prevProps","prevState","render","promoCodeHeadingText","discountLinePromoCodes","bonusCouponDetails","cartCoupons","codeValue","currentCouponCode","PromoCodeComponent"],"sourceRoot":""}