{"version":3,"sources":["components/Common/ToggleDetailsButton/styles.module.scss","temp/config.js","components/Messaging/Alert.module.scss","components/SaveForLaterPopup/SaveForLater.module.scss","components/EnergyRates/EnergyRates.module.scss","components/Common/LoadingIcon/styles.module.scss","components/Common/LoadingOverlay/styles.module.scss","assets/img/prompt-payment-icon.png","assets/img/dual-energy-icon.png","assets/img/email-icon.png","assets/img/direct-debit-icon.png","components/Messaging/styles.module.scss","components/SVG/WhiteTick.svg","components/EnergyRates/Rates/RatesContent/RatesContent.module.scss","components/EnergyRates/Rates/RatesOverview/RatesOverview.module.scss","components/EnergyRates/Rates/Rates.module.scss","components/PromoPopup/Popup.module.scss","components/FormFields/TextInput.js","components/SVG/index.js","components/AddressPicker/LoadingAnimation.js","context/ActionsContext.js","context/UIContext.js","context/CustomerContext.js","context/PlandAndServicesContext.js","utils/address.js","enhancers/index.js","components/Icon/index.js","components/ToolTip/index.js","utils/id-generator.js","components/CTA/index.js","components/CTA/CTAButton.js","components/Common/LoadingIcon/index.js","components/Common/LoadingOverlay/index.js","components/FormFields/AddressInput.js","components/FormHeader/index.js","components/AddressPicker/index.js","enhancers/all-plans.js","actions/all-plans.js","components/AllPlans/ContinueButtonsWrapper.js","components/AllPlans/ContinueButtons.js","components/AllPlans/index.js","components/AllPlansContinueButton/index.js","utils/index.js","components/PlanCard/enhancers.js","components/Common/ToggleDetailsButton/index.js","components/AllPlansGroup/Item/ToggleDetailsButton.js","components/AllPlansGroup/Item/PlanDetails/constants.js","components/AllPlansGroup/Item/PlanDetails/DiscountsList.js","components/Common/Modal.js","components/PlanCard/PlanTAC.js","components/AllPlansGroup/Item/PlanDetails/TermsAndConditions.js","components/AllPlansGroup/Item/PlanDetails/index.js","components/AllPlansGroup/Item/index.js","components/AllPlansGroup/GroupItems.js","components/AllPlansGroup/index.js","components/BillCompare/enhancers.js","components/BillCompare/index.js","enhancers/common.js","constants.js","utils/plans-rules.js","components/Common/Carousel.js","components/Common/CarouselBBPlans.js","components/BroadbandContainer/index.js","components/BroadbandTiles/BBTileFace.js","components/BroadbandTiles/index.js","components/ContentBlock/index.js","components/ContinueButton/index.js","utils/shakeItWell.js","components/EnergyRates/Rates/constants.js","components/EnergyRates/Rates/utils.js","components/EnergyRates/Rates/Error.js","components/EnergyRates/Rates/RatesOverview/MultipleRates.js","components/EnergyRates/Rates/RatesOverview/Rate.js","components/EnergyRates/Rates/RatesOverview/index.js","components/EnergyRates/Rates/RatesContent/NoRates.js","components/ToolTip/infoTip.js","components/EnergyRates/Rates/RatesContent/DetailedRate.js","components/EnergyRates/Rates/RatesContent/index.js","components/EnergyRates/Rates/Rates.js","components/EnergyRates/NoAddress.js","components/EnergyRates/EnergyRates.js","components/FormIntro/index.js","components/InfoBanner/index.js","components/JourneyActionContainer/index.js","components/JourneyButton/index.js","components/PlanCard/Discounts.js","components/PlanCard/PlanDetails.js","components/PlanCard/PlanFace.js","components/PlanCard/index.js","components/LandingPlanPage/index.js","components/LpgUsage/index.js","components/Messaging/Alert.js","components/Messaging/index.js","components/MyDetails/index.js","components/Common/CarouselPlans.js","components/PlanFilter/index.js","components/Common/PlanFilterTab.js","components/Common/TabContainer.js","components/PlanFilter/utils.js","components/Common/PlanFilterTabContainer.js","components/BillCompare/BillCompareModal.js","components/PlansAndServices/index.js","enhancers/promo-code.js","components/PromoCodeBanner/index.js","components/PromoPopup/enhanders.js","components/PromoPopup/Popup.js","components/PromoPopup/PromoPopup.js","components/PromoPopup/index.js","components/FormFields/RadioButtonGroup.js","components/Summary/email-section.js","components/SaveForLaterPopup/index.js","components/SegmentBanner/index.js","components/SegmentBannerTile/index.js","components/Services/index.js","utils/api/customer.js","utils/api/index.js","components/Summary/particles.js","components/Summary/plan-section.js","components/Summary/promo-section.js","components/Summary/collapsible.js","components/Summary/services-section.js","components/Summary/index.js","components/SummaryContainer/index.js","components/WhyContact/index.js","temp/componentFactory.js","lib/SitecoreContextFactory.js","dataFetcher.js","data/Customer.js","components/Common/Alert.js","AppState.js","Layout.js","NotFound.js","RouteHandler.js","reducers/all-plans.js","reducers/index.js","store.js","AppRoot.js","index.js","lib/GraphQLClientFactory.js"],"names":["module","exports","TextInput","inputField","state","focused","value","props","existingValue","error","updateElementFocus","setState","onInputBlur","onBlurAction","focusOnInputField","focus","updateValue","element","required","pattern","RegExp","test","target","handler","addrKey","updateWithCheck","updateInputState","this","id","className","readOnly","classList","highlightError","join","onClick","title","type","onChange","ref","input","onFocus","onBlur","onKeyUp","Component","Winter","xmlns","width","height","viewBox","fill","fillRule","d","Summer","Card","x1","y1","x2","y2","stopColor","offset","Cross","stroke","strokeLinecap","strokeLinejoin","strokeWidth","Close","cx","cy","r","Download","DuelFuel","Electricity","transform","Email","x","y","rx","House","Clock","stroke-miterlimit","stroke-width","class","stroke-linecap","Check","clip-path","isolation","Exclamation","Loading","PipedGas","PPD","RedTick","Upload","BottledGas","QuestionMark","Broadband","WhiteTick","Info","LoadingAnimation","loadingElements","fields","CheckAddressStepOne","started","steps","completed","CheckAddressStepTwo","CheckAddressStepThree","nextProps","map","index","key","check","Load","loadingTypeComponent","ActionsContext","React","createContext","searchAddress","updateAddress","updateICPAddress","updateService","updatePlan","updateBroadband","setExpandRates","setLivingSituation","setShowBillCompareModal","setError","setPlanFilterTabsTitle","updatePlansAndServices","saveService","saveUsageType","savePlan","saveBB","toggleSelectedService","toggleLpgUsage","toggleSelectedPlan","toggleSelectedBB","updateEmailAddress","validateAndSavePromoCode","removePromoCode","restorePromoCode","registerPlan","pushEpValuesToDatalayer","pushImpressionsToDatalayer","pushPlanAndDetailsToDatalayer","registerGoal","UIContext","expandRates","livingSituationValue","usageType","returningUser","isTouch","showBillCompareModal","planFilterTabsTitles","CustomerContext","PlansAndServicesContext","selectedService","lpgUsage","selectedServiceName","selectedBroadband","selectedPlan","activeFilter","activeAlerts","getPostcodeFromAddress","address","match","isSouthIslandPostcode","postcode","Boolean","isSouthIslandAddress","isSouthIslandCustomer","customer","Property","PropertyInfo","Address","getCustomerAddress","withContextProps","Context","propNames","Consumer","context","reduce","acc","propName","withCustomer","withCustomerAddress","compose","mapProps","withPostCode","branch","renderNothing","withProps","withIsSouthIsland","isSouthIsland","withCustomerServiceRates","serviceRates","PriceChecker","ServiceRates","withAvailableServices","availableServices","AvailableServices","Services","withAvailableBroadband","availableBroadband","BroadbandOfferings","Offerings","Id","broadbandOfferings","withBestAvailableBroadband","bestAvailableBroadband","withCustomerPromoCode","customerPromoCode","Discounts","PromoCode","withFGFPromoCode","FGFPromoCode","inDiscount","inPriceChecker","CartInformation","Name","IsValid","IsReferralCode","withExperienceEditor","withSitecoreContext","sitecoreContext","isExperienceEditor","pageEditing","withUIContextProps","withReturningUser","withTouch","withSaving","withJourneyActions","withPromoState","withIsPopupOpenState","withActions","actions","withPlansAndServicesProps","PlandAndServicesContext","withSelectedPlan","withIsBachPlan","isBachPlan","withSelectedService","withSelectedBroadband","withJourneyType","journeyType","Customer","Action","withJourneyTypes","mappedJourneys","ShowOnlyForJourneyTypes","mappedJourneysIds","length","item","Value","parseInt","showBanner","includes","withJourneyVisibility","showComponent","withCustomerAccount","withHandlers","onTogglePlan","ApiPlanId","console","log","customerAccount","ExistingCustomer","AccountNumber","withPriceChecker","customerEligibilities","Eligibilities","withCustomerExistingEmail","existingEmail","CustomerInfo","EmailAddress","img","src","renderComponent","field","alt","ToolTip","content","style","backgroundColor","color","icon","Icon","head","body","idGen","Math","random","toString","substr","CTA","hovered","tooltipRef","tooltipBtnEnabled","e","preventDefault","disabled","onDisabledClick","getStateLabel","selected","SelectedLabel","HoverLabel","Label","getStateIcon","SelectedIcon","HoverIcon","toggleHover","flag","TT","isToolTipEnabled","activateToolTip","deActivateToolTip","tooltip","document","getElementById","clientHeight","styles","bottom","left","Object","assign","addEventListener","updateTooltip","removeEventListener","replace","$event","xShift","movementX","coords","getBoundingClientRect","totalWidth","window","innerWidth","right","xShiftFinal","getStateStyles","CTAColorSchema","borderColor","SelectedColor","SelectedBackgroundColor","HoverColor","HoverBackgroundColor","Color","BackgroundColor","getSubText","sub","HelperText","SubTitle","isInEE","TTDescription","TTHeading","toggleToolTip","$e","stopPropagation","getToolTip","TTImg","TTColor","subText","toolTip","buttonLabel","Jumbo","onMouseEnter","onMouseLeave","CTAButton","constructCTA","onDisableClick","LoadingIcon","LdsRing","borderTopColor","defaultProps","LoadingOverlay","bgColor","AddressPicker","selectedAddress","preselectedAddress","postponeAction","Promise","resolve","setTimeout","triggerEvent","el","createEvent","initEvent","dispatchEvent","addressSearch","isCheckingAutocomplete","searchResults","isSaveError","saveErrorMsg","clearTimeout","searchTimer","Addresses","trimedList","filter","i","manualAddressRequired","icpResults","updateManualValue","manualAddress","enableManualAddress","isCheckingAddress","scrollTop","addressInput","getElementsByClassName","offsetTop","innerHeight","scrollTo","top","behavior","getElementsByTagName","makeItScroll","collection","noAddressLink","which","keyCode","updateSelectedAddress","updateSelectedICPAddress","proceedWithoutICP","slideToDropdown","focusElement","divRef","link","ReactDOM","findDOMNode","indexOf","Street","Suburb","City","Code","manualAddressRefs","manualAddressInput","createRef","manualSuburbInput","manualCodeInput","manualCityInput","clearInputField","bind","checkForMultipleICPs","updateManualAddress","checkManualAddress","_","PartialAddress","IcpAddress","then","IcpEnabled","ICPLookupEnabled","ICPList","PossibleAddresses","values","val","jointLine","line","Moniker","toShake","firstEmpty","findIndex","manualInputs","current","toShakeInput","UnableToLocate","isSaving","data-testid","subTitle","div","tabIndex","ManualAddressToggle","ICPConfirmTitle","IcpNumber","call","ICPNotFoundTitle","ICPNotFoundLink","ManualStreetAddress","ManualSuburb","ManualPostCode","ManualCity","position","FormHeader","tag","Heading","getJourneyHeader","journey","header","HeadingText","MoveHouseTitle","AddHouseTitle","getSubTitle","Title","MoveHouseSubtitle","AddHouseSubtitle","AddressInput","withExpandedPlan","connect","expandedPlan","allPlans","withTogglePlanDetail","togglePlanDetail","planId","ContinueButtonsWrapper","children","rendering","elevation","expanded","name","AllPlans","Intro","AllPlansContinueButton","withState","setSaving","url","ContinueUrl","href","expiryDate","Date","setMilliseconds","getMilliseconds","options","expires","path","secure","domain","Cookies","remove","set","location","loading","ctaProps","getFieldValue","getImageFieldSrc","stripFieldTags","editable","withTogglePlanHandler","withExtractContentToState","extractFn","ToggleDetailsButton","expandedLabel","collapsedLabel","toggle","mobileInline","tableInline","Expanded","TabletInline","MobileInline","CollapsedLabel","ExpandedLabel","propTypes","PropTypes","string","isRequired","groupFields","object","setPropTypes","ViewDetailsLabel","HideDetailsLabel","UIToggleDetailsButton","DISCOUNTS","fieldName","PromptPaymentIcon","DualEnergyIcon","EmailIcon","DirectDebitIcon","DiscountText","fieldNumber","fieldText","DiscountsList","keys","discountKey","ContactModal","open","handleClose","onClose","aria-labelledby","aria-describedby","PlanTAC","pdfCTA","lab","label","text","TextColorInitialState","HexColor","TextInitialState","IconInitialState","BackgroundColorInitialState","TextHoverState","IconHoverState","TextColorHoverState","BackgroundColorHoverState","getDetailsStyles","TandCPdfStyle","TandCPdfLink","TandCTitle","TandCBodyText","withStateHandlers","isModalOpen","showModal","hideModal","existingFields","ViewTSCSText","PlanDetails","continueButtons","ShortDescription","DiscountsOverride","AvailabilityText","existingPlanFields","ExistingPlan","siteCoreId","uid","apiId","fixedTermEnd","ApiPlanFixedEndDate","fixedTerm","moment","isBefore","RewardLabel","PlanPromo","GroupItems","plans","plan","AllPlansGroup","TermRatesLabel","Plans","withBillCompare","component","toggleCompareBill","getDeviceFromWidth","breakpoints","withDevice","useState","device","setDevice","ro","useRef","useEffect","ResizeObserver","entry","contentRect","observe","disconnect","FAKE_PLANS","HASH_JOURNEYS","EMAIL_VALIDATION","planDoesNotMeetMandatoryRequirements","plansRules","services","doNotMeet","rules","planRules","mandatory","planMandatoryServices","serviceId","undefined","planDoesNotMeetSupportedRequirements","supported","planSupportedServices","doesPlanMeetRequirements","find","SliderContext","setInitialSlide","PrevArrow","NextArrow","slideCount","currentSlide","goTo","useScrollToSelectedOnce","slideIndex","useContext","scrollToSlide","setScrollToSlide","sliderEl","count","useMemo","Children","toArray","placeholder","slickGoTo","settings","dots","infinite","speed","slidesToShow","slidesToScroll","variableWidth","arrow","prevArrow","nextArrow","Provider","displayedPlans","forEach","child","customerTouEligible","f","eligible","getCustomerTou","postcodeval","isSouth","shouldRemoveChildCuzGeo","planID","isSouthLand","postalcode","geolocation","planList","ContactEnergy","Data","PlansRules","geographicalLocation","checkGeoLocation","shouldRemoveChildCuzTou","touPlan","isPlanHidden","removeService","serviceToRemove","servicePlanList","getServicesToRemove","push","cloneElement","displayPlans","getBroadbandId","BBExistingTile","ApiId","withPlaceholder","prop","allBroadbandIds","lifecycle","componentDidMount","componentDidUpdate","tiles","placeholders","BBDisclaimer","withSelected","withToggleHandler","onToggleBroadband","optionName","isShow","setShow","BBDataCapDesc","DataCapDesc","BBNetworkDesc","NetworkDesc","BYOModemAllowedMessage","BYOModemDesc","isBYOModemAllowed","BYOModemAllowed","toggleTAC","restoreOrReplace","price","BBOptions","finalPrice","Price","isRenderBundle","initialPrice","downloadSpeed","DownloadSpeed","uploadSpeed","UploadSpeed","EnableNorthPower","network","Vendor","NorthPowerDownloadSpeed","NorthPowerUploadSpeed","pricing","BundlePrice","OriginalPrice","BBOffering","BBBestFor","BBPlanRibbon","OptionName","BBLearnMoreDescription","p","withBroadbandProps","ContentBlock","Fragment","Content","withAnalytics","analyticsCall","disableAnalytics","clickHandler","pushContinueToSummaryToDatalayer","withPageErrors","ignoreValidation","pageErrors","validatePage","journeyActionsActive","withCTAFields","ContinueTitle","ContinueSubTitle","linkUrl","AlternativeContinueTo","ContinueTo","onBeforeRedirect","errors","visibleErrors","container","tabCon","shakeItWell","onLinkClicked","onBeforeOpenPopup","togglePopup","ContinueDisclaimer","SFLLinkVisible","LinkText","planCheck","CheckPlan","serviceCheck","CheckService","addressCheck","CheckAddress","bbCheck","CheckBroadband","pipedGasOnly","lpgOnly","LpgInfo","BottledGasUsage","lpgWithValues","lpgEnabled","addressSelected","planSelected","PlanInfo","PlanId","broadbandSelected","BroadbandId","servicesSelected","broadbandEnabled","Confirmation","JourneyType","hasAccount","accountField","SERVICE_ID_ELECTRICITY","SERVICE_ID_PIPED_GAS","hasMultipleRates","rates","lowRates","standardRates","getRateType","apiRateUnit","hasElectricityRatesError","rate","hasGasRatesError","parseRate","cents","Decimal","times","getSummedRates","getUsageTypeRates","rateType","summed","isNaN","add","sumRates","Error","classNames","classes","Rates","TopRow","RatesError","ErrorMsg","MultipleRates","RatesOverview","Single","Rate","summedRates","watt","day","totalRates","RateTitle","Mobile","titleMobile","Desktop","obj","RateValue","findSummedRatesForType","multipleRates","Multi","NoRates","DetailedRate","InfoTip","infotipClose","infotipOpen","onClickAway","placement","popper","RatesTTBackgroundColor","RatesTTDescription","disableHoverListener","usageTypeLabel","getSwitchRatesLabel","message","utLabel","toLowerCase","RateLabel","userRatesLabel","DetailRate","currentRates","areRatesToggleable","onToggleUsageType","DetailHeading","DetailTitle","ElectricitySectionLabel","LowLabel","StandardLabel","GasLabel","DetailLink","ToggleLabel","DetailData","DetailRates","RatesContent","NoElectricityRates","NoGasRates","Disclaimer","billCompare","BillCompare","CompareLabel","withExpandRatesHandler","toggleExpandRates","withToggleUsageTypeHandler","hasLowRates","hasStandardRates","areRatesValid","TopRowColumn","OpenLabel","CloseLabel","ToggleRates","NoAddress","ratesClasses","EnergyRates","withAddressCheck","withFields","definition","withRates","apiRates","labels","ElectricityLabel","ElectricityLabelMob","GasLabelMob","apiRate","apiServiceRate","apiDisplayRate","apiRateDescription","rateToPush","DisplayRate","Unit","RateDescription","powerType","PowerType","priceType","PriceType","UserType","apiUserType","isStandardUserRate","Service","withRatesErrors","hasElectricity","hasPipedGas","RatesUtil","withSavingOverlay","Text","InfoBanner","dismissBanner","_banner","onToggleLink","CTALink","background","titleColor","TitleColor","introColor","IntroColor","closeLinkColor","CloseLinkColor","banner","IsDismissible","CloseLink","CloseBtn","iconColor","withBackground","bkg","mob","backgroundImage","tab","desk","JourneyActionContainer","selectedJourney","journeyToggled","tooltipOpen","userAccountInput","updateUserAccount","validationMessage","UserAccountValidationMessage","requiredMessage","UserAccountRequiredMessage","UserAccountRequired","errorMessage","saveUserAccount","getActiveJourneys","arr","activeJourneys","JourneyAction","getActiveJourneyLabel","found","journeyId","onToggleJourneyType","isSelected","setJourneyType","success","isHashSet","hash","isUrlDriven","hasOwnProperty","presented","hashId","preset","toggleJourneyActions","validationPattern","UserAccountValidation","JourneyTitle","JourneyIntro","UserAccount","UserAccountInput","UserAccountHelper","isToggled","split","isDiscountSet","NumberField","TextField","Discount","showTooltip","amount","desc","expandedDesc","value1","PromptNumber","text1","PromptText","value2","DualNumber","text2","DualText","value3","DigitalNumber","text3","DigitalText","mainHandler","secondHandler","closeModal","detailsCTA","DetailsTermsAndConditionsStyle","DetailsTermsAndConditionsText","DetailsTitle","DetailsDescription","DetailsDisclaimer","PlanFace","logoFlipped","getRibbonBackground","PlanRibbonBackground","logoEnabled","AASFlogoEnabled","variant","flipLogo","fullView","logo","AASFlogoImage","ribbonBackground","ribbonSet","PlanRibbon","BestFor","onTouchStart","Description","FirstRowSingleLineText","FullPlanDetailsText","modalShowDiscounts","applyFilter","flat","customerChoiceIsYes","customerChoice","customerChoiceIsNo","MappedPlans","action","goNewCustomer","NewCustomer","JustGetSelectedPlan","goExistingCustomer","twoButtons","landingPlans","getMappedPlanIds","ActionsLabel","SelectedHoverColor","SelectedHoverBackgroundColor","LpgCTA","Header","Heating","HotWater","Cooking","css","Alert","AlertType","payload","transitionName","transition","transitionAppear","transitionAppearTimeout","transitionEnter","transitionLeave","Message","Msg","CloseButton","Messaging","closed","alert","alerts","Messages","active","Type","isRockGas","isNorthIslandOnly","isSouthIslandOnly","username","goToHomePage","heading","stateText","handleStateTextChange","CarouselPlans","Carousel","PlanFilterItem","filterIndex","tabTitle","prevProps","listedPlans","planCard","items","hidden","TabContainer","getActivePlans","plansForAnalitics","activePlans","setActiveFilter","activeIndex","getComponents","getRenderedChildren","specificFilter","handleActiveIndexUpdate","listedFilters","getListedFilters","leftAligned","LeftAligned","focusOnActivate","withDefaultActiveIndex","DefaultSelected","defaultActiveIndex","BillCompareModal","DisclaimerPopupShown","toggleDisclaimerPopup","BillCompareDisclaimerLinkContent","SummerEstimate","WinterEstimate","BillCompareHeading","season","BillCompareAdditional","BillCompareError","BillCompareCTALabel","BillCompareDisclaimer","BillCompareDisclaimerLink","BillCompareDisclaimerLinkColor","Estimates","Estimate","PlansAndServices","checkIfBBExists","option","checkDefaultPlan","foundPlan","getPlanFilterItems","itemId","checkDefaultServices","service","AutoSelected","onDefault","onDefaultName","ServiceId","ExistingService","names","componentName","getEnergyRates","getBillCompare","toggleFilterShown","generated","newChild","newProps","innerKey","defaultServices","allServices","extractAllServices","resetBroadband","resetPlan","prevState","snapshot","isAddressChanged","serviceSectionHeader","ServicesHeader","planSectionHeader","PlansHeader","planFilters","broadband","planFilterItems","energyRates","PlanFilterTabContainer","withPromoCode","promoCodeFieldName","promoCode","PromoCodeName","parseSitecoreDateTime","dateTime","withPromoCodeValidCheck","validFrom","ValidFrom","validTo","ValidTo","date","fromDate","toDate","isBetween","withRestrictedPlansCheck","restrictedPlans","isPromoCodeRestricted","isPromoCodeRestorable","withRegisterPromoCodeCloseGoal","closeGoalId","CloseGoal","catch","withRegisterPromoCodeApplyGoal","applyGoalId","ApplyGoal","onSavePromoCode","withApplyOrDissmissAction","setDismissed","promoDismissed","setPromoState","PromoCodeBanner","promoApplied","applyingPromo","applyPromoCode","MappedPromo","data","dismissPromoCode","closeAndTrigger","openPDF","TermsAndConditionsPDF","oldState","newState","promoCodeText","PromoBackground","textColor","PromoTextColor","SetPromoText","PromoText","TermsAndConditionsText","NoPromoText","TermsAndConditionsContent","withCustomerPromoCodeCheck","componentWillMount","showStraight","showApplied","appliedPromoCode","toUpperCase","mappedPromoCode","componentWillReceiveProps","updatedPromoCode","ApplyPromoText","withBackgroundImage","BackgroundImage","withStyles","TextColor","withPromoCodeButton","promoButtonText","PromoButtonText","wait","promise","withSavePromoCode","PromoPopupCon","BackdropProps","Backdrop","PromoPopup","XButton","Background","Headline","PromoButton","onApply","CloseLinkText","setOpen","applied","setApplied","isBannerAllowed","ShowBannerOnAction","bannerProps","MappedPromoBanner","display","injectProps","withDeviceCheck","desktopHide","HideDesktop","tabletHide","HideTablet","mobileHide","HideMobile","withShowOnLoad","triggerOnLoad","TriggerOnLoad","delay","TriggerOnLoadDelay","number","elapsed","setElapsed","subscription","timer","subscribe","unsubscribe","getTimeToIdleConfigForDevice","TimeToIdleMobile","TimeToIdle","withShowOnIdle","triggerOnIdle","TriggerOnIdle","timeToIdle","idle","setIdle","querySelector","userIsActive$","merge","event","fromEvent","pipe","throttleTime","takeUntil","repeat","getIdleTimer$","withIdleProps","withShowOnLeaveIntention","triggerOnLeaveIntention","TriggerOnLeaveIntention","leaveIntention","setLeaveIntention","clientY","debounceTime","pairwise","direction","abs","velocity","getMouseMoveToTopBar$","withLeaveIntentionProps","withPromoCodeDatasource","datasourceSet","Popup","RadioButtonGroup","row","aria-label","control","marginLeft","margin","autocomplete","updateEmailAddressValue","setEmailValue","emailInput","radioValue","setRadioValue","updateMarketingPermission","toggleMarketingPermission","EmailAddressLabel","EmailAddressDescription","evt","slideToOptions","checkEmailOptionAction","MarketingPermissionLabel","fontWeight","marginTop","marginBottom","fontSize","EmailDisclaimer","setMarketingPermissionValidationPassed","isPopupOpen","setExistingEmail","isValid","setisValid","emailError","setEmailError","setIsSaving","isSuccess","setIsSuccess","isFailedBefore","setIsFailedBefore","isUserInteracted","setIsUserInteracted","showErrorMessage","setShowErrorMessage","email","setEmail","setMounted","close","updateEmailErrorMessage","save","updatedData","SaveForLaterEmail","saveForLater","pushToDataLayer","sha256","onSuccess","emailvalue","onEmailUpdated","popupContainer","popupBackground","DescriptionBody","EmailError","EmailWrapper","wrapper","ValidationIcon","SuccessMessage","ErrorMessage","buttons","buttonsLeft","buttonText","CancelButtonText","buttonsRight","DoneButtonText","RetryButtonText","SaveButtonText","buttonsRightBusy","overlay","ring1","ring2","ring3","ring4","buttonsRightDisabled","withHideReturningUser","HideReturning","Hide","breakpoint","withGlobalState","globalSelectedPlan","globalLivingSituationValue","withSegmentBannerProps","desktop","tablet","mobile","bannerUrl","UseSecondary","defaultPlanId","DefaultPlanId","UsageType","autoExpandRates","AutoExpandRates","withSetLivingSituation","onToggleLivingSituation","newUsageType","ui","withAllServiceFields","withServiceId","withToggleServiceHandler","onToggleService","checkIfActionsComponentPresent","createRequestQueue","subject","Subject","resolvers","rejectors","data$","asObservable","scan","mergeWith","objValue","srcValue","Array","isArray","source$","axios","CancelToken","source","withLatestFrom","startWith","switchMap","prevSource","cancel","from","cancelToken","post","response","postData","token","catchError","err","of","first","next","reject","addResolvers","request","requestQueue","initialData","customerJourneyRequest","saveForLaterRequest","saveCustomerJourney","registerHotLeads","saveField","fieldToSave","getField","get","validatePromocode","code","search","getCustomerJourney","saveForLaterID","urlPromocode","timestamp","getTime","createStateApiSession","IsSuccessful","SessionId","goalId","Summaries","SummarySection","Details","Detail","rateDescription","subtitle","Switch","toggleType","cart","Plan","discounts","extras","Extras","PlanDetailsHeading","ApiPlan","extra","FormattedFixedEndDate","discount","DisplayText","checkingPromocode","promocodeError","promocodeMsg","promocodeSet","promocodeRemoved","promoRemovedWithRules","isFGFPromo","FGFRestricted","promoRemovedWithPlan","promoRemovedWithServices","promoOnMount","updatePromocodeValue","promocodeInput","checkPromocode","promocodeCartMsg","promoSet","existingPromo","PromocodeLabel","PromocodeRemovedMsgByPlan","PromocodeRemovedMsgByService","PromocodeRemovedMsgByType","PromocodeButtonLabel","PromocodeDisclaimer","CollapsibleRateSection","collapsed","collapsible","RatesOpenByDefault","toggleState","serviceTitle","serviceSubTitle","serviceIcon","currentRate","switchingUsageType","rateErrorMSG","RatesOpenLabel","RatesCloseLabel","IsLPGInCart","SelectedServices","isLPGActive","finalRates","rateArray","rateSet","modifiedLowRates","modifiedStandardRates","concat","constructSplitRates","ServicesAndRatesHeading","serviceToCheck","isActiveService","IsRateInCartInformation","ElectricityErrorMessage","BroadbandName","BroadbandFullName","newRate","BroadbandErrorMessage","PipedGasErrorMessage","Summary","emailDomainsData","EmailAddressSuggestedDomains","marketingPermissionValidationPassed","updateEmailTimer","emailInputValue","updateAutoComplete","afterAt","beforeAt","domains","dom","matchingDomains","promo","promocodeInputValue","triggerEmailError","triggerMarketingPermissionValidationError","marketingPermissionSection","api","restrictedWithRules","checkIfJourneyRulesSetAndRestricted","msg","isSet","promoRemoved","planRestricted","showErrorOnValidation","description","isPlanRestricted","checkIfPlanRestricted","checkIfRestrictedBasedOnServiceSelected","requiredservices","checkIfRestrictedBasedOnJourneySelected","allowedjourneys","isFGFAndNotJoin","isFGF","isLpgOnly","isPipedOnly","executeErrorPromoCode","status","reasons","reason","pushPromoCodeToDatalayer","living","removeAppliedPromoCode","checkIfLpgOnly","isTheOnly","checkIfPipedOnly","PromocodeHiddenFor","rule","checkIfJourneyRelatedPromoRestricted","isRestricted","restricted","allowedServices","requiredServicesFromCMS","sort","userSelectedServices","every","allowedJourneys","getAddressHeader","StreetAddressHeading","move","StreetAddressHeadingForMove","StreetAddressHeadingForAdd","history","goBack","pathname","pathMe","origin","pushSummaryToDatalayer","isRestrictedWithRules","isCodeSet","SitecoreContactId","setSitecoreGAId","trim","summary","marketingConfirmation","ReceiveNewsAndOffers","QASAddress","city","AddressDetails","pushSummaryOnProceedToDatalayer","property","streetAddressHeading","RatesDisclaimer","EmailSection","WhyContactPlaceholder","withRouter","SummaryContainer","back","WhyContact","Image","components","Map","componentFactory","BroadbandContainer","BroadbandTiles","ContinueButton","FormIntro","JourneyButton","LandingPlanPage","LpgUsage","MyDetails","PlanCard","PlanFilter","SaveForLaterPopup","SegmentBanner","SegmentBannerTile","SitecoreContextFactory","dataFetcher","myUrl","useMyOrigin","oldUrlParsed","protocol","hostname","port","dummyRoute","useMyDummy","method","withCredentials","CustomerJourney","LandingPage","IsExistingCustomer","HasDriversLicense","DriversLicense","SelectedICPNumber","FakeServices","ServicesFullNames","SitecorePlanItemId","PlanPPD","PlanRewards","ShowForCustomerType","PlanTermsAndConditionsModalText","PlanTermsAndConditionsPdfLink","DeselectedPlan","SelectedPlanFilter","AddressSameAsPostalAddress","ElectricityMeterType","ElectricityICP","GasICP","ElectricityUserType","Hazards","HasDogs","WithAnotherSupplier","OwnsProperty","IsBach","HaveFinalMeterReading","FinalElectricityMeterRead","FinalGasMeterRead","SendMeterReader","MoveInfo","BroadbandInfo","PaperlessDiscount","JoinDirectDebit","PaymentMethod","BillingCycle","JourneyRelated","ShowLoader","UsageQuestions","NumberOfOccupants","anchorOrigin","vertical","horizontal","autoHideDuration","ContentProps","AppState","route","plansAndServices","initializePlansRules","initializeServices","errorMsg","loadCustomerJourney","urlSearchParams","URLSearchParams","API","_getUpdatedCustomerState","initializePlansAndServices","isReturning","getLivingSituation","dataToUpdate","getSelectedServices","getLpgUsage","getSelectedServiceNames","getSelectedBroadband","getSelectedPlan","setStateApiCookie","sessionId","updatedEmailAddress","emailFieldToSave","FieldId","updatedAccount","permit","updatedMarketingPermission","marketingFieldToSave","promocodeFieldToSave","promoCodeRestoreFieldToSave","promocode","PlanRestricted","RequiredServices","AllowedJourneys","InvalidMessage","all","Payment","restored","updatedCustomer","setGasOnlyPlan","journeyToSet","choice","servicesFullNames","selectBroadband","setLpgOnlyPlan","isLpgOnlyPlan","deselectPlan","isGasOnlyPlan","setLpgUsage","selectPlan","PlanItemId","BBType","getAlerts","updateUsageType","updateLpgUsage","getPlanSiteCoreId","BBId","BBName","isIslandRestricted","rest","selectedServices","getAlertsBeforeRulesApplied","lpg","gas","srv","isElec","getServiceFullNameById","updatedLpgUsage","saveLpgUsage","forceSelect","isRestrictionReason","updateServices","doesNotMeetMandatory","doesNotMeetSupported","promises","reset","dataLayer","priceChecker","propertyIcp","icp","available","PricingAvailable","region","Region","provider","pricingCalc","IsMovingHouse","impressions","bodyClasses","getUserJourneyAction","impression","brand","category","list","ecommerce","getProductImpressions","getPlanName","click","actionField","products","detail","baid","promoCodeStatus","promoCodeApplicationStatus","optIn","hashedEmail","hashedAddress","hashedCity","hashedZip","strBuffer","TextEncoder","encode","crypto","subtle","digest","hashBuffer","hashArray","Uint8Array","hashHex","slice","siteCorePlanId","planExist","updateFakeServices","broadbandId","broadbandName","broadbandType","BroadbandType","usage","createElement","setAttribute","ontouchstart","existingService","togglingPlan","Layout","loader","appContainer","NotFound","site","language","ssrInitialState","RouteHandler","notFound","routeData","defaultLanguage","config","sitecore","setSitecoreContext","componentIsMounted","updateRouteData","sitecoreRoutePath","params","sitecoreRoute","startsWith","myRoute","useMyRoute","fetchOptions","layoutServiceConfig","host","sitecoreApiHost","querystringParams","sc_lang","sc_apikey","sitecoreApiKey","fetcher","dataApi","fetchRouteData","getRouteData","lang","previousProps","existingRoute","newRoute","isExperienceEditorActive","combineReducers","store","createStore","reducers","routePatterns","AppRoot","Router","graphQLClient","routeRenderFunction","client","contextFactory","routePattern","Route","render","renderFunction","__JSS_STATE__","ssrRawJson","JSON","parse","innerHTML","hydrate","initialGraphQLState","APOLLO_STATE","endpoint","ssr","initialCacheState","createPersistedQueryLink","BatchHttpLink","uri","credentials","cache","InMemoryCache","fragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","ApolloClient","ssrMode","ssrForceFetchDelay","restore","GraphQLClientFactory","graphQLEndpoint","rootElement","BrowserRouter"],"mappings":"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","file":"static/js/main.115b60a2.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"ToggleDetailsButton\":\"styles_ToggleDetailsButton__GJuIN\",\"ExpandedLabel\":\"styles_ExpandedLabel__GJQlF\",\"TableInline\":\"styles_TableInline__2lDds\",\"MobileInline\":\"styles_MobileInline__oC8B4\",\"Expanded\":\"styles_Expanded__3RH-z\",\"CollapsedLabel\":\"styles_CollapsedLabel__jO9_k\"};","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/bootstrap.js to modify the generation of this file.\nmodule.exports = {\n \"sitecoreApiKey\": \"{028113F5-50B6-480C-A235-B9E0E7DCF16F}\",\n \"sitecoreApiHost\": \"http://sc91.local\",\n \"jssAppName\": \"ijoin-react-app\",\n \"defaultLanguage\": \"en\",\n \"graphQLEndpointPath\": \"/api/ijoin-react-app\",\n \"graphQLEndpoint\": \"http://sc91.local/api/ijoin-react-app?sc_apikey={028113F5-50B6-480C-A235-B9E0E7DCF16F}\"\n};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Alert\":\"Alert_Alert__5zz7i\",\"warning\":\"Alert_warning__2eTY5\",\"error\":\"Alert_error__1WXYS\",\"transition\":\"Alert_transition__2g535\",\"AlertIcon\":\"Alert_AlertIcon__TcBin\",\"Message\":\"Alert_Message__2uAeI\",\"CloseButton\":\"Alert_CloseButton__1UQ_B\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"PromoPopupCon\":\"SaveForLater_PromoPopupCon__3CYX1\",\"Backdrop\":\"SaveForLater_Backdrop__3jRyn\",\"PromoPopup\":\"SaveForLater_PromoPopup__CCVgG\",\"Background\":\"SaveForLater_Background__1rRpn\",\"XButton\":\"SaveForLater_XButton__1DLxn\",\"popupContainer\":\"SaveForLater_popupContainer__hortg\",\"popupBackground\":\"SaveForLater_popupBackground__2tjyO\",\"container\":\"SaveForLater_container__1jW_c\",\"title\":\"SaveForLater_title__1ccyz\",\"icon\":\"SaveForLater_icon__2Qafi\",\"DescriptionBody\":\"SaveForLater_DescriptionBody__3HEzt\",\"EmailError\":\"SaveForLater_EmailError__2CaC0\",\"EmailWrapper\":\"SaveForLater_EmailWrapper__3x6iG\",\"ValidationIcon\":\"SaveForLater_ValidationIcon__2VaDW\",\"wrapper\":\"SaveForLater_wrapper__2w_Ua\",\"SuccessMessage\":\"SaveForLater_SuccessMessage__2uQOM\",\"Message\":\"SaveForLater_Message__1fKka\",\"Icon\":\"SaveForLater_Icon__3rjp7\",\"ErrorMessage\":\"SaveForLater_ErrorMessage__CJRHc\",\"buttons\":\"SaveForLater_buttons__hBM-g\",\"buttonsLeft\":\"SaveForLater_buttonsLeft__2By9W\",\"buttonText\":\"SaveForLater_buttonText__uKzNP\",\"buttonsRight\":\"SaveForLater_buttonsRight__2zhNG\",\"buttonsRightDisabled\":\"SaveForLater_buttonsRightDisabled__2oMe8\",\"buttonsRightBusy\":\"SaveForLater_buttonsRightBusy__3pmms\",\"overlay\":\"SaveForLater_overlay__1sa3s\",\"LdsRing\":\"SaveForLater_LdsRing__2f7Eg\",\"ring1\":\"SaveForLater_ring1__83aig\",\"ring2\":\"SaveForLater_ring2__qz8hK\",\"ring3\":\"SaveForLater_ring3__22xMw\",\"ring4\":\"SaveForLater_ring4__37i8c\",\"animationName\":\"SaveForLater_animationName__2tHtr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"EnergyRates\":\"EnergyRates_EnergyRates__3SSXE\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"LdsRing\":\"styles_LdsRing__3TywZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"LoadingOverlay\":\"styles_LoadingOverlay__1jAoF\"};","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAaCAYAAABPY4eKAAAAAXNSR0IArs4c6QAAA6NJREFUSA21V01oU0EQ3n1JaJr4A2qrhjat6UXEqqBJKBqybWOlVr2o1INeKoIUb/WgCBoPUgQFwYJ40YOCiHrQIooV+mJ/JBZRqHhL0lZIpVVaxaZNTHacV5tmk7y8vErdS2ZnZ+bbmdk3M6HkHxc0N5dEpuPbSYrXEgJrCKUAnIwbqDReZeFvqCwni5mmxQTEc/D7pdGXb3ZwztsByBHEGyWEDhEgU0ARmkiVeJFK3Nfi2SvJYOqsGuz5SHEj2knTusFDPt9q+jN1Ewg0oPEuY4n1dlX/86m0IfE34mQbiEQPAcBl5PeXlpS2b+x7MSnKKLQu8HFPc9lsfLYHpV+by1detHV3x3INqe2/NjVZZ3/87sBInbSaSpwbBl9NiHJFwcPuxvWEpwLo8cOaocAlUVkvHXKzTsLhnMlEa+2D8iddesCYMeT0QtjFLuhS0BAKu70n0M5IlLF1aTEpTaj9RmbIDeQnHO/kK2rnS+E5goF7GOa7czFyC9/CfMQLgo/u8TnwibautNK1xUAiLnYJI3S5mJzVQq6jjCfibtimyBpFhUhdvZekgCk8nkjuxOsFZmKkA40rrOxloPKmt72BbKb2rlyWf6EtP3p+HiWPFfQcD99TSoa1zS391GAyPUOtfXD0qCHL8wVP5r0J1zW4IJm6hS9859IhCmvYB3qimKLPI18mPVngogpN8i1YBj6LvOWj6Rjn1GYU85xj3Is5JyF3fVtNsPdOzln+lhJzPlOdg9U2igXLppVzJfy6HhQYpBdYveu/u5tXqcOpcxXnlmWFnawLvdmNdbxJrY6LICEne4BdsFvLc1G+KO0Yks9gXXgai8cGQnt8dm0FsEsSRAuCh1zsAN5wWGmj2oYypzXvZL8EUhdJJAcidWxz5iRDje3ea6OEbqmuLOvLCnvW4wOQgNI2FHiPqh8y6guURpEJu9lxbLvXDJS2VAV7Ff3FhUXmNM4CDCOlUWQo5fiIHmMoGzGX1YvaOghHUL5PJOlUksNLUXyCsRVoz4/57hT5/4Wej6RgWekB2NkepRtLVtgFuWUnQy7vVcx1q9lCdtlk+ZsCoAtc8QBS8IQa6OGlNhMFRHkDwOGexWwpFz9DXeCKgX+5wPwYNZ04ywHacIppyZ1idIMrF9C7Rjz7NkIicbDYAJnXWPQMBWqXwHxa8CVXYCIr+Fx8K6HQg6Pzfq3ROQ9cwk9MzXgxHn67X/ET+qBUrmoz6ady4O+fBhwKCq0/ds1kf3E+B48AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAdCAYAAACnmDyCAAAAAXNSR0IArs4c6QAABAdJREFUSA2dlWtoXFUQgOfcx77yqiQRbFP3RasWglTNJltbs5uulRUspqg/LFix4g8RBamlAYXiE6XUP1VQUfNDBX+opS2UwCZZW/FukloRf0ird3djok26RlsT93XvPeOclHvTvDbo/Ni558zMd86ZM3MWYA3RO7pRj8RmEZHVcpVqGYWNMTjLEOvyXfFna/muCaKNrJdBuhcRXprsjLWtBqsJurQj2coY3uAfGx4EBv1VDof+F6hcKe2hwJQIxgblFVJ7JyM7m8V4qdTcEQLuY0z6TASFU6mrpAarYD24FCLGq4LykZ5eQPAEMkMn7ECJSZ8iQK89vl6vCNITiSYO/CjK7CCjJNkBnDGdvgP2+Hq9IohdNd9jwL4KZ9Lz+bEDmNe6SKUQXKmmloH0zvgTlJstgWZPnw2wtVKBNrq96Xwkvk8U6vj2RMi2LQJNRHs2AMc3VVXuhfp6FM7ZSOy07WxwOUh5+wUZ20JHzptV4yQmk25hXwQyTN5HK35487dD+vjvVw5IPl8ZmHzUBiHyXkoYXT8+JoGrh3pmMjtTfFrYnf6ZiD7srZqFS0S+VVEk2VTUi1TNisuohNtG0pPZbT1+NKy8CJIV9Y6AlvpejybamWWeDI2mA86OLJyJEXUsOJaeMj3ed5se2aMCt1BARDCi1Eh9pzW6mhoFRMyFtdSPpKaoVHoUMSEEObYjw/O5aLybqUrCuyOq/n381IVrVidomz22Nb0JPyFYfmdHdP6/6Mqbwe3pb+074DPGJwRerLiWTAGyGx0Qpb3MZGmre1O4xRfbDoaereLs3DlBEQWa64x1rUhEvIUyPe6AuMQ0lJWtLS8erBcBpfM/mODz7c/dc98VVoQC56jRmySa2JFcVyxAp0hKat3AwmT8/s9n3j5mUtXOizl9GYsj51DouYEU5rqTF/DwYWfhqV276vSOWIHqbL8DyUd2RvOJB/7hxaLNcbSYEzbhYweIiiaAlu2IHbPnJLEKel39LS885+Ozc1Aa/Q6sywXbDn++/3EFLetUYHRQK9y9uyHbGX/ZrBgZ0YuhsfQztiMT57Ys/gVTVYMpcpGXyk3uzZtKGz75wGv8OgGTe580sFJ9h2rsJkrqQ/SIf0QPwuvBTDpvQ4SWApnhLyWJRdEHrcEzA+skxg5577xdFsY/Xn2rBJZ5nCAz1F8nXAwCoZHhp5ZChO98QQZH0hkxEMIa6u9SwyFXMf0NVH7Wp4Nu/ijT0uY16+q/zi0suLB21b8RCm8cKUKl/DhLrw0RsctAvFQKlM5qBhpmKqgNf72wQO0vOv6CiP+tqurWqTlNxTQ2b9SGfluw1v5atKMqyLdRm3DG+Wv/BSKWWAQCtJ6nAvT41687Unv95dZ/AXIexdpG/LTmAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAARCAYAAAA2cze9AAAAAXNSR0IArs4c6QAAApVJREFUOBG1VE9IFGEUf+/NzGpKeAkPIuGu1EWIIHeWUHImTSKwP6R1iIii8NAfkCAS6lLRoajMyECCDt26RNAhE3ZnCYvdlQykQ8SOWrJoRpGW5u7OvL5PmVy1SLZ6l/fm/d77zft+38dDEDYaMspnGa8gu3UMUCZz+RgCpBgpWoB8pjxmjeI8MfQTwA1F0+6v7etN5UMse97VbCtzMpmDLkBbAUI1yYkVwKciccIlEoPnb4xcyMynCLhH8pKUgjT1LAJ3urPfnyQbGkryobdD9RucdDbMROcVzdcueSEZlDLPWzJodNgh88JEzc7VXm4lfqS2ISB5bL3upFcvv4XUCxaIR9rYhfLJ9JfJscbG4gXk99Gw3ujPprNRItodiEdv5VYuIkdErkxEjgh/d/pz+vH7zS2rcouXxiNBs8rl2T5CvOiPRR4txReRe2Agbh0DwrdpZ+JZyjDWePlcP6xv3ZNFN0yoHBfE3bmYF/+SXIJFJVobAb6e+cYvh0PmDq+BW1p8QttrDjvdRNr+inj4oYct9SiFr0xExfuft1RTU9HM+GQrMLQT0CVAeMPsdgk0KeJBZmgWsvUiw6B4vueEJFeLi7ir1LK+ehzSL7vQpF6/fmZsKgaAW1Qg05+IdPrjkR4sxiokui3ynxRVExdnHfUnrJvow1oGt3pqGgak/rnkc7H8gwzskNEsnuLEUKju8LKiPyTsoLnP1o2Pov+AV/pzcgmK43aohNv9seg9r2ClPpCIPGBFNQH48pBuHPL60NbNcaFpqaIqNRUvws89IB8/FDQ2usADmkK7so57h1wGS2G4/rfEchhxD698Kq5zHHeT3I5qIfFpsWT6xXE+/IutmM1k9rqIrWLtVs89wf+1z38ArOwh9iBMfMEAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAARCAYAAAA2cze9AAAAAXNSR0IArs4c6QAAAYRJREFUOBGtlL1KA0EQx2fWYBfFwjrEdEb8QHIRRO9S2tgaKyGvID6DRbCztYlv4AuYUwS5K4ySlMlhreJHQIskO+4cLu4WAS/ewrFzszu/3f3P7GK37B0jwRERTUFKDRFHhFDPgKTD7PTs3PzNRT8lNryUd2be5OczdEsupQU1OcwVpiNtO2MCu47bAYJF05fIRuwUguaSjrHghcAv6oE0egueFPhYqhSHILc5LgPiKhdedkzGxJpHZa+qwG1Vduv8DZFa0Ya3Z8Ktnfcc954Ils0Jpo0IDwuBvxLvmOhcAK7lg2aL50Ql71SO6E6NtfUJLDgHmrBxtkTaEkCNfOjHYJ6XD5utnuOdDSmWKZZnYlnGLWz6J4ILwmtJUFNSrGoY2+o2HnBitc+S5a+as6YqoftqgTBy3AbDJFFNCKzmbn8rBvmaFkIf9WpJek4s688xfBqdSP5nrrVzdiZpPzCrts141nzwtLmbNZ3/tflVZK7SH0/6g49XdYzU3vN3+hopbv0bUueaWff7fMsAAAAASUVORK5CYII=\"","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Messaging\":\"styles_Messaging__2R0rm\"};","module.exports = __webpack_public_path__ + \"static/media/WhiteTick.cdc21e79.svg\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"DetailedRate\":\"RatesContent_DetailedRate__2I977\",\"DetailHeading\":\"RatesContent_DetailHeading__15RuG\",\"DetailTitle\":\"RatesContent_DetailTitle__2v66U\",\"DetailData\":\"RatesContent_DetailData__3ie-F\",\"DetailRates\":\"RatesContent_DetailRates__306x4\",\"DetailRate\":\"RatesContent_DetailRate__3Jxcd\",\"RateTitle\":\"RatesContent_RateTitle__3jE3d\",\"RateValue\":\"RatesContent_RateValue__1xj4X\",\"DetailLink\":\"RatesContent_DetailLink__1LIqj\",\"Desktop\":\"RatesContent_Desktop__vFdmk\",\"Mobile\":\"RatesContent_Mobile__12LSG\",\"Disclaimer\":\"RatesContent_Disclaimer__3yn_z\",\"BillCompare\":\"RatesContent_BillCompare__3-6vJ\",\"RatesError\":\"RatesContent_RatesError__3Cb7s\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"RatesOverview\":\"RatesOverview_RatesOverview__3NWhI\",\"Single\":\"RatesOverview_Single__2wyiZ\",\"RateTitle\":\"RatesOverview_RateTitle__2fd4s\",\"RateValue\":\"RatesOverview_RateValue__3W1ac\",\"Rate\":\"RatesOverview_Rate__1FDNS\",\"Multi\":\"RatesOverview_Multi__2K0cu\",\"Mobile\":\"RatesOverview_Mobile__1ir1i\",\"Desktop\":\"RatesOverview_Desktop__19ShJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"TopRow\":\"Rates_TopRow__UdMgQ\",\"TopRowColumn\":\"Rates_TopRowColumn__2RLlu\",\"ToggleRates\":\"Rates_ToggleRates__3ROez\",\"RatesError\":\"Rates_RatesError__2CDOc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"PromoPopupCon\":\"Popup_PromoPopupCon__2aQgg\",\"Backdrop\":\"Popup_Backdrop__1ejkh\",\"PromoPopup\":\"Popup_PromoPopup__2l9I5\",\"Background\":\"Popup_Background__2uzRe\",\"XButton\":\"Popup_XButton__2viM8\",\"Headline\":\"Popup_Headline__37b_k\",\"PromoButton\":\"Popup_PromoButton__2TMpQ\",\"CloseLink\":\"Popup_CloseLink__2-x8z\",\"Disclaimer\":\"Popup_Disclaimer__2pQ3a\"};","import React, { Component } from 'react';\r\n\r\nexport default class TextInput extends Component {\r\n inputField = null;\r\n state = {\r\n focused: false,\r\n value: this.props.existingValue ? this.props.existingValue : '',\r\n error: null,\r\n };\r\n\r\n updateElementFocus = () => {\r\n this.setState({\r\n focused: !this.state.focused,\r\n });\r\n };\r\n\r\n onInputBlur = () => {\r\n this.updateElementFocus();\r\n if (this.props.onBlurAction) {\r\n const { value, error } = this.state;\r\n this.props.onBlurAction(value, error);\r\n }\r\n };\r\n\r\n focusOnInputField = () => {\r\n this.inputField.focus();\r\n };\r\n\r\n updateValue = element => {\r\n let error = null;\r\n if (this.props.updateValue) {\r\n this.props.updateValue(element);\r\n }\r\n if (this.props.required && this.props.pattern) {\r\n const re = new RegExp(this.props.pattern);\r\n const valid = re.test(element.target.value);\r\n error = valid\r\n ? null\r\n : this.props.error || '';\r\n }\r\n if (this.props.handler && this.props.addrKey) {\r\n if (!error) {\r\n this.props.handler(this.props.addrKey, element.target.value);\r\n } else {\r\n this.props.handler(this.props.addrKey, null);\r\n }\r\n }\r\n if (this.props.updateWithCheck) {\r\n // for the case when error messages constructed on parent side\r\n error = this.props.updateWithCheck(element.target.value, error);\r\n }\r\n this.setState({\r\n value: element.target.value,\r\n error: error,\r\n });\r\n };\r\n\r\n updateInputState = state => {\r\n this.setState({\r\n ...state,\r\n });\r\n };\r\n\r\n render() {\r\n const { id, className, readOnly = false } = this.props;\r\n\r\n let classList = [\r\n 'text-input',\r\n this.state.focused ? 'focused' : null,\r\n this.state.value ? 'populated' : null,\r\n className ? className : null,\r\n this.state.error ? 'with-error' : null,\r\n !this.state.focused && this.state.error && this.props.highlightError\r\n ? 'shake-it'\r\n : null,\r\n ];\r\n\r\n return (\r\n
\r\n
\r\n \r\n this.updateValue(element)}\r\n ref={input => {\r\n this.inputField = input;\r\n }}\r\n onFocus={() => this.updateElementFocus()}\r\n onBlur={() => this.onInputBlur()}\r\n readOnly={readOnly}\r\n onKeyUp={\r\n this.props.onKeyUp ? this.props.onKeyUp : void 0\r\n }\r\n />\r\n {this.state.error ? (\r\n
{this.state.error}
\r\n ) : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\n\r\nconst Winter = () => (\r\n \r\n \r\n \r\n);\r\nconst Summer = () => (\r\n \r\n \r\n \r\n);\r\n\r\nconst ArrowDown = () => (\r\n \r\n \r\n \r\n);\r\nconst ArrowUp = () => (\r\n \r\n \r\n \r\n);\r\nconst Card = () => (\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 \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 \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 \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 \r\n \r\n \r\n \r\n \r\n);\r\nconst Cross = () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nconst CrossRed = () => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst Close = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nconst Download = () => (\r\n \r\n \r\n \r\n);\r\nconst DuelFuel = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst Electricity = () => (\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\nconst Email = () => (\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 \r\n \r\n);\r\n\r\nconst House = () => (\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 \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nconst Clock = () => (\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 \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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\nconst Check = () => (\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 \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 \r\n\r\n \r\n \r\n\r\n );\r\n\r\nconst Exclamation = () =>\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\r\nconst Loading = () => (\r\n \r\n \r\n \r\n);\r\nconst PipedGas = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst PPD = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst RedTick = () => (\r\n \r\n \r\n \r\n);\r\nconst Upload = () => (\r\n \r\n \r\n \r\n);\r\n\r\nconst BottledGas = () => (\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 \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 \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 \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 \r\n);\r\n\r\nconst QuestionMark = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst Broadband = () => (\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 \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 \r\n \r\n \r\n \r\n \r\n \r\n);\r\nconst VioletTick = () => (\r\n \r\n \r\n \r\n);\r\nconst WhiteTick = () => (\r\n \r\n \r\n \r\n);\r\nconst Info = () =>
i
;\r\n\r\nexport default null;\r\nexport {\r\n ArrowDown,\r\n ArrowUp,\r\n BottledGas,\r\n Broadband,\r\n Card,\r\n Cross,\r\n Close,\r\n CrossRed,\r\n Download,\r\n DuelFuel,\r\n Electricity,\r\n Email,\r\n House,\r\n Clock,\r\n Check,\r\n Exclamation,\r\n Loading,\r\n PipedGas,\r\n PPD,\r\n RedTick,\r\n Summer,\r\n Upload,\r\n Info,\r\n Winter,\r\n QuestionMark,\r\n VioletTick,\r\n WhiteTick,\r\n};\r\n","import React, { Component } from 'react';\r\nimport { Loading, RedTick } from '../SVG';\r\n\r\nexport default class LoadingAnimation extends Component {\r\n state = {\r\n loadingElements: [\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepOne &&\r\n this.props.fields.CheckAddressStepOne.value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[0] &&\r\n this.props.steps[0].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[0] &&\r\n this.props.steps[0].completed) ||\r\n false,\r\n },\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepTwo &&\r\n this.props.fields.CheckAddressStepTwo.value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[1] &&\r\n this.props.steps[1].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[1] &&\r\n this.props.steps[1].completed) ||\r\n false,\r\n },\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepThree &&\r\n this.props.fields.CheckAddressStepThree.value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[2] &&\r\n this.props.steps[2].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[2] &&\r\n this.props.steps[2].completed) ||\r\n false,\r\n },\r\n ],\r\n };\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (nextProps.steps) {\r\n this.setState({\r\n loadingElements: [\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepOne &&\r\n this.props.fields.CheckAddressStepOne.value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[0] &&\r\n this.props.steps[0].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[0] &&\r\n this.props.steps[0].completed) ||\r\n false,\r\n },\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepTwo &&\r\n this.props.fields.CheckAddressStepTwo.value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[1] &&\r\n this.props.steps[1].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[1] &&\r\n this.props.steps[1].completed) ||\r\n false,\r\n },\r\n {\r\n title:\r\n (this.props.fields.CheckAddressStepThree &&\r\n this.props.fields.CheckAddressStepThree\r\n .value) ||\r\n '',\r\n started:\r\n (this.props.steps &&\r\n this.props.steps[2] &&\r\n this.props.steps[2].started) ||\r\n false,\r\n completed:\r\n (this.props.steps &&\r\n this.props.steps[2] &&\r\n this.props.steps[2].completed) ||\r\n false,\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.state.loadingElements.map((element, index) => (\r\n \r\n ))}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst Load = props => {\r\n const loadingTypeComponent = props.check.completed ? (\r\n \r\n ) : props.check.started ? (\r\n \r\n ) : ( \r\n \r\n );\r\n return (\r\n
\r\n {loadingTypeComponent}\r\n
{props.check.title}
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nconst ActionsContext = React.createContext({\r\n searchAddress: async () => {},\r\n updateAddress: async () => {},\r\n updateICPAddress: async () => {},\r\n updateService: async () => {},\r\n updatePlan: async () => {},\r\n updateBroadband: async () => {},\r\n\r\n setExpandRates: () => {},\r\n setLivingSituation: () => {},\r\n setShowBillCompareModal: async () => {},\r\n setError: () => {},\r\n setPlanFilterTabsTitle: () => {},\r\n\r\n updatePlansAndServices: () => {},\r\n saveService: async () => {},\r\n saveUsageType: async () => {},\r\n savePlan: async () => {},\r\n saveBB: async () => {},\r\n toggleSelectedService: () => {},\r\n toggleLpgUsage: () => {},\r\n toggleSelectedPlan: async () => {},\r\n toggleSelectedBB: async () => {},\r\n\r\n updateEmailAddress: async () => {},\r\n validateAndSavePromoCode: async () => {},\r\n removePromoCode: async () => {},\r\n restorePromoCode: async () => {},\r\n\r\n registerPlan: () => {},\r\n\r\n pushEpValuesToDatalayer: () => {},\r\n pushImpressionsToDatalayer: () => {},\r\n pushPlanAndDetailsToDatalayer: () => {},\r\n\r\n registerGoal: async () => {},\r\n});\r\n\r\nexport default ActionsContext;\r\n","import React from 'react';\r\n\r\nconst UIContext = React.createContext({\r\n expandRates: false,\r\n livingSituationValue: null,\r\n usageType: 'S',\r\n returningUser: false,\r\n isTouch: false,\r\n showBillCompareModal: false,\r\n planFilterTabsTitles: [],\r\n});\r\n\r\nexport default UIContext;\r\n","import React from 'react';\r\n\r\nconst CustomerContext = React.createContext({\r\n});\r\n\r\nexport default CustomerContext;\r\n","import React from 'react';\r\n\r\nconst PlansAndServicesContext = React.createContext({\r\n selectedService: [],\r\n lpgUsage: [],\r\n selectedServiceName: [],\r\n selectedBroadband: null,\r\n selectedPlan: null,\r\n activeFilter: null,\r\n activeAlerts: [],\r\n});\r\n\r\nexport default PlansAndServicesContext;\r\n","/**\r\n * Returns postcode from specified address.\r\n * @param address\r\n * @returns {string|undefined}\r\n */\r\nexport function getPostcodeFromAddress(address) {\r\n if (!address) return;\r\n const match = address.match(/(\\d{4})(?:, [a-zA-Z0-9\\s]+)?$/);\r\n if (match) {\r\n return match[1];\r\n }\r\n}\r\n\r\n/**\r\n * Returns true, if postcode is from South Island.\r\n * @param postcode\r\n * @returns {boolean}\r\n */\r\nexport function isSouthIslandPostcode(postcode) {\r\n return Boolean(postcode && postcode.match(/^[789]/));\r\n}\r\n\r\n/**\r\n * Returns true, if specified address is in South Island.\r\n * @param address\r\n * @returns {boolean}\r\n */\r\nexport function isSouthIslandAddress(address) {\r\n if (!address) return false;\r\n const postcode = getPostcodeFromAddress(address);\r\n return isSouthIslandPostcode(postcode);\r\n}\r\n\r\n/**\r\n * Returns customer's address.\r\n * @param customer\r\n * @returns {string}\r\n */\r\nexport function getCustomerAddress(customer) {\r\n return (\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.Address\r\n );\r\n}\r\n\r\n/**\r\n * Returns true, if customer lives in South Island.\r\n * @param customer\r\n * @returns {boolean}\r\n */\r\nexport function isSouthIslandCustomer(customer) {\r\n const address = getCustomerAddress(customer);\r\n return Boolean(address && isSouthIslandAddress(address));\r\n}\r\n","import React from 'react';\r\nimport { withSitecoreContext } from '@sitecore-jss/sitecore-jss-react';\r\nimport { branch, compose, mapProps, withProps, renderNothing, withHandlers } from 'recompose';\r\n\r\nimport ActionsContext from '../context/ActionsContext';\r\nimport UIContext from '../context/UIContext';\r\nimport CustomerContext from '../context/CustomerContext';\r\nimport PlandAndServicesContext from '../context/PlandAndServicesContext';\r\n\r\nimport {\r\n getPostcodeFromAddress,\r\n isSouthIslandPostcode,\r\n} from '../utils/address';\r\n\r\n/**\r\n * HOC\r\n * Injects selected properties from provided context into\r\n * components props\r\n */\r\nexport const withContextProps = (\r\n Context,\r\n propNames = []\r\n) => Component => props => {\r\n function getContextProps(context) {\r\n return propNames.reduce((acc, propName) => {\r\n acc[propName] = context[propName];\r\n return acc;\r\n }, {});\r\n }\r\n\r\n return (\r\n \r\n {value => }\r\n \r\n );\r\n};\r\n\r\n/**\r\n * HOC\r\n * Injects customer data into customer property\r\n */\r\nexport const withCustomer = Component => props => (\r\n \r\n {value => }\r\n \r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer address as address prop.\r\n */\r\nexport const withCustomerAddress = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n address:\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.Address,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer postcode as postcode prop.\r\n */\r\nexport const withCustomerPostCode = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n postcode:\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.Address &&\r\n customer.Property.PropertyInfo.Address.postcode,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Does not render component if address not set.\r\n */\r\nexport const withHideIfNotAddress = compose(\r\n withCustomerAddress,\r\n branch(({ address }) => !address, renderNothing)\r\n);\r\n\r\n/**\r\n * HOC\r\n * Inject postcode property.\r\n */\r\nexport const withPostCode = compose(\r\n withCustomerAddress,\r\n withProps(({ address }) => ({\r\n postcode: address && getPostcodeFromAddress(address),\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects isSouthIsland property.\r\n */\r\nexport const withIsSouthIsland = compose(\r\n withPostCode,\r\n withProps(({ postcode }) => ({\r\n isSouthIsland: postcode && isSouthIslandPostcode(postcode),\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer address as address prop.\r\n */\r\nexport const withCustomerServiceRates = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n serviceRates:\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.ServiceRates,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects array of available services (ServiceIds) into\r\n * availableServices property.\r\n */\r\nexport const withAvailableServices = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n availableServices:\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.AvailableServices &&\r\n customer.PriceChecker.AvailableServices.Services,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects array of all available broadband options (ApiIds) into\r\n * availableBroadband property.\r\n */\r\nexport const withAvailableBroadband = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n availableBroadband:\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.BroadbandOfferings &&\r\n customer.PriceChecker.BroadbandOfferings.Offerings &&\r\n customer.PriceChecker.BroadbandOfferings.Offerings.map(\r\n ({ Id }) => Id\r\n ),\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects BroadbandOfferings\r\n * BroadbandOfferings property.\r\n */\r\nexport const withBroadbandOfferings = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n broadbandOfferings:\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.BroadbandOfferings \r\n }))\r\n);\r\n\r\nfunction getBestAvailable(availableBroadband) {\r\n if (!availableBroadband) return;\r\n\r\n if (availableBroadband.find(id => id.toLowerCase().includes('fibre'))) {\r\n return 'fibre';\r\n } else if (\r\n availableBroadband.find(id => id.toLowerCase().includes('vdsl'))\r\n ) {\r\n return 'vdsl';\r\n } else {\r\n return 'adsl';\r\n }\r\n}\r\n\r\n/**\r\n * HOC\r\n * Injects array of BEST available broadband options (ApiIds) into\r\n * bestAvailableBroadband property.\r\n */\r\nexport const withBestAvailableBroadband = compose(\r\n withAvailableBroadband,\r\n mapProps(({ availableBroadband, ...props }) => {\r\n //const bestAvailable = getBestAvailable(availableBroadband);\r\n return {\r\n ...props,\r\n bestAvailableBroadband: availableBroadband,\r\n //availableBroadband &&\r\n //availableBroadband.filter(id =>\r\n // id.toLowerCase().includes(bestAvailable)\r\n //),\r\n };\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer's promo code as a prop.\r\n */\r\nexport const withCustomerPromoCode = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n customerPromoCode:\r\n customer && customer.Discounts && customer.Discounts.PromoCode,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer's promo code as a prop.\r\n */\r\nexport const withFGFPromoCode = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n FGFPromoCode: (function() {\r\n const inDiscount =\r\n customer && customer.Discounts && customer.Discounts.PromoCode;\r\n const inPriceChecker =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.CartInformation &&\r\n customer.PriceChecker.CartInformation.PromoCode;\r\n const isValid =\r\n inPriceChecker &&\r\n inPriceChecker.Name === inDiscount &&\r\n inPriceChecker.IsValid &&\r\n inPriceChecker.IsReferralCode;\r\n return isValid ? inPriceChecker : null;\r\n })(),\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects isExperienceEditor prop into component.\r\n */\r\nexport const withExperienceEditor = compose(\r\n withSitecoreContext(),\r\n mapProps(({ sitecoreContext, ...props }) => ({\r\n ...props,\r\n isExperienceEditor: sitecoreContext.pageEditing,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects selected properties from UI context into\r\n * components props\r\n */\r\nexport const withUIContextProps = (propNames = []) =>\r\n withContextProps(UIContext, propNames);\r\n\r\n/**\r\n * HOC\r\n * Inject returningUser prop into component.\r\n */\r\nexport const withReturningUser = withUIContextProps(['returningUser']);\r\n\r\n/**\r\n * HOC\r\n * Inject isTouch prop into component.\r\n */\r\nexport const withTouch = withUIContextProps(['isTouch']);\r\n\r\n/**\r\n * HOC\r\n * Inject isSaving prop into component.\r\n */\r\nexport const withSaving = withUIContextProps(['isSaving']);\r\n\r\n/**\r\n * HOC\r\n * Inject withJourneyActions prop into component.\r\n */\r\nexport const withJourneyActions = withUIContextProps(['journeyActionsActive']);\r\n\r\n/**\r\n * HOC\r\n * Inject isTouch prop into component.\r\n */\r\nexport const withPromoState = withUIContextProps(['promoDismissed']);\r\n\r\n\r\n/**\r\n * HOC\r\n * Inject isPopupOpen prop into component.\r\n */\r\nexport const withIsPopupOpenState = withUIContextProps(['isPopupOpen']);\r\n\r\n\r\n/**\r\n * HOC\r\n * Injects app actions as a prop.\r\n */\r\nexport const withActions = Component => props => (\r\n \r\n {value => }\r\n \r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects selected properties from PlansAndServices context into\r\n * components props\r\n */\r\nexport const withPlansAndServicesProps = (propNames = []) =>\r\n withContextProps(PlandAndServicesContext, propNames);\r\n\r\n/**\r\n * HOC\r\n * Inject selectedPlan prop into component.\r\n */\r\nexport const withSelectedPlan = withPlansAndServicesProps(['selectedPlan']);\r\n\r\n/**\r\n * HOC\r\n * Injects isBachPlan prop into component.\r\n * @type {any}\r\n */\r\nexport const withIsBachPlan = compose(\r\n withSelectedPlan,\r\n mapProps(({ selectedPlan, ...props }) => ({\r\n ...props,\r\n isBachPlan: selectedPlan === 'BACH',\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Inject selectedPlan prop into component.\r\n */\r\nexport const withSelectedService = withPlansAndServicesProps([\r\n 'selectedService',\r\n]);\r\n\r\n/**\r\n * HOC\r\n * Inject selectedBroadband prop into component.\r\n */\r\nexport const withSelectedBroadband = withPlansAndServicesProps([\r\n 'selectedBroadband',\r\n]);\r\n\r\n/**\r\n * HOC\r\n * Injects allServices prop into a component as a prop.\r\n */\r\nexport const withAllServices = withPlansAndServicesProps(['allServices']);\r\n\r\n/**\r\n * HOC\r\n * Injects allPlans prop into a component as a prop.\r\n */\r\nexport const withAllPlans = withPlansAndServicesProps(['allPlans']);\r\n\r\n/**\r\n * HOC\r\n * Injects allPlans prop into a component as a prop.\r\n */\r\nexport const withPlansRules = withPlansAndServicesProps(['plansRules']);\r\n\r\n/**\r\n * HOC\r\n * Inject journeyType property.\r\n */\r\nexport const withJourneyType = compose(\r\n withCustomer,\r\n withProps(({ customer }) => ({\r\n journeyType: customer && customer.Customer && customer.Customer.Action,\r\n }))\r\n);\r\n\r\n// HOC\r\n// Check if journey types mapped to Banner - only render to allowed type\r\nexport const withJourneyTypes = compose(\r\n withJourneyType,\r\n withProps(({ fields, journeyType }) => {\r\n const mappedJourneys = fields && fields.ShowOnlyForJourneyTypes;\r\n const mappedJourneysIds =\r\n mappedJourneys && mappedJourneys.length\r\n ? mappedJourneys.map(\r\n item =>\r\n item &&\r\n item.fields &&\r\n item.fields.Value &&\r\n item.fields.Value.value &&\r\n parseInt(item.fields.Value.value, 10)\r\n )\r\n : [];\r\n return {\r\n showBanner:\r\n mappedJourneysIds && mappedJourneysIds.length\r\n ? mappedJourneysIds.includes(journeyType)\r\n ? true\r\n : false\r\n : true,\r\n };\r\n }),\r\n branch(({ showBanner }) => !showBanner, renderNothing)\r\n);\r\n\r\n// HOC\r\n// Check if journey types mapped to Banner - only render to allowed type\r\nexport const withJourneyVisibility = compose(\r\n withJourneyType,\r\n withProps(({ fields, journeyType }) => {\r\n const mappedJourneys = fields && fields.ShowOnlyForJourneyTypes;\r\n const mappedJourneysIds =\r\n mappedJourneys && mappedJourneys.length\r\n ? mappedJourneys.map(\r\n item =>\r\n item &&\r\n item.fields &&\r\n item.fields.Value &&\r\n item.fields.Value.value &&\r\n parseInt(item.fields.Value.value, 10)\r\n )\r\n : [];\r\n return {\r\n showComponent:\r\n mappedJourneysIds && mappedJourneysIds.length\r\n ? mappedJourneysIds.includes(journeyType)\r\n ? true\r\n : false\r\n : true,\r\n };\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Inject withTogglePlanHandler.\r\n */\r\nexport const withTogglePlanHandler = compose(\r\n withActions,\r\n withHandlers({\r\n onTogglePlan: ({ fields, actions }) => () => {\r\n const id = (fields && fields.ApiPlanId && fields.ApiPlanId.value) || null;\r\n console.log(\"onTogglePlan > id=\",id);\r\n actions.toggleSelectedPlan(id);\r\n }\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Inject journeyType property.\r\n */\r\nexport const withCustomerAccount = compose(\r\n withCustomer,\r\n withProps(({ customer }) => ({\r\n customerAccount:\r\n customer &&\r\n customer.ExistingCustomer &&\r\n customer.ExistingCustomer.AccountNumber,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects customer PriceChecker Eligibilities .\r\n */\r\nexport const withPriceChecker = compose(\r\n withCustomer,\r\n withProps(({ customer }) => ({\r\n customerEligibilities: customer && customer.PriceChecker && customer.PriceChecker.Eligibilities,\r\n }))\r\n);\r\n\r\nexport const withCustomerExistingEmail = compose(\r\n withCustomer,\r\n mapProps(({ customer, ...props }) => ({\r\n ...props,\r\n existingEmail:\r\n customer &&\r\n customer.Customer &&\r\n customer.Customer.CustomerInfo &&\r\n customer.Customer.CustomerInfo.EmailAddress,\r\n }))\r\n);\r\n ","import React from 'react';\r\nimport { Image } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderComponent, renderNothing } from 'recompose'; //withProps\r\nimport cx from 'classnames';\r\n\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\nconst IconImg = ({ img, className }) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst IconEditor = ({ img = null, className }) => (\r\n
\r\n \r\n
\r\n);\r\n\r\nexport default compose(\r\n withExperienceEditor,\r\n // Do not render if img src not set (except of when editing)\r\n branch(\r\n ({ isExperienceEditor, img }) =>\r\n !isExperienceEditor && !(img && img.value && img.value.src),\r\n renderNothing\r\n ),\r\n // Render icon editor if editing\r\n branch(\r\n ({ isExperienceEditor }) => Boolean(isExperienceEditor),\r\n renderComponent(IconEditor)\r\n )\r\n)(IconImg);\r\n","import React from \"react\";\r\nimport { RichText, Text } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport { default as Icon } from \"../Icon\";\r\n\r\nconst ToolTip = props => {\r\n return (\r\n \r\n {props.content.icon ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n {props.content.head ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {props.content.body ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n \r\n)};\r\n\r\nexport default ToolTip;\r\n","export const idGen = () => {\r\n return (\r\n \"uid\" +\r\n Math.random()\r\n .toString(36)\r\n .substr(2, 9)\r\n );\r\n};\r\n","import React, { Component } from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose } from 'recompose';\r\n\r\nimport { default as Icon } from '../Icon';\r\nimport { default as ToolTip } from '../ToolTip';\r\nimport { idGen } from '../../utils/id-generator';\r\n\r\nimport { withExperienceEditor, withTouch } from '../../enhancers';\r\n\r\nclass CTA extends Component {\r\n state = {\r\n hovered: false,\r\n };\r\n\r\n tooltipRef = null;\r\n // Enable additional Tooltip Btn on CTA for Touch devices\r\n tooltipBtnEnabled = this.props.isTouch;\r\n\r\n handler = e => {\r\n e.preventDefault();\r\n const { disabled, fields, onClick, onDisabledClick } = this.props;\r\n if (disabled) {\r\n onDisabledClick && onDisabledClick(fields);\r\n } else {\r\n onClick && onClick(fields);\r\n }\r\n };\r\n\r\n getStateLabel = () => {\r\n const fields = this.props.fields;\r\n if (this.props.selected) {\r\n return fields.SelectedLabel;\r\n }\r\n if (this.state.hovered) {\r\n return fields.HoverLabel;\r\n }\r\n return fields.Label;\r\n };\r\n\r\n getStateIcon = () => {\r\n const fields = this.props.fields;\r\n if (this.props.selected) {\r\n return fields.SelectedIcon;\r\n }\r\n if (this.state.hovered) {\r\n return fields.HoverIcon;\r\n }\r\n return fields.Icon;\r\n };\r\n\r\n toggleHover = (flag, TT) => {\r\n this.setState({\r\n hovered: flag,\r\n });\r\n\r\n if (this.isToolTipEnabled()) {\r\n if (flag) {\r\n this.activateToolTip(TT.id);\r\n } else {\r\n this.deActivateToolTip(TT.id);\r\n }\r\n }\r\n };\r\n\r\n activateToolTip = id => {\r\n const tooltip = document.getElementById(id);\r\n if (tooltip) {\r\n const height = tooltip.clientHeight;\r\n const styles = {\r\n bottom: `-${height + 15}px`,\r\n left: '15px',\r\n };\r\n Object.assign(tooltip.style, styles);\r\n this.tooltipRef = tooltip;\r\n tooltip.className += ' shown';\r\n document.addEventListener('mousemove', this.updateTooltip);\r\n }\r\n };\r\n\r\n deActivateToolTip = id => {\r\n document.removeEventListener('mousemove', this.updateTooltip);\r\n const tooltip = document.getElementById(id);\r\n if (tooltip) {\r\n tooltip.className = tooltip.className.replace('shown', '');\r\n }\r\n this.tooltipRef = null;\r\n };\r\n\r\n updateTooltip = $event => {\r\n const tooltip = this.tooltipRef;\r\n let xShift = $event.movementX;\r\n if (tooltip) {\r\n const coords = tooltip.getBoundingClientRect();\r\n const totalWidth = window && window.innerWidth;\r\n if (\r\n (coords.left - 15 < 0 && xShift < 0) ||\r\n (totalWidth && coords.right - 15 > totalWidth && xShift > 0)\r\n ) {\r\n xShift = 0;\r\n }\r\n const xShiftFinal = parseInt(tooltip.style.left, 10) + xShift;\r\n const styles = {\r\n left: `${xShiftFinal}px`,\r\n };\r\n Object.assign(tooltip.style, styles);\r\n }\r\n };\r\n\r\n getStateStyles = () => {\r\n let generated = {};\r\n let styles =\r\n this.props.fields &&\r\n this.props.fields.CTAColorSchema &&\r\n this.props.fields.CTAColorSchema.fields;\r\n if (!styles) {\r\n styles = this.props.fields;\r\n }\r\n if (this.props.selected) {\r\n generated = {\r\n borderColor: styles.SelectedColor.value,\r\n color: styles.SelectedColor.value,\r\n backgroundColor: styles.SelectedBackgroundColor.value,\r\n };\r\n } else if (this.state.hovered) {\r\n generated = {\r\n borderColor: styles.HoverColor.value,\r\n color: styles.HoverColor.value,\r\n backgroundColor: styles.HoverBackgroundColor.value,\r\n };\r\n } else {\r\n generated = {\r\n borderColor: styles.Color.value,\r\n color: styles.Color.value,\r\n backgroundColor: styles.BackgroundColor.value,\r\n };\r\n }\r\n\r\n return generated;\r\n };\r\n\r\n getSubText = () => {\r\n let sub = null;\r\n if (this.props.fields.HelperText) {\r\n sub = this.props.fields.HelperText;\r\n }\r\n if (this.props.fields.SubTitle) {\r\n sub = this.props.fields.SubTitle;\r\n }\r\n return sub;\r\n };\r\n\r\n isToolTipEnabled = (isInEE = false) => {\r\n if (isInEE) {\r\n return (\r\n this.props.fields.TTDescription || this.props.fields.TTHeading\r\n );\r\n }\r\n return (\r\n (this.props.fields.TTDescription &&\r\n this.props.fields.TTDescription.value) ||\r\n (this.props.fields.TTHeading && this.props.fields.TTHeading.value)\r\n );\r\n };\r\n\r\n toggleToolTip = ($e, id) => {\r\n $e.preventDefault();\r\n $e.stopPropagation();\r\n this.tooltipRef ? this.deActivateToolTip(id) : this.activateToolTip(id);\r\n };\r\n\r\n getToolTip = () => {\r\n const TT = {\r\n id: idGen(),\r\n };\r\n if (this.isToolTipEnabled()) {\r\n const fields = this.props.fields;\r\n TT.head = fields.TTHeading ? fields.TTHeading : '';\r\n TT.body = fields.TTDescription ? fields.TTDescription : '';\r\n TT.icon = fields.TTImg ? fields.TTImg : '';\r\n TT.color = fields.TTColor ? fields.TTColor : '';\r\n }\r\n return TT;\r\n };\r\n\r\n render() {\r\n const subText = this.getSubText();\r\n const toolTip = this.getToolTip();\r\n const fields = this.props.fields;\r\n const disabled = this.props.disabled;\r\n const textPattern = /<\\/?/;\r\n const buttonLabel = this.getStateLabel();\r\n\r\n const { isExperienceEditor, isTouch } = this.props;\r\n\r\n return (\r\n this.handler($event) : null\r\n }\r\n onMouseEnter={\r\n !isExperienceEditor && !disabled && !isTouch\r\n ? () => this.toggleHover(true, toolTip)\r\n : null\r\n }\r\n onMouseLeave={\r\n !isExperienceEditor && !disabled && !isTouch\r\n ? () => this.toggleHover(false, toolTip)\r\n : null\r\n }\r\n >\r\n
\r\n \r\n {isExperienceEditor ||\r\n (buttonLabel && buttonLabel.value) ||\r\n (subText && subText.value) ? (\r\n
\r\n \r\n \r\n \r\n {(!isExperienceEditor &&\r\n subText &&\r\n subText.value !== '') ||\r\n isExperienceEditor ? (\r\n
\r\n {textPattern.test(subText.value) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n ) : null}\r\n
\r\n ) : null}\r\n\r\n {/* {!isExperienceEditor &&\r\n this.tooltipBtnEnabled &&\r\n this.isToolTipEnabled() ? (\r\n \r\n this.toggleToolTip($event, toolTip.id)\r\n }\r\n >\r\n \r\n
\r\n ) : null} */}\r\n \r\n\r\n {isExperienceEditor && this.isToolTipEnabled(true) ? (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n ) : this.isToolTipEnabled(true) ? (\r\n \r\n ) : null}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(withExperienceEditor, withTouch)(CTA);\r\n","import React, { Component } from 'react';\r\nimport { default as CTA } from './index';\r\n\r\nexport default class CTAButton extends Component {\r\n\r\n fields = {};\r\n\r\n componentWillMount() {\r\n this.constructCTA(this.props);\r\n }\r\n\r\n constructCTA = (props) => {\r\n this.onClick = (props && props.onClick) || void(0);\r\n this.onDisableClick = (props && props.onDisableClick) || void(0);\r\n this.selected = (props && props.selected) || false;\r\n this.disabled = (props && props.disabled) || false;\r\n this.className = (props && props.className) || '';\r\n // Fields Level\r\n if (props && props.fields) {\r\n const fields = props.fields;\r\n this.fields.Jumbo = fields.Jumbo || {value: false};\r\n this.fields.HelperText = fields.HelperText || {value: ''};\r\n this.fields.SubTitle = fields.SubTitle || {value: ''};\r\n this.fields.Color = fields.Color || {value: '#303030'};\r\n this.fields.Label = fields.Label || {value: ''};\r\n this.fields.Icon = fields.Icon || {value: null};\r\n this.fields.BackgroundColor = fields.BackgroundColor || {value: 'transparent'};\r\n this.fields.SelectedLabel = fields.SelectedLabel || {value: ''};\r\n this.fields.SelectedIcon = fields.SelectedIcon || {value: null};\r\n this.fields.SelectedColor = fields.SelectedColor || {value: '#fff'};\r\n this.fields.SelectedBackgroundColor = fields.SelectedBackgroundColor || {value: '#303030'};\r\n this.fields.HoverLabel = fields.HoverLabel || {value: ''};\r\n this.fields.HoverIcon = fields.HoverIcon || {value: ''};\r\n this.fields.HoverColor = fields.HoverColor || {value: '#fff'};\r\n this.fields.HoverBackgroundColor = fields.HoverBackgroundColor || {value: '#303030'};\r\n this.fields.TTHeading = fields.TTHeading || {value: ''};\r\n this.fields.TTDescription = fields.TTDescription || {value: ''};\r\n this.fields.TTImg = fields.TTImg || {value: null};\r\n this.fields.TTColor = fields.TTColor || {value: 'transparent'};\r\n } else {\r\n this.fields.Jumbo = (props && props.Jumbo) || {value: false};\r\n this.fields.HelperText = (props && props.HelperText) || {value: ''};\r\n this.fields.SubTitle = (props && props.SubTitle) || {value: ''};\r\n this.fields.Color = (props && props.Color) || {value: '#303030'};\r\n this.fields.Label = (props && props.Label) || {value: ''};\r\n this.fields.Icon = (props && props.Icon) || {value: null};\r\n this.fields.BackgroundColor = (props && props.BackgroundColor) || {value: 'transparent'};\r\n this.fields.SelectedLabel = (props && props.SelectedLabel) || {value: ''};\r\n this.fields.SelectedIcon = (props && props.SelectedIcon) || {value: null};\r\n this.fields.SelectedColor = (props && props.SelectedColor) || {value: '#fff'};\r\n this.fields.SelectedBackgroundColor = (props && props.SelectedBackgroundColor) || {value: '#303030'};\r\n this.fields.HoverLabel = (props && props.HoverLabel) || {value: ''};\r\n this.fields.HoverIcon = (props && props.HoverIcon) || {value: ''};\r\n this.fields.HoverColor = (props && props.HoverColor) || {value: '#fff'};\r\n this.fields.HoverBackgroundColor = (props && props.HoverBackgroundColor) || {value: '#303030'};\r\n this.fields.TTHeading = (props && props.TTHeading) || {value: ''};\r\n this.fields.TTDescription = (props && props.TTDescription) || {value: ''};\r\n this.fields.TTImg = (props && props.TTImg) || {value: null};\r\n this.fields.TTColor = (props && props.TTColor) || {value: 'transparent'};\r\n }\r\n }\r\n\r\n render () {\r\n return ;\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types'\r\n\r\nimport styles from './styles.module.scss';\r\n\r\nconst propTypes = {\r\n color: PropTypes.string,\r\n};\r\nconst defaultProps = {\r\n color: '#fff',\r\n};\r\n\r\nconst LoadingIcon = ({ color }) => (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n);\r\nLoadingIcon.propTypes = propTypes;\r\nLoadingIcon.defaultProps = defaultProps;\r\n\r\nexport default LoadingIcon;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport LoadingIcon from '../LoadingIcon';\r\n\r\nimport styles from './styles.module.scss';\r\n\r\nconst propTypes = {\r\n color: PropTypes.string,\r\n bgColor: PropTypes.string,\r\n};\r\nconst defaultProps = {\r\n color: '#000',\r\n bgColor: '#fff',\r\n};\r\n\r\nconst LoadingOverlay = ({ color, bgColor }) => (\r\n
\r\n \r\n
\r\n);\r\nLoadingOverlay.propTypes = propTypes;\r\nLoadingOverlay.defaultProps = defaultProps;\r\n\r\nexport default LoadingOverlay;\r\n","import React, { Component } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose } from 'recompose';\r\nimport TextInput from './TextInput';\r\nimport LoadingAnimation from '../AddressPicker/LoadingAnimation';\r\nimport { Cross, Loading } from '../SVG';\r\n// import { default as Alert } from '../Common/Alert';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\nimport { withActions, withSaving } from '../../enhancers';\r\n\r\nclass AddressPicker extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n focused: false,\r\n value: '',\r\n\r\n isCheckingAddress: false,\r\n isCheckingAutocomplete: false,\r\n\r\n manualAddressRequired: false,\r\n selectedAddress: null,\r\n\r\n searchResults: [],\r\n icpResults: [],\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n };\r\n\r\n if (props && props.preselectedAddress) {\r\n this.state.selectedAddress = props.preselectedAddress;\r\n this.state.value = props.preselectedAddress;\r\n }\r\n\r\n this.inputField = null;\r\n this.searchTimer = null;\r\n\r\n this.steps = [\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n ];\r\n\r\n this.manualAddress = {\r\n Street: null,\r\n Suburb: null,\r\n City: null,\r\n Code: null, \r\n };\r\n\r\n this.manualAddressRefs = [];\r\n this.manualAddressInput = React.createRef();\r\n this.manualSuburbInput = React.createRef();\r\n this.manualCodeInput = React.createRef();\r\n this.manualCityInput = React.createRef();\r\n this.manualAddressRefs[0] = this.manualAddressInput;\r\n this.manualAddressRefs[1] = this.manualSuburbInput;\r\n this.manualAddressRefs[2] = this.manualCodeInput;\r\n this.manualAddressRefs[3] = this.manualCityInput;\r\n\r\n this.clearInputField = this.clearInputField.bind(this);\r\n this.updateSelectedAddress = this.updateSelectedAddress.bind(this);\r\n this.updateSelectedICPAddress = this.updateSelectedICPAddress.bind(\r\n this\r\n );\r\n this.checkForMultipleICPs = this.checkForMultipleICPs.bind(this);\r\n this.updateManualAddress = this.updateManualAddress.bind(this);\r\n this.checkManualAddress = this.checkManualAddress.bind(this);\r\n this.updateValue = this.updateValue.bind(this);\r\n this.proceedWithoutICP = this.proceedWithoutICP.bind(this);\r\n }\r\n\r\n componentWillReceiveProps(nextProps, _) {\r\n if (nextProps.preselectedAddress !== this.props.preselectedAddress) {\r\n this.setState({\r\n selectedAddress: nextProps.preselectedAddress || '',\r\n value: nextProps.preselectedAddress || '',\r\n });\r\n }\r\n }\r\n\r\n updateElementFocus = () => {\r\n this.setState(\r\n ({ focused }) => ({\r\n focused: !focused,\r\n }),\r\n () => {\r\n if (!this.state.focused) {\r\n if (!this.state.value) {\r\n this.setState({\r\n selectedAddress:\r\n this.props.preselectedAddress || '',\r\n value: this.props.preselectedAddress || '',\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n focusOnInputField = () => {\r\n this.inputField.focus();\r\n };\r\n\r\n postponeAction = () => {\r\n return new Promise(resolve => setTimeout(resolve, 1000));\r\n };\r\n\r\n async clearInputField() {\r\n this.setState({\r\n manualAddressRequired: false,\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isCheckingAutocomplete: false,\r\n isSaveError: false,\r\n value: '',\r\n saveErrorMsg: '',\r\n selectedAddress: null,\r\n });\r\n this.steps = [\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n ];\r\n this.focusOnInputField();\r\n }\r\n\r\n async updateSelectedAddress(address) {\r\n const { actions } = this.props;\r\n\r\n this.setState({\r\n value: address.PartialAddress,\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: true,\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n });\r\n\r\n this.steps[0] = { started: true, completed: false };\r\n try {\r\n const customer = await actions.updateAddress(address);\r\n this.steps[0] = { started: true, completed: true };\r\n this.steps[1] = { started: true, completed: false };\r\n this.checkForMultipleICPs(customer, address);\r\n } catch (error) {\r\n this.setState({\r\n selectedAddress: null,\r\n value: '',\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isSaveError: true,\r\n saveErrorMsg: 'Error: Unable to save current address',\r\n });\r\n }\r\n }\r\n\r\n async updateSelectedICPAddress(address) {\r\n const { actions } = this.props;\r\n\r\n this.setState({\r\n searchResults: [],\r\n icpResults: [],\r\n isSaveError: false,\r\n isCheckingAddress: true,\r\n saveErrorMsg: '',\r\n });\r\n\r\n this.steps[1] = { started: true, completed: false };\r\n try {\r\n await actions.updateICPAddress(address);\r\n this.setState({\r\n selectedAddress: address.IcpAddress,\r\n icpResults: [],\r\n isCheckingAddress: true,\r\n isSaveError: false,\r\n });\r\n this.steps[1] = { started: true, completed: true };\r\n this.steps[2] = { started: true, completed: false };\r\n\r\n try {\r\n // Call: Save ICP to Analitics\r\n actions.pushEpValuesToDatalayer();\r\n } catch (error) {\r\n console.log('Analitics error', error);\r\n }\r\n\r\n this.postponeAction().then(() => {\r\n this.steps[2] = { started: true, completed: true };\r\n this.setState({\r\n isCheckingAddress: false,\r\n });\r\n });\r\n } catch (error) {\r\n this.setState({\r\n selectedAddress: null,\r\n value: '',\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isSaveError: true,\r\n saveErrorMsg: 'Error: Unable to save current ICP number',\r\n });\r\n }\r\n }\r\n\r\n checkForMultipleICPs(customer, address) {\r\n const { fields, actions } = this.props;\r\n const IcpEnabled =\r\n fields && fields.ICPLookupEnabled && fields.ICPLookupEnabled.value;\r\n const ICPList =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.PossibleAddresses;\r\n\r\n if (IcpEnabled && ICPList && ICPList.length) {\r\n this.steps[2] = { started: true, completed: false };\r\n this.setState({\r\n searchResults: [],\r\n icpResults: ICPList,\r\n isCheckingAddress: false,\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n });\r\n } else {\r\n this.steps[1] = { started: true, completed: false };\r\n this.steps[2] = { started: true, completed: false };\r\n this.setState({\r\n searchResults: [],\r\n selectedAddress: address,\r\n value: address.PartialAddress,\r\n icpResults: [],\r\n isCheckingAddress: true,\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n });\r\n\r\n try {\r\n // Call: Save ICP to Analitics\r\n actions.pushEpValuesToDatalayer();\r\n } catch (error) {\r\n console.log('Analitics error', error);\r\n }\r\n\r\n this.postponeAction().then(() => {\r\n this.steps[1] = { started: true, completed: true };\r\n this.steps[2] = { started: true, completed: true };\r\n this.setState({\r\n isCheckingAddress: false,\r\n });\r\n });\r\n }\r\n }\r\n\r\n checkManualAddress() {\r\n return (\r\n Object.values(this.manualAddress).filter(val => val).length === 4\r\n );\r\n }\r\n\r\n triggerEvent = (el, type) => {\r\n if ('createEvent' in document) {\r\n var e = document.createEvent('HTMLEvents');\r\n e.initEvent(type, false, true);\r\n el.dispatchEvent(e);\r\n }\r\n };\r\n\r\n async updateManualAddress() {\r\n const valid = this.checkManualAddress();\r\n\r\n if (valid) {\r\n const { actions } = this.props;\r\n\r\n const jointLine = Object.values(this.manualAddress)\r\n .map(line => line)\r\n .join(', ');\r\n const address = {\r\n PartialAddress: jointLine,\r\n Moniker: null,\r\n };\r\n\r\n try {\r\n await actions.updateAddress(address);\r\n this.setState({\r\n selectedAddress: address.PartialAddress,\r\n value: address.PartialAddress,\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isSaveError: false,\r\n manualAddressRequired: false,\r\n });\r\n } catch (error) {\r\n this.setState({\r\n selectedAddress: null,\r\n value: '',\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isSaveError: true,\r\n saveErrorMsg: 'Error: Unable to save current address',\r\n });\r\n }\r\n } else {\r\n let toShake = document.getElementsByClassName('input-error');\r\n if (toShake && toShake.length) {\r\n toShake = toShake[0];\r\n toShake.className += ' shake-it';\r\n setTimeout(() => {\r\n toShake.className = toShake.className.replace(\r\n 'shake-it',\r\n ''\r\n );\r\n }, 1500);\r\n } else {\r\n // No value entered\r\n const firstEmpty = Object.values(this.manualAddress).findIndex(\r\n val => !val\r\n );\r\n const manualInputs = document.getElementsByClassName(\r\n 'manual-address-input'\r\n );\r\n if (\r\n firstEmpty >= 0 &&\r\n firstEmpty < this.manualAddressRefs.length\r\n ) {\r\n this.manualAddressRefs[firstEmpty].current.updateValue({\r\n target: { value: '' },\r\n });\r\n try {\r\n const toShakeInput = manualInputs[firstEmpty];\r\n toShakeInput.className += ' shake-it';\r\n setTimeout(() => {\r\n toShakeInput.className = toShakeInput.className.replace(\r\n 'shake-it',\r\n ''\r\n );\r\n }, 1500);\r\n } catch {}\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateValue = e => {\r\n const addressSearch = e.target.value;\r\n const { actions } = this.props;\r\n\r\n if (addressSearch.length >= 1) {\r\n this.setState({\r\n value: addressSearch,\r\n isCheckingAutocomplete: true,\r\n searchResults: [],\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n });\r\n\r\n clearTimeout(this.searchTimer);\r\n this.searchTimer = setTimeout(async () => {\r\n let trimmed = addressSearch;\r\n trimmed = trimmed.replace(/^([0-9]*\\s*)|\\s*/gi, '');\r\n\r\n if (trimmed.length >= 1) {\r\n try {\r\n const address = await actions.searchAddress(\r\n addressSearch\r\n );\r\n if (address.Addresses && address.Addresses.length) {\r\n // Get first 5\r\n const trimedList = address.Addresses.filter(\r\n (el, i) => i <= 4\r\n );\r\n this.steps = [\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n { started: false, completed: false },\r\n ];\r\n this.setState({\r\n isCheckingAutocomplete: false,\r\n manualAddressRequired: false,\r\n searchResults: trimedList,\r\n });\r\n // Commented temporary per Slav's comment on bug report\r\n //this.scrollTop();\r\n } else {\r\n this.setState({\r\n isCheckingAutocomplete: false,\r\n manualAddressRequired: true,\r\n });\r\n }\r\n } catch (error) {\r\n this.setState({\r\n isCheckingAutocomplete: false,\r\n manualAddressRequired: true,\r\n });\r\n }\r\n }\r\n }, 1000);\r\n } else {\r\n this.setState({\r\n value: '',\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAutocomplete: false,\r\n });\r\n }\r\n };\r\n\r\n updateManualValue = (key, value) => {\r\n return (this.manualAddress[key] = value);\r\n };\r\n\r\n enableManualAddress = () => {\r\n this.setState({\r\n manualAddressRequired: true,\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n });\r\n };\r\n\r\n scrollTop = () => {\r\n return setTimeout(() => {\r\n const addressInput = document.getElementsByClassName(\r\n 'address-input'\r\n );\r\n if (addressInput && addressInput.length) {\r\n const scrollTop =\r\n addressInput[0].offsetTop -\r\n (window && window.innerHeight / 3);\r\n if (window && window.scrollTo) {\r\n window.scrollTo({\r\n top: scrollTop,\r\n left: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n const root = document.getElementsByTagName('html')[0];\r\n root.scrollTop = scrollTop;\r\n }\r\n }\r\n }, 500);\r\n };\r\n\r\n makeItScroll = (e, i, address, type) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const collection = document.getElementsByClassName('result');\r\n const noAddressLink =\r\n document.getElementsByClassName('noaddress') &&\r\n document.getElementsByClassName('noaddress')[0];\r\n if (e.which === 38 || e.keyCode === 38) {\r\n if (i < 0) {\r\n collection[collection.length - 1].focus();\r\n }\r\n if (i > 0) {\r\n collection[i - 1].focus();\r\n }\r\n if (i === 0) {\r\n this.focusOnInputField();\r\n // noAddressLink\r\n // ? noAddressLink.focus()\r\n // : collection[collection.length - 1].focus();\r\n }\r\n }\r\n if (e.which === 40 || e.keyCode === 40) {\r\n if (i < 0) {\r\n collection[0].focus();\r\n }\r\n if (i < collection.length - 1) {\r\n collection[i + 1].focus();\r\n }\r\n if (i === collection.length - 1) {\r\n noAddressLink ? noAddressLink.focus() : collection[0].focus();\r\n }\r\n }\r\n if (e.which === 13 || e.keyCode === 13) {\r\n if (type === 'address') {\r\n this.updateSelectedAddress(address);\r\n }\r\n if (type === 'manual') {\r\n this.enableManualAddress();\r\n }\r\n if (type === 'icp') {\r\n this.updateSelectedICPAddress(address);\r\n }\r\n if (type === 'noicp') {\r\n this.proceedWithoutICP();\r\n }\r\n }\r\n };\r\n\r\n slideToDropdown = e => {\r\n if (e.which === 40 || e.keyCode === 40) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const collection = document.getElementsByClassName('result');\r\n if (collection && collection.length) {\r\n collection[0].focus();\r\n }\r\n }\r\n };\r\n\r\n focusElement = ref => {\r\n setTimeout(() => {\r\n if (this.divRef) {\r\n const link = ReactDOM.findDOMNode(this.divRef);\r\n if (link.className.indexOf('touched') < 0) {\r\n link.focus();\r\n link.className += ' touched';\r\n }\r\n }\r\n }, 300);\r\n };\r\n\r\n proceedWithoutICP() {\r\n this.setState({\r\n searchResults: [],\r\n icpResults: [],\r\n isCheckingAddress: false,\r\n isSaveError: false,\r\n saveErrorMsg: '',\r\n });\r\n\r\n this.steps[0] = { started: true, completed: true };\r\n this.steps[1] = { started: false, completed: false };\r\n this.steps[2] = { started: false, completed: false };\r\n }\r\n\r\n render() {\r\n let classList = [\r\n 'text-input',\r\n this.state.focused ? 'focused' : null,\r\n this.state.value ? 'populated' : null,\r\n ];\r\n const UnableToLocate = this.props.fields.UnableToLocate;\r\n const isSaving = this.props.isSaving;\r\n\r\n return (\r\n \r\n
\r\n \r\n {\r\n this.inputField = input;\r\n }}\r\n onFocus={() => this.updateElementFocus()}\r\n onBlur={() => this.updateElementFocus()}\r\n />\r\n {this.state.value && (\r\n \r\n \r\n \r\n )}\r\n {this.state.isCheckingAutocomplete && }\r\n
\r\n {this.state.manualAddressRequired && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {this.state.searchResults.length >= 1 && (\r\n
\r\n {this.state.searchResults.map((address, index) => (\r\n \r\n this.updateSelectedAddress(address)\r\n }\r\n onKeyUp={e =>\r\n this.makeItScroll(\r\n e,\r\n index,\r\n address,\r\n 'address'\r\n )\r\n }\r\n key={index}\r\n ref={\r\n index === 0\r\n ? div => {\r\n this.divRef = div;\r\n }\r\n : null\r\n }\r\n tabIndex={0}\r\n >\r\n {address.PartialAddress}\r\n {/* {index === 0\r\n ? this.focusElement.call(this, address)\r\n : null} */}\r\n
\r\n ))}\r\n this.enableManualAddress()}\r\n onKeyUp={e =>\r\n this.makeItScroll(e, -1, null, 'manual')\r\n }\r\n >\r\n \r\n {this.props.fields.ManualAddressToggle.value}\r\n \r\n
\r\n
\r\n )}\r\n\r\n {this.state.icpResults.length >= 1 && (\r\n
\r\n

{this.props.fields.ICPConfirmTitle.value}

\r\n {this.state.icpResults.map((address, index) => (\r\n \r\n this.updateSelectedICPAddress(address)\r\n }\r\n onKeyUp={e =>\r\n this.makeItScroll(e, index, address, 'icp')\r\n }\r\n ref={\r\n index === 0\r\n ? div => {\r\n this.divRef = div;\r\n }\r\n : null\r\n }\r\n tabIndex={0}\r\n >\r\n \r\n {address.IcpAddress}\r\n {' - '}\r\n \r\n \r\n {' ICP: '}\r\n {address.IcpNumber}\r\n \r\n\r\n {index === 0\r\n ? this.focusElement.call(this, address)\r\n : null}\r\n
\r\n ))}\r\n \r\n this.makeItScroll(e, -1, null, 'noicp')\r\n }\r\n onClick={this.proceedWithoutICP}\r\n >\r\n {this.props.fields.ICPNotFoundTitle.value}{' '}\r\n \r\n {this.props.fields.ICPNotFoundLink.value}\r\n \r\n
\r\n
\r\n )}\r\n\r\n {this.state.isCheckingAddress && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {this.state.manualAddressRequired && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {isSaving && (\r\n \r\n )}\r\n
\r\n \r\n )}\r\n\r\n {this.state.isSaveError ? (\r\n
\r\n An Error occured while saving your Address. Please try\r\n again later.\r\n
\r\n ) : null}\r\n\r\n {/* {this.state.manualAddressRequired ? (\r\n \r\n ) : null} */}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(\r\n withActions,\r\n withSaving\r\n)(AddressPicker);\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nconst FormHeader = (props) => (\r\n
\r\n \r\n
\r\n);\r\n\r\nexport default FormHeader;\r\n","import React, { Component } from 'react';\r\nimport { compose, withProps, branch, renderNothing } from 'recompose';\r\nimport AddressInput from '../FormFields/AddressInput';\r\nimport Header from '../FormHeader';\r\nimport { withCustomerAddress, withJourneyType, withJourneyTypes } from '../../enhancers';\r\n\r\nclass AddressPicker extends Component {\r\n getJourneyHeader = () => {\r\n const { fields } = this.props;\r\n const journey = this.props.journeyType;\r\n let header = fields.HeadingText;\r\n if (parseInt(journey, 10) === 1) {\r\n header =\r\n fields.MoveHouseTitle && fields.MoveHouseTitle.value\r\n ? fields.MoveHouseTitle\r\n : header;\r\n }\r\n if (parseInt(journey, 10) === 2) {\r\n header =\r\n fields.AddHouseTitle && fields.AddHouseTitle.value\r\n ? fields.AddHouseTitle\r\n : header;\r\n }\r\n return header;\r\n };\r\n\r\n getSubTitle = () => {\r\n const { fields } = this.props;\r\n const journey = this.props.journeyType;\r\n let subTitle = fields.Title;\r\n if (parseInt(journey, 10) === 1) {\r\n subTitle =\r\n fields.MoveHouseSubtitle && fields.MoveHouseSubtitle.value\r\n ? fields.MoveHouseSubtitle\r\n : subTitle;\r\n }\r\n if (parseInt(journey, 10) === 2) {\r\n subTitle =\r\n fields.AddHouseSubtitle && fields.AddHouseSubtitle.value\r\n ? fields.AddHouseSubtitle\r\n : subTitle;\r\n }\r\n return subTitle;\r\n };\r\n\r\n render() {\r\n const { fields, address } = this.props;\r\n const header = this.getJourneyHeader();\r\n const subTitle = this.getSubTitle();\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(\r\n withJourneyTypes,\r\n withCustomerAddress,\r\n withJourneyType\r\n)(AddressPicker);\r\n","import { connect } from 'react-redux';\r\nimport { togglePlanDetail } from '../actions/all-plans';\r\n\r\nexport const withExpandedPlan = connect(\r\n state => ({ expandedPlan: state.allPlans })\r\n);\r\n\r\nexport const withTogglePlanDetail = connect(\r\n null,\r\n { togglePlanDetail }\r\n);\r\n","export const TOGGLE_PLAN_DETAIL = '@@ALL_PLANS/TOGGLE_PLAN_DETAIL';\r\n\r\nexport function togglePlanDetail(planId) {\r\n return {\r\n type: TOGGLE_PLAN_DETAIL,\r\n planId,\r\n }\r\n}\r\n","import React from 'react';\r\n\r\nconst ContinueButtonsWrapper = ({ children }) => (\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n);\r\n\r\nexport default ContinueButtonsWrapper;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport { withExpandedPlan } from '../../enhancers/all-plans';\r\n\r\nimport ContinueButtonsWrapper from './ContinueButtonsWrapper';\r\nimport ExpansionPanel from '@material-ui/core/ExpansionPanel';\r\n\r\nconst propTypes = {\r\n rendering: PropTypes.object.isRequired,\r\n};\r\n\r\nconst ContinueButtons = ({ rendering, expandedPlan }) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nContinueButtons.propTypes = propTypes;\r\n\r\nexport default withExpandedPlan(ContinueButtons);\r\n","import React from 'react';\r\nimport { Text, Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport ContinueButtons from './ContinueButtons';\r\n\r\nconst AllPlans = ({ fields, rendering }) => (\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\nexport default AllPlans;\r\n","import React from 'react';\r\nimport { compose, withHandlers, withState } from 'recompose';\r\nimport Cookies from 'js-cookie';\r\n\r\nimport { withActions } from '../../enhancers';\r\n\r\nimport CTA from '../CTA';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\n\r\nconst AllPlansContinueButton = compose(\r\n // use internal state instead of global, otherwise all buttons\r\n // will have loading indicator on\r\n withState('isSaving', 'setSaving', false),\r\n withActions,\r\n withHandlers({\r\n onClick: ({ planId, fields, actions, isSaving, setSaving }) => async () => {\r\n if (isSaving) return;\r\n\r\n if (planId) {\r\n setSaving(true);\r\n try {\r\n await actions.toggleSelectedPlan(planId, true);\r\n } catch (err) { }\r\n setSaving(false);\r\n }\r\n const url = (\r\n fields.ContinueUrl &&\r\n fields.ContinueUrl.value &&\r\n fields.ContinueUrl.value.href\r\n );\r\n\r\n if (url && typeof window != 'undefined') {\r\n const expiryDate = new Date();\r\n expiryDate.setMilliseconds(expiryDate.getMilliseconds() + 60000);\r\n let options = {\r\n expires: expiryDate,\r\n path: '/',\r\n secure: true,\r\n domain: '.contact.co.nz'\r\n };\r\n Cookies.remove('sharedPlanId');\r\n Cookies.remove('selectedService');\r\n\r\n Cookies.set('sharedPlanId', planId, options);\r\n\r\n window.location = url;\r\n }\r\n }\r\n })\r\n)(({ isSaving, loading, actions, planId, ...ctaProps }) => (\r\n
\r\n
\r\n \r\n {planId && isSaving && (\r\n \r\n )}\r\n
\r\n
\r\n));\r\n\r\nexport default AllPlansContinueButton;\r\n","export function getFieldValue(field) {\r\n return field && field.value;\r\n}\r\n\r\nexport function getImageFieldSrc(field) {\r\n const value = getFieldValue(field);\r\n if (value && typeof value == 'object') {\r\n return value.src;\r\n }\r\n return null;\r\n}\r\n\r\nexport function stripFieldTags (field) {\r\n if (field && field.value) {\r\n return {\r\n value: field.value.replace(/(<([^>]+)>)/ig,\"\"),\r\n editable: field.editable,\r\n };\r\n }\r\n}\r\n","import React from 'react';\r\nimport { compose, withHandlers } from 'recompose';\r\n\r\nimport { withActions } from '../../enhancers';\r\n\r\nexport const withTogglePlanHandler = compose(\r\n withActions,\r\n withHandlers({\r\n onTogglePlan: ({ fields, actions }) => () => {\r\n const id = (fields && fields.ApiPlanId && fields.ApiPlanId.value) || null;\r\n actions.toggleSelectedPlan(id);\r\n }\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n *\r\n * Extracts data from component sitecore content using extractFn function\r\n * and then saves it into the store (in extractFn function).\r\n *\r\n * @param extractFn\r\n */\r\nexport const withExtractContentToState = (extractFn) => compose(\r\n withActions,\r\n Component => {\r\n class WrappedComponent extends React.Component {\r\n componentDidMount() {\r\n extractFn(this.props);\r\n }\r\n\r\n render () {\r\n return ;\r\n }\r\n }\r\n return WrappedComponent;\r\n },\r\n);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport cx from 'classnames';\r\n\r\nimport styles from './styles.module.scss';\r\n\r\nconst propTypes = {\r\n expandedLabel: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.element,\r\n ]).isRequired,\r\n collapsedLabel: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.element,\r\n ]).isRequired,\r\n expanded: PropTypes.bool,\r\n toggle: PropTypes.func.isRequired,\r\n className: PropTypes.string,\r\n tabletInline: PropTypes.bool,\r\n mobileInline: PropTypes.bool,\r\n};\r\n\r\nconst ToggleDetailsButton = ({\r\n expandedLabel, collapsedLabel, expanded, toggle, mobileInline, tableInline,\r\n className,\r\n}) => (\r\n \r\n {collapsedLabel}\r\n {expandedLabel}\r\n \r\n);\r\n\r\nToggleDetailsButton.propTypes = propTypes;\r\n\r\nexport default ToggleDetailsButton;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, withHandlers, setPropTypes } from 'recompose';\r\n\r\nimport { withExpandedPlan, withTogglePlanDetail } from '../../../enhancers/all-plans';\r\n\r\nimport UIToggleDetailsButton from '../../Common/ToggleDetailsButton';\r\n\r\nconst propTypes = {\r\n planId: PropTypes.string.isRequired,\r\n groupFields: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default compose(\r\n setPropTypes(propTypes),\r\n withExpandedPlan,\r\n withTogglePlanDetail,\r\n withProps(({ groupFields, expandedPlan, planId }) => ({\r\n expanded: expandedPlan === planId,\r\n collapsedLabel: ,\r\n expandedLabel: ,\r\n })),\r\n withHandlers({\r\n toggle: ({ planId, togglePlanDetail }) => () => {\r\n togglePlanDetail(planId);\r\n }\r\n })\r\n)(UIToggleDetailsButton);\r\n","import PromptPaymentIcon from '../../../../assets/img/prompt-payment-icon.png';\r\nimport DualEnergyIcon from '../../../../assets/img/dual-energy-icon.png';\r\nimport EmailIcon from '../../../../assets/img/email-icon.png';\r\nimport DirectDebitIcon from '../../../../assets/img/direct-debit-icon.png';\r\n\r\nconst PROMPT_PAYMENT_DISCOUNT = 'PROMPT_PAYMENT_DISCOUNT';\r\nconst DUAL_ENERGY_DISCOUNT = 'DUAL_ENERGY_DISCOUNT';\r\nconst EMAIL_DISCOUNT = 'EMAIL_DISCOUNT';\r\nconst DIRECT_DEBIT_DISCOUNT = 'DIRECT_DEBIT_DISCOUNT';\r\n\r\nexport const DISCOUNTS = {\r\n [PROMPT_PAYMENT_DISCOUNT]: {\r\n fieldName: 'Prompt',\r\n icon: PromptPaymentIcon,\r\n },\r\n [DUAL_ENERGY_DISCOUNT]: {\r\n fieldName: 'Dual',\r\n icon: DualEnergyIcon,\r\n },\r\n [EMAIL_DISCOUNT]: {\r\n fieldName: 'Digital',\r\n icon: EmailIcon,\r\n },\r\n [DIRECT_DEBIT_DISCOUNT]: {\r\n fieldName: 'DirectDebit',\r\n icon: DirectDebitIcon,\r\n },\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { branch, renderNothing } from 'recompose';\r\n\r\nimport { getFieldValue } from '../../../../utils';\r\nimport { DISCOUNTS } from './constants';\r\n\r\nconst propTypes = {\r\n fields: PropTypes.object.isRequired,\r\n};\r\n\r\nconst DiscountText = branch(\r\n ({ fieldNumber }) => !getFieldValue(fieldNumber),\r\n renderNothing\r\n)(({ fieldNumber, fieldText, icon }) => (\r\n <>\r\n \"\"{' '}\r\n

\r\n %{' '}\r\n \r\n

\r\n \r\n));\r\n\r\nconst DiscountsList = ({ fields }) => (\r\n
    \r\n {Object.keys(DISCOUNTS).map((discountKey) => {\r\n const { fieldName, icon } = DISCOUNTS[discountKey];\r\n return (\r\n
  • \r\n \r\n
  • \r\n )\r\n })}\r\n
\r\n);\r\n\r\nDiscountsList.propTypes = propTypes;\r\n\r\nexport default DiscountsList;\r\n","import React, { Component } from 'react';\r\nimport Modal from '@material-ui/core/Modal';\r\nimport { Close } from '../SVG';\r\n\r\nclass ContactModal extends Component {\r\n state = {\r\n open: this.props.open || false,\r\n };\r\n\r\n handleClose = () => {\r\n this.setState({ open: false });\r\n this.props.onClose();\r\n };\r\n\r\n render() {\r\n \r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n {this.props.children}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ContactModal;\r\n","import React from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\n\r\nconst PlanTAC = props => {\r\n const fields = props.fields || {};\r\n\r\n const toggleLink = () => {\r\n const link =\r\n fields &&\r\n fields.TandCPdfLink &&\r\n fields.TandCPdfLink.value &&\r\n fields.TandCPdfLink.value.href;\r\n if (link) {\r\n window && (window.location = link);\r\n }\r\n };\r\n\r\n const getDetailsStyles = (styles, lab) => {\r\n const label =\r\n lab && lab.value && lab.value.text\r\n ? { value: lab.value.text }\r\n : null;\r\n const fields = styles && styles.fields;\r\n if (fields) {\r\n return {\r\n Color:\r\n fields.TextColorInitialState &&\r\n fields.TextColorInitialState.fields &&\r\n fields.TextColorInitialState.fields.HexColor,\r\n Label: label || fields.TextInitialState,\r\n Icon: fields.IconInitialState,\r\n BackgroundColor:\r\n fields.BackgroundColorInitialState &&\r\n fields.BackgroundColorInitialState.fields &&\r\n fields.BackgroundColorInitialState.fields.HexColor,\r\n HoverLabel:\r\n (fields.TextHoverState && fields.TextHoverState.value) ||\r\n label ||\r\n fields.TextInitialState,\r\n HoverIcon: fields.IconHoverState,\r\n HoverColor:\r\n fields.TextColorHoverState &&\r\n fields.TextColorHoverState.fields &&\r\n fields.TextColorHoverState.fields.HexColor,\r\n HoverBackgroundColor:\r\n fields.BackgroundColorHoverState &&\r\n fields.BackgroundColorHoverState.fields &&\r\n fields.BackgroundColorHoverState.fields.HexColor,\r\n };\r\n }\r\n return {\r\n Label: label,\r\n HoverLabel: label,\r\n };\r\n };\r\n\r\n const pdfCTA = getDetailsStyles(\r\n props.fields.TandCPdfStyle,\r\n props.fields.TandCPdfLink\r\n );\r\n\r\n return (\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\r\nexport default PlanTAC;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { withStateHandlers } from 'recompose';\r\n\r\nimport Modal from '../../../Common/Modal';\r\nimport PlanTAC from '../../../PlanCard/PlanTAC';\r\n\r\nconst propTypes = {\r\n fields: PropTypes.object.isRequired,\r\n existingFields: PropTypes.object.isRequired,\r\n};\r\n\r\nconst TermsAndConditions = ({ fields, existingFields, isModalOpen, showModal, hideModal }) => (\r\n <>\r\n
\r\n {fields.ViewTSCSText && fields.ViewTSCSText.value ? (\r\n \r\n ) : 'View Terms and Conditions'}\r\n
\r\n {isModalOpen && (\r\n \r\n \r\n \r\n )}\r\n \r\n);\r\n\r\nTermsAndConditions.propTypes = propTypes;\r\n\r\nexport default withStateHandlers(\r\n { isModalOpen: false },\r\n {\r\n showModal: () => () => ({ isModalOpen: true }),\r\n hideModal: () => () => ({ isModalOpen: false }),\r\n }\r\n)(TermsAndConditions);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport ExpansionPanel from '@material-ui/core/ExpansionPanel';\r\n\r\nimport ContinueButtonsWrapper from '../../../AllPlans/ContinueButtonsWrapper';\r\nimport DiscountsList from './DiscountsList';\r\nimport TermsAndConditions from './TermsAndConditions';\r\n\r\nconst propTypes = {\r\n fields: PropTypes.object.isRequired,\r\n existingFields: PropTypes.object.isRequired,\r\n expanded: PropTypes.bool,\r\n};\r\n\r\nconst PlanDetails = ({ expanded, fields, existingFields, continueButtons }) => (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {fields.DiscountsOverride && fields.DiscountsOverride.value ? (\r\n
\r\n \r\n
\r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n \r\n {continueButtons}\r\n \r\n
\r\n \r\n {fields.AvailabilityText && fields.AvailabilityText.value && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n);\r\n\r\nPlanDetails.propTypes = propTypes;\r\n\r\nexport default PlanDetails;\r\n","import React from 'react';\r\nimport { Text, Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderNothing, withProps } from 'recompose';\r\nimport cx from 'classnames';\r\nimport moment from 'moment';\r\n\r\nimport { stripFieldTags, getFieldValue } from '../../../utils';\r\nimport { withExpandedPlan } from '../../../enhancers/all-plans';\r\nimport { withExtractContentToState } from '../../PlanCard/enhancers';\r\n\r\nimport ToggleDetailsButton from './ToggleDetailsButton';\r\nimport PlanDetails from './PlanDetails';\r\n\r\nconst AllPlansItem = ({\r\n fields,\r\n groupFields,\r\n existingPlanFields,\r\n fixedTerm,\r\n expanded,\r\n rendering,\r\n planId,\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 \r\n {fixedTerm ? 'Fixed term' : 'No fixed term'}\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\r\n/**\r\n * Extracts plan data from sitecore content and registers plan\r\n * into global store (allPlans).\r\n * @param siteCoreId\r\n * @param apiId\r\n * @param title\r\n * @param actions\r\n */\r\nfunction extractPlan({ siteCoreId, apiId, title, actions }) {\r\n actions.registerPlan({ siteCoreId, apiId, title });\r\n}\r\n\r\n\r\nexport default compose(\r\n withProps(({ fields }) => ({\r\n existingPlanFields: (\r\n fields &&\r\n fields.ExistingPlan &&\r\n fields.ExistingPlan.fields\r\n ),\r\n })),\r\n // don't render if existing plan not defined\r\n branch(\r\n ({ existingPlanFields }) => !existingPlanFields,\r\n renderNothing\r\n ),\r\n\r\n // register plan first\r\n withProps(({ fields, existingPlanFields }) => ({\r\n siteCoreId: (\r\n fields &&\r\n fields.ExistingPlan &&\r\n (fields.ExistingPlan.id || fields.ExistingPlan.uid)\r\n ) || null,\r\n apiId: getFieldValue(existingPlanFields.ApiPlanId) || null,\r\n title: getFieldValue(existingPlanFields.Title),\r\n })),\r\n withExtractContentToState(extractPlan),\r\n\r\n // inject max discount, plan ID, plan UID and fixedTerm values\r\n withProps(({ existingPlanFields }) => {\r\n const fixedTermEnd = getFieldValue(existingPlanFields.ApiPlanFixedEndDate);\r\n const fixedTerm = fixedTermEnd && moment().isBefore(moment(fixedTermEnd));\r\n const planId = getFieldValue(existingPlanFields.ApiPlanId) || null;\r\n return {\r\n fixedTerm: fixedTerm > 0,\r\n planId,\r\n }\r\n }),\r\n withExpandedPlan,\r\n withProps(({ expandedPlan, planId }) => ({\r\n expanded: expandedPlan === planId,\r\n }))\r\n)(AllPlansItem);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport AllPlansItem from './Item';\r\n\r\nconst propTypes = {\r\n plans: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n groupFields: PropTypes.object.isRequired,\r\n rendering: PropTypes.object.isRequired,\r\n};\r\n\r\nconst GroupItems = ({ groupFields, plans, rendering }) => (\r\n <>\r\n {plans.map((plan, key) => (\r\n \r\n ))}\r\n \r\n);\r\n\r\nGroupItems.propTypes = propTypes;\r\n\r\nexport default GroupItems;\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport GroupItems from './GroupItems';\r\n\r\nconst AllPlansGroup = ({ fields, rendering }) => (\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
  • \r\n {fields.Plans && (\r\n \r\n )}\r\n
  • \r\n \r\n);\r\n\r\nexport default AllPlansGroup;\r\n","import { compose, withHandlers, branch, renderNothing, withProps } from 'recompose';\r\nimport { withCustomer, withActions, withUIContextProps } from '../../enhancers';\r\n\r\nexport const withBillCompare = compose(\r\n withUIContextProps(['showBillCompareModal']),\r\n withProps(({ component }) => ({\r\n content: component && component[0] && component[0].fields,\r\n })),\r\n // do not render if sitecore content not set\r\n branch(\r\n ({ content }) => !content,\r\n renderNothing\r\n ),\r\n withCustomer,\r\n withActions,\r\n // add toggle modal handler\r\n withHandlers({\r\n toggleCompareBill: ({ showBillCompareModal, actions }) => async () => {\r\n await actions.setShowBillCompareModal(!showBillCompareModal);\r\n }\r\n })\r\n);\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport cx from 'classnames';\r\n\r\nimport { withBillCompare } from './enhancers';\r\n\r\nconst BillCompare = ({ className, label, toggleCompareBill }) => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default withBillCompare(BillCompare);\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { merge, fromEvent, timer } from 'rxjs';\r\nimport { takeUntil, throttleTime, repeat, pairwise, map, filter, debounceTime } from 'rxjs/operators';\r\nimport { compose, setPropTypes } from 'recompose';\r\nimport PropTypes from 'prop-types';\r\nimport ResizeObserver from 'resize-observer-polyfill';\r\n\r\n/**\r\n * Returns device name depending on current screen resolution\r\n * @param breakpoints {Array}\r\n * @param width {number}\r\n * @return {string}\r\n */\r\nfunction getDeviceFromWidth(breakpoints, width) {\r\n if (width < breakpoints[0]) {\r\n return 'mobile';\r\n } else if (width < breakpoints[1]) {\r\n return 'tablet';\r\n } else {\r\n return 'desktop';\r\n }\r\n}\r\n\r\n/**\r\n * HOC\r\n * Injects device prop into component depending on current screen size\r\n * and specified breakpoints.\r\n * @param breakpoints {Array}\r\n */\r\nexport const withDevice = (breakpoints) => Component => props => {\r\n const [device, setDevice] = useState(\r\n getDeviceFromWidth(breakpoints, window.innerWidth)\r\n );\r\n const ro = useRef();\r\n\r\n useEffect(() => {\r\n ro.current = new ResizeObserver(([entry]) => {\r\n setDevice(getDeviceFromWidth(breakpoints, entry.contentRect.width));\r\n });\r\n ro.current.observe(document.body);\r\n return () => ro.current.disconnect();\r\n }, []);\r\n\r\n return ;\r\n};\r\n\r\n\r\n/**\r\n * HOC\r\n * Injects props after {delay} milliseconds elapsed.\r\n * @param injectProps {Object}\r\n */\r\nexport const withDelayedProps = (injectProps) => compose(\r\n setPropTypes({\r\n delay: PropTypes.number.isRequired,\r\n }),\r\n Component => props => {\r\n const [elapsed, setElapsed] = useState(false);\r\n\r\n useEffect(() => {\r\n const subscription = timer(props.delay).subscribe(() => {\r\n setElapsed(true);\r\n });\r\n return () => subscription.unsubscribe();\r\n // eslint-disable-next-line\r\n }, [props.delay]);\r\n\r\n if (elapsed) {\r\n return ;\r\n }\r\n return ;\r\n },\r\n);\r\n\r\n\r\n/**\r\n * Emits after user is idle for {timeToIdle} seconds.\r\n * @param timeToIdle\r\n * @return {Observable}\r\n */\r\nfunction getIdleTimer$(timeToIdle) {\r\n const el = document.querySelector('html');\r\n const events = [\r\n 'click',\r\n 'keydown',\r\n 'mousemove',\r\n 'touchstart',\r\n 'scroll',\r\n ];\r\n\r\n const userIsActive$ = merge(\r\n ...events.map(event => fromEvent(el, event).pipe(throttleTime(500))),\r\n );\r\n\r\n return timer(timeToIdle * 1000).pipe(\r\n takeUntil(userIsActive$),\r\n repeat(),\r\n );\r\n}\r\n\r\n/**\r\n * HOC\r\n * Injects specified props if the user idle for {timeToIdle} seconds.\r\n * @param injectProps {Object} props to be injected\r\n */\r\nexport const withIdleProps = (injectProps) => compose(\r\n setPropTypes({\r\n timeToIdle: PropTypes.number.isRequired,\r\n }),\r\n Component => props => {\r\n const [idle, setIdle] = useState(false);\r\n\r\n useEffect(() => {\r\n const idleTimer$ = getIdleTimer$(\r\n props.timeToIdle,\r\n );\r\n const subscription = idleTimer$.subscribe(() => {\r\n setIdle(true);\r\n });\r\n return () => subscription.unsubscribe();\r\n // eslint-disable-next-line\r\n }, [props.timeToIdle]);\r\n\r\n if (idle) {\r\n return ;\r\n }\r\n return ;\r\n },\r\n);\r\n\r\n/**\r\n * Emits just before the user is going to move to top bar.\r\n * @return {Observable}\r\n */\r\nfunction getMouseMoveToTopBar$() {\r\n const el = document.querySelector('html');\r\n\r\n const mouseMove$ = fromEvent(el, 'mousemove');\r\n\r\n return mouseMove$.pipe(\r\n map(({ clientY }) => clientY),\r\n debounceTime(20),\r\n pairwise(),\r\n map(([y1, y2]) => ({\r\n position: y2,\r\n direction: (y2 - y1) / Math.abs(y2 - y1),\r\n velocity: Math.abs(y2 - y1) / 20,\r\n })),\r\n filter(({ direction }) => direction < 0),\r\n filter(({ position, velocity }) => position <= velocity),\r\n );\r\n}\r\n\r\n/**\r\n * HOC\r\n * Injects specified props if the user hovers over the top bar.\r\n * @param injectProps {Object}\r\n */\r\nexport const withLeaveIntentionProps = (injectProps) => Component => props => {\r\n const [leaveIntention, setLeaveIntention] = useState(false);\r\n\r\n useEffect(() => {\r\n const mouseMoveToTopBar$ = getMouseMoveToTopBar$();\r\n const subscription = mouseMoveToTopBar$\r\n .pipe(throttleTime(500))\r\n .subscribe(() => {\r\n setLeaveIntention(true);\r\n });\r\n return () => subscription.unsubscribe();\r\n }, []);\r\n\r\n if (leaveIntention) {\r\n return ;\r\n }\r\n return ;\r\n};\r\n","export const PLAN_LPG_ONLY = 'LPG-ONLY';\r\nexport const PLAN_PIPED_GAS_ONLY = 'pipedgas-only';\r\n\r\nexport const FAKE_PLANS = [PLAN_LPG_ONLY, PLAN_PIPED_GAS_ONLY];\r\n\r\nexport const HASH_JOURNEYS = {'join' : 0, 'changeplan': 3, 'movehouse' : 1, 'addproperty' : 2};\r\n\r\nexport const EMAIL_VALIDATION = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,17}$/;","import { FAKE_PLANS } from '../constants';\r\n\r\n/**\r\n * Returns mandatory services for selected plan\r\n * @param plansRules\r\n * @param planId\r\n * @returns [string]\r\n */\r\nexport function planMandatoryServices(plansRules, planId) {\r\n const rules = planRules(plansRules, planId);\r\n if (rules) {\r\n return rules.filter(({ mandatory }) => mandatory).map(({ id }) => id);\r\n }\r\n return [];\r\n}\r\n\r\n/**\r\n * Returns supported services for selected plan\r\n * @param plansRules\r\n * @param planId\r\n * @returns {[string]|undefined}\r\n */\r\nexport function planSupportedServices(plansRules, planId) {\r\n const rules = planRules(plansRules, planId);\r\n if (rules) {\r\n return rules.map(({ id }) => id);\r\n }\r\n}\r\n\r\n/**\r\n * Returns array of unmet plan requirements in terms of mandatory services.\r\n * @param plansRules\r\n * @param services Selected services\r\n * @param planId\r\n * @returns {[]|undefined}\r\n */\r\nexport function planDoesNotMeetMandatoryRequirements(\r\n plansRules,\r\n services,\r\n planId\r\n) {\r\n const doNotMeet = planMandatoryServices(plansRules, planId).filter(\r\n serviceId => !services.includes(serviceId)\r\n );\r\n // eslint-disable-next-line\r\n return (doNotMeet.length && doNotMeet) || undefined;\r\n}\r\n\r\n/**\r\n * Returns array of unmet plan requirements in terms of supported services.\r\n * @param plansRules\r\n * @param services Selected services\r\n * @param planId\r\n * @returns {boolean}\r\n */\r\nexport function planDoesNotMeetSupportedRequirements(\r\n plansRules,\r\n services,\r\n planId\r\n) {\r\n const supported = planSupportedServices(plansRules, planId);\r\n if (supported) {\r\n const doNotMeet = services.filter(\r\n serviceId => !supported.includes(serviceId)\r\n );\r\n // eslint-disable-next-line\r\n return (doNotMeet.length && doNotMeet) || undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true if plan meets requirements in terms of mandatory and required\r\n * services.\r\n * @param plansRules\r\n * @param services Selected services\r\n * @param planId\r\n * @returns {boolean}\r\n */\r\nexport function doesPlanMeetRequirements(plansRules, services, planId) {\r\n return (\r\n !planDoesNotMeetMandatoryRequirements(plansRules, services, planId) &&\r\n !planDoesNotMeetSupportedRequirements(plansRules, services, planId)\r\n );\r\n}\r\n\r\n/**\r\n * Returns rules per plan\r\n * @param plansRules\r\n * @param planId\r\n * @returns {[string]|undefined}\r\n */\r\nfunction planRules(plansRules, planId) {\r\n const rules = plansRules.find(({ id }) => id === planId);\r\n // eslint-disable-next-line\r\n return rules && rules.services;\r\n}\r\n\r\n/**\r\n * Returns true, if the plan is fake (pipedgas-only or LPG-ONLY)\r\n * @param planId {string}\r\n * @returns {boolean}\r\n */\r\nexport function isFakePlanId(planId) {\r\n return FAKE_PLANS.includes(planId);\r\n}\r\n","import React, { useState, useRef, useEffect, useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Slider from 'react-slick';\r\nimport cx from 'classnames';\r\nimport { withDevice } from '../../enhancers/common';\r\nimport { compose, withProps } from 'recompose';\r\nimport { withPlansAndServicesProps, withCustomerAddress, withActions, withIsSouthIsland, withCustomerServiceRates, withAvailableServices, withPriceChecker } from '../../enhancers';\r\n\r\nimport {\r\n getPostcodeFromAddress,\r\n isSouthIslandPostcode,\r\n} from '../../utils/address';\r\nimport { planDoesNotMeetMandatoryRequirements } from '../../utils/plans-rules';\r\n\r\nconst propTypes = {\r\n placeholder: PropTypes.node.isRequired,\r\n};\r\n\r\nconst SliderContext = React.createContext({\r\n setInitialSlide: () => { },\r\n});\r\n\r\nconst Carousel = props => {\r\n const [scrollToSlide, setScrollToSlide] = useState(undefined);\r\n const sliderEl = useRef(null);\r\n\r\n const count = useMemo(\r\n () => React.Children.toArray(props.placeholder).length,\r\n [props.placeholder]\r\n );\r\n\r\n const goTo = index => {\r\n sliderEl.current.slickGoTo(index);\r\n };\r\n\r\n useEffect(() => {\r\n if (sliderEl && count > 3) {\r\n sliderEl.current.slickGoTo(scrollToSlide);\r\n }\r\n // eslint-disable-next-line\r\n }, [scrollToSlide]);\r\n\r\n const setInitialSlide = slideIndex => {\r\n if (typeof scrollToSlide === 'undefined') {\r\n setScrollToSlide(slideIndex);\r\n }\r\n };\r\n\r\n const settings = {\r\n dots: count > 3,\r\n infinite: false,\r\n speed: 500,\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n variableWidth: true,\r\n arrow: count > 3,\r\n prevArrow: ,\r\n nextArrow: ,\r\n };\r\n\r\n const displayPlans = () => {\r\n const displayedPlans = [];\r\n React.Children.forEach(props.placeholder, (child, index) => {\r\n\r\n var customerTouEligible = getCustomerTou(props);\r\n\r\n\r\n var id = child.props.fields.ExistingPlan.fields.ApiPlanId\r\n //console.log(\"id\", id);\r\n //console.log(\"child=\", child);\r\n var postcodeval = getPostcodeFromAddress(props.address);\r\n var isSouth = isSouthIslandPostcode(postcodeval);\r\n var shouldRemoveChildCuzGeo = checkGeoLocation(id, isSouth, postcodeval);\r\n var shouldRemoveChildCuzTou = isPlanHidden(id, customerTouEligible);\r\n\r\n //console.log(\"shouldRemoveChildCuzGeo\", shouldRemoveChildCuzGeo);\r\n //console.log(\"shouldRemoveChildCuzTou\", shouldRemoveChildCuzTou);\r\n\r\n if (!shouldRemoveChildCuzGeo && !shouldRemoveChildCuzTou) {\r\n displayedPlans.push(React.cloneElement(child, {\r\n slideIndex: index,\r\n }));\r\n }\r\n else if (props.selectedPlan && props.selectedPlan === id.value) {\r\n var removeService = getServicesToRemove(id);\r\n\r\n if (shouldRemoveChildCuzTou /* && is the plan selected ? */) {\r\n //TODO: add TOU logic here tou-message\r\n //props.actions.toggleSelectedService(removeService, \"touMessage\");\r\n props.actions.toggleSelectedPlan(id,false, \"touMessage\");\r\n }\r\n else {\r\n if (isSouth) {\r\n props.actions.toggleSelectedService(removeService, \"isSouth\");\r\n }\r\n else {\r\n props.actions.toggleSelectedService(removeService, \"isNorth\");\r\n }\r\n }\r\n }\r\n })\r\n return displayedPlans;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n \r\n {props.placeholder.length > 0 && props.placeholder[0].props.fields.ExistingPlan\r\n ? displayPlans()\r\n : React.Children.map(props.placeholder, (child, index) =>\r\n React.cloneElement(child, {\r\n slideIndex: index,\r\n })\r\n )\r\n }\r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nCarousel.propTypes = propTypes;\r\n\r\nconst PrevArrow = props => {\r\n const { className, onClick } = props;\r\n return
    ;\r\n};\r\nconst NextArrow = props => {\r\n const {\r\n className,\r\n onClick,\r\n slideCount,\r\n currentSlide,\r\n goTo,\r\n device,\r\n } = props;\r\n const visibilityLimit = device === 'tablet' ? 2 : 3;\r\n const handler =\r\n slideCount - currentSlide > visibilityLimit ? onClick : () => goTo(0);\r\n return
    ;\r\n};\r\n\r\n/**\r\n * React Hook\r\n * Scrolls the slider to selected tile once mounted.\r\n *\r\n * @param selected\r\n * @param slideIndex\r\n */\r\nexport function useScrollToSelectedOnce({ selected, slideIndex }) {\r\n const { setInitialSlide } = useContext(SliderContext);\r\n\r\n useEffect(() => {\r\n if (selected) {\r\n setInitialSlide(slideIndex);\r\n }\r\n // eslint-disable-next-line\r\n }, []);\r\n}\r\n\r\nexport default compose(withPlansAndServicesProps([\r\n 'selectedPlan',\r\n 'selectedService'\r\n]), withProps(({ selectedPlan, selectedService }) => ({\r\n selectedPlan: selectedPlan,\r\n selectedService: selectedService\r\n})), withActions, withIsSouthIsland, withCustomerAddress, withDevice([1024, 1200]), withCustomerServiceRates, withAvailableServices, withPriceChecker)(Carousel);\r\n\r\n/**\r\n * Returns geo location from specified plan.\r\n * @param planID\r\n * @param isSouthLand\r\n * @param postalcode\r\n @returns {boolean}\r\n */\r\nfunction checkGeoLocation(planID, isSouthLand, postalcode) {\r\n var geolocation;\r\n {\r\n var planList = window.ContactEnergy.Data.PlansRules;\r\n for (var i = 0; i < planList.length; i++) {\r\n if (planList[i].id === planID.value) {\r\n geolocation = planList[i].geographicalLocation\r\n break;\r\n }\r\n }\r\n }\r\n if (geolocation === \"ALL\" || !geolocation) {\r\n return false;\r\n }\r\n else {\r\n if (geolocation === \"NI\" && isSouthLand) {\r\n return true;\r\n }\r\n else if (geolocation === \"SI\" && !isSouthLand && postalcode) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nfunction isPlanHidden(planID, customerTouEligible) {\r\n //if(customerTouEligible == false) {hide TOU plans} else {show them}\r\n try {\r\n var planList = window.ContactEnergy.Data.PlansRules;\r\n var plan = planList.find(f => f.id === planID.value);\r\n var touPlan = plan.touPlan;\r\n\r\n //console.log(\"IsPlanHidden planID=\", planID, \"customerTouEligible=\", customerTouEligible, \" touPlan=\", touPlan);\r\n\r\n if (customerTouEligible === false && touPlan) {\r\n return true;\r\n }\r\n else { return false; }\r\n } catch (error) { console.error(error); return true; }\r\n}\r\n\r\n/**\r\n * Returns geo location from specified plan.\r\n * @param planID\r\n @returns {string}\r\n */\r\nfunction getServicesToRemove(planID) {\r\n var serviceToRemove;\r\n var services;\r\n var servicePlanList = window.ContactEnergy.Data.PlansRules;\r\n for (var i = 0; i < servicePlanList.length; i++) {\r\n if (servicePlanList[i].id === planID.value) {\r\n services = servicePlanList[i].services\r\n break;\r\n }\r\n }\r\n for (var i = 0; i < services.length; i++) {\r\n if (services[i].mandatory && services[i].id !== \"ELEC\") {\r\n serviceToRemove = services[i].id;\r\n break;\r\n }\r\n }\r\n return serviceToRemove\r\n}\r\n\r\n\r\nfunction getCustomerTou(props) {\r\n\r\n var customerTouEligible = true;\r\n\r\n try {\r\n customerTouEligible = props.customerEligibilities.find(f => f.name === \"SMART TOU\").eligible;\r\n }\r\n catch (error) { }\r\n\r\n return customerTouEligible;\r\n}","import React from 'react';\r\nimport { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, lifecycle } from 'recompose';\r\n\r\nimport { withBestAvailableBroadband, withSelectedBroadband, withActions } from '../../enhancers';\r\nimport Carousel from './Carousel';\r\n\r\nconst CarouselBBPlans = ({ placeholder }) => (\r\n \r\n);\r\n\r\nfunction getBroadbandId(props) {\r\n return (\r\n props.fields &&\r\n props.fields.BBExistingTile &&\r\n props.fields.BBExistingTile.fields &&\r\n props.fields.BBExistingTile.fields.ApiId &&\r\n props.fields.BBExistingTile.fields.ApiId.value\r\n );\r\n}\r\n\r\nexport default compose(\r\n withPlaceholder({\r\n placeholder: 'broadband-tiles-placeholder',\r\n prop: 'placeholder'\r\n }),\r\n withBestAvailableBroadband,\r\n withProps(({ placeholder, bestAvailableBroadband }) => ({\r\n allBroadbandIds: placeholder\r\n .map(({ props }) => getBroadbandId(props))\r\n .filter(Boolean),\r\n placeholder: bestAvailableBroadband\r\n ? placeholder.filter(({ props }) => (\r\n bestAvailableBroadband.includes(getBroadbandId(props))\r\n ))\r\n : placeholder\r\n })),\r\n // Deselect broadband option if not available for current address.\r\n withSelectedBroadband,\r\n withActions,\r\n lifecycle({\r\n componentDidMount() {\r\n const { selectedBroadband, actions, bestAvailableBroadband } = this.props;\r\n if (selectedBroadband &&\r\n bestAvailableBroadband &&\r\n !bestAvailableBroadband.includes(selectedBroadband)\r\n ) {\r\n // deselect (we do not need to provide name as we are deselecting)\r\n actions.toggleSelectedBB(selectedBroadband, null);\r\n }\r\n },\r\n componentDidUpdate() {\r\n const { selectedBroadband, actions, bestAvailableBroadband } = this.props;\r\n if (selectedBroadband &&\r\n bestAvailableBroadband &&\r\n !bestAvailableBroadband.includes(selectedBroadband)\r\n ) {\r\n // deselect (we do not need to provide name as we are deselecting)\r\n actions.toggleSelectedBB(selectedBroadband, null);\r\n }\r\n }\r\n })\r\n)(CarouselBBPlans);\r\n","import React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport Header from '../FormHeader';\r\nimport CarouselBBPlans from '../Common/CarouselBBPlans';\r\n\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\nconst BroadbandContainer = ({ fields, isExperienceEditor, rendering }) => {\r\n const tiles =\r\n rendering &&\r\n rendering.placeholders &&\r\n rendering.placeholders['broadband-tiles-placeholder'];\r\n\r\n if (!tiles || !tiles.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n {isExperienceEditor ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n {(isExperienceEditor ||\r\n (fields.BBDisclaimer && fields.BBDisclaimer.value)) && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default withExperienceEditor(BroadbandContainer);\r\n","import React, { useEffect } from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, withHandlers } from 'recompose';\r\n\r\nimport {\r\n withCustomer,\r\n withActions,\r\n withSelectedBroadband,\r\n} from '../../enhancers';\r\n\r\nimport CTA from '../CTA';\r\nimport { Download, Upload } from '../SVG';\r\n\r\nimport { useScrollToSelectedOnce } from '../Common/Carousel';\r\n\r\nimport { default as Modal } from '../Common/Modal';\r\n\r\nconst BBTileFace = ({\r\n customer,\r\n fields,\r\n existingFields,\r\n apiId,\r\n selected,\r\n onToggleBroadband,\r\n slideIndex,\r\n}) => {\r\n useScrollToSelectedOnce({ selected, slideIndex });\r\n\r\n const [isShow, setShow] = React.useState(false);\r\n\r\n let BBDataCapDesc = existingFields.DataCapDesc.value;\r\n let BBNetworkDesc = existingFields.NetworkDesc.value;\r\n let BYOModemAllowedMessage = existingFields.BYOModemDesc.value;\r\n let isBYOModemAllowed = existingFields.BYOModemAllowed.value;\r\n\r\n const toggleTAC = () => {\r\n setShow(!isShow);\r\n };\r\n\r\n const bbChoose = (p) => {\r\n onToggleBroadband(p);\r\n toggleTAC();\r\n }\r\n\r\n const restoreOrReplace = (price, flag) => {\r\n if (flag) {\r\n return price.replace(/(\\/mth|\\/month)/gi, '');\r\n } else {\r\n return price.replace(/mth/gi, 'month');\r\n }\r\n };\r\n\r\n const BBOptions =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.BroadbandOfferings &&\r\n customer.PriceChecker.BroadbandOfferings.Offerings;\r\n\r\n let finalPrice = existingFields.Price.value;\r\n let isRenderBundle = false;\r\n let initialPrice = finalPrice;\r\n let broadbandOfferings =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.BroadbandOfferings &&\r\n customer.PriceChecker.BroadbandOfferings.Offerings;\r\n\r\n var downloadSpeed = existingFields.DownloadSpeed;\r\n var uploadSpeed = existingFields.UploadSpeed;\r\n\r\n if (existingFields\r\n && existingFields.EnableNorthPower\r\n && existingFields.EnableNorthPower.value == true) {\r\n if (broadbandOfferings) {\r\n let network = broadbandOfferings.find(plan => plan.Id === apiId);\r\n if (network &&\r\n network.Vendor == \"northpower\") {\r\n downloadSpeed = existingFields.NorthPowerDownloadSpeed;\r\n uploadSpeed = existingFields.NorthPowerUploadSpeed;\r\n }\r\n }\r\n }\r\n\r\n if (BBOptions) {\r\n const pricing = BBOptions.find(plan => plan.Id === apiId);\r\n\r\n if (pricing && pricing.BundlePrice) {\r\n finalPrice = restoreOrReplace(pricing.BundlePrice);\r\n initialPrice = restoreOrReplace(pricing.OriginalPrice, true);\r\n isRenderBundle = true;\r\n } else if (pricing && pricing.OriginalPrice) {\r\n finalPrice = restoreOrReplace(pricing.OriginalPrice);\r\n }\r\n }\r\n\r\n if (broadbandOfferings) {\r\n const BBOffering = broadbandOfferings.find(plan => plan.Id === apiId);\r\n\r\n if (BBOffering) {\r\n BBDataCapDesc = BBOffering.DataCapDesc;\r\n BBNetworkDesc = BBOffering.NetworkDesc;\r\n isBYOModemAllowed = BBOffering.BYOModemAllowed;\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {fields.BBBestFor && fields.BBBestFor.value && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {fields.BBPlanRibbon && fields.BBPlanRibbon.value && (\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
    \r\n \r\n
    \r\n {finalPrice}\r\n {isRenderBundle && (\r\n \r\n {initialPrice}\r\n \r\n \r\n )}\r\n
    \r\n {BBDataCapDesc && (

    {BBDataCapDesc}

    )}\r\n {BBNetworkDesc && (
    {BBNetworkDesc}
    )}\r\n {isBYOModemAllowed && (
    {BYOModemAllowedMessage}
    )}\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n {' download'}\r\n
    \r\n
    \r\n \r\n \r\n {' upload'}\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n Learn more\r\n \r\n\r\n {isShow ? (\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    \r\n\r\n\r\n );\r\n};\r\n\r\n/**\r\n * HOC\r\n * Injects selected (bool) prop.\r\n */\r\nconst withSelected = compose(\r\n withSelectedBroadband,\r\n withProps((props) => ({\r\n selected: props.selectedBroadband && props.selectedBroadband === props.apiId,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects selected broadband toggle handler.\r\n */\r\nconst withToggleHandler = compose(\r\n withActions,\r\n withHandlers({\r\n onToggleBroadband: ({ actions, apiId, optionName }) => () => {\r\n actions.toggleSelectedBB(apiId, optionName);\r\n },\r\n })\r\n);\r\n\r\nexport default compose(\r\n withCustomer,\r\n withSelected,\r\n withToggleHandler\r\n)(BBTileFace);\r\n","import React from 'react';\r\nimport { branch, compose, renderNothing, withProps } from 'recompose';\r\n\r\nimport BBTileFace from './BBTileFace';\r\n\r\nconst BroadbandTiles = props => (\r\n
    \r\n \r\n
    \r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects broadband existingTileFields, apiId and optionName props.\r\n */\r\nconst withBroadbandProps = withProps(({ fields }) => {\r\n const existingFields =\r\n fields.BBExistingTile &&\r\n fields.BBExistingTile.fields;\r\n return {\r\n existingFields,\r\n apiId: existingFields.ApiId && existingFields.ApiId.value,\r\n optionName:\r\n existingFields.OptionName && existingFields.OptionName.value,\r\n };\r\n});\r\n\r\nexport default compose(\r\n withBroadbandProps,\r\n // do not render if no existing broadband fields present\r\n branch(({ existingFields }) => !existingFields, renderNothing),\r\n)(BroadbandTiles);\r\n","import React from 'react';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\n\r\n/**\r\n * A simple Content Block component, with a heading and rich text block.\r\n * This is the most basic building block of a content site, and the most basic\r\n * JSS component that's useful.\r\n */\r\nconst ContentBlock = ({ fields }) => (\r\n \r\n \r\n\r\n \r\n \r\n);\r\n\r\nexport default ContentBlock;\r\n","import React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, branch, withHandlers } from 'recompose';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport CTA from './../CTA';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\n\r\nimport { shakeItWell } from './../../utils/shakeItWell';\r\nimport {\r\n withCustomer,\r\n withSaving,\r\n withActions,\r\n withIsSouthIsland,\r\n withExperienceEditor,\r\n withJourneyActions,\r\n withJourneyType,\r\n withCustomerAccount,\r\n withJourneyTypes\r\n} from '../../enhancers';\r\n\r\nconst ContinueButton = ({\r\n fields,\r\n disabled,\r\n isSaving,\r\n clickHandler,\r\n onDisabledClick,\r\n isExperienceEditor,\r\n actions,\r\n onLinkClicked,\r\n}) => (\r\n
    \r\n {(isExperienceEditor ||\r\n (fields.ContinueDisclaimer && fields.ContinueDisclaimer.value)) && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n
    \r\n \r\n {isSaving && (\r\n \r\n )}\r\n
    \r\n\r\n {(fields.SFLLinkVisible) && (\r\n (disabled) ? onDisabledClick(fields) : onLinkClicked()}\r\n field={fields.LinkText} />\r\n )}\r\n\r\n
    \r\n );\r\n\r\n/**\r\n * HOC\r\n * Merge Analytics calls with Click handlers, ignore if @disableAnalytics passed & set to true\r\n */\r\nconst withAnalytics = compose(\r\n withActions,\r\n withCustomer,\r\n withProps(\r\n ({ analyticsCall, disableAnalytics, actions, onClick, customer }) => {\r\n if (disableAnalytics) {\r\n return {\r\n clickHandler: onClick,\r\n };\r\n }\r\n let handler;\r\n if (analyticsCall) {\r\n handler = () => {\r\n analyticsCall();\r\n onClick();\r\n };\r\n } else {\r\n // Generic Analitycs call\r\n if (actions && actions.pushContinueToSummaryToDatalayer) {\r\n const acc =\r\n customer &&\r\n customer.ExistingCustomer &&\r\n customer.ExistingCustomer.AccountNumber;\r\n handler = () => {\r\n actions.pushContinueToSummaryToDatalayer(acc);\r\n onClick();\r\n };\r\n }\r\n }\r\n return {\r\n clickHandler: handler,\r\n };\r\n }\r\n )\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects page errors as a prop.\r\n */\r\nconst withPageErrors = branch(\r\n ({ ignoreValidation }) => Boolean(ignoreValidation),\r\n withProps(() => ({ pageErrors: [] })),\r\n compose(\r\n withIsSouthIsland,\r\n withCustomer,\r\n withJourneyActions,\r\n withProps(\r\n ({ customer, fields, isSouthIsland, journeyActionsActive }) => ({\r\n pageErrors: validatePage(\r\n fields,\r\n customer,\r\n isSouthIsland,\r\n journeyActionsActive\r\n ),\r\n })\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects CTA fields.\r\n */\r\nconst withCTAFields = withProps(({ fields }) => ({\r\n fields: {\r\n ...fields,\r\n Label: fields.ContinueTitle ? fields.ContinueTitle : fields.Label,\r\n SubTitle: fields.ContinueSubTitle\r\n ? fields.ContinueSubTitle\r\n : fields.HelperText,\r\n },\r\n}));\r\n\r\nexport default compose(\r\n //withHideIfNotAddress,\r\n withJourneyTypes,\r\n withSaving,\r\n withCTAFields,\r\n withPageErrors,\r\n withExperienceEditor,\r\n withJourneyType,\r\n withCustomerAccount,\r\n withProps(({ fields, pageErrors, isSaving, journeyType }) => ({\r\n disabled: isSaving || pageErrors.length > 0,\r\n linkUrl:\r\n journeyType &&\r\n journeyType > 0 &&\r\n (fields &&\r\n fields.AlternativeContinueTo &&\r\n fields.AlternativeContinueTo.value &&\r\n fields.AlternativeContinueTo.value.href)\r\n ? fields.AlternativeContinueTo.value.href\r\n : fields &&\r\n fields.ContinueTo &&\r\n fields.ContinueTo.value &&\r\n fields.ContinueTo.value.href,\r\n })),\r\n withActions,\r\n withHandlers({\r\n onClick: ({ linkUrl, onBeforeRedirect }) => async () => {\r\n try {\r\n if (onBeforeRedirect) {\r\n await onBeforeRedirect();\r\n }\r\n window.location = linkUrl;\r\n } catch (error) {\r\n // noop, errors should be handled in onBeforeRedirect\r\n }\r\n },\r\n onDisabledClick: ({ pageErrors, isSaving }) => () => {\r\n if (!isSaving) {\r\n shakeItWell(pageErrors);\r\n }\r\n },\r\n onLinkClicked: ({ onBeforeOpenPopup, actions }) => async () => {\r\n if (onBeforeOpenPopup) {\r\n await onBeforeOpenPopup();\r\n }\r\n\r\n actions.togglePopup(true);\r\n },\r\n }),\r\n withAnalytics\r\n)(ContinueButton);\r\n\r\n/**\r\n * Validates page inputs (customer).\r\n * @param {*} fields\r\n * @param {*} customer\r\n * @param {boolean} isSouthIsland\r\n * @param {boolean} journeyActionsActive\r\n * @returns [{target, error}] Input errors\r\n */\r\nfunction validatePage(fields, customer, isSouthIsland, journeyActionsActive) {\r\n const errors = [];\r\n\r\n if (customer) {\r\n const planCheck = fields.CheckPlan.value;\r\n const serviceCheck = fields.CheckService.value;\r\n const addressCheck = fields.CheckAddress.value;\r\n const bbCheck = fields.CheckBroadband.value;\r\n const pipedGasOnly =\r\n customer.Property &&\r\n customer.Property.Services &&\r\n customer.Property.Services.length === 1 &&\r\n customer.Property.Services.includes('GAS');\r\n const lpgOnly =\r\n customer.Property &&\r\n customer.Property.Services &&\r\n customer.Property.Services.length === 1 &&\r\n customer.Property.Services.includes('LPG');\r\n const lpgUsage =\r\n customer.Property &&\r\n customer.Property.LpgInfo &&\r\n customer.Property.LpgInfo.BottledGasUsage;\r\n const lpgWithValues =\r\n lpgUsage && lpgUsage.length && lpgUsage.length > 0;\r\n /*\r\n * Excluded as per new requirements\r\n */\r\n // const cookingOnly =\r\n // lpgUsage && lpgUsage.length === 1 && lpgUsage.includes('Cooking');\r\n\r\n const lpgEnabled =\r\n customer.Property &&\r\n customer.Property.Services &&\r\n customer.Property.Services.length &&\r\n customer.Property.Services.includes('LPG');\r\n\r\n if (addressCheck) {\r\n const addressSelected =\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.Address;\r\n if (!addressSelected || addressSelected === '') {\r\n errors.push({\r\n target: 'address',\r\n error: 'Property Address is not selected',\r\n });\r\n }\r\n }\r\n\r\n if (serviceCheck) {\r\n const serviceSelected =\r\n customer.Property &&\r\n customer.Property.Services &&\r\n customer.Property.Services.length;\r\n if (!serviceSelected) {\r\n errors.push({\r\n target: 'service',\r\n error: 'None of the Services is selected',\r\n });\r\n }\r\n }\r\n\r\n if (lpgEnabled && !lpgWithValues) {\r\n errors.push({\r\n target: 'lpg-usage',\r\n error: 'None of the Bottled gas usage is selected',\r\n });\r\n }\r\n\r\n /*\r\n * Excluded as per new requirements\r\n */\r\n // if (cookingOnly) {\r\n // errors.push({\r\n // target: 'lpg-usage',\r\n // error:\r\n // 'Unfortunately, we are unable to supply bottled gas if gas will be used for cooking only',\r\n // });\r\n // }\r\n\r\n if (planCheck && !lpgOnly && !(pipedGasOnly && isSouthIsland)) {\r\n const planSelected =\r\n customer.Property &&\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.PlanId;\r\n if (!planSelected || planSelected === '') {\r\n errors.push({\r\n target: 'plan',\r\n error: 'Plan is not selected',\r\n });\r\n }\r\n }\r\n\r\n if (bbCheck && !lpgOnly) {\r\n const broadbandSelected =\r\n customer.Property && customer.Property.BroadbandId;\r\n const servicesSelected =\r\n customer.Property && customer.Property.Services;\r\n let broadbandEnabled = false;\r\n if (servicesSelected && servicesSelected.includes('BB')) {\r\n broadbandEnabled = true;\r\n }\r\n if (broadbandEnabled && !broadbandSelected) {\r\n errors.push({\r\n target: 'broadband',\r\n error: 'None of the Broadband Options is selected',\r\n });\r\n }\r\n }\r\n\r\n if (journeyActionsActive) {\r\n const isJourneySet =\r\n customer &&\r\n customer.Confirmation &&\r\n customer.Confirmation.JourneyType;\r\n if (!isJourneySet) {\r\n errors.push({\r\n target: 'journey-actions',\r\n error: 'You need to select your journey type',\r\n });\r\n }\r\n const hasAccount =\r\n customer &&\r\n customer.ExistingCustomer &&\r\n customer.ExistingCustomer.AccountNumber;\r\n const accountField = document.getElementById('user-account-input');\r\n if (accountField && accountField.className.includes('required')) {\r\n if (\r\n !hasAccount ||\r\n accountField.className.includes('with-error')\r\n ) {\r\n errors.push({\r\n target: 'user-account',\r\n error: 'You need to enter your user account',\r\n });\r\n }\r\n }\r\n }\r\n } else {\r\n errors.push({\r\n target: 'page',\r\n error: 'Customer Data missed',\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n","export const shakeItWell = errors => {\r\n if (errors && errors.length) {\r\n const visibleErrors = [];\r\n errors.forEach(error => {\r\n let container = null;\r\n switch (error.target) {\r\n case 'plan':\r\n const tabCon = document.getElementsByClassName(\r\n 'plan-filter-tab--active'\r\n );\r\n if (tabCon && tabCon[0]) {\r\n container = tabCon[0].getElementsByClassName(\r\n 'filter-inner-plan-container'\r\n );\r\n container = container && container[0];\r\n }\r\n break;\r\n case 'address':\r\n container =\r\n document.getElementsByClassName('address-picker') &&\r\n document.getElementsByClassName('address-picker')[0];\r\n break;\r\n case 'service':\r\n container =\r\n document.getElementsByClassName('services-container') &&\r\n document.getElementsByClassName(\r\n 'services-container'\r\n )[0];\r\n break;\r\n case 'lpg-usage':\r\n container =\r\n document.getElementsByClassName(\r\n 'lpg-usage-container'\r\n ) &&\r\n document.getElementsByClassName(\r\n 'lpg-usage-container'\r\n )[0];\r\n break;\r\n case 'broadband':\r\n container =\r\n document.getElementsByClassName(\r\n 'broadband-tiles-container'\r\n ) &&\r\n document.getElementsByClassName(\r\n 'broadband-tiles-container'\r\n )[0];\r\n break;\r\n case 'journey-actions':\r\n container =\r\n document.getElementsByClassName(\r\n 'action-buttons-container'\r\n ) &&\r\n document.getElementsByClassName(\r\n 'action-buttons-container'\r\n )[0];\r\n break;\r\n case 'user-account':\r\n container =\r\n document.getElementsByClassName(\r\n 'user-account-holder'\r\n ) &&\r\n document.getElementsByClassName(\r\n 'user-account-holder'\r\n )[0];\r\n\r\n break;\r\n case 'page':\r\n default:\r\n container =\r\n document.getElementsByTagName('body') &&\r\n document.getElementsByTagName('body')[0];\r\n break;\r\n }\r\n if (container) {\r\n visibleErrors.push(container);\r\n }\r\n });\r\n\r\n if (visibleErrors.length) {\r\n const toShake = visibleErrors[0];\r\n const scrollTop =\r\n toShake.offsetTop - (window && window.innerHeight / 3);\r\n // check for native support of scrollTo\r\n // Note: we're checking it on toShake element as well\r\n // because for some reason it is defined on IE11 on window\r\n // but does not work.\r\n if (toShake.scrollTo && window && window.scrollTo) {\r\n window.scrollTo({\r\n top: scrollTop,\r\n left: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n // IE11\r\n const root = document.getElementsByTagName('html')[0];\r\n root.scrollTop = scrollTop;\r\n }\r\n\r\n toShake.className += ' shake-it';\r\n setTimeout(() => {\r\n toShake.className = toShake.className.replace('shake-it', '');\r\n }, 1500);\r\n }\r\n }\r\n};\r\n","export const USAGE_TYPE_STANDARD = 'S';\r\nexport const USAGE_TYPE_LOW = 'L';\r\n\r\nexport const RATE_UNIT_TYPE_DAY = 'day';\r\nexport const RATE_UNIT_TYPE_WATT = 'watt';\r\n\r\nexport const RATE_FREE = 'Free';\r\n\r\nexport const SERVICE_ID_ELECTRICITY = \"ELEC\";\r\nexport const SERVICE_ID_PIPED_GAS = \"GAS\";\r\nexport const SERVICE_ID_LPG = \"LPG\";\r\nexport const SERVICE_ID_BROADBAND = \"BB\";\r\n","// @flow\r\nimport Decimal from 'decimal.js';\r\nimport type {\r\n APIUsageType,\r\n APIServiceRate,\r\n APIRate,\r\n APIRates,\r\n ServiceRate,\r\n Rate,\r\n Rates,\r\n} from './types';\r\nimport {\r\n USAGE_TYPE_STANDARD,\r\n USAGE_TYPE_LOW,\r\n RATE_UNIT_TYPE_DAY,\r\n RATE_UNIT_TYPE_WATT,\r\n SERVICE_ID_ELECTRICITY,\r\n SERVICE_ID_PIPED_GAS,\r\n} from './constants';\r\n\r\n/**\r\n * Returns true, if has multiple rates for defined usage type.\r\n * @param usageType {APIUsageType}\r\n * @param rates {Rates}\r\n * @return {boolean}\r\n */\r\nexport function hasMultipleRates(usageType: APIUsageType, rates: Rates): boolean {\r\n return Boolean(\r\n (usageType === USAGE_TYPE_LOW && (rates[0].lowRates && rates[0].lowRates.length > 3)) ||\r\n (usageType === USAGE_TYPE_STANDARD && (rates[0].standardRates && rates[0].standardRates.length > 3))\r\n );\r\n}\r\n\r\n/**\r\n * Returns true, if rates are valid.\r\n * @param rates\r\n * @return {boolean|*}\r\n */\r\nexport function areRatesValid(rates: Rates): boolean {\r\n if (!rates || !rates.length) {\r\n return false;\r\n }\r\n const hasLowRates = rates.find(rate => rate.lowRates && rate.lowRates.length);\r\n const hasStandardRates = rates.find(rate => rate.standardRates && rate.standardRates.length);\r\n return Boolean(hasLowRates || hasStandardRates);\r\n}\r\n\r\n/**\r\n * Takes APIRate unit and returns the rate unit type.\r\n * @param apiRateUnit {APIServiceRate.Unit}\r\n * @return {ServiceRate.type}\r\n */\r\nexport function getRateType(apiRateUnit: APIServiceRate.Unit): ServiceRate.type {\r\n if (apiRateUnit) {\r\n return (apiRateUnit.includes('day') ? RATE_UNIT_TYPE_DAY : RATE_UNIT_TYPE_WATT);\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Formats rates value.\r\n * @param apiDisplayRate {APIServiceRate.DisplayRate}\r\n * @param apiRateUnit {APIServiceRate.Unit}\r\n * @param apiRateDescription {APIServiceRate.RateDescription}\r\n * @return {ServiceRate.rate}\r\n */\r\nexport function getFormattedRate(apiDisplayRate: APIServiceRate.DisplayRate, apiRateUnit: APIServiceRate.Unit, apiRateDescription: APIServiceRate.RateDescription): ServiceRate.rate {\r\n if (!apiRateUnit) return apiDisplayRate;\r\n if (apiRateDescription) {\r\n return apiRateDescription;\r\n }\r\n else {\r\n const suffix = apiRateUnit.includes('cents') ? 'c' : '';\r\n return apiDisplayRate + suffix;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true if low user rate.\r\n * @param apiUserType {APIServiceRate.UserType}\r\n * @return {boolean}\r\n */\r\nexport function isLowUserRate(apiUserType: APIServiceRate.UserType): boolean {\r\n return apiUserType === USAGE_TYPE_LOW;\r\n}\r\n\r\n/**\r\n * Returns true if standard user rate.\r\n * @param apiUserType {APIServiceRate.UserType}\r\n * @return {boolean}\r\n */\r\nexport function isStandardUserRate(apiUserType: APIServiceRate.UserType): boolean {\r\n return apiUserType === USAGE_TYPE_STANDARD;\r\n}\r\n\r\n/**\r\n * Takes rates object returned from api and converts it to readable rates.\r\n * @param apiRates {APIRates}\r\n * @param labels\r\n * @return {Rates}\r\n */\r\nexport function getRates(apiRates: APIRates, labels): Rates {\r\n if (!apiRates) return [];\r\n\r\n return apiRates.map((apiRate: APIRate) => {\r\n return (apiRate.Rates || []).reduce((acc: Rate, apiServiceRate: APIServiceRate) => {\r\n const rateToPush: ServiceRate = {\r\n name: apiServiceRate.Name,\r\n rate: getFormattedRate(apiServiceRate.DisplayRate, apiServiceRate.Unit, apiServiceRate.RateDescription),\r\n type: getRateType(apiServiceRate.Unit),\r\n powerType: apiServiceRate.PowerType,\r\n priceType: apiServiceRate.PriceType,\r\n };\r\n if (isLowUserRate(apiServiceRate.UserType)) {\r\n acc.lowRates.push(rateToPush);\r\n } else if (isStandardUserRate(apiServiceRate.UserType)) {\r\n acc.standardRates.push(rateToPush);\r\n }\r\n return acc;\r\n }, {\r\n type: apiRate.Service,\r\n lowRates: [],\r\n standardRates: [],\r\n title: labels[apiRate.Service][0],\r\n titleMobile: labels[apiRate.Service][1],\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Returns true, if there is an error in electricity rates for specified usage type.\r\n * @param rates {Rates}\r\n * @param usageType {APIUsageType}\r\n * @return {boolean}\r\n */\r\nexport function hasElectricityRatesError(rates: Rates, usageType: APIUsageType): boolean {\r\n return Boolean(\r\n rates.find(rate => (\r\n rate.type === SERVICE_ID_ELECTRICITY &&\r\n (\r\n (usageType === USAGE_TYPE_STANDARD && !rate.standardRates.length) ||\r\n (usageType === USAGE_TYPE_LOW && !rate.lowRates.length)\r\n )\r\n ))\r\n );\r\n}\r\n\r\n/**\r\n * Returns true, if there is an error in gas rates.\r\n * @param rates {Rates}\r\n * @return {boolean}\r\n */\r\nexport function hasGasRatesError(rates: Rates): boolean {\r\n return Boolean(\r\n rates.find(rate => rate.type === SERVICE_ID_PIPED_GAS && !rate.standardRates.length)\r\n );\r\n}\r\n\r\n/**\r\n * Returns service rates per usage type.\r\n * @param usageType {APIUsageType}\r\n * @param type\r\n * @param lowRates\r\n * @param standardRates\r\n * @return {Array}\r\n */\r\nexport function getUsageTypeRates(usageType: APIUsageType, {type, lowRates, standardRates}: Rate): Array {\r\n return type === SERVICE_ID_ELECTRICITY\r\n ? usageType === USAGE_TYPE_LOW ? lowRates : standardRates\r\n : standardRates;\r\n}\r\n\r\n/**\r\n * Parses the rate (string, e.g 13c) and returns an instance of Decimal (number, value is in cents units).\r\n * @param rate {string}\r\n * @return {Decimal}\r\n */\r\nexport function parseRate(rate: string) {\r\n const match = rate.match(/^(\\$?)(\\d+\\.*\\d*)(c?)$/);\r\n if (match) {\r\n // eslint-disable-next-line\r\n let [_, __, value, cents] = match;\r\n value = new Decimal(value);\r\n if (cents) {\r\n return value;\r\n } else {\r\n return value.times(100);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Sums array of rates (string, e.g. 13c + $2.34) and returns a formatted value ($ or c).\r\n * @param rates {Array}\r\n * @return {string}\r\n */\r\nexport function sumRates(rates: Array): string {\r\n const summed = rates.map(parseRate).reduce(function (acc, x) { if (isNaN(x)) return acc; return acc.add(x); }, new Decimal(0));\r\n if (summed < 100) {\r\n return summed.toString() + 'c';\r\n } else {\r\n return '$' + summed.div(100).toString();\r\n }\r\n}\r\n\r\n/**\r\n * Returns rates which are summed (for rates overview).\r\n * @param usageType {APIUsageType}\r\n * @param rates {Rates}\r\n * @return {Array<{rateType: Rates.type, rates: Array, usageType: APIUsageType}>}\r\n */\r\nexport function getSummedRates(usageType: APIUsageType, rates: Rates) {\r\n return rates\r\n .map((rate: Rate) => (\r\n getUsageTypeRates(usageType, rate)\r\n .reduce((acc, {type, rate}) => {\r\n if (!acc.rates[type]) {\r\n acc.rates[type] = [];\r\n }\r\n acc.rates[type] = [...acc.rates[type], rate];\r\n return acc;\r\n }, {usageType, rateType: rate.type, rates: {}})\r\n ))\r\n .map(({usageType, rateType, rates}) => ({\r\n usageType,\r\n rateType,\r\n rates: Object.keys(rates).reduce((acc, x) => {\r\n acc[x] = sumRates(rates[x]);\r\n return acc;\r\n }, {}),\r\n }));\r\n}\r\n","// @flow\r\nimport React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport classNames from 'classnames';\r\n\r\nimport classes from './Rates.module.scss';\r\n\r\ntype Props = {\r\n fields: Object,\r\n className?: string,\r\n};\r\n\r\nconst Error = ({ fields, className }: Props) => (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n);\r\n\r\nexport default Error;\r\n","// @flow\r\nimport React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport cx from 'classnames';\r\n\r\nimport classes from './RatesOverview.module.scss';\r\n\r\ntype Props = {\r\n fields: Object,\r\n};\r\n\r\nconst MultipleRates = ({ fields }: Props) => (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n);\r\n\r\nexport default MultipleRates;\r\n","import React from 'react';\r\nimport { compose, branch, renderNothing } from 'recompose';\r\nimport cx from 'classnames';\r\nimport {\r\n RATE_UNIT_TYPE_WATT,\r\n RATE_FREE\r\n} from '../constants';\r\nimport classes from './RatesOverview.module.scss';\r\n\r\nconst Rate = ({ rate, totalRates, summedRates }) => (\r\n
    \r\n
    \r\n {rate.titleMobile}\r\n
    \r\n
    \r\n {rate.title}\r\n
    \r\n\r\n {!(rate.lowRates.filter(obj => { if (obj.rate == RATE_FREE) return false; if(obj.type == RATE_UNIT_TYPE_WATT) return true; else return false; }).length > 1\r\n || rate.standardRates.filter(obj => { if (obj.rate == RATE_FREE) return false; if(obj.type == RATE_UNIT_TYPE_WATT) return true; else return false; }).length > 1) && (\r\n
    \r\n {summedRates.watt && (\r\n \r\n {summedRates.watt}/kWh\r\n \r\n )}\r\n {' '}\r\n {summedRates.day && (\r\n \r\n &{' '}{summedRates.day}/day\r\n \r\n )}\r\n
    \r\n )}\r\n\r\n {(rate.lowRates.filter(obj => { if (obj.rate == RATE_FREE) return false; if (obj.type == RATE_UNIT_TYPE_WATT) return true; else return false; }).length > 1\r\n || rate.standardRates.filter(obj => { if (obj.rate == RATE_FREE) return false; if (obj.type == RATE_UNIT_TYPE_WATT) return true; else return false; }).length > 1) && (\r\n
    \r\n Multiple rates apply\r\n
    \r\n )}\r\n
    \r\n);\r\n\r\nexport default compose(\r\n branch(\r\n ({ summedRates }) => !summedRates || (!summedRates.watt && !summedRates.day),\r\n renderNothing\r\n ),\r\n)(Rate);\r\n","import React from 'react';\r\nimport {\r\n compose,\r\n withProps,\r\n branch,\r\n renderNothing,\r\n renderComponent,\r\n} from 'recompose';\r\nimport classNames from 'classnames';\r\n\r\nimport classes from './RatesOverview.module.scss';\r\n\r\nimport { hasMultipleRates, getSummedRates } from '../utils';\r\nimport { SERVICE_ID_ELECTRICITY, SERVICE_ID_PIPED_GAS } from '../constants';\r\n\r\nimport MultipleRates from './MultipleRates';\r\nimport Rate from './Rate';\r\n\r\nconst RatesOverview = ({ fields, rates, totalRates, summedRates }) => (\r\n = 2,\r\n [classes.Single]: totalRates < 2,\r\n },\r\n )}\r\n >\r\n {rates.map((rate, key) => (\r\n \r\n ))}\r\n
    \r\n);\r\n\r\nfunction findSummedRatesForType(rateType, summedRates) {\r\n const x = summedRates.find(x => x.rateType === rateType);\r\n if (x) {\r\n return x.rates;\r\n }\r\n}\r\n\r\nexport default compose(\r\n // do not render if no rates defined\r\n branch(({ rates }) => !rates || !rates.length, renderNothing),\r\n // Injects component props\r\n withProps(({ usageType, rates }) => ({\r\n multipleRates: hasMultipleRates(usageType, rates),\r\n totalRates: rates\r\n .filter(({ standardRates, lowRates }) => standardRates.length >= 1 || lowRates.length >= 1)\r\n .length\r\n })),\r\n // Render multiple rates text if multiple rates\r\n branch(\r\n ({ multipleRates }) => Boolean(multipleRates),\r\n renderComponent(MultipleRates)\r\n ),\r\n // Injects totals for rates and filter rates only for ELEC and GAS\r\n withProps(({ usageType, rates }) => ({\r\n rates: rates.filter(({ type }) => [SERVICE_ID_ELECTRICITY, SERVICE_ID_PIPED_GAS].includes(type)),\r\n summedRates: getSummedRates(usageType, rates),\r\n })),\r\n)(RatesOverview);\r\n","// @flow\r\nimport React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport classes from './RatesContent.module.scss';\r\n\r\ntype Props = {\r\n field: Object,\r\n};\r\n\r\nconst NoRates = ({ field }: Props) => (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n);\r\n\r\nexport default NoRates;\r\n","import React from 'react';\r\nimport { compose } from 'recompose';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Info } from '../SVG';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport { withTouch } from '../../enhancers';\r\n\r\nclass InfoTip extends React.Component {\r\n state = {\r\n open: false,\r\n };\r\n\r\n infotipClose = () => {\r\n this.setState({ open: false });\r\n };\r\n\r\n infotipOpen = () => { \r\n this.setState({ open: !this.state.open });\r\n };\r\n\r\n render() {\r\n const { isTouch, fields } = this.props;\r\n\r\n if (isTouch) {\r\n return (\r\n \r\n \r\n \r\n }\r\n disableHoverListener\r\n >\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n return (\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\r\nexport default compose(withTouch)(InfoTip);\r\n","// @flow\r\nimport React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderNothing, withProps } from 'recompose';\r\nimport cx from 'classnames';\r\n\r\nimport classes from './RatesContent.module.scss';\r\n\r\nimport InfoTip from '../../../ToolTip/infoTip';\r\n\r\nimport type { APIUsageType, Rate as RateType } from \"../types\";\r\nimport { USAGE_TYPE_LOW, USAGE_TYPE_STANDARD, SERVICE_ID_ELECTRICITY, SERVICE_ID_PIPED_GAS } from '../constants';\r\n\r\ntype Props = {\r\n usageType: APIUsageType,\r\n rate: RateType,\r\n fields: Object,\r\n areRatesToggleable: boolean,\r\n onToggleUsageType?: () => void,\r\n};\r\n\r\nconst usageTypeLabel = {\r\n [USAGE_TYPE_LOW]: 'Low',\r\n [USAGE_TYPE_STANDARD]: 'Standard',\r\n};\r\n\r\nconst DetailedRate = ({ rate, usageType, fields, areRatesToggleable, onToggleUsageType, currentRates }: Props) => (\r\n
    \r\n
    \r\n
    \r\n {rate.type === SERVICE_ID_ELECTRICITY && (\r\n \r\n )}\r\n />\r\n )}\r\n {rate.type === SERVICE_ID_PIPED_GAS && (\r\n \r\n )}\r\n
    \r\n {areRatesToggleable && (\r\n
    \r\n {getSwitchRatesLabel(\r\n usageType,\r\n (fields.ToggleLabel && fields.ToggleLabel.value) || 'Show %usageType% rates'\r\n )}\r\n
    \r\n )}\r\n
    \r\n
    \r\n
    \r\n {currentRates.map((r, i) => (\r\n \r\n ))}\r\n
    \r\n {areRatesToggleable && (\r\n
    \r\n {getSwitchRatesLabel(\r\n usageType,\r\n (fields.ToggleLabel && fields.ToggleLabel.value) || 'Show %usageType% rates'\r\n )}\r\n
    \r\n )}\r\n
    \r\n
    \r\n);\r\n\r\n/**\r\n * Returns switch usage type text, e.g. \"Show standard user rates\"\r\n * @param usageType {APIUsageType}\r\n * @param message {string}\r\n * @return {string}\r\n */\r\nfunction getSwitchRatesLabel(usageType: APIUsageType, message: string): string {\r\n const switchedUsageType = usageType === USAGE_TYPE_STANDARD ? USAGE_TYPE_LOW : USAGE_TYPE_STANDARD;\r\n const utLabel = usageTypeLabel[switchedUsageType];\r\n if (!message || !utLabel) return '';\r\n return message.replace('%usageType%', utLabel.toLowerCase())\r\n}\r\n\r\nconst RateLabel = ({ label, userRatesLabel, tooltip }) => (\r\n <>\r\n \r\n {' ('}{') '}\r\n {tooltip}\r\n \r\n);\r\n\r\nconst Rate = props => (\r\n
    \r\n {props.title}\r\n \r\n {props.price}\r\n {/\\d/.test(props.price) ? props.value === 'day' ? '/day' : '/kWh' : \"\"}\r\n \r\n
    \r\n);\r\n\r\nexport default compose(\r\n branch(\r\n // render only for electricity an d piped gas and only if rates are set\r\n ({ rate, usageType }) => (\r\n !rate ||\r\n ![SERVICE_ID_ELECTRICITY, SERVICE_ID_PIPED_GAS].includes(rate.type) ||\r\n (rate.type === SERVICE_ID_ELECTRICITY && usageType === USAGE_TYPE_LOW\r\n ? !rate.lowRates || !rate.lowRates.length\r\n : !rate.standardRates || !rate.standardRates.length\r\n )\r\n ),\r\n renderNothing\r\n ),\r\n withProps(({ usageType, rate }) => ({\r\n currentRates: usageType === USAGE_TYPE_LOW && rate.type === SERVICE_ID_ELECTRICITY\r\n ? rate.lowRates\r\n : rate.standardRates\r\n })),\r\n)(DetailedRate);\r\n","// @flow\r\nimport React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport classes from './RatesContent.module.scss';\r\n\r\nimport BillCompare from '../../../BillCompare';\r\n\r\nimport type { Rate, Rates } from '../types';\r\nimport { SERVICE_ID_ELECTRICITY } from '../constants';\r\n\r\nimport NoRates from './NoRates';\r\nimport DetailedRate from './DetailedRate';\r\nimport type { APIUsageType } from \"../types\";\r\n\r\ntype Props = {\r\n usageType: APIUsageType,\r\n fields: Object,\r\n rates: Rates,\r\n hasElectricityRatesError: boolean,\r\n hasGasRatesError: boolean,\r\n isBachPlan: boolean,\r\n billCompare?: any,\r\n onToggleUsageType: () => void,\r\n};\r\n\r\nconst RatesContent = (props: Props) => (\r\n
    \r\n
    \r\n {props.hasElectricityRatesError && (\r\n \r\n )}\r\n\r\n {props.rates && props.rates.map((rate: Rate, key: number) => (\r\n \r\n ))}\r\n\r\n {props.hasGasRatesError && (\r\n \r\n )}\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n {props.billCompare && (\r\n \r\n )}\r\n
    \r\n);\r\n\r\nexport default RatesContent;\r\n","// @flow\r\nimport React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderComponent, withHandlers } from 'recompose';\r\nimport classNames from 'classnames';\r\n\r\nimport classes from './Rates.module.scss';\r\n\r\nimport { withActions, withUIContextProps } from '../../../enhancers';\r\nimport type { Rates as RatesType } from './types';\r\nimport {USAGE_TYPE_LOW, USAGE_TYPE_STANDARD} from \"./constants\";\r\nimport { areRatesValid } from './utils';\r\n\r\nimport ToggleDetailsButton from '../../Common/ToggleDetailsButton';\r\nimport Error from './Error';\r\nimport RatesOverview from './RatesOverview';\r\nimport RatesContent from './RatesContent';\r\n\r\ntype Props = {\r\n id: string,\r\n rates: RatesType,\r\n hasGasRatesError: boolean,\r\n hasElectricityRatesError: boolean,\r\n isBachPlan: boolean,\r\n billCompare?: any,\r\n fields: Object,\r\n className?: string,\r\n};\r\n\r\nconst Rates = ({\r\n id,\r\n rates,\r\n usageType,\r\n hasGasRatesError,\r\n hasElectricityRatesError,\r\n isBachPlan,\r\n fields,\r\n billCompare,\r\n expandRates,\r\n toggleExpandRates,\r\n onToggleUsageType,\r\n className,\r\n}: Props) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n expandedLabel={}\r\n className={classes.ToggleRates}\r\n />\r\n
    \r\n
    \r\n {expandRates && (\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * HOC\r\n * Injects toggle expand rates event handler.\r\n */\r\nconst withExpandRatesHandler = compose(\r\n withActions,\r\n withHandlers({\r\n toggleExpandRates: ({ expandRates, actions }) => () => {\r\n actions.setExpandRates(!expandRates);\r\n },\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects toggle usage type event handler.\r\n */\r\nconst withToggleUsageTypeHandler = compose(\r\n withActions,\r\n withHandlers({\r\n onToggleUsageType: ({ actions, usageType }) => () => {\r\n actions.saveUsageType(\r\n usageType === USAGE_TYPE_STANDARD ? USAGE_TYPE_LOW : USAGE_TYPE_STANDARD\r\n );\r\n },\r\n }),\r\n);\r\n\r\nexport default compose(\r\n branch(\r\n ({ rates }) => !areRatesValid(rates),\r\n renderComponent(Error)\r\n ),\r\n withUIContextProps(['expandRates', 'usageType']),\r\n withExpandRatesHandler,\r\n withToggleUsageTypeHandler,\r\n)(Rates);\r\n","// @flow\r\nimport React from 'react';\r\nimport cx from 'classnames';\r\n\r\nimport classes from './EnergyRates.module.scss';\r\nimport ratesClasses from './Rates/Rates.module.scss';\r\n\r\ntype Props = {\r\n};\r\n\r\nconst NoAddress = (props: Props) => (\r\n
    \r\n
    \r\n
    \r\n Your street address and services are required to calculate your rates\r\n
    \r\n
    \r\n
    \r\n);\r\n\r\nexport default NoAddress;\r\n","// @flow\r\nimport React from 'react';\r\nimport {compose, withProps, branch, renderComponent} from 'recompose';\r\n\r\nimport classes from './EnergyRates.module.scss';\r\n\r\nimport Rates from './Rates';\r\nimport * as RatesUtil from './Rates/utils';\r\nimport {\r\n SERVICE_ID_ELECTRICITY,\r\n SERVICE_ID_PIPED_GAS,\r\n SERVICE_ID_BROADBAND\r\n} from './Rates/constants';\r\n\r\nimport {\r\n withCustomerAddress,\r\n withCustomerServiceRates,\r\n withSelectedService,\r\n withIsSouthIsland,\r\n withIsBachPlan,\r\n withUIContextProps,\r\n withSaving,\r\n} from '../../enhancers';\r\n\r\nimport NoAddress from './NoAddress';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\n\r\n/**\r\n * HOC\r\n * Checks if customer address set.\r\n * If not renders no address message instead.\r\n */\r\nconst withAddressCheck = compose(\r\n withCustomerAddress,\r\n // We're not rendering rates (we're rendering a no address message instead) if we don't have address\r\n // as we cannot price estimate without it.\r\n branch(({address}) => !address, renderComponent(NoAddress))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects fields into component.\r\n */\r\nconst withFields = withProps(({ definition }) => ({\r\n fields: definition && definition[0] && definition[0].fields,\r\n}));\r\n\r\n/**\r\n * HOC\r\n * Injects readable rates as a prop.\r\n * Renders error message if not set/valid.\r\n */\r\nconst withRates = compose(\r\n withCustomerServiceRates,\r\n withProps(({ serviceRates, fields }) => ({\r\n rates: RatesUtil.getRates(serviceRates, {\r\n [SERVICE_ID_ELECTRICITY]: [\r\n fields.ElectricityLabel && fields.ElectricityLabel.value,\r\n fields.ElectricityLabelMob && fields.ElectricityLabelMob.value,\r\n ],\r\n [SERVICE_ID_PIPED_GAS]: [\r\n fields.GasLabel && fields.GasLabel.value,\r\n fields.GasLabelMob && fields.GasLabel.value,\r\n ],\r\n [SERVICE_ID_BROADBAND]: ['Your Broadband rates', 'Broadband rates'],\r\n }),\r\n })),\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects hasElectricityRatesError and hasGasRatesError properties.\r\n */\r\nconst withRatesErrors = compose(\r\n withProps(({rates, usageType, hasElectricity, hasPipedGas, isSouthIsland}) => ({\r\n hasElectricityRatesError: hasElectricity && RatesUtil.hasElectricityRatesError(rates, usageType),\r\n hasGasRatesError: hasPipedGas && !isSouthIsland && RatesUtil.hasGasRatesError(rates),\r\n })),\r\n);\r\n\r\n/**\r\n * HOC\r\n * Displays loading indicator of the wrapped component if saving.\r\n */\r\nconst withSavingOverlay = compose(\r\n withSaving,\r\n Component => ({ className, isSaving, ...props }) => (\r\n
    \r\n \r\n {isSaving && (\r\n \r\n )}\r\n
    \r\n )\r\n);\r\n\r\nexport default compose(\r\n withAddressCheck,\r\n withFields,\r\n withSelectedService,\r\n withProps(({ selectedService }) => ({\r\n hasElectricity: selectedService && selectedService.includes(SERVICE_ID_ELECTRICITY),\r\n hasPipedGas: selectedService && selectedService.includes(SERVICE_ID_PIPED_GAS),\r\n })),\r\n withIsSouthIsland,\r\n withIsBachPlan,\r\n withUIContextProps(['usageType']),\r\n withRates,\r\n withRatesErrors,\r\n withProps({\r\n className: classes.EnergyRates,\r\n }),\r\n withSavingOverlay,\r\n)(Rates);\r\n","import React, { Fragment } from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\nconst FormIntro = props => {\r\n const { isExperienceEditor, Text } = props;\r\n return (\r\n \r\n {(isExperienceEditor || (Text && Text.value)) && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default withExperienceEditor(FormIntro);\r\n","import React, { Fragment, Component } from 'react';\r\nimport { compose, withProps, branch, renderNothing } from 'recompose';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { withExperienceEditor, withJourneyType } from '../../enhancers';\r\nimport { withDevice } from '../../enhancers/common';\r\nimport { getImageFieldSrc } from '../../utils';\r\nimport CTA from '../CTA';\r\n\r\nclass InfoBanner extends Component {\r\n state = {\r\n open: true,\r\n };\r\n\r\n dismissBanner = () => {\r\n if (this._banner) {\r\n this._banner.className += ' slideup';\r\n }\r\n setTimeout(() => {\r\n this.setState({\r\n open: false,\r\n });\r\n }, 500);\r\n };\r\n\r\n onToggleLink = () => {\r\n const link =\r\n this.props &&\r\n this.props.fields &&\r\n this.props.fields &&\r\n this.props.fields.CTALink &&\r\n this.props.fields.CTALink.value &&\r\n this.props.fields.CTALink.value.href;\r\n if (link && window) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n render() {\r\n const { open } = this.state;\r\n\r\n if (!open) {\r\n return null;\r\n }\r\n\r\n const { isExperienceEditor, fields, background } = this.props;\r\n const titleColor =\r\n fields && fields.TitleColor && fields.TitleColor.value;\r\n const introColor =\r\n fields && fields.IntroColor && fields.IntroColor.value;\r\n const closeLinkColor =\r\n fields && fields.CloseLinkColor && fields.CloseLinkColor.value;\r\n\r\n return (\r\n (this._banner = banner)}\r\n >\r\n {(isExperienceEditor ||\r\n (fields.Title && fields.Title.value)) && (\r\n \r\n \r\n
    \r\n )}\r\n {(isExperienceEditor ||\r\n (fields.Intro && fields.Intro.value)) && (\r\n \r\n \r\n
    \r\n )}\r\n\r\n {(isExperienceEditor ||\r\n (fields.CTALink &&\r\n fields.CTALink.value &&\r\n fields.CTALink.value.href)) && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {(isExperienceEditor ||\r\n (fields.IsDismissible && fields.IsDismissible.value\r\n && fields.CloseLink && fields.CloseLink.value)) && (\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}\r\n\r\nconst CloseBtn = ({ color }) => {\r\n const iconColor = color ? color : '#303030';\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst withBackground = withProps(({ fields, device }) => {\r\n let bkg =\r\n fields['BannerBackgroundColor'] && fields['BannerBackgroundColor'].value\r\n ? { backgroundColor: fields['BannerBackgroundColor'].value }\r\n : null;\r\n const mob = getImageFieldSrc(fields['MobileBg'])\r\n ? {\r\n backgroundImage: `url(${getImageFieldSrc(fields['MobileBg'])})`,\r\n }\r\n : null;\r\n const tab = getImageFieldSrc(fields['TabletBg'])\r\n ? {\r\n backgroundImage: `url(${getImageFieldSrc(fields['TabletBg'])})`,\r\n }\r\n : null;\r\n const desk = getImageFieldSrc(fields['DesktopBg'])\r\n ? {\r\n backgroundImage: `url(${getImageFieldSrc(fields['DesktopBg'])})`,\r\n }\r\n : null;\r\n switch (device) {\r\n case 'mobile':\r\n bkg = mob || tab || desk || bkg;\r\n break;\r\n case 'tablet':\r\n bkg = tab || desk || mob || bkg;\r\n break;\r\n case 'desktop':\r\n default:\r\n bkg = desk || tab || mob || bkg;\r\n }\r\n return { background: bkg };\r\n});\r\n\r\n// HOC\r\n// Check if journey types mapped to Banner - only render to allowed type\r\nconst withJourneyTypes = compose(\r\n withJourneyType,\r\n withProps(({ fields, journeyType }) => {\r\n const mappedJourneys = fields && fields.ShowOnlyForJourneyTypes;\r\n const mappedJourneysIds =\r\n mappedJourneys && mappedJourneys.length\r\n ? mappedJourneys.map(\r\n item =>\r\n item &&\r\n item.fields &&\r\n item.fields.Value &&\r\n item.fields.Value.value &&\r\n parseInt(item.fields.Value.value, 10)\r\n )\r\n : [];\r\n return {\r\n showBanner:\r\n mappedJourneysIds && mappedJourneysIds.length\r\n ? mappedJourneysIds.includes(journeyType)\r\n ? true\r\n : false\r\n : true,\r\n };\r\n }),\r\n branch(({ showBanner }) => !showBanner, renderNothing)\r\n);\r\n\r\nexport default compose(\r\n withExperienceEditor,\r\n withJourneyTypes,\r\n withDevice([768, 1024]),\r\n withBackground\r\n)(InfoBanner);\r\n","import React, { Component } from 'react';\r\nimport { Placeholder, Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { default as Header } from '../FormHeader';\r\nimport { default as Intro } from '../FormIntro';\r\nimport TextInput from '../FormFields/TextInput';\r\nimport { compose } from 'recompose';\r\nimport {\r\n withActions,\r\n withJourneyType,\r\n withExperienceEditor,\r\n withCustomerAccount,\r\n withJourneyVisibility\r\n} from '../../enhancers';\r\nimport { HASH_JOURNEYS } from '../../constants';\r\nimport { QuestionMark } from '../SVG';\r\nimport { default as Modal } from '../Common/Modal';\r\n\r\nclass JourneyActionContainer extends Component {\r\n state = {\r\n selectedJourney: null,\r\n journeyToggled: null,\r\n tooltipOpen: false,\r\n };\r\n\r\n userAccountInput = React.createRef();\r\n\r\n updateUserAccount = (value, error) => {\r\n const { fields } = this.props;\r\n const validationMessage =\r\n fields &&\r\n fields.UserAccountValidationMessage &&\r\n fields.UserAccountValidationMessage.value;\r\n const requiredMessage =\r\n fields &&\r\n fields.UserAccountRequiredMessage &&\r\n fields.UserAccountRequiredMessage.value;\r\n const isRequired =\r\n fields &&\r\n fields.UserAccountRequired &&\r\n fields.UserAccountRequired.value;\r\n let errorMessage = '';\r\n if (!value) {\r\n errorMessage = isRequired ? requiredMessage : '';\r\n }\r\n if (value && error) {\r\n errorMessage = validationMessage;\r\n }\r\n return errorMessage;\r\n };\r\n\r\n saveUserAccount = (value, error) => {\r\n const { actions, customerAccount } = this.props;\r\n if (\r\n (value && !error && value !== customerAccount) ||\r\n (customerAccount && error)\r\n ) {\r\n actions.updateUserAccount(value && !error ? value : null);\r\n }\r\n };\r\n\r\n getActiveJourneys = () => {\r\n const arr = [];\r\n const activeJourneys =\r\n this.props &&\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['journey-actions-placeholder'];\r\n if (activeJourneys && activeJourneys.length) {\r\n activeJourneys.forEach(journey => {\r\n const id =\r\n journey.fields &&\r\n journey.fields.JourneyAction &&\r\n journey.fields.JourneyAction.fields &&\r\n journey.fields.JourneyAction.fields.Value &&\r\n journey.fields.JourneyAction.fields.Value.value;\r\n if (id) {\r\n arr.push(parseInt(id, 10));\r\n }\r\n });\r\n }\r\n return arr;\r\n };\r\n\r\n getActiveJourneyLabel = id => {\r\n const activeJourneys =\r\n this.props &&\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['journey-actions-placeholder'];\r\n if (activeJourneys && activeJourneys.length && id) {\r\n const found = activeJourneys.find(journey => {\r\n const journeyId =\r\n journey.fields &&\r\n journey.fields.JourneyAction &&\r\n journey.fields.JourneyAction.fields &&\r\n journey.fields.JourneyAction.fields.Value &&\r\n journey.fields.JourneyAction.fields.Value.value;\r\n return parseInt(journeyId, 10) === id;\r\n });\r\n return found\r\n ? found.fields &&\r\n found.fields.JourneyAction &&\r\n found.fields.JourneyAction.fields &&\r\n found.fields.JourneyAction.fields.Text &&\r\n found.fields.JourneyAction.fields.Text.value\r\n : null;\r\n }\r\n return null;\r\n };\r\n\r\n componentDidMount() {\r\n const isHashSet = window && window.location && window.location.hash;\r\n const isUrlDriven =\r\n isHashSet &&\r\n HASH_JOURNEYS.hasOwnProperty(isHashSet.replace('#', ''));\r\n const presented = this.getActiveJourneys();\r\n if (isUrlDriven) {\r\n const hashId = HASH_JOURNEYS[isHashSet.replace('#', '')];\r\n const isLegit = presented.indexOf(hashId) > -1;\r\n if (isLegit) {\r\n const label = this.getActiveJourneyLabel(hashId);\r\n this.props.actions.setJourneyType({ text: label, id: hashId });\r\n this.setState({\r\n selectedJourney: hashId,\r\n });\r\n }\r\n } else {\r\n const preset = this.props && this.props.journeyType;\r\n const customer = this.props.customer;\r\n const matchedToPresented = presented.indexOf(preset) >= 0;\r\n if (!matchedToPresented) {\r\n this.props.actions.setJourneyType({ text: null, id: null });\r\n } else {\r\n this.setState({\r\n selectedJourney:\r\n customer &&\r\n customer.Customer &&\r\n customer.Customer.Action,\r\n });\r\n }\r\n }\r\n this.props.actions.toggleJourneyActions(true);\r\n }\r\n\r\n onToggleJourneyType = (id, text) => {\r\n const { actions } = this.props;\r\n const isSelected =\r\n this.state.selectedJourney === parseInt(id, 10) ? true : false;\r\n this.setState({\r\n journeyToggled: parseInt(id, 10),\r\n selectedJourney: isSelected ? null : parseInt(id, 10),\r\n });\r\n isSelected\r\n ? actions.setJourneyType({ text: null, id: null }).then(\r\n success => {\r\n this.setState({\r\n journeyToggled: null,\r\n });\r\n },\r\n error => {\r\n console.log('Journey Type save error');\r\n }\r\n )\r\n : actions.setJourneyType({ text: text, id: id }).then(\r\n success => {\r\n this.setState({\r\n journeyToggled: null,\r\n });\r\n },\r\n error => {\r\n console.log('Journey Type save error');\r\n }\r\n );\r\n };\r\n\r\n toggleToolTip = () => {\r\n this.setState({\r\n tooltipOpen: !this.state.tooltipOpen,\r\n });\r\n };\r\n\r\n render() {\r\n const { fields, isExperienceEditor, customerAccount } = this.props;\r\n const { selectedJourney, journeyToggled, tooltipOpen } = this.state;\r\n\r\n const validationPattern =\r\n fields &&\r\n fields.UserAccountValidation &&\r\n fields.UserAccountValidation.value;\r\n const isRequired =\r\n fields &&\r\n fields.UserAccountRequired &&\r\n fields.UserAccountRequired.value;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n {(isExperienceEditor ||\r\n (this.props && this.props.showComponent\r\n && fields.UserAccount && fields.UserAccount.value)) && (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n )}\r\n {tooltipOpen ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n }\r\n}\r\nexport default compose(\r\n withJourneyVisibility,\r\n withActions,\r\n withJourneyType,\r\n withExperienceEditor,\r\n withCustomerAccount\r\n)(JourneyActionContainer);\r\n","import React from 'react';\r\nimport CTA from '../CTA';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\nimport { withSaving } from '../../enhancers';\r\n\r\nconst JourneyButton = props => {\r\n const { fields, isSaving, onToggleJourneyType } = props;\r\n\r\n if (!fields) {\r\n return null;\r\n }\r\n\r\n const id =\r\n fields &&\r\n fields.JourneyAction &&\r\n fields.JourneyAction.fields &&\r\n fields.JourneyAction.fields.Value &&\r\n fields.JourneyAction.fields.Value.value;\r\n\r\n const text =\r\n fields &&\r\n fields.JourneyAction &&\r\n fields.JourneyAction.fields &&\r\n fields.JourneyAction.fields.Text &&\r\n fields.JourneyAction.fields.Text.value;\r\n\r\n const isSelected =\r\n props.selectedJourney && props.selectedJourney === parseInt(id, 10)\r\n ? true\r\n : false;\r\n\r\n const isToggled = props.journeyToggled === parseInt(id, 10) ? true : false;\r\n\r\n return (\r\n \r\n onToggleJourneyType(id, text)}\r\n />\r\n {isSaving && isToggled && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default withSaving(JourneyButton);\r\n","import React, { Fragment } from 'react';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\n\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\n// DISCOUNT ICONS\r\nimport { PPD, DuelFuel, Email } from '../SVG';\r\n\r\n// isAnyDiscountSet needs refactor\r\nconst Discounts = props => {\r\n return (\r\n \r\n {isAnyDiscountSet(props.fields.PromptNumber, props.fields.PromptText, props.fields.DualNumber, props.fields.DualText, props.fields.DigitalNumber, props.fields.DigitalText) && (\r\n \r\n {props.title &&
    {props.title}
    }\r\n\r\n
    \r\n {isDiscountSet(props.fields.PromptNumber, props.fields.PromptText) && (\r\n }\r\n amount={props.fields.PromptNumber.value}\r\n desc={props.fields.PromptText.value}\r\n showTooltip={props.showTooltip}\r\n />\r\n )}\r\n {isDiscountSet(props.fields.DualNumber, props.fields.DualText) && (\r\n }\r\n amount={props.fields.DualNumber.value}\r\n desc={props.fields.DualText.value}\r\n showTooltip={props.showTooltip}\r\n />\r\n )}\r\n {isDiscountSet(props.fields.DigitalNumber, props.fields.DigitalText) && (\r\n }\r\n amount={props.fields.DigitalNumber.value}\r\n desc={props.fields.DigitalText.value}\r\n showTooltip={props.showTooltip}\r\n />\r\n )}\r\n
    \r\n
    \r\n )}\r\n \r\n );\r\n};\r\n\r\nfunction isAnyDiscountSet (value1,text1, value2, text2, value3,text3) {\r\n return isDiscountSet(value1, text1) && isDiscountSet(value2, text2) && isDiscountSet(value3, text3);\r\n}\r\nfunction isDiscountSet (NumberField, TextField) {\r\n return NumberField && NumberField.value && TextField && TextField.value;\r\n}\r\n\r\nconst Discount = props => {\r\n const isExperienceEditor = props.isExperienceEditor;\r\n return isExperienceEditor || !props.showTooltip ? (\r\n
    \r\n
    {props.icon}
    \r\n
    {props.amount}%
    \r\n
    \r\n {props.amount}% {props.desc}\r\n
    \r\n
    \r\n ) : (\r\n \r\n
    \r\n
    {props.icon}
    \r\n
    {props.amount}%
    \r\n
    \r\n {props.amount}% {props.desc}\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default withExperienceEditor(Discounts);\r\n","import React, { Component } from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { default as CTA } from '../CTA';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\nimport { default as Modal } from '../Common/Modal';\r\nimport { default as PlanFace } from './PlanFace';\r\nimport { default as PlanTAC } from './PlanTAC';\r\n\r\nimport { withTogglePlanHandler } from './enhancers';\r\n\r\nclass PlanDetails extends Component {\r\n state = {\r\n isModalOpen: false,\r\n };\r\n\r\n toggleTAC = () => {\r\n if (this.props.fields) {\r\n this.setState({\r\n isModalOpen: !this.state.isModalOpen,\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n getDetailsStyles = (styles, label) => {\r\n const fields = styles && styles.fields;\r\n if (fields) {\r\n return {\r\n Color:\r\n fields.TextColorInitialState &&\r\n fields.TextColorInitialState.fields &&\r\n fields.TextColorInitialState.fields.HexColor,\r\n Label: label || fields.TextInitialState,\r\n Icon: fields.IconInitialState,\r\n BackgroundColor:\r\n fields.BackgroundColorInitialState &&\r\n fields.BackgroundColorInitialState.fields &&\r\n fields.BackgroundColorInitialState.fields.HexColor,\r\n HoverLabel:\r\n (fields.TextHoverState && fields.TextHoverState.value) ||\r\n label ||\r\n fields.TextInitialState,\r\n HoverIcon: fields.IconHoverState,\r\n HoverColor:\r\n fields.TextColorHoverState &&\r\n fields.TextColorHoverState.fields &&\r\n fields.TextColorHoverState.fields.HexColor,\r\n HoverBackgroundColor:\r\n fields.BackgroundColorHoverState &&\r\n fields.BackgroundColorHoverState.fields &&\r\n fields.BackgroundColorHoverState.fields.HexColor,\r\n };\r\n }\r\n return {\r\n Label: label,\r\n HoverLabel: label,\r\n };\r\n };\r\n\r\n onTogglePlan = (e) => {\r\n const mainHandler = this.props.onTogglePlan;\r\n const secondHandler = this.props.closeModal;\r\n if (secondHandler) {\r\n secondHandler();\r\n }\r\n mainHandler(e);\r\n };\r\n\r\n render() {\r\n const { fields, isSelected } = this.props;\r\n const { isModalOpen } = this.state;\r\n const detailsCTA = this.getDetailsStyles(\r\n this.props.fields.DetailsTermsAndConditionsStyle,\r\n this.props.fields.DetailsTermsAndConditionsText\r\n );\r\n\r\n return (\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
    \r\n \r\n\r\n \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n {isModalOpen ? (\r\n \r\n \r\n \r\n ) : null}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default withTogglePlanHandler(PlanDetails);\r\n\r\n/*** {this.props.modalShowDiscounts && (\r\n \r\n)} */\r\n","import React, { Fragment, Component } from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport Discounts from './Discounts';\r\nimport { default as Modal } from '../Common/Modal';\r\nimport CTA from '../CTA';\r\nimport PlanDetails from './PlanDetails';\r\nimport { compose } from 'recompose';\r\nimport { withTogglePlanHandler } from './enhancers';\r\nimport { withTouch } from '../../enhancers';\r\n\r\nclass PlanFace extends Component {\r\n state = {\r\n isModalOpen: false,\r\n logoFlipped: false,\r\n };\r\n\r\n toggleTAC = () => {\r\n if (this.props.fields) {\r\n this.setState({\r\n isModalOpen: !this.state.isModalOpen,\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n getRibbonBackground = () => {\r\n const { fields } = this.props;\r\n const background =\r\n fields &&\r\n fields.PlanRibbonBackground &&\r\n fields.PlanRibbonBackground.value;\r\n const logoEnabled =\r\n fields && fields.AASFlogoEnabled && fields.AASFlogoEnabled.value;\r\n if (background) {\r\n const pattern = RegExp('gradient');\r\n const isGradient = pattern.test(background);\r\n return {\r\n variant: isGradient ? 'gradient' : 'solid',\r\n color: background,\r\n };\r\n }\r\n return {\r\n variant: logoEnabled ? 'solid' : 'gradient',\r\n color: '',\r\n };\r\n };\r\n\r\n flipLogo = () => {\r\n this.setState({\r\n logoFlipped: !this.state.logoFlipped,\r\n });\r\n };\r\n\r\n render() {\r\n const { fields, onTogglePlan, isSelected, isTouch } = this.props;\r\n const { isModalOpen, logoFlipped } = this.state;\r\n const fullView = this.props.fullView || false;\r\n\r\n const logoEnabled =\r\n fields && fields.AASFlogoEnabled && fields.AASFlogoEnabled.value;\r\n const logo =\r\n fields &&\r\n fields.AASFlogoImage &&\r\n fields.AASFlogoImage.value &&\r\n fields.AASFlogoImage.value.src;\r\n const ribbonBackground = this.getRibbonBackground();\r\n const ribbonSet = fields.PlanRibbon && fields.PlanRibbon.value;\r\n\r\n return (\r\n
    \r\n {fields.BestFor && fields.BestFor.value && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {(ribbonSet || logoEnabled) && (\r\n
    \r\n
    \r\n \r\n \r\n {!logoEnabled && (\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n {logoEnabled && (\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
    \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 {fullView ? (\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {isModalOpen ? (\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default compose(\r\n withTogglePlanHandler,\r\n withTouch\r\n)(PlanFace);\r\n","import React from 'react';\r\nimport { compose, branch, renderNothing, withProps } from 'recompose';\r\nimport { default as PlanFace } from './PlanFace';\r\nimport { default as PlanDetails } from './PlanDetails';\r\n\r\nimport { withPlansAndServicesProps } from '../../enhancers';\r\nimport { withExtractContentToState } from './enhancers';\r\nimport { doesPlanMeetRequirements } from '../../utils/plans-rules';\r\n\r\nimport { useScrollToSelectedOnce } from '../Common/Carousel';\r\n\r\nconst PlanCard = ({ fields, flat, selected, slideIndex }) => {\r\n useScrollToSelectedOnce({ selected, slideIndex });\r\n\r\n return (\r\n
    \r\n {/* Plan Card View Rendering Detailed vs Card */}\r\n {!flat ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Extracts plan data from sitecore content and registers plan\r\n * into global store (allPlans).\r\n * @param siteCoreId\r\n * @param apiId\r\n * @param title\r\n * @param actions\r\n */\r\nfunction extractPlan({ siteCoreId, apiId, title, actions }) {\r\n actions.registerPlan({ siteCoreId, apiId, title });\r\n}\r\n\r\n\r\nexport default compose(\r\n // register plan first\r\n withProps(({ fields }) => ({\r\n siteCoreId: (\r\n fields &&\r\n fields.ExistingPlan &&\r\n (fields.ExistingPlan.id || fields.ExistingPlan.uid)\r\n ) || null,\r\n apiId: (\r\n fields &&\r\n fields.ExistingPlan &&\r\n fields.ExistingPlan.fields &&\r\n fields.ExistingPlan.fields.ApiPlanId &&\r\n fields.ExistingPlan.fields.ApiPlanId.value\r\n ),\r\n title: (\r\n fields &&\r\n fields.ExistingPlan &&\r\n fields.ExistingPlan.fields &&\r\n fields.ExistingPlan.fields.Title &&\r\n fields.ExistingPlan.fields.Title.value\r\n ),\r\n })),\r\n withExtractContentToState(extractPlan),\r\n\r\n // check if not filtered and render\r\n withPlansAndServicesProps([\r\n 'selectedPlan',\r\n 'selectedService',\r\n 'plansRules',\r\n ]),\r\n branch(\r\n ({ applyFilter, apiId, plansRules, selectedService }) => (\r\n applyFilter && !doesPlanMeetRequirements(plansRules, selectedService, apiId)\r\n ),\r\n renderNothing\r\n ),\r\n // inject component props\r\n withProps(({ selectedPlan, apiId, fields }) => ({\r\n selected: selectedPlan && selectedPlan === apiId,\r\n fields: {\r\n ...fields,\r\n ...((\r\n fields &&\r\n fields.ExistingPlan &&\r\n fields.ExistingPlan.fields\r\n ) || {})\r\n }\r\n })),\r\n)(PlanCard);\r\n","import React from 'react';\r\nimport { compose, withHandlers } from 'recompose';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport Header from '../FormHeader';\r\nimport { default as PlanCard } from '../PlanCard';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\nimport { withExperienceEditor, withSelectedPlan } from '../../enhancers';\r\nimport { withActions } from '../../enhancers';\r\nimport Cookies from 'js-cookie';\r\n\r\nconst LandingPlanPage = props => {\r\n const { fields, action } = props; \r\n const { MappedPlans } = fields;\r\n const flat = MappedPlans && MappedPlans.length === 1;\r\n\r\n const goNewCustomer = async () => {\r\n await props.customerChoiceIsNo();\r\n\r\n const url =\r\n fields.NewCustomer &&\r\n fields.NewCustomer.value &&\r\n fields.NewCustomer.value.href;\r\n\r\n\r\n if (url && window) { \r\n \r\n const expiryDate = new Date();\r\n expiryDate.setMilliseconds(expiryDate.getMilliseconds() + 60000);\r\n let options = {\r\n expires: expiryDate,\r\n path: '/',\r\n secure: true,\r\n domain: '.contact.co.nz'\r\n };\r\n Cookies.remove('sharedPlanId');\r\n Cookies.remove('selectedService');\r\n\r\n const selectedPlan = props.actions.JustGetSelectedPlan();\r\n Cookies.set('sharedPlanId', selectedPlan, options);\r\n\r\n window.location.href = url;\r\n }\r\n };\r\n\r\n const goExistingCustomer = async () => {\r\n await props.customerChoiceIsYes();\r\n\r\n const url =\r\n fields.ExistingCustomer &&\r\n fields.ExistingCustomer.value &&\r\n fields.ExistingCustomer.value.href;\r\n\r\n\r\n if (url && window) {\r\n window.location.href = url;\r\n }\r\n };\r\n\r\n const twoButtons =\r\n fields.ExistingCustomer &&\r\n fields.ExistingCustomer.value &&\r\n fields.ExistingCustomer.value.text &&\r\n fields.NewCustomer &&\r\n fields.NewCustomer.value &&\r\n fields.NewCustomer.value.text;\r\n\r\n const getMappedPlanIds = () => {\r\n const arr = [];\r\n if (MappedPlans && MappedPlans.length) {\r\n MappedPlans.forEach(plan => {\r\n const id =\r\n plan &&\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.fields &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId.value;\r\n if (id) {\r\n arr.push(id);\r\n }\r\n });\r\n }\r\n return arr;\r\n };\r\n\r\n const landingPlans = getMappedPlanIds();\r\n\r\n const planSelected =\r\n props.selectedPlan &&\r\n props.selectedPlan !== '' &&\r\n landingPlans.includes(props.selectedPlan);\r\n\r\n return (\r\n
    \r\n {(props.isExperienceEditor ||\r\n (fields.Heading && fields.Heading.value)) && (\r\n
    \r\n )}\r\n \r\n {MappedPlans &&\r\n MappedPlans.length &&\r\n MappedPlans.map((plan, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n
    \r\n \r\n {(props.isExperienceEditor ||\r\n (fields.ActionsLabel && fields.ActionsLabel.value)) && (\r\n
    \r\n \r\n
    \r\n )}\r\n \r\n {(props.isExperienceEditor ||\r\n (fields.ExistingCustomer &&\r\n fields.ExistingCustomer.value &&\r\n fields.ExistingCustomer.value.text)) && (\r\n \r\n )}\r\n\r\n {(props.isExperienceEditor ||\r\n (fields.NewCustomer &&\r\n fields.NewCustomer.value &&\r\n fields.NewCustomer.value.text)) && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default compose(withSelectedPlan, withActions, withExperienceEditor, withHandlers({\r\n customerChoiceIsYes: ({ fields, actions }) => () => {\r\n return actions.customerChoice(true);\r\n },\r\n customerChoiceIsNo: ({ fields, actions }) => () => {\r\n return actions.customerChoice(false);\r\n }\r\n}))(LandingPlanPage);\r\n\r\n","import React from 'react';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, mapProps, branch, renderNothing, withHandlers } from 'recompose';\r\n\r\nimport Header from '../FormHeader';\r\nimport CTA from '../CTA';\r\n\r\nimport { withPlansAndServicesProps, withActions } from '../../enhancers';\r\n\r\nconst LpgCTA = compose(\r\n withPlansAndServicesProps(['lpgUsage']),\r\n withActions,\r\n withHandlers({\r\n onClick: ({ id, actions }) => () => {\r\n actions.toggleLpgUsage(id);\r\n }\r\n }),\r\n mapProps(({ id, lpgUsage, fields, field, ...props }) => ({\r\n ...props,\r\n fields: {\r\n ...fields,\r\n Label: field,\r\n SelectedLabel: field,\r\n HoverLabel: field,\r\n },\r\n selected: lpgUsage && lpgUsage.includes(id),\r\n })),\r\n)(CTA);\r\n\r\nconst LpgUsage = ({ fields, rendering }) => (\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\nexport default compose(\r\n branch(\r\n ({ fields }) => !fields,\r\n renderNothing\r\n ),\r\n withPlansAndServicesProps(['selectedService']),\r\n branch(\r\n ({ selectedService }) => !selectedService || !selectedService.includes('LPG'),\r\n renderNothing\r\n )\r\n)(LpgUsage);\r\n","import React from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { CSSTransitionGroup } from 'react-transition-group';\r\nimport cx from 'classnames';\r\n\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\nimport CloseIcon from '@material-ui/icons/Close';\r\n\r\nimport css from './Alert.module.scss';\r\n\r\nfunction filterNullValues(obj) {\r\n return Object.keys(obj)\r\n .filter(key => Boolean(obj[key]))\r\n .reduce((acc, key) => {\r\n acc[key] = obj[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\nconst styles = ({ fields }) =>\r\n filterNullValues({\r\n backgroundColor: fields.BackgroundColor && fields.BackgroundColor.value,\r\n color: fields.color && fields.Color.value,\r\n });\r\n\r\nconst classes = ({ fields }) =>\r\n cx(\r\n css.Alert,\r\n fields.AlertType && css[fields.AlertType.value.toLowerCase()]\r\n );\r\n\r\nconst Alert = ({ fields, payload, onClose, isExperienceEditor }) => (\r\n \r\n
    \r\n
    \r\n {isExperienceEditor || !payload ? (\r\n \r\n ) : (\r\n fields.Msg && fields.Msg.value && Object.keys(payload).reduce((acc, key) => {\r\n return acc.replace(new RegExp(`%{${key}}%`, 'g'), payload[key]);\r\n }, fields.Msg.value)\r\n )}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n);\r\n\r\nexport default withExperienceEditor(Alert);\r\n","import React from 'react';\r\nimport Alert from './Alert';\r\n\r\nimport { compose } from 'recompose';\r\nimport { withPlansAndServicesProps, withIsSouthIsland } from '../../enhancers';\r\n\r\nimport css from './styles.module.scss';\r\n\r\nclass Messaging extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n closed: [],\r\n };\r\n }\r\n\r\n handleClose(alert) {\r\n this.setState(({ closed }) => ({\r\n closed: [...closed, alert.fields.Id.value],\r\n }));\r\n }\r\n\r\n render() {\r\n const { fields, activeAlerts } = this.props;\r\n const { closed } = this.state;\r\n let alerts = (fields && fields.Messages) || [];\r\n \r\n alerts = alerts\r\n .filter(alert => alert && alert.fields)\r\n // map active alerts\r\n .map(alert => ({\r\n alert,\r\n active: activeAlerts.find(([id]) => alert.fields.Type.value === id),\r\n closed: closed.includes(alert.fields.Id.value),\r\n }))\r\n // filter active alerts only\r\n .filter(({ active }) => Boolean(active))\r\n // filter closed alerts\r\n .filter(({ closed }) => !closed);\r\n\r\n if (alerts.length === 0) {\r\n return null;\r\n }\r\n \r\n // Outfilter rockgas if not a South Address\r\n const isRockGas = alerts.find(alert => alert.active.includes(\"rockgas-south\"));\r\n if (!this.props.isSouthIsland && isRockGas) {\r\n alerts = alerts.filter(alert => { \r\n return !(alert.active.find(item => item === \"rockgas-south\")); \r\n });\r\n }\r\n \r\n \r\n const isNorthIslandOnly = alerts.find(alert => alert.active.includes(\"north-only\"));\r\n if (!this.props.isSouthIsland && isNorthIslandOnly) {\r\n console.log(\"messaging > south-only\");\r\n alerts = alerts.filter(alert => { \r\n return !(alert.active.find(item => item === \"north-only\")); \r\n });\r\n }\r\n\r\n const isSouthIslandOnly = alerts.find(alert => alert.active.includes(\"south-only\"));\r\n if (this.props.isSouthIsland && isSouthIslandOnly) {\r\n console.log(\"messaging > south-only\");\r\n alerts = alerts.filter(alert => { \r\n return !(alert.active.find(item => item === \"south-only\")); \r\n });\r\n }\r\n\r\n //const isTou = alerts.find(alert => alert.active.includes(\"tou-message\"));\r\n //if (isTou) {\r\n // alerts = alerts.filter(alert => {\r\n // return !(alert.active.find(item => item === \"tou-message\"));\r\n // });\r\n //}\r\n\r\n return (\r\n
    \r\n {alerts.map(({ alert, active }, i) => (\r\n \r\n ))}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default compose(withPlansAndServicesProps(['activeAlerts']), withIsSouthIsland)(Messaging);\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, withHandlers } from 'recompose';\r\nimport WelcomeMsg from 'contact-join-poc';\r\nimport MainPage from 'contact-join-poc-address';\r\n\r\nconst MyDetails = ({ fields, username, goToHomePage }) => (\r\n
    \r\n

    MyDetails Component

    \r\n \r\n \r\n {}}\r\n style={{}}\r\n username={'test user'}\r\n goToHomePage={() => {}} />\r\n
    \r\n);\r\n\r\nexport default compose(\r\n withProps(() => ({\r\n username: 'test'\r\n })),\r\n withHandlers({\r\n goToHomePage: () => () => {\r\n console.log('go to home');\r\n }\r\n })\r\n)(MyDetails);\r\n","import { default as Carousel } from './Carousel';\r\nimport { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nconst CarouselPlans = withPlaceholder({\r\n placeholder: 'plans-placeholder',\r\n prop: 'placeholder'\r\n})(Carousel);\r\n\r\nexport default CarouselPlans;","import React, { Fragment } from 'react';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderNothing, withProps } from 'recompose';\r\n\r\nimport EnergyRates from '../EnergyRates';\r\nimport { default as CarouselPlans } from '../Common/CarouselPlans';\r\n\r\nimport { withExperienceEditor, withPlansAndServicesProps, withActions } from '../../enhancers';\r\nimport { doesPlanMeetRequirements } from '../../utils/plans-rules';\r\n\r\n\r\nconst PlanFilter = ({ items, rates, billCompare, filterIndex }) => (\r\n
    \r\n
    \r\n \r\n {items.map((rendering, index) => (\r\n \r\n ))}\r\n
    \r\n
    \r\n);\r\n\r\n\r\nclass PlanFilterItem extends React.Component {\r\n componentDidMount() {\r\n const { filterIndex, tabTitle, actions } = this.props;\r\n actions.setPlanFilterTabsTitle(filterIndex, tabTitle)\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n const { filterIndex, tabTitle, actions } = this.props;\r\n if (tabTitle !== prevProps.tabTitle) {\r\n actions.setPlanFilterTabsTitle(filterIndex, tabTitle)\r\n }\r\n }\r\n\r\n render() {\r\n const { rendering, isExperienceEditor, applyFilter, flat } = this.props;\r\n return (\r\n \r\n {isExperienceEditor || flat ? (\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\r\nPlanFilterItem = compose(\r\n withPlansAndServicesProps(['plansRules', 'selectedService']),\r\n withProps(({ rendering, selectedService, plansRules }) => {\r\n const applyFilter = (\r\n selectedService &&\r\n selectedService.length === 1 &&\r\n selectedService.includes('GAS')\r\n );\r\n let listedPlans = (\r\n (\r\n rendering &&\r\n rendering.placeholders &&\r\n rendering.placeholders['plans-placeholder'] &&\r\n rendering.placeholders['plans-placeholder']\r\n ) || []\r\n ).map(planCard => ({\r\n planId: (\r\n planCard.fields &&\r\n planCard.fields.ExistingPlan &&\r\n planCard.fields.ExistingPlan.fields &&\r\n planCard.fields.ExistingPlan.fields.ApiPlanId &&\r\n planCard.fields.ExistingPlan.fields.ApiPlanId.value\r\n ),\r\n title: (\r\n planCard.fields &&\r\n planCard.fields.ExistingPlan &&\r\n planCard.fields.ExistingPlan.fields &&\r\n planCard.fields.ExistingPlan.fields.Title &&\r\n planCard.fields.ExistingPlan.fields.Title.value\r\n ),\r\n }));\r\n if (applyFilter) {\r\n listedPlans = listedPlans\r\n .filter(({ planId }) => doesPlanMeetRequirements(plansRules, selectedService, planId));\r\n }\r\n const flat = listedPlans.length === 1;\r\n return {\r\n applyFilter,\r\n listedPlans,\r\n flat,\r\n tabTitle: flat ? (listedPlans[0].title + ' plan') : '',\r\n };\r\n }),\r\n branch(\r\n ({ listedPlans}) => !listedPlans.length,\r\n renderNothing\r\n ),\r\n withExperienceEditor,\r\n withActions,\r\n)(PlanFilterItem);\r\n\r\n\r\nexport default compose(\r\n branch(\r\n ({ items }) => !items || !items.length,\r\n renderNothing\r\n ),\r\n)(PlanFilter);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { withActions, withUIContextProps } from '../../enhancers';\r\nimport { withProps, compose, lifecycle } from 'recompose';\r\n\r\nconst propTypes = {\r\n item: PropTypes.shape({\r\n Id: PropTypes.object.isRequired,\r\n Label: PropTypes.object.isRequired,\r\n }).isRequired,\r\n filterIndex: PropTypes.number.isRequired,\r\n // We are passing the one from the TabContainer as this one\r\n // is updated with defaultActiveIndex\r\n activeFilter: PropTypes.number.isRequired,\r\n rendering: PropTypes.object.isRequired,\r\n hidden: PropTypes.bool,\r\n};\r\n\r\nconst PlanFilterTab = ({ item, title }) => (\r\n \r\n {title || (\r\n \r\n )}\r\n \r\n);\r\n\r\nPlanFilterTab.propTypes = propTypes;\r\n\r\nexport default compose(\r\n withUIContextProps(['planFilterTabsTitles']),\r\n withProps(({ filterIndex, planFilterTabsTitles }) => ({\r\n title: planFilterTabsTitles && planFilterTabsTitles[filterIndex],\r\n })),\r\n withActions,\r\n lifecycle({\r\n componentDidMount() {\r\n const { activeFilter, hidden, filterIndex, actions } = this.props;\r\n if (hidden && activeFilter === filterIndex) {\r\n actions.updatePlansAndServices({\r\n activeFilter: 0,\r\n });\r\n }\r\n },\r\n componentDidUpdate() {\r\n const { activeFilter, hidden, filterIndex, actions } = this.props;\r\n if (hidden && activeFilter === filterIndex) {\r\n actions.updatePlansAndServices({\r\n activeFilter: 0,\r\n });\r\n }\r\n }\r\n })\r\n)(PlanFilterTab);\r\n","import React, { Component } from 'react';\r\nimport { compose, withProps } from 'recompose';\r\nimport cx from 'classnames';\r\nimport Tab from '@material/react-tab';\r\nimport TabBar from '@material/react-tab-bar';\r\n\r\nimport { withActions, withPlansAndServicesProps } from '../../enhancers';\r\nimport { getListedFilters } from '../PlanFilter/utils';\r\nimport PlanFilterTab from './PlanFilterTab';\r\n\r\nclass TabContainer extends Component {\r\n componentDidMount(props) {\r\n try {\r\n // Do Analitics Call\r\n const plans = this.getActivePlans(this.props.activeFilter);\r\n this.props.actions.pushImpressionsToDatalayer(plans);\r\n } catch (error) {\r\n console.log('Analitics error', error);\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (this.props.activeFilter !== prevProps.activeFilter) {\r\n try {\r\n // Do Analitics Call\r\n const plans = this.getActivePlans(this.props.activeFilter);\r\n this.props.actions.pushImpressionsToDatalayer(plans);\r\n } catch (error) {\r\n console.log('Analitics error', error);\r\n }\r\n }\r\n }\r\n\r\n getActivePlans = index => {\r\n const plansForAnalitics = [];\r\n const children =\r\n this.props.children &&\r\n this.props.children.props &&\r\n this.props.children.props.items;\r\n const activeFilter =\r\n children && children.length ? children[index] : null;\r\n const activePlans = activeFilter\r\n ? activeFilter.placeholders &&\r\n activeFilter.placeholders['plans-placeholder']\r\n : [];\r\n\r\n if (activePlans && activePlans.length) {\r\n activePlans.forEach(plan => {\r\n const title =\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.fields &&\r\n plan.fields.ExistingPlan.fields.Title;\r\n const id =\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.fields &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId;\r\n plansForAnalitics.push({ plan: id && id.value, name: title && title.value });\r\n });\r\n }\r\n\r\n return plansForAnalitics;\r\n };\r\n\r\n setActiveFilter = activeIndex => {\r\n const { actions } = this.props;\r\n actions.updatePlansAndServices({\r\n activeFilter: activeIndex,\r\n });\r\n };\r\n\r\n getComponents = () => {\r\n if (this.props.placeholder) {\r\n return this.props.placeholder.map(item => {\r\n return item.props && item.props.fields;\r\n });\r\n }\r\n return [];\r\n };\r\n\r\n getRenderedChildren = filter => {\r\n // Apply specific filter\r\n if (this.props.specificFilter) {\r\n return this.props.specificFilter(\r\n React.Children.map(this.props.children, child =>\r\n React.cloneElement(child, { filterIndex: filter })\r\n ),\r\n filter\r\n );\r\n }\r\n // Apply common filter if specific not found\r\n if (this.props.children) {\r\n const children = React.Children.toArray(this.props.children);\r\n return React.Children.map(\r\n children[this.props.activeFilter],\r\n child => React.cloneElement(child, { filter })\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n render() {\r\n const { activeFilter, rendering } = this.props;\r\n const items = this.getComponents();\r\n return (\r\n
    \r\n \r\n {items.map((item, index) => {\r\n const hidden = getListedFilters(item, this.props).length === 0;\r\n const leftAligned = item && item.LeftAligned && item.LeftAligned.value;\r\n return (\r\n \r\n
    \r\n ))}\r\n \r\n );\r\n }\r\n}\r\n\r\nconst withDefaultActiveIndex = withProps(({ placeholder }) => {\r\n let index = 0;\r\n if (placeholder) {\r\n index = placeholder.findIndex(\r\n item =>\r\n item.props &&\r\n item.props.fields &&\r\n item.props.fields.DefaultSelected &&\r\n item.props.fields.DefaultSelected.value\r\n );\r\n index = parseInt(index);\r\n if (isNaN(index)) index = 0;\r\n if (index < 0) index = 0;\r\n }\r\n return {\r\n defaultActiveIndex: index,\r\n };\r\n});\r\n\r\nexport default compose(\r\n withDefaultActiveIndex,\r\n // We need those for getListedFilters\r\n withPlansAndServicesProps([\r\n 'plansRules',\r\n 'selectedService',\r\n 'activeFilter'\r\n ]),\r\n withProps(({ defaultActiveIndex, activeFilter }) => {\r\n let index = parseInt(activeFilter);\r\n if (isNaN(index) || index < 0) {\r\n index = defaultActiveIndex;\r\n }\r\n return {\r\n activeFilter: index,\r\n };\r\n }),\r\n withActions\r\n)(TabContainer);\r\n","import { doesPlanMeetRequirements } from '../../utils/plans-rules';\r\n\r\nexport function getListedFilters (item, { rendering, selectedService, plansRules }) {\r\n const applyFilter = (\r\n selectedService &&\r\n selectedService.length === 1 &&\r\n selectedService.includes('GAS')\r\n );\r\n let listedFilters = (\r\n rendering &&\r\n rendering.placeholders &&\r\n rendering.placeholders['plans-filter-placeholder']\r\n );\r\n listedFilters = listedFilters.filter(rendering => {\r\n const id = (\r\n rendering &&\r\n rendering.fields &&\r\n rendering.fields.Id &&\r\n rendering.fields.Id.value\r\n );\r\n return id === item.Id.value;\r\n });\r\n listedFilters = listedFilters.filter(rendering => {\r\n let listedPlans = (\r\n (\r\n rendering &&\r\n rendering.placeholders &&\r\n rendering.placeholders['plans-placeholder'] &&\r\n rendering.placeholders['plans-placeholder']\r\n ) || []\r\n ).map(planCard => ({\r\n planId: (\r\n planCard.fields &&\r\n planCard.fields.ExistingPlan &&\r\n planCard.fields.ExistingPlan.fields &&\r\n planCard.fields.ExistingPlan.fields.ApiPlanId &&\r\n planCard.fields.ExistingPlan.fields.ApiPlanId.value\r\n ),\r\n }));\r\n if (applyFilter) {\r\n listedPlans = listedPlans\r\n .filter(({ planId }) => doesPlanMeetRequirements(plansRules, selectedService, planId));\r\n }\r\n return listedPlans.length > 0;\r\n });\r\n return listedFilters;\r\n}","import TabContainer from './TabContainer';\r\nimport { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nexport default withPlaceholder({\r\n placeholder: 'plans-filter-placeholder',\r\n prop: 'placeholder'\r\n})(TabContainer);\r\n","import React, { Component, Fragment } from 'react';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Summer, Winter } from '../SVG';\r\nimport AddressPicker from '../AddressPicker';\r\nimport Modal from '../Common/Modal';\r\nimport { compose, branch, renderNothing } from 'recompose';\r\n\r\nimport { withBillCompare } from './enhancers';\r\nimport { withExperienceEditor } from '../../enhancers';\r\n\r\nclass BillCompareModal extends Component {\r\n state = {\r\n DisclaimerPopupShown: false,\r\n };\r\n\r\n toggleDisclaimerPopup = () => {\r\n if (\r\n this.props.content.BillCompareDisclaimerLinkContent &&\r\n this.props.content.BillCompareDisclaimerLinkContent.value\r\n ) {\r\n this.setState({\r\n DisclaimerPopupShown: !this.state.DisclaimerPopupShown,\r\n });\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n showBillCompareModal,\r\n toggleCompareBill,\r\n content,\r\n customer,\r\n isExperienceEditor,\r\n } = this.props;\r\n\r\n const { DisclaimerPopupShown } = this.state;\r\n\r\n return (\r\n \r\n \r\n
    \r\n \r\n\r\n {customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.SummerEstimate &&\r\n customer.PriceChecker.WinterEstimate ? (\r\n \r\n \r\n\r\n \r\n }\r\n rate={\r\n customer.PriceChecker.SummerEstimate\r\n }\r\n />\r\n }\r\n rate={\r\n customer.PriceChecker.WinterEstimate\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 )}\r\n
    \r\n toggleCompareBill()}\r\n >\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n {(isExperienceEditor ||\r\n (content.BillCompareDisclaimerLink &&\r\n content.BillCompareDisclaimerLink.value)) && (\r\n \r\n this.toggleDisclaimerPopup(\r\n content.BillCompareDisclaimerLinkContent\r\n )\r\n }\r\n >\r\n
    \r\n \r\n
    \r\n \r\n )}\r\n \r\n \r\n\r\n {DisclaimerPopupShown && (\r\n \r\n \r\n \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nconst Estimates = props => (\r\n
    {props.children}
    \r\n);\r\n\r\nconst Estimate = props => (\r\n
    \r\n
    \r\n
    {props.icon}
    \r\n
    \r\n
    {props.season}
    \r\n
    \r\n $\r\n {props.rate}\r\n
    \r\n
    \r\n
    \r\n
    \r\n);\r\n\r\nexport default compose(\r\n withBillCompare,\r\n withExperienceEditor,\r\n // do not render if not open\r\n branch(({ showBillCompareModal }) => !showBillCompareModal, renderNothing)\r\n)(BillCompareModal);\r\n","import React, { Component } from 'react';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose } from 'recompose';\r\nimport cx from 'classnames';\r\n\r\nimport { isFakePlanId } from '../../utils/plans-rules';\r\n\r\nimport { default as Header } from '../FormHeader';\r\nimport PlanFilterTabContainer from '../Common/PlanFilterTabContainer';\r\nimport { default as PlanFilter } from '../PlanFilter';\r\nimport BillCompareModal from '../BillCompare/BillCompareModal';\r\n\r\nimport {\r\n withReturningUser,\r\n withPlansAndServicesProps,\r\n withIsSouthIsland,\r\n withActions,\r\n withCustomer,\r\n withJourneyTypes\r\n} from '../../enhancers';\r\n\r\nclass PlansAndServices extends Component {\r\n componentDidMount() {\r\n const {\r\n returningUser,\r\n selectedPlan,\r\n selectedService,\r\n selectedBroadband,\r\n actions,\r\n } = this.props;\r\n\r\n actions.updatePlansAndServices({\r\n allServices: extractAllServices(this.props),\r\n });\r\n\r\n if (returningUser) {\r\n if (selectedPlan || selectedService) {\r\n let foundPlan = null;\r\n if (selectedPlan) {\r\n foundPlan = this.checkDefaultPlan(selectedPlan);\r\n }\r\n\r\n const resetBroadband =\r\n selectedService &&\r\n selectedService.length &&\r\n selectedService.indexOf('BB') > -1 &&\r\n !this.checkIfBBExists(selectedBroadband);\r\n\r\n let resetPlan = false;\r\n if (foundPlan && foundPlan.id) {\r\n actions.updatePlansAndServices({\r\n activeFilter: foundPlan.filter,\r\n selectedBroadband: resetBroadband\r\n ? null\r\n : selectedBroadband,\r\n });\r\n } else if (!isFakePlanId(selectedPlan)) {\r\n actions.updatePlansAndServices({\r\n selectedPlan: null,\r\n activeFilter: null,\r\n selectedBroadband: resetBroadband\r\n ? null\r\n : selectedBroadband,\r\n });\r\n resetPlan = true;\r\n }\r\n (async () => {\r\n if (resetPlan) {\r\n await actions.savePlan(null);\r\n }\r\n if (resetBroadband) {\r\n await actions.saveBB(null, null);\r\n }\r\n })();\r\n }\r\n } else {\r\n let defaultServices;\r\n defaultServices = this.checkDefaultServices();\r\n\r\n if (defaultServices) {\r\n actions.updatePlansAndServices({\r\n selectedService: defaultServices.services,\r\n selectedServiceName: defaultServices.names,\r\n });\r\n if (defaultServices && defaultServices.services) {\r\n actions.saveService(\r\n defaultServices.services,\r\n defaultServices.names\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState, snapshot) {\r\n const { selectedPlan, actions, address } = this.props;\r\n const isAddressChanged = prevProps.address !== address;\r\n const isPlanChanged = prevProps.selectedPlan !== selectedPlan;\r\n // update tab if plan or address has changed\r\n if (isPlanChanged || isAddressChanged) {\r\n const plan = this.checkDefaultPlan(selectedPlan);\r\n if (plan) {\r\n actions.updatePlansAndServices({\r\n activeFilter: plan.filter,\r\n });\r\n }\r\n }\r\n }\r\n\r\n checkIfBBExists = id => {\r\n if (id) {\r\n const container =\r\n this.props &&\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['broadband-placeholder'];\r\n if (container) {\r\n const options =\r\n container[0] &&\r\n container[0].placeholders &&\r\n container[0].placeholders['broadband-tiles-placeholder'];\r\n if (options) {\r\n const found = options.find(\r\n option =>\r\n id &&\r\n id ===\r\n (option.fields &&\r\n option.fields.BBExistingTile &&\r\n option.fields.BBExistingTile.fields &&\r\n option.fields.BBExistingTile.fields.ApiId &&\r\n option.fields.BBExistingTile.fields.ApiId\r\n .value)\r\n );\r\n if (found) {\r\n return id;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n checkDefaultPlan = planId => {\r\n let index = null;\r\n const filters = this.getPlanFilterItems();\r\n const foundPlan = filters\r\n .map(filter => {\r\n let plans =\r\n filter &&\r\n filter.placeholders &&\r\n filter.placeholders['plans-placeholder'];\r\n if (plans) {\r\n return (\r\n plans.find(plan => {\r\n const id =\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.fields &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId.value;\r\n return id && id === planId;\r\n }) || {}\r\n );\r\n }\r\n return {};\r\n })\r\n .filter((item, i) => {\r\n if (item.uid) {\r\n index = index ? index : i;\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (foundPlan && foundPlan[0]) {\r\n const plan = foundPlan[0];\r\n const thisId =\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.fields &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId &&\r\n plan.fields.ExistingPlan.fields.ApiPlanId.value;\r\n\r\n const thisItemId =\r\n plan.fields &&\r\n plan.fields.ExistingPlan &&\r\n plan.fields.ExistingPlan.id;\r\n // id: Plan Id (name), itemId: Plan Sitecore Instance Id, filter: first tab containing plan\r\n return {\r\n id: thisId,\r\n itemId: thisItemId,\r\n filter: index,\r\n };\r\n }\r\n return false;\r\n };\r\n\r\n checkDefaultServices = () => {\r\n let services =\r\n this.props &&\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['services-placeholder'];\r\n if (services) {\r\n services = services.filter(service => {\r\n if (service.fields) {\r\n return service.fields &&\r\n service.fields.AutoSelected &&\r\n service.fields.AutoSelected.value\r\n ? true\r\n : false;\r\n }\r\n return false;\r\n });\r\n }\r\n if (services) {\r\n const onDefault = [];\r\n const onDefaultName = [];\r\n services.forEach(service => {\r\n const ServiceId =\r\n service.fields && service.fields.ExistingService;\r\n const Label =\r\n service.fields &&\r\n service.fields.Title &&\r\n service.fields.Title.value\r\n ? service.fields.Title\r\n : service.fields.Label;\r\n if (ServiceId && ServiceId.value) {\r\n onDefault.push(ServiceId && ServiceId.value);\r\n onDefaultName.push(Label && Label.value);\r\n }\r\n });\r\n return {\r\n services: onDefault,\r\n names: onDefaultName,\r\n };\r\n }\r\n return null;\r\n };\r\n\r\n getPlanFilterItems = () => {\r\n if (\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['plans-filter-placeholder']\r\n ) {\r\n return this.props.rendering.placeholders[\r\n 'plans-filter-placeholder'\r\n ].filter(item => item.componentName === 'PlanFilter');\r\n }\r\n return null;\r\n };\r\n\r\n getEnergyRates = () => {\r\n if (\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['plans-filter-placeholder']\r\n ) {\r\n return this.props.rendering.placeholders[\r\n 'plans-filter-placeholder'\r\n ].filter(item => item.componentName === 'EnergyRates');\r\n }\r\n return null;\r\n };\r\n getBillCompare = () => {\r\n if (\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['plans-filter-placeholder']\r\n ) {\r\n return this.props.rendering.placeholders[\r\n 'plans-filter-placeholder'\r\n ].filter(item => item.componentName === 'BillCompare');\r\n }\r\n return null;\r\n };\r\n\r\n toggleFilterShown = (items, index) => {\r\n const children = React.Children.toArray(items);\r\n const generated = [];\r\n // Deep Cloning of Object except outfiltered items\r\n children.forEach(child => {\r\n const newChild = {};\r\n for (const key in child) {\r\n if (key) {\r\n if (key === 'props') {\r\n let props = child[key];\r\n const newProps = {};\r\n for (const innerKey in props) {\r\n if (innerKey) {\r\n if (innerKey === 'items') {\r\n let items = props[innerKey];\r\n newProps[innerKey] = [items[index]];\r\n } else {\r\n newProps[innerKey] = props[innerKey];\r\n }\r\n }\r\n }\r\n newChild[key] = newProps;\r\n } else {\r\n newChild[key] = child[key];\r\n }\r\n }\r\n }\r\n generated.push(newChild);\r\n });\r\n return generated;\r\n };\r\n\r\n render() {\r\n const { selectedService, isSouthIsland } = this.props;\r\n const serviceSectionHeader = this.props.fields.ServicesHeader;\r\n const planSectionHeader = this.props.fields.PlansHeader;\r\n const services =\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['services-placeholder'] &&\r\n this.props.rendering.placeholders['services-placeholder'].length;\r\n const planFilters =\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['plans-filter-placeholder'] &&\r\n this.props.rendering.placeholders['plans-filter-placeholder']\r\n .length;\r\n const broadband =\r\n this.props.rendering &&\r\n this.props.rendering.placeholders &&\r\n this.props.rendering.placeholders['broadband-placeholder'] &&\r\n this.props.rendering.placeholders['broadband-placeholder'].length;\r\n\r\n const broadbandSelected =\r\n selectedService &&\r\n selectedService.length &&\r\n selectedService.indexOf('BB') > -1;\r\n\r\n const planFilterItems = this.getPlanFilterItems();\r\n const energyRates = this.getEnergyRates();\r\n const billCompare = this.getBillCompare();\r\n const lpgOnly =\r\n selectedService &&\r\n selectedService.length &&\r\n selectedService.length === 1 &&\r\n selectedService.indexOf('LPG') > -1;\r\n const pipedGasOnly =\r\n selectedService &&\r\n selectedService.length &&\r\n selectedService.length === 1 &&\r\n selectedService.includes('GAS');\r\n\r\n return (\r\n \r\n {services ? (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n\r\n {planFilters && !lpgOnly && !(pipedGasOnly && isSouthIsland) ? (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {planFilterItems ? (\r\n \r\n ) : null}\r\n \r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n\r\n {broadband && broadbandSelected ? (\r\n \r\n ) : null}\r\n\r\n {billCompare && }\r\n \r\n );\r\n }\r\n}\r\n\r\nfunction extractAllServices({ rendering }) {\r\n let services =\r\n rendering &&\r\n rendering.placeholders &&\r\n rendering.placeholders['services-placeholder'];\r\n if (services) {\r\n return services.map(service => ({\r\n id:\r\n service.fields &&\r\n service.fields.ExistingService &&\r\n service.fields.ExistingService.value,\r\n name:\r\n (service.fields &&\r\n service.fields.Title &&\r\n service.fields.Title.value) ||\r\n (service.fields &&\r\n service.fields.Label &&\r\n service.fields.Label.value),\r\n }));\r\n }\r\n return [];\r\n}\r\n\r\nexport default compose(\r\n withJourneyTypes,\r\n withReturningUser,\r\n withPlansAndServicesProps([\r\n 'selectedService',\r\n 'selectedServiceName',\r\n 'selectedPlan',\r\n 'selectedBroadband',\r\n ]),\r\n withIsSouthIsland,\r\n withActions,\r\n withCustomer\r\n)(PlansAndServices);\r\n","import React, { useEffect } from 'react';\r\nimport {\r\n compose,\r\n withProps,\r\n branch,\r\n renderNothing,\r\n withHandlers,\r\n} from 'recompose';\r\nimport moment from 'moment';\r\n\r\nimport { withActions, withCustomerPromoCode, withSelectedPlan } from './index';\r\nimport { withPromoState } from '../enhancers';\r\n\r\nexport const SITECORE_DATE_TIME_FORMAT = 'YYYYMMDDTHHmmss';\r\n\r\n/**\r\n * HOC\r\n * Injects promoCode prop into a component\r\n * @param promoCodeFieldName {string} Mapped promo code field name.\r\n */\r\nexport const withPromoCode = promoCodeFieldName =>\r\n withProps(({ fields }) => ({\r\n promoCode:\r\n fields[promoCodeFieldName] &&\r\n fields[promoCodeFieldName].fields &&\r\n fields[promoCodeFieldName].fields.PromoCodeName &&\r\n fields[promoCodeFieldName].fields.PromoCodeName.value,\r\n }));\r\n\r\n/**\r\n * Takes sitecore date time string and parses it as moment.\r\n * @param dateTime {string}\r\n * @return {moment.Moment}\r\n */\r\nfunction parseSitecoreDateTime(dateTime) {\r\n return moment(dateTime, SITECORE_DATE_TIME_FORMAT);\r\n}\r\n\r\n/**\r\n * Returns true if specified date (moment) is between fromDate and toDate\r\n * (sitecore format) inclusive.\r\n * @param date {moment.Moment}\r\n * @param fromDate {string}\r\n * @param toDate {string}\r\n * @return {boolean}\r\n */\r\nfunction isDateBetween(date, fromDate, toDate) {\r\n return date.isBetween(\r\n parseSitecoreDateTime(fromDate),\r\n parseSitecoreDateTime(toDate),\r\n null,\r\n '[]'\r\n );\r\n}\r\n\r\n/**\r\n * HOC\r\n * Doesn't render the component if the promo code mapped is not valid\r\n * (e.g. expired).\r\n * @param promoCodeFieldName {string} Mapped promo code field name.\r\n */\r\nexport const withPromoCodeValidCheck = promoCodeFieldName =>\r\n compose(\r\n withProps(({ fields, FGFPromoCode }) => ({\r\n validFrom: FGFPromoCode\r\n ? FGFPromoCode.ValidFrom\r\n : fields[promoCodeFieldName] &&\r\n fields[promoCodeFieldName].fields &&\r\n fields[promoCodeFieldName].fields.ValidFrom &&\r\n fields[promoCodeFieldName].fields.ValidFrom.value,\r\n validTo: FGFPromoCode\r\n ? FGFPromoCode.ValidTo\r\n : fields[promoCodeFieldName] &&\r\n fields[promoCodeFieldName].fields &&\r\n fields[promoCodeFieldName].fields.ValidTo &&\r\n fields[promoCodeFieldName].fields.ValidTo.value,\r\n })),\r\n branch(\r\n ({ validFrom, validTo }) =>\r\n !isDateBetween(moment(), validFrom, validTo),\r\n renderNothing\r\n )\r\n );\r\n\r\n/**\r\n * HOC\r\n * Inject isPromoCodeRestricted prop into component if the promo code's restricted plan is selected.\r\n * Removes/restores promo code if needed: isPromoCodeRestorable prop should be set to true on entry\r\n */\r\nexport const withRestrictedPlansCheck = compose(\r\n withProps(() => ({\r\n // @todo bind this to sitecore content\r\n restrictedPlans: ['EXCLUDED'],\r\n })),\r\n withSelectedPlan,\r\n withCustomerPromoCode,\r\n withProps(({ selectedPlan, restrictedPlans }) => ({\r\n isPromoCodeRestricted:\r\n selectedPlan && restrictedPlans.includes(selectedPlan),\r\n })),\r\n withActions,\r\n Component => props => {\r\n useEffect(() => {\r\n if (props.isPromoCodeRestricted) {\r\n props.actions.removePromoCode();\r\n } else if (\r\n props.isPromoCodeRestorable &&\r\n !props.customerPromoCode\r\n ) {\r\n props.actions.restorePromoCode();\r\n }\r\n // eslint-disable-next-line\r\n }, [props.isPromoCodeRestricted, props.isPromoCodeRestorable]);\r\n\r\n return ;\r\n }\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects onClose event handler which will register the close goal from\r\n * sitecore content.\r\n */\r\nexport const withRegisterPromoCodeCloseGoal = compose(\r\n withProps(({ fields }) => ({\r\n closeGoalId: fields.CloseGoal && fields.CloseGoal.id,\r\n })),\r\n withActions,\r\n withHandlers({\r\n onClose: ({ closeGoalId, actions, onClose }) => e => {\r\n if (closeGoalId) {\r\n actions.registerGoal(closeGoalId).catch(() => {\r\n /* noop */\r\n });\r\n }\r\n if (onClose) {\r\n onClose(e);\r\n }\r\n },\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects onApply event handler which will register the Apply goal from\r\n * sitecore content.\r\n */\r\nexport const withRegisterPromoCodeApplyGoal = compose(\r\n withProps(({ fields }) => ({\r\n applyGoalId: fields.ApplyGoal && fields.ApplyGoal.id,\r\n })),\r\n withActions,\r\n withHandlers({\r\n onSavePromoCode: ({ applyGoalId, actions, onSavePromoCode }) => e => {\r\n if (applyGoalId) {\r\n actions.registerGoal(applyGoalId).catch(() => {\r\n /* noop */\r\n });\r\n }\r\n if (onSavePromoCode) {\r\n onSavePromoCode(e);\r\n }\r\n },\r\n })\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects onSavePromoCode event handler.\r\n * @param promoCodeFieldName {string} Mapped promo code field name.\r\n * @param wait {boolean} if true, wait until fulfilled and then call onSavePromoCode\r\n */\r\nexport const withSavePromoCode = (promoCodeFieldName, wait = false) =>\r\n compose(\r\n withPromoCode(promoCodeFieldName),\r\n withRegisterPromoCodeApplyGoal,\r\n withActions,\r\n withHandlers({\r\n onSavePromoCode: ({\r\n promoCode,\r\n actions,\r\n onSavePromoCode,\r\n }) => async e => {\r\n const promise = actions\r\n .validateAndSavePromoCode(promoCode)\r\n .catch(() => {\r\n /* */\r\n });\r\n if (wait) {\r\n await promise;\r\n }\r\n if (onSavePromoCode) {\r\n onSavePromoCode(e);\r\n }\r\n },\r\n })\r\n );\r\n\r\n/**\r\n * HOC\r\n * Injects dissmissed prop if Popup was closed or applied\r\n */\r\nexport const withApplyOrDissmissAction = compose(\r\n withPromoState,\r\n withActions,\r\n withHandlers({\r\n setDismissed: ({ promoDismissed, setDismissed, actions }) => e => {\r\n if (actions && actions.setPromoState && !promoDismissed) {\r\n actions.setPromoState(true);\r\n }\r\n if (setDismissed) {\r\n setDismissed(e);\r\n }\r\n },\r\n })\r\n);\r\n","import React, { Fragment, Component } from 'react';\r\nimport { default as Modal } from '../Common/Modal';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, withProps, lifecycle } from 'recompose';\r\nimport {\r\n withPromoCodeValidCheck,\r\n withRegisterPromoCodeCloseGoal,\r\n} from '../../enhancers/promo-code';\r\nimport {\r\n withActions,\r\n withCustomerPromoCode,\r\n withFGFPromoCode,\r\n} from '../../enhancers';\r\nimport { Close, WhiteTick } from '../SVG';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\n\r\nclass PromoCodeBanner extends Component {\r\n state = {\r\n isModalOpen: false,\r\n promoApplied: this.props.promoApplied || false,\r\n promoDismissed: false,\r\n applyingPromo: false,\r\n };\r\n\r\n componentWillReceiveProps(nextProps) {\r\n const oldState = this.props.promoApplied;\r\n const newState = nextProps.promoApplied;\r\n if (oldState !== newState) {\r\n if (this.state.promoApplied !== newState) {\r\n this.setState({\r\n promoApplied: newState,\r\n });\r\n }\r\n }\r\n }\r\n\r\n toggleTAC = () => {\r\n if (this.props.fields) {\r\n this.setState({\r\n isModalOpen: !this.state.isModalOpen,\r\n });\r\n }\r\n return null;\r\n };\r\n\r\n applyPromoCode = async () => {\r\n this.setState({\r\n applyingPromo: true,\r\n });\r\n const { fields, actions } = this.props;\r\n const promoCode =\r\n fields.MappedPromo &&\r\n fields.MappedPromo.fields &&\r\n fields.MappedPromo.fields.PromoCodeName &&\r\n fields.MappedPromo.fields.PromoCodeName.value;\r\n if (promoCode) {\r\n try {\r\n const applyGoalId =\r\n fields && fields.ApplyGoal && fields.ApplyGoal.id;\r\n if (applyGoalId) {\r\n actions.registerGoal(applyGoalId);\r\n }\r\n await actions.validateAndSavePromoCode(promoCode).then(\r\n data => {\r\n this.setState({\r\n promoApplied: true,\r\n applyingPromo: false,\r\n });\r\n },\r\n error => {\r\n // Set Error to input from message and trigger error\r\n this.setState({\r\n applyingPromo: false,\r\n });\r\n console.log('Promocode setting error ', error);\r\n }\r\n );\r\n } catch (error) {\r\n //console.log('Promocode setting error ', error);\r\n this.setState({\r\n applyingPromo: false,\r\n });\r\n }\r\n }\r\n };\r\n\r\n dismissPromoCode = () => {\r\n this.setState({\r\n promoDismissed: true,\r\n });\r\n };\r\n\r\n closeAndTrigger = () => {\r\n this.props.onClose();\r\n this.dismissPromoCode();\r\n };\r\n\r\n openPDF = () => {\r\n const { fields } = this.props;\r\n const link =\r\n fields &&\r\n fields.TermsAndConditionsPDF &&\r\n fields.TermsAndConditionsPDF.value &&\r\n fields.TermsAndConditionsPDF.value.href;\r\n if (link) {\r\n window && window.open(link);\r\n }\r\n };\r\n\r\n render() {\r\n const { fields, promoCodeText, FGFPromoCode } = this.props;\r\n const {\r\n isModalOpen,\r\n promoApplied,\r\n promoDismissed,\r\n applyingPromo,\r\n } = this.state;\r\n\r\n if (!fields || promoDismissed) {\r\n return null;\r\n }\r\n\r\n const background =\r\n fields &&\r\n fields.PromoBackground &&\r\n fields.PromoBackground.value &&\r\n fields.PromoBackground.value.src;\r\n\r\n const textColor =\r\n fields && fields.PromoTextColor && fields.PromoTextColor.value;\r\n\r\n return (\r\n \r\n \r\n {promoApplied ? (\r\n \r\n
    \r\n \r\n \r\n \r\n {FGFPromoCode && FGFPromoCode.Description ? (\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
    \r\n \r\n \r\n \r\n {applyingPromo ? (\r\n \r\n ) : null}\r\n
    \r\n \r\n\r\n \r\n \r\n \r\n {fields.NoPromoText &&\r\n fields.NoPromoText.value ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
    \r\n )}\r\n \r\n\r\n {isModalOpen ? (\r\n \r\n \r\n {fields.TermsAndConditionsPDF &&\r\n fields.TermsAndConditionsPDF.value &&\r\n fields.TermsAndConditionsPDF.value.href ? (\r\n
    \r\n \r\n
    \r\n ) : null}\r\n
    \r\n ) : null}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n/**\r\n * HOC\r\n * Checks if customer has already saved a promo code and if they have\r\n * do not render the component.\r\n */\r\nexport const withCustomerPromoCodeCheck = compose(\r\n withCustomerPromoCode,\r\n withFGFPromoCode,\r\n lifecycle({\r\n componentWillMount() {\r\n const FGFPromoCode = this.props.FGFPromoCode;\r\n const showStraight = this.props.showApplied;\r\n const appliedPromoCode = this.props.customerPromoCode\r\n ? this.props.customerPromoCode.toUpperCase()\r\n : null;\r\n const mappedPromoCode =\r\n this.props.fields &&\r\n this.props.fields.MappedPromo &&\r\n this.props.fields.MappedPromo.fields &&\r\n this.props.fields.MappedPromo.fields.PromoCodeName &&\r\n this.props.fields.MappedPromo.fields.PromoCodeName.value;\r\n this.setState({\r\n promoApplied: showStraight\r\n ? showStraight\r\n : FGFPromoCode\r\n ? true\r\n : appliedPromoCode &&\r\n mappedPromoCode &&\r\n appliedPromoCode === mappedPromoCode.toUpperCase(),\r\n });\r\n },\r\n\r\n componentWillReceiveProps(nextProps) {\r\n const appliedPromoCode = this.props.customerPromoCode;\r\n const updatedPromoCode = nextProps.customerPromoCode\r\n ? nextProps.customerPromoCode.toUpperCase()\r\n : null;\r\n if (appliedPromoCode !== updatedPromoCode) {\r\n const mappedPromoCode =\r\n this.props.fields &&\r\n this.props.fields.MappedPromo &&\r\n this.props.fields.MappedPromo.fields &&\r\n this.props.fields.MappedPromo.fields.PromoCodeName &&\r\n this.props.fields.MappedPromo.fields.PromoCodeName.value;\r\n this.setState({\r\n promoApplied:\r\n updatedPromoCode &&\r\n mappedPromoCode &&\r\n updatedPromoCode === mappedPromoCode.toUpperCase(),\r\n });\r\n }\r\n },\r\n })\r\n);\r\n\r\nconst withPromoCode = withProps(({ fields, FGFPromoCode }) => {\r\n const promoCode =\r\n fields.MappedPromo &&\r\n fields.MappedPromo.fields &&\r\n fields.MappedPromo.fields.PromoCodeName &&\r\n fields.MappedPromo.fields.PromoCodeName.value;\r\n const promoCodeText =\r\n (fields.ApplyPromoText && fields.ApplyPromoText.value) || '';\r\n return {\r\n promoCode: FGFPromoCode ? FGFPromoCode.Name : promoCode,\r\n promoCodeText: FGFPromoCode\r\n ? FGFPromoCode.Description\r\n : promoCode\r\n ? promoCodeText.replace(/%promocode%/gi, promoCode)\r\n : promoCodeText,\r\n };\r\n});\r\n\r\nexport default compose(\r\n withCustomerPromoCodeCheck,\r\n withPromoCodeValidCheck('MappedPromo'),\r\n withPromoCode,\r\n withActions,\r\n withRegisterPromoCodeCloseGoal\r\n)(PromoCodeBanner);\r\n","import { withProps } from 'recompose';\r\n\r\nexport const withBackgroundImage = withProps(({ fields }) => ({\r\n backgroundImage: (\r\n fields.BackgroundImage &&\r\n fields.BackgroundImage.value &&\r\n fields.BackgroundImage.value.src\r\n ),\r\n}));\r\n","import React from 'react';\r\nimport { Text, RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport Modal from '@material-ui/core/Modal';\r\nimport { compose, withProps } from 'recompose';\r\n\r\nimport { withExperienceEditor } from '../../enhancers';\r\nimport { withBackgroundImage } from './enhanders';\r\nimport {\r\n withPromoCode,\r\n withRegisterPromoCodeCloseGoal,\r\n withSavePromoCode,\r\n} from '../../enhancers/promo-code';\r\n\r\nimport classes from './Popup.module.scss';\r\n\r\nexport const Popup = props => {\r\n return (\r\n \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n {props.isExperienceEditor ? (\r\n \r\n ) : (\r\n {\r\n props.onApply(e);\r\n props.onSavePromoCode(e);\r\n }}\r\n >\r\n {props.promoButtonText}\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 * HOC\r\n * Injects promo code popup styles (background and color) as a prop.\r\n */\r\nexport const withStyles = compose(\r\n withBackgroundImage,\r\n withProps(({ fields, backgroundImage }) => ({\r\n styles: {\r\n backgroundImage: backgroundImage && `url(${backgroundImage})`,\r\n backgroundColor:\r\n fields.BackgroundColor && fields.BackgroundColor.value,\r\n color: fields.TextColor && fields.TextColor.value,\r\n },\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects promo code button text as a prop.\r\n */\r\nexport const withPromoCodeButton = compose(\r\n withPromoCode('MappedPromo'),\r\n withProps(({ fields, promoCode }) => ({\r\n promoButtonText: (\r\n (fields.PromoButtonText && fields.PromoButtonText.value) ||\r\n ''\r\n ).replace('%promoCode%', promoCode),\r\n }))\r\n);\r\n\r\nexport default compose(\r\n withPromoCodeButton,\r\n withExperienceEditor,\r\n withStyles,\r\n withRegisterPromoCodeCloseGoal,\r\n withSavePromoCode('MappedPromo')\r\n)(Popup);\r\n","import React, { useState, useEffect } from 'react';\r\nimport { compose, withProps, branch, renderNothing } from 'recompose';\r\n\r\nimport {\r\n withDevice,\r\n withDelayedProps,\r\n withIdleProps,\r\n withLeaveIntentionProps,\r\n} from '../../enhancers/common';\r\nimport { withCustomerPromoCode } from '../../enhancers';\r\nimport {\r\n withPromoCodeValidCheck,\r\n withApplyOrDissmissAction,\r\n} from '../../enhancers/promo-code';\r\n\r\nimport { withBackgroundImage } from './enhanders';\r\nimport Popup from './Popup';\r\nimport { default as PromoBanner } from '../PromoCodeBanner';\r\n\r\nconst defaultProps = {\r\n open: false,\r\n};\r\n\r\nexport const PromoPopup = props => {\r\n const [open, setOpen] = useState(props.open);\r\n const [applied, setApplied] = useState(props.applied);\r\n const { setDismissed, promoDismissed } = props;\r\n\r\n useEffect(() => {\r\n setOpen(props.open);\r\n setApplied(props.applied);\r\n }, [props.open, props.applied]);\r\n\r\n function onClose() {\r\n setOpen(false);\r\n setDismissed(true);\r\n }\r\n\r\n function onApply(e) {\r\n setApplied(true);\r\n setDismissed(true);\r\n }\r\n\r\n if (promoDismissed) {\r\n const isBannerAllowed =\r\n props.fields &&\r\n props.fields.ShowBannerOnAction &&\r\n props.fields.ShowBannerOnAction.value;\r\n const bannerProps =\r\n props && props.fields && props.fields.MappedPromoBanner;\r\n return isBannerAllowed ? (\r\n \r\n ) : null;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {/* Background image preload */}\r\n {props.backgroundImage && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nPromoPopup.defaultProps = defaultProps;\r\n\r\n/**\r\n * HOC\r\n * Checks if customer has already saved a promo code and if they have\r\n * do not render the component.\r\n */\r\nexport const withCustomerPromoCodeCheck = compose(\r\n withCustomerPromoCode,\r\n branch(\r\n ({ customerPromoCode, promoDismissed }) =>\r\n customerPromoCode &&\r\n !promoDismissed /* && process.env.NODE_ENV !== 'development'*/,\r\n renderNothing\r\n )\r\n);\r\n\r\n/**\r\n * HOC\r\n * Checks sitecore config for devices and doesn't render if the\r\n * popup should be hidden for current device.\r\n */\r\nexport const withDeviceCheck = compose(\r\n withProps(({ fields }) => ({\r\n desktopHide: fields.HideDesktop && fields.HideDesktop.value,\r\n tabletHide: fields.HideTablet && fields.HideTablet.value,\r\n mobileHide: fields.HideMobile && fields.HideMobile.value,\r\n })),\r\n branch(\r\n ({ device, ...props }) => device && props[`${device}Hide`],\r\n renderNothing\r\n )\r\n);\r\n\r\n/**\r\n * HOC\r\n * If \"TriggerOnLoad\" set in Sitecore\r\n * Injects open=\"true\" prop on load after {TriggerOnLoadDelay} seconds.\r\n */\r\nconst withShowOnLoad = compose(\r\n withProps(({ fields }) => ({\r\n triggerOnLoad: fields.TriggerOnLoad && fields.TriggerOnLoad.value,\r\n })),\r\n branch(\r\n ({ triggerOnLoad }) => Boolean(triggerOnLoad),\r\n compose(\r\n withProps(({ fields }) => ({\r\n delay:\r\n ((fields.TriggerOnLoadDelay &&\r\n fields.TriggerOnLoadDelay.value) ||\r\n 0) * 1000,\r\n })),\r\n withDelayedProps({ open: true })\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * Returns # of seconds to idle from sitecore content for specified device type.\r\n * @param fields\r\n * @param device {string}\r\n * @return {number}\r\n */\r\nfunction getTimeToIdleConfigForDevice(fields, device) {\r\n if (device === 'mobile') {\r\n return (\r\n (fields.TimeToIdleMobile && fields.TimeToIdleMobile.value) ||\r\n (fields.TimeToIdle && fields.TimeToIdle.value) ||\r\n 60\r\n );\r\n } else {\r\n return (fields.TimeToIdle && fields.TimeToIdle.value) || 60;\r\n }\r\n}\r\n\r\n/**\r\n * HOC\r\n * If \"TriggerOnIdle\" set in Sitecore\r\n * Injects open=\"true\" prop on load after {TimeToIdle} seconds.\r\n */\r\nconst withShowOnIdle = compose(\r\n withProps(({ fields }) => ({\r\n triggerOnIdle: fields.TriggerOnIdle && fields.TriggerOnIdle.value,\r\n })),\r\n branch(\r\n ({ triggerOnIdle }) => Boolean(triggerOnIdle),\r\n compose(\r\n withProps(({ fields, device }) => ({\r\n timeToIdle: getTimeToIdleConfigForDevice(fields, device),\r\n })),\r\n withIdleProps({ open: true })\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * HOC\r\n * If \"TriggerOnLeaveIntention\" set in Sitecore\r\n * Injects open=\"true\" prop if user mouse move on top bar.\r\n */\r\nconst withShowOnLeaveIntention = compose(\r\n withProps(({ fields }) => ({\r\n triggerOnLeaveIntention:\r\n fields.TriggerOnLeaveIntention &&\r\n fields.TriggerOnLeaveIntention.value,\r\n })),\r\n branch(\r\n ({ triggerOnLeaveIntention }) => Boolean(triggerOnLeaveIntention),\r\n withLeaveIntentionProps({ open: true })\r\n )\r\n);\r\n\r\nexport default compose(\r\n withPromoCodeValidCheck('MappedPromo'),\r\n // withRestrictedPlansCheck,\r\n withApplyOrDissmissAction,\r\n withCustomerPromoCodeCheck,\r\n withDevice([768, 1024]),\r\n withDeviceCheck,\r\n withShowOnLoad,\r\n withShowOnIdle,\r\n withShowOnLeaveIntention,\r\n withBackgroundImage\r\n)(PromoPopup);\r\n","import { compose, withProps, branch, renderNothing } from 'recompose';\r\nimport { default as Popup } from './PromoPopup';\r\n\r\n/**\r\n * HOC\r\n * Datasource null check\r\n */\r\nexport const withPromoCodeDatasource = compose(\r\n withProps(({ fields }) => ({\r\n datasourceSet: fields ? true : false,\r\n })),\r\n // don't render if no fields existed\r\n branch(({ datasourceSet }) => !datasourceSet, renderNothing)\r\n);\r\n\r\nexport default withPromoCodeDatasource(Popup);\r\n","import React, { Component } from 'react';\nimport Radio from '@material-ui/core//Radio';\nimport RadioGroup from '@material-ui/core//RadioGroup';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormLabel from '@material-ui/core/FormLabel';\nimport FormGroup from '@material-ui/core/FormGroup';\n\nconst RadioButtonGroup = ({ label, id, value, onChange }) => {\n const handleChange = (event) => {\n onChange(event.target.value);\n };\n\n return (\n \n \n }\n label={Yes}\n style={{ margin: \"16px\" }}\n />\n }\n label={No}\n style={{ margin: \"16px\" }}\n />\n \n \n );\n};\n\nexport default RadioButtonGroup;\n","import React, { useState } from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport RadioButtonGroup from '../FormFields/RadioButtonGroup';\r\nimport TextInput from '../FormFields/TextInput';\r\nimport { EMAIL_VALIDATION } from '../../constants';\r\nimport { compose } from 'recompose';\r\nimport {\r\n withExperienceEditor,\r\n withActions,\r\n withCustomer,\r\n} from '../../enhancers';\r\n\r\nconst EmailSection = props => {\r\n const {\r\n autocomplete,\r\n fields,\r\n isExperienceEditor,\r\n actions,\r\n existingEmail,\r\n customer,\r\n updateEmailAddressValue,\r\n setEmailValue,\r\n emailInput,\r\n errorMessage,\r\n } = props;\r\n\r\n\r\n const [radioValue, setRadioValue] = useState(undefined);\r\n\r\n const handleRadioButtonChange = (value) => {\r\n updateMarketingPermission(value);\r\n props.setMarketingPermissionValidationPassed(true); // Indicate that the marketing permissions radio button has a valid selection\r\n\r\n };\r\n\r\n\r\n const updateMarketingPermission = async (value) => {\r\n setRadioValue(value);\r\n try {\r\n await props.actions.toggleMarketingPermission(value === 'yes');\r\n } catch (err) {\r\n console.error('Error updating marketing permission:', err);\r\n }\r\n };\r\n\r\n const checkEmailOptionAction = (e, index, val) => {\r\n const options = document.getElementsByClassName('email-option');\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (e.which === 38 || e.keyCode === 38) {\r\n if (options && options[index - 1] && index > 0) {\r\n options[index - 1].focus();\r\n }\r\n if (index === 0) {\r\n const emailInputParent = document.getElementById('email-input');\r\n const emailInput = emailInputParent.getElementsByTagName(\r\n 'input'\r\n );\r\n emailInput[0].focus();\r\n }\r\n }\r\n if (e.which === 40 || e.keyCode === 40) {\r\n if (options && options[index + 1] && index < options.length - 1) {\r\n options[index + 1].focus();\r\n }\r\n }\r\n if (e.which === 13 || e.keyCode === 13) {\r\n setEmailValue(val);\r\n }\r\n };\r\n\r\n const slideToOptions = e => {\r\n if (autocomplete && autocomplete.length) {\r\n const options = document.getElementsByClassName('email-option');\r\n if (e.which === 40 || e.keyCode === 40) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (options && options.length) {\r\n options[0].focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n slideToOptions(evt)}\r\n ref={emailInput}\r\n required={true}\r\n pattern={EMAIL_VALIDATION}\r\n error={errorMessage}\r\n />\r\n {autocomplete && autocomplete.length ? (\r\n \r\n {autocomplete && autocomplete.length\r\n ? autocomplete.map((item, index) => {\r\n return (\r\n setEmailValue(item)}\r\n onKeyUp={evt =>\r\n checkEmailOptionAction(\r\n evt,\r\n index,\r\n item\r\n )\r\n }\r\n tabIndex=\"0\"\r\n >\r\n {item}\r\n
    \r\n );\r\n })\r\n : null}\r\n
    \r\n ) : null}\r\n \r\n\r\n {isExperienceEditor ||\r\n (fields.MarketingPermissionLabel &&\r\n fields.MarketingPermissionLabel.value) ? (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default compose(\r\n withExperienceEditor,\r\n withActions,\r\n withCustomer\r\n)(EmailSection);","import React, { useState, useEffect } from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, lifecycle } from 'recompose';\r\nimport Modal from '@material-ui/core/Modal';\r\nimport classes from './SaveForLater.module.scss';\r\nimport {\r\n withIsPopupOpenState,\r\n withActions,\r\n withCustomerExistingEmail,\r\n} from '../../enhancers';\r\nimport { Clock, Check, Exclamation } from '../SVG';\r\nimport { EMAIL_VALIDATION } from '../../constants';\r\nimport { default as EmailSection } from '../Summary/email-section';\r\n\r\nexport const SaveForLaterPopup = props => {\r\n\r\n const [open, setOpen] = useState(props.isPopupOpen);\r\n const [autocomplete, setAutocomplete] = useState([]);\r\n const [existingEmail, setExistingEmail] = useState();\r\n const [isValid, setisValid] = useState(false);\r\n const [emailError, setEmailError] = useState(\"\");\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n const [isFailedBefore, setIsFailedBefore] = useState(false);\r\n //const [isUserTypedsomething, setIsUserTypedsomething] = useState(false);\r\n const [isUserInteracted, setIsUserInteracted] = useState(false);\r\n //const [isFirstTime, setIsFirstTime] = useState(true);\r\n const [showErrorMessage, setShowErrorMessage] = useState(false);\r\n const [email, setEmail] = useState(\"\");\r\n const [mounted, setMounted] = useState(false);\r\n\r\n var emailInput = React.createRef();\r\n\r\n function init() {\r\n setisValid(false);\r\n setEmailError(\"\");\r\n setIsSaving(false);\r\n setIsSuccess(false);\r\n setIsFailedBefore(false);\r\n setIsUserInteracted(false);\r\n setShowErrorMessage(false);\r\n setEmail(\"\");\r\n }\r\n\r\n function onClose() {\r\n close();\r\n }\r\n\r\n function onCancel() {\r\n close();\r\n onCancelClicked();\r\n }\r\n\r\n function onDone() {\r\n close();\r\n onDoneClicked();\r\n }\r\n\r\n function close() {\r\n setOpen(false);\r\n props.actions.togglePopup(false);\r\n\r\n init();\r\n }\r\n\r\n function onDisabledSave() {\r\n setIsUserInteracted(true);\r\n }\r\n\r\n function updateEmailErrorMessage() {\r\n console.log(\"updateEmailErrorMessage.isUserInteracted=\", isUserInteracted);\r\n console.log(\"updateEmailErrorMessage.isValid=\", isValid);\r\n console.log(\"updateEmailErrorMessage.email=\", email);\r\n\r\n if (!isUserInteracted) {\r\n setEmailError(\"\");\r\n console.log(\"1 setEmailError('')\");\r\n return;\r\n }\r\n\r\n if (isValid) {\r\n setEmailError(\"\");\r\n console.log(\"2 setEmailError('')\");\r\n }\r\n else {\r\n //TODO: This should be contnent enabled\r\n if (email) {\r\n setEmailError(\"Please enter a valid email address\");\r\n console.log(\"3 setEmailError('not valid')\");\r\n }\r\n else {\r\n setEmailError(\"Email address is required*\");\r\n console.log(\"4 setEmailError('required')\");\r\n }\r\n }\r\n }\r\n\r\n function onSave() {\r\n save();\r\n onSaveClicked();\r\n }\r\n\r\n function onRetry() {\r\n save();\r\n onRetryClicked();\r\n }\r\n\r\n function save() {\r\n setIsUserInteracted(true);\r\n setIsSaving(true);\r\n\r\n updateEmailErrorMessage();\r\n\r\n const updatedData = {\r\n SaveForLaterEmail: email\r\n };\r\n\r\n props.actions.saveForLater(updatedData).then(success => {\r\n //Success\r\n console.log(\"Save Successeded\");\r\n setIsSaving(false);\r\n setIsSuccess(true);\r\n onSuccess(email);\r\n\r\n //////Test Fail\r\n //console.log(\"Save Failed\");\r\n //setIsSaving(false);\r\n //setIsSuccess(false);\r\n //setIsFailedBefore(true);\r\n //setShowErrorMessage(true);\r\n\r\n }, error => {\r\n //Fail\r\n console.log(\"Save Failed\");\r\n setIsSaving(false);\r\n setIsSuccess(false);\r\n setIsFailedBefore(true);\r\n setShowErrorMessage(true);\r\n onError();\r\n });\r\n }\r\n\r\n useEffect(() => {\r\n\r\n\r\n if (emailError && isValid) {\r\n setEmailError(\"\");\r\n }\r\n\r\n if (props.isPopupOpen && !open) //was closed and opened\r\n onPopupOpened();\r\n\r\n setOpen(props.isPopupOpen);\r\n\r\n console.log(\"props=\", props);\r\n //console.log(\"isValid=\", isValid);\r\n //console.log(\"isSaving=\", isSaving);\r\n //console.log(\"isSuccess=\", isSuccess);\r\n //console.log(\"isFailedBefore=\", isFailedBefore);\r\n //console.log(\"SaveForLaterPopup.useEffect() props.isPopupOpen=\", props.isPopupOpen)\r\n //console.log(\"emailError=\", emailError);\r\n updateEmailErrorMessage();\r\n\r\n if (open)\r\n setMounted(true);\r\n\r\n }, [props.isPopupOpen, isValid, isSaving, isSuccess, isFailedBefore, isUserInteracted, email]);\r\n\r\n var updateEmailValue = event => {\r\n const email = event.target.value;\r\n onEmailUpdated(email);\r\n };\r\n\r\n function onEmailUpdated(email) {\r\n const pattern = RegExp(EMAIL_VALIDATION);\r\n setisValid(pattern.test(email));\r\n\r\n setEmail(email);\r\n setIsSuccess(false);\r\n setShowErrorMessage(false);\r\n setIsUserInteracted(true);\r\n }\r\n\r\n //GOOGLE ANAYTICS \r\n function onPopupOpened() {\r\n\r\n setExistingEmail(props.existingEmail);\r\n setEmail(props.existingEmail);\r\n\r\n setEmail((emailvalue) => {\r\n onEmailUpdated(emailvalue);\r\n return emailvalue;\r\n });\r\n\r\n props.actions.pushToDataLayer({\r\n 'event': 'virtualPageview',\r\n 'virtualUrl': '/save-my-sign-up-for-later',\r\n 'virtualPageTitle': 'VPV-Save my sign up for later'\r\n });\r\n }\r\n\r\n function onSuccess(email) {\r\n props.actions.pushToDataLayer({\r\n 'event': 'save_signup_success',\r\n 'hashedEmail': props.actions.sha256(email)\r\n });\r\n }\r\n\r\n function onSaveClicked() {\r\n props.actions.pushToDataLayer({\r\n 'event': 'cta_click',\r\n 'cta_text': 'save'\r\n });\r\n }\r\n\r\n function onDoneClicked() {\r\n props.actions.pushToDataLayer({\r\n 'event': 'cta_click',\r\n 'cta_text': 'done'\r\n });\r\n }\r\n\r\n function onCancelClicked() {\r\n props.actions.pushToDataLayer({\r\n 'event': 'cta_click',\r\n 'cta_text': 'cancel'\r\n });\r\n }\r\n\r\n function onRetryClicked() {\r\n props.actions.pushToDataLayer({\r\n 'event': 'cta_click',\r\n 'cta_text': 'retry'\r\n });\r\n }\r\n\r\n function onError() {\r\n props.actions.pushToDataLayer({\r\n 'event': 'save_signup_error'\r\n });\r\n }\r\n\r\n return (\r\n \r\n
    \r\n x\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\r\n
    {emailError}
    \r\n\r\n \r\n \r\n
    \r\n {\r\n (isValid) ? : (isUserInteracted ? : null)\r\n }\r\n
    \r\n
    \r\n\r\n {(isSuccess && !isSaving) && (\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n )}\r\n\r\n {(showErrorMessage) && (\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 \r\n \r\n
    \r\n\r\n {(isSuccess) && (\r\n
    \r\n \r\n
    \r\n\r\n )}\r\n\r\n {(isFailedBefore && !isSuccess && !isSaving) && (\r\n
    \r\n \r\n
    \r\n\r\n )}\r\n\r\n {(isValid && !isSaving && !isSuccess && !isFailedBefore) && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {(isSaving && isFailedBefore) && (\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\r\n {(isSaving && !isFailedBefore) && (\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\r\n\r\n {(!isValid) && (\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};\r\n\r\nexport default compose(\r\n withIsPopupOpenState,\r\n withActions,\r\n withCustomerExistingEmail,\r\n)(SaveForLaterPopup);\r\n","import React from 'react';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose, branch, renderNothing } from 'recompose';\r\nimport cx from 'classnames';\r\n\r\nimport { withDevice } from '../../enhancers/common';\r\nimport { withReturningUser } from '../../enhancers';\r\n\r\nconst SegmentBanner = ({ device, fields, rendering }) => (\r\n \r\n \r\n \r\n);\r\n\r\nconst withHideReturningUser = branch(\r\n ({ returningUser, fields }) => (\r\n (\r\n returningUser &&\r\n fields.HideReturning &&\r\n fields.HideReturning.value\r\n ) || (\r\n fields.Hide &&\r\n fields.Hide.value\r\n )\r\n ),\r\n renderNothing,\r\n);\r\n\r\nexport default compose(\r\n withReturningUser,\r\n withHideReturningUser,\r\n withDevice([768, 1024]),\r\n)(SegmentBanner);\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport {\r\n compose,\r\n withProps,\r\n branch,\r\n renderNothing,\r\n withHandlers,\r\n mapProps,\r\n} from 'recompose';\r\n\r\nimport { default as CTA } from '../CTA';\r\n\r\nimport { withUIContextProps, withSelectedPlan, withActions } from '../../enhancers';\r\nimport { getImageFieldSrc, getFieldValue } from '../../utils';\r\n\r\nconst SegmentBannerTile = ({\r\n fields,\r\n bannerUrl,\r\n selected,\r\n onToggleLivingSituation,\r\n}) => (\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n);\r\n\r\nconst withGlobalState = compose(\r\n withUIContextProps(['livingSituationValue']),\r\n withSelectedPlan,\r\n mapProps(({ livingSituationValue, selectedPlan, ...props }) => ({\r\n ...props,\r\n globalSelectedPlan: selectedPlan,\r\n globalLivingSituationValue: livingSituationValue,\r\n }))\r\n);\r\n\r\nconst withSegmentBannerProps = withProps(({ fields, breakpoint }) => {\r\n const fieldName = {\r\n desktop: 'DesktopBg',\r\n tablet: 'TabletBg',\r\n mobile: 'MobileBg',\r\n };\r\n const secondary = getFieldValue(fields.UseSecondary);\r\n return {\r\n bannerUrl: (\r\n (secondary && getImageFieldSrc(fields[`Secondary${fieldName[breakpoint]}`])) ||\r\n getImageFieldSrc(fields[fieldName[breakpoint]])\r\n ),\r\n defaultPlanId: (\r\n fields.DefaultPlanId &&\r\n fields.DefaultPlanId.fields &&\r\n fields.DefaultPlanId.fields.ApiPlanId &&\r\n fields.DefaultPlanId.fields.ApiPlanId.value) || null,\r\n livingSituationValue: getFieldValue(fields.Title),\r\n usageType:\r\n getFieldValue(fields.UsageType) ||\r\n (fields.UsageType &&\r\n fields.UsageType.fields &&\r\n fields.UsageType.fields.ApiId &&\r\n fields.UsageType.fields.ApiId.value),\r\n autoExpandRates: getFieldValue(fields.AutoExpandRates),\r\n };\r\n});\r\n\r\nconst withSetLivingSituation = compose(\r\n withActions,\r\n withHandlers({\r\n onToggleLivingSituation: ({\r\n selected,\r\n defaultPlanId,\r\n livingSituationValue,\r\n usageType,\r\n autoExpandRates,\r\n globalSelectedPlan,\r\n actions,\r\n }) => () => {\r\n const newUsageType = selected ? 'S' : usageType;\r\n const ui = {\r\n livingSituationValue: selected ? null : livingSituationValue,\r\n expandRates: selected ? false : autoExpandRates,\r\n };\r\n // update global state\r\n actions.setLivingSituation(ui);\r\n\r\n // update and save plan if plan not selected\r\n if (defaultPlanId && !globalSelectedPlan) {\r\n actions.toggleSelectedPlan(defaultPlanId);\r\n }\r\n // save customer data with updated usage type to server\r\n actions.saveUsageType(newUsageType);\r\n },\r\n })\r\n);\r\n\r\nexport default compose(\r\n // Do not render if not setup in sitecore\r\n branch(({ breakpoint, fields }) => !breakpoint || !fields, renderNothing),\r\n // Inject global app state (living situation)\r\n // Note: withGlobalState must be injected before withSegmentBannerProps\r\n // as otherwise it would override the props\r\n withGlobalState,\r\n // Inject segment banner props (extracted from fields)\r\n withSegmentBannerProps,\r\n // Inject selected prop depending on global app state\r\n withProps(({ livingSituationValue, globalLivingSituationValue }) => ({\r\n selected: livingSituationValue === globalLivingSituationValue,\r\n })),\r\n // Inject toggle button event handler\r\n withSetLivingSituation\r\n)(SegmentBannerTile);\r\n","import React from 'react';\r\nimport { compose, withProps, withHandlers, lifecycle } from 'recompose';\r\n\r\nimport { withAvailableServices, withActions } from '../../enhancers';\r\n\r\nimport CTA from '../CTA';\r\n\r\nconst Service = ({ selected, disabled, fields, onToggleService }) => (\r\n \r\n \r\n \r\n);\r\n\r\n/**\r\n * HOC\r\n * Merges existing service fields with current service fields\r\n * into fields property.\r\n */\r\nconst withAllServiceFields = withProps(({ fields }) => ({\r\n fields: {\r\n ...fields,\r\n ...((fields && fields.ExistingService) || {}),\r\n },\r\n}));\r\n\r\n/**\r\n * HOC\r\n * Injects Service ID as a prop.\r\n */\r\nconst withServiceId = compose(\r\n withAllServiceFields,\r\n withProps(({ fields }) => ({\r\n serviceId: fields.ExistingService && fields.ExistingService.value,\r\n }))\r\n);\r\n\r\n/**\r\n * HOC\r\n * Injects toggle service event handler as a prop.\r\n */\r\nconst withToggleServiceHandler = withHandlers({\r\n onToggleService: ({ serviceId, actions }) => () => {\r\n actions.toggleSelectedService(serviceId);\r\n },\r\n});\r\n\r\nexport default compose(\r\n withActions,\r\n withAvailableServices,\r\n withServiceId,\r\n withToggleServiceHandler,\r\n withProps(({ availableServices, serviceId, selectedService }) => {\r\n const disabled =\r\n availableServices && !availableServices.includes(serviceId);\r\n return {\r\n selected: selectedService && selectedService.includes(serviceId),\r\n disabled,\r\n };\r\n }),\r\n lifecycle({\r\n // Untoggle service if it's unavailable (from address) & selected\r\n componentDidMount() {\r\n const { actions, selected, disabled, serviceId } = this.props;\r\n if (disabled && selected) {\r\n actions.toggleSelectedService(serviceId);\r\n }\r\n actions.checkIfActionsComponentPresent();\r\n },\r\n componentDidUpdate() {\r\n const { actions, selected, disabled, serviceId } = this.props;\r\n if (disabled && selected) {\r\n actions.toggleSelectedService(serviceId);\r\n }\r\n },\r\n })\r\n)(Service);\r\n","import { from, of, Subject } from 'rxjs';\r\nimport {\r\n catchError,\r\n map,\r\n scan,\r\n switchMap,\r\n withLatestFrom,\r\n first,\r\n startWith,\r\n debounceTime,\r\n pairwise,\r\n} from 'rxjs/operators';\r\nimport axios from 'axios';\r\nimport mergeWith from 'lodash.mergewith';\r\n\r\nfunction postData(url, data, cancelToken) {\r\n return axios\r\n .post(url, data, { cancelToken })\r\n .then(response => response.data);\r\n}\r\n\r\nfunction createRequestQueue(url) {\r\n let subject = new Subject();\r\n let resolvers = [];\r\n let rejectors = [];\r\n\r\n const data$ = subject.asObservable().pipe(\r\n scan((acc, data) => {\r\n function customizer(objValue, srcValue) {\r\n // do not merge arrays but override them instead\r\n if (Array.isArray(objValue)) {\r\n return srcValue;\r\n }\r\n }\r\n return mergeWith(acc, data, customizer);\r\n }, {}),\r\n debounceTime(200)\r\n );\r\n\r\n const source$ = data$.pipe(map(() => axios.CancelToken.source()));\r\n\r\n data$\r\n .pipe(\r\n withLatestFrom(source$),\r\n startWith([null, null]),\r\n pairwise(),\r\n switchMap(([[_, prevSource], [data, source]]) => {\r\n if (prevSource) {\r\n prevSource.cancel();\r\n }\r\n return from(postData(url, data, source.token)).pipe(\r\n map(data => [null, data]),\r\n catchError(err => of([err]))\r\n );\r\n }),\r\n first()\r\n )\r\n .subscribe({\r\n next: ([error, data]) => {\r\n if (error) {\r\n rejectors.forEach(reject => {\r\n reject(error);\r\n });\r\n } else {\r\n resolvers.forEach(resolve => {\r\n resolve(data);\r\n });\r\n }\r\n },\r\n });\r\n\r\n function addResolvers(resolve, reject) {\r\n resolvers = [...resolvers, resolve];\r\n rejectors = [...rejectors, reject];\r\n }\r\n\r\n return {\r\n next(value) {\r\n subject.next(value);\r\n },\r\n promise() {\r\n return new Promise((resolve, reject) => {\r\n addResolvers(resolve, reject);\r\n });\r\n },\r\n };\r\n}\r\n\r\nfunction request(url) {\r\n let requestQueue = null;\r\n\r\n return async (data, initialData) => {\r\n if (!requestQueue) {\r\n requestQueue = createRequestQueue(url);\r\n if (initialData) {\r\n requestQueue.next(initialData);\r\n }\r\n }\r\n\r\n requestQueue.next(data);\r\n\r\n return requestQueue\r\n .promise()\r\n .then(data => {\r\n requestQueue = null;\r\n return data;\r\n })\r\n .catch(error => {\r\n requestQueue = null;\r\n throw error;\r\n });\r\n };\r\n}\r\n\r\nconst customerJourneyRequest = request('/customerjourney/save');\r\nconst saveForLaterRequest = request('/customerjourney/saveforlater');\r\n\r\nexport function saveCustomerJourney(customer, data) {\r\n return customerJourneyRequest(data, customer);\r\n}\r\n\r\nexport function saveForLater(customer, data) {\r\n return saveForLaterRequest(data, customer);\r\n}","import axios from 'axios/index';\r\n\r\nexport { saveCustomerJourney } from './customer';\r\n\r\nexport { saveForLater } from './customer';\r\n\r\nexport async function registerHotLeads() {\r\n return axios.post(`/forms/cartabandonmentdata`).then(response => response.data);\r\n}\r\n\r\nexport async function saveField(fieldToSave) {\r\n return axios.post(`/forms/savefield`, fieldToSave).then(response => response);\r\n}\r\n\r\nexport async function getField(fieldName) {\r\n return axios.get(`/forms/getfield?fieldName=${fieldName}`)\r\n .then(response => response.data);\r\n}\r\n\r\nexport async function validatePromocode(code) {\r\n return axios.get(`/contact/forms/validatepromocode?promocode=${code}`).then(response => response.data);\r\n}\r\n\r\nexport async function searchAddress(address) {\r\n let search = address;\r\n search = search.replace('/', ' ');\r\n search = search.replace('.', ' ');\r\n return axios.get(`/api/address/` + search).then(response => response.data);\r\n}\r\n\r\nexport async function getCustomerJourney(saveForLaterID, urlPromocode) {\r\n // For IE11 added timestamp as workaround for caching issues\r\n const timestamp = new Date().getTime();\r\n\r\n var url = `/customerjourney?t=${timestamp}`;\r\n\r\n if (saveForLaterID)\r\n url += `&saveforlaterid=${saveForLaterID}`;\r\n if (urlPromocode)\r\n url += `&promocode=${urlPromocode}`;\r\n\r\n console.log(\"getCustomerJourney url=\", url);\r\n\r\n return axios\r\n .get(url)\r\n .then(response => response.data);\r\n}\r\n\r\nexport async function createStateApiSession(customer) {\r\n return axios\r\n .post('/createsessionstate/', customer)\r\n .then(response => response.data)\r\n .then(data => {\r\n if (!data.IsSuccessful || !data.SessionId) {\r\n throw new Error('Error while creating a session');\r\n }\r\n return data;\r\n })\r\n .then(data => data.SessionId);\r\n}\r\n\r\nexport async function registerGoal(goalId) {\r\n return axios.post('/analytics/registergoal', { goalId });\r\n}\r\n","import React from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport { default as InfoTip } from '../ToolTip/infoTip';\r\n\r\nexport const Summaries = props => {\r\n return
    {props.children}
    ;\r\n};\r\n\r\nexport const SummarySection = props => {\r\n return
    {props.children}
    ;\r\n};\r\n\r\nexport const Disclaimer = props => {\r\n return
    {props.children}
    ;\r\n};\r\n\r\nexport const Details = props =>
    {props.children}
    ;\r\n\r\nexport const Detail = props => (\r\n
    \r\n
    {props.title}
    \r\n {props.rateDescription ?
    {props.rateDescription}
    : props.data &&
    {props.data}
    }\r\n
    \r\n);\r\n\r\nexport const Heading = props => {\r\n return ;\r\n};\r\n\r\nexport const Title = props => {\r\n if (!props.title || !props.icon) return null;\r\n\r\n return (\r\n
    \r\n {props.icon}\r\n

    \r\n {props.title} {props.subtitle && {props.subtitle}}\r\n

    \r\n
    \r\n );\r\n};\r\n\r\nexport const Switch = props => {\r\n return (\r\n
    \r\n {props.usageType === 'S' ? (\r\n
    \r\n We think you are a standard user.\r\n props.toggleType()}>\r\n Switch to low user\r\n \r\n
    \r\n ) : (\r\n
    \r\n We think you are a low user.\r\n props.toggleType()}>\r\n Switch to standard user\r\n \r\n
    \r\n )}\r\n \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { compose } from 'recompose';\r\nimport { withCustomer } from '../../enhancers';\r\nimport { SummarySection, Details, Detail, Heading, Title } from './particles';\r\nimport { Card } from '../SVG';\r\n\r\nconst PlanSection = props => {\r\n const { fields, customer } = props;\r\n const cart =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.CartInformation;\r\n const plan =\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.Plan;\r\n const discounts = cart && cart.Discounts;\r\n const extras = cart && cart.Extras;\r\n\r\n return (\r\n \r\n \r\n } />\r\n {plan.ApiPlan.Name !== 'Basic' && discounts && (\r\n <Details>\r\n {extras &&\r\n extras.map((extra, index) => (\r\n <Detail key={index} title={extra} />\r\n ))}\r\n\r\n {plan.ApiPlan.FormattedFixedEndDate &&\r\n plan.ApiPlan.FormattedFixedEndDate !== 'None' && (\r\n <Detail\r\n title={`Fixed rates till ${plan.ApiPlan.FormattedFixedEndDate}`}\r\n />\r\n )}\r\n\r\n {plan.ApiPlan.FormattedFixedEndDate &&\r\n plan.ApiPlan.FormattedFixedEndDate === 'None' && (\r\n <Detail\r\n title={`No fixed term / No break-up fees`}\r\n />\r\n )}\r\n\r\n {discounts &&\r\n discounts.map((discount, index) => (\r\n <Detail key={index} title={discount.DisplayText} />\r\n ))}\r\n </Details>\r\n )}\r\n </SummarySection>\r\n );\r\n};\r\n\r\nexport default compose(withCustomer)(PlanSection);\r\n","import React, { Fragment } from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport TextInput from '../FormFields/TextInput';\r\nimport { compose } from 'recompose';\r\nimport {\r\n withExperienceEditor,\r\n withActions,\r\n withSaving,\r\n withCustomer\r\n} from '../../enhancers';\r\nimport { withRestrictedPlansCheck } from '../../enhancers/promo-code';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\nimport { default as CTAButton } from '../CTA/CTAButton';\r\nimport WhiteTick from '../SVG/WhiteTick.svg';\r\n\r\nconst PromoCodeSection = props => {\r\n const {\r\n isExperienceEditor,\r\n isPromoCodeRestricted,\r\n fields,\r\n customer,\r\n checkingPromocode,\r\n promocodeError,\r\n promocodeMsg,\r\n promocodeSet,\r\n promocodeRemoved,\r\n promoRemovedWithRules,\r\n isFGFPromo,\r\n FGFRestricted,\r\n promoRemovedWithPlan,\r\n promoRemovedWithServices,\r\n promoOnMount,\r\n updatePromocodeValue,\r\n promocodeInput,\r\n checkPromocode,\r\n isSaving,\r\n } = props;\r\n\r\n const promocodeCartMsg =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.CartInformation &&\r\n customer.PriceChecker.CartInformation.PromoCode &&\r\n customer.PriceChecker.CartInformation.PromoCode.Description;\r\n\r\n\r\n const promoSet = promocodeSet && promocodeSet.length ? true : false;\r\n const existingPromo =\r\n (customer && customer.Discounts && customer.Discounts.PromoCode) || '';\r\n\r\n //console.log(\"PromoSection > button1=\", ((promocodeError || promocodeRemoved) && !promoSet),\r\n // \" button2=\", (!(promocodeError || promocodeRemoved) && promoSet),\r\n // \" button3=\", (!(promocodeError || promocodeRemoved) && !promoSet && (isSaving || checkingPromocode)), \r\n // \" button4=\", (!(promocodeError || promocodeRemoved) && !promoSet && !(isSaving || checkingPromocode)),\r\n // \" (isSaving || checkingPromocode) =\", (isSaving || checkingPromocode) , \"isSaving=\",isSaving,\"checkingPromocode=\",checkingPromocode\r\n //);\r\n\r\n return (\r\n <Fragment>\r\n {(isExperienceEditor ||\r\n (fields.PromocodeLabel && fields.PromocodeLabel.value)) && (\r\n <div className=\"wrapper\">\r\n <div className=\"promocode\">\r\n <div className=\"title\">\r\n <Text field={fields.PromocodeLabel} />\r\n </div>\r\n {!promocodeError &&\r\n !(\r\n promoRemovedWithServices ||\r\n promoRemovedWithRules ||\r\n isPromoCodeRestricted ||\r\n promoRemovedWithPlan\r\n ) &&\r\n (promocodeMsg ||\r\n (promocodeSet && promocodeCartMsg)) && (\r\n <div className=\"promo-description\">\r\n {promocodeMsg\r\n ? promocodeMsg\r\n : promocodeCartMsg}\r\n </div>\r\n )}\r\n\r\n {(promocodeError || promocodeRemoved) && (\r\n <div className=\"promo-description error\">\r\n {((isPromoCodeRestricted && promoOnMount) ||\r\n promoRemovedWithPlan) &&\r\n fields.PromocodeRemovedMsgByPlan &&\r\n fields.PromocodeRemovedMsgByPlan.value && (\r\n <RichText\r\n field={\r\n fields.PromocodeRemovedMsgByPlan\r\n }\r\n />\r\n )}\r\n\r\n {promocodeRemoved &&\r\n promoRemovedWithServices &&\r\n fields.PromocodeRemovedMsgByService &&\r\n fields.PromocodeRemovedMsgByService\r\n .value && (\r\n <RichText\r\n field={\r\n fields.PromocodeRemovedMsgByService\r\n }\r\n />\r\n )}\r\n\r\n {promocodeRemoved &&\r\n promoRemovedWithRules &&\r\n (isFGFPromo ||\r\n FGFRestricted ||\r\n (fields.PromocodeRemovedMsgByType &&\r\n fields.PromocodeRemovedMsgByType\r\n .value)) && (\r\n <RichText\r\n field={\r\n isFGFPromo || FGFRestricted\r\n ? {\r\n value:\r\n 'Sorry, promo code does not apply to move, add or change journeys',\r\n }\r\n : fields.PromocodeRemovedMsgByType\r\n }\r\n />\r\n )}\r\n\r\n {promocodeError && promocodeMsg}\r\n </div>\r\n )}\r\n\r\n <div className=\"promocode-field-holder\">\r\n <TextInput\r\n id=\"promocode-input\"\r\n title=\"Promo code\"\r\n existingValue={existingPromo}\r\n updateValue={updatePromocodeValue}\r\n ref={promocodeInput}\r\n readOnly={false}\r\n error={''}\r\n />\r\n <div className=\"check-promocode-button-holder\">\r\n {(promocodeError || promocodeRemoved) && \r\n !promoSet && (\r\n <CTAButton\r\n className=\"check-promocode-button\"\r\n onClick={void 0}\r\n Label={fields.PromocodeButtonLabel}\r\n disabled={true}\r\n Color={{ value: '#fff' }}\r\n BackgroundColor={{value: '#303030',}}\r\n />\r\n )}\r\n\r\n {!(promocodeError || promocodeRemoved) &&\r\n promoSet && (\r\n <CTAButton\r\n className=\"check-promocode-button\"\r\n onClick={checkPromocode}\r\n Icon={{ value: { src: WhiteTick }, }}\r\n Label={{ value: 'Applied' }}\r\n disabled={true}\r\n Color={{ value: '#fff' }}\r\n BackgroundColor={{ value: '#6e0d83', }}\r\n />\r\n )}\r\n\r\n {!(promocodeError || promocodeRemoved) &&\r\n !promoSet && (isSaving || checkingPromocode) && (\r\n <CTAButton\r\n className=\"check-promocode-button\"\r\n onClick={checkPromocode}\r\n Label={fields.PromocodeButtonLabel}\r\n disabled={true}\r\n Color={{ value: '#6e0d83' }}\r\n BackgroundColor={{ value: 'transparent',}}\r\n HoverLabel={{ value: 'Validate', }}\r\n HoverColor={{ value: '#fff' }}\r\n HoverBackgroundColor={{ value: '#6e0d83', }}\r\n />\r\n )}\r\n\r\n {!(promocodeError || promocodeRemoved) &&\r\n !promoSet && !(isSaving || checkingPromocode) && (\r\n <CTAButton\r\n className=\"check-promocode-button\"\r\n onClick={checkPromocode}\r\n Label={fields.PromocodeButtonLabel}\r\n disabled={false}\r\n Color={{ value: '#6e0d83' }}\r\n BackgroundColor={{ value: 'transparent', }}\r\n HoverLabel={{ value: 'Validate', }}\r\n HoverColor={{ value: '#fff' }}\r\n HoverBackgroundColor={{ value: '#6e0d83', }}\r\n />\r\n )}\r\n\r\n {checkingPromocode ? (\r\n <LoadingOverlay color=\"#6e0d83\" bgColor=\"rgba(110, 13, 131, 0.5)\" />\r\n ) : null}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {(isExperienceEditor ||\r\n (fields &&\r\n fields.PromocodeDisclaimer &&\r\n fields.PromocodeDisclaimer.value)) && (\r\n <div className=\"promo-disclaimer\">\r\n <RichText field={fields.PromocodeDisclaimer} />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Fragment>\r\n );\r\n};\r\n\r\nexport default compose(\r\n withExperienceEditor,\r\n withActions,\r\n withSaving,\r\n withRestrictedPlansCheck,\r\n withCustomer \r\n)(PromoCodeSection);\r\n","import React, { Fragment, Component } from 'react';\r\nimport { Text } from '@sitecore-jss/sitecore-jss-react';\r\nimport ToggleDetailsButton from '../Common/ToggleDetailsButton';\r\nimport LoadingOverlay from '../Common/LoadingOverlay';\r\nimport { Details, Detail, Title, Switch } from './particles';\r\n\r\nclass CollapsibleRateSection extends Component {\r\n state = {\r\n collapsed:\r\n this.props.collapsible &&\r\n !(\r\n this.props.fields &&\r\n this.props.fields.RatesOpenByDefault &&\r\n this.props.fields.RatesOpenByDefault.value\r\n ),\r\n };\r\n\r\n toggleState = () => {\r\n this.setState({\r\n collapsed: !this.state.collapsed,\r\n });\r\n };\r\n\r\n render() {\r\n const {\r\n serviceTitle,\r\n serviceSubTitle,\r\n serviceIcon,\r\n currentRate,\r\n fields,\r\n toggleType,\r\n usageType,\r\n selectedPlan,\r\n switchingUsageType,\r\n rateErrorMSG,\r\n rate,\r\n collapsible,\r\n } = this.props;\r\n\r\n const { collapsed } = this.state;\r\n\r\n return (\r\n <Fragment>\r\n <div className=\"section-header\">\r\n <Title\r\n title={serviceTitle}\r\n subtitle={serviceSubTitle}\r\n icon={serviceIcon}\r\n />\r\n {collapsible && (\r\n <ToggleDetailsButton\r\n toggle={this.toggleState}\r\n expanded={!collapsed}\r\n collapsedLabel={\r\n <Text field={fields.RatesOpenLabel} />\r\n }\r\n expandedLabel={\r\n <Text field={fields.RatesCloseLabel} />\r\n }\r\n className={'toggleRates'}\r\n />\r\n )}\r\n </div>\r\n <div\r\n className={\r\n 'section-expander ' +\r\n (collapsed ? 'slideUp' : 'slideDown')\r\n }\r\n >\r\n <Details>\r\n {currentRate &&\r\n currentRate.map((rate, index) => {\r\n return (\r\n <Detail\r\n key={index}\r\n title={rate.name}\r\n data={rate.rate}\r\n rateDescription={rate.rateDescription}\r\n />\r\n );\r\n })}\r\n {!currentRate.length && rateErrorMSG && (\r\n <div className=\"detail-rate-error\">\r\n <Text field={rateErrorMSG} />\r\n </div>\r\n )}\r\n {rate.type === 'ELEC' && selectedPlan !== 'BACH' && (\r\n <>\r\n <Switch\r\n toggleType={toggleType}\r\n usageType={usageType}\r\n fields={fields}\r\n />\r\n {switchingUsageType && <LoadingOverlay />}\r\n </>\r\n )}\r\n </Details>\r\n </div>\r\n </Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default CollapsibleRateSection;\r\n","import React from 'react';\r\nimport { compose } from 'recompose';\r\nimport { SummarySection, Heading } from './particles';\r\nimport { default as CollapsibleRateSection } from './collapsible';\r\nimport { Electricity, PipedGas, Broadband, BottledGas } from '../SVG';\r\nimport {\r\n withIsSouthIsland,\r\n withSelectedPlan,\r\n withCustomer,\r\n} from '../../enhancers';\r\n\r\nconst ServicesSection = props => {\r\n const {\r\n customer,\r\n fields,\r\n usageType,\r\n toggleType,\r\n isSouthIsland,\r\n selectedPlan,\r\n switchingUsageType,\r\n } = props;\r\n\r\n const cart =\r\n customer &&\r\n customer.PriceChecker &&\r\n customer.PriceChecker.CartInformation;\r\n\r\n const constructSplitRates = rates => {\r\n const rateArray = [];\r\n if (rates) {\r\n rates.forEach(service => {\r\n const type = service.Service;\r\n const rateSet = service.Rates;\r\n let modifiedLowRates = [];\r\n let modifiedStandardRates = [];\r\n if (rateSet) {\r\n rateSet.forEach(rate => {\r\n const rateToPush = {\r\n name: rate.Name,\r\n rate: rate.DisplayRate.concat(\r\n ' ',\r\n rate.Unit ? rate.Unit : ''\r\n ),\r\n powerType: rate.PowerType,\r\n priceType: rate.PriceType,\r\n rateDescription: rate.RateDescription,\r\n };\r\n if (\r\n rate.UserType &&\r\n rate.UserType.toLowerCase() === 'l'\r\n ) {\r\n modifiedLowRates.push(rateToPush);\r\n } else if (\r\n rate.UserType &&\r\n rate.UserType.toLowerCase(rateToPush) === 's'\r\n ) {\r\n modifiedStandardRates.push(rateToPush);\r\n } else {\r\n modifiedStandardRates.push(rateToPush);\r\n }\r\n });\r\n }\r\n\r\n rateArray.push({\r\n type: type,\r\n rates: modifiedLowRates.concat(modifiedStandardRates),\r\n lowRates: modifiedLowRates,\r\n standardRates: modifiedStandardRates,\r\n });\r\n });\r\n }\r\n return rateArray;\r\n };\r\n\r\n const IsRateInCartInformation = service => {\r\n const SelectedServices = cart.Services;\r\n const serviceToCheck =\r\n service === 'GAS' && IsLPGInCart() ? 'LPG' : service;\r\n let isActiveService = false;\r\n\r\n SelectedServices.forEach(element => {\r\n if (serviceToCheck.toUpperCase() === element.toUpperCase())\r\n isActiveService = true;\r\n });\r\n return isActiveService;\r\n };\r\n\r\n const IsLPGInCart = () => {\r\n const SelectedServices = cart.Services;\r\n let isLPGActive = false;\r\n\r\n SelectedServices.forEach(element => {\r\n if ('LPG' === element.toUpperCase()) isLPGActive = true;\r\n });\r\n return isLPGActive;\r\n };\r\n\r\n const rates =\r\n customer && customer.PriceChecker && customer.PriceChecker.ServiceRates;\r\n const finalRates = constructSplitRates(rates);\r\n\r\n return (\r\n <SummarySection>\r\n <Heading title={fields.ServicesAndRatesHeading} />\r\n {finalRates &&\r\n finalRates.map((rate, index) => {\r\n if (!IsRateInCartInformation(rate.type)) {\r\n return null;\r\n }\r\n\r\n let serviceIcon;\r\n let serviceTitle = '';\r\n let serviceSubTitle = '';\r\n let currentRate = [];\r\n let rateErrorMSG = '';\r\n if (rate.type === 'ELEC') {\r\n serviceTitle = 'Electricity';\r\n if (usageType === 'S') {\r\n serviceSubTitle = '(standard user)';\r\n currentRate = rate.standardRates;\r\n } else {\r\n serviceSubTitle = '(low user)';\r\n currentRate = rate.lowRates;\r\n }\r\n rateErrorMSG = fields.ElectricityErrorMessage;\r\n serviceIcon = <Electricity />;\r\n } else if (rate.type === 'BB') {\r\n const BroadbandId = customer.Property.BroadbandId;\r\n const BroadbandName =\r\n customer.Property.BroadbandFullName;\r\n const BBOptions =\r\n customer.PriceChecker.BroadbandOfferings.Offerings;\r\n\r\n serviceTitle = 'Broadband';\r\n serviceSubTitle = '(' + BroadbandName + ')';\r\n\r\n // Find Rate\r\n let newRate = {};\r\n BBOptions.forEach(option => {\r\n if (BroadbandId === option.Id) {\r\n newRate = {\r\n name: 'Price per month',\r\n rate: option.BundlePrice\r\n ? option.BundlePrice\r\n : option.OriginalPrice,\r\n };\r\n }\r\n });\r\n if (newRate.name) currentRate = [newRate];\r\n else currentRate = [];\r\n rateErrorMSG = fields.BroadbandErrorMessage;\r\n serviceIcon = <Broadband />;\r\n } else if (rate.type === 'GAS') {\r\n if (IsLPGInCart()) {\r\n serviceTitle = 'Bottled Gas';\r\n serviceIcon = <BottledGas />;\r\n\r\n currentRate = [\r\n {\r\n name: 'Delivery Service',\r\n },\r\n ];\r\n } else {\r\n serviceTitle = 'Piped Gas';\r\n currentRate = rate.rates;\r\n if (isSouthIsland) {\r\n currentRate = [\r\n {\r\n name: 'Reticulated LPG',\r\n },\r\n ];\r\n }\r\n rateErrorMSG = fields.PipedGasErrorMessage;\r\n serviceIcon = <PipedGas />;\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"sub-section\" key={index}>\r\n <CollapsibleRateSection\r\n serviceTitle={serviceTitle}\r\n serviceSubTitle={serviceSubTitle}\r\n serviceIcon={serviceIcon}\r\n currentRate={currentRate}\r\n fields={fields}\r\n toggleType={toggleType}\r\n usageType={usageType}\r\n selectedPlan={selectedPlan}\r\n switchingUsageType={switchingUsageType}\r\n rateErrorMSG={rateErrorMSG}\r\n rate={rate}\r\n collapsible={\r\n rate.type === 'ELEC' || rate.type === 'GAS'\r\n ? true\r\n : false\r\n }\r\n />\r\n </div>\r\n );\r\n })}\r\n </SummarySection>\r\n );\r\n};\r\n\r\nexport default compose(\r\n withIsSouthIsland,\r\n withCustomer,\r\n withSelectedPlan\r\n)(ServicesSection);\r\n","import React, { Fragment, Component } from 'react';\r\nimport { RichText } from '@sitecore-jss/sitecore-jss-react';\r\nimport { compose } from 'recompose';\r\nimport { House } from '../SVG';\r\nimport ContinueButton from '../ContinueButton';\r\nimport { withRouter } from 'react-router-dom';\r\nimport {\r\n withCustomer,\r\n withExperienceEditor,\r\n withIsSouthIsland,\r\n withUIContextProps,\r\n withSelectedService,\r\n withSelectedPlan,\r\n withCustomerPromoCode,\r\n withFGFPromoCode,\r\n withActions,\r\n withJourneyType,\r\n} from '../../enhancers';\r\n\r\nimport * as api from '../../utils/api';\r\nimport { EMAIL_VALIDATION } from '../../constants';\r\nimport {\r\n Summaries,\r\n SummarySection,\r\n Disclaimer,\r\n Heading,\r\n Title,\r\n} from './particles';\r\nimport { default as PlanSection } from './plan-section';\r\nimport { default as EmailSection } from './email-section';\r\nimport { default as PromoCodeSection } from './promo-section';\r\nimport { default as ServicesSection } from './services-section';\r\n\r\nclass Summary extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.pushToDataLayer = this.pushToDataLayer.bind(this);\r\n }\r\n\r\n state = {\r\n switchingUsageType: false,\r\n checkingPromocode: false,\r\n promocodeError: false,\r\n promocodeMsg: null,\r\n promocodeSet: null,\r\n promocodeRemoved: false,\r\n autocomplete: [],\r\n emailDomainsData:\r\n (this.props.fields &&\r\n this.props.fields.EmailAddressSuggestedDomains &&\r\n this.props.fields.EmailAddressSuggestedDomains.value) ||\r\n [],\r\n marketingPermissionValidationPassed: false, // New state property marketing permission - radio button selection validation \r\n };\r\n\r\n updateEmailTimer = null;\r\n\r\n emailInput = React.createRef();\r\n emailInputValue = '';\r\n\r\n promocodeInput = React.createRef();\r\n\r\n componentWillMount() {\r\n const customer = this.props.customer;\r\n const email =\r\n customer &&\r\n customer.Customer &&\r\n customer.Customer.CustomerInfo &&\r\n customer.Customer.CustomerInfo.EmailAddress;\r\n if (email) {\r\n this.emailInputValue = email;\r\n }\r\n\r\n this.promocodeInputValue =\r\n (this.props.customer &&\r\n this.props.customer.Discounts &&\r\n this.props.customer.Discounts.PromoCode) ||\r\n '';\r\n\r\n const services = this.props.selectedService;\r\n if (!services || !services.length) {\r\n const { history } = this.props;\r\n if (history && history.length > 3) {\r\n history.goBack();\r\n } else {\r\n const context =\r\n history &&\r\n history.location &&\r\n history.location.pathname &&\r\n history.location.pathname.includes('business')\r\n ? '/business'\r\n : '/residential';\r\n const pathMe = (\r\n window.location.origin +\r\n context +\r\n '/all-plans'\r\n ).toString();\r\n window.location.href = pathMe;\r\n }\r\n }\r\n\r\n // Initial Analytics call for Summary page\r\n this.props.actions.pushSummaryToDatalayer();\r\n\r\n const isLpgOnly = this.checkIfLpgOnly(services);\r\n const isPipedOnly = this.checkIfPipedOnly(services);\r\n const isRestrictedWithRules = this.checkIfJourneyRelatedPromoRestricted();\r\n const isCodeSet =\r\n !isLpgOnly && !isPipedOnly && !isRestrictedWithRules\r\n ? this.props.customerPromoCode\r\n : '';\r\n\r\n this.setState({\r\n isLpgOnly: isLpgOnly,\r\n isPipedOnly: isPipedOnly,\r\n promoRemovedWithRules: isRestrictedWithRules,\r\n promoOnMount: this.props.customerPromoCode || null,\r\n promocodeSet: isCodeSet,\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n const { customer, actions } = this.props;\r\n const sitecoreGAId = customer && customer.SitecoreContactId;\r\n if (!sitecoreGAId) {\r\n actions.setSitecoreGAId();\r\n }\r\n\r\n /* Check if Journey Type preset or not set and default to Join \r\n (which only should happen if user comes from PlanBuilder page without journey action buttons component - plain iJoin case)\r\n */\r\n\r\n const preset =\r\n customer &&\r\n customer.Confirmation &&\r\n customer.Confirmation.JourneyType;\r\n if (!preset || preset.trim() === '') {\r\n actions.setJourneyType({ id: 0, text: 'Join' });\r\n }\r\n\r\n // Remove Promo if Plan Restriction once on load\r\n const promo = this.props.customerPromoCode;\r\n if (promo) {\r\n try {\r\n actions.validateAndSavePromoCode(promo).then(\r\n data => {\r\n // const isPlanRestricted = this.checkIfPlanRestricted(\r\n // data.plans\r\n // );\r\n\r\n //SUPS-11 : Extending logic of Promo restriction based on Selected plan , Selected Service and Selected Journey\r\n const isPlanRestricted = (\r\n this.checkIfPlanRestricted(data.plans)\r\n || this.checkIfRestrictedBasedOnServiceSelected(data.requiredservices)\r\n || this.checkIfRestrictedBasedOnJourneySelected(data.allowedjourneys)\r\n );\r\n //SUPS-11:END\r\n\r\n if (isPlanRestricted) {\r\n this.props.actions.removePromoCode();\r\n this.setState({\r\n promoRemovedWithPlan: true,\r\n promoOnMount: promo,\r\n promocodeSet: '',\r\n promocodeRemoved: true,\r\n });\r\n }\r\n },\r\n error => { }\r\n );\r\n } catch (error) { }\r\n\r\n const status = 'valid';\r\n const reasons = [];\r\n if (this.state.isLpgOnly || this.state.isPipedOnly) {\r\n reasons.push('Service restricton');\r\n }\r\n if (this.state.promoRemovedWithRules) {\r\n reasons.push('Journey type restricton');\r\n }\r\n if (this.state.promoRemovedWithPlan) {\r\n reasons.push(`Plan restricton (${this.props.selectedPlan})`);\r\n }\r\n const reason = !this.state.promocodeRemoved\r\n ? null\r\n : reasons.join(', ');\r\n this.props.actions.pushPromoCodeToDatalayer(promo, status, reason);\r\n }\r\n }\r\n\r\n updateEmailAddressValue = event => {\r\n const email = event.target.value;\r\n this.emailInputValue = email;\r\n this.updateAutoComplete(email);\r\n };\r\n\r\n updateAutoComplete = email => {\r\n //const withAt = /[A-z0-9]*@/.test(email);\r\n const withAt = email && email.length > 0;\r\n if (withAt) {\r\n const { emailDomainsData } = this.state;\r\n if (emailDomainsData) {\r\n const afterAt = email.split('@')[1];\r\n const beforeAt = email.split('@')[0];\r\n const domains = emailDomainsData\r\n .split(',')\r\n .map(dom => dom.replace('@', ''));\r\n if (!afterAt) {\r\n this.setState({\r\n autocomplete: domains.map(dom =>\r\n beforeAt.concat('@', dom)\r\n ),\r\n });\r\n } else {\r\n const pattern = RegExp('^' + afterAt);\r\n const matchingDomains = domains.filter(dom =>\r\n pattern.test(dom)\r\n );\r\n this.setState({\r\n autocomplete: matchingDomains.map(dom =>\r\n beforeAt.concat('@', dom)\r\n ),\r\n });\r\n }\r\n }\r\n } else {\r\n if (this.state.autocomplete && this.state.autocomplete.length) {\r\n this.setState({\r\n autocomplete: [],\r\n });\r\n }\r\n }\r\n };\r\n\r\n setEmailValue = val => {\r\n const pattern = RegExp(EMAIL_VALIDATION);\r\n const isValid = pattern.test(val);\r\n this.emailInputValue = val;\r\n this.emailInput.current.setState({\r\n focused: true,\r\n value: val,\r\n error: isValid ? null : 'Please enter a valid email address',\r\n });\r\n this.setState({\r\n autocomplete: [],\r\n });\r\n };\r\n\r\n updatePromocodeValue = event => {\r\n const promo = event.target.value;\r\n if (\r\n (this.promocodeInputValue !== promo &&\r\n (this.state.promocodeError || this.state.promocodeRemoved)) ||\r\n (this.state.promocodeSet && this.state.promocodeSet !== promo)\r\n ) {\r\n this.setState({\r\n promocodeError: false,\r\n promocodeRemoved: false,\r\n promocodeSet: null,\r\n promocodeMsg: '',\r\n });\r\n }\r\n this.promocodeInputValue = promo;\r\n };\r\n\r\n onBeforeOpenPopup = async () => {\r\n await this.updateEmailAddress(this.emailInputValue);\r\n };\r\n\r\n setMarketingPermissionValidationPassed = (isValid) => {\r\n this.setState({ marketingPermissionValidationPassed: isValid });\r\n };\r\n\r\n onBeforeRedirect = async () => {\r\n console.log(\"Marketing Permissions Validation Passed:\", this.state.marketingPermissionValidationPassed);\r\n const error =\r\n this.emailInput &&\r\n this.emailInput.current &&\r\n this.emailInput.current.state &&\r\n this.emailInput.current.state.error;\r\n if (\r\n !this.emailInputValue ||\r\n this.emailInputValue === '' ||\r\n (error && error !== '')\r\n ) {\r\n this.triggerEmailError();\r\n throw new Error('Wrong email');\r\n }\r\n\r\n if (!this.state.marketingPermissionValidationPassed) {\r\n this.triggerMarketingPermissionValidationError();\r\n throw new Error('Marketing Permissions option not selected');\r\n }\r\n\r\n await this.updateEmailAddress(this.emailInputValue);\r\n\r\n const sessionId = await this.props.actions.createStateApiSession();\r\n if (!sessionId) {\r\n throw new Error('Error while creating a session');\r\n }\r\n };\r\n\r\n triggerMarketingPermissionValidationError = () => {\r\n const marketingPermissionSection = document.getElementsByClassName('marketing-permission-placeholder') && document.getElementsByClassName('marketing-permission-placeholder')[0];\r\n if (marketingPermissionSection) {\r\n try {\r\n marketingPermissionSection.className += ' shake-it';\r\n setTimeout(() => {\r\n marketingPermissionSection.className = marketingPermissionSection.className.replace('shake-it', '');\r\n }, 1500);\r\n } catch { }\r\n }\r\n };\r\n\r\n\r\n\r\n triggerEmailError = () => {\r\n const email = document.getElementById('email-input');\r\n if (email && this.emailInput) {\r\n this.emailInput.current.updateValue({\r\n target: { value: this.emailInputValue },\r\n });\r\n try {\r\n email.className += ' shake-it';\r\n setTimeout(() => {\r\n email.className = email.className.replace('shake-it', '');\r\n }, 1500);\r\n } catch { }\r\n }\r\n };\r\n\r\n updateEmailAddress = async email => {\r\n const { actions } = this.props;\r\n try {\r\n await actions.updateEmailAddress(email);\r\n api.registerHotLeads().catch(error => {\r\n console.log('Hot leads register Error ', error);\r\n });\r\n } catch (error) {\r\n actions.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set your email address.\",\r\n });\r\n console.log('Email address saving error ', error);\r\n }\r\n };\r\n\r\n checkPromocode = async () => {\r\n const { actions } = this.props;\r\n const code = this.promocodeInputValue;\r\n if (code) {\r\n const restrictedWithRules = this.checkIfJourneyRulesSetAndRestricted();\r\n this.setState({\r\n checkingPromocode: true,\r\n promocodeError: false,\r\n promocodeRemoved: false,\r\n promocodeMsg: null,\r\n });\r\n let msg = '';\r\n let err = false;\r\n let isSet = '';\r\n let promoRemoved = false;\r\n let planRestricted = false;\r\n let FGFRestricted = false;\r\n //DS-29 - below variable added\r\n let showErrorOnValidation = false;\r\n //DS-29 - end\r\n try {\r\n await actions.validateAndSavePromoCode(code).then(\r\n data => {\r\n // Set successful message, not used atm\r\n msg = data && data.description;\r\n isSet = code;\r\n\r\n // const isPlanRestricted = this.checkIfPlanRestricted(\r\n // data.plans\r\n // );\r\n\r\n //SUPS-11 : Extending logic of Promo restriction based on Selected plan , Selected Service and Selected Journey\r\n\r\n const isPlanRestricted = (\r\n this.checkIfPlanRestricted(data.plans)\r\n || this.checkIfRestrictedBasedOnServiceSelected(data.requiredservices)\r\n || this.checkIfRestrictedBasedOnJourneySelected(data.allowedjourneys)\r\n );\r\n //SUPS-11:END\r\n\r\n const isFGFAndNotJoin =\r\n data &&\r\n data.isFGF &&\r\n parseInt(this.props.journeyType, 10) !== 0;\r\n // Check, if still restricted with service or plan or journey\r\n if (\r\n this.state.isLpgOnly ||\r\n this.state.isPipedOnly ||\r\n restrictedWithRules ||\r\n isPlanRestricted ||\r\n isFGFAndNotJoin\r\n ) {\r\n promoRemoved = true;\r\n msg = '';\r\n isSet = '';\r\n this.props.actions.removePromoCode();\r\n planRestricted = isPlanRestricted;\r\n FGFRestricted = isFGFAndNotJoin;\r\n }\r\n //DS-29: set - showErrorOnValidation as true - if promo code is not valid \r\n showErrorOnValidation = isPlanRestricted;\r\n //DS-29 - end\r\n\r\n },\r\n error => {\r\n // Set Error to input from message and trigger error\r\n msg = error && error.message;\r\n err = true;\r\n }\r\n );\r\n } catch (error) {\r\n msg = error;\r\n err = true;\r\n } finally {\r\n if (err || showErrorOnValidation) {\r\n //DS-29: updates done for to action based on -showErrorOnValidation\r\n //this.promocodeInput.current.updateInputState({\r\n // error: '',\r\n // value: '',\r\n //});\r\n //this.promocodeInputValue = '';\r\n this.executeErrorPromoCode();\r\n //DS-29:end\r\n } else {\r\n this.promocodeInput.current.updateInputState({\r\n error: '',\r\n });\r\n }\r\n this.setState({\r\n checkingPromocode: false,\r\n promocodeError: err,\r\n promocodeMsg: msg,\r\n promocodeSet: isSet,\r\n promocodeRemoved: promoRemoved,\r\n promoRemovedWithRules: restrictedWithRules || FGFRestricted,\r\n promoRemovedWithPlan: planRestricted,\r\n FGFRestricted: FGFRestricted,\r\n });\r\n }\r\n\r\n // Do analytics call\r\n //const status = err ? msg : 'valid';\r\n const status = err ? 'invalid' : 'valid';\r\n const reasons = [];\r\n if (this.state.isLpgOnly || this.state.isPipedOnly) {\r\n reasons.push('Service restricton');\r\n }\r\n if (restrictedWithRules) {\r\n reasons.push('Journey type restricton');\r\n }\r\n if (planRestricted) {\r\n reasons.push(`Plan restricton (${this.props.selectedPlan})`);\r\n }\r\n if (err) {\r\n reasons.push(`Error: ${msg}`);\r\n }\r\n const reason = !promoRemoved && !err ? null : reasons.join(', ');\r\n this.props.actions.pushPromoCodeToDatalayer(code, status, reason);\r\n } else {\r\n this.promocodeInput.current.updateInputState({\r\n error: '',\r\n });\r\n this.setState({\r\n promocodeError: '',\r\n promocodeMsg: '',\r\n });\r\n }\r\n };\r\n //DS-29 - new function added\r\n executeErrorPromoCode = () => {\r\n this.promocodeInput.current.updateInputState({\r\n error: '',\r\n value: '',\r\n });\r\n this.promocodeInputValue = '';\r\n };\r\n //DS-29 - end\r\n\r\n\r\n\r\n toggleType = async () => {\r\n const { livingSituationValue, usageType, actions } = this.props;\r\n\r\n const revert = usageType === 'L' ? 'S' : 'L';\r\n const living = {\r\n livingSituationValue: livingSituationValue,\r\n usageType: revert,\r\n };\r\n this.setState({\r\n switchingUsageType: true,\r\n });\r\n try {\r\n await actions.saveUsageType(living.usageType);\r\n } catch (err) { }\r\n this.setState({\r\n switchingUsageType: false,\r\n });\r\n };\r\n\r\n removeAppliedPromoCode = () => {\r\n const isPromoCodeSet =\r\n this.props.customerPromoCode && this.props.customerPromoCode !== '';\r\n if (isPromoCodeSet && !this.state.promocodeRemoved) {\r\n this.props.actions.removePromoCode();\r\n this.setState({\r\n promocodeRemoved: true,\r\n });\r\n }\r\n };\r\n\r\n checkIfLpgOnly = services => {\r\n const isTheOnly =\r\n services && services.length === 1 && services.includes('LPG');\r\n if (isTheOnly) {\r\n this.removeAppliedPromoCode();\r\n }\r\n return isTheOnly;\r\n };\r\n\r\n checkIfPipedOnly = services => {\r\n const isTheOnly =\r\n services && services.length === 1 && services.includes('GAS');\r\n if (isTheOnly) {\r\n this.removeAppliedPromoCode();\r\n }\r\n return isTheOnly;\r\n };\r\n\r\n checkIfJourneyRulesSetAndRestricted = () => {\r\n const rules =\r\n this.props.fields &&\r\n this.props.fields.PromocodeHiddenFor &&\r\n this.props.fields.PromocodeHiddenFor;\r\n const journeyType =\r\n this.props.customer &&\r\n this.props.customer.Confirmation &&\r\n this.props.customer.Confirmation.JourneyType;\r\n const isFGFPromo =\r\n this.props &&\r\n this.props.FGFPromoCode &&\r\n this.props.FGFPromoCode.IsReferralCode;\r\n // FGF hardcoded to be excluded for all but Join\r\n if (isFGFPromo) {\r\n return parseInt(this.props.journeyType, 10) !== 0;\r\n }\r\n if (rules) {\r\n const isInRule = rules.filter(\r\n rule =>\r\n rule &&\r\n rule.fields &&\r\n rule.fields.Text &&\r\n rule.fields.Text.value.includes(journeyType)\r\n );\r\n return isInRule.length ? true : false;\r\n }\r\n return false;\r\n };\r\n\r\n checkIfJourneyRelatedPromoRestricted = () => {\r\n const isRestricted = this.checkIfJourneyRulesSetAndRestricted();\r\n if (isRestricted) {\r\n this.removeAppliedPromoCode();\r\n }\r\n return isRestricted;\r\n };\r\n\r\n checkIfPlanRestricted = restricted => {\r\n const plan = this.props.selectedPlan;\r\n //console.log(\"In function checkIfPlanRestricted \", \"Restricted Plan from CMS is=>\", restricted, \"user Selected Plan is =>\", plan);\r\n if (plan && restricted && restricted.length) {\r\n return restricted.includes(plan);\r\n }\r\n return false;\r\n };\r\n\r\n checkIfRestrictedBasedOnServiceSelected = allowedServices => {\r\n const service = this.props.selectedService;\r\n //console.log(\"In function checkIfServiceAllowed \", \"Allowed Service from CMS is=>\", allowedServices, \"user Selected Service is =>\", service);\r\n if (service && allowedServices && allowedServices.length) {\r\n const requiredServicesFromCMS = allowedServices.sort();\r\n const userSelectedServices= service.sort();\r\n const resultMatch = Array.isArray(requiredServicesFromCMS) &&\r\n Array.isArray(userSelectedServices) &&\r\n requiredServicesFromCMS.length === userSelectedServices.length &&\r\n requiredServicesFromCMS.every((val, index) => val === userSelectedServices[index]);\r\n \r\n if(resultMatch){\r\n //console.log(\"Promo allowed based on User selected service\")\r\n return false\r\n }\r\n else{\r\n //console.log(\"Promo restricted based on User selected service\");\r\n return true\r\n }\r\n }\r\n //console.log(\"Promo allowed as no restriction set in CMS for services\")\r\n return false; \r\n };\r\n\r\n\r\n\r\n checkIfRestrictedBasedOnJourneySelected = allowedJourneys => {\r\n const journeyType = this.props.customer &&\r\n this.props.customer.Confirmation &&\r\n this.props.customer.Confirmation.JourneyType;\r\n //console.log(\"In function CheckIfJourneyAllowed \", \"Allowed Journeys from CMS is=>\", allowedJourneys, \"user Selected Journey type is=>\", journeyType)\r\n if (journeyType && allowedJourneys && allowedJourneys.length) {\r\n //return allowedJourneys.includes(journeyType) ? false : true;\r\n if (allowedJourneys.includes(journeyType)) {\r\n //console.log(\"Promo allowed based on User selected Journey\")\r\n return false\r\n }\r\n else {\r\n //console.log(\"Promo restricted based on User selected Journey\");\r\n return true\r\n }\r\n\r\n }\r\n //console.log(\"Promo allowed as no restriction set in CMS for journey\")\r\n return false;\r\n };\r\n\r\n\r\n //SUPS-11:END\r\n\r\n getAddressHeader = () => {\r\n const { fields, journeyType } = this.props;\r\n const type = parseInt(journeyType, 10);\r\n const join = fields.StreetAddressHeading;\r\n const move = fields.StreetAddressHeadingForMove;\r\n const add = fields.StreetAddressHeadingForAdd;\r\n return type === 1 ? move || join : type === 2 ? add || join : join;\r\n };\r\n\r\n async pushToDataLayer() {\r\n const { customer } = this.props;\r\n const summary = {\r\n marketingConfirmation:\r\n (customer &&\r\n customer.Confirmation &&\r\n customer.Confirmation.ReceiveNewsAndOffers) ||\r\n false,\r\n email: this.emailInputValue,\r\n address:\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n (customer.Property.PropertyInfo.QASAddress ||\r\n customer.Property.PropertyInfo.Address)) ||\r\n '',\r\n city:\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.AddressDetails &&\r\n customer.Property.PropertyInfo.AddressDetails.city) ||\r\n '',\r\n postcode:\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.AddressDetails &&\r\n customer.Property.PropertyInfo.AddressDetails.postcode) ||\r\n '',\r\n };\r\n await this.props.actions.pushSummaryOnProceedToDatalayer(summary);\r\n }\r\n\r\n render() {\r\n const { customer, fields, usageType } = this.props;\r\n const {\r\n switchingUsageType,\r\n checkingPromocode,\r\n promocodeError,\r\n promocodeMsg,\r\n promocodeSet,\r\n promocodeRemoved,\r\n isLpgOnly,\r\n isPipedOnly,\r\n promoRemovedWithRules,\r\n promoRemovedWithPlan,\r\n promoOnMount,\r\n autocomplete,\r\n FGFRestricted,\r\n } = this.state;\r\n\r\n const existingEmail = this.emailInputValue;\r\n const services = this.props.selectedService;\r\n\r\n if (!services || !services.length) {\r\n return null;\r\n }\r\n if (!customer || !customer.Property || !customer.PriceChecker) {\r\n return null;\r\n }\r\n\r\n const promoRemovedWithServices =\r\n isLpgOnly || isPipedOnly ? true : false;\r\n\r\n const property = customer.Property;\r\n const plan =\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.Plan;\r\n\r\n const streetAddressHeading = this.getAddressHeader();\r\n\r\n return (\r\n <Fragment>\r\n <div className=\"wrapper\">\r\n <Summaries>\r\n <SummarySection>\r\n <Heading title={streetAddressHeading} />\r\n\r\n <Title\r\n title={property.PropertyInfo.Address}\r\n icon={<House />}\r\n />\r\n </SummarySection>\r\n\r\n {plan && <PlanSection fields={fields} />}\r\n\r\n <ServicesSection\r\n fields={fields}\r\n usageType={usageType}\r\n toggleType={this.toggleType}\r\n switchingUsageType={switchingUsageType}\r\n />\r\n </Summaries>\r\n {!isLpgOnly && (\r\n <Disclaimer>\r\n <RichText field={fields.RatesDisclaimer} />\r\n </Disclaimer>\r\n )}\r\n </div>\r\n\r\n <PromoCodeSection\r\n fields={fields}\r\n checkingPromocode={checkingPromocode}\r\n promocodeError={promocodeError}\r\n promocodeMsg={promocodeMsg}\r\n promocodeSet={promocodeSet}\r\n promocodeRemoved={promocodeRemoved}\r\n promoRemovedWithRules={promoRemovedWithRules}\r\n isFGFPromo={\r\n this.props.FGFPromoCode &&\r\n this.props.FGFPromoCode.IsReferralCode\r\n }\r\n FGFRestricted={FGFRestricted}\r\n promoRemovedWithPlan={promoRemovedWithPlan}\r\n promoRemovedWithServices={promoRemovedWithServices}\r\n promoOnMount={promoOnMount}\r\n updatePromocodeValue={this.updatePromocodeValue}\r\n promocodeInput={this.promocodeInput}\r\n checkPromocode={this.checkPromocode}\r\n />\r\n\r\n <EmailSection\r\n autocomplete={autocomplete}\r\n existingEmail={existingEmail}\r\n fields={fields}\r\n updateEmailAddressValue={this.updateEmailAddressValue}\r\n setEmailValue={this.setEmailValue}\r\n emailInput={this.emailInput}\r\n EmailSection={'Please enter a valid email address'}\r\n setMarketingPermissionValidationPassed={this.setMarketingPermissionValidationPassed}\r\n />\r\n\r\n <div className=\"why-contact-small\">\r\n {this.props.WhyContactPlaceholder}\r\n </div>\r\n\r\n <ContinueButton\r\n fields={this.props.fields}\r\n ignoreValidation={true}\r\n onBeforeRedirect={this.onBeforeRedirect}\r\n onBeforeOpenPopup={this.onBeforeOpenPopup}\r\n analyticsCall={this.pushToDataLayer}\r\n />\r\n </Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default compose(\r\n withUIContextProps(['livingSituationValue', 'usageType']),\r\n withExperienceEditor,\r\n withSelectedService,\r\n withSelectedPlan,\r\n withIsSouthIsland,\r\n withCustomerPromoCode,\r\n withFGFPromoCode,\r\n withJourneyType,\r\n withCustomer,\r\n withActions,\r\n withRouter\r\n)(Summary);\r\n","import React from 'react';\r\nimport { Text, Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nconst SummaryContainer = props => {\r\n function backToPlans() {\r\n window.history.back();\r\n }\r\n\r\n const WhyContactPlaceholder = (\r\n <Placeholder\r\n name=\"why-contact-placeholder\"\r\n rendering={props.rendering}\r\n />\r\n );\r\n\r\n return (\r\n <div className=\"summary-container\">\r\n <div className=\"summary-details\">\r\n <div className=\"detail-container\">\r\n <div className=\"back\" onClick={() => backToPlans()}>\r\n < Back to plan select\r\n </div>\r\n <Text tag=\"h2\" field={props.fields.Heading} />\r\n\r\n <Placeholder\r\n name=\"summary-placeholder\"\r\n rendering={props.rendering}\r\n WhyContactPlaceholder={WhyContactPlaceholder}\r\n />\r\n </div>\r\n </div>\r\n {WhyContactPlaceholder}\r\n </div>\r\n );\r\n};\r\nexport default SummaryContainer;\r\n","import React from 'react';\r\nimport { RichText, Text } from '@sitecore-jss/sitecore-jss-react';\r\n\r\nconst WhyContact = props => {\r\n const img =\r\n props.fields.Image && props.fields.Image.value\r\n ? props.fields.Image.value.src\r\n : null;\r\n return (\r\n <div\r\n className={'why-contact ' + (img ? 'with-image' : '')}\r\n style={{ backgroundImage: `url(${img})` }}>\r\n <div className=\"why-contact-content\">\r\n <Text tag=\"h2\" field={props.fields.Heading} />\r\n <RichText field={props.fields.Description} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default WhyContact;\r\n","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/generate-component-factory.js to modify the generation of this file.\nimport AddressPicker from '../components/AddressPicker';\nimport AllPlans from '../components/AllPlans';\nimport AllPlansContinueButton from '../components/AllPlansContinueButton';\nimport AllPlansGroup from '../components/AllPlansGroup';\nimport BillCompare from '../components/BillCompare';\nimport BroadbandContainer from '../components/BroadbandContainer';\nimport BroadbandTiles from '../components/BroadbandTiles';\nimport ContentBlock from '../components/ContentBlock';\nimport ContinueButton from '../components/ContinueButton';\nimport CTA from '../components/CTA';\nimport EnergyRates from '../components/EnergyRates';\nimport FormHeader from '../components/FormHeader';\nimport FormIntro from '../components/FormIntro';\nimport Icon from '../components/Icon';\nimport InfoBanner from '../components/InfoBanner';\nimport JourneyActionContainer from '../components/JourneyActionContainer';\nimport JourneyButton from '../components/JourneyButton';\nimport LandingPlanPage from '../components/LandingPlanPage';\nimport LpgUsage from '../components/LpgUsage';\nimport Messaging from '../components/Messaging';\nimport MyDetails from '../components/MyDetails';\nimport PlanCard from '../components/PlanCard';\nimport PlanFilter from '../components/PlanFilter';\nimport PlansAndServices from '../components/PlansAndServices';\nimport PromoCodeBanner from '../components/PromoCodeBanner';\nimport PromoPopup from '../components/PromoPopup';\nimport SaveForLaterPopup from '../components/SaveForLaterPopup';\nimport SegmentBanner from '../components/SegmentBanner';\nimport SegmentBannerTile from '../components/SegmentBannerTile';\nimport Services from '../components/Services';\nimport Summary from '../components/Summary';\nimport SummaryContainer from '../components/SummaryContainer';\nimport SVG from '../components/SVG';\nimport ToolTip from '../components/ToolTip';\nimport WhyContact from '../components/WhyContact';\n\nconst components = new Map();\ncomponents.set('AddressPicker', AddressPicker);\ncomponents.set('AllPlans', AllPlans);\ncomponents.set('AllPlansContinueButton', AllPlansContinueButton);\ncomponents.set('AllPlansGroup', AllPlansGroup);\ncomponents.set('BillCompare', BillCompare);\ncomponents.set('BroadbandContainer', BroadbandContainer);\ncomponents.set('BroadbandTiles', BroadbandTiles);\ncomponents.set('ContentBlock', ContentBlock);\ncomponents.set('ContinueButton', ContinueButton);\ncomponents.set('CTA', CTA);\ncomponents.set('EnergyRates', EnergyRates);\ncomponents.set('FormHeader', FormHeader);\ncomponents.set('FormIntro', FormIntro);\ncomponents.set('Icon', Icon);\ncomponents.set('InfoBanner', InfoBanner);\ncomponents.set('JourneyActionContainer', JourneyActionContainer);\ncomponents.set('JourneyButton', JourneyButton);\ncomponents.set('LandingPlanPage', LandingPlanPage);\ncomponents.set('LpgUsage', LpgUsage);\ncomponents.set('Messaging', Messaging);\ncomponents.set('MyDetails', MyDetails);\ncomponents.set('PlanCard', PlanCard);\ncomponents.set('PlanFilter', PlanFilter);\ncomponents.set('PlansAndServices', PlansAndServices);\ncomponents.set('PromoCodeBanner', PromoCodeBanner);\ncomponents.set('PromoPopup', PromoPopup);\ncomponents.set('SaveForLaterPopup', SaveForLaterPopup);\ncomponents.set('SegmentBanner', SegmentBanner);\ncomponents.set('SegmentBannerTile', SegmentBannerTile);\ncomponents.set('Services', Services);\ncomponents.set('Summary', Summary);\ncomponents.set('SummaryContainer', SummaryContainer);\ncomponents.set('SVG', SVG);\ncomponents.set('ToolTip', ToolTip);\ncomponents.set('WhyContact', WhyContact);\n\nexport default function componentFactory(componentName) {\n return components.get(componentName);\n};\n","import { SitecoreContextFactory } from '@sitecore-jss/sitecore-jss-react';\r\n\r\n/*\r\n The SitecoreContextFactory stores the current Sitecore context for the app.\r\n For example, whether the page is currently being edited, or the current language.\r\n Note that the export makes this essentially a singleton, so we can store state in it.\r\n\r\n The Sitecore context is generally updated on route change (/src/index.js).\r\n The `withSitecoreContext()` higher order component from `sitecore-jss-react`\r\n can be used to access the context from within a component.\r\n*/\r\nexport default new SitecoreContextFactory();\r\n","import axios from 'axios';\r\n\r\n/**\r\n * Implements a data fetcher using Axios - replace with your favorite\r\n * SSR-capable HTTP or fetch library if you like. See HttpJsonFetcher<T> type\r\n * in sitecore-jss library for implementation details/notes.\r\n * @param {string} url The URL to request; may include query string\r\n * @param {any} data Optional data to POST with the request.\r\n */\r\nexport function dataFetcher(url, data) {\r\n // That's below contains logic for replacing Origin & Static Route Structure when App rendered inside existing page (to differ actual browser url with passed for App)\r\n const myUrl =\r\n window && window.ContactEnergy && window.ContactEnergy.useMyOrigin;\r\n if (myUrl) {\r\n let oldUrl = url;\r\n let oldUrlParsed = oldUrl\r\n .replace('http://', '')\r\n .replace('https://', '')\r\n .split('/');\r\n oldUrlParsed[0] = myUrl;\r\n url = oldUrlParsed.join('/');\r\n // console.log('Alternative url found ', myUrl);\r\n } else {\r\n let origin = window.location.origin;\r\n if (!window.location.origin) {\r\n origin =\r\n window.location.protocol +\r\n '//' +\r\n window.location.hostname +\r\n (window.location.port ? ':' + window.location.port : '');\r\n }\r\n const isDisconnected = /localhost/i.test(origin);\r\n if (!isDisconnected) {\r\n let oldUrl = url;\r\n let oldUrlParsed = oldUrl\r\n .replace('http://', '')\r\n .replace('https://', '')\r\n .split('/');\r\n oldUrlParsed[0] = origin;\r\n url = oldUrlParsed.join('/');\r\n // console.log('Origin url applied ', origin);\r\n }\r\n }\r\n // console.log('Fetcher url intercepted ', url);\r\n\r\n const dummyRoute =\r\n window && window.ContactEnergy && window.ContactEnergy.useMyDummy;\r\n if (dummyRoute) {\r\n url = dummyRoute;\r\n // console.log('Alternative routing source found ', url);\r\n }\r\n\r\n // EOTD\r\n\r\n return axios({\r\n url,\r\n method: data ? 'POST' : 'GET',\r\n data,\r\n // note: axios needs to use `withCredentials: true` in order for Sitecore cookies to be included in CORS requests\r\n // which is necessary for analytics and such\r\n withCredentials: true,\r\n });\r\n}\r\n","export const CustomerJourney = {\r\n LandingPage: {\r\n\t\tIsExistingCustomer: null\r\n\t},\r\n Customer: {\r\n CustomerInfo: null,\r\n HasDriversLicense: false,\r\n DriversLicense: null,\r\n Action: 0,\r\n IsExistingCustomer: null,\r\n SelectedICPNumber: '',\r\n Email: '',\r\n },\r\n Property: {\r\n FakeServices: false,\r\n Services: null,\r\n ServicesFullNames: null,\r\n PlanInfo: {\r\n PlanId: null,\r\n SitecorePlanItemId: '00000000-0000-0000-0000-000000000000',\r\n PlanPPD: null,\r\n PlanRewards: null,\r\n ShowForCustomerType: null,\r\n PlanTermsAndConditionsModalText: null,\r\n PlanTermsAndConditionsPdfLink: null,\r\n DeselectedPlan: false,\r\n Plan: null,\r\n },\r\n SelectedPlanFilter: null,\r\n PropertyInfo: {\r\n Address: null,\r\n QASAddress: null,\r\n AddressSameAsPostalAddress: false,\r\n Moniker: null,\r\n ElectricityMeterType: null,\r\n ElectricityICP: null,\r\n GasICP: null,\r\n ElectricityUserType: 'Standard',\r\n Hazards: null,\r\n HasDogs: false,\r\n WithAnotherSupplier: false,\r\n OwnsProperty: false,\r\n IsBach: false,\r\n HaveFinalMeterReading: false,\r\n FinalElectricityMeterRead: null,\r\n FinalGasMeterRead: null,\r\n SendMeterReader: false,\r\n AddressDetails: {},\r\n },\r\n MoveInfo: {},\r\n LpgInfo: null,\r\n BroadbandId: null,\r\n BroadbandFullName: null,\r\n BroadbandInfo: null,\r\n },\r\n PriceChecker: {},\r\n ExistingCustomer: {\r\n IsExistingCustomer: null,\r\n AccountNumber: null,\r\n Action: 0,\r\n },\r\n Discounts: {\r\n PaperlessDiscount: true,\r\n JoinDirectDebit: true,\r\n PromoCode: null,\r\n PaymentMethod: null,\r\n BillingCycle: null,\r\n },\r\n JourneyRelated: true,\r\n ShowLoader: true,\r\n UsageQuestions: {\r\n NumberOfOccupants: 'Three',\r\n },\r\n};\r\n","import React from \"react\";\r\nimport Snackbar from \"@material-ui/core/Snackbar\";\r\nimport SnackbarContent from \"@material-ui/core/SnackbarContent\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\n\r\nclass Alert extends React.Component {\r\n state = {\r\n open: this.props.open\r\n };\r\n\r\n handleClose = (event, reason) => {\r\n if (reason === \"clickaway\") {\r\n return;\r\n }\r\n this.setState({ open: false });\r\n };\r\n\r\n render() {\r\n const { classes, message = \"Error occured while saving data\" } = this.props;\r\n return (\r\n <div className=\"generic-alert\">\r\n <Snackbar\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"center\"\r\n }}\r\n open={this.state.open}\r\n autoHideDuration={5000}\r\n ContentProps={{\r\n \"aria-describedby\": \"message-id\"\r\n }}\r\n onClose={this.handleClose}\r\n action={[\r\n <IconButton\r\n key=\"close\"\r\n aria-label=\"Close\"\r\n color=\"inherit\"\r\n className={classes}\r\n onClick={this.handleClose}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n ]}\r\n >\r\n <SnackbarContent\r\n className=\"generic-alert error\"\r\n message={\r\n <div className=\"alert-inner\">\r\n <ErrorIcon />\r\n <span id=\"message-id\">{message}</span>\r\n </div>\r\n }\r\n />\r\n </Snackbar>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default Alert;\r\n","import React from 'react';\r\nimport Cookies from 'js-cookie';\r\n\r\nimport * as API from './utils/api';\r\nimport {\r\n planDoesNotMeetSupportedRequirements,\r\n planDoesNotMeetMandatoryRequirements,\r\n doesPlanMeetRequirements,\r\n} from './utils/plans-rules';\r\nimport { isSouthIslandCustomer, isSouthIslandAddress } from './utils/address';\r\nimport { CustomerJourney } from './data/Customer';\r\nimport { PlanRules } from './data/PlansRules';\r\nimport { Services } from './data/Services';\r\nimport { PLAN_LPG_ONLY, PLAN_PIPED_GAS_ONLY } from './constants';\r\n\r\nimport ActionsContext from './context/ActionsContext';\r\nimport UIContext from './context/UIContext';\r\nimport CustomerContext from './context/CustomerContext';\r\nimport PlansAndServicesContext from './context/PlandAndServicesContext';\r\n\r\nimport Alert from './components/Common/Alert';\r\n\r\nclass AppState extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n // Customer will load from API (see componentDidMount)\r\n customer: null,\r\n plansAndServices: {\r\n selectedService: null,\r\n plansRules: initializePlansRules(),\r\n allServices: initializeServices(),\r\n allPlans: [],\r\n lpgUsage: [],\r\n selectedServiceName: [],\r\n selectedBroadband: null,\r\n selectedPlan: null,\r\n activeFilter: null,\r\n activeAlerts: [],\r\n },\r\n ui: {\r\n isTouch: isTouch(),\r\n returningUser: false,\r\n showBillCompareModal: false,\r\n livingSituationValue: null,\r\n usageType: 'S',\r\n planFilterTabsTitles: [],\r\n isSaving: false,\r\n journeyActionsActive: false,\r\n promoDismissed: false,\r\n isPopupOpen: false,\r\n },\r\n error: false,\r\n errorMsg: null,\r\n };\r\n\r\n this.actions = {\r\n createStateApiSession: this.createStateApiSession.bind(this),\r\n\r\n saveForLater: this.saveForLater.bind(this),\r\n searchAddress: this.searchAddress.bind(this),\r\n updateAddress: this.updateAddress.bind(this),\r\n updateICPAddress: this.updateICPAddress.bind(this),\r\n updateService: this.updateService.bind(this),\r\n updatePlan: this.updatePlan.bind(this),\r\n updateBroadband: this.updateBroadband.bind(this),\r\n toggleJourneyActions: this.toggleJourneyActions.bind(this),\r\n togglePopup: this.togglePopup.bind(this),\r\n updateUserAccount: this.updateUserAccount.bind(this),\r\n JustGetSelectedPlan: this.JustGetSelectedPlan.bind(this),\r\n\r\n setExpandRates: this.setExpandRates.bind(this),\r\n setLivingSituation: this.setLivingSituation.bind(this),\r\n setShowBillCompareModal: this.setShowBillCompareModal.bind(this),\r\n setError: this.setError.bind(this),\r\n setPlanFilterTabsTitle: this.setPlanFilterTabsTitle.bind(this),\r\n\r\n updatePlansAndServices: this.updatePlansAndServices.bind(this),\r\n saveService: this.saveService.bind(this),\r\n saveUsageType: this.saveUsageType.bind(this),\r\n savePlan: this.savePlan.bind(this),\r\n saveBB: this.saveBB.bind(this),\r\n toggleSelectedService: this.toggleSelectedService.bind(this),\r\n toggleLpgUsage: this.toggleLpgUsage.bind(this),\r\n toggleSelectedPlan: this.toggleSelectedPlan.bind(this),\r\n toggleSelectedBB: this.toggleSelectedBB.bind(this),\r\n customerChoice: this.customerChoice.bind(this),\r\n\r\n updateEmailAddress: this.updateEmailAddress.bind(this),\r\n toggleMarketingPermission: this.toggleMarketingPermission.bind(\r\n this\r\n ),\r\n validateAndSavePromoCode: this.validateAndSavePromoCode.bind(this),\r\n removePromoCode: this.removePromoCode.bind(this),\r\n restorePromoCode: this.restorePromoCode.bind(this),\r\n setJourneyType: this.setJourneyType.bind(this),\r\n setPromoState: this.setPromoState.bind(this),\r\n\r\n registerPlan: this.registerPlan.bind(this),\r\n checkIfActionsComponentPresent: this.checkIfActionsComponentPresent.bind(\r\n this\r\n ),\r\n\r\n setSitecoreGAId: this.setSitecoreGAId.bind(this),\r\n pushEpValuesToDatalayer: this.pushEpValuesToDatalayer.bind(this),\r\n pushImpressionsToDatalayer: this.pushImpressionsToDatalayer.bind(\r\n this\r\n ),\r\n pushPlanAndDetailsToDatalayer: this.pushPlanAndDetailsToDatalayer.bind(\r\n this\r\n ),\r\n pushContinueToSummaryToDatalayer: this.pushContinueToSummaryToDatalayer.bind(\r\n this\r\n ),\r\n pushSummaryToDatalayer: this.pushSummaryToDatalayer.bind(this),\r\n pushToDataLayer: this.pushToDataLayer.bind(this),\r\n pushPromoCodeToDatalayer: this.pushPromoCodeToDatalayer.bind(this),\r\n pushSummaryOnProceedToDatalayer: this.pushSummaryOnProceedToDatalayer.bind(\r\n this\r\n ),\r\n\r\n registerGoal: this.registerGoal.bind(this),\r\n sha256: this.sha256.bind(this),\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.loadCustomerJourney();\r\n }\r\n\r\n /**\r\n * Check if Journey Actions Component added to page, if not - default to Join journey\r\n */\r\n checkIfActionsComponentPresent = () => {\r\n const route = this.props && this.props.children;\r\n if (route) {\r\n const placeholder =\r\n route.props &&\r\n route.props.rendering &&\r\n route.props.rendering.placeholders &&\r\n route.props.rendering.placeholders['jss-main'];\r\n if (placeholder) {\r\n const actions = placeholder.find(\r\n component =>\r\n component.componentName === 'JourneyActionContainer'\r\n );\r\n if (!actions) {\r\n const journey =\r\n this.state.customer &&\r\n this.state.customer.Customer &&\r\n this.state.customer.Customer.Action;\r\n if (parseInt(journey, 10) !== 0) {\r\n this.setJourneyType({ text: 'Join', id: 0 });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Returns updated customer state\r\n * @param customer\r\n * @returns {Object}\r\n * @private\r\n */\r\n _getUpdatedCustomerState(customer) {\r\n if (!customer || !(customer instanceof Object) || !customer.Property) {\r\n // set default customer object\r\n customer = { ...CustomerJourney };\r\n }\r\n return {\r\n customer: { ...customer },\r\n error: false,\r\n errorMsg: null,\r\n };\r\n }\r\n\r\n async loadCustomerJourney() {\r\n //console.log(\"sha256 for 'mattlaw@contact.co.nz' is \", this.sha256(\"mattlaw@contact.co.nz\"))\r\n let customer;\r\n try {\r\n\r\n var urlSearchParams = new URLSearchParams(window.location.search);\r\n var saveForLaterID = urlSearchParams.get(\"saveforlaterid\");\r\n var urlPromocode = urlSearchParams.get(\"promocode\");\r\n\r\n customer = await API.getCustomerJourney(saveForLaterID, urlPromocode);\r\n } catch (e) {\r\n /* noop */\r\n }\r\n\r\n return new Promise(resolve => {\r\n this.setState(\r\n state => {\r\n let newState = this._getUpdatedCustomerState(\r\n customer,\r\n true\r\n );\r\n newState = {\r\n ...newState,\r\n plansAndServices: initializePlansAndServices(\r\n newState.customer\r\n ),\r\n ui: {\r\n ...state.ui,\r\n returningUser: isReturning(newState.customer),\r\n ...getLivingSituation(newState.customer),\r\n },\r\n };\r\n return newState;\r\n },\r\n () => {\r\n resolve(this.state.customer);\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Saves customer object into session.\r\n * @param dataToUpdate A partial customer object to be updated.\r\n * @returns {Promise<* | *>}\r\n */\r\n async saveCustomerJourney(dataToUpdate) {\r\n return new Promise((resolve, reject) => {\r\n // Note: this is an ugly workaround for async updater for setState\r\n // something like this.setState(async (prevState) => ({ ... }))\r\n this.setState(({ customer, ui }) => {\r\n (async () => {\r\n try {\r\n const data = await API.saveCustomerJourney(\r\n customer,\r\n dataToUpdate\r\n );\r\n this.setState(\r\n state => {\r\n let newState = this._getUpdatedCustomerState(\r\n data\r\n );\r\n let plansAndServices = {\r\n ...state.plansAndServices,\r\n selectedService: getSelectedServices(\r\n newState.customer\r\n ),\r\n lpgUsage: getLpgUsage(newState.customer),\r\n selectedServiceName: getSelectedServiceNames(\r\n newState.customer\r\n ),\r\n selectedBroadband: getSelectedBroadband(\r\n newState.customer\r\n ),\r\n selectedPlan: getSelectedPlan(\r\n newState.customer\r\n ),\r\n };\r\n newState = {\r\n ...newState,\r\n plansAndServices,\r\n ui: {\r\n ...state.ui,\r\n returningUser: isReturning(\r\n newState.customer\r\n ),\r\n ...getLivingSituation(\r\n newState.customer\r\n ),\r\n isSaving: false,\r\n },\r\n };\r\n return newState;\r\n },\r\n () => {\r\n resolve(this.state.customer);\r\n }\r\n );\r\n } catch (error) {\r\n this.setState(\r\n state => ({\r\n error: true,\r\n errorMsg: error.message,\r\n ui: {\r\n ...state.ui,\r\n isSaving: false,\r\n },\r\n }),\r\n () => {\r\n reject(error);\r\n }\r\n );\r\n }\r\n })();\r\n // do not change state just yet\r\n if (ui.isSaving) {\r\n return {};\r\n }\r\n return {\r\n ui: {\r\n ...ui,\r\n isSaving: true,\r\n },\r\n };\r\n });\r\n });\r\n }\r\n\r\n async saveForLater(dataToUpdate) {\r\n return new Promise((resolve, reject) => {\r\n // Note: this is an ugly workaround for async updater for setState\r\n // something like this.setState(async (prevState) => ({ ... }))\r\n this.setState(({ customer, ui }) => {\r\n (async () => {\r\n try {\r\n const data = await API.saveForLater(\r\n customer,\r\n dataToUpdate\r\n );\r\n\r\n if (data && data.IsSuccessful) {\r\n this.setState(\r\n state => ({}),\r\n () => { resolve(data); }\r\n );\r\n }\r\n else {\r\n this.setState(\r\n state => ({}),\r\n () => { reject(data); }\r\n );\r\n }\r\n\r\n } catch (error) {\r\n this.setState(\r\n state => ({\r\n error: true,\r\n errorMsg: error.message,\r\n }),\r\n () => {\r\n reject(error);\r\n }\r\n );\r\n }\r\n })();\r\n\r\n return {};\r\n });\r\n });\r\n }\r\n\r\n\r\n async createStateApiSession() {\r\n try {\r\n clearStateApiCookie();\r\n const sessionId = await API.createStateApiSession(\r\n this.state.customer\r\n );\r\n setStateApiCookie(sessionId);\r\n return sessionId;\r\n } catch (err) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to establish session for you.\",\r\n });\r\n }\r\n }\r\n\r\n async updateEmailAddress(email) {\r\n const updatedEmailAddress = {\r\n Customer: {\r\n CustomerInfo: {\r\n EmailAddress: email,\r\n },\r\n },\r\n };\r\n\r\n const emailFieldToSave = {\r\n FieldId: 'Customer[CustomerInfo][EmailAddress]',\r\n Value: email,\r\n };\r\n\r\n // We don't need to wait until fulfilled\r\n this.saveField(emailFieldToSave).catch(error => {\r\n console.log('Saving Email field Error ', error);\r\n });\r\n\r\n return this.saveCustomerJourney(updatedEmailAddress);\r\n }\r\n\r\n async updateUserAccount(acc) {\r\n const updatedAccount = {\r\n ExistingCustomer: {\r\n AccountNumber: acc,\r\n },\r\n };\r\n\r\n return this.saveCustomerJourney(updatedAccount);\r\n }\r\n\r\n JustGetSelectedPlan() {\r\n return (\r\n (this.state.customer &&\r\n this.state.customer.Property &&\r\n this.state.customer.Property.PlanInfo &&\r\n this.state.customer.Property.PlanInfo.PlanId) ||\r\n null\r\n );\r\n }\r\n\r\n async toggleMarketingPermission(permit) {\r\n const updatedMarketingPermission = {\r\n Confirmation: {\r\n ReceiveNewsAndOffers: permit,\r\n },\r\n };\r\n\r\n const marketingFieldToSave = {\r\n FieldId: 'Confirmation[ReceiveNewsAndOffers]',\r\n Value: permit ? 'true' : 'false',\r\n };\r\n this.saveField(marketingFieldToSave).catch(error => {\r\n console.log('Saving Marketing Confirmation field Error ', error);\r\n });\r\n\r\n return this.saveCustomerJourney(updatedMarketingPermission);\r\n }\r\n\r\n async validateAndSavePromoCode(promo) {\r\n // Validate promo code & save if valid\r\n return API.validatePromocode(promo).then(\r\n success => {\r\n return new Promise((resolve, reject) => {\r\n if (success && success.IsValid) {\r\n const promocodeFieldToSave = {\r\n FieldId: 'Promotion[PromoCode]',\r\n Value: promo,\r\n };\r\n this.saveField(promocodeFieldToSave).catch(error => {\r\n console.log('Saving Promocode field Error ', error);\r\n });\r\n const promoCodeRestoreFieldToSave = {\r\n FieldId: 'PromoCodeRestore',\r\n Value: promo,\r\n };\r\n this.saveField(promoCodeRestoreFieldToSave).catch(\r\n () => {\r\n /* noop */\r\n }\r\n );\r\n\r\n const promocode = {\r\n Discounts: {\r\n PromoCode: promo,\r\n },\r\n };\r\n this.saveCustomerJourney(promocode).then(\r\n resolve({\r\n status: true,\r\n message: 'Promocode valid',\r\n description: success && success.Description,\r\n plans: success && success.PlanRestricted,\r\n isFGF: success && success.IsReferralCode,\r\n requiredservices:success && success.RequiredServices,\r\n allowedjourneys: success && success.AllowedJourneys,\r\n })\r\n );\r\n } else {\r\n reject({\r\n status: false,\r\n message: success.InvalidMessage,\r\n });\r\n }\r\n });\r\n },\r\n error => {\r\n return {\r\n status: false,\r\n message: 'Network error, please try again later',\r\n };\r\n }\r\n );\r\n }\r\n\r\n async removePromoCode() {\r\n return Promise.all([\r\n this.saveField({\r\n FieldId: 'Promotion[PromoCode]',\r\n Value: null,\r\n }),\r\n this.saveCustomerJourney({\r\n Discounts: {\r\n PromoCode: null,\r\n },\r\n Payment:{\r\n PromoCode: null,\r\n },\r\n }),\r\n ]).catch(() => {\r\n /* noop */\r\n });\r\n }\r\n\r\n async restorePromoCode() {\r\n try {\r\n const restored = await API.getField('PromoCodeRestore');\r\n if (restored) {\r\n await this.saveCustomerJourney({\r\n Discounts: {\r\n PromoCode: restored,\r\n },\r\n });\r\n }\r\n } catch (err) {\r\n /* noop */\r\n }\r\n }\r\n\r\n async saveField(fieldToSave) {\r\n return API.saveField(fieldToSave);\r\n }\r\n\r\n async searchAddress(address) {\r\n return API.searchAddress(address);\r\n }\r\n\r\n async updateAddress(address) {\r\n let updatedCustomer = {\r\n Property: {\r\n PropertyInfo: {\r\n Address: address.PartialAddress,\r\n Moniker: address.Moniker,\r\n AddressDetails: null,\r\n },\r\n },\r\n PriceChecker: {\r\n ElectricityICP: null,\r\n },\r\n Customer: {\r\n SelectedICPNumber: null,\r\n },\r\n };\r\n\r\n // Set piped gas only plan, if address on south island and\r\n // piped only gas service selected.\r\n const { plansAndServices } = this.state;\r\n const services = plansAndServices.selectedService;\r\n if (\r\n services &&\r\n services.length === 1 &&\r\n services.includes('GAS') &&\r\n isSouthIslandAddress(address.PartialAddress)\r\n ) {\r\n updatedCustomer = setGasOnlyPlan(updatedCustomer);\r\n }\r\n\r\n return this.saveCustomerJourney(updatedCustomer);\r\n }\r\n\r\n async updateICPAddress(address) {\r\n return this.saveCustomerJourney({\r\n Property: {\r\n PropertyInfo: {\r\n Address: address.PartialAddress,\r\n ElectricityICP: address.IcpNumber,\r\n },\r\n },\r\n PriceChecker: {\r\n ElectricityICP: { IcpNumber: address.IcpNumber },\r\n },\r\n Customer: {\r\n SelectedICPNumber: address.IcpNumber,\r\n },\r\n });\r\n }\r\n\r\n async setJourneyType(journey) {\r\n let journeyToSet = {\r\n Confirmation: {\r\n JourneyType: journey.text,\r\n },\r\n Customer: {\r\n Action: journey.id,\r\n IsExistingCustomer: journey.id > 0 ? true : false,\r\n },\r\n ExistingCustomer: {\r\n Action: journey.id,\r\n IsExistingCustomer: journey.id > 0 ? true : false,\r\n },\r\n };\r\n\r\n return this.saveCustomerJourney(journeyToSet);\r\n }\r\n\r\n async customerChoice(choice) {\r\n \r\n console.log(\"inside customerChoice\");\r\n console.log(choice);\r\n\r\n return this.saveCustomerJourney({LandingPage: {\r\n IsExistingCustomer: choice\r\n }});\r\n }\r\n\r\n\r\n async updateUsageType(usageType) {\r\n // XXX: Uncomment this after API is implemented\r\n // const usageQuestions = {\r\n // UsageQuestions: {\r\n // LivingSituation: living.livingSituationValue,\r\n // UsageType: living.usageType,\r\n // },\r\n // };\r\n return this.saveCustomerJourney({\r\n Property: {\r\n PropertyInfo: {\r\n ElectricityUserType:\r\n usageType === 'L' ? 'Low User' : 'Standard',\r\n },\r\n },\r\n });\r\n }\r\n\r\n async updateService(services, servicesFullNames) {\r\n let updatedCustomer = {\r\n Property: {\r\n Services: services,\r\n ServicesFullNames: servicesFullNames,\r\n },\r\n };\r\n\r\n // Unselect broadband if no broadband in services\r\n if (!services || !services.includes('BB')) {\r\n updatedCustomer = deselectBroadband(updatedCustomer);\r\n }\r\n\r\n // Additionally check for LPG only - set LPG-only Plan\r\n if (services && services.length === 1 && services.includes('LPG')) {\r\n updatedCustomer = setLpgOnlyPlan(updatedCustomer);\r\n\r\n // if not LPG only but LPG-only plan selected, deselect\r\n } else if (isLpgOnlyPlan(this.state.customer)) {\r\n updatedCustomer = deselectPlan(updatedCustomer);\r\n }\r\n\r\n // Additionally check for piped gas only AND south island address\r\n // if that - set PIPEDGAS-only Plan\r\n if (\r\n services &&\r\n services.length === 1 &&\r\n services.includes('GAS') &&\r\n isSouthIslandCustomer(this.state.customer)\r\n ) {\r\n updatedCustomer = setGasOnlyPlan(updatedCustomer);\r\n\r\n // if not GAS only but PIPEDGAS-only plan selected, deselect\r\n } else if (isGasOnlyPlan(this.state.customer)) {\r\n updatedCustomer = deselectPlan(updatedCustomer);\r\n }\r\n\r\n // Additionally check for non LPG - remove lpg usage data then\r\n if (!services || !services.includes('LPG')) {\r\n updatedCustomer = setLpgUsage(updatedCustomer, null);\r\n }\r\n\r\n return this.saveCustomerJourney(updatedCustomer);\r\n }\r\n\r\n async updateLpgUsage(lpgUsage) {\r\n return this.saveCustomerJourney(setLpgUsage({}, lpgUsage));\r\n }\r\n\r\n async updatePlan(plan) {\r\n return this.saveCustomerJourney(\r\n selectPlan({}, plan.PlanId, plan.PlanItemId)\r\n );\r\n }\r\n\r\n async updateBroadband(id, name) {\r\n\r\n let BBType = null;\r\n let broadbandOfferings =\r\n this.state.customer &&\r\n this.state.customer.PriceChecker &&\r\n this.state.customer.PriceChecker.BroadbandOfferings &&\r\n this.state.customer.PriceChecker.BroadbandOfferings.Offerings;\r\n\r\n if (broadbandOfferings) {\r\n const BBOffering = broadbandOfferings.find(plan => plan.Id === id);\r\n\r\n if (BBOffering) {\r\n BBType = BBOffering.Type;\r\n }\r\n }\r\n\r\n return this.saveCustomerJourney(selectBroadband({}, id, name, BBType));\r\n }\r\n\r\n setExpandRates(value) {\r\n this.setState(({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n expandRates: value,\r\n },\r\n }));\r\n }\r\n\r\n toggleJourneyActions(flag) {\r\n this.setState(({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n journeyActionsActive: flag,\r\n },\r\n }));\r\n }\r\n\r\n togglePopup(flag) {\r\n this.setState(({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n isPopupOpen: flag,\r\n },\r\n }));\r\n\r\n console.log(\"isPopupOpen=\", flag);\r\n }\r\n\r\n setLivingSituation(living) {\r\n this.setState(({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n ...living,\r\n },\r\n error: false,\r\n errorMsg: null,\r\n }));\r\n }\r\n\r\n setPromoState(flag) {\r\n this.setState(({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n promoDismissed: flag,\r\n },\r\n }));\r\n }\r\n\r\n async setShowBillCompareModal(value) {\r\n return new Promise(resolve => {\r\n this.setState(\r\n ({ ui }) => ({\r\n ui: {\r\n ...ui,\r\n showBillCompareModal: value,\r\n },\r\n }),\r\n () => {\r\n resolve();\r\n }\r\n );\r\n });\r\n }\r\n\r\n setError(err) {\r\n if (!err || !err.error) {\r\n this.setState({\r\n error: false,\r\n errorMsg: null,\r\n });\r\n }\r\n if (err && err.error) {\r\n this.setState({\r\n error: true,\r\n errorMsg: err.message ? err.message : null,\r\n });\r\n }\r\n }\r\n\r\n setPlanFilterTabsTitle(index, title) {\r\n this.setState(({ ui }) => {\r\n const planFilterTabsTitles = ui.planFilterTabsTitles || [];\r\n planFilterTabsTitles[index] = title;\r\n return {\r\n ui: {\r\n ...ui,\r\n planFilterTabsTitles,\r\n },\r\n };\r\n });\r\n }\r\n\r\n updatePlansAndServices(data) {\r\n this.setState(({ plansAndServices }) => ({\r\n plansAndServices: {\r\n ...plansAndServices,\r\n ...data,\r\n activeAlerts:\r\n data.activeAlerts ||\r\n ('selectedService' in data ||\r\n 'selectedPlan' in data ||\r\n 'lpgUsage' in data\r\n ? getAlerts(\r\n 'selectedService' in data\r\n ? data.selectedService\r\n : plansAndServices.selectedService,\r\n 'selectedPlan' in data\r\n ? data.selectedPlan\r\n : plansAndServices.selectedPlan,\r\n plansAndServices.plansRules,\r\n 'lpgUsage' in data\r\n ? data.lpgUsage\r\n : plansAndServices.lpgUsage,\r\n plansAndServices.allServices\r\n )\r\n : plansAndServices.activeAlerts),\r\n },\r\n }));\r\n }\r\n\r\n async saveService(services, names) {\r\n try {\r\n await this.updateService(services, names);\r\n } catch (error) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set services for you.\",\r\n });\r\n }\r\n }\r\n\r\n async saveUsageType(usageType) {\r\n try {\r\n // save customer data with updated usage type to server\r\n await this.updateUsageType(usageType);\r\n } catch (error) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set your living situation.\",\r\n });\r\n }\r\n }\r\n\r\n async saveLpgUsage(lpgUsage) {\r\n try {\r\n await this.updateLpgUsage(lpgUsage);\r\n } catch (error) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set services for you.\",\r\n });\r\n }\r\n }\r\n\r\n registerPlan(plan) {\r\n this.setState(({ plansAndServices }) => ({\r\n plansAndServices: {\r\n ...plansAndServices,\r\n allPlans: [\r\n // add a plan which has not been added already\r\n ...plansAndServices.allPlans.filter(\r\n ({ apiId }) => apiId !== plan.apiId\r\n ),\r\n plan,\r\n ],\r\n },\r\n }));\r\n }\r\n\r\n getPlanSiteCoreId(planId) {\r\n const { allPlans } = this.state.plansAndServices;\r\n const plan = allPlans.find(({ apiId }) => apiId === planId);\r\n if (plan) {\r\n return plan.siteCoreId;\r\n }\r\n return null;\r\n }\r\n\r\n getPlanName(planId) {\r\n const { allPlans } = this.state.plansAndServices;\r\n const plan = allPlans.find(({ apiId }) => apiId === planId);\r\n if (plan) {\r\n return plan.title;\r\n }\r\n return null;\r\n }\r\n\r\n async savePlan(planId) {\r\n const plan = {\r\n PlanId: planId,\r\n PlanItemId: this.getPlanSiteCoreId(planId),\r\n };\r\n try {\r\n await this.updatePlan(plan);\r\n } catch (error) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set Plan for you.\",\r\n });\r\n }\r\n }\r\n\r\n async saveBB(BBId, BBName) {\r\n try {\r\n await this.updateBroadband(BBId, BBName);\r\n } catch (error) {\r\n this.setError({\r\n error: true,\r\n message:\r\n \"We've got a Network error trying to set Broadband Option for you.\",\r\n });\r\n }\r\n }\r\n\r\n toggleSelectedService(id,isIslandRestricted) {\r\n if (!id) return;\r\n\r\n let resetPlan = false;\r\n let resetBroadband = false;\r\n\r\n this.setState(\r\n ({ plansAndServices, customer }) => {\r\n const {\r\n selectedService,\r\n lpgUsage,\r\n selectedPlan,\r\n selectedBroadband,\r\n plansRules,\r\n allServices,\r\n ...rest\r\n } = plansAndServices;\r\n\r\n let newState = {\r\n selectedService: selectedService || [],\r\n selectedPlan,\r\n selectedBroadband,\r\n };\r\n\r\n // toggle service\r\n if (newState.selectedService.includes(id)) {\r\n newState.selectedService = newState.selectedService.filter(\r\n serviceId => serviceId !== id\r\n );\r\n } else {\r\n newState.selectedService = [\r\n ...newState.selectedService,\r\n id,\r\n ];\r\n }\r\n\r\n newState.activeAlerts = getAlertsBeforeRulesApplied(\r\n newState.selectedService\r\n );\r\n\r\n // Check for mutually excluded\r\n const lpg = newState.selectedService.includes('LPG');\r\n const gas = newState.selectedService.includes('GAS');\r\n if (id === 'LPG' && gas && lpg) {\r\n newState.selectedService = newState.selectedService.filter(\r\n srv => srv !== 'GAS'\r\n );\r\n }\r\n if (id === 'GAS' && gas && lpg) {\r\n newState.selectedService = newState.selectedService.filter(\r\n srv => srv !== 'LPG'\r\n );\r\n }\r\n\r\n // Additional check if BB but not ELEC only\r\n const isElec = newState.selectedService.includes('ELEC');\r\n const isBB = newState.selectedService.includes('BB');\r\n if (isBB && !isElec) {\r\n if (id === 'ELEC') {\r\n // unselect broadband\r\n newState.selectedService = newState.selectedService.filter(\r\n srv => srv !== 'BB'\r\n );\r\n } else if (id === 'BB') {\r\n // select electricity\r\n newState.selectedService = [\r\n ...newState.selectedService,\r\n 'ELEC',\r\n ];\r\n }\r\n }\r\n\r\n // Additional check if no BB - set option to null\r\n if (\r\n selectedBroadband &&\r\n (!newState.selectedService ||\r\n !newState.selectedService.includes('BB'))\r\n ) {\r\n newState.selectedBroadband = null;\r\n resetBroadband = true;\r\n }\r\n\r\n // Additional check if LPG only\r\n const lpgOnly =\r\n newState.selectedService.length === 1 &&\r\n newState.selectedService.includes('LPG');\r\n if (lpgOnly) {\r\n // Unselect plan for LPG only\r\n newState.selectedPlan = null;\r\n resetPlan = true;\r\n }\r\n\r\n // Additional check if piped gas only in South Island\r\n const pipedGasOnly =\r\n newState.selectedService.length === 1 &&\r\n newState.selectedService.includes('GAS');\r\n if (pipedGasOnly && isSouthIslandCustomer(customer)) {\r\n // Unselect plan for LPG only\r\n newState.selectedPlan = null;\r\n resetPlan = true;\r\n }\r\n\r\n // Update selected services full names\r\n newState.selectedServiceName = newState.selectedService.map(\r\n service => getServiceFullNameById(allServices, service)\r\n );\r\n\r\n // Update LPG usage\r\n newState.lpgUsage = newState.selectedService.includes('LPG')\r\n ? lpgUsage\r\n : null;\r\n\r\n newState.activeAlerts = [\r\n ...newState.activeAlerts,\r\n ...getAlerts(\r\n newState.selectedService,\r\n newState.selectedPlan,\r\n plansRules,\r\n lpgUsage,\r\n allServices,\r\n false,\r\n isIslandRestricted,\r\n ),\r\n ];\r\n\r\n // Check if selected plan meets requirements\r\n if (\r\n newState.selectedPlan &&\r\n !doesPlanMeetRequirements(\r\n plansRules,\r\n newState.selectedService,\r\n newState.selectedPlan\r\n )\r\n ) {\r\n // Unselect plan\r\n newState.selectedPlan = null;\r\n resetPlan = true;\r\n }\r\n\r\n return {\r\n plansAndServices: {\r\n plansRules,\r\n allServices,\r\n ...rest,\r\n ...newState,\r\n },\r\n };\r\n },\r\n () => {\r\n // save stuff to API once the state is updated\r\n const {\r\n selectedService,\r\n selectedServiceName,\r\n } = this.state.plansAndServices;\r\n if (resetPlan) {\r\n this.savePlan(null);\r\n }\r\n if (resetBroadband) {\r\n this.saveBB(null, null);\r\n }\r\n this.saveService(selectedService, selectedServiceName);\r\n }\r\n );\r\n }\r\n\r\n toggleLpgUsage(id) {\r\n if (!id) return;\r\n\r\n let updatedLpgUsage;\r\n this.setState(\r\n ({ plansAndServices }) => {\r\n const { lpgUsage } = plansAndServices;\r\n\r\n // toggle\r\n if (lpgUsage && lpgUsage.includes(id)) {\r\n updatedLpgUsage = lpgUsage.filter(x => x !== id);\r\n } else {\r\n updatedLpgUsage = [...(lpgUsage || []), id];\r\n }\r\n\r\n const newState = {\r\n ...plansAndServices,\r\n lpgUsage: updatedLpgUsage,\r\n };\r\n // active alerts\r\n newState.activeAlerts = getAlerts(\r\n newState.selectedService,\r\n newState.selectedPlan,\r\n newState.plansRules,\r\n newState.lpgUsage,\r\n newState.allServices\r\n );\r\n return {\r\n plansAndServices: newState,\r\n };\r\n },\r\n () => {\r\n this.saveLpgUsage(updatedLpgUsage);\r\n }\r\n );\r\n }\r\n\r\n async toggleSelectedPlan(id, forceSelect = false, isRestrictionReason) {\r\n if (!id) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n let updateServices = false;\r\n this.setState(\r\n ({ plansAndServices }) => {\r\n const {\r\n selectedPlan,\r\n selectedService,\r\n plansRules,\r\n lpgUsage,\r\n allServices,\r\n } = plansAndServices;\r\n\r\n let newState = {\r\n selectedPlan: id,\r\n selectedService,\r\n };\r\n\r\n // toggle plan\r\n if (newState.selectedPlan === selectedPlan) {\r\n if (forceSelect) {\r\n // don't do any changes if plan already selected\r\n // and forceSelect on\r\n return {};\r\n }\r\n newState.selectedPlan = null;\r\n }\r\n\r\n newState.activeAlerts = getAlerts(\r\n newState.selectedService,\r\n newState.selectedPlan,\r\n plansRules,\r\n lpgUsage,\r\n allServices,\r\n true,\r\n isRestrictionReason\r\n );\r\n\r\n if (newState.selectedPlan) {\r\n // Do Analytics Call\r\n try {\r\n this.pushPlanAndDetailsToDatalayer(\r\n newState.selectedPlan\r\n );\r\n } catch (error) {\r\n console.log('Analytics error', error);\r\n }\r\n\r\n // Check for mandatory requirements\r\n const doesNotMeetMandatory = planDoesNotMeetMandatoryRequirements(\r\n plansRules,\r\n newState.selectedService,\r\n newState.selectedPlan\r\n );\r\n if (doesNotMeetMandatory) {\r\n // Select services\r\n newState.selectedService = [\r\n ...newState.selectedService,\r\n ...doesNotMeetMandatory,\r\n ];\r\n updateServices = true;\r\n }\r\n\r\n // Check for supported requirements\r\n const doesNotMeetSupported = planDoesNotMeetSupportedRequirements(\r\n plansRules,\r\n newState.selectedService,\r\n newState.selectedPlan\r\n );\r\n if (doesNotMeetSupported) {\r\n // Unselect service\r\n newState.selectedService = newState.selectedService.filter(\r\n serviceId =>\r\n !doesNotMeetSupported.includes(serviceId)\r\n );\r\n updateServices = true;\r\n }\r\n }\r\n\r\n newState.selectedServiceName = newState.selectedService.map(\r\n service => getServiceFullNameById(allServices, service)\r\n );\r\n\r\n return {\r\n plansAndServices: {\r\n ...plansAndServices,\r\n ...newState,\r\n },\r\n };\r\n },\r\n () => {\r\n const {\r\n selectedPlan,\r\n selectedService,\r\n selectedServiceName,\r\n } = this.state.plansAndServices;\r\n // requests\r\n const promises = [\r\n updateServices\r\n ? this.saveService(\r\n selectedService,\r\n selectedServiceName\r\n )\r\n : null,\r\n selectedPlan && selectedPlan === 'BACH'\r\n ? this.saveUsageType('S')\r\n : null,\r\n this.savePlan(selectedPlan),\r\n ].filter(Boolean);\r\n // resolve once all requests are fulfilled\r\n Promise.all(promises)\r\n .then(data => resolve(data[data.length - 1]))\r\n .catch(err => reject(err));\r\n }\r\n );\r\n });\r\n }\r\n\r\n async toggleSelectedBB(id, name) {\r\n if (!id) return;\r\n\r\n let reset = false;\r\n this.setState(\r\n ({ plansAndServices }) => {\r\n const { selectedBroadband } = plansAndServices;\r\n const newState = {\r\n ...plansAndServices,\r\n selectedBroadband: id,\r\n };\r\n // toggle\r\n if (newState.selectedBroadband === selectedBroadband) {\r\n newState.selectedBroadband = null;\r\n reset = true;\r\n }\r\n // alerts - Broadband does not trigger any alerts\r\n // newState.activeAlerts = getAlerts(\r\n // newState.selectedService,\r\n // newState.selectedPlan,\r\n // newState.plansRules,\r\n // newState.lpgUsage,\r\n // newState.allServices,\r\n // );\r\n return {\r\n plansAndServices: newState,\r\n };\r\n },\r\n () => {\r\n const { selectedBroadband } = this.state.plansAndServices;\r\n this.saveBB(selectedBroadband, reset ? null : name);\r\n }\r\n );\r\n }\r\n\r\n /*\r\n ** Analitics / eCommerce stuff\r\n **\r\n */\r\n async setSitecoreGAId() {\r\n const id =\r\n window &&\r\n window.dataLayer &&\r\n window.dataLayer.find(key => key['SitecoreContactId']);\r\n if (id) {\r\n const value = id['SitecoreContactId'];\r\n return this.saveCustomerJourney({\r\n SitecoreContactId: value,\r\n });\r\n }\r\n return new Promise(resolve => null);\r\n }\r\n\r\n pushEpValuesToDatalayer() {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const customer = this.state.customer;\r\n const priceChecker = customer && customer.PriceChecker;\r\n const propertyIcp =\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.ElectricityICP;\r\n const icp =\r\n priceChecker && priceChecker.ElectricityICP\r\n ? priceChecker.ElectricityICP.IcpNumber\r\n : propertyIcp;\r\n dataLayer.push({\r\n event: 'EPValues',\r\n available: priceChecker.PricingAvailable,\r\n region: priceChecker.Region,\r\n provider: '',\r\n icp: icp || null,\r\n pricingCalc: 'Pricing Calculator',\r\n });\r\n\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n getUserJourneyAction() {\r\n const customer = this.state.customer;\r\n if (customer.ExistingCustomer) {\r\n switch (customer.ExistingCustomer.Action) {\r\n case 1:\r\n case 'MoveHouse':\r\n return 'Existing/MoveHouse';\r\n case 2:\r\n case 'AddProperty':\r\n return 'Existing/AddProperty';\r\n case 3:\r\n case 'ChangePlan':\r\n return 'Existing/ChangePlan';\r\n default: {\r\n if (customer.Property.MoveInfo) {\r\n return typeof customer.Property.MoveInfo\r\n .IsMovingHouse !== 'undefined' &&\r\n (customer.Property.MoveInfo.IsMovingHouse ===\r\n 'true' ||\r\n customer.Property.MoveInfo.IsMovingHouse)\r\n ? 'New/Move'\r\n : 'New/Join';\r\n }\r\n\r\n return 'New/Not Selected';\r\n }\r\n }\r\n }\r\n return 'New/Not Selected';\r\n }\r\n\r\n getProductImpressions(plans) {\r\n const impressions = [];\r\n const body = document.getElementsByTagName('body');\r\n const bodyClasses = body && body.length ? body[0].className : '';\r\n const journey = this.getUserJourneyAction();\r\n\r\n if (plans && plans.length) {\r\n plans.forEach((plan, i) => {\r\n var impression = {\r\n name: plan.name,\r\n id: plan.plan,\r\n price: '',\r\n brand: '',\r\n category: journey,\r\n variant: '',\r\n list: bodyClasses + ' ijoin',\r\n position: i + 1,\r\n };\r\n impressions.push(impression);\r\n });\r\n }\r\n\r\n return impressions;\r\n }\r\n\r\n pushImpressionsToDatalayer(plans) {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n\r\n dataLayer.push({\r\n event: 'productImpression',\r\n ecommerce: {\r\n impressions: this.getProductImpressions(plans),\r\n },\r\n });\r\n\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n pushPlanAndDetailsToDatalayer(plan) {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const body = document.getElementsByTagName('body');\r\n const bodyClasses = body && body.length ? body[0].className : '';\r\n const journey = this.getUserJourneyAction();\r\n const name = this.getPlanName(plan);\r\n\r\n dataLayer.push({\r\n event: 'productClick',\r\n ecommerce: {\r\n click: {\r\n actionField: { list: bodyClasses + ' ijoin' },\r\n products: [\r\n {\r\n name: name,\r\n id: plan,\r\n price: '',\r\n brand: '',\r\n category: journey,\r\n variant: '',\r\n },\r\n ],\r\n },\r\n },\r\n });\r\n dataLayer.push({\r\n event: 'detailView',\r\n ecommerce: {\r\n detail: {\r\n products: [\r\n {\r\n name: name,\r\n id: plan,\r\n price: '',\r\n brand: '',\r\n category: journey,\r\n variant: '',\r\n },\r\n ],\r\n },\r\n },\r\n });\r\n\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n pushContinueToSummaryToDatalayer(acc) {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const journey = this.getUserJourneyAction();\r\n\r\n dataLayer.push({\r\n event: 'planBuilderPageSubmitted',\r\n baid: acc ? acc : '',\r\n journey: journey,\r\n });\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n pushSummaryToDatalayer() {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const journey = this.getUserJourneyAction();\r\n\r\n dataLayer.push({\r\n event: 'SummaryJourney',\r\n journey: journey,\r\n });\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n pushToDataLayer(obj) {\r\n\r\n const dataLayer = (window && window.dataLayer) || [];\r\n\r\n dataLayer.push(obj);\r\n\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n pushPromoCodeToDatalayer(promo, status, reason) {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const journey = this.getUserJourneyAction();\r\n\r\n dataLayer.push({\r\n event: 'promoCodesubmitted',\r\n promoCode: promo,\r\n promoCodeStatus: status,\r\n promoCodeApplicationStatus: reason\r\n ? reason.includes('Error:')\r\n ? 'was not applied based on ' + reason\r\n : 'was removed based on ' + reason\r\n : 'was successfully applied',\r\n journey: journey,\r\n });\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n async pushSummaryOnProceedToDatalayer(summary) {\r\n const dataLayer = (window && window.dataLayer) || [];\r\n const journey = this.getUserJourneyAction();\r\n /*\r\n * Summary in format of:\r\n * {\r\n * marketingConfirmation: true/false,\r\n * email: '%email%',\r\n * address: '%address%',\r\n * city: '%city%',\r\n * postcode: '%postcode%',\r\n * }\r\n */\r\n const email =\r\n summary && summary.email ? await this.sha256(summary.email) : '';\r\n const address =\r\n summary && summary.address\r\n ? await this.sha256(summary.address)\r\n : '';\r\n const city =\r\n summary && summary.city ? await this.sha256(summary.city) : '';\r\n const postcode =\r\n summary && summary.postcode\r\n ? await this.sha256(summary.postcode)\r\n : '';\r\n\r\n dataLayer.push({\r\n event: 'summaryPageSubmitted',\r\n optIn:\r\n summary && summary.marketingConfirmation\r\n ? 'opted-in'\r\n : 'opted-out',\r\n hashedEmail: email,\r\n hashedAddress: address,\r\n hashedCity: city,\r\n hashedZip: postcode,\r\n journey: journey,\r\n });\r\n if (window) {\r\n window.dataLayer = dataLayer;\r\n }\r\n }\r\n\r\n async sha256(string) {\r\n // encode as UTF-8\r\n const strBuffer = new TextEncoder('utf-8').encode(string);\r\n // hash the string\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', strBuffer);\r\n // convert ArrayBuffer to Array\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n // convert bytes to hex string\r\n const hashHex = hashArray\r\n .map(i => ('00' + i.toString(16)).slice(-2))\r\n .join('');\r\n return hashHex;\r\n }\r\n\r\n async registerGoal(goalId) {\r\n return API.registerGoal(goalId);\r\n }\r\n\r\n /*\r\n ** EOP\r\n */\r\n\r\n render() {\r\n const { customer, plansAndServices, ui, error, errorMsg } = this.state;\r\n\r\n // Wait until customer loaded\r\n if (!customer) return null;\r\n\r\n return (\r\n <>\r\n <ActionsContext.Provider value={this.actions}>\r\n <UIContext.Provider value={ui}>\r\n <CustomerContext.Provider value={customer}>\r\n <PlansAndServicesContext.Provider\r\n value={plansAndServices}\r\n >\r\n {this.props.children}\r\n </PlansAndServicesContext.Provider>\r\n </CustomerContext.Provider>\r\n </UIContext.Provider>\r\n </ActionsContext.Provider>\r\n {error && (\r\n <Alert\r\n open={true}\r\n message={\r\n errorMsg\r\n ? errorMsg\r\n : 'There was a Network Error with your request. Please try again.'\r\n }\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default AppState;\r\n\r\nfunction isReturning(customer) {\r\n const address = Boolean(\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.Address\r\n );\r\n const service = Boolean(\r\n customer &&\r\n customer.Property &&\r\n customer.Property.Services &&\r\n customer.Property.Services.length\r\n );\r\n const plan = Boolean(\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.PlanId\r\n );\r\n return address || (service && plan);\r\n}\r\n\r\nfunction initializePlansRules() {\r\n let plansRules;\r\n if (typeof window !== 'undefined') {\r\n plansRules =\r\n window &&\r\n window.ContactEnergy &&\r\n window.ContactEnergy.Data &&\r\n window.ContactEnergy.Data.PlansRules;\r\n }\r\n if (!plansRules) {\r\n if (process.env.NODE_ENV === 'development') {\r\n plansRules = PlanRules;\r\n } else {\r\n plansRules = [];\r\n }\r\n }\r\n return plansRules;\r\n}\r\n\r\nfunction initializeServices() {\r\n let services;\r\n if (typeof window !== 'undefined') {\r\n services =\r\n window &&\r\n window.ContactEnergy &&\r\n window.ContactEnergy.Data &&\r\n window.ContactEnergy.Data.Services;\r\n }\r\n if (!services) {\r\n if (process.env.NODE_ENV === 'development') {\r\n services = Services;\r\n } else {\r\n services = [];\r\n }\r\n }\r\n return services;\r\n}\r\n\r\nfunction initializePlansAndServices(customer) {\r\n const plansAndServices = {\r\n selectedService: getSelectedServices(customer),\r\n plansRules: initializePlansRules(),\r\n allServices: initializeServices(),\r\n allPlans: [],\r\n lpgUsage: getLpgUsage(customer),\r\n selectedServiceName: getSelectedServiceNames(customer),\r\n selectedBroadband: getSelectedBroadband(customer),\r\n selectedPlan: getSelectedPlan(customer),\r\n };\r\n return {\r\n ...plansAndServices,\r\n activeFilter: null,\r\n activeAlerts: getAlerts(\r\n plansAndServices.selectedService,\r\n plansAndServices.selectedPlan,\r\n plansAndServices.plansRules,\r\n plansAndServices.lpgUsage,\r\n [],\r\n false\r\n ),\r\n };\r\n}\r\n\r\nfunction getLpgUsage(customer) {\r\n return (\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.LpgInfo &&\r\n customer.Property.LpgInfo.BottledGasUsage) ||\r\n null\r\n );\r\n}\r\n\r\nfunction setLpgUsage(customer, lpgUsage) {\r\n let updatedCustomer = { ...customer };\r\n if (!updatedCustomer.Property) {\r\n updatedCustomer.Property = {};\r\n }\r\n if (lpgUsage) {\r\n updatedCustomer.Property.LpgInfo = {\r\n BottledGasUsage: lpgUsage,\r\n };\r\n } else {\r\n updatedCustomer.Property.LpgInfo = null;\r\n }\r\n return updatedCustomer;\r\n}\r\n\r\n/**\r\n * Returns a partial customer object updated with selected plan fields.\r\n * @param customer A partial customer object\r\n * @param planId\r\n * @param siteCorePlanId\r\n * @returns {Object}\r\n */\r\nfunction selectPlan(customer, planId, siteCorePlanId) {\r\n let updatedCustomer = { ...customer };\r\n if (!updatedCustomer.Property) {\r\n updatedCustomer.Property = {};\r\n }\r\n if (!updatedCustomer.Property.PlanInfo) {\r\n updatedCustomer.Property.PlanInfo = {};\r\n }\r\n updatedCustomer.Property.PlanInfo.PlanId = planId;\r\n updatedCustomer.Property.PlanInfo.SitecorePlanItemId = siteCorePlanId;\r\n if (!planId) {\r\n updatedCustomer.Property.PlanInfo.Plan = null;\r\n }\r\n return updateFakeServices(updatedCustomer);\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with null plan fields.\r\n * @param customer A partial customer object\r\n * @returns {Object}\r\n */\r\nfunction deselectPlan(customer) {\r\n return selectPlan(customer, null, null);\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with lpg-only plan selected.\r\n * @param customer A partial customer object\r\n * @returns {Object}\r\n */\r\nfunction setLpgOnlyPlan(customer) {\r\n return selectPlan(customer, PLAN_LPG_ONLY, null);\r\n}\r\n\r\n/**\r\n * Returns true, if lpg-only plan selected.\r\n * @param customer\r\n * @returns {boolean}\r\n */\r\nfunction isLpgOnlyPlan(customer) {\r\n return Boolean(\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.PlanId === PLAN_LPG_ONLY\r\n );\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with piped gas only plan selected.\r\n * @param customer A partial customer object\r\n * @returns {Object}\r\n */\r\nfunction setGasOnlyPlan(customer) {\r\n return selectPlan(customer, PLAN_PIPED_GAS_ONLY, null);\r\n}\r\n\r\n/**\r\n * Returns true, if piped gas only plan selected.\r\n * @param customer\r\n * @returns {boolean}\r\n */\r\nfunction isGasOnlyPlan(customer) {\r\n return Boolean(\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.PlanId === PLAN_PIPED_GAS_ONLY\r\n );\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with updated fake services field\r\n * depending of if plan has been selected.\r\n * @param customer A partial customer object\r\n * @returns {Object}\r\n */\r\nfunction updateFakeServices(customer) {\r\n let updatedCustomer = { ...customer };\r\n if (!updatedCustomer.Property) {\r\n updatedCustomer.Property = {};\r\n }\r\n const planExist =\r\n updatedCustomer.Property.PlanInfo &&\r\n updatedCustomer.Property.PlanInfo.PlanId;\r\n updatedCustomer.Property.FakeServices = !planExist;\r\n return updatedCustomer;\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with updated broadband fields.\r\n * @param customer A partial customer object\r\n * @param broadbandId\r\n * @param broadbandName\r\n * @returns {Object}\r\n */\r\nfunction selectBroadband(customer, broadbandId, broadbandName, broadbandType) {\r\n let updatedCustomer = { ...customer };\r\n if (!updatedCustomer.Property) {\r\n updatedCustomer.Property = {};\r\n }\r\n updatedCustomer.Property.BroadbandId = broadbandId;\r\n updatedCustomer.Property.BroadbandFullName = broadbandName;\r\n updatedCustomer.Property.BroadbandType = broadbandType;\r\n return updatedCustomer;\r\n}\r\n\r\n/**\r\n * Returns a partial customer object with null broadband fields.\r\n * @param customer A partial customer object\r\n * @returns {Object}\r\n */\r\nfunction deselectBroadband(customer) {\r\n return selectBroadband(customer, null, null, null);\r\n}\r\n\r\nfunction getLivingSituation(customer) {\r\n // let living = null;\r\n let usage = null;\r\n\r\n if (customer && customer.UsageQuestions) {\r\n // Note: Not yet implemented in API\r\n // if (\r\n // customer.UsageQuestions.LivingSituation &&\r\n // customer.UsageQuestions.LivingSituation !== ''\r\n // ) {\r\n // living = customer.UsageQuestions.LivingSituation;\r\n // }\r\n if (\r\n customer.UsageQuestions.UsageType &&\r\n customer.UsageQuestions.UsageType !== ''\r\n ) {\r\n usage = customer.UsageQuestions.UsageType;\r\n }\r\n }\r\n if (\r\n customer &&\r\n customer.Property &&\r\n customer.Property.PropertyInfo &&\r\n customer.Property.PropertyInfo.ElectricityUserType &&\r\n !(customer.UsageQuestions && customer.UsageQuestions.UsageType)\r\n ) {\r\n usage =\r\n customer.Property.PropertyInfo.ElectricityUserType === 'Low User'\r\n ? 'L'\r\n : 'S';\r\n }\r\n return {\r\n // livingSituationValue: living,\r\n usageType: usage,\r\n };\r\n}\r\n\r\nfunction getSelectedPlan(customer) {\r\n return (\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.PlanInfo &&\r\n customer.Property.PlanInfo.PlanId) ||\r\n null\r\n );\r\n}\r\n\r\nfunction getSelectedServices(customer) {\r\n return (customer && customer.Property && customer.Property.Services) || [];\r\n}\r\n\r\nfunction getSelectedServiceNames(customer) {\r\n return (\r\n (customer &&\r\n customer.Property &&\r\n customer.Property.ServicesFullNames) ||\r\n []\r\n );\r\n}\r\n\r\nfunction getSelectedBroadband(customer) {\r\n return (\r\n (customer && customer.Property && customer.Property.BroadbandId) || null\r\n );\r\n}\r\n\r\nfunction isTouch() {\r\n try {\r\n const el = document.createElement('div');\r\n el.setAttribute('ontouchstart', 'return;');\r\n return typeof el.ontouchstart === 'function';\r\n } catch (e) {\r\n return false;\r\n }\r\n}\r\n\r\nfunction getAlertsBeforeRulesApplied(selectedServices) {\r\n let activeAlerts = [];\r\n\r\n // Check if broadband picked without electricity\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('BB') &&\r\n !selectedServices.includes('ELEC')\r\n ) {\r\n activeAlerts.push(['dependant-service']);\r\n }\r\n\r\n // Check for mutually excluded\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('LPG') &&\r\n selectedServices.includes('GAS')\r\n ) {\r\n activeAlerts.push(['mutually-exclusive']);\r\n }\r\n\r\n return activeAlerts;\r\n}\r\n\r\nfunction getServiceFullNameById(allServices, id) {\r\n const existingService = allServices.find(service => service.id === id);\r\n return existingService && existingService.name;\r\n}\r\n\r\nfunction getAlerts(\r\n selectedServices,\r\n selectedPlan,\r\n plansRules,\r\n lpgUsage,\r\n allServices,\r\n togglingPlan, \r\n isIslandRestricted\r\n) {\r\n let activeAlerts = [];\r\n\r\n // Check for electricity but not gas/lpg\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('ELEC') &&\r\n !selectedServices.includes('LPG') &&\r\n !selectedServices.includes('GAS')\r\n ) {\r\n activeAlerts.push(['dualfuel']);\r\n }\r\n\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('GAS') &&\r\n selectedServices.length === 1\r\n ) {\r\n activeAlerts.push(['rockgas-south']);\r\n }\r\n\r\n // Check if piped gas only\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('GAS') &&\r\n selectedServices.length === 1\r\n ) {\r\n activeAlerts.push(['gas-only']);\r\n }\r\n\r\n // Check if bottled gas only\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('LPG') &&\r\n selectedServices.length === 1\r\n ) {\r\n activeAlerts.push(['lpg-only']);\r\n }\r\n\r\n // Check if cooking only\r\n /*\r\n * Excluded as per new requirements\r\n */\r\n // if (lpgUsage && lpgUsage.length === 1 && lpgUsage.includes('Cooking')) {\r\n // activeAlerts.push(['lpg--cooking-only']);\r\n // }\r\n\r\n // Check if everything but broadband selected\r\n if (\r\n selectedServices &&\r\n selectedServices.includes('ELEC') &&\r\n (selectedServices.includes('LPG') ||\r\n selectedServices.includes('GAS')) &&\r\n !selectedServices.includes('BB')\r\n ) {\r\n activeAlerts.push(['add-broadband']);\r\n }\r\n\r\n // Check if selected plan meets requirements\r\n if (selectedPlan) {\r\n const doesNotMeetMandatory = planDoesNotMeetMandatoryRequirements(\r\n plansRules,\r\n selectedServices,\r\n selectedPlan\r\n );\r\n\r\n var firstCondition = doesNotMeetMandatory && isIslandRestricted === \"isNorth\";\r\n var secondCondition = doesNotMeetMandatory && isIslandRestricted === \"isSouth\";\r\n\r\n if (doesNotMeetMandatory && isIslandRestricted === \"isNorth\") {\r\n activeAlerts.push([\r\n 'south-only',\r\n {\r\n service: doesNotMeetMandatory\r\n .map(serviceId =>\r\n getServiceFullNameById(allServices, serviceId)\r\n )\r\n .join(', '),\r\n },\r\n ]);\r\n }\r\n else if (doesNotMeetMandatory && isIslandRestricted === \"isSouth\") {\r\n activeAlerts.push([\r\n 'north-only',\r\n {\r\n service: doesNotMeetMandatory\r\n .map(serviceId =>\r\n getServiceFullNameById(allServices, serviceId)\r\n )\r\n .join(', '),\r\n },\r\n ]);\r\n }\r\n else if (/*doesNotMeetMandatory &&*/ isIslandRestricted === \"touMessage\") {\r\n activeAlerts.push(['tou-message']);\r\n }\r\n else if (doesNotMeetMandatory) {\r\n activeAlerts.push([\r\n togglingPlan\r\n ? 'plan--service-required'\r\n : 'plan-removed-service-required',\r\n {\r\n service: doesNotMeetMandatory\r\n .map(serviceId =>\r\n getServiceFullNameById(allServices, serviceId)\r\n )\r\n .join(', '),\r\n },\r\n ]);\r\n }\r\n\r\n const doesNotMeetSupported = planDoesNotMeetSupportedRequirements(\r\n plansRules,\r\n selectedServices,\r\n selectedPlan\r\n );\r\n if (doesNotMeetSupported) {\r\n activeAlerts.push([\r\n togglingPlan\r\n ? 'plan--service-not-supported'\r\n : 'plan-removed-service-not-supported',\r\n {\r\n service: doesNotMeetSupported\r\n .map(serviceId =>\r\n getServiceFullNameById(allServices, serviceId)\r\n )\r\n .join(', '),\r\n },\r\n ]);\r\n }\r\n }\r\n return activeAlerts;\r\n}\r\n\r\n/**\r\n * Clears state API cookie.\r\n */\r\nfunction clearStateApiCookie() {\r\n Cookies.remove('sessionID');\r\n}\r\n\r\n/**\r\n * Sets state API cookie.\r\n * @param sessionId\r\n */\r\nfunction setStateApiCookie(sessionId) {\r\n const expiryDate = new Date();\r\n expiryDate.setMilliseconds(expiryDate.getMilliseconds() + 60000);\r\n let options = {\r\n expires: expiryDate,\r\n path: '/',\r\n };\r\n if (process.env.NODE_ENV !== 'development') {\r\n options.secure = true;\r\n options.domain = '.contact.co.nz';\r\n }\r\n Cookies.set('sessionID', sessionId, options);\r\n}\r\n","import React, { Component } from 'react';\r\nimport {\r\n Placeholder,\r\n VisitorIdentification,\r\n} from '@sitecore-jss/sitecore-jss-react';\r\n\r\nimport AppState from './AppState';\r\n\r\nimport './assets/scss/app.scss';\r\n\r\n/*\r\n APP LAYOUT\r\n This is where the app's HTML structure and root placeholders should be defined.\r\n\r\n All routes share this root layout by default (this could be customized in RouteHandler),\r\n but components added to inner placeholders are route-specific.\r\n*/\r\n\r\nexport default class Layout extends Component {\r\n componentDidMount() {\r\n // Find loader and remove class\r\n const loader = document.getElementsByClassName('ijoin-app-placeholder');\r\n if (loader && loader.length) {\r\n loader[0].className = 'ijoin-app-placeholder';\r\n }\r\n\r\n // Scroll top to page/container top once landed\r\n const appContainer = document.getElementById('root');\r\n if (appContainer) {\r\n const scrollTop =\r\n appContainer.offsetTop - (window && window.innerHeight / 3);\r\n if (window && window.scrollTo) {\r\n window.scrollTo({\r\n top: scrollTop,\r\n left: 0,\r\n behavior: 'smooth',\r\n });\r\n //console.log('Scrolled');\r\n } else {\r\n const root = document.getElementsByTagName('html')[0];\r\n root.scrollTop = scrollTop;\r\n //console.log('Scrolled alternatively');\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <React.Fragment>\r\n <VisitorIdentification />\r\n\r\n <AppState>\r\n <Placeholder name=\"jss-main\" rendering={this.props.route} />\r\n </AppState>\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\n\r\n// Renders a route-not-found message when no route is available from Sitecore\r\n// The JSS equivalent of a 404 Not Found page.\r\n\r\n// This is invoked from RouteHandler when Sitecore returns no valid route data.\r\n// The NotFound component receives the Layout Service Context data, but no route data.\r\n// This can be used to power parts of your site, such as navigation, from LS context additions\r\n// without losing the ability to render them on your 404 pages :)\r\n\r\nconst NotFound = ({ context = { site: { name: '' }, language: '' } }) => (\r\n <React.Fragment>\r\n <h1>Page not found</h1>\r\n <p>This page does not exist.</p>\r\n <p>\r\n Site: {context.site && context.site.name}\r\n <br />\r\n Language: {context.language}\r\n </p>\r\n </React.Fragment>\r\n);\r\n\r\nexport default NotFound;\r\n","import React from 'react';\r\nimport Helmet from 'react-helmet';\r\nimport { isExperienceEditorActive, dataApi } from '@sitecore-jss/sitecore-jss-react';\r\nimport SitecoreContextFactory from './lib/SitecoreContextFactory';\r\nimport { dataFetcher } from './dataFetcher';\r\nimport config from './temp/config';\r\nimport Layout from './Layout';\r\nimport NotFound from './NotFound';\r\n\r\n// Dynamic route handler for Sitecore items.\r\n// Because JSS app routes are defined in Sitecore, traditional static React routing isn't enough -\r\n// we need to be able to load dynamic route data from Sitecore after the client side route changes.\r\n// So react-router delegates all route rendering to this handler, which attempts to get the right\r\n// route data from Sitecore - and if none exists, renders the not found component.\r\n\r\nlet ssrInitialState = null;\r\n\r\nexport default class RouteHandler extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n notFound: true,\r\n routeData: ssrInitialState, // null when client-side rendering\r\n defaultLanguage: config.defaultLanguage,\r\n };\r\n\r\n if (ssrInitialState && ssrInitialState.sitecore && ssrInitialState.sitecore.route) {\r\n // set the initial sitecore context data if we got SSR initial state\r\n SitecoreContextFactory.setSitecoreContext({\r\n route: ssrInitialState.sitecore.route,\r\n itemId: ssrInitialState.sitecore.route.itemId,\r\n ...ssrInitialState.sitecore.context,\r\n });\r\n }\r\n\r\n // route data from react-router - if route was resolved, it's not a 404\r\n if (props.route !== null) {\r\n this.state.notFound = false;\r\n }\r\n\r\n // if we have an initial SSR state, and that state doesn't have a valid route data,\r\n // then this is a 404 route.\r\n if (ssrInitialState && (!ssrInitialState.sitecore || !ssrInitialState.sitecore.route)) {\r\n this.state.notFound = true;\r\n }\r\n\r\n // if we have an SSR state, and that state has language data, set the current language\r\n // (this makes the language of content follow the Sitecore context language cookie)\r\n // note that a route-based language (i.e. /de-DE) will override this default; this is for home.\r\n if (ssrInitialState && ssrInitialState.context && ssrInitialState.context.language) {\r\n this.state.defaultLanguage = ssrInitialState.context.language;\r\n }\r\n\r\n // once we initialize the route handler, we've \"used up\" the SSR data,\r\n // if it existed, so we want to clear it now that it's in react state.\r\n // future route changes that might destroy/remount this component should ignore any SSR data.\r\n // EXCEPTION: Unless we are still SSR-ing. Because SSR can re-render the component twice\r\n // (once to find GraphQL queries that need to run, the second time to refresh the view with\r\n // GraphQL query results)\r\n // We test for SSR by checking for Node-specific process.env variable.\r\n if (typeof window !== 'undefined') {\r\n ssrInitialState = null;\r\n }\r\n\r\n this.componentIsMounted = false;\r\n }\r\n\r\n componentDidMount() {\r\n // if no existing routeData is present (from SSR), get Layout Service fetching the route data\r\n if (!this.state.routeData) {\r\n this.updateRouteData();\r\n }\r\n\r\n this.componentIsMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this.componentIsMounted = false;\r\n }\r\n\r\n /**\r\n * Loads route data from Sitecore Layout Service into state.routeData\r\n */\r\n updateRouteData() {\r\n let sitecoreRoutePath = this.props.route.match.params.sitecoreRoute || '/';\r\n if (!sitecoreRoutePath.startsWith('/')) {\r\n sitecoreRoutePath = `/${sitecoreRoutePath}`;\r\n }\r\n\r\n // That's below contains logic for replacing Route Structure when App rendered inside existing page (to differ actual browser url with passed for App)\r\n const myRoute =\r\n window && window.ContactEnergy && window.ContactEnergy.useMyRoute;\r\n if (myRoute) {\r\n sitecoreRoutePath = myRoute;\r\n // console.log(\"Alternative route found \", myRoute);\r\n }\r\n // console.log(\"Route Data intercepted \", sitecoreRoutePath);\r\n // EOTD\r\n\r\n const language = this.props.route.match.params.lang || this.state.defaultLanguage;\r\n\r\n // get the route data for the new route\r\n getRouteData(sitecoreRoutePath, language).then((routeData) => {\r\n if (routeData !== null && routeData.sitecore && routeData.sitecore.route) {\r\n // set the sitecore context data and push the new route\r\n SitecoreContextFactory.setSitecoreContext({\r\n route: routeData.sitecore.route,\r\n itemId: routeData.sitecore.route.itemId,\r\n ...routeData.sitecore.context,\r\n });\r\n this.setState({ routeData, notFound: false });\r\n } else {\r\n this.setState({ routeData, notFound: true });\r\n }\r\n });\r\n }\r\n\r\n componentDidUpdate(previousProps) {\r\n const existingRoute = previousProps.route.match.url;\r\n const newRoute = this.props.route.match.url;\r\n\r\n // don't change state (refetch route data) if the route has not changed\r\n if (existingRoute === newRoute) {\r\n return;\r\n }\r\n\r\n // if in experience editor - force reload instead of route data update\r\n // avoids confusing Sitecore's editing JS\r\n if (isExperienceEditorActive()) {\r\n window.location.assign(newRoute);\r\n return;\r\n }\r\n\r\n this.updateRouteData();\r\n }\r\n\r\n render() {\r\n const { notFound, routeData } = this.state;\r\n\r\n // no route data for the current route in Sitecore - show not found component.\r\n // Note: this is client-side only 404 handling. Server-side 404 handling is the responsibility\r\n // of the server being used (i.e. node-headless-ssr-proxy and Sitecore intergrated rendering know how to send 404 status codes).\r\n if (notFound) {\r\n return (\r\n <div>\r\n <Helmet>\r\n <title>Page not found\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // Don't render anything if the route data is not fully loaded yet.\r\n // This is a good place for a \"Loading\" component, if one is needed.\r\n if (!routeData) {\r\n return null;\r\n }\r\n\r\n // Render the app's root structural layout\r\n return ;\r\n }\r\n}\r\n\r\n/**\r\n * Sets the initial state provided by server-side rendering.\r\n * Setting this state will bypass initial route data fetch calls.\r\n * @param {object} ssrState\r\n */\r\nexport function setServerSideRenderingState(ssrState) {\r\n ssrInitialState = ssrState;\r\n}\r\n\r\n/**\r\n * Gets route data from Sitecore. This data is used to construct the component layout for a JSS route.\r\n * @param {string} route Route path to get data for (e.g. /about)\r\n * @param {string} language Language to get route data in (content language, e.g. 'en')\r\n */\r\nfunction getRouteData(route, language) {\r\n const fetchOptions = {\r\n layoutServiceConfig: { host: config.sitecoreApiHost },\r\n querystringParams: { sc_lang: language, sc_apikey: config.sitecoreApiKey },\r\n fetcher: dataFetcher,\r\n };\r\n\r\n return dataApi.fetchRouteData(route, fetchOptions).catch((error) => {\r\n if (error.response && error.response.status === 404 && error.response.data) {\r\n return error.response.data;\r\n }\r\n\r\n console.error('Route data fetch error', error, error.response);\r\n\r\n return null;\r\n });\r\n}\r\n","import { TOGGLE_PLAN_DETAIL } from '../actions/all-plans';\r\n\r\nconst initialState = null;\r\n\r\nfunction allPlans(state = initialState, action) {\r\n switch (action.type) {\r\n case TOGGLE_PLAN_DETAIL:\r\n if (action.planId === state) {\r\n return null;\r\n } else {\r\n return action.planId;\r\n }\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default allPlans;\r\n","import { combineReducers } from 'redux';\r\n\r\nimport allPlans from './all-plans';\r\n\r\nexport default combineReducers({\r\n allPlans,\r\n});\r\n","import { createStore } from 'redux';\r\nimport reducers from './reducers';\r\n\r\nconst store = createStore(reducers);\r\n\r\nexport default store;\r\n","import React from 'react';\r\nimport { SitecoreContext } from '@sitecore-jss/sitecore-jss-react';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport { ApolloProvider } from 'react-apollo';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport componentFactory from './temp/componentFactory';\r\nimport SitecoreContextFactory from './lib/SitecoreContextFactory';\r\nimport RouteHandler from './RouteHandler';\r\nimport store from './store';\r\n\r\n// This is the main JSX entry point of the app invoked by the renderer (server or client rendering).\r\n// By default the app's normal rendering is delegated to that handles the loading of JSS route data.\r\n\r\n// support languages in the URL prefix\r\n// e.g. /da-DK/path, or /en/path, or /path\r\nexport const routePatterns = [\r\n '/:lang([a-z]{2}-[A-Z]{2})/:sitecoreRoute*',\r\n '/:lang([a-z]{2})/:sitecoreRoute*',\r\n '/:sitecoreRoute*',\r\n];\r\n\r\n// wrap the app with:\r\n// ApolloProvider: provides an instance of Apollo GraphQL client to the app to make Connected GraphQL queries.\r\n// Not needed if not using connected GraphQL.\r\n// SitecoreContext: provides component resolution and context services via withSitecoreContext\r\n// Router: provides a basic routing setup that will resolve Sitecore item routes and allow for language URL prefixes.\r\nconst AppRoot = ({ path, Router, graphQLClient }) => {\r\n const routeRenderFunction = (props) => ;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {routePatterns.map((routePattern) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AppRoot;\r\n","import 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\n\r\n// Start of App\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport AppRoot from './AppRoot';\r\nimport { setServerSideRenderingState } from './RouteHandler';\r\nimport GraphQLClientFactory from './lib/GraphQLClientFactory';\r\nimport config from './temp/config';\r\n\r\n/* eslint-disable no-underscore-dangle */\r\n\r\nlet renderFunction = ReactDOM.render;\r\n\r\n/*\r\n SSR Data\r\n If we're running in a server-side rendering scenario,\r\n the server will provide JSON in the #__JSS_STATE__ element\r\n for us to acquire the initial state to run with on the client.\r\n\r\n This enables us to skip a network request to load up the layout data.\r\n We are emitting a quiescent script with JSON so that we can take advantage\r\n of JSON.parse()'s speed advantage over parsing full JS, and enable\r\n working without needing `unsafe-inline` in Content Security Policies.\r\n\r\n SSR is initiated from /server/server.js.\r\n*/\r\nlet __JSS_STATE__ = null;\r\nconst ssrRawJson = document.getElementById('__JSS_STATE__');\r\nif (ssrRawJson) {\r\n __JSS_STATE__ = JSON.parse(ssrRawJson.innerHTML);\r\n}\r\nif (__JSS_STATE__) {\r\n // push the initial SSR state into the route handler, where it will be used\r\n setServerSideRenderingState(__JSS_STATE__);\r\n\r\n // when React initializes from a SSR-based initial state, you need to render with `hydrate` instead of `render`\r\n renderFunction = ReactDOM.hydrate;\r\n}\r\n\r\n/*\r\n GraphQL Data\r\n The Apollo Client needs to be initialized to make GraphQL available to the JSS app.\r\n Not using GraphQL? Remove this, and the ApolloContext from `AppRoot`.\r\n*/\r\n// Apollo supports SSR of GraphQL queries, so like JSS SSR, it has an object we can pre-hydrate the client cache from\r\n// to avoid needing to re-run GraphQL queries after the SSR page loads\r\nconst initialGraphQLState =\r\n __JSS_STATE__ && __JSS_STATE__.APOLLO_STATE ? __JSS_STATE__.APOLLO_STATE : null;\r\n\r\nconst graphQLClient = GraphQLClientFactory(config.graphQLEndpoint, false, initialGraphQLState);\r\n\r\n/*\r\n App Rendering\r\n*/\r\n// HTML element to place the app into\r\nconst rootElement = document.getElementById('root');\r\n\r\nrenderFunction(\r\n ,\r\n rootElement\r\n);\r\n","/* eslint-disable import/first */\r\n\r\nimport 'isomorphic-fetch';\r\nimport { ApolloClient } from 'apollo-client';\r\nimport { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';\r\n\r\n/*\r\n INTROSPECTION DATA\r\n See https://www.apollographql.com/docs/react/recipes/fragment-matching.html\r\n This enables the Apollo cache to process fragments on interface types correctly.\r\n If this file does not exist, you may need to run the `jss graphql:update` script.\r\n*/\r\nimport introspectionQueryResultData from '../temp/GraphQLFragmentTypes.json';\r\n\r\n/*\r\n QUERY LINK SELECTION\r\n A link is transport which GraphQL queries are pushed across.\r\n You have many choices.\r\n See the apollo-link documentation for more details.\r\n\r\n NOTE: to use Sitecore Experience Editor it is essential that your\r\n link passes cookies along with requests (credentials: 'include').\r\n*/\r\n\r\n// choose between a basic HTTP link to run queries...\r\n// import { createHttpLink } from 'apollo-link-http';\r\n// const link = createHttpLink({ uri: endpoint, credentials: 'include' });\r\n\r\n// ...or a batched link (multiple queries within 10ms all go in one HTTP request)\r\nimport { BatchHttpLink } from 'apollo-link-batch-http';\r\n\r\n// ...and an automatic persisted query link, which reduces bandwidth by using query hashes to alias content\r\n// the APQ link is _chained_ behind another link that performs the actual HTTP calls, so you can choose\r\n// APQ + batched, or APQ + http links for example.\r\nimport { createPersistedQueryLink } from 'apollo-link-persisted-queries';\r\n\r\nexport default function(endpoint, ssr, initialCacheState) {\r\n /* HTTP link selection: default to batched + APQ */\r\n const link = createPersistedQueryLink().concat(\r\n new BatchHttpLink({ uri: endpoint, credentials: 'include' })\r\n );\r\n\r\n const cache = new InMemoryCache({\r\n fragmentMatcher: new IntrospectionFragmentMatcher({\r\n introspectionQueryResultData,\r\n }),\r\n });\r\n\r\n return new ApolloClient({\r\n ssrMode: ssr,\r\n ssrForceFetchDelay: 100,\r\n link,\r\n cache: cache.restore(initialCacheState),\r\n });\r\n}\r\n"],"sourceRoot":""}