{"version":3,"file":"one-upgrade.af2fd7a1a79135da.js","mappings":"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","names":["ParameterCodecInstance","ParameterCodec","encodeKey","key","encodeURIComponent","encodeValue","value","decodeKey","decodeURIComponent","decodeValue","Parameter","constructor","name","options","defaultStyle","defaultExplode","this","style","explode","serializeValue","separator","Array","map","v","split","join","array","Object","keys","propVal","push","String","PathParameter","super","append","path","prefix","alreadySerialized","replace","result","QueryParameter","params","HeaderParameter","headers","RequestBuilder","rootUrl","operationPath","method","_path","Map","_query","_header","set","query","header","body","contentType","_bodyContentType","Blob","type","pairs","val","formValue","formDataValue","_bodyContent","p","formData","FormData","toAppend","JSON","stringify","build","pathParam","values","url","httpParams","HttpParams","encoder","queryParam","httpHeaders","HttpHeaders","accept","headerParam","HttpRequest","toUpperCase","responseType","reportProgress","context","OffersSeatService","BaseService","config","http","static","GetSeatUpgradeOffersV2Path","getSeatUpgradeOffersV2$Response","rb","apiKey","bearerAuth","request","pipe","filter","r","HttpResponse","getSeatUpgradeOffersV2","__ngFactoryType__","i0","i1","i2","_angular_core__WEBPACK_IMPORTED_MODULE_6__","jDH","factory","ɵfac","providedIn","setStage","createAction","props","setError","clearErrors","clearPending","setWaitlisted","setSplitPNR","all","union","PaymentType","money","points","EUROPE_UPGRADE","LONG_HAUL_UPGRADE","COMPLIMENTARY","UPGRADE_BENEFIT","UpgradeError","none","httpError","notAvailable","alreadyUpgraded","inProgress","upgradeClosed","notFinnair","notLoggedIn","insufficientPayment","notPossible","notAvailableAccount","waitlistOnly","noRemainingUpgrades","paymentError","maintenance","InvalidUpgradeError","invalidBookingRef","infant","paxCount","group","invalidSSR","ErrorType","error","setBookingRef","loadPNR","setUpgradeData","flightSummary","logout","setLoggedIn","addPaxToBasket","addFlightToBasket","removeFlight","removePassenger","updateFlight","clearBasket","clearFlights","clearPassengers","upgradeFlights","setDeepLinkSource","setUpgradeResponse","clearDeepLinkSource","clearAll","openModal","data_actions_clearFlights","data_actions_clearPassengers","closeModal","confirmModal","getUpgradeByCabin","cabin","upgrades","UpgradeProduct","EconomyToBusiness","Cabin","Business","PremiumeconomyToBusiness","EconomyToPremiumeconomy","Ecopremium","find","upgrade","upgradeProductName","getCabinFromUpgrade","getCabinFromUpgradeName","productName","getUpgradeFromFlight","flight","getPaymentFromFlight","paymentType","getPaymentFromUpgrade","paymentOptions","EMPTY_PAYMENT_TOTAL","currency","calculatePaymentTotal","selectedFlights","passengerCount","buyer","reduce","acc","extendedFlight","payment","paymentAsMoney","parseFloat","price","paymentAsPoints","isLongHaulUpgraded","segmentInfo","longHaul","undefined","priceWithLongHaul","paymentAsVoucher","originalEuropeVouchers","vouchers","voucher","VoucherType","EuropeUpgrade","count","flightBasket","getVoucherAmount","voucherType","user","getBuyerVouchersCount","x","createPaymentObject","flightsBasket","payments","longHaulDiscount","initialState","booking","summary","flights","passengers","source","upgradeResponse","dataReducer","createReducer","on","AuthActions","state","lastName","recLoc","slice","DataActions","getFlights","pending","stage","Stage","LOGIN","userLoggedIn","waitlisted","splitPNR","statusReducer","StatusActions","loggedIn","UpgradeActions","passengerIds","basketReducer","BasketActions","passengerId","includes","passenger","flightId","stateFlight","modal","returnTarget","modalReducer","ModalActions","reducers","data","reducer","action","status","basket","flightsToJourneys","grouped","accumulator","sort","a","b","ordinal","getNumberOfFlightsInBound","singleFlight","numberOfFlights","forEach","getFlightsAsBookingLocationCodes","segments","originLocationCode","boardPoint","destinationLocationCode","length","offPoint","isTripLead","FinnairPassengerCode","ADT","isChild","child","selectUpgradeState","createFeatureSelector","selectDataState","createSelector","getUser","getBookingRef","getPassengers","fromData","getMaxPassengers","hasWaitlistOption","maxPax","maxPax2","isWaitlist","Math","max","seatsAvailable","getJourneys","flightUtils","getJourneySummary","getDeepLinkSource","getMinimumPaymentOptions","cur","min","calculateMinimumPayment","flat","Boolean","getUpgradeResponse","selectStatusState","getStage","getError","getStatusPending","getWaitlisted","getSplitPNR","selectBasketState","getBasketPassengerIds","getBasketFlights","getOriginalBalance","LongHaulUpgrade","UpgradeBenefit","getPaymentTotal","getMoneyPaymentNotSelected","paymentTotal","getBasketPassengerData","enrichSelectedPaxWithInfo","selectedPax","pax","getChildIsTravellingAlone","childIsTravellingAlone","notSelectedPax","amountOfChildrenToUpgrade","amountOfTripLeadsToUpgrade","amountOfChildrenNotToUpgrade","amountOfTripLeadsNotToUpgrade","selectModalState","$event","_r1","ctx_r1","onSubmit","closeErrorNotification","imageData$","mainError$","disruptions$","personalized$","tmp_7_0","prefillableBookingRef$","tmp_8_0","filteredTemplate$","LoginComponent","store","pageService","subscription","Subscription","ngOnInit","template$","getPageDataAndSetMeta","RootPaths","ONE_UPGRADE_ROOT","currentStage$","select","filterWithoutType","CmsViewType","DISRUPTIONS","filterWithoutContentType","CmsContentType","CMPersonalized","template","main","findByType","item","personalizedContent","items","err","combineLatest","bookingRef","mainError","isPresent","take","_mainError","content","obj","CMPlaceholder","picture","dispatch","event","core","VBU","selectors","decls","vars","consts","rf","ctx","LoginComponent_ng_container_0_Template","sortByPaymentType","UpgradePaymentService","languageService","currencyService","flights$","selectedPassengers$","selectedFlights$","paymentTotal$","buyer$","getPriceForSelectedFlight","id","first","switchMap","selectedPassengers","passengerAmount","selected","shortHaulDiscount","getFormattedPaymentAmount","getValueForPaymentOption","getAllSelectedPayments","totalPrice","getFormattedMoney","getFormattedPoints","getFormattedVouchers","labels","label","paymentOption","getVoucherTypeFromPaymentType","amount","translate","voucherAmount","of","moneyPrice","formatPrice","toString","currencyCode","pointsAmount","allowZero","i18n","formattedPoints","thousandSeparator","isInsufficient$","snapshot","i3","basketHasWaitlistUpgrade","UpgradeAnalyticsLegacyService","store$","sentry","gtmService","subscriptions","dateFormat","upgradePaymentTypeMap","UpgradePaymentType","ECOPREMIUM_CASH","ECOPREMIUM_POINTS","ECOPREMIUM_SHORT_HAUL_VOUCHER","ECOPREMIUM_LONG_HAUL_VOUCHER","ECOPREMIUM_COMPLIMENTARY","BUSINESS_CASH","BUSINESS_POINTS","BUSINESS_SHORT_HAUL_VOUCHER","BUSINESS_LONG_HAUL_VOUCHER","BUSINESS_COMPLIMENTARY","ngOnDestroy","unsubscribe","sendUpgradePurchaseEvent","add","subscribe","dataState","dateTranslations","hasPaidWithMoney","totalPointsSpent","totalMoneySpent","haulType","HaulType","SHORT","Number","LONG","upgradePurchase","activeCurrency","purchaseSource","origin","destination","departure","DateFormat","format","departureDateTime","Pattern","return","arrivalDateTime","ecommerce","purchase","actionField","createActionIdForJourney","revenue","products","generateBasketFlight","sendTrackingEvent","e","message","stack","startTime","endTime","locationsAndStartTime","locations","getTripTypeFromBookingLocationCodes","TripType","MULTICITY","location","getLocationsForGAString","bookingRefAndUpgradeStatus","category","generateIdForFlightInBasket","brand","quantity","GtmCustomMetrics","POINTS_SPENT","UpgradePaymentShortType","UNKNOWN","CASH","VOUCHER","POINTS","gaEvent","pushEventToDataLayer","GtmEvent","UPGRADE_PURCHASE","i4","UpgradeAnalyticsService","upgradeAnalyticsLegacyService","sendAddRemoveEvent","gtmEvent","basketPassengers","fullFlight","ecommerceEventGA4","mapUpgradestoGAProduct","sendViewCartEvent","getGa4PurchaseData","VIEW_CART","ecomNew","sendInitiateCheckoutEvent","BEGIN_CHECKOUT","sendPurchaseEvent","PURCHASE","basketFlights","_dateTranslations","allLocations","transactionEvent","points_used","all_locations","ecommercePurchaseEventGa4","getTransactionId","bookingLocationCodes","tripType","dateTime","TzDate","now","toISOString","locationCodesAsString","RETURN","locationCodes","CmsTripTypeMap","transaction_id","affiliation","GA4Affiliation","MMB","tax","shipping","basketFlight","originCode","destinationCode","paymentInfo","product","item_id","item_name","item_category","GA4Category","ANCILLARIES","item_category2","Ga4AncillaryType","UPGRADE","item_category3","item_category4","item_category5","Ga4UpgradeWaitlist","WAITLISTED","NOT_WAITLISTED","item_variant","ctx_r2","mapTransportTypeToIcon","transportType_r1","type_r2","SvgLibraryIcon","STOPOVER","REVIEW","flightInBasket$","transportTypeI18n_r4","cabin_r5","BoundCardComponent_ng_container_21_fcom_tag_1_Template","getFlightTypeI18n","flightInBasket_r6","transportType","BoundCardComponent_div_31_span_1_Template","BoundCardComponent_div_31_span_2_Template","FLIGHTS","_c4","_c5","BoundCardComponent","UpgradeStatus","Breakpoint","TransportType","Bus","arrival","BUS","Train","TRAIN","Flight","ARRIVAL","DEPARTURE","Unknown","HELP","getFlightById","resolveTails","airlineCode","resolveTailName","formatDuration","minutes","hours","floor","ceil","milliseconds","Economy","toLowerCase","showAsStopOver","currentFlight","searchOrdinal","foundFlight","allFlights","inputs","last","highlighted","bordered","ngContentSelectors","_c0","BoundCardComponent_ng_template_0_Template","BoundCardComponent_ng_template_2_Template","BoundCardComponent_ng_container_8_Template","BoundCardComponent_ng_container_10_Template","BoundCardComponent_fcom_tag_20_Template","BoundCardComponent_ng_container_21_Template","BoundCardComponent_div_31_Template","BoundCardComponent_span_34_Template","BoundCardComponent_span_36_Template","BoundCardComponent_span_38_Template","BoundCardComponent_div_41_Template","iconForStopover_r8","iconForFlight_r7","_c1","_c2","_c3","ctx_r0","flightNumber","JourneyInfoComponent_ng_template_0_span_0_Template","JourneyInfoComponent_ng_template_0_span_1_Template","JourneyInfoComponent_ng_template_0_span_2_Template","isDeparture","isReturn","isMultiCity","bounds","JourneyInfoComponent_ng_container_2_h2_1_ng_container_1_Template","headingContent_r2","JourneyInfoComponent_ng_container_2_h3_2_ng_container_1_Template","amount_r3","JourneyInfoComponent_ng_container_2_span_4_ng_container_1_Template","JourneyInfoComponent_ng_container_2_span_4_ng_template_2_Template","directFlightAriaText_r4","JourneyInfoComponent_ng_container_2_ng_container_6_span_1_Template","JourneyInfoComponent_ng_container_2_ng_container_6_span_2_Template","JourneyInfoComponent_ng_container_2_ng_container_6_span_3_Template","JourneyInfoComponent_ng_container_2_h2_1_Template","JourneyInfoComponent_ng_container_2_h3_2_Template","JourneyInfoComponent_ng_container_2_span_4_Template","JourneyInfoComponent_ng_container_2_ng_container_6_Template","headingLevel","JourneyInfoComponent","JourneyInfoComponent_ng_template_0_Template","JourneyInfoComponent_ng_container_2_Template","noUpgradesMessage_r1","selectedAmount_r2","ReviewBoundsComponent_ng_template_2_p_7_ng_container_2_Template","ReviewBoundsComponent_ng_template_2_p_7_ng_container_3_Template","_r3","flight_r4","ctx_r4","NotificationLayout","BLOCK","ReviewBoundsComponent_ng_template_2_ng_container_1_Template","ReviewBoundsComponent_ng_template_2_ng_container_2_Template","ReviewBoundsComponent_ng_template_2_p_7_Template","ReviewBoundsComponent_ng_template_2_fcom_notification_9_Template","printPrice","isWaitlisted","flight_r7","numberOfFlights_r6","ReviewBoundsComponent_div_4_div_4_ng_container_2_div_1_Template","ReviewBoundsComponent_div_4_div_4_ng_container_2_Template","bounds_r10","first_r9","last_r8","isBeingUpgraded","getNumberOfFlights","upgradeMessage_r12","notUpgradedMessage_r11","noUpgradesMessage","_r13","onFlightsChange","ReviewBoundsComponent_div_4_div_4_Template","ReviewBoundsComponent_div_4_div_5_Template","last_r15","index_r14","journeysWithUpgrades$","getAllBoundsForJourney","boundHasAvailableUpgrades","ReviewBoundsComponent","upgradePaymentService","journeys","journey","matchingFlight","selectedFlight","getNoUpgradesMessage","idsInJourney","bound","some","stopPropagation","title","fragment","buttons","ModalButtons","DONE","upgradeNotAvailable","upgradeStatus","NotAvailable","every","Failed","ecoToPE","peToBiz","ecoToBiz","Waitlisted","Success","hasUpgrades","Available","ReviewBoundsComponent_ng_template_0_Template","ReviewBoundsComponent_ng_template_2_Template","ReviewBoundsComponent_div_4_Template","SINGLE_PAX","getSelectedName","selectedPassenger_r1","PassengerSelectionComponent_ng_container_0_ng_container_2_div_3_div_1_Template","onChangePassengers","PassengerSelectionComponent_ng_container_0_ng_container_2_h2_1_Template","PassengerSelectionComponent_ng_container_0_ng_container_2_div_3_Template","PassengerSelectionComponent_ng_container_0_ng_container_2_div_5_Template","passengers$","PassengerSelectionComponent_ng_container_0_ng_container_2_Template","PASSENGERS","passengerSelectionForm_r4","passenger_r6","_r5","ngIf","onPassengerToggle$","next","PassengerSelectionComponent_ng_template_2_form_0_ng_container_2_fcom_checkbox_1_span_4_Template","i_r7","PassengerSelectionComponent_ng_template_2_form_0_ng_container_2_fcom_checkbox_1_Template","getPassengerDetails","seatInfoText","PassengerSelectionComponent_ng_template_2_form_0_ng_container_2_Template","PassengerSelectionComponent_ng_template_2_form_0_div_3_Template","passengerForm","passengerControls","showPaxLimit$","PassengerSelectionComponent_ng_template_2_form_0_Template","PassengerSelectionComponent","fb","language","toaster","Subject","maxPassengers$","minPaymentOptions$","loggedInProfile$","profileOrUndefinedIfNotLoggedIn","user$","childIsTravellingAlone$","paxStream$","atPaymentLimit","share","constructForm","showMaxPaxToaster","showToaster","toggleToaster","distinctUntilChanged","withLatestFrom","togglePassenger","get","controls","index","pluck","paymentLimit","hidden","control","disabled","Validators","required","capitalize","firstName","contentKey","addMessageToQueue","autoClose","beneathModal","removeMessage","PassengerSelectionComponent_ng_container_0_Template","PassengerSelectionComponent_ng_template_2_Template","ReviewComponent_ng_container_4_span_10_ng_container_2_Template","payment_r1","last_r2","ReviewComponent_ng_container_4_span_10_Template","selectedPayments$","ReviewComponent","upgradeAnalyticsService","LoaderTheme","loading$","ngAfterViewInit","reviewHeading","nativeElement","focus","viewQuery","ReviewComponent_ng_container_4_Template","ErrorComponent_ng_template_0_cms_unstyled_fragment_6_Template","PET","errorType","ErrorComponent_ng_container_4_ng_container_3_ng_container_1_Template","maintenance_r4","ErrorComponent_ng_container_4_ng_container_4_ng_container_1_Template","paymentError_r5","bookingRef_r6","journey_r7","ErrorComponent_ng_container_4_ng_container_5_ng_container_11_ng_container_1_Template","ErrorComponent_ng_container_4_ng_container_5_ng_container_9_Template","ErrorComponent_ng_container_4_ng_container_5_ng_container_11_Template","upgradeError_r8","bookingRef$","journey$","ErrorComponent_ng_container_4_ng_container_3_Template","ErrorComponent_ng_container_4_ng_container_4_Template","ErrorComponent_ng_container_4_ng_container_5_Template","onStartOver","ButtonSize","LARGE","cta","ErrorComponent","route","router","configService","ButtonTheme","upgradeError$","getMMBViewPath","langValue","MANAGE_BOOKING_ROOT","MANAGE_BOOKING_STEPS","VIEW","cfg","enableUpgradeTravelClass","_this","_asyncToGenerator","hasOrderData","tap","home","root","firstChild","navigate","hasOrderDataValue","replaceUrl","ErrorComponent_ng_template_0_Template","ErrorComponent_ng_template_2_Template","ErrorComponent_ng_container_4_Template","_r2","redirectToMMB","ARROW_RIGHT","IconPosition","RIGHT","SuccessComponent","analyticsService","platform","survey","QualtricsSurveys","UPGRADE_FEEDBACK","surveyOpen","storeData$","basketFlights$","basketPassengers$","waitlisted$","splitPNR$","isPlatformServer","setNotificationsAndGAEvent","getFragment","serializeParams","navigateByUrl","openSurvey","PLATFORM_ID","features","DateFormatPipe","SuccessComponent_cms_unstyled_fragment_3_Template","SuccessComponent_div_16_Template","UpgradeService","GetUpgradeStatusPath","getUpgradeStatus$Response","upgradeId","getUpgradeStatus","GetUpgradeStatusV2Path","getUpgradeStatusV2$Response","getUpgradeStatusV2","UpgradePath","upgrade$Response","UpgradeV2Path","upgradeV2$Response","upgradeV2","UpgradeAuthenticatedPath","upgradeAuthenticated$Response","upgradeAuthenticated","UpgradeV2AuthenticatedPath","upgradeV2Authenticated$Response","upgradeV2Authenticated","NotificationsService","ReceiveCheckoutNotificationsPath","receiveCheckoutNotifications$Response","sigv4","clone","receiveCheckoutNotifications","Receive3DsConfirmationsPath","receive3DsConfirmations$Response","receive3DsConfirmations","ReceiveCheckoutNotificationsV2Path","receiveCheckoutNotificationsV2$Response","receiveCheckoutNotificationsV2","Receive3DsConfirmationsV2Path","receive3DsConfirmationsV2$Response","receive3DsConfirmationsV2","CheckoutService","InfoService","GetInfoPath","getInfo$Response","getInfo","GetInfoV2Path","getInfoV2$Response","getInfoV2","UpgradeFlightsService","loggedIn$","loginStatus","LoginStatus","LOGGED_IN","profileType$","profileTypeSelector","apiUpgradeService","document","upgradeResponse$","profileType","upgradeUrl","email","locale","paymentFailUrl","paymentSuccessUrl","getFlightsToUpgrade","ProfileType","FPLUS","response","Error","catchError","throwError","concat","DOCUMENT","POLLING_DONE_STATUSES","UpgradeFinalStatus","PaymentFailed","HandledByCustomerCare","PaymentInProgress","InProgress","PaymentDone","ProcessingComponent","upgradeService","checkUpgradeStatus","getUpgradeStatus$","interval","takeWhile","paymentIsInitializing","throwIfEmpty","EmptyError","SUCCESS","ERROR","amount_r2","isMobile_r4","tooltipOptionsMobile","tooltipOptions","contentTooltip_r6","StatusBarComponent_ng_template_0_div_4_Template","StatusBarComponent_ng_template_0_div_5_Template","name_r7","showTooltip_r8","walletItem_r10","_c7","availableBenefits_r9","_c8","isMobile_r11","_c9","StatusBarComponent_ng_template_2_ng_container_0_ng_container_1_ng_container_2_Template","StatusBarComponent_ng_template_2_ng_container_0_ng_container_1_ng_container_3_Template","StatusBarComponent_ng_template_2_ng_container_0_ng_container_1_ng_container_4_Template","_c6","enableUpgradeBenefits","originalBalance_r12","StatusBarComponent_ng_template_2_ng_container_0_ng_container_1_Template","originalBalance$","StatusBarComponent_ng_template_2_ng_container_0_Template","availableBenefits$","CLOSE_DELETE","WALLET_OPEN","WALLET_CLOSED","StatusBarComponent","ANIMATION_DURATION","renderer","window","toasterService","mediaQueryService","storageService","accordionOpen","upgradeBenefitTooltipId","upgradeBenefitTooltipSeenKey","popoverID","popoverPosition","PopoverPosition","BOTTOM","popoverWidth","openByDefault","enableOnClick","showCloseButton","zIndex","journeySummary$","enableUpgradeBenefitInUpgrade","bookingSummary$","bookingLocations","tripDates","getDatesForJourney","groupedFlights","returningFlight","dates","departureDate","toLocalDate","ONEWAY","returnDate","paxAmount","getRemainingBalance","LOCAL","isBreakpoint$","originalBalance","isTabletDown","setTimeout","contentHTML","toasterContent","innerHTML","theme","NotificationTheme","INFO","keepMessageAfterNavigation","flightsInBasket","bookingSummary","remainingBalance","clearTimeout","timeoutRef","isPlatformBrowser","nativeWindow","cancelAnimationFrame","frameRef","toggleWallet","slideAccordionIn","showOverlay","slideAccordionOut","hideOverlay","openHelpModal","showAcc","targetHeight","getAccHeight","requestAnimationFrame","setAccHeight","hideAcc","addClass","setStyle","walletOverlay","removeClass","statusAccordion","offsetHeight","setAccStyle","prop","StatusBarComponent_ng_template_0_Template","StatusBarComponent_ng_template_2_Template","StatusBarComponent_ng_template_4_Template","StatusBarComponent_ng_template_6_Template","StatusBarComponent_fin_booking_header_summary_26_Template","StatusBarComponent_fcom_icon_38_Template","StatusBarComponent_ng_template_41_Template","walletStatus_r14","logInText_r15","HELP_OUTLINE","walletIcon_r16","ContinueFooterComponent_div_14_ng_container_2_Template","ContinueFooterComponent","ButtonPosition","ElementTypes","loading","flightsBasket$","passengerStageCompleted$","shouldSplitPnr","continueButtonI18n$","hasMoneyPayment","onContinue","openPnrSplitModal","moveToNextStage","openReviewDisclaimerModal","CONTINUE_CANCEL","handlers","confirm","confirmUpgrade","ContinueFooterComponent_div_14_Template","ContinueFooterComponent_ng_container_16_Template","GRID_FULL","BUTTON","UpgradeModalComponent_fcom_modal_0_cms_unstyled_fragment_2_Template","modal_r4","open","UpgradeModalComponent","element","openModal$","parentElement","retTarget","close","querySelector","UpgradeModalComponent_fcom_modal_0_Template","toggleMenu","navigateToStep","loginDialog","toggleLogin","onHomeClick","onBackClick","loginStatus$","breadcrumbs$","homeUrl","showBack","profileName$","LoginWidgetContext","BOOKING","OneUpgradeLayoutComponent_ng_container_0_fin_header_2_Template","OneUpgradeLayoutComponent_ng_container_0_fcom_booking_header_3_Template","OneUpgradeLayoutComponent_ng_container_0_fin_login_dialog_4_Template","OneUpgradeLayoutComponent_ng_container_0_fin_upgrade_status_bar_5_Template","OneUpgradeLayoutComponent_ng_container_0_fin_upgrade_continue_footer_9_Template","showBookingHeader","showStatusBar","addWrappingStyles","OneUpgradeLayoutComponent","navigationMenuService","isNavigationMenuOpen$","events","isNavigationEvent","pathRelativeToUpgradeRoot","profileName","currentStage","LOADING","PROCESSING","shouldShowBackButton","breadcrumbs","formatBreadcrumbs","toggleMenuOpen","step","BREADCRUMBS","translationKey","active","currentBreadcrumb","breadcrumb","toStage","DeepLinkSource","FCOM","OneUpgradeLayoutComponent_ng_container_0_Template","PNRGuard","canActivate","LoginGuard","sentryLogger","activatedRoute","setSource","queryParamMap","warn","_state","has","relativeTo","queryParams","queryParamsHandling","orderState","hasOrder","order","orderData","OneUpgradeGuard","maintenanceConfigService","mapPathToStage","matchedStage","canActivateChild","childRoute","parentPath","parent","pathFromRoot","getParentPath","getStatusForFeature","MaintenanceConfigFeature","ONE_UPGRADE","isDisabled","pathAsStage","parseUrl","ProcessingGuard","deny","BasketGuard","SinglePaxGuard","SuccessGuard","isAuthenticatedPlusMember","profile","tier","ProfileTier","CORPORATE","ACCOUNT","RefetchGuard","loginStatusChanged","hadPoints","isAuthenticated","hasChanged","LoadingComponent","beforeUnload","timer","OFFERS_V2_TIMEOUT","hostBindings","PassengersSelectionComponent","PassengersSelectionComponent_ng_container_3_Template","showPaymentMethods","cabinClass_r4","flight_r3","paymentMethods_r7","boundStatusInfo_r6","passengers_r1","UpgradeBoundsComponent_ng_template_0_ng_container_0_Template","getNotAvailableReason","flight_r8","tabSettings_r11","subtitle","singleUpgrade_r12","flight_r10","_r9","emitTabChange","UpgradeBoundsComponent_ng_template_4_fcom_tabs_0_fcom_tab_3_Template","UpgradeBoundsComponent_ng_template_4_fcom_tabs_0_fcom_tab_4_Template","TabTheme","CLASSIC","TabLayoutType","STRETCH","UpgradeBoundsComponent_ng_template_4_fcom_tabs_0_Template","getTabSettings","UpgradeBoundsComponent_ng_container_6_ng_container_2_Template","flight_r13","first_r15","last_r14","shouldRenderTabs","tabs_r17","notAvailable_r16","upgradeStatus_r18","icon","text","numberOfSeats","UpgradeBoundsComponent_ng_template_7_ng_container_0_Template","getUpgradeStatusNotificationConfig","cabin_r19","flight_r20","passengers_r21","_r22","ctx_r22","flight_r24","upgrade_r25","tooltipContent_r30","HELP_BLOCK","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_ng_container_1_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_ng_container_2_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_ng_container_3_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_ng_container_4_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_ng_container_5_Template","tooltipName_r31","TooltipType","NotEnoughPoints","NotEnoughVouchers","NoCardPayment","CantCombine","NotEnoughLongHaulVouchersForPax","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_div_0_Template","getTooltip","option_r28","i_r29","ctx_r26","_r26","$implicit","emitChange","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_container_16_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_button_18_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_ng_template_19_Template","cabin_r33","printPaymentValue","showWaitlistInfo","passengers_r34","UpgradeBoundsComponent_ng_template_9_fcom_notification_2_Template","UpgradeBoundsComponent_ng_template_9_ng_container_4_Template","UpgradeBoundsComponent_ng_template_9_span_7_Template","paymentForm","moneyAsLast","trackPayments","bind","UpgradeBoundsComponent","_bounds","cd","markForCheck","_paymentForm","changeTabMethod","EventEmitter","changePaymentMethod","activeTab","hasEnoughSeats","i","premiumEconomyAvailable","businessAvailable","enabledTab","selectedPaymentOption$","statusMap","peSubtitle$","businessSubtitle$","selectedPaymentOption","peSubtitle","businessSubtitle","selectedPaymentOptionPe","selectedPaymentOptionBusiness","numberOfPassengers","CHECKMARK","ALERT_BLOCK","ALERT","getSeatsAvailableText","notAvailableErr","UpgradeStatusReason","TooCloseToDeparture","NotFinnairFlight","SsrInBooking","TooFarToDeparture","TooCloseToDepartureForWaitlist","SegmentInRequestedUpgradeCabin","SegmentMissingRequestedUpgradeCabin","TicketNotIssuedByFinnair","IneligibleBookingClass","BookingInIneligibleStatus","FlownSegment","upgradeStatusReason","getUpgradePaymentOptions","emit","business","premiumEconomy","trackByFn","_index","elemIndex","option","upgradeProduct","isInsufficientPayment","upgradeBenefits","outputs","UpgradeBoundsComponent_ng_template_0_Template","UpgradeBoundsComponent_ng_template_2_Template","UpgradeBoundsComponent_ng_template_4_Template","UpgradeBoundsComponent_ng_container_6_Template","UpgradeBoundsComponent_ng_template_7_Template","UpgradeBoundsComponent_ng_template_9_Template","paymentMethodChanged$","flightTabChanged$","last_r5","index_r4","journeys$","bounds_r3","UpgradeFlightsComponent","paymentService","flightThatChanged","cabinClass","forceSinglePaymentOptionForFlight","updateFlightBasket","flightIsDeselected","flightTabChanged","setValue","showLongHaulToast","added","removed","showWaitlistToast","hasWaitlist","groups","Set","f","from","scan","prev","inputArrays","premiumEconomyUpgrade","businessUpgrade","UntypedFormGroup","UntypedFormArray","generateInputFormControl","updatePaymentForm","flightGroup","cabinArray","paymentUtils","paymentName","paymentIsAlreadySelected","selectFreeOption","UntypedFormControl","isPaymentOptionDisabled","flightInBasket","REMOVE_FROM_CART","ADD_TO_CART","selectedPayments","isSelected","UpgradeFlightsComponent_div_0_Template","oneUpgradeRoutes","component","children","FlightsSelectionComponent","FlightsSelectionComponent_ng_container_3_Template","redirectTo","OneUpgradeRouteModule","$C","G2t","RouterModule","forChild","ApiModule","forRoot","ngModule","providers","provide","ApiConfiguration","useValue","parentModule","OffersService","StatusEffects","lang","actions$","scrollService","stage$","createEffect","ofType","scrollTop","UpgradeFlightsEffects","upgrade$","exhaustMap","moneyPaymentNotSelected","href","EMPTY","fixtures","AB23CD","firstNameWithTitle","carrierCode","departureDateTimeLocal","arrivalDateTimeLocal","durationInMinutes","travelClass","segmentTattoo","BC23DE","CD23EF","DE23FG","EF23GH","FG23HI","apiOffersService","getOffers","shouldUseMemberEndpoint","getUpgradeRequest$","delay","getOffersV2Authenticated","getOffersV2","timeout","errorDetail","details","setSummary","checkFlightStatusAndThrow","checkFlightsForStatus","checkPaymentAndThrow","InfantInBooking","GroupBooking","TooManyPassengers","reason","checkFlightStatusReasonAndThrow","checkNotFinnair","finnairFlights","FINNAIR_LIKE_AIRLINECODES","codeShareCarrierCode","isWaitlistPeriod","date","millis","Date","WAITLIST_CUTOFF","statusReason","anyFlightHasStatusReason","getMinimumPoints","pointsForAllUpgrades","flatMap","minPaxAmountToUpgrade","getMinPaxAmountToUpgrade","amountOfChildren","minPoints","hasEnoughPoints","hasEnoughVouchers","AuthEffects","offersService","loadPnr$","replaceState","i5","OneUpgradeModule","iconsPreloadService","preloadIcons","IconLibrary","SVG_LIBRARY","CHECKBOX_SELECTED","CHECKBOX_UNSELECTED","CmsPageService","FragmentService","imports","CommonModule","FormsModule","withConfig","callSetDisabledState","ReactiveFormsModule","UiComponentsModule","ComponentsModule","DirectiveModule","GtmModule","PipesModule","StoreModule","forFeature","UPGRADE_FEATURE_KEY","EffectsModule","UiTranslateModule","LoginModule","NavigationModule","BookingCommonModule","LocationsModule","ImagesModule","CmsModule","QualtricsModule","CommonBookingComponentsModule","PnrWidgetModule","_rootUrl","_angular_core__WEBPACK_IMPORTED_MODULE_1__","oneUpgradeRootUrl","upgradeApiGwKey"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/modules/one-upgrade/api/request-builder.ts","./src/modules/one-upgrade/api/services/offers-seat.service.ts","./src/modules/one-upgrade/store/actions/status.actions.ts","./src/modules/one-upgrade/interfaces/payment-type.interface.ts","./src/modules/one-upgrade/interfaces/upgrade-error.interface.ts","./src/modules/one-upgrade/interfaces/error-type.interface.ts","./src/modules/one-upgrade/store/actions/auth.actions.ts","./src/modules/one-upgrade/store/actions/basket.actions.ts","./src/modules/one-upgrade/store/actions/upgrade.actions.ts","./src/modules/one-upgrade/store/actions/data.actions.ts","./src/modules/one-upgrade/store/actions/modal.actions.ts","./src/modules/one-upgrade/utils/data.utils.ts","./src/modules/one-upgrade/utils/payment.utils.ts","./src/modules/one-upgrade/store/reducers/data.reducer.ts","./src/modules/one-upgrade/store/reducers/status.reducer.ts","./src/modules/one-upgrade/store/reducers/basket.reducer.ts","./src/modules/one-upgrade/store/reducers/modal.reducer.ts","./src/modules/one-upgrade/store/reducers/index.ts","./src/modules/one-upgrade/utils/flight.utils.ts","./src/modules/one-upgrade/utils/passenger.utils.ts","./src/modules/one-upgrade/store/selectors/index.ts","./src/modules/one-upgrade/views/login/login.component.html","./src/modules/one-upgrade/views/login/login.component.ts","./src/modules/one-upgrade/services/upgrade-payment.service.ts","./src/modules/one-upgrade/utils/basket.utils.ts","./src/modules/one-upgrade/services/upgrade-analytics-legacy.service.ts","./src/modules/one-upgrade/services/upgrade-analytics.service.ts","./src/modules/one-upgrade/components/bound-card/bound-card.component.html","./src/modules/one-upgrade/components/bound-card/bound-card.component.ts","./src/modules/one-upgrade/components/journey-info/journey-info.component.html","./src/modules/one-upgrade/components/journey-info/journey-info.component.ts","./src/modules/one-upgrade/components/review-bounds/review-bounds.component.html","./src/modules/one-upgrade/components/review-bounds/review-bounds.component.ts","./src/modules/one-upgrade/components/passenger-selection/passenger-selection.component.html","./src/modules/one-upgrade/components/passenger-selection/passenger-selection.component.ts","./src/modules/one-upgrade/views/review/review.component.html","./src/modules/one-upgrade/views/review/review.component.ts","./src/modules/one-upgrade/views/error/error.component.html","./src/modules/one-upgrade/views/error/error.component.ts","./src/modules/one-upgrade/views/success/success.component.html","./src/modules/one-upgrade/views/success/success.component.ts","./src/modules/one-upgrade/api/services/upgrade.service.ts","./src/modules/one-upgrade/api/services/notifications.service.ts","./src/modules/one-upgrade/api/services/checkout.service.ts","./src/modules/one-upgrade/api/services/info.service.ts","./src/modules/one-upgrade/services/upgrade-flights.service.ts","./src/modules/one-upgrade/views/processing/processing.component.ts","./src/modules/one-upgrade/views/processing/processing.component.html","./src/modules/one-upgrade/components/status-bar/status-bar.component.html","./src/modules/one-upgrade/components/status-bar/status-bar.component.ts","./src/modules/one-upgrade/components/continue-footer/continue-footer.component.html","./src/modules/one-upgrade/components/continue-footer/continue-footer.component.ts","./src/modules/one-upgrade/components/modal/modal.component.html","./src/modules/one-upgrade/components/modal/modal.component.ts","./src/modules/one-upgrade/views/layout/layout.component.html","./src/modules/one-upgrade/views/layout/layout.component.ts","./src/modules/one-upgrade/guards/pnr.guard.ts","./src/modules/one-upgrade/guards/login.guard.ts","./src/modules/one-upgrade/guards/one-upgrade.guard.ts","./src/modules/one-upgrade/utils/get-parent-path.utils.ts","./src/modules/one-upgrade/guards/processing.guard.ts","./src/modules/one-upgrade/guards/basket.guard.ts","./src/modules/one-upgrade/guards/single-pax.guard.ts","./src/modules/one-upgrade/guards/success.guard.ts","./src/modules/one-upgrade/utils/profile.utils.ts","./src/modules/one-upgrade/guards/refetch.guard.ts","./src/modules/one-upgrade/views/loading/loading.component.ts","./src/modules/one-upgrade/views/loading/loading.component.html","./src/modules/one-upgrade/views/passengers-selection/passengers-selection.component.html","./src/modules/one-upgrade/views/passengers-selection/passengers-selection.component.ts","./src/modules/one-upgrade/components/upgrade-bounds/upgrade-bounds.component.html","./src/modules/one-upgrade/components/upgrade-bounds/upgrade-bounds.component.ts","./src/modules/one-upgrade/components/upgrade-flights/upgrade-flights.component.html","./src/modules/one-upgrade/components/upgrade-flights/upgrade-flights.component.ts","./src/modules/one-upgrade/views/flights-selection/flights-selection.component.html","./src/modules/one-upgrade/one-upgrade.routes.ts","./src/modules/one-upgrade/views/flights-selection/flights-selection.component.ts","./src/modules/one-upgrade/api/api.module.ts","./src/modules/one-upgrade/store/effects/status.effects.ts","./src/modules/one-upgrade/store/effects/upgrade-flights.effects.ts","./src/modules/one-upgrade/fixtures/AB23CD.ts","./src/modules/one-upgrade/fixtures/index.ts","./src/modules/one-upgrade/fixtures/BC23DE.ts","./src/modules/one-upgrade/fixtures/CD23EF.ts","./src/modules/one-upgrade/fixtures/DE23FG.ts","./src/modules/one-upgrade/fixtures/EF23GH.ts","./src/modules/one-upgrade/fixtures/FG23HI.ts","./src/modules/one-upgrade/services/offers.service.ts","./src/modules/one-upgrade/store/effects/auth.effects.ts","./src/modules/one-upgrade/one-upgrade.module.ts","./src/modules/one-upgrade/api/base-service.ts","./src/modules/one-upgrade/api/api-configuration.ts"],"sourcesContent":["/* tslint:disable */\n/* eslint-disable */\nimport { HttpRequest, HttpParameterCodec, HttpParams, HttpHeaders, HttpContext } from '@angular/common/http';\n\n/**\n * Custom parameter codec to correctly handle the plus sign in parameter\n * values. See https://github.com/angular/angular/issues/18261\n */\nclass ParameterCodec implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key);\n }\n\n encodeValue(value: string): string {\n return encodeURIComponent(value);\n }\n\n decodeKey(key: string): string {\n return decodeURIComponent(key);\n }\n\n decodeValue(value: string): string {\n return decodeURIComponent(value);\n }\n}\nconst ParameterCodecInstance = new ParameterCodec();\n\n/**\n * Defines the options for appending a parameter\n */\ninterface ParameterOptions {\n style?: string;\n explode?: boolean;\n}\n\n/**\n * Base class for a parameter\n */\nabstract class Parameter {\n constructor(public name: string, public value: any, public options: ParameterOptions, defaultStyle: string, defaultExplode: boolean) {\n this.options = options || {};\n if (this.options.style === null || this.options.style === undefined) {\n this.options.style = defaultStyle;\n }\n if (this.options.explode === null || this.options.explode === undefined) {\n this.options.explode = defaultExplode;\n }\n }\n\n serializeValue(value: any, separator = ','): string {\n if (value === null || value === undefined) {\n return '';\n } else if (value instanceof Array) {\n return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator);\n } else if (typeof value === 'object') {\n const array: string[] = [];\n for (const key of Object.keys(value)) {\n let propVal = value[key];\n if (propVal !== null && propVal !== undefined) {\n propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator));\n if (this.options.explode) {\n array.push(`${key}=${propVal}`);\n } else {\n array.push(key);\n array.push(propVal);\n }\n }\n }\n return array.join(separator);\n } else {\n return String(value);\n }\n }\n}\n\n/**\n * A parameter in the operation path\n */\nclass PathParameter extends Parameter {\n constructor(name: string, value: any, options: ParameterOptions) {\n super(name, value, options, 'simple', false);\n }\n\n append(path: string): string {\n let value = this.value;\n if (value === null || value === undefined) {\n value = '';\n }\n let prefix = this.options.style === 'label' ? '.' : '';\n let separator = this.options.explode ? prefix === '' ? ',' : prefix : ',';\n let alreadySerialized = false;\n if (this.options.style === 'matrix') {\n // The parameter name is just used as prefix, except in some cases...\n prefix = `;${this.name}=`;\n if (this.options.explode && typeof value === 'object') {\n prefix = ';';\n if (value instanceof Array) {\n // For arrays we have to repeat the name for each element\n value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`);\n value = value.join(';');\n alreadySerialized = true;\n } else {\n // For objects we have to put each the key / value pairs\n value = this.serializeValue(value, ';');\n alreadySerialized = true\n }\n }\n }\n value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator));\n // Replace both the plain variable and the corresponding variant taking in the prefix and explode into account\n path = path.replace(`{${this.name}}`, value);\n path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value);\n return path;\n }\n\n // @ts-ignore\n serializeValue(value: any, separator = ','): string {\n var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator);\n result = result.replace(/%3D/g, '=');\n result = result.replace(/%3B/g, ';');\n result = result.replace(/%2C/g, ',');\n return result;\n }\n}\n\n/**\n * A parameter in the query\n */\nclass QueryParameter extends Parameter {\n constructor(name: string, value: any, options: ParameterOptions) {\n super(name, value, options, 'form', true);\n }\n\n append(params: HttpParams): HttpParams {\n if (this.value instanceof Array) {\n // Array serialization\n if (this.options.explode) {\n for (const v of this.value) {\n params = params.append(this.name, this.serializeValue(v));\n }\n } else {\n const separator = this.options.style === 'spaceDelimited'\n ? ' ' : this.options.style === 'pipeDelimited'\n ? '|' : ',';\n return params.append(this.name, this.serializeValue(this.value, separator));\n }\n } else if (this.value !== null && typeof this.value === 'object') {\n // Object serialization\n if (this.options.style === 'deepObject') {\n // Append a parameter for each key, in the form `name[key]`\n for (const key of Object.keys(this.value)) {\n const propVal = this.value[key];\n if (propVal !== null && propVal !== undefined) {\n params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal));\n }\n }\n } else if (this.options.explode) {\n // Append a parameter for each key without using the parameter name\n for (const key of Object.keys(this.value)) {\n const propVal = this.value[key];\n if (propVal !== null && propVal !== undefined) {\n params = params.append(key, this.serializeValue(propVal));\n }\n }\n } else {\n // Append a single parameter whose values are a comma-separated list of key,value,key,value...\n const array: any[] = [];\n for (const key of Object.keys(this.value)) {\n const propVal = this.value[key];\n if (propVal !== null && propVal !== undefined) {\n array.push(key);\n array.push(propVal);\n }\n }\n params = params.append(this.name, this.serializeValue(array));\n }\n } else if (this.value !== null && this.value !== undefined) {\n // Plain value\n params = params.append(this.name, this.serializeValue(this.value));\n }\n return params;\n }\n}\n\n/**\n * A parameter in the HTTP request header\n */\nclass HeaderParameter extends Parameter {\n constructor(name: string, value: any, options: ParameterOptions) {\n super(name, value, options, 'simple', false);\n }\n\n append(headers: HttpHeaders): HttpHeaders {\n if (this.value !== null && this.value !== undefined) {\n if (this.value instanceof Array) {\n for (const v of this.value) {\n headers = headers.append(this.name, this.serializeValue(v));\n }\n } else {\n headers = headers.append(this.name, this.serializeValue(this.value));\n }\n }\n return headers;\n }\n}\n\n/**\n * Helper to build http requests from parameters\n */\nexport class RequestBuilder {\n\n private _path = new Map();\n private _query = new Map();\n private _header = new Map();\n _bodyContent: any | null;\n _bodyContentType?: string;\n\n constructor(\n public rootUrl: string,\n public operationPath: string,\n public method: string) {\n }\n\n /**\n * Sets a path parameter\n */\n path(name: string, value: any, options?: ParameterOptions): void {\n this._path.set(name, new PathParameter(name, value, options || {}));\n }\n\n /**\n * Sets a query parameter\n */\n query(name: string, value: any, options?: ParameterOptions): void {\n this._query.set(name, new QueryParameter(name, value, options || {}));\n }\n\n /**\n * Sets a header parameter\n */\n header(name: string, value: any, options?: ParameterOptions): void {\n this._header.set(name, new HeaderParameter(name, value, options || {}));\n }\n\n /**\n * Sets the body content, along with the content type\n */\n body(value: any, contentType = 'application/json'): void {\n if (value instanceof Blob) {\n this._bodyContentType = value.type;\n } else {\n this._bodyContentType = contentType;\n }\n if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') {\n // Handle URL-encoded data\n const pairs: Array<[string, string]> = [];\n for (const key of Object.keys(value)) {\n let val = value[key];\n if (!(val instanceof Array)) {\n val = [val];\n }\n for (const v of val) {\n const formValue = this.formDataValue(v);\n if (formValue !== null) {\n pairs.push([key, formValue]);\n }\n }\n }\n this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&');\n } else if (this._bodyContentType === 'multipart/form-data') {\n // Handle multipart form data\n const formData = new FormData();\n if (value !== null && value !== undefined) {\n for (const key of Object.keys(value)) {\n const val = value[key];\n if (val instanceof Array) {\n for (const v of val) {\n const toAppend = this.formDataValue(v);\n if (toAppend !== null) {\n formData.append(key, toAppend);\n }\n }\n } else {\n const toAppend = this.formDataValue(val);\n if (toAppend !== null) {\n formData.set(key, toAppend);\n }\n }\n }\n }\n this._bodyContent = formData;\n } else {\n // The body is the plain content\n this._bodyContent = value;\n }\n }\n\n private formDataValue(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n if (value instanceof Blob) {\n return value;\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Builds the request with the current set parameters\n */\n build(options?: {\n /** Which content types to accept */\n accept?: string;\n\n /** The expected response type */\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n\n /** Whether to report progress on uploads / downloads */\n reportProgress?: boolean;\n\n /** Allow passing HttpContext for HttpClient */\n context?: HttpContext;\n }): HttpRequest {\n\n options = options || {};\n\n // Path parameters\n let path = this.operationPath;\n for (const pathParam of this._path.values()) {\n path = pathParam.append(path);\n }\n const url = this.rootUrl + path;\n\n // Query parameters\n let httpParams = new HttpParams({\n encoder: ParameterCodecInstance\n });\n for (const queryParam of this._query.values()) {\n httpParams = queryParam.append(httpParams);\n }\n\n // Header parameters\n let httpHeaders = new HttpHeaders();\n if (options.accept) {\n httpHeaders = httpHeaders.append('Accept', options.accept);\n }\n for (const headerParam of this._header.values()) {\n httpHeaders = headerParam.append(httpHeaders);\n }\n\n // Request content headers\n if (this._bodyContentType && !(this._bodyContent instanceof FormData)) {\n httpHeaders = httpHeaders.set('Content-Type', this._bodyContentType);\n }\n\n // Perform the request\n return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, {\n params: httpParams,\n headers: httpHeaders,\n responseType: options.responseType,\n reportProgress: options.reportProgress,\n context: options.context\n });\n }\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse, HttpContext } from '@angular/common/http';\nimport { BaseService } from '../base-service';\nimport { ApiConfiguration } from '../api-configuration';\nimport { StrictHttpResponse } from '../strict-http-response';\nimport { RequestBuilder } from '../request-builder';\nimport { Observable } from 'rxjs';\nimport { map, filter } from 'rxjs/operators';\n\nimport { SeatUpgradeRequest } from '../models/seat-upgrade-request';\nimport { SeatUpgradeResponse } from '../models/seat-upgrade-response';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OffersSeatService extends BaseService {\n constructor(\n config: ApiConfiguration,\n http: HttpClient\n ) {\n super(config, http);\n }\n\n /**\n * Path part for operation getSeatUpgradeOffersV2\n */\n static readonly GetSeatUpgradeOffersV2Path = '/v2/members/offers/seat-upgrades';\n\n /**\n * Returns a list of upgrades available seat for a booking logged-in customer.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `getSeatUpgradeOffersV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n getSeatUpgradeOffersV2$Response(params: {\n body: SeatUpgradeRequest\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, OffersSeatService.GetSeatUpgradeOffersV2Path, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n if(this.config.bearerAuth){\n rb.header('Authorization', this.config.bearerAuth);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Returns a list of upgrades available seat for a booking logged-in customer.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `getSeatUpgradeOffersV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n getSeatUpgradeOffersV2(params: {\n body: SeatUpgradeRequest\n },\n context?: HttpContext\n\n): Observable {\n\n return this.getSeatUpgradeOffersV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as SeatUpgradeResponse)\n );\n }\n\n}\n","import { createAction, union, props } from '@ngrx/store';\n\nimport { Stage, UpgradeError } from '../../interfaces';\n\nexport const setStage = createAction('[One Upgrade Status] stage', props<{ stage: Stage }>());\n\nexport const setError = createAction('[One Upgrade Status] set Error', props<{ error: UpgradeError }>());\n\nexport const clearErrors = createAction('[One Upgrade Status] clear Error');\n\nexport const clearPending = createAction('[One Upgrade Status] clear Pending');\n\nexport const setWaitlisted = createAction('[One Upgrade Status] set Waitlisted', props<{ waitlisted: boolean }>());\n\nexport const setSplitPNR = createAction('[One Upgrade Status] set SplitPNR', props<{ splitPNR: boolean }>());\n\nconst all = union({ setStage, clearErrors, clearPending, setWaitlisted, setSplitPNR });\nexport type StatusActionsUnion = typeof all;\n","export enum PaymentType {\n money = 'money',\n points = 'points',\n EUROPE_UPGRADE = 'EUROPE_UPGRADE',\n LONG_HAUL_UPGRADE = 'LONG_HAUL_UPGRADE',\n COMPLIMENTARY = 'COMPLIMENTARY',\n UPGRADE_BENEFIT = 'UPGRADE_BENEFIT',\n}\n","export enum UpgradeError {\n none = 'noError',\n httpError = 'httpError',\n notAvailable = 'notAvailable',\n alreadyUpgraded = 'alreadyUpgraded',\n inProgress = 'inProgress',\n upgradeClosed = 'upgradeClosed',\n notFinnair = 'notFinnair',\n notLoggedIn = 'notLoggedIn',\n insufficientPayment = 'insufficientPayment',\n notPossible = 'notPossible',\n notAvailableAccount = 'notAvailableAccount',\n waitlistOnly = 'waitlistOnly',\n noRemainingUpgrades = 'noRemainingUpgrades',\n paymentError = 'paymentError',\n maintenance = 'maintenance',\n}\n\nexport enum InvalidUpgradeError {\n invalidBookingRef = 'Invalid booking reference',\n infant = 'Booking has infant',\n paxCount = 'Booking has too many passengers, upgrade not supported',\n group = 'Booking is group booking, upgrade not supported',\n invalidSSR = 'Booking has invalid SSR, upgrade not supported',\n}\n","export enum ErrorType {\n error = 'error',\n paymentError = 'paymentError',\n maintenance = 'maintenance',\n}\n","import { createAction, union, props } from '@ngrx/store';\n\nimport { BookingLocationCodes } from '@fcom/common/interfaces/booking';\n\nimport { BookingRef } from '../../interfaces/upgrades.interface';\nimport { GetOffersV2Response } from '../../api/models';\n\nexport const setBookingRef = createAction('[Auth] setBookingRef', props());\n\nexport const loadPNR = createAction('[Auth] LoadPNR');\n\nexport const setUpgradeData = createAction('[Auth] setUpgradeData', props>());\n\nexport const flightSummary = createAction('[Auth] Set Flight Summary', props<{ summary: BookingLocationCodes[] }>());\n\nexport const logout = createAction('[Auth] Clear Data');\n\nexport const setLoggedIn = createAction(\n '[Auth] Set User Logged In Status',\n props<{\n loggedIn: boolean;\n }>()\n);\n\nconst all = union({\n setBookingRef,\n loadPNR,\n setUpgradeData,\n logout,\n flightSummary,\n setLoggedIn,\n});\nexport type AuthActionsUnion = typeof all;\n","import { createAction, union, props } from '@ngrx/store';\n\nimport { FlightBasket } from '../../interfaces/upgrades.interface';\n\nexport const addPaxToBasket = createAction('[Basket] Add passenger', props<{ passengerId: string }>());\nexport const addFlightToBasket = createAction('[Basket] Add flight', props<{ flight: FlightBasket }>());\n\nexport const removeFlight = createAction('[Basket] Remove flight', props<{ flightId: string }>());\nexport const removePassenger = createAction('[Basket] Remove Passenger', props<{ passengerId: string }>());\n\nexport const updateFlight = createAction('[Basket] Update flight', props<{ flight: FlightBasket }>());\n\nexport const clearBasket = createAction('[Basket] Clear');\nexport const clearFlights = createAction('[Basket] Clear flight');\nexport const clearPassengers = createAction('[Basket] Clear Passengers');\n\nconst all = union({\n addPaxToBasket,\n addFlightToBasket,\n removeFlight,\n removePassenger,\n updateFlight,\n clearBasket,\n clearFlights,\n clearPassengers,\n});\nexport type BasketActionsUnion = typeof all;\n","import { createAction, union } from '@ngrx/store';\n\nexport const upgradeFlights = createAction('[Upgrade] Upgrade Flights');\n\nconst all = union({ upgradeFlights });\nexport type UpgradeActionsUnion = typeof all;\n","import { createAction, props, union } from '@ngrx/store';\n\nimport { DeepLinkSource } from '@fcom/common/interfaces';\n\nimport { UpgradeResponse } from '../../api/models/upgrade-response';\n\nexport const setDeepLinkSource = createAction('[Upgrade] Set Deep Link Source', props<{ source: DeepLinkSource }>());\nexport const setUpgradeResponse = createAction(\n '[Upgrade] Set Upgrade Response',\n props<{ upgradeResponse: UpgradeResponse }>()\n);\nexport const clearDeepLinkSource = createAction('[Upgrade] Clear Deep Link Source');\nexport const clearFlights = createAction('[Upgrade] Clear Flights');\nexport const clearPassengers = createAction('[Upgrade] Clear Passengers');\nexport const clearAll = createAction('[Upgrade] Clear Flights, Passengers and basket');\n\nconst all = union({\n setDeepLinkSource,\n setUpgradeResponse,\n clearDeepLinkSource,\n clearFlights,\n clearPassengers,\n clearAll,\n});\nexport type DataActionsUnion = typeof all;\n","import { createAction, union, props } from '@ngrx/store';\n\nimport { Modal } from '../../interfaces/modal.interface';\n\nexport const openModal = createAction('[One Upgrade Modal] open', props<{ modal: Modal; returnTarget: string }>());\nexport const closeModal = createAction('[One Upgrade Modal] close');\nexport const confirmModal = createAction('[One Upgrade Modal] confirm');\n\nconst all = union({ openModal, closeModal, confirmModal });\nexport type ModalActionsUnion = typeof all;\n","import { FlightV2, Upgrade, VoucherType, Cabin, UpgradeProduct, PaymentOptionsV2 } from '../api/models';\nimport { PaymentType } from '../interfaces';\n\nexport const getUpgradeByCabin = (cabin: Cabin, upgrades: Upgrade[]): Upgrade => {\n const map = {\n [UpgradeProduct.EconomyToBusiness]: Cabin.Business,\n [UpgradeProduct.PremiumeconomyToBusiness]: Cabin.Business,\n [UpgradeProduct.EconomyToPremiumeconomy]: Cabin.Ecopremium,\n };\n\n return upgrades.find((upgrade: Upgrade) => {\n return cabin === map[upgrade.upgradeProductName];\n });\n};\n\nexport const getCabinFromUpgrade = (upgrade: Upgrade): Cabin => {\n return getCabinFromUpgradeName(upgrade.upgradeProductName);\n};\n\nexport const getCabinFromUpgradeName = (productName: UpgradeProduct): Cabin => {\n const map = {\n [UpgradeProduct.EconomyToBusiness]: Cabin.Business,\n [UpgradeProduct.PremiumeconomyToBusiness]: Cabin.Business,\n [UpgradeProduct.EconomyToPremiumeconomy]: Cabin.Ecopremium,\n };\n\n return map[productName];\n};\n\nexport const getUpgradeFromFlight = (flight: FlightV2, productName: UpgradeProduct): Upgrade => {\n return flight.upgrades.find((upgrade) => upgrade.upgradeProductName === productName);\n};\n\nexport const getPaymentFromUpgrade = (\n upgrade: Upgrade,\n paymentType: PaymentType\n): PaymentOptionsV2[T] => upgrade.paymentOptions[paymentType] as PaymentOptionsV2[T];\n\nexport const getPaymentFromFlight = (\n flight: FlightV2,\n productName: UpgradeProduct,\n paymentType: PaymentType\n): PaymentOptionsV2[T] => getPaymentFromUpgrade(getUpgradeFromFlight(flight, productName), paymentType);\n\nexport const getVoucherTypeFromPaymentType = (paymentType: PaymentType): VoucherType => {\n const map = {\n [PaymentType.EUROPE_UPGRADE]: VoucherType.EuropeUpgrade,\n [PaymentType.LONG_HAUL_UPGRADE]: VoucherType.LongHaulUpgrade,\n [PaymentType.UPGRADE_BENEFIT]: VoucherType.UpgradeBenefit,\n };\n\n return map[paymentType];\n};\n","import { PaymentTotal } from '../interfaces/payment-total.interface';\nimport { ExtendedFlightBasket } from '../interfaces/upgrades.interface';\nimport { PaymentType } from '../interfaces/payment-type.interface';\nimport { PaymentOptionV2 } from '../interfaces/payment-option.interface';\nimport { VoucherType, Buyer, SupportedUpgrades, PaymentOptionsV2, PaymentV2, UpgradeProduct } from '../api/models';\nimport { getPaymentFromFlight, getUpgradeFromFlight } from './data.utils';\n\nconst EMPTY_PAYMENT_TOTAL: PaymentTotal = {\n [PaymentType.points]: 0,\n [PaymentType.money]: 0,\n [PaymentType.LONG_HAUL_UPGRADE]: 0,\n [PaymentType.EUROPE_UPGRADE]: 0,\n [PaymentType.UPGRADE_BENEFIT]: 0,\n currency: '',\n};\n\n/**\n * Calculate the total payment of the selected Flight basket\n * @param selectedFlights - flightBasket array\n * @param passengerCount - number of passengers selected\n */\nexport const calculatePaymentTotal = (\n selectedFlights: ExtendedFlightBasket[],\n passengerCount: number,\n buyer: Buyer\n): PaymentTotal => {\n return selectedFlights.reduce(\n (acc: PaymentTotal, extendedFlight: ExtendedFlightBasket) => {\n const payment = getPaymentFromFlight(\n extendedFlight.flight,\n extendedFlight.productName,\n extendedFlight.paymentType\n );\n\n if (extendedFlight.paymentType === PaymentType.money) {\n const paymentAsMoney = payment as PaymentOptionsV2['money'];\n\n acc.money += parseFloat(paymentAsMoney.price) * passengerCount;\n acc.currency = paymentAsMoney.currency;\n } else if (extendedFlight.paymentType === PaymentType.points) {\n const paymentAsPoints = payment as PaymentOptionsV2['points'];\n if (\n isLongHaulUpgraded(selectedFlights, extendedFlight.flight.segmentInfo.group) &&\n !extendedFlight.flight.segmentInfo.longHaul &&\n paymentAsPoints.priceWithLongHaul !== undefined\n ) {\n acc.points += paymentAsPoints.priceWithLongHaul * passengerCount;\n } else {\n acc.points += paymentAsPoints.price * passengerCount;\n }\n } else if (extendedFlight.paymentType === PaymentType.EUROPE_UPGRADE) {\n const paymentAsVoucher = payment as PaymentOptionsV2[PaymentType.EUROPE_UPGRADE];\n\n acc[PaymentType.EUROPE_UPGRADE] += paymentAsVoucher.price * passengerCount;\n } else if (extendedFlight.paymentType === PaymentType.UPGRADE_BENEFIT) {\n const paymentAsVoucher = payment as PaymentOptionsV2[PaymentType.UPGRADE_BENEFIT];\n const originalEuropeVouchers =\n buyer.vouchers.find((voucher) => voucher.type === VoucherType.EuropeUpgrade)?.count || 0;\n\n acc[PaymentType.EUROPE_UPGRADE] += paymentAsVoucher.price * passengerCount;\n\n if (acc[PaymentType.EUROPE_UPGRADE] > originalEuropeVouchers) {\n acc[PaymentType.UPGRADE_BENEFIT] += acc[PaymentType.EUROPE_UPGRADE] - originalEuropeVouchers;\n acc[PaymentType.EUROPE_UPGRADE] = originalEuropeVouchers;\n }\n } else if (extendedFlight.paymentType === PaymentType.LONG_HAUL_UPGRADE) {\n const paymentAsVoucher = payment as PaymentOptionsV2[PaymentType.LONG_HAUL_UPGRADE];\n\n acc[PaymentType.LONG_HAUL_UPGRADE] += paymentAsVoucher.price * passengerCount;\n }\n\n return acc;\n },\n { ...EMPTY_PAYMENT_TOTAL }\n );\n};\n\n/**\n * calculate the minimum payment amount for 1 flight\n * @param paymentOptions - array of paymentOptions to look through\n */\nexport const calculateMinimumPayment = (paymentOptions: PaymentOptionsV2[]): PaymentTotal => {\n return paymentOptions.reduce(\n (acc, cur) => {\n let money = acc.money;\n let currency = acc.currency;\n let points = acc.points;\n\n if (cur.money?.price) {\n money = money ? Math.min(+cur.money.price, money) : +cur.money.price;\n currency = cur.money.currency;\n }\n if (cur.points?.price) {\n points = points ? Math.min(+cur.points.price, points) : +cur.points.price;\n }\n\n return {\n money,\n currency,\n points,\n [PaymentType.LONG_HAUL_UPGRADE]: acc[PaymentType.LONG_HAUL_UPGRADE] || cur.LONG_HAUL_UPGRADE?.price,\n [PaymentType.EUROPE_UPGRADE]: acc[PaymentType.EUROPE_UPGRADE] || cur.EUROPE_UPGRADE?.price,\n [PaymentType.UPGRADE_BENEFIT]: acc[PaymentType.UPGRADE_BENEFIT] || cur.UPGRADE_BENEFIT?.price,\n };\n },\n { ...EMPTY_PAYMENT_TOTAL }\n );\n};\n\n/**\n * Check if a longhaul flight in the group is already selected for upgrade with points\n * @param selectedFlights array of flights in the basket\n * @param group group number of current flight\n */\nexport const isLongHaulUpgraded = (flightBasket: ExtendedFlightBasket[], group: number): boolean => {\n return Boolean(\n flightBasket.find(({ flight, paymentType, productName }) => {\n return (\n flight.segmentInfo.group === group &&\n paymentType === PaymentType.points &&\n productName === UpgradeProduct.EconomyToBusiness &&\n flight.segmentInfo.longHaul\n );\n })\n );\n};\n\n/**\n * Determine paymentType from payment object\n * @param payment object to check\n */\nexport const getPaymentType = (payment: PaymentV2): PaymentType => (Object.keys(payment)[0] as PaymentType) || null;\n\n/**\n * Get count of available vouchers of specified type\n * @param voucherType\n * @param user\n */\nexport const getVoucherAmount = (voucherType: VoucherType, user: Buyer = {}): number => {\n return user?.vouchers?.find((v) => v.type === voucherType)?.count ?? 0;\n};\n\n/**\n * get count of number of vouchers of given type buyer has\n *\n * @param buyer - users with vouchers to check\n * @param type - type of voucher to check for\n */\nexport function getBuyerVouchersCount(buyer: Buyer, type: VoucherType): number {\n if (!buyer || !buyer.vouchers) {\n return 0;\n }\n const vouchers = buyer.vouchers.find((x) => x.type === type);\n return vouchers ? vouchers.count : 0;\n}\n\n/**\n * Create a PaymentExtended object from a PaymentOption\n * @param paymentOption\n */\nexport function createPaymentObject(\n flightsBasket: ExtendedFlightBasket[],\n flightBasket: ExtendedFlightBasket\n): PaymentV2 {\n const payments: PaymentV2 = {};\n const upgrade = getUpgradeFromFlight(flightBasket.flight, flightBasket.productName);\n const paymentType = flightBasket.paymentType;\n\n if (paymentType === PaymentType.money) {\n payments.money = {\n currency: upgrade.paymentOptions[paymentType].currency,\n price: upgrade.paymentOptions[paymentType].price,\n };\n } else if (paymentType === PaymentType.points) {\n const longHaulDiscount = !flightBasket.flight.segmentInfo.longHaul\n ? isLongHaulUpgraded(flightsBasket, flightBasket.flight.segmentInfo.group)\n : false;\n const regularPrice = upgrade.paymentOptions[paymentType].price;\n const priceWithLongHaul = upgrade.paymentOptions[paymentType].priceWithLongHaul;\n\n payments.points = {\n price: longHaulDiscount && typeof priceWithLongHaul === 'number' ? priceWithLongHaul : regularPrice,\n };\n } else {\n payments[paymentType] = {\n price: upgrade.paymentOptions[paymentType].price,\n };\n }\n\n return payments;\n}\n\nexport const isWaitlistedPaymentOption = (paymentOption: PaymentOptionV2): boolean => {\n // @todo array 0 because ECONOMY_TO_BUSINESS does not have multiple voucher options.\n const upgrade = Array.isArray(paymentOption) ? paymentOption[0] : paymentOption;\n\n return upgrade.supportedUpgrades === SupportedUpgrades.EconomyToBusinessWaitlist;\n};\n","import { createReducer, on } from '@ngrx/store';\n\nimport { BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { DeepLinkSource } from '@fcom/common';\nimport { BookingRef } from '@fcom/one-upgrade/interfaces';\n\nimport { PaymentTotal } from '../../interfaces/payment-total.interface';\nimport { Buyer, FlightsV2, FlightV2, Passengers, UpgradeResponse, VoucherType } from '../../api/models';\nimport { getVoucherAmount, calculateMinimumPayment } from '../../utils/payment.utils';\nimport { DataState } from '../../interfaces/store.interface';\nimport { AuthActions, DataActions } from '../actions';\n\nexport const initialState: DataState = {\n user: null,\n booking: null,\n summary: [],\n flights: [],\n passengers: [],\n source: null,\n upgradeResponse: null,\n};\n\nconst dataReducer = createReducer(\n initialState,\n on(AuthActions.logout, () => initialState),\n on(AuthActions.setBookingRef, (state, { lastName, recLoc }) => ({\n ...state,\n booking: {\n lastName: lastName,\n recLoc: recLoc,\n },\n })),\n on(AuthActions.setUpgradeData, (state, { booking, buyer }) => ({\n ...state,\n flights: booking.flights,\n passengers: booking.passengers,\n user: buyer,\n })),\n on(AuthActions.flightSummary, (state, { summary }) => ({ ...state, summary: summary.slice() })),\n on(DataActions.setUpgradeResponse, (state, { upgradeResponse }) => ({ ...state, upgradeResponse })),\n on(DataActions.setDeepLinkSource, (state, { source }) => ({ ...state, source })),\n on(DataActions.clearDeepLinkSource, (state) => ({ ...state, source: null })),\n on(DataActions.clearFlights, (state) => ({ ...state, flights: [] })),\n on(DataActions.clearPassengers, (state) => ({ ...state, passengers: [] })),\n on(DataActions.clearAll, (state) => ({\n ...state,\n user: null,\n flights: [],\n passengers: [],\n summary: [],\n source: null,\n }))\n);\n\nexport function reducer(\n state: DataState,\n action: AuthActions.AuthActionsUnion | DataActions.DataActionsUnion\n): DataState {\n return dataReducer(state, action);\n}\n\nexport const getUser = (state: DataState): Buyer => state.user || {};\nexport const getUserPoints = (state: DataState): number => getUser(state).points || 0;\nexport const getUserShortHaul = (state: DataState): number =>\n getVoucherAmount(VoucherType.EuropeUpgrade, getUser(state));\nexport const getUserLongHaul = (state: DataState): number =>\n getVoucherAmount(VoucherType.LongHaulUpgrade, getUser(state));\nexport const getUserUpgradeBenefit = (state: DataState): number =>\n getVoucherAmount(VoucherType.UpgradeBenefit, getUser(state));\nexport const getPassengers = (state: DataState): Passengers => {\n return state.passengers.sort((a, b) => (a.ordinal || 0) - (b.ordinal || 0));\n};\nexport const getFlights = (state: DataState): FlightsV2 => state.flights;\nexport const getBookingRef = (state: DataState): BookingRef => state.booking;\nexport const getJourneySummary = (state: DataState): BookingLocationCodes[] => state.summary;\nexport const getDeepLinkSource = (state: DataState): DeepLinkSource => state.source;\nexport const getMinimumPayment = (state: DataState): PaymentTotal => {\n return calculateMinimumPayment(\n getFlights(state)\n .map((flight: FlightV2) => flight.upgrades)\n .flat()\n .map((upgrade) => upgrade.paymentOptions)\n .filter(Boolean)\n );\n};\n\nexport const getUpgradeResponse = (state: DataState): UpgradeResponse => state.upgradeResponse;\n","import { createReducer, on } from '@ngrx/store';\n\nimport { Stage, StatusState, UpgradeError } from '../../interfaces';\nimport { AuthActions, DataActions, StatusActions, UpgradeActions } from '../actions';\n\nexport const initialState: StatusState = {\n error: UpgradeError.none,\n pending: false,\n stage: Stage.LOGIN,\n userLoggedIn: false,\n waitlisted: false,\n splitPNR: false,\n};\n\nconst statusReducer = createReducer(\n initialState,\n on(StatusActions.setStage, StatusActions.setStage, (state, { stage }) => ({\n ...state,\n stage,\n })),\n on(AuthActions.setLoggedIn, (state, { loggedIn }) => ({\n ...state,\n userLoggedIn: loggedIn,\n })),\n on(AuthActions.setBookingRef, UpgradeActions.upgradeFlights, (state) => ({\n ...state,\n error: UpgradeError.none,\n pending: true,\n })),\n on(AuthActions.setUpgradeData, (state) => ({\n ...state,\n error: UpgradeError.none,\n pending: false,\n })),\n on(StatusActions.setError, (state, { error }) => ({\n ...state,\n error: error,\n })),\n on(StatusActions.clearErrors, (state) => ({\n ...state,\n error: UpgradeError.none,\n })),\n on(StatusActions.clearPending, (state) => ({\n ...state,\n pending: false,\n })),\n on(StatusActions.setWaitlisted, (state, { waitlisted }) => ({\n ...state,\n waitlisted,\n })),\n on(StatusActions.setSplitPNR, (state, { splitPNR }) => ({\n ...state,\n splitPNR,\n })),\n on(AuthActions.logout, () => initialState)\n);\n\ntype actionType =\n | AuthActions.AuthActionsUnion\n | StatusActions.StatusActionsUnion\n | UpgradeActions.UpgradeActionsUnion\n | DataActions.DataActionsUnion;\n\nexport function reducer(state: StatusState, action: actionType): StatusState {\n return statusReducer(state, action);\n}\n\nexport const getError = (state: StatusState): UpgradeError => state.error;\nexport const getPending = (state: StatusState): boolean => state.pending;\nexport const getStage = (state: StatusState): Stage => state.stage;\nexport const getUserLoggedIn = (state: StatusState): boolean => state.userLoggedIn;\nexport const getWaitlisted = (state: StatusState): boolean => state.waitlisted;\nexport const getSplitPNR = (state: StatusState): boolean => state.splitPNR;\n","import { createReducer, on } from '@ngrx/store';\n\nimport { AuthActions, BasketActions, DataActions } from '../actions';\nimport { BasketState, FlightBasket } from '../../interfaces';\n\nexport const initialState: BasketState = {\n flights: [],\n passengerIds: [],\n};\n\nconst basketReducer = createReducer(\n initialState,\n on(AuthActions.setBookingRef, AuthActions.logout, DataActions.clearAll, () => initialState),\n on(BasketActions.addPaxToBasket, (state, { passengerId }) => {\n if (state.passengerIds.includes(passengerId)) {\n return state;\n }\n return {\n ...state,\n passengerIds: [...state.passengerIds, passengerId],\n };\n }),\n on(BasketActions.removePassenger, (state, { passengerId }) => ({\n ...state,\n passengerIds: state.passengerIds.filter((passenger) => passenger !== passengerId),\n })),\n on(BasketActions.addFlightToBasket, (state, { flight }) => ({\n ...state,\n flights: [...state.flights, flight],\n })),\n on(BasketActions.removeFlight, (state, { flightId }) => ({\n ...state,\n flights: state.flights.filter((flight) => flight.flightId !== flightId),\n })),\n on(BasketActions.updateFlight, (state, { flight }) => ({\n ...state,\n flights: state.flights.map((stateFlight) => {\n return stateFlight.flightId === flight.flightId ? flight : stateFlight;\n }),\n })),\n on(BasketActions.clearFlights, (state) => ({\n ...state,\n flights: [],\n }))\n);\n\nexport function reducer(\n state: BasketState,\n action: AuthActions.AuthActionsUnion | BasketActions.BasketActionsUnion | DataActions.DataActionsUnion\n): BasketState {\n return basketReducer(state, action);\n}\n\nexport const getFlights = (state: BasketState): FlightBasket[] => state.flights;\nexport const getPassengerIds = (state: BasketState): string[] => state.passengerIds;\n","import { createReducer, on } from '@ngrx/store';\n\nimport { ModalState } from '../../interfaces/modal.interface';\nimport { ModalActions } from '../actions';\n\nexport const initialState: ModalState = {\n modal: null,\n returnTarget: null,\n};\n\nconst modalReducer = createReducer(\n initialState,\n on(ModalActions.openModal, (state, { modal, returnTarget }) => ({\n ...state,\n modal: { ...modal },\n returnTarget,\n })),\n on(ModalActions.closeModal, () => initialState)\n);\n\nexport function reducer(state: ModalState, action: ModalActions.ModalActionsUnion): ModalState {\n return modalReducer(state, action);\n}\n","import { ActionReducerMap } from '@ngrx/store';\n\nimport * as fromData from './data.reducer';\nimport * as fromStatus from '../reducers/status.reducer';\nimport * as fromBasket from '../reducers/basket.reducer';\nimport * as fromModal from '../reducers/modal.reducer';\nimport { UpgradeState } from '../../interfaces/store.interface';\n\nexport const reducers: ActionReducerMap = {\n data: fromData.reducer,\n status: fromStatus.reducer,\n basket: fromBasket.reducer,\n modal: fromModal.reducer,\n};\n","import { BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { TripType } from '@fcom/core/interfaces';\nimport { TzDate } from '@fcom/core/utils';\nimport { GlobalBookingTripDates } from '@fcom/common';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\n\nimport { ExtendedFlightBasket } from '../interfaces/upgrades.interface';\nimport { FlightsV2 } from '../api/models/flights-v-2';\nimport { FlightV2 } from '../api/models/flight-v-2';\n\nexport const flightsMaxPassengers = (flights: FlightsV2): number => {\n let hasWaitlistOption = false;\n\n const maxPax = flights.reduce((maxPax, flight) => {\n return flight.upgrades?.reduce((maxPax2, upgrade) => {\n if (upgrade.isWaitlist && upgrade.paymentOptions) {\n hasWaitlistOption = true;\n }\n\n return Math.max(maxPax2, upgrade.seatsAvailable);\n }, maxPax);\n }, 0);\n\n return hasWaitlistOption ? 99999 : maxPax;\n};\n\nexport const flightsToJourneys = (flights: FlightsV2): FlightsV2[] => {\n const grouped = flights.reduce(\n (accumulator, flight): { [key: number]: FlightsV2[] } => ({\n ...accumulator,\n [flight.segmentInfo.group]: [...(accumulator[flight.segmentInfo.group] || []), { ...flight }],\n }),\n {}\n );\n\n return Object.keys(grouped).map((key) =>\n grouped[key].sort((a, b) => {\n if (a.segmentInfo.ordinal && b.segmentInfo.ordinal) {\n return a.segmentInfo.ordinal > b.segmentInfo.ordinal ? 1 : -1;\n }\n })\n );\n};\n\nexport const getNumberOfFlightsInBound = (singleFlight: FlightV2, flights: FlightsV2): number => {\n let numberOfFlights = 0;\n\n flights.forEach((flight) => {\n if (singleFlight.segmentInfo.group === flight.segmentInfo.group) {\n numberOfFlights++;\n }\n });\n\n return numberOfFlights;\n};\n\nexport const filterSelectedJourneys = (journeys: FlightsV2[], flightBasket: ExtendedFlightBasket[]): FlightsV2[] => {\n const selectedIds = flightBasket.map((flight) => flight.flightId);\n\n return journeys\n .map((flights) => {\n return flights.filter((flight) => {\n return selectedIds.includes(flight.segmentInfo.flightId);\n });\n })\n .filter((journey) => journey.length);\n};\n\nexport const getFlightsAsBookingLocationCodes = (flights: FlightsV2): BookingLocationCodes[] => {\n return flightsToJourneys(flights).map((segments: FlightsV2) => ({\n originLocationCode: segments[0].segmentInfo.boardPoint,\n destinationLocationCode: segments[segments.length - 1].segmentInfo.offPoint,\n }));\n};\n\nexport const getDatesForJourney = (flights: FlightsV2, tripType: TripType): GlobalBookingTripDates => {\n const groupedFlights = flightsToJourneys(flights);\n const departureFlight = groupedFlights[0][0];\n\n const returningFlight = groupedFlights[groupedFlights.length - 1][0];\n const dates: GlobalBookingTripDates = {\n departureDate: new TzDate(departureFlight.segmentInfo.departureDateTime).toLocalDate(),\n };\n\n if (tripType !== TripType.ONEWAY) {\n dates.returnDate = new TzDate(returningFlight.segmentInfo.departureDateTime).toLocalDate();\n }\n\n return dates;\n};\n\nexport const getLocationsForGAString = (flights: FlightsV2): string => {\n const locations = getFlightsAsBookingLocationCodes(flights);\n const tripType = getTripTypeFromBookingLocationCodes(locations);\n\n if (tripType !== TripType.MULTICITY) {\n return `${locations[0].originLocationCode}-${locations[0].destinationLocationCode}`;\n }\n\n const multiCityOrigins = locations.map((location) => location.originLocationCode).join('-');\n\n return `${multiCityOrigins}-${locations[locations.length - 1].destinationLocationCode}`;\n};\n","import { FinnairPassengerCode } from '@fcom/dapi/api/models';\n\nimport { Passenger, Passengers } from '../api/models';\n\n/**\n * To check whether the passenger is a trip lead\n * @param Passenger Passenger to check\n */\nexport const isTripLead = (p: Passenger): boolean => p.type === FinnairPassengerCode.ADT;\n\n/**\n * To check whether the passenger is a child\n * @param Passenger Passenger to check\n */\nexport const isChild = (p: Passenger): boolean => p.child;\n\n/**\n * Returns true if selected pax would result in situation where the pnr is split\n * and a child would be separated from the parent/trip lead\n * @param selectedPax selected passengers information for the trip\n * @param pax all passengers in booking\n */\nexport const childIsTravellingAlone = (selectedPax: Passengers, pax: Passengers): boolean => {\n const notSelectedPax = pax.filter((p) => !selectedPax.map(({ passengerId }) => passengerId).includes(p.passengerId));\n\n const amountOfChildrenToUpgrade = selectedPax.filter(isChild).length;\n const amountOfTripLeadsToUpgrade = selectedPax.filter(isTripLead).length;\n\n const amountOfChildrenNotToUpgrade = notSelectedPax.filter(isChild).length;\n const amountOfTripLeadsNotToUpgrade = notSelectedPax.filter(isTripLead).length;\n\n return (\n (amountOfChildrenNotToUpgrade > 0 && amountOfTripLeadsNotToUpgrade === 0) ||\n (amountOfChildrenToUpgrade > 0 && amountOfTripLeadsToUpgrade === 0)\n );\n};\n\n/**\n * By default only id's for the selected passengers are in the basket\n * this function adds the additional info from the passenger info in booking\n * @param selectedPax selected passenger id's for the trip\n * @param pax all passengers in booking\n */\nexport const enrichSelectedPaxWithInfo = (selectedPax: string[], pax: Passengers): Passengers =>\n pax.filter((p) => selectedPax.includes(p.passengerId));\n\n/**\n * Returns minimum amount of passenger to upgrade.\n * For example if has 1 child and 1 adult, both need to be upgraded\n * @param Passengers All passengers in booking\n */\nexport function getMinPaxAmountToUpgrade(pax: Passengers): number {\n const amountOfChildren = pax.filter(isChild).length;\n const amountOfTripLeads = pax.filter(isTripLead).length;\n\n // If multiple trip leads, one of them can be upgraded\n // and children will travel one of the remaining\n if (amountOfTripLeads > 1) {\n return 1;\n } else if (pax.length) {\n // Otherwise all children will need to be upgraded with the trip lead\n return amountOfChildren + 1;\n }\n\n // Fall back to 0 if no passengers\n return 0;\n}\n","import { createSelector, createFeatureSelector } from '@ngrx/store';\n\nimport * as flightUtils from '../../utils/flight.utils';\nimport * as passengerUtils from '../../utils/passenger.utils';\nimport { UpgradeState, State } from '../../interfaces/store.interface';\nimport * as fromData from '../reducers/data.reducer';\nimport * as fromStatus from '../reducers/status.reducer';\nimport * as fromBasket from '../reducers/basket.reducer';\nimport { calculatePaymentTotal } from '../../utils/payment.utils';\nimport { Balance, PaymentType } from '../../interfaces';\nimport { VoucherType } from '../../api/models';\n\nexport const selectUpgradeState = createFeatureSelector('upgrade');\n\n// Data Selectors\nexport const selectDataState = createSelector(selectUpgradeState, (state: UpgradeState) => state.data);\n\nexport const getUser = createSelector(selectDataState, fromData.getUser);\n\nexport const getBookingRef = createSelector(selectDataState, fromData.getBookingRef);\n\nexport const getPassengers = createSelector(selectDataState, fromData.getPassengers);\n\nexport const getFlights = createSelector(selectDataState, fromData.getFlights);\n\nexport const getMaxPassengers = createSelector(getFlights, flightUtils.flightsMaxPassengers);\n\nexport const getJourneys = createSelector(getFlights, flightUtils.flightsToJourneys);\n\nexport const getJourneySummary = createSelector(selectDataState, fromData.getJourneySummary);\n\nexport const getDeepLinkSource = createSelector(selectDataState, fromData.getDeepLinkSource);\n\nexport const getMinimumPaymentOptions = createSelector(selectDataState, fromData.getMinimumPayment);\n\nexport const getUpgradeResponse = createSelector(selectDataState, fromData.getUpgradeResponse);\n\n// Status Selectors\nexport const selectStatusState = createSelector(selectUpgradeState, (state: UpgradeState) => state.status);\n\nexport const getStage = createSelector(selectStatusState, fromStatus.getStage);\n\nexport const getError = createSelector(selectStatusState, fromStatus.getError);\n\nexport const getStatusPending = createSelector(selectStatusState, fromStatus.getPending);\n\n/* use with care. set on success page prior to basket clearance */\nexport const getWaitlisted = createSelector(selectStatusState, fromStatus.getWaitlisted);\n\n/* use with care. set on success page prior to basket clearance */\nexport const getSplitPNR = createSelector(selectStatusState, fromStatus.getSplitPNR);\n\n// Basket Selectors\nexport const selectBasketState = createSelector(selectUpgradeState, (state: UpgradeState) => state.basket);\n\nexport const getBasketPassengerIds = createSelector(selectBasketState, fromBasket.getPassengerIds);\n\nexport const getBasketFlights = createSelector(getFlights, selectBasketState, (flights, basket) => {\n return basket.flights.map((flightBasket) => {\n return {\n ...flightBasket,\n flight: flights.find((flight) => flight.segmentInfo.flightId === flightBasket.flightId),\n };\n });\n});\n\nexport const getOriginalBalance = createSelector(getUser, (buyer): Balance => {\n return {\n [PaymentType.EUROPE_UPGRADE]:\n buyer.vouchers?.find((voucher) => voucher.type === VoucherType.EuropeUpgrade)?.count || 0,\n [PaymentType.LONG_HAUL_UPGRADE]:\n buyer.vouchers?.find((voucher) => voucher.type === VoucherType.LongHaulUpgrade)?.count || 0,\n [PaymentType.UPGRADE_BENEFIT]:\n buyer.vouchers?.find((voucher) => voucher.type === VoucherType.UpgradeBenefit)?.count || 0,\n [PaymentType.points]: buyer.points || 0,\n };\n});\n\nexport const getPaymentTotal = createSelector(\n getBasketFlights,\n getBasketPassengerIds,\n getUser,\n (flightBasket, passengerIds, buyer) => calculatePaymentTotal(flightBasket, passengerIds.length, buyer)\n);\n\nexport const getMoneyPaymentNotSelected = createSelector(getPaymentTotal, (paymentTotal) => !paymentTotal.money);\n\nexport const getBasketPassengerData = createSelector(\n getBasketPassengerIds,\n getPassengers,\n passengerUtils.enrichSelectedPaxWithInfo\n);\n\nexport const getChildIsTravellingAlone = createSelector(\n getBasketPassengerData,\n getPassengers,\n passengerUtils.childIsTravellingAlone\n);\n\n// Modal Selectors\nexport const selectModalState = createSelector(selectUpgradeState, (state: UpgradeState) => state.modal);\n","\n \n \n \n\n","import { Component, OnInit } from '@angular/core';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\n\nimport { PassengerNameRecord } from '@fcom/common-booking';\nimport { isPresent } from '@fcom/core/utils/utils';\nimport { filterWithoutContentType, filterWithoutType, findByType } from '@fcom/cms';\nimport { CmsPageService } from '@fcom/common';\nimport { CmsCollection, CmsContentType, CmsImageData, CmsTemplate, CmsViewType } from '@fcom/core-api';\nimport { RootPaths } from '@fcom/core/constants';\nimport { clearErrors } from '@fcom/one-upgrade/store/actions/status.actions';\n\nimport { BookingRef, Stage, State, UpgradeError } from '../../interfaces';\nimport { AuthActions, getBookingRef, getError, getStage, StatusActions } from '../../store';\n\n@Component({\n selector: 'fin-upgrade-login',\n templateUrl: 'login.component.html',\n})\nexport class LoginComponent implements OnInit {\n imageData$: Observable;\n loading$: Observable;\n mainError$: Observable;\n template$: Observable;\n filteredTemplate$: Observable;\n disruptions$: Observable;\n personalized$: Observable;\n currentStage$: Observable;\n prefillableBookingRef$: Observable;\n\n subscription = new Subscription();\n\n readonly UpgradeError = UpgradeError;\n readonly Stage = Stage;\n\n constructor(\n private store: Store,\n private pageService: CmsPageService\n ) {}\n\n ngOnInit(): void {\n this.template$ = this.pageService.getPageDataAndSetMeta(RootPaths.ONE_UPGRADE_ROOT);\n this.currentStage$ = this.store.pipe(select(getStage));\n this.filteredTemplate$ = this.template$.pipe(\n filterWithoutType(CmsViewType.DISRUPTIONS, 'main'),\n filterWithoutContentType(CmsContentType.CMPersonalized, 'main')\n );\n this.disruptions$ = this.template$.pipe(\n map((template) => template.main),\n findByType(CmsViewType.DISRUPTIONS)\n );\n\n this.personalized$ = this.template$.pipe(\n map((template) => {\n return template.main.filter((item) => item.contentType === CmsContentType.CMPersonalized);\n }),\n filter((item) => !!item?.length),\n map((personalizedContent) => {\n return personalizedContent[0].items?.[0] as CmsCollection;\n })\n );\n\n this.mainError$ = this.store.pipe(\n select(getError),\n filter((err) => [UpgradeError.httpError, UpgradeError.none].includes(err)),\n map((err) => (err === UpgradeError.httpError ? 'oneUpgrade.login.notFound' : null))\n );\n\n /* If user has typoed their recLoc or lastname, we have an http error and the previously typoed info\n * that we can use to prefill the pnr widget */\n this.prefillableBookingRef$ = combineLatest([this.store.pipe(select(getBookingRef)), this.mainError$]).pipe(\n filter(([bookingRef, mainError]) => {\n return isPresent(bookingRef) && isPresent(mainError);\n }),\n take(1),\n map(([bookingRef, _mainError]) => bookingRef)\n );\n\n this.imageData$ = this.template$.pipe(\n map((content) => content.main.find((obj) => obj.contentType === CmsContentType.CMPlaceholder)),\n filter(Boolean),\n map((data) => data.picture)\n );\n }\n\n closeErrorNotification(): void {\n this.store.dispatch(StatusActions.clearErrors());\n }\n\n onSubmit(event: PassengerNameRecord): void {\n this.store.dispatch(clearErrors());\n this.store.dispatch(\n AuthActions.setBookingRef({\n lastName: event.lastName,\n recLoc: event.recLoc,\n })\n );\n this.store.dispatch(AuthActions.loadPNR());\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Store, select } from '@ngrx/store';\nimport { Observable, combineLatest, of } from 'rxjs';\nimport { first, switchMap, map, take } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { CurrencyService } from '@fcom/core';\nimport { snapshot } from '@fcom/rx';\n\nimport { PaymentTotal } from '../interfaces/payment-total.interface';\nimport { calculatePaymentTotal, getBuyerVouchersCount, isLongHaulUpgraded } from '../utils/payment.utils';\nimport { State } from '../interfaces/store.interface';\nimport { PaymentType } from '../interfaces/payment-type.interface';\nimport { ExtendedFlightBasket } from '../interfaces/upgrades.interface';\nimport { VoucherType, FlightsV2, FlightV2, UpgradeProduct, PaymentOptionsV2, Buyer } from '../api/models';\nimport { getBasketPassengerIds, getBasketFlights, getPaymentTotal, getFlights, getUser } from '../store/selectors';\nimport {\n getCabinFromUpgrade,\n getPaymentFromFlight,\n getUpgradeFromFlight,\n getVoucherTypeFromPaymentType,\n} from '../utils/data.utils';\n\nexport const sortByPaymentType = (a: PaymentType, b: PaymentType): number =>\n a !== PaymentType.money && b === PaymentType.money ? -1 : 1;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UpgradePaymentService {\n flights$: Observable;\n selectedPassengers$: Observable;\n selectedFlights$: Observable;\n paymentTotal$: Observable;\n buyer$: Observable;\n\n constructor(\n private store: Store,\n private languageService: LanguageService,\n private currencyService: CurrencyService\n ) {\n this.flights$ = this.store.pipe(select(getFlights));\n this.selectedPassengers$ = this.store.pipe(select(getBasketPassengerIds));\n this.selectedFlights$ = this.store.pipe(select(getBasketFlights));\n this.paymentTotal$ = this.store.pipe(select(getPaymentTotal));\n this.buyer$ = this.store.pipe(select(getUser));\n }\n\n /**\n * get the formated price for a given flight in the basket\n *\n * @param flight flight to Upgrade\n */\n getPriceForSelectedFlight(flight: FlightV2): Observable {\n const id = flight.segmentInfo.flightId;\n\n return combineLatest([this.selectedFlights$, this.selectedPassengers$]).pipe(\n first(),\n switchMap(([flightsBasket, selectedPassengers]) => {\n const passengerAmount = selectedPassengers.length;\n const flightBasket: ExtendedFlightBasket = flightsBasket.find((selected) => selected.flightId === id);\n const shortHaulDiscount =\n isLongHaulUpgraded(flightsBasket, flight.segmentInfo.group) && !flight.segmentInfo.longHaul;\n\n return this.getFormattedPaymentAmount(\n flight,\n flightBasket.productName,\n flightBasket.paymentType,\n passengerAmount,\n shortHaulDiscount\n );\n })\n );\n }\n\n getValueForPaymentOption(flight: FlightV2, upgrade: UpgradeProduct, paymentType: PaymentType): Observable {\n return combineLatest([this.selectedFlights$, this.selectedPassengers$]).pipe(\n first(),\n switchMap(([flightsBasket, selectedPassengers]) => {\n const passengerAmount = selectedPassengers.length;\n const shortHaulDiscount =\n isLongHaulUpgraded(flightsBasket, flight.segmentInfo.group) && !flight.segmentInfo.longHaul;\n\n return this.getFormattedPaymentAmount(flight, upgrade, paymentType, passengerAmount, shortHaulDiscount);\n })\n );\n }\n\n getAllSelectedPayments(): Observable {\n return this.paymentTotal$.pipe(\n switchMap((totalPrice: PaymentTotal) => {\n return combineLatest([\n this.getFormattedMoney(totalPrice.money, totalPrice.currency),\n this.getFormattedPoints(totalPrice.points, false),\n this.getFormattedVouchers(totalPrice[PaymentType.EUROPE_UPGRADE], VoucherType.EuropeUpgrade),\n this.getFormattedVouchers(totalPrice[PaymentType.LONG_HAUL_UPGRADE], VoucherType.LongHaulUpgrade),\n this.getFormattedVouchers(totalPrice[PaymentType.UPGRADE_BENEFIT], VoucherType.UpgradeBenefit),\n ]);\n }),\n map((labels) => labels.filter((label) => label))\n );\n }\n\n getFormattedPaymentAmount(\n flight: FlightV2,\n productName: UpgradeProduct,\n paymentType: PaymentType,\n passengerAmount: number,\n shortHaulDiscount: boolean\n ): Observable {\n const paymentOption = getPaymentFromFlight(flight, productName, paymentType);\n\n switch (paymentType) {\n case PaymentType.money: {\n const payment = paymentOption as PaymentOptionsV2['money'];\n\n return this.getFormattedMoney(parseFloat(payment.price) * passengerAmount, payment.currency);\n }\n case PaymentType.points: {\n const payment = paymentOption as PaymentOptionsV2['points'];\n\n return shortHaulDiscount && payment.priceWithLongHaul !== undefined\n ? this.getFormattedPoints(passengerAmount * payment.priceWithLongHaul)\n : this.getFormattedPoints(passengerAmount * payment.price);\n }\n default: {\n const payment = paymentOption as PaymentOptionsV2['EUROPE_UPGRADE'];\n const totalVouchers = passengerAmount * payment.price;\n return this.getFormattedVouchers(totalVouchers, getVoucherTypeFromPaymentType(paymentType));\n }\n }\n }\n\n private getFormattedVouchers(amount: number, voucherType: VoucherType): Observable {\n const type = amount > 1 ? 'plural' : 'singular';\n const translationKey = `oneUpgrade.vouchers.${voucherType}.${type}`;\n\n return amount ? this.languageService.translate(translationKey, { voucherAmount: amount }).pipe(first()) : of('');\n }\n\n private getFormattedMoney(moneyPrice: number, currency: string): Observable {\n return moneyPrice\n ? this.currencyService.formatPrice({ amount: moneyPrice.toString(), currencyCode: currency }).pipe(first())\n : of('');\n }\n\n // TODO: implement pipe, check asian formatting\n /**\n * Format points as string\n *\n * @param pointsAmount number of points\n * @param allowZero boolean indicating if to translate 0 points or return blank\n */\n private getFormattedPoints(pointsAmount: number, allowZero = true): Observable {\n if (pointsAmount) {\n return this.languageService.translate('number').pipe(\n switchMap((i18n) => {\n const formattedPoints = pointsAmount\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, `$1${i18n.thousandSeparator}`);\n\n return this.languageService.translate('oneUpgrade.points', { pointsAmount: formattedPoints });\n }),\n first()\n );\n }\n\n return allowZero ? this.languageService.translate('oneUpgrade.points', { pointsAmount: 0 }) : of('');\n }\n\n /**\n * Does the buyer have sufficient payment to be able to select this payment option\n * @param flight Current flight details\n * @param productName What kind of upgrade e.g. economy to business\n * @param paymentType The current payment option to check\n */\n insufficientPayment(flight: FlightV2, productName: UpgradeProduct, paymentType: PaymentType): boolean {\n const isInsufficient$ = combineLatest([this.selectedFlights$, this.selectedPassengers$, this.buyer$]).pipe(\n take(1),\n map(([flightsBasket, selectedPassengers, buyer]) => {\n if (paymentType === PaymentType.money) {\n return false;\n }\n\n if (!buyer) {\n return true;\n }\n\n const paymentTotal = calculatePaymentTotal(\n [\n ...flightsBasket,\n {\n flight,\n flightId: flight.segmentInfo.flightId,\n productName,\n paymentType,\n cabin: getCabinFromUpgrade(getUpgradeFromFlight(flight, productName)),\n },\n ],\n selectedPassengers.length,\n buyer\n );\n\n return (\n paymentTotal.points > (buyer.points || 0) ||\n paymentTotal[PaymentType.EUROPE_UPGRADE] > getBuyerVouchersCount(buyer, VoucherType.EuropeUpgrade) ||\n paymentTotal[PaymentType.LONG_HAUL_UPGRADE] > getBuyerVouchersCount(buyer, VoucherType.LongHaulUpgrade) ||\n paymentTotal[PaymentType.UPGRADE_BENEFIT] > getBuyerVouchersCount(buyer, VoucherType.UpgradeBenefit)\n );\n })\n );\n return snapshot(isInsufficient$);\n }\n}\n","import { ExtendedFlightBasket } from '../interfaces';\nimport { getUpgradeFromFlight } from './data.utils';\n\nexport const getFlightById = (flightsBasket: ExtendedFlightBasket[], flightId: string): ExtendedFlightBasket => {\n return flightsBasket.find((flightBasket) => flightBasket.flight.segmentInfo.flightId === flightId);\n};\n\nexport const getFlightByGroup = (flightsBasket: ExtendedFlightBasket[], group: number): ExtendedFlightBasket[] => {\n return flightsBasket.filter((flightBasket) => flightBasket.flight.segmentInfo.group === group);\n};\n\nexport const basketHasWaitlistUpgrade = (flights: ExtendedFlightBasket[]): boolean => {\n return flights.reduce((acc, cur) => {\n const upgrade = getUpgradeFromFlight(cur.flight, cur.productName);\n\n return acc || upgrade.isWaitlist;\n }, false);\n};\n","import { Injectable, OnDestroy } from '@angular/core';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Subscription, take } from 'rxjs';\n\nimport { AppState, SentryLogger } from '@fcom/core';\nimport {\n GtmCustomMetrics,\n GtmEvent,\n HaulType,\n UpgradePaymentShortType,\n UpgradePaymentType,\n UpgradePurchaseData,\n UpgradePurchaseDataBasketFlight,\n} from '@fcom/common';\nimport { DateFormat, Pattern } from '@fcom/core/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { GtmService } from '@fcom/common/gtm';\n\nimport { BookingRef, ExtendedFlightBasket, PaymentType } from '../interfaces';\nimport { getCabinFromUpgradeName, getPaymentFromFlight } from '../utils/data.utils';\nimport { getBasketFlights, getBasketPassengerIds, selectDataState } from '../store';\nimport { Cabin, FlightV2 } from '../api/models';\nimport { getLocationsForGAString, isLongHaulUpgraded } from '../utils';\nimport { basketHasWaitlistUpgrade } from '../utils/basket.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UpgradeAnalyticsLegacyService implements OnDestroy {\n subscriptions: Subscription = new Subscription();\n dateFormat = 'yyyy-MM-dd';\n upgradePaymentTypeMap = {\n [Cabin.Ecopremium]: {\n [PaymentType.money]: UpgradePaymentType.ECOPREMIUM_CASH,\n [PaymentType.points]: UpgradePaymentType.ECOPREMIUM_POINTS,\n [PaymentType.EUROPE_UPGRADE]: UpgradePaymentType.ECOPREMIUM_SHORT_HAUL_VOUCHER,\n [PaymentType.LONG_HAUL_UPGRADE]: UpgradePaymentType.ECOPREMIUM_LONG_HAUL_VOUCHER,\n [PaymentType.COMPLIMENTARY]: UpgradePaymentType.ECOPREMIUM_COMPLIMENTARY,\n },\n [Cabin.Business]: {\n [PaymentType.money]: UpgradePaymentType.BUSINESS_CASH,\n [PaymentType.points]: UpgradePaymentType.BUSINESS_POINTS,\n [PaymentType.EUROPE_UPGRADE]: UpgradePaymentType.BUSINESS_SHORT_HAUL_VOUCHER,\n [PaymentType.LONG_HAUL_UPGRADE]: UpgradePaymentType.BUSINESS_LONG_HAUL_VOUCHER,\n [PaymentType.COMPLIMENTARY]: UpgradePaymentType.BUSINESS_COMPLIMENTARY,\n },\n };\n\n constructor(\n private store$: Store,\n private languageService: LanguageService,\n private sentry: SentryLogger,\n private gtmService: GtmService\n ) {}\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n sendUpgradePurchaseEvent(): void {\n this.subscriptions.add(\n combineLatest([\n this.store$.pipe(select(getBasketFlights)),\n this.store$.pipe(select(getBasketPassengerIds)),\n this.store$.pipe(select(selectDataState)),\n this.languageService.translate('date'),\n ])\n .pipe(take(1))\n .subscribe(([flightsBasket, passengerIds, dataState, dateTranslations]) => {\n try {\n let hasPaidWithMoney = false;\n let totalPointsSpent = 0;\n let totalMoneySpent = 0;\n let haulType = HaulType.SHORT;\n\n flightsBasket.forEach((flight) => {\n const paymentOption = getPaymentFromFlight(flight.flight, flight.productName, flight.paymentType);\n\n if (flight.paymentType === PaymentType.money) {\n hasPaidWithMoney = true;\n\n totalMoneySpent += Number(paymentOption.price) * passengerIds.length;\n }\n\n if (flight.paymentType === PaymentType.points) {\n totalPointsSpent += Number(paymentOption.price) * passengerIds.length;\n }\n\n if (flight.flight.segmentInfo.longHaul) {\n haulType = HaulType.LONG;\n }\n });\n\n const event: UpgradePurchaseData = {\n upgradePurchase: {\n activeCurrency: hasPaidWithMoney ? 'EUR' : null,\n purchaseSource: dataState.source || null,\n totalPointsSpent,\n origin: dataState.summary[0].originLocationCode,\n destination: dataState.summary[0].destinationLocationCode,\n departure: new DateFormat(dateTranslations).format(\n dataState.flights[0].segmentInfo.departureDateTime,\n new Pattern(this.dateFormat)\n ),\n return: new DateFormat(dateTranslations).format(\n dataState.flights[dataState.flights.length - 1].segmentInfo.arrivalDateTime,\n new Pattern(this.dateFormat)\n ),\n haulType,\n },\n ecommerce: {\n purchase: {\n actionField: {\n id: this.createActionIdForJourney(\n flightsBasket,\n dataState.flights,\n dataState.booking,\n dateTranslations\n ),\n revenue: String(totalMoneySpent),\n },\n products: flightsBasket.map((flight) =>\n this.generateBasketFlight(flight, flightsBasket, passengerIds)\n ),\n },\n },\n };\n\n this.sendTrackingEvent(event);\n } catch (e) {\n this.sentry.error('Failed to create analytics event for a one-upgrade purchase', {\n e: e.message,\n stack: e.stack,\n data: JSON.stringify({\n flightsBasket,\n passengerIds,\n dataState,\n dateTranslations,\n }),\n });\n }\n })\n );\n }\n\n createActionIdForJourney(\n flightsBasket: ExtendedFlightBasket[],\n flights: FlightV2[],\n bookingRef: BookingRef,\n dateTranslations: Record\n ): string {\n const isWaitlist = basketHasWaitlistUpgrade(flightsBasket);\n const startTime = new DateFormat(dateTranslations).format(\n flights[0].segmentInfo.departureDateTime,\n new Pattern(this.dateFormat)\n );\n const endTime = new DateFormat(dateTranslations).format(\n flights[flights.length - 1].segmentInfo.arrivalDateTime,\n new Pattern(this.dateFormat)\n );\n\n const locationsAndStartTime = `${getLocationsForGAString(flights)}_dep:${startTime}`;\n const bookingRefAndUpgradeStatus = `_${bookingRef.recLoc.toUpperCase()}${\n isWaitlist ? '_upgrade_waitlisted' : '_upgrade'\n }`;\n\n if (flights.length > 1) {\n return `${locationsAndStartTime}_ret:${endTime}${bookingRefAndUpgradeStatus}`;\n }\n\n return `${locationsAndStartTime}${bookingRefAndUpgradeStatus}`;\n }\n\n generateBasketFlight(\n flightBasket: ExtendedFlightBasket,\n flightsBasket: ExtendedFlightBasket[],\n passengerIds: string[]\n ): UpgradePurchaseDataBasketFlight {\n const cabin = getCabinFromUpgradeName(flightBasket.productName);\n let paymentType: PaymentType;\n const isComplimentary =\n !flightBasket.flight.segmentInfo.longHaul &&\n isLongHaulUpgraded(flightsBasket, flightBasket.flight.segmentInfo.group);\n\n if (isComplimentary) {\n paymentType = PaymentType.COMPLIMENTARY;\n } else {\n paymentType = flightBasket.paymentType;\n }\n\n const category = this.upgradePaymentTypeMap[cabin][paymentType];\n\n let price = '0';\n\n if (flightBasket.paymentType === PaymentType.money) {\n price = getPaymentFromFlight<'money'>(\n flightBasket.flight,\n flightBasket.productName,\n flightBasket.paymentType\n )?.price;\n }\n\n let points = 0;\n\n if (flightBasket.paymentType === PaymentType.points) {\n points = getPaymentFromFlight<'points'>(\n flightBasket.flight,\n flightBasket.productName,\n flightBasket.paymentType\n )?.price;\n }\n\n return {\n name: 'Upgrade',\n id: this.generateIdForFlightInBasket(flightBasket, flightsBasket),\n price,\n brand: 'Finnair',\n category,\n quantity: passengerIds.length,\n [GtmCustomMetrics.POINTS_SPENT]: points,\n };\n }\n\n generateIdForFlightInBasket(flightBasket: ExtendedFlightBasket, flightsBasket: ExtendedFlightBasket[]): string {\n let paymentType = UpgradePaymentShortType.UNKNOWN;\n\n if (\n !flightBasket.flight.segmentInfo.longHaul &&\n isLongHaulUpgraded(flightsBasket, flightBasket.flight.segmentInfo.group)\n ) {\n paymentType = UpgradePaymentShortType.COMPLIMENTARY;\n } else if (flightBasket.paymentType === PaymentType.money) {\n paymentType = UpgradePaymentShortType.CASH;\n } else if (\n flightBasket.paymentType === PaymentType.EUROPE_UPGRADE ||\n flightBasket.paymentType === PaymentType.LONG_HAUL_UPGRADE\n ) {\n paymentType = UpgradePaymentShortType.VOUCHER;\n } else if (flightBasket.paymentType === PaymentType.points) {\n paymentType = UpgradePaymentShortType.POINTS;\n }\n\n const boardPoint = flightBasket.flight.segmentInfo.boardPoint;\n const offPoint = flightBasket.flight.segmentInfo.offPoint;\n const longOrShortHaul = flightBasket.flight.segmentInfo.longHaul ? HaulType.LONG : HaulType.SHORT;\n\n return `UPGRADE_${boardPoint}-${offPoint}_${paymentType}_${longOrShortHaul}`;\n }\n\n sendTrackingEvent(gaEvent: UpgradePurchaseData): void {\n this.gtmService.pushEventToDataLayer(GtmEvent.UPGRADE_PURCHASE, gaEvent);\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, map, Observable, Subscription, take } from 'rxjs';\n\nimport {\n GA4Affiliation,\n Ga4AncillaryType,\n GA4Category,\n GA4Product,\n GA4PurchaseData,\n GA4PurchaseEvent,\n Ga4UpgradeWaitlist,\n GtmEvent,\n TripType,\n} from '@fcom/common';\nimport { AppState } from '@fcom/core';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { GtmService } from '@fcom/common/gtm';\nimport { TzDate } from '@fcom/core/utils';\nimport { CmsTripTypeMap } from '@fcom/core/utils/tripType.utils';\n\nimport { getBasketFlights, getBasketPassengerIds, getFlights, getUser, selectDataState } from '../store';\nimport { UpgradeAnalyticsLegacyService } from './upgrade-analytics-legacy.service';\nimport { Buyer, FlightsV2 } from '../api/models';\nimport { calculatePaymentTotal, getFlightsAsBookingLocationCodes } from '../utils';\nimport { ExtendedFlightBasket, FlightBasket } from '../interfaces';\nimport { getUpgradeFromFlight } from '../utils/data.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UpgradeAnalyticsService implements OnDestroy {\n subscriptions: Subscription = new Subscription();\n dateFormat = 'yyyy-MM-dd';\n\n constructor(\n private upgradeAnalyticsLegacyService: UpgradeAnalyticsLegacyService,\n private store$: Store,\n private languageService: LanguageService,\n private gtmService: GtmService\n ) {}\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n sendAddRemoveEvent(gtmEvent: GtmEvent.ADD_TO_CART | GtmEvent.REMOVE_FROM_CART, flightBasket: FlightBasket): void {\n this.subscriptions.add(\n combineLatest([\n this.store$.pipe(select(getFlights)),\n this.store$.pipe(select(getBasketPassengerIds)),\n this.store$.pipe(select(getUser)),\n ])\n .pipe(take(1))\n .subscribe(([flights, basketPassengers, buyer]) => {\n const fullFlight = flights.find((flight) => flight.segmentInfo.flightId === flightBasket.flightId);\n\n this.gtmService.ecommerceEventGA4(\n gtmEvent,\n this.mapUpgradestoGAProduct(\n [\n {\n ...flightBasket,\n flight: fullFlight,\n },\n ],\n basketPassengers,\n buyer\n )\n );\n })\n );\n }\n\n sendViewCartEvent(): void {\n this.subscriptions.add(\n this.getGa4PurchaseData(GtmEvent.VIEW_CART)\n .pipe(take(1))\n .subscribe((ecomNew) => {\n this.gtmService.ecommerceEventGA4(GtmEvent.VIEW_CART, ecomNew.items);\n })\n );\n }\n\n sendInitiateCheckoutEvent(): void {\n this.subscriptions.add(\n this.getGa4PurchaseData(GtmEvent.BEGIN_CHECKOUT)\n .pipe(take(1))\n .subscribe((ecomNew) => {\n this.gtmService.ecommerceEventGA4(GtmEvent.BEGIN_CHECKOUT, ecomNew.items);\n })\n );\n }\n\n sendPurchaseEvent(): void {\n this.upgradeAnalyticsLegacyService.sendUpgradePurchaseEvent();\n\n this.subscriptions.add(\n combineLatest([\n this.store$.pipe(select(getBasketFlights)),\n this.store$.pipe(select(getBasketPassengerIds)),\n this.store$.pipe(select(getUser)),\n this.languageService.translate('date'),\n this.getGa4PurchaseData(GtmEvent.PURCHASE),\n this.store$.pipe(select(getFlights)),\n ])\n .pipe(take(1))\n .subscribe(([basketFlights, basketPassengers, buyer, _dateTranslations, ecomNew, flights]) => {\n const paymentTotal = calculatePaymentTotal(basketFlights, basketPassengers.length, buyer);\n const allLocations = (flights as FlightsV2)\n .map(({ segmentInfo }) => `${segmentInfo.boardPoint}-${segmentInfo.offPoint}`)\n .join('_');\n const transactionEvent: GA4PurchaseEvent = {\n event: GtmEvent.PURCHASE,\n ...(paymentTotal.points ? { points_used: 'true' } : {}),\n ...(paymentTotal.points ? { points: paymentTotal.points } : {}),\n ecomNew,\n all_locations: allLocations,\n };\n\n this.gtmService.ecommercePurchaseEventGa4(transactionEvent);\n })\n );\n }\n\n getTransactionId(flights: FlightsV2, gtmEvent: GtmEvent): string {\n const bookingLocationCodes = getFlightsAsBookingLocationCodes(flights);\n const tripType = getTripTypeFromBookingLocationCodes(bookingLocationCodes);\n const dateTime = TzDate.now().toISOString();\n const locationCodesAsString = (tripType === TripType.RETURN ? [bookingLocationCodes[0]] : bookingLocationCodes)\n .map((locationCodes) => {\n return `${locationCodes.originLocationCode}-${locationCodes.destinationLocationCode}`;\n })\n .join(',');\n\n return `${gtmEvent}-${CmsTripTypeMap[tripType]}-${locationCodesAsString}-${dateTime}`;\n }\n\n getGa4PurchaseData(gtmEvent: GtmEvent): Observable {\n return combineLatest([\n this.store$.pipe(select(getBasketFlights)),\n this.store$.pipe(select(getBasketPassengerIds)),\n this.store$.pipe(select(selectDataState)),\n this.store$.pipe(select(getUser)),\n this.languageService.translate('date'),\n ]).pipe(\n take(1),\n map(([basketFlights, basketPassengers, dataState, buyer, _dateTranslations]) => {\n const paymentTotal = calculatePaymentTotal(basketFlights, basketPassengers.length, buyer);\n\n return {\n transaction_id: this.getTransactionId(dataState.flights, gtmEvent),\n affiliation: GA4Affiliation.MMB,\n value: paymentTotal.money,\n tax: 0,\n shipping: 0,\n currency: paymentTotal.currency || 'EUR',\n items: this.mapUpgradestoGAProduct(basketFlights, basketPassengers, buyer),\n };\n })\n );\n }\n\n mapUpgradestoGAProduct(\n basketFlights: ExtendedFlightBasket[],\n basketPassengers: string[],\n buyer: Buyer\n ): GA4Product[] {\n return basketFlights.map((basketFlight) => {\n const originCode = basketFlight.flight.segmentInfo.boardPoint;\n const destinationCode = basketFlight.flight.segmentInfo.offPoint;\n const paymentInfo = calculatePaymentTotal(basketFlights, basketPassengers.length, buyer);\n const product = getUpgradeFromFlight(basketFlight.flight, basketFlight.productName);\n\n return {\n item_id: `Upgrade_${basketFlight.productName}`,\n item_name: `Upgrade_${basketFlight.productName}`,\n price: paymentInfo.money,\n quantity: basketPassengers.length,\n currency: paymentInfo.currency || 'EUR',\n affiliation: GA4Affiliation.MMB,\n item_category: GA4Category.ANCILLARIES,\n item_category2: Ga4AncillaryType.UPGRADE,\n item_category3: basketFlight.paymentType,\n item_category4: `${originCode}-${destinationCode}`,\n item_category5: product.isWaitlist ? Ga4UpgradeWaitlist.WAITLISTED : Ga4UpgradeWaitlist.NOT_WAITLISTED,\n item_variant: basketFlight.productName,\n };\n });\n }\n}\n","\n \n\n\n\n \n\n\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n {{ flight.segmentInfo.departureDateTime | finTime }}\n {{ flight.segmentInfo.boardPoint | finLocationName }}\n
\n \n \n {{ transportTypeI18n | finLocalization }}\n \n \n \n \n {{ cabin | finLocalization }}\n \n \n
\n
\n
\n {{ flight.segmentInfo.arrivalDateTime | finTime }}\n {{ flight.segmentInfo.offPoint | finLocationName }}\n
\n
\n
\n\n
\n
\n 1\" class=\"bold-type\"\n >{{ flight.segmentInfo.ordinal }}/{{ numberOfFlights }} \n {{\n 'oneUpgrade.selectTravelClass' | finLocalization\n }}\n
\n \n \n {{\n 'oneUpgrade.aria.upgradeOptionsInfo'\n | finLocalization\n : {\n journeyIndex: flight.segmentInfo.group,\n legIndex: flight.segmentInfo.ordinal,\n }\n }}\n \n\n \n {{\n 'oneUpgrade.aria.selectedUpgradeInfo'\n | finLocalization\n : {\n journeyIndex: flight.segmentInfo.group,\n legIndex: flight.segmentInfo.ordinal,\n }\n }}\n \n\n \n {{\n 'oneUpgrade.aria.flightInfo'\n | finLocalization\n : {\n departure: flight.segmentInfo.boardPoint | finLocationName,\n departureDate: flight.segmentInfo.departureDateTime | finDateFormat: 'FULL_NO_YEAR',\n departureTime: flight.segmentInfo.departureDateTime | finTime,\n arrival: flight.segmentInfo.offPoint | finLocationName,\n arrivalDate: flight.segmentInfo.arrivalDateTime | finDateFormat: 'FULL_NO_YEAR',\n arrivalTime: flight.segmentInfo.arrivalDateTime | finTime,\n }\n }}\n \n\n \n
\n
\n
\n\n
\n\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store, select } from '@ngrx/store';\nimport { map, Observable } from 'rxjs';\n\nimport { Breakpoint } from '@fcom/common/interfaces/breakpoint.interface';\nimport { Duration } from '@fcom/dapi';\nimport { resolveTailName } from '@fcom/core/utils';\n\nimport { Cabin, FlightsV2, FlightV2, TransportType } from '../../api/models';\nimport { getFlightById } from '../../utils/basket.utils';\nimport { getBasketFlights, getStage } from '../../store/selectors';\nimport { State, Stage, ExtendedFlightBasket } from '../../interfaces';\nimport { UpgradeStatus } from '../../api/models/upgrade-status';\n\n@Component({\n selector: 'fin-upgrade-bound-card',\n templateUrl: 'bound-card.component.html',\n styleUrls: ['bound-card.component.scss'],\n})\nexport class BoundCardComponent implements OnInit {\n readonly UpgradeStatus = UpgradeStatus;\n readonly Breakpoint = Breakpoint;\n readonly Stage = Stage;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly TransportType = TransportType;\n\n @Input()\n flight: FlightV2;\n\n @Input()\n allFlights: FlightsV2;\n\n @Input()\n numberOfFlights: number;\n\n @Input()\n first: boolean;\n\n @Input()\n last: boolean;\n\n @Input()\n highlighted: boolean;\n\n @Input()\n bordered: boolean;\n\n currentStage$: Observable;\n flightInBasket$: Observable;\n\n mapTransportTypeToIcon: Record = {\n [TransportType.Bus]: {\n arrival: SvgLibraryIcon.BUS,\n departure: SvgLibraryIcon.BUS,\n },\n [TransportType.Train]: {\n arrival: SvgLibraryIcon.TRAIN,\n departure: SvgLibraryIcon.TRAIN,\n },\n [TransportType.Flight]: {\n arrival: SvgLibraryIcon.ARRIVAL,\n departure: SvgLibraryIcon.DEPARTURE,\n },\n [TransportType.Unknown]: {\n arrival: SvgLibraryIcon.HELP,\n departure: SvgLibraryIcon.HELP,\n },\n };\n\n constructor(private store: Store) {}\n\n ngOnInit(): void {\n this.currentStage$ = this.store.pipe(select(getStage));\n this.flightInBasket$ = this.store.pipe(select(getBasketFlights)).pipe(\n map((flightBasket) => {\n return getFlightById(flightBasket, this.flight.segmentInfo.flightId);\n })\n );\n }\n\n resolveTails(airlineCode: string): string[] {\n return airlineCode ? [resolveTailName(airlineCode)] : [];\n }\n\n formatDuration(minutes: number): Duration {\n return {\n hours: Math.floor(minutes / 60),\n minutes: Math.ceil(minutes % 60),\n milliseconds: 0,\n };\n }\n\n getFlightTypeI18n(cabin: Cabin, transportType: TransportType): string {\n const map = {\n [Cabin.Economy]: `oneUpgrade.tabs.${Cabin.Economy.toLowerCase()}`,\n [Cabin.Ecopremium]: `oneUpgrade.tabs.${Cabin.Ecopremium.toLowerCase()}`,\n [Cabin.Business]: `oneUpgrade.tabs.${Cabin.Business.toLowerCase()}`,\n [TransportType.Bus]: 'oneUpgrade.transportType.bus',\n [TransportType.Train]: 'oneUpgrade.transportType.train',\n [TransportType.Unknown]: 'oneUpgrade.transportType.unknown',\n };\n\n return map[transportType] || map[cabin];\n }\n\n showAsStopOver(currentFlight: FlightV2, type: 'arrival' | 'departure'): boolean {\n const { ordinal, transportType, group } = currentFlight.segmentInfo;\n const searchOrdinal = type === 'departure' ? ordinal - 1 : ordinal + 1;\n const foundFlight = this.allFlights.find((flight) => {\n return flight.segmentInfo.group === group && flight.segmentInfo.ordinal === searchOrdinal;\n });\n\n if (!foundFlight || transportType !== TransportType.Flight) {\n return false;\n }\n\n return foundFlight.segmentInfo.transportType === TransportType.Flight;\n }\n}\n","\n \n {{ 'departure' | finLocalization }}\n \n \n {{ 'returnDate' | finLocalization }}\n \n \n {{ 'oneUpgrade.flightNumber' | finLocalization: [flightNumber] }}\n \n\n {{\n bounds[0].segmentInfo.departureDateTime | finDateFormat: 'FULL'\n }}\n\n\n\n

\n \n

\n

\n \n

\n\n

\n \n 1; else directFlightAriaText\">\n {{\n 'oneUpgrade.aria.journeyInfo'\n | finLocalization\n : {\n departure: bounds[0].segmentInfo.boardPoint | finLocationName,\n departureDate: bounds[0].segmentInfo.departureDateTime | finDateFormat: 'FULL',\n departureTime: bounds[0].segmentInfo.departureDateTime | finTime,\n arrival: bounds[amount - 1].segmentInfo.offPoint | finLocationName,\n arrivalDate: bounds[amount - 1].segmentInfo.arrivalDateTime | finDateFormat: 'FULL',\n arrivalTime: bounds[amount - 1].segmentInfo.arrivalDateTime | finTime,\n stops: amount - 1,\n }\n }}\n \n\n \n {{\n 'oneUpgrade.aria.directJourneyInfo'\n | finLocalization\n : {\n departure: bounds[0].segmentInfo.boardPoint | finLocationName,\n departureDate: bounds[0].segmentInfo.departureDateTime | finDateFormat: 'FULL',\n departureTime: bounds[0].segmentInfo.departureDateTime | finTime,\n arrival: bounds[amount - 1].segmentInfo.offPoint | finLocationName,\n arrivalDate: bounds[amount - 1].segmentInfo.arrivalDateTime | finDateFormat: 'FULL',\n arrivalTime: bounds[amount - 1].segmentInfo.arrivalDateTime | finTime,\n }\n }}\n \n \n\n \n {{ 'oneUpgrade.direct' | finLocalization }}\n {{\n 'stopOver' | finLocalization: [amount - 1]\n }}\n {{\n 'stopOvers' | finLocalization: [amount - 1]\n }}\n \n

\n
\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { Store, select } from '@ngrx/store';\nimport { Observable } from 'rxjs';\n\nimport { getStage } from '../../store/selectors';\nimport { State, Stage } from '../../interfaces';\nimport { FlightsV2 } from '../../api/models';\n\n@Component({\n selector: 'fin-upgrade-journey-info',\n templateUrl: 'journey-info.component.html',\n})\nexport class JourneyInfoComponent implements OnInit {\n @Input()\n bounds: FlightsV2 = [];\n @Input()\n flightNumber = 0;\n @Input()\n isMultiCity = false;\n @Input()\n headingLevel: 2 | 3 = 3;\n\n currentStage$: Observable;\n public readonly Stage = Stage;\n\n constructor(private store: Store) {}\n\n ngOnInit(): void {\n this.currentStage$ = this.store.pipe(select(getStage));\n }\n\n get isDeparture(): boolean {\n return this.flightNumber === 1 && !this.isMultiCity;\n }\n\n get isReturn(): boolean {\n return this.flightNumber === 2 && !this.isMultiCity;\n }\n}\n","\n
{{ noUpgradesMessage | finLocalization }}
\n
\n\n\n

\n \n {{ 'oneUpgrade.review.upgradeToBusiness' | finLocalization }}\n \n \n {{ 'oneUpgrade.review.upgradeToEcoPremium' | finLocalization }}\n \n

\n\n
\n

{{ printPrice(flight) | async }}

\n\n

\n \n ({{ 'oneUpgrade.upgradeSelection.pricesForPassenger' | finLocalization }})\n ({{\n 'oneUpgrade.upgradeSelection.pricesForPassengers' | finLocalization: { passengerAmount: selectedAmount }\n }})\n \n

\n
\n\n \n {{ 'oneUpgrade.notifications.waitlistedUpgrade' | finLocalization }}\n \n
\n\n\n 2\"\n [bounds]=\"getAllBoundsForJourney(bounds) | async\"\n [headingLevel]=\"2\"\n >\n \n
\n \n \n
1\">\n {{ flight.segmentInfo.ordinal }}/{{ numberOfFlights }}\n
\n
\n \n \n \n
\n \n \n\n
\n \n {{ 'oneUpgrade.upgradeSelection.change' | finLocalization }}\n \n
\n\n","import { Component, OnInit } from '@angular/core';\n\nimport { Store, select } from '@ngrx/store';\nimport { map } from 'rxjs/operators';\nimport { combineLatest, Observable } from 'rxjs';\n\nimport { ModalButtons, NotificationLayout } from '@fcom/ui-components';\n\nimport { getNumberOfFlightsInBound } from '../../utils';\nimport { Cabin, FlightsV2, FlightV2, Upgrade, UpgradeProduct, UpgradeStatus } from '../../api/models';\nimport { UpgradePaymentService } from '../../services/upgrade-payment.service';\nimport { State } from '../../interfaces/store.interface';\nimport { Stage } from '../../interfaces/stage.interface';\nimport { ModalActions, StatusActions } from '../../store/actions';\nimport { getBasketPassengerIds, getJourneys, getBasketFlights } from '../../store/selectors';\nimport { getUpgradeFromFlight } from '../../utils/data.utils';\n\nexport interface ExtendedFlightV2 extends FlightV2 {\n isBeingUpgraded: boolean;\n isWaitlisted: boolean;\n noUpgradesMessage: string;\n cabin: Cabin;\n}\n\n@Component({\n selector: 'fin-upgrade-review-bounds',\n templateUrl: 'review-bounds.component.html',\n styleUrls: ['review-bounds.component.scss'],\n})\nexport class ReviewBoundsComponent implements OnInit {\n readonly NotificationLayout = NotificationLayout;\n readonly Cabin = Cabin;\n\n journeysWithUpgrades$: Observable;\n selectedPassengers$: Observable;\n\n constructor(\n private store$: Store,\n private upgradePaymentService: UpgradePaymentService\n ) {}\n\n ngOnInit(): void {\n this.selectedPassengers$ = this.store$.pipe(select(getBasketPassengerIds));\n this.journeysWithUpgrades$ = combineLatest([\n this.store$.pipe(select(getJourneys)),\n this.store$.pipe(select(getBasketFlights)),\n ]).pipe(\n map(([journeys, basketFlights]) => {\n return journeys.map((journey) => {\n return journey.map((flight): ExtendedFlightV2 => {\n const matchingFlight = basketFlights.find(\n (selectedFlight) => flight.segmentInfo.flightId === selectedFlight.flightId\n );\n\n return {\n ...flight,\n isBeingUpgraded: Boolean(matchingFlight),\n noUpgradesMessage: !matchingFlight ? this.getNoUpgradesMessage(flight) : null,\n isWaitlisted: matchingFlight && getUpgradeFromFlight(flight, matchingFlight.productName)?.isWaitlist,\n cabin: matchingFlight?.cabin,\n };\n });\n });\n })\n );\n }\n\n printPrice(flight: FlightV2): Observable {\n return this.upgradePaymentService.getPriceForSelectedFlight(flight);\n }\n\n getAllBoundsForJourney(bounds: FlightsV2): Observable {\n const idsInJourney = bounds.map((bound) => bound.segmentInfo.flightId);\n\n return this.journeysWithUpgrades$.pipe(\n map((journeys: FlightsV2[]) => {\n return journeys.find((flights: FlightsV2) => {\n return flights.some((bound) => idsInJourney.includes(bound.segmentInfo.flightId));\n });\n })\n );\n }\n\n getNumberOfFlights(flight: FlightV2, bounds: FlightsV2): number {\n return getNumberOfFlightsInBound(flight, bounds);\n }\n\n onFlightsChange(): void {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.FLIGHTS }));\n }\n\n openModal(event: Event, flightId: string): void {\n event.stopPropagation();\n\n this.store$.dispatch(\n ModalActions.openModal({\n modal: {\n title: 'oneUpgrade.upgradeSelection.waitlistInfoModal.title',\n fragment: 'fragments.oneUpgrade.waitlistHelp.url',\n buttons: ModalButtons.DONE,\n },\n returnTarget: `[data-flight=\"${flightId}\"] fcom-notification button`,\n })\n );\n }\n\n getNoUpgradesMessage(flight: FlightV2): string {\n const upgradeNotAvailable = (upgrade?: Upgrade) => {\n return !upgrade || upgrade.upgradeStatus === UpgradeStatus.NotAvailable;\n };\n\n const noneAvailable = flight.upgrades.every((upgrade) => {\n return [UpgradeStatus.NotAvailable, UpgradeStatus.Failed].includes(upgrade.upgradeStatus);\n });\n\n if (noneAvailable) {\n return 'oneUpgrade.review.noneAvailableNotification';\n }\n\n const ecoToPE = getUpgradeFromFlight(flight, UpgradeProduct.EconomyToPremiumeconomy);\n const peToBiz = getUpgradeFromFlight(flight, UpgradeProduct.PremiumeconomyToBusiness);\n const ecoToBiz = getUpgradeFromFlight(flight, UpgradeProduct.EconomyToBusiness);\n\n if (ecoToPE?.upgradeStatus === UpgradeStatus.Waitlisted && upgradeNotAvailable(peToBiz)) {\n return 'oneUpgrade.review.waitlistedNotificationPremiumEconomy';\n }\n\n if (ecoToBiz?.upgradeStatus === UpgradeStatus.Waitlisted || peToBiz?.upgradeStatus === UpgradeStatus.Waitlisted) {\n return 'oneUpgrade.review.waitlistedNotificationBusiness';\n }\n\n if (ecoToPE?.upgradeStatus === UpgradeStatus.Success && upgradeNotAvailable(peToBiz)) {\n return 'oneUpgrade.review.confirmedNotificationPremiumEconomy';\n }\n\n if (ecoToBiz?.upgradeStatus === UpgradeStatus.Success || peToBiz?.upgradeStatus === UpgradeStatus.Success) {\n return 'oneUpgrade.review.confirmedNotificationBusiness';\n }\n\n return 'oneUpgrade.review.noUpgrades';\n }\n\n boundHasAvailableUpgrades(bound: ExtendedFlightV2[]): boolean {\n let hasUpgrades = false;\n\n bound.forEach((flight) => {\n flight.upgrades.forEach((upgrade) => {\n if (upgrade.upgradeStatus === UpgradeStatus.Available) {\n hasUpgrades = true;\n }\n });\n });\n\n return hasUpgrades;\n }\n}\n","\n\n
\n \n \n {{ 'oneUpgrade.upgradeSelection.passengers' | finLocalization }}\n \n \n \n \n\n \n {{ getSelectedName(selectedPassenger) | async }}\n \n
\n \n\n
1\" class=\"align-right\">\n \n {{ 'oneUpgrade.upgradeSelection.change' | finLocalization }}\n \n
\n
\n \n\n\n\n
\n
\n \n \n \n {{ getSelectedName(passenger.passengerId) | async }}\n ({{ 'passenger.child' | finLocalization }})\n \n \n \n
\n\n
\n \n {{ seatInfoText | async }}\n \n
\n
\n
\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, UntypedFormArray, Validators, AbstractControl } from '@angular/forms';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store, select } from '@ngrx/store';\nimport { Observable, Subject, combineLatest, Subscription } from 'rxjs';\nimport { distinctUntilChanged, map, pluck, switchMap, withLatestFrom, take, share } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { NotificationLayout } from '@fcom/ui-components';\nimport { capitalize } from '@fcom/core/utils';\nimport { ToasterService } from '@fcom/common';\nimport { profileOrUndefinedIfNotLoggedIn } from '@fcom/core/selectors';\nimport { Profile } from '@fcom/core-api/login';\n\nimport { Passengers, Passenger, Buyer, VoucherType } from '../../api/models';\nimport { PaymentTotal, State, StatusState, Stage, FlightBasket, PaymentType } from '../../interfaces';\nimport {\n getBasketPassengerIds,\n getPassengers,\n selectStatusState,\n getBasketFlights,\n getMaxPassengers,\n getMinimumPaymentOptions,\n getUser,\n getChildIsTravellingAlone,\n} from '../../store/selectors';\nimport { getVoucherAmount } from '../../utils';\nimport { BasketActions, StatusActions } from '../../store/actions';\n\nexport const TOASTER_MAX_PAX_ID = 'UPGRADE_MAX_PAX_SELECTED';\nexport const TOASTER_CHILD_TRAVELLING_ALONE_ID = 'CHILD_TRAVELLING_ALONE';\n\n@Component({\n selector: 'fin-upgrade-passenger-selection',\n templateUrl: 'passenger-selection.component.html',\n styleUrls: ['passenger-selection.component.scss'],\n})\nexport class PassengerSelectionComponent implements OnInit, OnDestroy {\n readonly NotificationLayout = NotificationLayout;\n readonly Stage = Stage;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n subscriptions: Subscription = new Subscription();\n passengerForm: UntypedFormGroup;\n passengers$: Observable;\n selectedPassengers$: Observable;\n selectedFlights$: Observable;\n maxPassengers$: Observable;\n currentStage$: Observable;\n minPaymentOptions$: Observable;\n loggedInProfile$: Observable;\n user$: Observable;\n paxStream$: Observable<{ passengers: Passengers; maxPax: number; selected: string[]; atPaymentLimit: boolean }>;\n childIsTravellingAlone$: Observable;\n showPaxLimit$: Observable;\n\n onPassengerToggle$ = new Subject<{ selected: boolean; passengerId: string }>();\n\n constructor(\n private store: Store,\n private fb: UntypedFormBuilder,\n private language: LanguageService,\n private toaster: ToasterService\n ) {}\n\n ngOnInit(): void {\n this.passengers$ = this.store.pipe(select(getPassengers));\n this.selectedPassengers$ = this.store.pipe(select(getBasketPassengerIds));\n this.selectedFlights$ = this.store.pipe(select(getBasketFlights));\n this.maxPassengers$ = this.store.pipe(select(getMaxPassengers));\n this.currentStage$ = this.store.pipe(select(selectStatusState));\n this.minPaymentOptions$ = this.store.pipe(select(getMinimumPaymentOptions));\n this.loggedInProfile$ = this.store.pipe(profileOrUndefinedIfNotLoggedIn());\n this.user$ = this.store.pipe(select(getUser));\n this.childIsTravellingAlone$ = this.store.pipe(select(getChildIsTravellingAlone));\n this.paxStream$ = combineLatest([this.passengers$, this.maxPassengers$, this.selectedPassengers$]).pipe(\n switchMap(([passengers, maxPax, selected]) => {\n return this.atPaymentLimit(selected.length).pipe(\n map((atPaymentLimit) => ({ passengers, maxPax, selected, atPaymentLimit }))\n );\n }),\n share()\n );\n\n this.showPaxLimit$ = combineLatest([this.passengers$, this.maxPassengers$]).pipe(\n map(([pax, max]) => max < pax.length)\n );\n\n this.subscriptions.add(\n this.paxStream$.subscribe(({ passengers, maxPax, selected, atPaymentLimit }) => {\n this.constructForm(passengers, maxPax, selected, atPaymentLimit);\n })\n );\n\n this.subscriptions.add(\n this.showMaxPaxToaster().subscribe((showToaster: boolean) => {\n this.toggleToaster(showToaster, TOASTER_MAX_PAX_ID, 'oneUpgrade.toaster.maxPaxSelected');\n })\n );\n\n this.subscriptions.add(\n this.childIsTravellingAlone$\n .pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)))\n .subscribe((childIsTravellingAlone: boolean) => {\n this.toggleToaster(\n childIsTravellingAlone,\n TOASTER_CHILD_TRAVELLING_ALONE_ID,\n 'oneUpgrade.toaster.childCannotTravelAlone'\n );\n })\n );\n\n this.subscriptions.add(\n this.onPassengerToggle$.pipe(withLatestFrom(this.selectedFlights$)).subscribe(([data, selectedFlights]) => {\n this.togglePassenger(data.selected, data.passengerId);\n\n if (selectedFlights.length) {\n this.store.dispatch(BasketActions.clearFlights());\n }\n })\n );\n\n this.subscriptions.add(\n combineLatest([this.passengers$, this.currentStage$])\n .pipe(take(1))\n .subscribe(([passengers, { stage }]) => {\n if (stage === Stage.PASSENGERS && passengers.length < 2) {\n this.store.dispatch(StatusActions.setStage({ stage: Stage.FLIGHTS }));\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n get seatInfoText(): Observable {\n return this.maxPassengers$.pipe(\n map((max) => [\n max === 1 ? 'oneUpgrade.upgradeSelection.seatLimit.singular' : 'oneUpgrade.upgradeSelection.seatLimit.plural',\n max,\n ]),\n switchMap(([key, max]): Observable => this.language.translate(key, { amount: max }))\n );\n }\n\n get passengerControls(): AbstractControl[] {\n return (this.passengerForm.get('passengers') as UntypedFormArray).controls;\n }\n\n showMaxPaxToaster(): Observable {\n return this.paxStream$.pipe(\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n map(({ passengers, selected, atPaymentLimit }) => Boolean(atPaymentLimit && selected.length < passengers.length))\n );\n }\n\n getPassengerDetails(index: number): Observable {\n return this.passengers$.pipe(pluck(index));\n }\n\n constructForm(passengers: Passenger[], maxPax: number, selectedPax: string[] = [], paymentLimit = false): void {\n this.passengerForm = this.fb.group({\n hidden: this.fb.control(''), // this prevents whole form from being in disabled state when selected passenger is disabled\n passengers: this.fb.array(\n passengers.map((pax) => {\n if (passengers.length === 1 && !selectedPax.includes(pax.passengerId)) {\n this.store.dispatch(BasketActions.addPaxToBasket({ passengerId: pax.passengerId }));\n this.store.dispatch(StatusActions.setStage({ stage: Stage.FLIGHTS }));\n }\n\n const disabled = (selectedPax.length >= maxPax || paymentLimit) && !selectedPax.includes(pax.passengerId);\n\n return this.fb.control({\n value: selectedPax.includes(pax.passengerId) || passengers.length === 1,\n disabled: passengers.length === 1 || disabled,\n });\n }),\n [Validators.required]\n ),\n });\n }\n\n togglePassenger(selected: boolean, passengerId: string): void {\n if (selected) {\n this.store.dispatch(BasketActions.addPaxToBasket({ passengerId }));\n } else {\n this.store.dispatch(BasketActions.removePassenger({ passengerId }));\n }\n }\n\n onChangePassengers(): void {\n this.store.dispatch(StatusActions.setStage({ stage: Stage.PASSENGERS }));\n }\n\n getSelectedName(passengerId: string): Observable {\n return this.passengers$.pipe(\n map(\n (passengers) =>\n passengers\n .filter((pax) => pax.passengerId === passengerId)\n .map((pax) => `${capitalize(pax.firstName)} ${capitalize(pax.lastName)}`)[0] || ''\n )\n );\n }\n\n /**\n * If only points or voucher payment available check if user has sufficient points or vouchers to upgrade an additional passenger\n * @param pax current number of selected passengers\n */\n private atPaymentLimit(pax: number): Observable {\n return combineLatest([this.loggedInProfile$, this.user$, this.minPaymentOptions$]).pipe(\n take(1),\n map(([loggedIn, buyer, payment]) => {\n if (!loggedIn || payment.money) {\n return false;\n } // not at limit if money option or not loggedIn\n\n if (\n (!payment.points || (buyer.points || 0) < payment.points * (pax + 1)) && // no points payment or insufficient points\n (!payment[PaymentType.EUROPE_UPGRADE] ||\n getVoucherAmount(VoucherType.EuropeUpgrade, buyer) < payment[PaymentType.EUROPE_UPGRADE] * (pax + 1)) && // no shortHaul payment or insufficient vouchers\n (!payment[PaymentType.LONG_HAUL_UPGRADE] ||\n getVoucherAmount(VoucherType.LongHaulUpgrade, buyer) <\n payment[PaymentType.LONG_HAUL_UPGRADE] * (pax + 1)) && // no longHaul payment or insufficient vouchers\n (!payment[PaymentType.UPGRADE_BENEFIT] ||\n getVoucherAmount(VoucherType.UpgradeBenefit, buyer) < payment[PaymentType.UPGRADE_BENEFIT] * (pax + 1)) // no upgrade_benefit payment or insufficient vouchers\n ) {\n return true;\n }\n return false;\n })\n );\n }\n\n /**\n * Shows or hides the toaster message\n * @param showToaster boolean value to show or hide the message\n * @param id id of the toaster in question\n * @param contentKey translation key of the message\n */\n private toggleToaster(showToaster: boolean, id: string, contentKey: string): void {\n if (showToaster) {\n this.toaster.addMessageToQueue({\n id,\n contentKey,\n autoClose: false,\n beneathModal: true,\n });\n } else {\n this.toaster.removeMessage(id);\n }\n }\n}\n","\n {{ 'oneUpgrade.pageTitle.review' | finLocalization }}\n\n\n \n \n
\n
\n
\n

\n {{ 'oneUpgrade.review.grandTotal' | finLocalization }}\n

\n\n

\n \n {{ payment }},\n \n

\n
\n
\n
\n
\n","import { Component, AfterViewInit, ViewChild, ElementRef, OnInit } from '@angular/core';\n\nimport { Store, select } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport { LoaderTheme } from '@fcom/ui-components';\n\nimport { UpgradePaymentService } from '../../services/upgrade-payment.service';\nimport { State } from '../../interfaces/store.interface';\nimport { getStatusPending } from '../../store/selectors';\nimport { UpgradeAnalyticsService } from '../../services/upgrade-analytics.service';\n\n@Component({\n selector: 'fin-upgrade-review',\n templateUrl: 'review.component.html',\n styleUrls: ['review.component.scss'],\n})\nexport class ReviewComponent implements OnInit, AfterViewInit {\n readonly LoaderTheme = LoaderTheme;\n\n selectedPayments$: Observable;\n loading$: Observable;\n\n @ViewChild('reviewHeading', { static: false }) reviewHeading: ElementRef;\n\n constructor(\n private store: Store,\n private upgradePaymentService: UpgradePaymentService,\n private upgradeAnalyticsService: UpgradeAnalyticsService\n ) {}\n\n ngOnInit(): void {\n this.selectedPayments$ = this.upgradePaymentService.getAllSelectedPayments().pipe(first());\n this.loading$ = this.store.pipe(select(getStatusPending));\n this.upgradeAnalyticsService.sendViewCartEvent();\n }\n\n ngAfterViewInit(): void {\n this.reviewHeading.nativeElement.focus();\n }\n}\n","\n \n

\n
\n {{ 'sorry' | finLocalization }}\n
\n

\n
\n \n \n
\n
\n\n\n \n

\n
\n {{ 'sorry' | finLocalization }}\n
\n

\n
\n

{{ 'oneUpgrade.errors.paymentError' | finLocalization }}

\n
\n
\n\n\n \n \n \n \n \n \n \n \n \n
\n

\n {{ 'oneUpgrade.' + upgradeError + '.heading' | finLocalization }}\n

\n

{{ 'oneUpgrade.' + upgradeError + '.paragraph' | finLocalization }}

\n\n \n

\n {{ 'oneUpgrade.bookingRef' | finLocalization }}\n

\n

{{ bookingRef.recLoc | uppercase }}

\n
\n\n \n \n

\n {{ 'oneUpgrade.tripDetails' | finLocalization }}\n

\n \n
\n
\n
\n
\n
\n\n
\n \n
\n \n
\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport { filter, map, Observable, Subscription, take, tap } from 'rxjs';\n\nimport { BookingHeaderSummary } from '@fcom/common/interfaces';\nimport { TripType } from '@fcom/core/interfaces';\nimport { ButtonSize, ButtonTheme } from '@fcom/ui-components';\nimport { hasOrderData } from '@fcom/common-booking';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { AppState, ConfigService, RootPaths } from '@fcom/core';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { MANAGE_BOOKING_STEPS } from '@fcom/common-booking/manage-booking-config';\n\nimport { Stage, ErrorType, UpgradeError, BookingRef } from '../../interfaces';\nimport { StatusActions, DataActions, AuthActions, BasketActions } from '../../store/actions';\nimport { getBookingRef, getError, getJourneySummary } from '../../store/selectors';\n\n@Component({\n selector: 'fin-upgrade-error',\n templateUrl: 'error.component.html',\n})\nexport class ErrorComponent implements OnInit, OnDestroy {\n errorType: ErrorType = ErrorType.error;\n public readonly TripType = TripType;\n\n readonly ButtonSize = ButtonSize;\n readonly ButtonTheme = ButtonTheme;\n readonly ErrorType = ErrorType;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly UpgradeError = UpgradeError;\n\n subscriptions: Subscription = new Subscription();\n\n upgradeError$: Observable;\n bookingRef$: Observable;\n journey$: Observable>;\n\n constructor(\n private store$: Store,\n private route: ActivatedRoute,\n private router: Router,\n private configService: ConfigService,\n private languageService: LanguageService\n ) {}\n\n ngOnInit(): void {\n this.bookingRef$ = this.store$.pipe(select(getBookingRef));\n this.journey$ = this.store$.pipe(\n select(getJourneySummary),\n map((journey) => {\n return {\n locations: journey,\n tripType: getTripTypeFromBookingLocationCodes(journey),\n };\n })\n );\n this.store$.dispatch(DataActions.clearPassengers());\n this.store$.dispatch(BasketActions.clearBasket());\n\n this.upgradeError$ = this.store$.pipe(\n select(getError),\n filter((error) => {\n if (!error || [UpgradeError.none, UpgradeError.httpError].includes(error)) {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n return false;\n }\n\n return true;\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n getMMBViewPath(): Array {\n return [this.languageService.langValue, RootPaths.MANAGE_BOOKING_ROOT, MANAGE_BOOKING_STEPS.VIEW.path];\n }\n\n get cta(): string {\n return this.configService.cfg.enableUpgradeTravelClass ? 'errors.booking.cta' : 'oneUpgrade.errors.maintenance.cta';\n }\n\n async onStartOver(): Promise {\n this.subscriptions.add(\n this.store$\n .pipe(hasOrderData())\n .pipe(\n take(1),\n tap(async () => {\n if (this.errorType === ErrorType.maintenance) {\n try {\n const home = this.route.snapshot.root.firstChild.url[0].path;\n await this.router.navigate([`/${home}`]);\n } catch (_e) {\n await this.router.navigate(['/']);\n }\n }\n })\n )\n .subscribe((hasOrderDataValue) => {\n this.store$.dispatch(AuthActions.logout());\n\n if (hasOrderDataValue) {\n this.router.navigate(this.getMMBViewPath(), { replaceUrl: true });\n } else {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n }\n })\n );\n }\n}\n"," \n\n
\n \n \n
\n\n\n \n
\n

\n {{ 'oneUpgrade.success.feedbackClarification' | finLocalization }}\n

\n \n \n \n
\n
\n
\n\n
\n \n
\n","import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { map, take, tap } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { IconPosition } from '@fcom/ui-components';\nimport { serializeParams, unsubscribe } from '@fcom/core/utils';\nimport { DateFormatPipe } from '@fcom/common';\nimport { QualtricsSurveys } from '@fcom/common/qualtrics/qualtrics.utils';\nimport { RootPaths } from '@fcom/core';\nimport { FlightV2 } from '@fcom/one-upgrade/api/models/flight-v-2';\nimport { Cabin } from '@fcom/one-upgrade/api/models/cabin';\nimport { UpgradeProduct } from '@fcom/one-upgrade/api/models/upgrade-product';\n\nimport { BookingRef, ExtendedFlightBasket, PaymentType } from '../../interfaces';\nimport { DataState, State } from '../../interfaces/store.interface';\nimport { DataActions, StatusActions } from '../../store/actions';\nimport {\n getBasketFlights,\n getBasketPassengerIds,\n getBookingRef,\n getSplitPNR,\n getWaitlisted,\n selectDataState,\n} from '../../store';\nimport { UpgradeAnalyticsService } from '../../services/upgrade-analytics.service';\nimport { basketHasWaitlistUpgrade } from '../../utils/basket.utils';\n\n@Component({\n selector: 'fin-upgrade-success',\n templateUrl: 'success.component.html',\n providers: [DateFormatPipe],\n})\nexport class SuccessComponent implements OnInit, OnDestroy {\n readonly IconPosition = IconPosition;\n readonly survey = QualtricsSurveys.UPGRADE_FEEDBACK;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n storeData$: Observable;\n basketFlights$: Observable<\n { flight: FlightV2; flightId: string; cabin: Cabin; productName: UpgradeProduct; paymentType: PaymentType }[]\n >;\n basketPassengers$: Observable;\n bookingRef$: Observable;\n waitlisted$: Observable;\n splitPNR$: Observable;\n surveyOpen = false;\n subscriptions: Subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private languageService: LanguageService,\n private router: Router,\n private analyticsService: UpgradeAnalyticsService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n ngOnInit(): void {\n this.storeData$ = this.store$.pipe(select(selectDataState));\n this.basketFlights$ = this.store$.pipe(select(getBasketFlights));\n this.basketPassengers$ = this.store$.pipe(select(getBasketPassengerIds));\n this.bookingRef$ = this.store$.pipe(select(getBookingRef));\n this.waitlisted$ = this.store$.pipe(select(getWaitlisted));\n this.splitPNR$ = this.store$.pipe(select(getSplitPNR));\n\n if (isPlatformServer(this.platform)) {\n // Skip data processing on server-side\n return;\n }\n\n this.subscriptions.add(\n this.setNotificationsAndGAEvent().subscribe(() => {\n this.store$.dispatch(DataActions.clearAll());\n })\n );\n }\n\n setNotificationsAndGAEvent(): Observable<[ExtendedFlightBasket[], string[], DataState]> {\n return combineLatest([this.basketFlights$, this.basketPassengers$, this.storeData$]).pipe(\n take(1),\n tap(([flightBasket, passengers, data]) => {\n // Page has been reloaded and we don't need to send another tracking event.\n if (!flightBasket.length) {\n return;\n }\n this.store$.dispatch(\n StatusActions.setWaitlisted({\n waitlisted: basketHasWaitlistUpgrade(flightBasket),\n })\n );\n\n this.store$.dispatch(\n StatusActions.setSplitPNR({\n splitPNR: passengers.length < data.passengers.length,\n })\n );\n\n this.analyticsService.sendPurchaseEvent();\n\n // clear basket and data\n this.store$.dispatch(DataActions.clearAll());\n })\n );\n }\n\n getFragment(): Observable {\n return this.waitlisted$.pipe(\n take(1),\n map((x) => (x ? 'fragments.oneUpgrade.successWaitlisted.url' : 'fragments.oneUpgrade.success.url'))\n );\n }\n\n redirectToMMB(): void {\n this.subscriptions.add(\n combineLatest([this.bookingRef$, this.splitPNR$])\n .pipe(take(1))\n .subscribe(([bookingRef, splitPNR]) => {\n const params = splitPNR ? '' : `?${serializeParams({ ...bookingRef })}`;\n\n this.router.navigateByUrl(\n `/${this.languageService.langValue || 'en'}/${RootPaths.MANAGE_BOOKING_ROOT}${params}`\n );\n })\n );\n }\n\n openSurvey(): void {\n this.surveyOpen = true;\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse, HttpContext } from '@angular/common/http';\nimport { BaseService } from '../base-service';\nimport { ApiConfiguration } from '../api-configuration';\nimport { StrictHttpResponse } from '../strict-http-response';\nimport { RequestBuilder } from '../request-builder';\nimport { Observable } from 'rxjs';\nimport { map, filter } from 'rxjs/operators';\n\nimport { GetUpgradeStatusResponse } from '../models/get-upgrade-status-response';\nimport { UpgradeRequest } from '../models/upgrade-request';\nimport { UpgradeRequestV2 } from '../models/upgrade-request-v-2';\nimport { UpgradeResponse } from '../models/upgrade-response';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UpgradeService extends BaseService {\n constructor(\n config: ApiConfiguration,\n http: HttpClient\n ) {\n super(config, http);\n }\n\n /**\n * Path part for operation getUpgradeStatus\n */\n static readonly GetUpgradeStatusPath = '/upgrades/{recLoc}/{upgradeId}/status';\n\n /**\n * Returns a status for upgrade process.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `getUpgradeStatus()` instead.\n *\n * This method doesn't expect any request body.\n */\n getUpgradeStatus$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * Unique ID of the upgrade process that was initiated\n */\n upgradeId: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.GetUpgradeStatusPath, 'get');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.path('upgradeId', params.upgradeId, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Returns a status for upgrade process.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `getUpgradeStatus$Response()` instead.\n *\n * This method doesn't expect any request body.\n */\n getUpgradeStatus(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * Unique ID of the upgrade process that was initiated\n */\n upgradeId: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n },\n context?: HttpContext\n\n): Observable {\n\n return this.getUpgradeStatus$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as GetUpgradeStatusResponse)\n );\n }\n\n /**\n * Path part for operation getUpgradeStatusV2\n */\n static readonly GetUpgradeStatusV2Path = '/v2/upgrades/{recLoc}/{upgradeId}/status';\n\n /**\n * Returns a status for upgrade process.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `getUpgradeStatusV2()` instead.\n *\n * This method doesn't expect any request body.\n */\n getUpgradeStatusV2$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * Unique ID of the upgrade process that was initiated\n */\n upgradeId: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.GetUpgradeStatusV2Path, 'get');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.path('upgradeId', params.upgradeId, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Returns a status for upgrade process.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `getUpgradeStatusV2$Response()` instead.\n *\n * This method doesn't expect any request body.\n */\n getUpgradeStatusV2(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * Unique ID of the upgrade process that was initiated\n */\n upgradeId: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n },\n context?: HttpContext\n\n): Observable {\n\n return this.getUpgradeStatusV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as GetUpgradeStatusResponse)\n );\n }\n\n /**\n * Path part for operation upgrade\n */\n static readonly UpgradePath = '/upgrades/{recLoc}';\n\n /**\n * Start upgrade process as non-logged-in customer.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `upgrade()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgrade$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequest\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.UpgradePath, 'post');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.query('lastName', params.lastName, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Start upgrade process as non-logged-in customer.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `upgrade$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgrade(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequest\n },\n context?: HttpContext\n\n): Observable {\n\n return this.upgrade$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as UpgradeResponse)\n );\n }\n\n /**\n * Path part for operation upgradeV2\n */\n static readonly UpgradeV2Path = '/v2/upgrades/{recLoc}';\n\n /**\n * Start upgrade process as non-logged-in customer.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `upgradeV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeV2$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequestV2\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.UpgradeV2Path, 'post');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.query('lastName', params.lastName, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Start upgrade process as non-logged-in customer.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `upgradeV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeV2(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequestV2\n },\n context?: HttpContext\n\n): Observable {\n\n return this.upgradeV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as UpgradeResponse)\n );\n }\n\n /**\n * Path part for operation upgradeAuthenticated\n */\n static readonly UpgradeAuthenticatedPath = '/members/upgrades/{recLoc}';\n\n /**\n * Start upgrade process as logged-in customer. Allows also payments with points and vouchers.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `upgradeAuthenticated()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeAuthenticated$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequest\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.UpgradeAuthenticatedPath, 'post');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.query('lastName', params.lastName, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n if(this.config.bearerAuth){\n rb.header('Authorization', this.config.bearerAuth);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Start upgrade process as logged-in customer. Allows also payments with points and vouchers.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `upgradeAuthenticated$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeAuthenticated(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequest\n },\n context?: HttpContext\n\n): Observable {\n\n return this.upgradeAuthenticated$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as UpgradeResponse)\n );\n }\n\n /**\n * Path part for operation upgradeV2Authenticated\n */\n static readonly UpgradeV2AuthenticatedPath = '/v2/members/upgrades/{recLoc}';\n\n /**\n * Start upgrade process as logged-in customer. Allows also payments with points and vouchers.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `upgradeV2Authenticated()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeV2Authenticated$Response(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequestV2\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, UpgradeService.UpgradeV2AuthenticatedPath, 'post');\n if (params) {\n rb.path('recLoc', params.recLoc, {});\n rb.query('lastName', params.lastName, {});\n rb.header('X-Correlation-ID', params['X-Correlation-ID'], {});\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.apiKey){\n rb.header('x-api-key', this.config.apiKey);\n }\n if(this.config.bearerAuth){\n rb.header('Authorization', this.config.bearerAuth);\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Start upgrade process as logged-in customer. Allows also payments with points and vouchers.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `upgradeV2Authenticated$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n upgradeV2Authenticated(params: {\n\n /**\n * Booking record locator\n */\n recLoc: string;\n\n /**\n * One last name as it is in the booking specified by the record locator\n */\n lastName: string;\n\n /**\n * Unique tracking code to gather all information from logs regarding this request\n */\n 'X-Correlation-ID'?: string;\n body: UpgradeRequestV2\n },\n context?: HttpContext\n\n): Observable {\n\n return this.upgradeV2Authenticated$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as UpgradeResponse)\n );\n }\n\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse, HttpContext } from '@angular/common/http';\nimport { BaseService } from '../base-service';\nimport { ApiConfiguration } from '../api-configuration';\nimport { StrictHttpResponse } from '../strict-http-response';\nimport { RequestBuilder } from '../request-builder';\nimport { Observable } from 'rxjs';\nimport { map, filter } from 'rxjs/operators';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationsService extends BaseService {\n constructor(\n config: ApiConfiguration,\n http: HttpClient\n ) {\n super(config, http);\n }\n\n /**\n * Path part for operation receiveCheckoutNotifications\n */\n static readonly ReceiveCheckoutNotificationsPath = '/notifications/checkouts';\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receiveCheckoutNotifications()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotifications$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, NotificationsService.ReceiveCheckoutNotificationsPath, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receiveCheckoutNotifications$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotifications(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receiveCheckoutNotifications$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receive3DsConfirmations\n */\n static readonly Receive3DsConfirmationsPath = '/notifications/3dsconfirmations';\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receive3DsConfirmations()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmations$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, NotificationsService.Receive3DsConfirmationsPath, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receive3DsConfirmations$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmations(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receive3DsConfirmations$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receiveCheckoutNotificationsV2\n */\n static readonly ReceiveCheckoutNotificationsV2Path = '/v2/notifications/checkouts';\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receiveCheckoutNotificationsV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotificationsV2$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, NotificationsService.ReceiveCheckoutNotificationsV2Path, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receiveCheckoutNotificationsV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotificationsV2(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receiveCheckoutNotificationsV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receive3DsConfirmationsV2\n */\n static readonly Receive3DsConfirmationsV2Path = '/v2/notifications/3dsconfirmations';\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receive3DsConfirmationsV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmationsV2$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, NotificationsService.Receive3DsConfirmationsV2Path, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receive3DsConfirmationsV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmationsV2(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receive3DsConfirmationsV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse, HttpContext } from '@angular/common/http';\nimport { BaseService } from '../base-service';\nimport { ApiConfiguration } from '../api-configuration';\nimport { StrictHttpResponse } from '../strict-http-response';\nimport { RequestBuilder } from '../request-builder';\nimport { Observable } from 'rxjs';\nimport { map, filter } from 'rxjs/operators';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CheckoutService extends BaseService {\n constructor(\n config: ApiConfiguration,\n http: HttpClient\n ) {\n super(config, http);\n }\n\n /**\n * Path part for operation receiveCheckoutNotifications\n */\n static readonly ReceiveCheckoutNotificationsPath = '/notifications/checkouts';\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receiveCheckoutNotifications()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotifications$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, CheckoutService.ReceiveCheckoutNotificationsPath, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receiveCheckoutNotifications$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotifications(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receiveCheckoutNotifications$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receive3DsConfirmations\n */\n static readonly Receive3DsConfirmationsPath = '/notifications/3dsconfirmations';\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receive3DsConfirmations()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmations$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, CheckoutService.Receive3DsConfirmationsPath, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receive3DsConfirmations$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmations(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receive3DsConfirmations$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receiveCheckoutNotificationsV2\n */\n static readonly ReceiveCheckoutNotificationsV2Path = '/v2/notifications/checkouts';\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receiveCheckoutNotificationsV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotificationsV2$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, CheckoutService.ReceiveCheckoutNotificationsV2Path, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow. The request object's type is ShopNotificationData.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receiveCheckoutNotificationsV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receiveCheckoutNotificationsV2(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receiveCheckoutNotificationsV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n /**\n * Path part for operation receive3DsConfirmationsV2\n */\n static readonly Receive3DsConfirmationsV2Path = '/v2/notifications/3dsconfirmations';\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `receive3DsConfirmationsV2()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmationsV2$Response(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, CheckoutService.Receive3DsConfirmationsV2Path, 'post');\n if (params) {\n\n rb.body(params.body, 'application/json');\n }\n if(this.config.sigv4){\n rb.header('Authorization', this.config.sigv4);\n }\n\n return this.http.request(rb.build({\n responseType: 'text',\n accept: '*/*',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return (r as HttpResponse).clone({ body: undefined }) as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Notify the upgrade process about the results of the checkout flow with 3DS. The request object's type is ThreeDSecureConfirm.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `receive3DsConfirmationsV2$Response()` instead.\n *\n * This method sends `application/json` and handles request body of type `application/json`.\n */\n receive3DsConfirmationsV2(params: {\n body: {\n}\n },\n context?: HttpContext\n\n): Observable {\n\n return this.receive3DsConfirmationsV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as void)\n );\n }\n\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse, HttpContext } from '@angular/common/http';\nimport { BaseService } from '../base-service';\nimport { ApiConfiguration } from '../api-configuration';\nimport { StrictHttpResponse } from '../strict-http-response';\nimport { RequestBuilder } from '../request-builder';\nimport { Observable } from 'rxjs';\nimport { map, filter } from 'rxjs/operators';\n\nimport { ApplicationInfo } from '../models/application-info';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class InfoService extends BaseService {\n constructor(\n config: ApiConfiguration,\n http: HttpClient\n ) {\n super(config, http);\n }\n\n /**\n * Path part for operation getInfo\n */\n static readonly GetInfoPath = '/info';\n\n /**\n * Returns metadata of the current deployment.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `getInfo()` instead.\n *\n * This method doesn't expect any request body.\n */\n getInfo$Response(params?: {\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, InfoService.GetInfoPath, 'get');\n if (params) {\n\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Returns metadata of the current deployment.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `getInfo$Response()` instead.\n *\n * This method doesn't expect any request body.\n */\n getInfo(params?: {\n },\n context?: HttpContext\n\n): Observable {\n\n return this.getInfo$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as ApplicationInfo)\n );\n }\n\n /**\n * Path part for operation getInfoV2\n */\n static readonly GetInfoV2Path = '/v2/info';\n\n /**\n * Returns metadata of the current deployment.\n *\n *\n *\n * This method provides access to the full `HttpResponse`, allowing access to response headers.\n * To access only the response body, use `getInfoV2()` instead.\n *\n * This method doesn't expect any request body.\n */\n getInfoV2$Response(params?: {\n },\n context?: HttpContext\n\n): Observable> {\n\n const rb = new RequestBuilder(this.rootUrl, InfoService.GetInfoV2Path, 'get');\n if (params) {\n\n }\n\n return this.http.request(rb.build({\n responseType: 'json',\n accept: 'application/json',\n context: context\n })).pipe(\n filter((r: any) => r instanceof HttpResponse),\n map((r: HttpResponse) => {\n return r as StrictHttpResponse;\n })\n );\n }\n\n /**\n * Returns metadata of the current deployment.\n *\n *\n *\n * This method provides access only to the response body.\n * To access the full response (for headers, for example), `getInfoV2$Response()` instead.\n *\n * This method doesn't expect any request body.\n */\n getInfoV2(params?: {\n },\n context?: HttpContext\n\n): Observable {\n\n return this.getInfoV2$Response(params,context).pipe(\n map((r: StrictHttpResponse) => r.body as ApplicationInfo)\n );\n }\n\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, throwError } from 'rxjs';\nimport { catchError, first, map, switchMap } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { AppState, RootPaths } from '@fcom/core';\nimport { loginStatus, profileType as profileTypeSelector } from '@fcom/core/selectors';\nimport { LoginStatus, ProfileType } from '@fcom/core-api/login';\n\nimport { UpgradeService as ApiUpgradeService } from '../api/services';\nimport { Buyer, GetUpgradeStatusResponse, UpgradeFlightsV2, UpgradeResponse } from '../api/models';\nimport { BookingRef, ExtendedFlightBasket, FlightBasket } from '../interfaces/upgrades.interface';\nimport { UpgradeError } from '../interfaces/upgrade-error.interface';\nimport {\n getBasketFlights,\n getBasketPassengerIds,\n getBookingRef,\n getUpgradeResponse,\n getUser,\n} from '../store/selectors';\nimport { createPaymentObject } from '../utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UpgradeFlightsService {\n bookingRef$: Observable;\n upgradeResponse$: Observable;\n selectedPassengers$: Observable;\n selectedFlights$: Observable;\n user$: Observable;\n\n private get loggedIn$(): Observable {\n return this.store$.pipe(\n loginStatus(),\n map((status) => status === LoginStatus.LOGGED_IN)\n );\n }\n\n private get profileType$(): Observable {\n return this.store$.pipe(profileTypeSelector());\n }\n\n constructor(\n private store$: Store,\n private apiUpgradeService: ApiUpgradeService,\n private languageService: LanguageService,\n @Inject(DOCUMENT) private document: Document\n ) {\n this.bookingRef$ = this.store$.pipe(select(getBookingRef));\n this.upgradeResponse$ = this.store$.pipe(select(getUpgradeResponse));\n this.selectedPassengers$ = this.store$.pipe(select(getBasketPassengerIds));\n this.selectedFlights$ = this.store$.pipe(select(getBasketFlights));\n this.user$ = this.store$.pipe(select(getUser));\n }\n\n upgradeFlights(): Observable {\n return combineLatest([\n this.selectedFlights$,\n this.user$,\n this.selectedPassengers$,\n this.bookingRef$,\n this.loggedIn$,\n this.profileType$,\n ]).pipe(\n first(),\n switchMap(\n ([selectedFlights, user, passengers, bookingRef, loggedIn, profileType]: [\n ExtendedFlightBasket[],\n Buyer,\n string[],\n BookingRef,\n boolean,\n ProfileType,\n ]) => {\n const upgradeUrl = `${this.document.location.origin}/${this.languageService.langValue}/${RootPaths.ONE_UPGRADE_ROOT}`;\n const params = {\n ...bookingRef,\n body: {\n email: user?.email || '',\n flights: null,\n locale: this.languageService.langValue,\n paymentFailUrl: `${upgradeUrl}/payment-error`,\n paymentSuccessUrl: `${upgradeUrl}/success`,\n },\n };\n\n params.body.flights = this.getFlightsToUpgrade(selectedFlights, passengers);\n\n return loggedIn && profileType === ProfileType.FPLUS\n ? this.apiUpgradeService.upgradeV2Authenticated(params)\n : this.apiUpgradeService.upgradeV2(params);\n }\n ),\n map((response: UpgradeResponse) => {\n if (!response.url || !response.upgradeId) {\n throw new Error(UpgradeError.paymentError);\n }\n\n return response;\n }),\n catchError(() => throwError(() => UpgradeError.paymentError))\n );\n }\n\n getUpgradeStatus(): Observable {\n return combineLatest([this.bookingRef$, this.upgradeResponse$]).pipe(\n first(),\n switchMap(([bookingRef, upgradeResponse]: [BookingRef, UpgradeResponse]) => {\n return this.apiUpgradeService.getUpgradeStatus({\n recLoc: bookingRef.recLoc,\n upgradeId: upgradeResponse.upgradeId,\n });\n }),\n map((response: GetUpgradeStatusResponse) => {\n if (!response.status) {\n throw new Error(UpgradeError.paymentError);\n }\n\n return response;\n }),\n catchError(() => throwError(() => UpgradeError.paymentError))\n );\n }\n\n private getFlightsToUpgrade(flightsBasket: ExtendedFlightBasket[], passengers: string[]): UpgradeFlightsV2 {\n return passengers\n .map((passengerId) => {\n return flightsBasket.map((flightBasket) => {\n return {\n flightId: flightBasket.flightId,\n passengerId: passengerId,\n payment: createPaymentObject(flightsBasket, flightBasket),\n productName: flightBasket.productName,\n };\n });\n })\n .reduce((acc, val) => acc.concat(val), []);\n }\n}\n","import { Component, OnDestroy, PLATFORM_ID, Inject } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\nimport { Subscription, interval, EmptyError } from 'rxjs';\nimport { takeWhile, filter, switchMap, first, take, throwIfEmpty } from 'rxjs/operators';\n\nimport { UpgradeFinalStatus, GetUpgradeStatusResponse } from '../../api/models';\nimport { State, Stage, UpgradeError } from '../../interfaces';\nimport { StatusActions } from '../../store/actions';\nimport { UpgradeFlightsService } from '../../services/upgrade-flights.service';\n\nexport const POLLING_DONE_STATUSES: UpgradeFinalStatus[] = [\n UpgradeFinalStatus.Failed,\n UpgradeFinalStatus.PaymentFailed,\n UpgradeFinalStatus.HandledByCustomerCare,\n UpgradeFinalStatus.Success,\n UpgradeFinalStatus.PaymentInProgress,\n UpgradeFinalStatus.InProgress,\n UpgradeFinalStatus.PaymentDone,\n];\nexport const GET_STATUS_REPEAT_AMOUNT = 50;\nexport const GET_STATUS_REPEAT_INTERVAL_MS = 1000;\n\n@Component({\n selector: 'fin-upgrade-processing',\n templateUrl: 'processing.component.html',\n})\nexport class ProcessingComponent implements OnDestroy {\n subscriptions: Subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private upgradeService: UpgradeFlightsService,\n @Inject(PLATFORM_ID) private platform: object\n ) {\n this.checkUpgradeStatus();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n checkUpgradeStatus(): void {\n if (isPlatformServer(this.platform)) {\n // Skip processing on server-side\n return;\n }\n\n const getUpgradeStatus$ = this.upgradeService.getUpgradeStatus().pipe(first());\n\n this.subscriptions.add(\n interval(GET_STATUS_REPEAT_INTERVAL_MS)\n .pipe(\n switchMap(() => getUpgradeStatus$),\n take(GET_STATUS_REPEAT_AMOUNT),\n takeWhile((status) => this.paymentIsInitializing(status), true),\n filter((response) => !this.paymentIsInitializing(response)),\n throwIfEmpty(() => new EmptyError())\n )\n .subscribe({\n next: (response) => {\n switch (response.status) {\n case UpgradeFinalStatus.Success:\n case UpgradeFinalStatus.PaymentInProgress:\n case UpgradeFinalStatus.PaymentDone:\n case UpgradeFinalStatus.InProgress:\n case UpgradeFinalStatus.HandledByCustomerCare: {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.SUCCESS }));\n return;\n }\n case UpgradeFinalStatus.Failed:\n case UpgradeFinalStatus.PaymentFailed: {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.ERROR }));\n return;\n }\n default: {\n return;\n }\n }\n },\n // eslint-disable-next-line rxjs/no-implicit-any-catch\n error: (error: EmptyError | UpgradeError) => {\n if (error === UpgradeError.httpError) {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.ERROR }));\n } else {\n // If we don't get correct status in time, redirect user to success to see message that upgrade is prosessing.\n // This shouldn't happen but just in case to prevent user from spamming the endpoint forver.\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.SUCCESS }));\n }\n },\n })\n );\n }\n\n private paymentIsInitializing(response: GetUpgradeStatusResponse): boolean {\n return !POLLING_DONE_STATUSES.includes(response.status);\n }\n}\n","\n","\n
\n
\n {{ 'oneUpgrade.walletOptions.' + name | finLocalization }}\n
\n\n
\n {{ amount }}\n
\n\n \n {{ amount }}\n
\n \n
\n\n\n \n \n \n \n \n \n \n \n\n\n\n

\n {{ 'oneUpgrade.loginPrompt' | finLocalization }}\n

\n
\n\n\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.title' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para1' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para2' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para3' | finLocalization }}\n

\n
\n\n
\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.title' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para1' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para2' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.walletOptions.upgradeBenefitsTooltip.para3' | finLocalization }}\n

\n
\n\n\n
\n
\n \n
\n\n
\n
\n \n
\n\n \n \n \n\n
\n \n \n \n\n \n \n \n
\n
\n
\n\n\n\n \n\n\n\n
\n
\n
\n \n
\n\n \n \n \n
\n
\n\n\n
\n","import {\n Component,\n ViewChild,\n ElementRef,\n Renderer2,\n OnDestroy,\n Inject,\n PLATFORM_ID,\n OnInit,\n AfterViewInit,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser, isPlatformServer } from '@angular/common';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store, select } from '@ngrx/store';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { map, filter, distinctUntilChanged, take } from 'rxjs/operators';\n\nimport { BookingHeaderSummary } from '@fcom/common/interfaces';\nimport { ModalButtons, NotificationTheme, PopoverOptions, PopoverPosition } from '@fcom/ui-components';\nimport { addClass, removeClass, unsubscribe } from '@fcom/core/utils';\nimport { AppState, ConfigService, StorageService } from '@fcom/core';\nimport { WindowRef } from '@fcom/core/providers/window';\nimport { loginStatus } from '@fcom/core/selectors';\nimport { LoginStatus } from '@fcom/core-api/login';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { GlobalBookingTripDates, MediaQueryService, ToasterService } from '@fcom/common';\nimport { createPaymentObject, getDatesForJourney, getFlightsAsBookingLocationCodes } from '@fcom/one-upgrade/utils';\nimport { PaymentType } from '@fcom/one-upgrade/interfaces';\nimport { Buyer, Cabin, FlightV2, UpgradeProduct, VoucherType } from '@fcom/one-upgrade/api/models';\n\nimport { ModalActions } from '../../store/actions';\nimport {\n getJourneySummary,\n getFlights,\n getBasketPassengerData,\n getPassengers,\n getBasketFlights,\n getUser,\n} from '../../store/selectors';\n\ninterface Balance {\n [PaymentType.points]: number;\n [PaymentType.EUROPE_UPGRADE]: number;\n [PaymentType.LONG_HAUL_UPGRADE]: number;\n [PaymentType.UPGRADE_BENEFIT]: number;\n}\n\n@Component({\n selector: 'fin-upgrade-status-bar',\n templateUrl: './status-bar.component.html',\n styleUrls: ['./status-bar.component.scss'],\n})\nexport class StatusBarComponent implements OnInit, OnDestroy, AfterViewInit {\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n static ANIMATION_DURATION = 200;\n\n bookingSummary$: Observable;\n\n accordionOpen = false;\n\n journeySummary$: Observable;\n basketFlights$: Observable<\n { flight: FlightV2; flightId: string; cabin: Cabin; productName: UpgradeProduct; paymentType: PaymentType }[]\n >;\n loggedIn$: Observable;\n\n availableBenefits$: Observable;\n originalBalance$: Observable;\n\n enableUpgradeBenefits = false;\n upgradeBenefitTooltipId = 'upgrade-benefit-warning';\n upgradeBenefitTooltipSeenKey = 'upgrade-benefit-warning-seen';\n\n tooltipOptions: PopoverOptions = {\n popoverID: 'upgrade-benefits-tooltip',\n popoverPosition: PopoverPosition.BOTTOM,\n popoverWidth: 300,\n openByDefault: false,\n enableOnClick: true,\n showCloseButton: true,\n };\n\n tooltipOptionsMobile: PopoverOptions = {\n ...this.tooltipOptions,\n zIndex: 4,\n };\n\n @ViewChild('statusAccordion', { static: false }) statusAccordion: ElementRef;\n @ViewChild('walletOverlay', { static: false }) walletOverlay: ElementRef;\n @ViewChild('toasterContent', { static: false }) toasterContent: ElementRef;\n\n frameRef: number;\n timeoutRef: ReturnType;\n subscriptions: Subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private renderer: Renderer2,\n private window: WindowRef,\n private configService: ConfigService,\n private toasterService: ToasterService,\n private mediaQueryService: MediaQueryService,\n private storageService: StorageService,\n @Inject(DOCUMENT) private document: Document,\n @Inject(PLATFORM_ID) private platform: string\n ) {}\n\n ngOnInit(): void {\n this.journeySummary$ = this.store$.pipe(select(getJourneySummary));\n this.basketFlights$ = this.store$.pipe(select(getBasketFlights));\n this.loggedIn$ = this.store$.pipe(\n loginStatus(),\n map((status: LoginStatus) => status === LoginStatus.LOGGED_IN)\n );\n this.enableUpgradeBenefits = this.configService.cfg.enableUpgradeBenefitInUpgrade;\n\n this.bookingSummary$ = combineLatest([\n this.store$.pipe(select(getFlights)),\n this.store$.pipe(select(getBasketPassengerData)),\n this.store$.pipe(select(getPassengers)),\n ]).pipe(\n filter(([flights]) => Boolean(flights.length)),\n map(([flights, selectedPax, pax]) => {\n const bookingLocations = getFlightsAsBookingLocationCodes(flights);\n const tripType = getTripTypeFromBookingLocationCodes(bookingLocations);\n const tripDates: GlobalBookingTripDates = getDatesForJourney(flights, tripType);\n const paxAmount = selectedPax.length ? selectedPax.length : pax.length;\n\n return {\n tripType: tripType,\n locations: bookingLocations,\n paxAmount: paxAmount,\n dates: tripDates,\n };\n })\n );\n\n this.originalBalance$ = this.store$.pipe(\n select(getUser),\n map((buyer: Buyer) => {\n return {\n [PaymentType.EUROPE_UPGRADE]:\n buyer?.vouchers?.find((voucher) => voucher.type === VoucherType.EuropeUpgrade)?.count || 0,\n [PaymentType.LONG_HAUL_UPGRADE]:\n buyer?.vouchers?.find((voucher) => voucher.type === VoucherType.LongHaulUpgrade)?.count || 0,\n [PaymentType.UPGRADE_BENEFIT]:\n buyer?.vouchers?.find((voucher) => voucher.type === VoucherType.UpgradeBenefit)?.count || 0,\n [PaymentType.points]: buyer?.points || 0,\n };\n })\n );\n\n this.availableBenefits$ = this.getRemainingBalance();\n\n if (!this.storageService.LOCAL.get(this.upgradeBenefitTooltipSeenKey) && !isPlatformServer(this.platform)) {\n this.tooltipOptions.openByDefault = true;\n }\n }\n\n ngAfterViewInit(): void {\n if (this.storageService.LOCAL.get(this.upgradeBenefitTooltipSeenKey) || isPlatformServer(this.platform)) {\n return;\n }\n\n this.subscriptions.add(\n combineLatest([this.originalBalance$, this.mediaQueryService.isBreakpoint$('tablet_down')])\n .pipe(take(1))\n .subscribe(([originalBalance, isTabletDown]) => {\n if (!originalBalance.UPGRADE_BENEFIT) {\n return;\n }\n\n this.storageService.LOCAL.set(this.upgradeBenefitTooltipSeenKey, true);\n\n if (!isTabletDown) {\n return;\n }\n\n setTimeout(() => {\n this.toasterService.addMessageToQueue({\n id: this.upgradeBenefitTooltipId,\n contentHTML: this.toasterContent.nativeElement.innerHTML,\n theme: NotificationTheme.INFO,\n keepMessageAfterNavigation: true,\n });\n }, 0);\n })\n );\n }\n\n getRemainingBalance(): Observable {\n return combineLatest([this.basketFlights$, this.originalBalance$, this.bookingSummary$]).pipe(\n map(([flightsInBasket, originalBalance, bookingSummary]) => {\n const remainingBalance = {\n ...originalBalance,\n };\n\n const paymentOptions = flightsInBasket.map((flightBasket) =>\n createPaymentObject(flightsInBasket, flightBasket)\n );\n\n paymentOptions.forEach((paymentOption) => {\n const paymentType = Object.keys(paymentOption)[0] as PaymentType;\n const amountToDeduct = paymentOption[paymentType].price;\n\n remainingBalance[paymentType] -= amountToDeduct * bookingSummary.paxAmount;\n });\n\n return remainingBalance;\n }),\n distinctUntilChanged()\n );\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.timeoutRef);\n\n this.subscriptions = unsubscribe(this.subscriptions);\n this.toasterService.removeMessage(this.upgradeBenefitTooltipId);\n\n if (isPlatformBrowser(this.platform)) {\n this.window.nativeWindow.cancelAnimationFrame(this.frameRef);\n }\n }\n\n toggleWallet(): void {\n this.accordionOpen = !this.accordionOpen;\n\n if (this.accordionOpen) {\n this.slideAccordionIn();\n this.showOverlay();\n } else {\n this.slideAccordionOut();\n this.hideOverlay();\n }\n }\n\n openHelpModal(event: Event): void {\n // Stops the modal from closing immediately due to document click events.\n event.stopPropagation();\n this.store$.dispatch(\n ModalActions.openModal({\n modal: {\n title: 'oneUpgrade.helpModal.title',\n fragment: 'fragments.oneUpgrade.help.url',\n buttons: ModalButtons.DONE,\n },\n returnTarget: '[data-id=\"help-modal-button\"]',\n })\n );\n }\n\n private slideAccordionIn(): void {\n this.showAcc();\n const targetHeight = this.getAccHeight();\n\n this.frameRef = this.window.nativeWindow.requestAnimationFrame(() => {\n this.setAccHeight('0');\n\n this.frameRef = this.window.nativeWindow.requestAnimationFrame(() => {\n this.setAccHeight(`${targetHeight}px`);\n\n // set height to auto after animation so doesn't break on resize\n this.timeoutRef = setTimeout(() => this.setAccHeight('auto'), StatusBarComponent.ANIMATION_DURATION);\n });\n });\n }\n\n private slideAccordionOut(): void {\n const targetHeight = this.getAccHeight();\n\n this.frameRef = this.window.nativeWindow.requestAnimationFrame(() => {\n this.setAccHeight(`${targetHeight}px`);\n\n this.frameRef = this.window.nativeWindow.requestAnimationFrame(() => {\n this.setAccHeight('0');\n\n this.timeoutRef = setTimeout(() => this.hideAcc(), StatusBarComponent.ANIMATION_DURATION);\n });\n });\n }\n\n private showOverlay(): void {\n addClass(this.document.body, 'modal-open-laptop-down');\n this.renderer.setStyle(this.walletOverlay.nativeElement, 'opacity', '100');\n this.renderer.setStyle(this.walletOverlay.nativeElement, 'display', 'block');\n }\n\n private hideOverlay(): void {\n removeClass(this.document.body, 'modal-open-laptop-down');\n this.renderer.setStyle(this.walletOverlay.nativeElement, 'opacity', '0');\n this.renderer.setStyle(this.walletOverlay.nativeElement, 'display', 'none');\n }\n\n private getAccHeight(): string {\n return this.statusAccordion.nativeElement.offsetHeight;\n }\n\n private hideAcc(): void {\n this.setAccStyle('display', 'none');\n }\n\n private showAcc(): void {\n this.setAccHeight('auto');\n this.setAccStyle('display', 'block');\n }\n\n private setAccHeight(val: string): void {\n this.setAccStyle('height', val);\n }\n\n private setAccStyle(prop: string, val: string): void {\n this.renderer.setStyle(this.statusAccordion.nativeElement, prop, val);\n }\n}\n","\n
\n {{ 'total' | finLocalization }}: \n
\n
\n \n {{ payment }},
\n
\n\n \n
\n
\n \n\n","import { Component, OnDestroy, OnInit } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store, select } from '@ngrx/store';\nimport { Observable, combineLatest, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { AppState } from '@fcom/core';\nimport { ButtonPosition, IconPosition, ModalButtons } from '@fcom/ui-components';\nimport { ElementTypes } from '@fcom/common';\nimport { unsubscribe } from '@fcom/core/utils';\n\nimport { Passenger } from '../../api/models';\nimport { UpgradePaymentService } from '../../services/upgrade-payment.service';\nimport { State } from '../../interfaces/store.interface';\nimport { FlightBasket } from '../../interfaces/upgrades.interface';\nimport {\n getBasketFlights,\n getStage,\n getBasketPassengerIds,\n getPassengers,\n getChildIsTravellingAlone,\n} from '../../store/selectors';\nimport { ModalActions, StatusActions, UpgradeActions } from '../../store/actions';\nimport { Stage } from '../../interfaces/stage.interface';\nimport { PaymentType } from '../../interfaces';\nimport { UpgradeAnalyticsService } from '../../services/upgrade-analytics.service';\n\n@Component({\n selector: 'fin-upgrade-continue-footer',\n templateUrl: './continue-footer.component.html',\n styleUrls: ['continue-footer.component.scss'],\n})\nexport class ContinueFooterComponent implements OnDestroy, OnInit {\n readonly Stage = Stage;\n readonly ButtonPosition = ButtonPosition;\n readonly ElementTypes = ElementTypes;\n readonly IconPosition = IconPosition;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n flightsBasket$: Observable;\n passengers$: Observable;\n selectedPassengers$: Observable;\n openPnrModal: boolean;\n stage: Stage;\n shouldSplitPnr: boolean;\n currentStage$: Observable;\n selectedPayments$: Observable;\n childIsTravellingAlone$: Observable;\n passengerStageCompleted$: Observable;\n loading = false;\n subscriptions: Subscription = new Subscription();\n continueButtonI18n$: Observable;\n\n constructor(\n private store: Store,\n private upgradePaymentService: UpgradePaymentService,\n private store$: Store,\n private upgradeAnalyticsService: UpgradeAnalyticsService\n ) {}\n\n ngOnInit(): void {\n this.selectedPayments$ = this.upgradePaymentService.getAllSelectedPayments();\n this.flightsBasket$ = this.store.pipe(select(getBasketFlights));\n this.passengers$ = this.store.pipe(select(getPassengers));\n this.selectedPassengers$ = this.store.pipe(select(getBasketPassengerIds));\n this.currentStage$ = this.store.pipe(select(getStage));\n this.childIsTravellingAlone$ = this.store.pipe(select(getChildIsTravellingAlone));\n this.passengerStageCompleted$ = combineLatest([this.selectedPassengers$, this.childIsTravellingAlone$]).pipe(\n map(([selectedPassengers, childIsTravellingAlone]) => selectedPassengers.length > 0 && !childIsTravellingAlone)\n );\n\n this.subscriptions.add(\n this.currentStage$.subscribe((stage: Stage) => {\n this.stage = stage;\n })\n );\n\n this.subscriptions.add(\n combineLatest([this.passengers$, this.selectedPassengers$]).subscribe(([passengers, selected]) => {\n this.shouldSplitPnr = passengers.length !== selected.length;\n })\n );\n\n this.continueButtonI18n$ = combineLatest([this.currentStage$, this.flightsBasket$]).pipe(\n map(([stage, flightsBasket]) => {\n const hasMoneyPayment = flightsBasket.some((flightBasket) => flightBasket.paymentType === PaymentType.money);\n\n if (stage === Stage.REVIEW) {\n return hasMoneyPayment ? 'purchase.review.proceed' : 'oneUpgrade.requestUpgrade';\n }\n\n return 'actions.next';\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n onContinue(event: Event): void {\n if (this.stage === Stage.REVIEW) {\n this.openReviewDisclaimerModal(event);\n return;\n }\n\n if (this.shouldSplitPnr && this.stage === Stage.PASSENGERS) {\n this.openPnrSplitModal(event);\n } else {\n this.moveToNextStage();\n }\n }\n\n moveToNextStage(): void {\n const stageMap = {\n [Stage.PASSENGERS]: Stage.FLIGHTS,\n [Stage.FLIGHTS]: Stage.REVIEW,\n [Stage.REVIEW]: Stage.SUCCESS,\n };\n this.store.dispatch(StatusActions.setStage({ stage: stageMap[this.stage] }));\n }\n\n openPnrSplitModal(event: Event): void {\n event.stopPropagation();\n\n this.store$.dispatch(\n ModalActions.openModal({\n modal: {\n title: 'modal.genericTitle',\n fragment: 'fragments.oneUpgrade.pnrSplit.url',\n buttons: ModalButtons.CONTINUE_CANCEL,\n handlers: {\n confirm: () => this.moveToNextStage(),\n },\n },\n returnTarget: '.btn-cta',\n })\n );\n }\n\n openReviewDisclaimerModal(event: Event): void {\n event.stopPropagation();\n\n this.store$.dispatch(\n ModalActions.openModal({\n modal: {\n title: 'modal.genericTitle',\n fragment: 'fragments.oneUpgrade.reviewDisclamer.url',\n buttons: ModalButtons.CONTINUE_CANCEL,\n handlers: {\n confirm: () => this.confirmUpgrade(),\n },\n },\n returnTarget: '.btn-cta',\n })\n );\n }\n\n confirmUpgrade(): void {\n this.loading = true;\n this.upgradeAnalyticsService.sendInitiateCheckoutEvent();\n this.store.dispatch(UpgradeActions.upgradeFlights());\n }\n}\n","\n \n \n\n","import { Component, ChangeDetectionStrategy, ElementRef, AfterViewInit, OnInit } from '@angular/core';\n\nimport { Observable } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { Store, select } from '@ngrx/store';\n\nimport { ModalButtons } from '@fcom/ui-components';\n\nimport { State, Modal } from '../../interfaces';\nimport { selectModalState } from '../../store/selectors';\nimport { ModalActions } from '../../store/actions';\n\n@Component({\n selector: 'fin-upgrade-modal',\n templateUrl: 'modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UpgradeModalComponent implements OnInit, AfterViewInit {\n returnTarget: string;\n parentElement: HTMLElement;\n handlers: Modal['handlers'];\n openModal$: Observable;\n\n constructor(\n private store: Store,\n private element: ElementRef\n ) {}\n\n ngOnInit(): void {\n this.openModal$ = this.store.pipe(\n select(selectModalState),\n tap(({ returnTarget, modal }) => {\n this.returnTarget = returnTarget;\n this.handlers = modal?.handlers;\n }),\n map(({ modal }) => {\n return modal ? { ...modal, open: true } : { title: '', fragment: '', buttons: ModalButtons.DONE, open: false };\n })\n );\n }\n\n ngAfterViewInit(): void {\n this.parentElement = this.element.nativeElement?.parentElement;\n }\n\n closeModal(): void {\n const retTarget = this.returnTarget;\n this.returnTarget = null;\n this.store.dispatch(ModalActions.closeModal());\n if (this.handlers?.close) {\n this.handlers.close();\n }\n if (retTarget) {\n setTimeout(() => {\n this.parentElement.querySelector(retTarget)?.focus();\n }, 10);\n }\n }\n\n confirmModal(): void {\n if (this.handlers?.confirm) {\n this.handlers.confirm();\n }\n }\n}\n","\n \n \n\n \n \n\n \n \n\n \n \n \n \n \n \n\n \n\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { combineLatest, Observable, of, Subscription } from 'rxjs';\nimport { filter, map, switchMap, take, tap } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { loginStatus, profileName } from '@fcom/core/selectors';\nimport { LoginStatus } from '@fcom/core-api/login';\nimport { CmsPageService, DeepLinkSource, isNavigationEvent, NavigationMenuService } from '@fcom/common';\nimport { Breadcrumb } from '@fcom/ui-components';\nimport { LoginDialogComponent, LoginWidgetContext } from '@fcom/common/login';\nimport { RootPaths } from '@fcom/core/constants';\nimport { unsubscribe } from '@fcom/core/utils';\n\nimport { getDeepLinkSource, getPassengers, getStage } from '../../store/selectors';\nimport { StatusActions } from '../../store';\nimport { Stage, State } from '../../interfaces';\nimport { BREADCRUMBS } from '../../constants';\nimport { Passenger, Passengers } from '../../api/models';\n\nfunction showStatusBar(currentStage) {\n return ![Stage.LOGIN, Stage.LOADING, Stage.SUCCESS, Stage.ERROR, Stage.PROCESSING].includes(currentStage);\n}\n\n@Component({\n selector: 'fin-upgrade-layout',\n templateUrl: './layout.component.html',\n styleUrls: ['./layout.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OneUpgradeLayoutComponent implements OnInit, OnDestroy {\n readonly LoginStatus = LoginStatus;\n readonly Stage = Stage;\n readonly LoginWidgetContext = LoginWidgetContext;\n private subscriptions: Subscription = new Subscription();\n\n loginStatus$: Observable;\n isNavigationMenuOpen$: Observable;\n currentStage$: Observable<{ stage: Stage }>;\n profileName$: Observable;\n passengers$: Observable;\n breadcrumbs$: Observable;\n\n homeUrl: string;\n showBack = false;\n showStatusBar = false;\n currentStage: Stage;\n showBookingHeader = false;\n addWrappingStyles = false;\n\n @ViewChild('loginDialog', { static: false }) loginDialog: LoginDialogComponent;\n constructor(\n private languageService: LanguageService,\n private store$: Store,\n private navigationMenuService: NavigationMenuService,\n private pageService: CmsPageService,\n private router: Router\n ) {\n this.isNavigationMenuOpen$ = navigationMenuService.isNavigationMenuOpen$;\n\n this.subscriptions.add(\n this.router.events\n .pipe(\n filter(isNavigationEvent),\n switchMap(() => {\n const pathRelativeToUpgradeRoot = this.router.url.split(RootPaths.ONE_UPGRADE_ROOT)[1] || '';\n\n if (!pathRelativeToUpgradeRoot) {\n return of(false);\n }\n\n return this.pageService.getPageDataAndSetMeta(`${RootPaths.ONE_UPGRADE_ROOT}${pathRelativeToUpgradeRoot}`);\n })\n )\n .subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n ngOnInit(): void {\n this.loginStatus$ = this.store$.pipe(loginStatus());\n this.profileName$ = this.store$.pipe(profileName());\n this.passengers$ = this.store$.pipe(select(getPassengers));\n\n this.currentStage$ = combineLatest([\n this.store$.pipe(select(getStage)),\n this.store$.pipe(select(getDeepLinkSource)),\n this.store$.pipe(select(getPassengers)),\n ]).pipe(\n tap(([stage, source, passengers]) => {\n this.showStatusBar = showStatusBar(stage);\n this.currentStage = stage;\n this.showBookingHeader = ![Stage.LOGIN, Stage.LOADING, Stage.ERROR].includes(stage);\n this.addWrappingStyles = ![Stage.LOGIN, Stage.LOADING].includes(stage);\n this.showBack = this.shouldShowBackButton(stage, source, passengers);\n }),\n map(([currentStage]) => ({ stage: currentStage }))\n );\n this.breadcrumbs$ = combineLatest([\n this.currentStage$,\n this.passengers$,\n this.languageService.translate('oneUpgrade.breadcrumbs'),\n ]).pipe(\n map(([currentStage, passengers, breadcrumbs]) => {\n return this.formatBreadcrumbs(currentStage.stage, breadcrumbs, passengers);\n })\n );\n this.homeUrl = this.languageService.langValue ? `/${this.languageService.langValue}` : '/en';\n }\n\n toggleMenu(): void {\n this.navigationMenuService.toggleMenuOpen();\n }\n\n navigateToStep(step: Breadcrumb): void {\n this.store$.dispatch(StatusActions.setStage({ stage: step.id as Stage }));\n }\n\n formatBreadcrumbs(currentStage: Stage, breadcrumbs: { [x: string]: string }, passengers: Passenger[]): Breadcrumb[] {\n return BREADCRUMBS.map((step) => {\n if (step.id === Stage.PASSENGERS && passengers.length === 1) {\n return;\n }\n\n return {\n id: step.id,\n name: breadcrumbs[step.translationKey],\n active: step.id === currentStage,\n disabled: currentStage === Stage.SUCCESS || currentStage === Stage.PROCESSING,\n };\n }).filter((x) => !!x);\n }\n\n onHomeClick(url: string): void {\n this.router.navigateByUrl(url);\n }\n\n onBackClick(): void {\n this.subscriptions.add(\n combineLatest([this.breadcrumbs$, this.passengers$])\n .pipe(take(1))\n .subscribe(([breadcrumbs, passengers]) => {\n const currentBreadcrumb = breadcrumbs.find((breadcrumb) => breadcrumb.active);\n\n let toStage = Stage.LOGIN;\n\n if (currentBreadcrumb.id === Stage.REVIEW) {\n toStage = Stage.FLIGHTS;\n }\n\n if (currentBreadcrumb.id === Stage.FLIGHTS) {\n toStage = passengers.length === 1 ? Stage.LOGIN : Stage.PASSENGERS;\n }\n\n this.store$.dispatch(StatusActions.setStage({ stage: toStage }));\n })\n );\n }\n\n shouldShowBackButton(stage: Stage, source: DeepLinkSource, passengers: Passengers): boolean {\n if (source !== DeepLinkSource.FCOM) {\n return stage !== Stage.SUCCESS;\n }\n\n if (stage === Stage.PASSENGERS || stage === Stage.SUCCESS) {\n return false;\n }\n\n if (stage === Stage.REVIEW) {\n return true;\n }\n\n return passengers.length < 2 ? false : true;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, Router, UrlTree } from '@angular/router';\n\nimport { select, Store } from '@ngrx/store';\nimport { map, take, Observable, combineLatest } from 'rxjs';\n\nimport { AppState } from '@fcom/core';\n\nimport { AuthActions, getBookingRef, getPassengers, StatusActions } from '../store';\nimport { Stage } from '../interfaces';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PNRGuard implements CanActivate {\n constructor(\n private store$: Store,\n private router: Router\n ) {}\n\n canActivate(): Observable {\n return combineLatest([this.store$.pipe(select(getBookingRef)), this.store$.pipe(select(getPassengers))]).pipe(\n take(1),\n map(([booking, passengers]) => {\n if (!booking?.lastName || !booking?.recLoc) {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n return false;\n }\n\n // If we have a PNR but have not got data from the upgrade api.\n if (!this.router.url.includes('upgrade/loading') && !passengers?.length) {\n this.store$.dispatch(AuthActions.loadPNR());\n }\n\n return true;\n })\n );\n }\n}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n CanActivate,\n UrlTree,\n Router,\n ActivatedRoute,\n} from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { take, map } from 'rxjs/operators';\n\nimport { snapshot } from '@fcom/rx';\nimport { AppState, SentryLogger } from '@fcom/core';\nimport { DeepLinkSource } from '@fcom/common/interfaces';\nimport { hasOrderData, OrderState, orderState } from '@fcom/common-booking';\n\nimport { AuthActions, DataActions } from '../store/actions';\nimport { getError } from '../store';\nimport { UpgradeError } from '../interfaces';\n\n@Injectable()\nexport class LoginGuard implements CanActivate {\n constructor(\n private store: Store,\n private router: Router,\n private sentryLogger: SentryLogger,\n private activatedRoute: ActivatedRoute,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n setSource(route: ActivatedRouteSnapshot): void {\n const mappedSource = DeepLinkSource[route.queryParamMap.get('source')];\n\n if (mappedSource) {\n this.store.dispatch(\n DataActions.setDeepLinkSource({\n source: DeepLinkSource[route.queryParamMap.get('source')],\n })\n );\n } else {\n this.sentryLogger.warn(`Unexpected source in deeplink url: '${route.queryParamMap.get('source')}'. Skipping`);\n }\n }\n\n canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): Observable {\n if (isPlatformServer(this.platform)) {\n // Always return true on server so that client handles the requests\n return of(true);\n }\n\n const error = snapshot(this.store.pipe(select(getError)));\n\n if (error !== UpgradeError.httpError) {\n this.store.dispatch(AuthActions.logout());\n }\n\n if (route.queryParamMap.has('source')) {\n this.setSource(route);\n }\n\n // Handle deeplink with query parameters in the url.\n if (route.queryParamMap.has('recLoc') && route.queryParamMap.has('lastName')) {\n this.store.dispatch(\n AuthActions.setBookingRef({\n recLoc: route.queryParamMap.get('recLoc'),\n lastName: route.queryParamMap.get('lastName'),\n })\n );\n\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: {},\n queryParamsHandling: 'merge',\n });\n\n this.store.dispatch(AuthActions.loadPNR());\n\n return of(true);\n }\n\n // Handle deeplink from MMB with booking data in the store.\n return combineLatest([this.store.pipe(hasOrderData()), this.store.pipe(orderState())]).pipe(\n take(1),\n map(([hasOrder, order]: [boolean, OrderState]) => {\n if (hasOrder) {\n this.store.dispatch(\n AuthActions.setBookingRef({\n recLoc: order.orderData.id,\n lastName: order.orderData.passengers[0].lastName,\n })\n );\n\n this.store.dispatch(\n DataActions.setDeepLinkSource({\n source: DeepLinkSource.FCOM,\n })\n );\n this.store.dispatch(AuthActions.loadPNR());\n }\n\n return true;\n })\n );\n }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { CanActivateChild, ActivatedRouteSnapshot, UrlTree, Router } from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\n\nimport { MaintenanceConfigService, MaintenanceConfigFeature, AppState } from '@fcom/core';\n\nimport { getStage } from '../store/selectors';\nimport { Stage, UpgradeError } from '../interfaces';\nimport { setError, setStage } from '../store/actions/status.actions';\nimport { getParentPath } from '../utils';\n\n@Injectable()\nexport class OneUpgradeGuard implements CanActivateChild {\n constructor(\n private maintenanceConfigService: MaintenanceConfigService,\n private store$: Store,\n private router: Router,\n @Inject(PLATFORM_ID) private platform: string\n ) {}\n\n mapPathToStage(route: ActivatedRouteSnapshot): Stage {\n const path = route?.url?.[0]?.path;\n const matchedStage = Object.keys(Stage).find((key) => Stage[key] === path);\n\n return Stage[matchedStage] || Stage.LOGIN;\n }\n\n canActivateChild(childRoute: ActivatedRouteSnapshot): Observable {\n if (this.mapPathToStage(childRoute) !== Stage.LOGIN && isPlatformServer(this.platform)) {\n return of(true);\n }\n\n const parentPath = getParentPath(childRoute);\n\n return combineLatest([\n this.maintenanceConfigService.getStatusForFeature(MaintenanceConfigFeature.ONE_UPGRADE),\n this.store$.pipe(select(getStage)),\n ]).pipe(\n take(1),\n map(([isDisabled, stage]) => {\n const pathAsStage = this.mapPathToStage(childRoute);\n\n // Block access when feature is disabled due to maintenance break\n if (isDisabled && pathAsStage !== Stage.ERROR) {\n this.store$.dispatch(setError({ error: UpgradeError.maintenance }));\n return this.router.parseUrl(`${parentPath}/${Stage.ERROR}`);\n }\n\n // Browser back button changing the url but not the stage in the store.\n if (stage !== pathAsStage) {\n this.store$.dispatch(setStage({ stage: pathAsStage || Stage.LOGIN }));\n }\n\n return true;\n })\n );\n }\n}\n","import { ActivatedRouteSnapshot } from '@angular/router';\n\nexport const getParentPath = (childRoute: ActivatedRouteSnapshot): string => {\n return childRoute.parent.pathFromRoot\n .map((path) => (path.url.length ? path.url.map((x) => x.path).join('/') : undefined))\n .filter((x) => !!x)\n .join('/');\n};\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { CanActivate } from '@angular/router';\n\nimport { Store, select } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { take, map } from 'rxjs/operators';\n\nimport { State, Stage } from '../interfaces';\nimport { getUpgradeResponse } from '../store/selectors';\nimport { StatusActions } from '../store/actions';\n\n@Injectable()\nexport class ProcessingGuard implements CanActivate {\n constructor(\n private store$: Store,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate(): true | Observable {\n if (isPlatformServer(this.platform)) {\n // Always return true on server so that client handles the requests\n return true;\n }\n\n return this.store$.pipe(\n select(getUpgradeResponse),\n take(1),\n map((response) => {\n if (response?.upgradeId) {\n return true;\n }\n return this.deny();\n })\n );\n }\n\n private deny(): false {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n return false;\n }\n}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { Store, select } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { take, map } from 'rxjs/operators';\n\nimport { State, FlightBasket, Stage } from '../interfaces';\nimport { getBasketFlights, getBasketPassengerIds } from '../store/selectors';\nimport { StatusActions } from '../store/actions';\n\n@Injectable()\nexport class BasketGuard implements CanActivate {\n constructor(\n private store$: Store,\n @Inject(PLATFORM_ID) private platform: string\n ) {}\n\n canActivate(): Observable {\n if (isPlatformServer(this.platform)) {\n // Always return true on server so that client handles the requests\n return of(true);\n }\n\n return combineLatest([\n this.store$.pipe(select(getBasketFlights)),\n this.store$.pipe(select(getBasketPassengerIds)),\n ]).pipe(\n take(1),\n map(([flights, passengerIds]: [FlightBasket[], string[]]) => {\n if (!flights?.length || !passengerIds?.length) {\n return this.deny();\n }\n\n return true;\n })\n );\n }\n\n private deny(): false {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.PASSENGERS }));\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, UrlTree } from '@angular/router';\n\nimport { select, Store } from '@ngrx/store';\nimport { map, take, Observable } from 'rxjs';\n\nimport { AppState } from '@fcom/core';\n\nimport { BasketActions, getPassengers } from '../store';\nimport { setStage } from '../store/actions/status.actions';\nimport { Stage } from '../interfaces';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SinglePaxGuard implements CanActivate {\n constructor(private store$: Store) {}\n\n canActivate(): Observable {\n return this.store$.pipe(select(getPassengers)).pipe(\n take(1),\n map((passengers) => {\n if (passengers.length === 1) {\n this.store$.dispatch(BasketActions.addPaxToBasket(passengers[0]));\n this.store$.dispatch(setStage({ stage: Stage.FLIGHTS }));\n }\n\n return true;\n })\n );\n }\n}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { CanActivate } from '@angular/router';\n\nimport { Store, select } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { take, map } from 'rxjs/operators';\n\nimport { State, Stage } from '../interfaces';\nimport { getBookingRef } from '../store/selectors';\nimport { StatusActions } from '../store/actions';\n\n@Injectable()\nexport class SuccessGuard implements CanActivate {\n constructor(\n private store$: Store,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate(): true | Observable {\n if (isPlatformServer(this.platform)) {\n // Always return true on server so that client handles the requests\n return true;\n }\n\n return this.store$.pipe(\n select(getBookingRef),\n take(1),\n map((bookingRef) => {\n if (bookingRef) {\n return true;\n }\n\n return this.deny();\n })\n );\n }\n\n private deny(): false {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n return false;\n }\n}\n","import { Profile, ProfileTier } from '@fcom/core-api/login';\n\n/**\n * Checks if the user's profile tier is a Finnair Plus tier (basic, junior, silver, gold, platinum or lumo) or not (corporate or finnair account)\n * @param profile profile of the user\n * @returns boolean\n */\nexport const isAuthenticatedPlusMember = (profile: Profile): boolean =>\n Boolean(profile && profile.tier !== ProfileTier.CORPORATE && profile.tier !== ProfileTier.ACCOUNT);\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { Store, select } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { take, map, switchMap } from 'rxjs/operators';\n\nimport { profileOrUndefinedIfNotLoggedIn } from '@fcom/core/selectors';\n\nimport { State } from '../interfaces';\nimport { getBasketPassengerData, getBookingRef, getUser } from '../store/selectors';\nimport { AuthActions, BasketActions } from '../store/actions';\nimport { isAuthenticatedPlusMember } from '../utils/profile.utils';\n\n@Injectable()\nexport class RefetchGuard implements CanActivate {\n constructor(\n private store$: Store,\n @Inject(PLATFORM_ID) private platform: string\n ) {}\n\n /**\n * Compares whether the upgrade api call was done when logged in compared to if there is a\n * logged in user profile and vice versa.\n */\n private get loginStatusChanged(): Observable {\n return combineLatest([this.store$.pipe(select(getUser)), this.store$.pipe(profileOrUndefinedIfNotLoggedIn())]).pipe(\n /* Check if loggedInState matches */\n map(([buyer, profile]) => {\n /*\n * Buyer object has info about the user when the upgrade call was made previously,\n * whereas profile object tells about if the user is now logged in or not\n */\n const hadPoints = buyer.points !== undefined;\n const isAuthenticated = isAuthenticatedPlusMember(profile);\n\n return !((hadPoints && isAuthenticated) || (!hadPoints && !isAuthenticated));\n }),\n take(1)\n );\n }\n\n canActivate(): true | Observable {\n if (isPlatformServer(this.platform)) {\n // Always return true on server so that client handles the requests\n return true;\n }\n\n return this.loginStatusChanged.pipe(\n switchMap((hasChanged) => {\n if (!hasChanged) {\n return of(true);\n }\n\n return this.deny();\n })\n );\n }\n\n private deny(): Observable {\n return combineLatest([\n this.store$.pipe(select(getBookingRef)),\n this.store$.pipe(select(getBasketPassengerData)),\n ]).pipe(\n map(([bookingRef, passengers]) => {\n this.store$.dispatch(AuthActions.logout());\n this.store$.dispatch(AuthActions.setBookingRef(bookingRef));\n\n passengers.forEach((pax) => {\n this.store$.dispatch(BasketActions.addPaxToBasket(pax));\n });\n\n this.store$.dispatch(AuthActions.loadPNR());\n\n return false;\n })\n );\n }\n}\n","import { Component, HostListener, OnDestroy, OnInit } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\n\nimport { AuthActions, StatusActions } from '../../store';\nimport { Stage, State } from '../../interfaces';\nimport { OFFERS_V2_TIMEOUT } from '../../constants';\n\n@Component({\n selector: 'fin-upgrade-loading',\n templateUrl: 'loading.component.html',\n})\nexport class LoadingComponent implements OnInit, OnDestroy {\n constructor(private store$: Store) {}\n\n timer: ReturnType;\n\n @HostListener('window:beforeunload', ['$event'])\n beforeUnload(): void {\n this.store$.dispatch(AuthActions.logout());\n }\n\n ngOnInit(): void {\n /**\n * If the user reloads the page whilst loading it will get stuck as no API request will\n * complete. This is a final fallback so that it will go back to the login screen if this\n * happens.\n */\n this.timer = setTimeout(() => {\n this.store$.dispatch(AuthActions.logout());\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n this.timer = undefined;\n }, OFFERS_V2_TIMEOUT);\n }\n\n ngOnDestroy(): void {\n window.clearTimeout(this.timer);\n this.timer = undefined;\n }\n}\n","\n","

\n {{ 'oneUpgrade.pageTitle.passengers' | finLocalization }}\n

\n\n \n\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'fin-upgrade-passengers-selection',\n templateUrl: 'passengers-selection.component.html',\n})\nexport class PassengersSelectionComponent {}\n","\n \n \n\n\n\n \n {{ getNotAvailableReason(flight) | finLocalization }}\n \n\n\n\n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n\n\n\n \n
\n \n {{ upgradeStatus.text | finLocalization: { amount: upgradeStatus.numberOfSeats } }}\n \n
\n
\n
\n\n\n \n
\n \n {{ 'oneUpgrade.notifications.waitlistedUpgrade' | finLocalization }}\n \n \n \n \n
\n
\n {{ 'oneUpgrade.aria.paymentType' | finLocalization }}\n
\n {{ 'oneUpgrade.paymentOptions.' + option.key | finLocalization }}\n
\n {{ 'oneUpgrade.aria.amount' | finLocalization }}\n
\n {{ printPaymentValue(flight, upgrade.upgradeProductName, option.key) | async }}\n
\n
\n
\n\n \n \n {{ 'oneUpgrade.paymentGroup.waitlist' | finLocalization }}\n \n {{ 'oneUpgrade.aria.waitlist' | finLocalization }}\n \n \n \n \n \n \n \n \n

\n {{ 'oneUpgrade.tooltip.notEnoughPointsTitle' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.notEnoughPointsText' | finLocalization }}\n

\n
\n \n

\n {{ 'oneUpgrade.tooltip.notEnoughVouchersTitle' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.notEnoughVouchersText' | finLocalization }}\n

\n
\n \n

\n {{ 'oneUpgrade.tooltip.cardUnavailableTitle' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.cardUnavailableText' | finLocalization }}\n

\n
\n \n

\n {{ 'oneUpgrade.tooltip.cannotBeCombinedTitle' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.cannotBeCombinedTextFirst' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.cannotBeCombinedTextSecond' | finLocalization }}\n

\n
\n \n

\n {{ 'oneUpgrade.tooltip.notEnoughLongHaulVouchersForPaxTitle' | finLocalization }}\n

\n

\n {{ 'oneUpgrade.tooltip.notEnoughLongHaulVouchersForPaxText' | finLocalization }}\n

\n
\n
\n
\n \n \n \n \n
\n \n {{\n 'oneUpgrade.upgradeSelection' + (passengers === 1 ? '.pricesForPassenger' : '.pricesForPassengers')\n | finLocalization: { passengerAmount: passengers }\n }}\n \n
\n \n \n\n","/* eslint-disable sonarjs/no-duplicate-string */\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { KeyValue } from '@angular/common';\nimport { AbstractControl, UntypedFormArray, UntypedFormGroup } from '@angular/forms';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, tap } from 'rxjs/operators';\nimport { LanguageService } from '@fcom/one-upgrade/../ui-translate';\n\nimport { ModalButtons, NotificationLayout, NotificationTheme, TabTheme, TabLayoutType } from '@fcom/ui-components';\n\nimport { getNumberOfFlightsInBound } from '../../utils';\nimport { getCabinFromUpgradeName, getUpgradeByCabin } from '../../utils/data.utils';\nimport { Balance, ExtendedFlightBasket } from '../../interfaces';\nimport { getBasketPassengerIds, getOriginalBalance } from '../../store/selectors';\nimport { PaymentOptionV2 } from '../../interfaces/payment-option.interface';\nimport { PaymentType } from '../../interfaces/payment-type.interface';\nimport { PaymentChangeEvent } from '../../interfaces/payment-change-event.interface';\nimport { State } from '../../interfaces/store.interface';\nimport {\n Cabin,\n Flight,\n Flights,\n FlightsV2,\n FlightV2,\n PaymentOptionsV2,\n Upgrade,\n UpgradeProduct,\n UpgradeStatus,\n UpgradeStatusReason,\n} from '../../api/models';\nimport { sortByPaymentType, UpgradePaymentService } from '../../services/upgrade-payment.service';\nimport { ModalActions } from '../../store/actions';\n\ntype insufficientSeats =\n | 'oneUpgrade.notifications.insufficientSeats.singular'\n | 'oneUpgrade.notifications.insufficientSeats.plural';\n\ninterface TabSettings {\n [Cabin.Ecopremium]: {\n title: string;\n subtitle: string;\n active: boolean;\n };\n [Cabin.Business]: {\n title: string;\n subtitle: string;\n active: boolean;\n };\n}\n\ninterface NotificationSettings {\n text: string;\n icon: SvgLibraryIcon;\n theme: NotificationTheme;\n numberOfSeats?: number;\n}\n\nenum TooltipType {\n CantCombine = 'cantCombine',\n NotEnoughPoints = 'notEnoughPoints',\n NotEnoughVouchers = 'notEnoughVouchers',\n NoCardPayment = 'noCardPayment',\n NotEnoughLongHaulVouchersForPax = 'notEnoughLongHaulVouchersForPax',\n}\n\n@Component({\n selector: 'fin-upgrade-bounds',\n templateUrl: 'upgrade-bounds.component.html',\n styleUrls: ['upgrade-bounds.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UpgradeBoundsComponent implements OnInit {\n readonly TabTheme = TabTheme;\n readonly TabLayoutType = TabLayoutType;\n readonly UpgradeStatus = UpgradeStatus;\n readonly PaymentType = PaymentType;\n readonly NotificationLayout = NotificationLayout;\n readonly NotificationTheme = NotificationTheme;\n readonly Cabin = Cabin;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly TooltipType = TooltipType;\n\n @Input()\n set bounds(_bounds: FlightsV2) {\n if (_bounds !== this._bounds) {\n this._bounds = _bounds;\n this.cd.markForCheck();\n }\n }\n\n get bounds(): FlightsV2 {\n return this._bounds;\n }\n\n @Input()\n set paymentForm(_paymentForm: UntypedFormGroup) {\n if (_paymentForm !== this._paymentForm) {\n this._paymentForm = _paymentForm;\n this.cd.markForCheck();\n }\n }\n\n get paymentForm(): UntypedFormGroup {\n return this._paymentForm;\n }\n\n @Input() selectedFlights: ExtendedFlightBasket[];\n\n @Output()\n changeTabMethod: EventEmitter<{ flightId: string; cabin: Cabin }> = new EventEmitter();\n\n @Output()\n changePaymentMethod: EventEmitter = new EventEmitter();\n\n passengers$: Observable;\n\n originalBalance$: Observable;\n\n activeTab: Record = {};\n\n private _bounds: Flights;\n private _paymentForm: UntypedFormGroup;\n\n constructor(\n private upgradePaymentService: UpgradePaymentService,\n private store$: Store,\n private cd: ChangeDetectorRef,\n private languageService: LanguageService\n ) {}\n\n ngOnInit(): void {\n this.originalBalance$ = this.store$.pipe(select(getOriginalBalance));\n this.passengers$ = this.store$.pipe(\n select(getBasketPassengerIds),\n map((x) => x.length),\n distinctUntilChanged(),\n tap(() => this.cd.markForCheck())\n );\n }\n\n getNumberOfFlights(flight: FlightV2): number {\n return getNumberOfFlightsInBound(flight, this.bounds);\n }\n\n showPaymentMethods(cabin: Cabin, bound: FlightV2): Observable {\n const upgrade = getUpgradeByCabin(cabin, bound.upgrades);\n const hasAvailableUpgrade = upgrade?.upgradeStatus === UpgradeStatus.Available;\n\n if (!hasAvailableUpgrade) {\n return of(false);\n }\n\n if (upgrade.isWaitlist) {\n return of(true);\n }\n\n return this.hasEnoughSeats(upgrade);\n }\n\n hasEnoughSeats(upgrade: Upgrade): Observable {\n return this.passengers$.pipe(\n map((count) => {\n return !!upgrade.seatsAvailable && count <= upgrade.seatsAvailable;\n })\n );\n }\n\n printPaymentValue(flight: FlightV2, productName: UpgradeProduct, paymentType: PaymentType): Observable {\n return this.upgradePaymentService.getValueForPaymentOption(flight, productName, paymentType);\n }\n\n trackPayments(id: string, i: number): AbstractControl {\n return (this.paymentForm.controls[id] as UntypedFormArray).controls[i];\n }\n\n getTabSettings(flight: FlightV2): Observable {\n const premiumEconomyAvailable = getUpgradeByCabin(Cabin.Ecopremium, flight.upgrades);\n const businessAvailable = getUpgradeByCabin(Cabin.Business, flight.upgrades);\n const currentFlight = this.selectedFlights?.find(\n (selectedFlight) => selectedFlight.flightId === flight.segmentInfo.flightId\n );\n let enabledTab = currentFlight ? currentFlight.cabin : Cabin.Business;\n\n if (premiumEconomyAvailable && !businessAvailable) {\n enabledTab = Cabin.Ecopremium;\n }\n\n const selectedPaymentOption$ = currentFlight\n ? this.printPaymentValue(flight, currentFlight.productName, currentFlight?.paymentType)\n : of('-');\n\n const statusMap = {\n [UpgradeStatus.NotAvailable]: this.languageService.translate('oneUpgrade.tabs.notAvailable'),\n [UpgradeStatus.Waitlisted]: this.languageService.translate('oneUpgrade.tabs.waitlisted'),\n [UpgradeStatus.Success]: this.languageService.translate('oneUpgrade.tabs.confirmed'),\n [UpgradeStatus.Failed]: this.languageService.translate('oneUpgrade.tabs.failed'),\n };\n\n const peSubtitle$: Observable = statusMap[premiumEconomyAvailable?.upgradeStatus] || of(null);\n const businessSubtitle$: Observable = statusMap[businessAvailable?.upgradeStatus] || of(null);\n\n return combineLatest([selectedPaymentOption$, peSubtitle$, businessSubtitle$]).pipe(\n map(([selectedPaymentOption, peSubtitle, businessSubtitle]) => {\n const selectedPaymentOptionPe = enabledTab === Cabin.Ecopremium ? selectedPaymentOption : '-';\n const selectedPaymentOptionBusiness = enabledTab === Cabin.Business ? selectedPaymentOption : '-';\n const flightId = flight.segmentInfo.flightId;\n\n return {\n [Cabin.Ecopremium]: {\n title: `oneUpgrade.tabs.${Cabin.Ecopremium.toLowerCase()}`,\n subtitle: peSubtitle || selectedPaymentOptionPe,\n active: this.activeTab[flightId]\n ? this.activeTab[flightId] === Cabin.Ecopremium\n : enabledTab === Cabin.Ecopremium,\n },\n [Cabin.Business]: {\n title: `oneUpgrade.tabs.${Cabin.Business.toLowerCase()}`,\n subtitle: businessSubtitle || selectedPaymentOptionBusiness,\n active: this.activeTab[flightId]\n ? this.activeTab[flightId] === Cabin.Business\n : enabledTab === Cabin.Business,\n },\n };\n })\n );\n }\n\n getUpgradeStatusNotificationConfig(cabin: Cabin, flight: FlightV2, numberOfPassengers: number): NotificationSettings {\n const upgrade = getUpgradeByCabin(cabin, flight.upgrades);\n\n if (!upgrade || upgrade.upgradeStatus === UpgradeStatus.NotAvailable) {\n return {\n icon: SvgLibraryIcon.INFO,\n text: this.getNotAvailableReason(upgrade),\n theme: NotificationTheme.INFO,\n };\n }\n\n if (upgrade.upgradeStatus === UpgradeStatus.Success) {\n return {\n icon: SvgLibraryIcon.CHECKMARK,\n text: 'oneUpgrade.notifications.flightUpgraded',\n theme: NotificationTheme.SUCCESS,\n };\n }\n\n if (upgrade.upgradeStatus === UpgradeStatus.Failed) {\n return {\n icon: SvgLibraryIcon.ALERT_BLOCK,\n text: 'oneUpgrade.notifications.upgradeFailed',\n theme: NotificationTheme.ALERT,\n };\n }\n\n if (upgrade.upgradeStatus === UpgradeStatus.Waitlisted) {\n const text =\n cabin === Cabin.Ecopremium\n ? 'oneUpgrade.review.waitlistedNotificationPremiumEconomy'\n : 'oneUpgrade.review.waitlistedNotificationBusiness';\n\n return {\n icon: SvgLibraryIcon.INFO,\n text,\n theme: NotificationTheme.INFO,\n };\n }\n\n if (upgrade.seatsAvailable && numberOfPassengers > upgrade.seatsAvailable) {\n return {\n icon: SvgLibraryIcon.INFO,\n text: this.getSeatsAvailableText(upgrade),\n theme: NotificationTheme.INFO,\n numberOfSeats: upgrade.seatsAvailable,\n };\n }\n\n return {\n icon: SvgLibraryIcon.INFO,\n text: 'oneUpgrade.notifications.notAvailableForFlight',\n theme: NotificationTheme.ALERT,\n };\n }\n\n getNotAvailableReason(upgrade?: Upgrade): string {\n const upgradeClosedErr = 'oneUpgrade.notifications.upgradeClosed';\n const notFinnarFlightErr = 'oneUpgrade.notifications.notFinnair';\n const notAvailableErr = 'oneUpgrade.notifications.notAvailableForFlight';\n\n if (upgrade) {\n const errorMap = {\n [UpgradeStatusReason.TooCloseToDeparture]: upgradeClosedErr,\n [UpgradeStatusReason.NotFinnairFlight]: notFinnarFlightErr,\n [UpgradeStatusReason.SsrInBooking]: notAvailableErr,\n [UpgradeStatusReason.TooFarToDeparture]: notAvailableErr,\n [UpgradeStatusReason.TooCloseToDepartureForWaitlist]: notAvailableErr,\n [UpgradeStatusReason.SegmentInRequestedUpgradeCabin]: notAvailableErr,\n [UpgradeStatusReason.SegmentMissingRequestedUpgradeCabin]: notAvailableErr,\n [UpgradeStatusReason.TicketNotIssuedByFinnair]: notAvailableErr,\n [UpgradeStatusReason.IneligibleBookingClass]: notAvailableErr,\n [UpgradeStatusReason.BookingInIneligibleStatus]: notAvailableErr,\n [UpgradeStatusReason.FlownSegment]: notAvailableErr,\n };\n\n return errorMap[upgrade.upgradeStatusReason] || notAvailableErr;\n }\n }\n\n getUpgradePaymentOptions(cabin: Cabin, flight: FlightV2): PaymentOptionsV2 {\n const upgrade = getUpgradeByCabin(cabin, flight.upgrades);\n\n return upgrade?.paymentOptions;\n }\n\n emitTabChange(event: { index: number; data: unknown }, flightId: string): void {\n this.activeTab[flightId] = event.data as Cabin;\n this.changeTabMethod.emit({ cabin: event.data as Cabin, flightId });\n }\n\n shouldRenderTabs(upgrades: Upgrade[]): boolean {\n const business = getUpgradeByCabin(Cabin.Business, upgrades);\n const premiumEconomy = getUpgradeByCabin(Cabin.Ecopremium, upgrades);\n\n const noBusinessUpgrade = business ? business.upgradeStatus === UpgradeStatus.NotAvailable : true;\n const noPremiumEconomyUpgrade = premiumEconomy ? premiumEconomy.upgradeStatus === UpgradeStatus.NotAvailable : true;\n\n return !(noBusinessUpgrade && noPremiumEconomyUpgrade);\n }\n\n getUpgradeByCabin(cabin: Cabin, upgrades: Upgrade[]): Upgrade {\n return getUpgradeByCabin(cabin, upgrades);\n }\n\n getSeatsAvailableText(upgrade: Upgrade): insufficientSeats {\n return upgrade.seatsAvailable === 1\n ? 'oneUpgrade.notifications.insufficientSeats.singular'\n : 'oneUpgrade.notifications.insufficientSeats.plural';\n }\n\n showWaitlistInfo(cabin: Cabin, flight: FlightV2): boolean {\n const upgrade = getUpgradeByCabin(cabin, flight.upgrades);\n\n return upgrade.isWaitlist;\n }\n\n moneyAsLast(a: KeyValue, b: KeyValue): number {\n return sortByPaymentType(a.key, b.key);\n }\n\n openModal(event: Event, flightId: string, productName: UpgradeProduct): void {\n event.stopPropagation();\n\n this.store$.dispatch(\n ModalActions.openModal({\n modal: {\n title: 'oneUpgrade.upgradeSelection.waitlistInfoModal.title',\n fragment: 'fragments.oneUpgrade.waitlistHelp.url',\n buttons: ModalButtons.DONE,\n },\n returnTarget: `[data-flight=\"${flightId}\"][data-upgrade=\"${productName}\"] fcom-notification button`,\n })\n );\n }\n\n trackByFn(_index: number, item: Flight): string {\n return item.segmentInfo.flightId;\n }\n\n emitChange(\n selected: boolean,\n elemIndex: number,\n flight: FlightV2,\n option: KeyValue,\n upgradeProduct: UpgradeProduct\n ): void {\n this.changePaymentMethod.emit({\n selected,\n elemIndex,\n flightId: flight.segmentInfo.flightId,\n paymentOption: option.value,\n paymentType: option.key,\n group: flight.segmentInfo.group,\n longHaul: flight.segmentInfo.longHaul,\n upgradeProduct,\n });\n }\n\n isDisabled(flightId: string, cabin: Cabin, index: number): boolean {\n return (this.paymentForm.controls[flightId] as UntypedFormArray).controls[cabin].controls[index].disabled;\n }\n\n getTooltip(\n flight: FlightV2,\n productName: UpgradeProduct,\n paymentType: PaymentType,\n index: number\n ): Observable {\n const isInsufficientPayment = this.upgradePaymentService.insufficientPayment(flight, productName, paymentType);\n const isDisabled = this.isDisabled(flight.segmentInfo.flightId, getCabinFromUpgradeName(productName), index);\n const upgradeBenefits = [PaymentType.EUROPE_UPGRADE, PaymentType.UPGRADE_BENEFIT, PaymentType.LONG_HAUL_UPGRADE];\n\n return combineLatest([this.originalBalance$, this.passengers$]).pipe(\n map(([originalBalance, paxAmount]) => {\n if (paymentType === PaymentType.money && !isDisabled) {\n /**\n * Tooltip disabled as card payments are now allowed in some situations.\n * https://trello.com/c/qXDFjyFi/9235-hide-card-payment-pop-up-and-info-button-from-upgrade-flow\n **/\n return null;\n }\n\n if (paymentType === PaymentType.points && isInsufficientPayment) {\n return TooltipType.NotEnoughPoints;\n }\n\n if (\n paymentType === PaymentType.LONG_HAUL_UPGRADE &&\n isDisabled &&\n originalBalance.LONG_HAUL_UPGRADE < paxAmount\n ) {\n return TooltipType.NotEnoughLongHaulVouchersForPax;\n }\n\n if (upgradeBenefits.includes(paymentType) && isInsufficientPayment) {\n return TooltipType.NotEnoughVouchers;\n }\n\n return TooltipType.CantCombine;\n })\n );\n }\n}\n","\n 2\" [bounds]=\"bounds\">\n \n\n
\n \n \n
\n\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { AbstractControl, UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\n\nimport { select, Store } from '@ngrx/store';\nimport { combineLatest, Observable, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, scan, withLatestFrom } from 'rxjs/operators';\n\nimport { GtmEvent, ToasterService } from '@fcom/common';\nimport { unsubscribe } from '@fcom/core/utils';\n\nimport { getCabinFromUpgrade, getUpgradeByCabin, getUpgradeFromFlight } from '../../utils/data.utils';\nimport { Buyer, Cabin, Flights, FlightsV2, FlightV2, Upgrade, UpgradeProduct } from '../../api/models';\nimport {\n ExtendedFlightBasket,\n FlightBasket,\n PaymentChangeEvent,\n PaymentTotal,\n PaymentType,\n Stage,\n State,\n StatusState,\n} from '../../interfaces';\nimport * as paymentUtils from '../../utils/payment.utils';\nimport { sortByPaymentType, UpgradePaymentService } from '../../services/upgrade-payment.service';\nimport {\n getBasketFlights,\n getBasketPassengerIds,\n getFlights,\n getJourneys,\n getPaymentTotal,\n getUser,\n selectStatusState,\n} from '../../store/selectors';\nimport { BasketActions } from '../../store/actions';\nimport { UpgradeAnalyticsService } from '../../services/upgrade-analytics.service';\n\n// @todo Update UpdateFlightBasketParams to new version\ninterface UpdateFlightBasketParams {\n flightIsDeselected: boolean;\n flight: { flightId: string; group: number; longHaul: boolean };\n upgrade: Upgrade;\n paymentType: PaymentType;\n selectedFlights: ExtendedFlightBasket[];\n cabin: Cabin;\n}\n\n@Component({\n selector: 'fin-upgrade-flights',\n templateUrl: 'upgrade-flights.component.html',\n})\nexport class UpgradeFlightsComponent implements OnInit, OnDestroy {\n journeys$: Observable;\n flights$: Observable;\n selectedPassengers$: Observable;\n selectedFlights$: Observable;\n paymentTotal$: Observable;\n buyer$: Observable;\n currentStage$: Observable;\n\n paymentForm: UntypedFormGroup;\n paymentMethodChanged$ = new Subject();\n flightTabChanged$ = new Subject<{ flightId: string; cabin: Cabin }>();\n\n subscriptions: Subscription = new Subscription();\n public readonly Stage = Stage;\n\n constructor(\n private store: Store,\n private toaster: ToasterService,\n private paymentService: UpgradePaymentService,\n private upgradeAnalyticsService: UpgradeAnalyticsService\n ) {}\n\n ngOnInit(): void {\n this.journeys$ = this.store.pipe(select(getJourneys));\n this.flights$ = this.store.pipe(select(getFlights));\n this.selectedPassengers$ = this.store.pipe(select(getBasketPassengerIds));\n this.selectedFlights$ = this.store.pipe(select(getBasketFlights));\n this.paymentTotal$ = this.store.pipe(select(getPaymentTotal));\n this.buyer$ = this.store.pipe(select(getUser));\n this.currentStage$ = this.store.pipe(select(selectStatusState));\n\n this.subscriptions.add(\n combineLatest([this.flights$, this.selectedFlights$]).subscribe(\n ([flights, selectedFlights]: [Flights, ExtendedFlightBasket[]]) => {\n this.constructForm(flights, selectedFlights);\n }\n )\n );\n\n this.subscriptions.add(\n combineLatest([this.flights$, this.paymentMethodChanged$])\n .pipe(withLatestFrom(this.selectedFlights$))\n .subscribe(([[flights, data], selectedFlights]) => {\n const flightThatChanged = flights.find((flight) => flight.segmentInfo.flightId === data.flightId);\n\n if (!flightThatChanged) {\n return;\n }\n\n const upgrade = getUpgradeFromFlight(flightThatChanged, data.upgradeProduct);\n const cabinClass = getCabinFromUpgrade(upgrade);\n\n this.forceSinglePaymentOptionForFlight(data.elemIndex, data.flightId, cabinClass);\n this.updateFlightBasket({\n flightIsDeselected: !data.selected,\n flight: { flightId: data.flightId, group: data.group, longHaul: data.longHaul },\n upgrade,\n paymentType: data.paymentType,\n selectedFlights,\n cabin: cabinClass,\n });\n })\n );\n\n this.subscriptions.add(\n this.flightTabChanged$\n .pipe(withLatestFrom(this.selectedFlights$))\n .subscribe(([flightTabChanged, selectedFlight]) => {\n const flightThatChanged = selectedFlight.find((flight) => flight.flightId === flightTabChanged.flightId);\n const controls = (\n this.paymentForm.get([flightTabChanged.flightId]).get(flightTabChanged.cabin) as UntypedFormArray\n ).controls;\n controls.forEach((control: AbstractControl): void => {\n if (flightTabChanged.cabin !== flightThatChanged?.cabin) {\n control.setValue(false);\n }\n });\n })\n );\n\n this.subscriptions.add(\n this.showLongHaulToast().subscribe(({ added, removed }) => {\n if (added) {\n this.toaster.addMessageToQueue({\n id: 'UPGRADE_LONGHAUL_DISCOUNT',\n contentKey: 'oneUpgrade.toaster.longhaulDiscount',\n autoClose: true,\n beneathModal: true,\n });\n }\n if (removed) {\n this.toaster.addMessageToQueue({\n id: 'UPGRADE_LONGHAUL_DISCOUNT_REMOVED',\n contentKey: 'oneUpgrade.toaster.longhaulDiscountRemoved',\n autoClose: true,\n beneathModal: true,\n });\n }\n })\n );\n\n this.subscriptions.add(\n this.showWaitlistToast().subscribe((hasWaitlist) => {\n if (hasWaitlist) {\n this.toaster.addMessageToQueue({\n id: 'UPGRADE_WAITLISTED',\n contentKey: 'oneUpgrade.toaster.waitlisted',\n autoClose: false,\n beneathModal: true,\n });\n } else {\n this.toaster.removeMessage('UPGRADE_WAITLISTED');\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n showLongHaulToast(): Observable<{\n added: boolean;\n removed: boolean;\n }> {\n return combineLatest([this.flights$, this.selectedFlights$]).pipe(\n map(([flights, selectedFlights]) => {\n const groups = new Set(\n selectedFlights\n .filter(\n (selected) =>\n selected.flight.segmentInfo.longHaul &&\n selected.paymentType === PaymentType.points &&\n flights.find((flight) =>\n flight.upgrades.some(\n (f) =>\n !flight.segmentInfo.longHaul && // short haul\n flight.segmentInfo.group === selected.flight.segmentInfo.group && // same group\n !!f.paymentOptions.points && // short haul has points option\n f.paymentOptions.points.priceWithLongHaul !== undefined && // short haul has discounted points price\n selected.productName === UpgradeProduct.EconomyToBusiness // long haul upgrade is economy-to-business\n )\n )\n )\n .map((selected) => selected.flight.segmentInfo.group)\n );\n return Array.from(groups);\n }), // only care about longHaul paid with points where there is a shortHaul in the same group\n distinctUntilChanged(),\n scan(\n (acc, cur) => {\n return {\n prev: cur,\n added: !cur.every((group) => acc.prev.includes(group)),\n removed: !acc.prev.every((group) => cur.includes(group)),\n };\n },\n {\n prev: [],\n added: false,\n removed: false,\n }\n ),\n map(({ added, removed }) => ({ added, removed })),\n filter((x) => x.added || x.removed)\n );\n }\n\n showWaitlistToast(): Observable {\n return this.selectedFlights$.pipe(\n map((flights: ExtendedFlightBasket[]) => {\n return flights\n .filter((flightBasket) => {\n return getUpgradeFromFlight(flightBasket.flight, flightBasket.productName).isWaitlist;\n })\n .map((flightBasket) => flightBasket.flight.segmentInfo.flightId);\n }),\n distinctUntilChanged((prev, cur) => {\n // When there is no waitlist in the basket mark as distinct\n if (!cur.length) {\n return false;\n }\n\n return cur.every((flight) => prev.includes(flight));\n }),\n map((flights) => {\n return Boolean(flights.length);\n })\n );\n }\n\n private constructForm(flights: FlightsV2, selectedFlights: ExtendedFlightBasket[]): void {\n const inputArrays = flights.reduce<{ [key: string]: AbstractControl }>((acc, flight) => {\n const premiumEconomyUpgrade = getUpgradeByCabin(Cabin.Ecopremium, flight.upgrades);\n const businessUpgrade = getUpgradeByCabin(Cabin.Business, flight.upgrades);\n\n acc[flight.segmentInfo.flightId] = new UntypedFormGroup({\n ...(premiumEconomyUpgrade && {\n [Cabin.Ecopremium]: new UntypedFormArray(\n this.generateInputFormControl(flight, selectedFlights, premiumEconomyUpgrade)\n ),\n }),\n ...(businessUpgrade && {\n [Cabin.Business]: new UntypedFormArray(\n this.generateInputFormControl(flight, selectedFlights, businessUpgrade)\n ),\n }),\n });\n\n return acc;\n }, {});\n\n if (!flights.length) {\n this.paymentForm = undefined;\n\n return;\n }\n\n if (this.paymentForm) {\n this.updatePaymentForm(flights, inputArrays);\n } else {\n this.paymentForm = new UntypedFormGroup(inputArrays);\n }\n }\n\n updatePaymentForm(\n flights: FlightsV2,\n inputArrays: {\n [key: string]: AbstractControl;\n }\n ): void {\n flights.forEach((flight) => {\n const flightGroup = this.paymentForm.get(flight.segmentInfo.flightId);\n\n [Cabin.Ecopremium, Cabin.Business].forEach((cabin) => {\n const upgrade = getUpgradeByCabin(cabin, flight.upgrades);\n\n if (upgrade && flightGroup) {\n const cabinArray = inputArrays[flight.segmentInfo.flightId].get(cabin) as UntypedFormArray;\n\n for (let i = 0; i < cabinArray.length; i++) {\n const value = cabinArray.get(`${i}`).value;\n const disabled = cabinArray.get(`${i}`).disabled;\n\n flightGroup.get(cabin).get(`${i}`).setValue(value);\n flightGroup.get(cabin).get(`${i}`)[disabled ? 'disable' : 'enable']();\n }\n }\n });\n });\n }\n\n generateInputFormControl(\n flight: FlightV2,\n selectedFlights: ExtendedFlightBasket[],\n upgrade: Upgrade\n ): AbstractControl[] {\n const matchingFlight = selectedFlights.find((selected) => selected.flightId === flight.segmentInfo.flightId);\n\n const longHaulDiscount = !flight.segmentInfo.longHaul\n ? paymentUtils.isLongHaulUpgraded(selectedFlights, flight.segmentInfo.group)\n : false;\n\n return (Object.keys(upgrade?.paymentOptions || {}) as unknown as PaymentType[])\n .filter((paymentType: PaymentType) => !!upgrade?.paymentOptions[paymentType])\n .sort(sortByPaymentType)\n .map((paymentName: PaymentType) => {\n const paymentIsAlreadySelected = matchingFlight ? paymentName === matchingFlight.paymentType : false;\n const cabin = getCabinFromUpgrade(upgrade);\n\n const { selected, disabled } = this.selectFreeOption(\n longHaulDiscount,\n paymentIsAlreadySelected,\n paymentName,\n flight,\n selectedFlights,\n upgrade,\n cabin\n );\n\n return new UntypedFormControl({\n value: selected,\n disabled: disabled || this.isPaymentOptionDisabled(selectedFlights, flight, paymentName, upgrade),\n });\n });\n }\n\n forceSinglePaymentOptionForFlight(elemIndex: number, flightId: string, cabin: Cabin): void {\n const controls = (this.paymentForm.get(flightId).get(cabin) as UntypedFormArray).controls;\n\n controls.forEach((control: AbstractControl, index: number): void => {\n if (elemIndex !== index) {\n control.setValue(false);\n }\n });\n }\n\n /**\n * Toggle flight in basket\n */\n updateFlightBasket(params: UpdateFlightBasketParams): void {\n const item: FlightBasket = {\n flightId: params.flight.flightId,\n productName: params.upgrade.upgradeProductName,\n paymentType: params.paymentType,\n cabin: params.cabin,\n };\n\n const flightInBasket = params.selectedFlights.find((selected) => selected.flightId === params.flight.flightId);\n\n if (params.flightIsDeselected) {\n this.store.dispatch(BasketActions.removeFlight({ flightId: params.flight.flightId }));\n this.upgradeAnalyticsService.sendAddRemoveEvent(GtmEvent.REMOVE_FROM_CART, item);\n } else if (flightInBasket) {\n this.store.dispatch(BasketActions.updateFlight({ flight: item }));\n\n if (flightInBasket.productName !== item.productName) {\n this.upgradeAnalyticsService.sendAddRemoveEvent(GtmEvent.REMOVE_FROM_CART, flightInBasket);\n this.upgradeAnalyticsService.sendAddRemoveEvent(GtmEvent.ADD_TO_CART, item);\n }\n } else {\n this.store.dispatch(BasketActions.addFlightToBasket({ flight: item }));\n this.upgradeAnalyticsService.sendAddRemoveEvent(GtmEvent.ADD_TO_CART, item);\n }\n }\n\n /**\n * Check if payment option should be disabled\n *\n * @param paxCount number of passengers to upgrade\n * @param flightBasket array of selected flights\n * @param flight Current flight details\n * @param paymentType type of payment\n * @param buyer The buyers balance\n */\n private isPaymentOptionDisabled(\n flightBasket: ExtendedFlightBasket[],\n flight: FlightV2,\n paymentType: PaymentType,\n upgrade: Upgrade\n ) {\n if (flightBasket.find((x) => x.flightId === flight.segmentInfo.flightId && x.paymentType === paymentType)) {\n /* if already selected return false to allow deselecting */\n return false;\n }\n\n // if user can't pay then return true\n if (this.paymentService.insufficientPayment(flight, upgrade.upgradeProductName, paymentType)) {\n return true;\n }\n\n /**\n * if basket empty or only flight in basket is this flight,\n * then return false to allow swapping payment of current flight\n */\n const onlyThisFlightSelected =\n flightBasket.length === 1 && flightBasket[0].flightId === flight.segmentInfo.flightId;\n\n if (!flightBasket.length || onlyThisFlightSelected) {\n return false;\n }\n\n /**\n * if incompatible payment then return true\n */\n const selectedPayments = flightBasket.map((x) => x.paymentType);\n\n if (paymentType === PaymentType.money) {\n return (\n selectedPayments.includes(PaymentType.points) ||\n selectedPayments.includes(PaymentType.EUROPE_UPGRADE) ||\n selectedPayments.includes(PaymentType.LONG_HAUL_UPGRADE) ||\n selectedPayments.includes(PaymentType.UPGRADE_BENEFIT)\n );\n } else {\n return selectedPayments.includes(PaymentType.money);\n }\n }\n\n /**\n * Check if flight should be disabled or selected due to long haul discount\n *\n * @param longHaulDiscount is there a long haul discount that can be applied to this flight\n * @param isSelected is the option already selected\n * @param paymentType What Payment Type is this option?\n * @param flight Flight details\n * @param selectedFlights Flights in basket\n */\n private selectFreeOption(\n longHaulDiscount: boolean,\n isSelected: boolean,\n paymentType: PaymentType,\n flight: FlightV2,\n selectedFlights: ExtendedFlightBasket[],\n upgrade: Upgrade,\n cabin: Cabin\n ): {\n selected: boolean;\n disabled: boolean;\n } {\n if (\n longHaulDiscount &&\n !!upgrade?.paymentOptions.points &&\n upgrade?.paymentOptions.points.priceWithLongHaul !== undefined &&\n upgrade?.paymentOptions.points.priceWithLongHaul === 0\n ) {\n if (paymentType === PaymentType.points) {\n if (!isSelected) {\n this.updateFlightBasket({\n flightIsDeselected: false,\n flight: {\n flightId: flight.segmentInfo.flightId,\n group: flight.segmentInfo.group,\n longHaul: flight.segmentInfo.longHaul,\n },\n upgrade,\n paymentType: PaymentType.points,\n selectedFlights,\n cabin,\n });\n }\n return {\n selected: true,\n disabled: true,\n };\n } else {\n return {\n selected: false,\n disabled: true,\n };\n }\n }\n return {\n selected: isSelected,\n disabled: false,\n };\n }\n}\n","

\n {{ 'oneUpgrade.pageTitle.flights' | finLocalization }}\n

\n\n \n\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { LoginComponent } from './views/login/login.component';\nimport { ReviewComponent } from './views/review/review.component';\nimport { ErrorComponent } from './views/error/error.component';\nimport { SuccessComponent } from './views/success/success.component';\nimport { ProcessingComponent } from './views/processing/processing.component';\nimport { OneUpgradeLayoutComponent } from './views/layout/layout.component';\nimport {\n OneUpgradeGuard,\n LoginGuard,\n PNRGuard,\n SinglePaxGuard,\n SuccessGuard,\n ProcessingGuard,\n RefetchGuard,\n BasketGuard,\n} from './guards/index';\nimport { LoadingComponent } from './views/loading/loading.component';\nimport { PassengersSelectionComponent } from './views/passengers-selection/passengers-selection.component';\nimport { FlightsSelectionComponent } from './views/flights-selection/flights-selection.component';\nimport { Stage } from './interfaces';\n\nexport const oneUpgradeRoutes: Routes = [\n {\n path: '',\n component: OneUpgradeLayoutComponent,\n canActivateChild: [OneUpgradeGuard],\n children: [\n {\n path: Stage.LOGIN,\n canActivate: [LoginGuard],\n component: LoginComponent,\n },\n {\n path: Stage.LOADING,\n canActivate: [PNRGuard],\n component: LoadingComponent,\n },\n {\n path: Stage.PASSENGERS,\n canActivate: [PNRGuard, SinglePaxGuard, RefetchGuard],\n component: PassengersSelectionComponent,\n },\n {\n path: Stage.FLIGHTS,\n canActivate: [PNRGuard, RefetchGuard],\n component: FlightsSelectionComponent,\n },\n {\n path: Stage.REVIEW,\n canActivate: [RefetchGuard, BasketGuard],\n component: ReviewComponent,\n },\n {\n path: Stage.ERROR,\n component: ErrorComponent,\n },\n {\n path: Stage.SUCCESS,\n canActivate: [SuccessGuard],\n component: SuccessComponent,\n },\n {\n path: Stage.PROCESSING,\n component: ProcessingComponent,\n canActivate: [ProcessingGuard],\n },\n {\n path: '**',\n redirectTo: '',\n },\n ],\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(oneUpgradeRoutes)],\n declarations: [],\n exports: [RouterModule],\n})\nexport class OneUpgradeRouteModule {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'fin-upgrade-flights-selection',\n templateUrl: 'flights-selection.component.html',\n})\nexport class FlightsSelectionComponent {}\n","/* tslint:disable */\n/* eslint-disable */\nimport { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiConfiguration, ApiConfigurationParams } from './api-configuration';\n\nimport { OffersService } from './services/offers.service';\nimport { UpgradeService } from './services/upgrade.service';\nimport { OffersSeatService } from './services/offers-seat.service';\nimport { NotificationsService } from './services/notifications.service';\nimport { CheckoutService } from './services/checkout.service';\nimport { InfoService } from './services/info.service';\n\n/**\n * Module that provides all services and configuration.\n */\n@NgModule({\n imports: [],\n exports: [],\n declarations: [],\n providers: [\n OffersService,\n UpgradeService,\n OffersSeatService,\n NotificationsService,\n CheckoutService,\n InfoService,\n ApiConfiguration\n ],\n})\nexport class ApiModule {\n static forRoot(params: ApiConfigurationParams): ModuleWithProviders {\n return {\n ngModule: ApiModule,\n providers: [\n {\n provide: ApiConfiguration,\n useValue: params\n }\n ]\n }\n }\n\n constructor( \n @Optional() @SkipSelf() parentModule: ApiModule,\n @Optional() http: HttpClient\n ) {\n if (parentModule) {\n throw new Error('ApiModule is already loaded. Import in your base AppModule only.');\n }\n if (!http) {\n throw new Error('You need to import the HttpClientModule in your AppModule! \\n' +\n 'See also https://github.com/angular/angular/issues/20575');\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport { map, tap } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { ScrollService } from '@fcom/common/services';\nimport { RootPaths } from '@fcom/core/constants';\n\nimport { StatusActions } from '../actions';\nimport { Stage } from '../../interfaces/stage.interface';\n\n@Injectable()\nexport class StatusEffects {\n navigate(path: string): void {\n this.router.navigate(['/', this.lang.langValue || 'en', ...RootPaths.ONE_UPGRADE_ROOT.split('/'), path]);\n }\n\n stage$ = createEffect(\n () =>\n this.actions$.pipe(\n ofType(StatusActions.setStage.type),\n map((action) => action.stage),\n tap((stage) => {\n switch (stage) {\n case Stage.LOGIN: {\n this.router.navigate(['/', this.lang.langValue || 'en', ...RootPaths.ONE_UPGRADE_ROOT.split('/')], {\n queryParamsHandling: 'merge',\n });\n this.scrollService.scrollTop();\n return;\n }\n case Stage.LOADING:\n this.navigate('loading');\n this.scrollService.scrollTop();\n return;\n case Stage.PASSENGERS:\n this.navigate('passengers');\n this.scrollService.scrollTop();\n return;\n case Stage.FLIGHTS: {\n this.navigate('flights');\n this.scrollService.scrollTop();\n return;\n }\n case Stage.REVIEW: {\n this.navigate('review');\n this.scrollService.scrollTop();\n return;\n }\n case Stage.SUCCESS: {\n this.navigate('success');\n this.scrollService.scrollTop();\n return;\n }\n case Stage.PROCESSING: {\n this.router.navigate([\n '/',\n this.lang.langValue || 'en',\n ...RootPaths.ONE_UPGRADE_ROOT.split('/'),\n 'processing',\n ]);\n this.scrollService.scrollTop();\n return;\n }\n case Stage.ERROR: {\n this.navigate('error');\n this.scrollService.scrollTop();\n return;\n }\n default: {\n return;\n }\n }\n })\n ),\n { dispatch: false }\n );\n\n constructor(\n private readonly actions$: Actions,\n private router: Router,\n private lang: LanguageService,\n private scrollService: ScrollService\n ) {}\n}\n","import { Injectable } from '@angular/core';\n\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport { select, Store } from '@ngrx/store';\nimport { EMPTY } from 'rxjs';\nimport { catchError, exhaustMap, tap, withLatestFrom } from 'rxjs/operators';\n\nimport { StatusActions, UpgradeActions } from '../actions';\nimport { UpgradeFlightsService } from '../../services/upgrade-flights.service';\nimport { UpgradeResponse } from '../../api/models';\nimport { Stage } from '../../interfaces/stage.interface';\nimport { State } from '../../interfaces/store.interface';\nimport { DataActions, getMoneyPaymentNotSelected } from '../../store';\nimport { UpgradeError } from '../../interfaces';\n\n@Injectable()\nexport class UpgradeFlightsEffects {\n upgrade$ = createEffect(\n () =>\n this.actions$.pipe(\n ofType(UpgradeActions.upgradeFlights.type),\n exhaustMap(() => this.upgradeService.upgradeFlights()),\n withLatestFrom(this.store.pipe(select(getMoneyPaymentNotSelected))),\n tap(([response, moneyPaymentNotSelected]: [UpgradeResponse, boolean]) => {\n this.store.dispatch(StatusActions.clearPending());\n\n if (moneyPaymentNotSelected) {\n this.store.dispatch(DataActions.setUpgradeResponse({ upgradeResponse: response }));\n this.store.dispatch(StatusActions.setStage({ stage: Stage.PROCESSING }));\n } else {\n window.location.href = response.url;\n }\n }),\n catchError(() => {\n // TODO: handle specific error cases and default to generic error page\n this.store.dispatch(StatusActions.clearPending());\n this.store.dispatch(StatusActions.setError({ error: UpgradeError.paymentError }));\n this.store.dispatch(StatusActions.setStage({ stage: Stage.ERROR }));\n\n return EMPTY;\n })\n ),\n { dispatch: false }\n );\n\n constructor(\n private readonly actions$: Actions,\n private upgradeService: UpgradeFlightsService,\n private store: Store\n ) {}\n}\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const AB23CD: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSAINOPEKKANEN',\n firstName: 'AINO',\n lastName: 'PEKKANEN',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'AINO MS',\n ordinal: 1,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-456-OUL-HEL-2023-02-09T19:30:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '456',\n boardPoint: 'OUL',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-09T19:30:00',\n departureDateTime: '2023-02-09T19:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-09T20:35:00',\n arrivalDateTime: '2023-02-09T20:35:00.000+02:00',\n durationInMinutes: 65,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '180',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n priceWithLongHaul: 0,\n },\n UPGRADE_BENEFIT: {\n price: 1,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-131-HEL-SIN-2023-02-09T23:40:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '131',\n boardPoint: 'HEL',\n offPoint: 'SIN',\n departureDateTimeLocal: '2023-02-09T23:40:00',\n departureDateTime: '2023-02-09T23:40:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-10T18:15:00',\n arrivalDateTime: '2023-02-10T18:15:00.000+08:00',\n durationInMinutes: 755,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '627',\n currency: 'EUR',\n },\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '251',\n currency: 'EUR',\n },\n points: {\n price: 40000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'SAM.WARREN@FINNAIR.COM',\n points: 32675696,\n vouchers: [\n {\n type: VoucherType.EuropeUpgrade,\n count: 9,\n },\n {\n type: VoucherType.LongHaulUpgrade,\n count: 4,\n },\n ],\n },\n};\n","import { AB23CD } from './AB23CD';\nimport { BC23DE } from './BC23DE';\nimport { CD23EF } from './CD23EF';\nimport { DE23FG } from './DE23FG';\nimport { EF23GH } from './EF23GH';\nimport { FG23HI } from './FG23HI';\n\nexport const fixtures = {\n AB23CD, // Customer only has european upgrade vouchers\n BC23DE, // Customer only has upgrade benefits\n CD23EF, // Customer has both european upgrade vouchers and upgrade benefits\n DE23FG, // OUL - HEL - SIN return 3 pax all vouchers\n EF23GH, // OUL - HEL - SIN return 2 pax, no long haul vouchers\n FG23HI, // Old API, no upgrade benefits in payment options\n};\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const BC23DE: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSAINOPEKKANEN',\n firstName: 'AINO',\n lastName: 'PEKKANEN',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'AINO MS',\n ordinal: 1,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-456-OUL-HEL-2023-02-09T19:30:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '456',\n boardPoint: 'OUL',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-09T19:30:00',\n departureDateTime: '2023-02-09T19:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-09T20:35:00',\n arrivalDateTime: '2023-02-09T20:35:00.000+02:00',\n durationInMinutes: 65,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '180',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n },\n UPGRADE_BENEFIT: {\n price: 1,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-131-HEL-SIN-2023-02-09T23:40:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '131',\n boardPoint: 'HEL',\n offPoint: 'SIN',\n departureDateTimeLocal: '2023-02-09T23:40:00',\n departureDateTime: '2023-02-09T23:40:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-10T18:15:00',\n arrivalDateTime: '2023-02-10T18:15:00.000+08:00',\n durationInMinutes: 755,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '627',\n currency: 'EUR',\n },\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '251',\n currency: 'EUR',\n },\n points: {\n price: 40000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'SAM.WARREN@FINNAIR.COM',\n points: 32675696,\n vouchers: [\n {\n type: VoucherType.LongHaulUpgrade,\n count: 4,\n },\n {\n type: VoucherType.UpgradeBenefit,\n count: 4,\n },\n ],\n },\n};\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const CD23EF: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSAINOPEKKANEN',\n firstName: 'AINO',\n lastName: 'PEKKANEN',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'AINO MS',\n ordinal: 1,\n },\n {\n passengerId: 'MRPEKKAPEKKANEN',\n firstName: 'PEKKA',\n lastName: 'PEKKANEN',\n title: 'MR',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'PEKKA MR',\n ordinal: 2,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-456-OUL-HEL-2023-02-09T19:30:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '456',\n boardPoint: 'OUL',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-09T19:30:00',\n departureDateTime: '2023-02-09T19:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-09T20:35:00',\n arrivalDateTime: '2023-02-09T20:35:00.000+02:00',\n durationInMinutes: 65,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-131-HEL-SIN-2023-02-09T23:40:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '131',\n boardPoint: 'HEL',\n offPoint: 'SIN',\n departureDateTimeLocal: '2023-02-09T23:40:00',\n departureDateTime: '2023-02-09T23:40:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-10T18:15:00',\n arrivalDateTime: '2023-02-10T18:15:00.000+08:00',\n durationInMinutes: 755,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '627',\n currency: 'EUR',\n },\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '251',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-132-SIN-HEL-2023-02-23T22:30:00',\n group: 2,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '132',\n boardPoint: 'SIN',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-23T22:30:00',\n departureDateTime: '2023-02-23T22:30:00.000+08:00',\n arrivalDateTimeLocal: '2023-02-24T06:10:00',\n arrivalDateTime: '2023-02-24T06:10:00.000+02:00',\n durationInMinutes: 820,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'V',\n transportType: TransportType.Flight,\n segmentTattoo: '3',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '312',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-433-HEL-OUL-2023-02-24T07:30:00',\n group: 2,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '433',\n boardPoint: 'HEL',\n offPoint: 'OUL',\n departureDateTimeLocal: '2023-02-24T07:30:00',\n departureDateTime: '2023-02-24T07:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-24T08:45:00',\n arrivalDateTime: '2023-02-24T08:45:00.000+02:00',\n durationInMinutes: 75,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'V',\n transportType: TransportType.Flight,\n segmentTattoo: '4',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'SAM.WARREN@FINNAIR.COM',\n points: 32675696,\n vouchers: [\n {\n type: VoucherType.EuropeUpgrade,\n count: 9,\n },\n {\n type: VoucherType.LongHaulUpgrade,\n count: 4,\n },\n {\n type: VoucherType.UpgradeBenefit,\n count: 4,\n },\n ],\n },\n};\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const DE23FG: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSAINOPEKKANEN',\n firstName: 'AINO',\n lastName: 'PEKKANEN',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'AINO MS',\n ordinal: 1,\n },\n {\n passengerId: 'MRPEKKAPEKKANEN',\n firstName: 'PEKKA',\n lastName: 'PEKKANEN',\n title: 'MR',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'PEKKA MR',\n ordinal: 2,\n },\n {\n passengerId: 'MRREINOPEKKANEN',\n firstName: 'REINO',\n lastName: 'PEKKANEN',\n title: 'MR',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'REIJO MR',\n ordinal: 3,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-456-OUL-HEL-2023-02-09T19:30:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '456',\n boardPoint: 'OUL',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-09T19:30:00',\n departureDateTime: '2023-02-09T19:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-09T20:35:00',\n arrivalDateTime: '2023-02-09T20:35:00.000+02:00',\n durationInMinutes: 65,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-131-HEL-SIN-2023-02-09T23:40:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '131',\n boardPoint: 'HEL',\n offPoint: 'SIN',\n departureDateTimeLocal: '2023-02-09T23:40:00',\n departureDateTime: '2023-02-09T23:40:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-10T18:15:00',\n arrivalDateTime: '2023-02-10T18:15:00.000+08:00',\n durationInMinutes: 755,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '627',\n currency: 'EUR',\n },\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '251',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-132-SIN-HEL-2023-02-23T22:30:00',\n group: 2,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '132',\n boardPoint: 'SIN',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-23T22:30:00',\n departureDateTime: '2023-02-23T22:30:00.000+08:00',\n arrivalDateTimeLocal: '2023-02-24T06:10:00',\n arrivalDateTime: '2023-02-24T06:10:00.000+02:00',\n durationInMinutes: 820,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'V',\n transportType: TransportType.Flight,\n segmentTattoo: '3',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n UPGRADE_BENEFIT: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '312',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n },\n UPGRADE_BENEFIT: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-433-HEL-OUL-2023-02-24T07:30:00',\n group: 2,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '433',\n boardPoint: 'HEL',\n offPoint: 'OUL',\n departureDateTimeLocal: '2023-02-24T07:30:00',\n departureDateTime: '2023-02-24T07:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-24T08:45:00',\n arrivalDateTime: '2023-02-24T08:45:00.000+02:00',\n durationInMinutes: 75,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'V',\n transportType: TransportType.Flight,\n segmentTattoo: '4',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'SAM.WARREN@FINNAIR.COM',\n points: 32675696,\n vouchers: [\n {\n type: VoucherType.EuropeUpgrade,\n count: 9,\n },\n {\n type: VoucherType.LongHaulUpgrade,\n count: 2,\n },\n {\n type: VoucherType.UpgradeBenefit,\n count: 4,\n },\n ],\n },\n};\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const EF23GH: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSMARYBASIC',\n firstName: 'MARY',\n lastName: 'BASIC',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'MARY MS',\n ordinal: 1,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-1332-LHR-HEL-2023-03-15T10:20:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '1332',\n boardPoint: 'LHR',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-03-15T10:20:00',\n departureDateTime: '2023-03-15T10:20:00.000+00:00',\n arrivalDateTimeLocal: '2023-03-15T15:15:00',\n arrivalDateTime: '2023-03-15T15:15:00.000+02:00',\n durationInMinutes: 175,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'L',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 10000,\n priceWithLongHaul: 0,\n },\n UPGRADE_BENEFIT: {\n price: 1,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-61-HEL-HND-2023-03-15T17:55:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '61',\n boardPoint: 'HEL',\n offPoint: 'HND',\n departureDateTimeLocal: '2023-03-15T17:55:00',\n departureDateTime: '2023-03-15T17:55:00.000+02:00',\n arrivalDateTimeLocal: '2023-03-16T14:25:00',\n arrivalDateTime: '2023-03-16T14:25:00.000+09:00',\n durationInMinutes: 810,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'L',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 50000,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'F',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-62-HND-HEL-2023-03-29T23:10:00',\n group: 2,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '62',\n boardPoint: 'HND',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-03-29T23:10:00',\n departureDateTime: '2023-03-29T23:10:00.000+09:00',\n arrivalDateTimeLocal: '2023-03-30T06:00:00',\n arrivalDateTime: '2023-03-30T06:00:00.000+03:00',\n durationInMinutes: 770,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'L',\n transportType: TransportType.Flight,\n segmentTattoo: '3',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 50000,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 0,\n travelClass: 'F',\n paymentOptions: {},\n upgradeStatus: UpgradeStatus.NotAvailable,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-1331-HEL-LHR-2023-03-30T08:00:00',\n group: 2,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '1331',\n boardPoint: 'HEL',\n offPoint: 'LHR',\n departureDateTimeLocal: '2023-03-30T08:00:00',\n departureDateTime: '2023-03-30T08:00:00.000+03:00',\n arrivalDateTimeLocal: '2023-03-30T09:10:00',\n arrivalDateTime: '2023-03-30T09:10:00.000+01:00',\n durationInMinutes: 190,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'L',\n transportType: TransportType.Flight,\n segmentTattoo: '4',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: true,\n seatsAvailable: 0,\n travelClass: 'U',\n paymentOptions: {\n points: {\n price: 10000,\n priceWithLongHaul: 0,\n },\n UPGRADE_BENEFIT: {\n price: 1,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'ANCILLARYTEST@GMAIL.COM',\n points: 0,\n vouchers: [\n {\n type: VoucherType.EuropeUpgrade,\n count: 2,\n },\n {\n type: VoucherType.UpgradeBenefit,\n count: 2,\n },\n ],\n },\n};\n","import { Cabin, GetOffersV2Response, TransportType, UpgradeProduct, UpgradeStatus, VoucherType } from '../api/models';\n\nexport const FG23HI: GetOffersV2Response = {\n booking: {\n passengers: [\n {\n passengerId: 'MSAINOPEKKANEN',\n firstName: 'AINO',\n lastName: 'PEKKANEN',\n title: 'MS',\n type: 'ADT',\n child: null,\n firstNameWithTitle: 'AINO MS',\n ordinal: 1,\n },\n ],\n flights: [\n {\n segmentInfo: {\n flightId: 'AY-456-OUL-HEL-2023-02-09T19:30:00',\n group: 1,\n ordinal: 1,\n carrierCode: 'AY',\n flightNumber: '456',\n boardPoint: 'OUL',\n offPoint: 'HEL',\n departureDateTimeLocal: '2023-02-09T19:30:00',\n departureDateTime: '2023-02-09T19:30:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-09T20:35:00',\n arrivalDateTime: '2023-02-09T20:35:00.000+02:00',\n durationInMinutes: 65,\n longHaul: false,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '1',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '180',\n currency: 'EUR',\n },\n points: {\n price: 20000,\n priceWithLongHaul: 0,\n },\n EUROPE_UPGRADE: {\n price: 1,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n {\n segmentInfo: {\n flightId: 'AY-131-HEL-SIN-2023-02-09T23:40:00',\n group: 1,\n ordinal: 2,\n carrierCode: 'AY',\n flightNumber: '131',\n boardPoint: 'HEL',\n offPoint: 'SIN',\n departureDateTimeLocal: '2023-02-09T23:40:00',\n departureDateTime: '2023-02-09T23:40:00.000+02:00',\n arrivalDateTimeLocal: '2023-02-10T18:15:00',\n arrivalDateTime: '2023-02-10T18:15:00.000+08:00',\n durationInMinutes: 755,\n longHaul: true,\n cabin: Cabin.Economy,\n travelClass: 'O',\n transportType: TransportType.Flight,\n segmentTattoo: '2',\n },\n upgrades: [\n {\n upgradeProductName: UpgradeProduct.EconomyToBusiness,\n isWaitlist: false,\n seatsAvailable: 3,\n travelClass: 'U',\n paymentOptions: {\n money: {\n price: '627',\n currency: 'EUR',\n },\n points: {\n price: 50000,\n },\n LONG_HAUL_UPGRADE: {\n price: 1,\n },\n EUROPE_UPGRADE: {\n price: 4,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n {\n upgradeProductName: UpgradeProduct.EconomyToPremiumeconomy,\n isWaitlist: false,\n seatsAvailable: 2,\n travelClass: 'F',\n paymentOptions: {\n money: {\n price: '251',\n currency: 'EUR',\n },\n points: {\n price: 40000,\n },\n EUROPE_UPGRADE: {\n price: 2,\n },\n },\n upgradeStatus: UpgradeStatus.Available,\n },\n ],\n },\n ],\n },\n buyer: {\n email: 'SAM.WARREN@FINNAIR.COM',\n points: 32675696,\n vouchers: [\n {\n type: VoucherType.EuropeUpgrade,\n count: 9,\n },\n {\n type: VoucherType.LongHaulUpgrade,\n count: 4,\n },\n ],\n },\n};\n","import { Injectable } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, delay, map, tap, timeout } from 'rxjs/operators';\n\nimport { AppState, ConfigService } from '@fcom/core';\nimport { Profile, ProfileTier } from '@fcom/core-api/login';\nimport { TzDate } from '@fcom/core/utils';\n\nimport { AuthActions } from '../store/actions';\nimport { BookingRef } from '../interfaces/upgrades.interface';\nimport { InvalidUpgradeError, UpgradeError } from '../interfaces/upgrade-error.interface';\nimport { Buyer, UpgradeStatus, UpgradeStatusReason, VoucherType, Passengers } from '../api/models';\nimport { FINNAIR_LIKE_AIRLINECODES, OFFERS_V2_TIMEOUT, WAITLIST_CUTOFF } from '../constants';\nimport { getVoucherAmount, getMinPaxAmountToUpgrade, getFlightsAsBookingLocationCodes } from '../utils';\nimport { GetOffersV2Response } from '../api/models/get-offers-v-2-response';\nimport { FlightsV2 } from '../api/models/flights-v-2';\nimport { OffersService as ApiOffersService } from '../api/services';\nimport { fixtures } from '../fixtures/index';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OffersService {\n constructor(\n private store$: Store,\n private apiOffersService: ApiOffersService,\n private configService: ConfigService\n ) {}\n\n getOffers(\n booking: BookingRef,\n profile: Profile,\n shouldUseMemberEndpoint: boolean\n ): Observable> {\n let getUpgradeRequest$: Observable;\n\n if (this.configService.cfg.enableUpgradeBenefitInUpgrade && profile && fixtures[booking.recLoc]) {\n getUpgradeRequest$ = of(fixtures[booking.recLoc]).pipe(delay(1000));\n } else {\n getUpgradeRequest$ = shouldUseMemberEndpoint\n ? this.apiOffersService.getOffersV2Authenticated(booking)\n : this.apiOffersService.getOffersV2(booking);\n }\n\n return getUpgradeRequest$.pipe(\n timeout(OFFERS_V2_TIMEOUT),\n // eslint-disable-next-line rxjs/no-implicit-any-catch\n catchError((e) => {\n const errorDetail = e?.error?.details ? e.error.details : '';\n if (\n errorDetail === InvalidUpgradeError.infant ||\n errorDetail === InvalidUpgradeError.paxCount ||\n errorDetail === InvalidUpgradeError.group ||\n errorDetail === InvalidUpgradeError.invalidSSR\n ) {\n return throwError(() => UpgradeError.notPossible);\n }\n\n if (errorDetail === InvalidUpgradeError.invalidBookingRef) {\n return throwError(() => UpgradeError.httpError);\n }\n\n return throwError(() => UpgradeError.notAvailable);\n }),\n map((response) => {\n if (\n !response.booking ||\n !response.booking.flights ||\n !response.booking.flights.length ||\n !response.booking.passengers ||\n !response.booking.passengers.length\n ) {\n throw new Error(UpgradeError.httpError);\n }\n return response;\n }),\n tap((response) => this.setSummary(response.booking.flights)),\n map((response) => {\n const flights = response.booking.flights;\n const passengers = response.booking.passengers;\n\n // Check if any flights in progress and throw error\n this.checkFlightStatusAndThrow(flights, UpgradeStatus.InProgress);\n\n // Check if any flights marked Available\n if (this.checkFlightsForStatus(flights, UpgradeStatus.Available)) {\n // Check if sufficient Payment and throw error if insufficient Payment\n this.checkPaymentAndThrow(flights, passengers, response.buyer, profile);\n return response as Required;\n }\n\n // Check upgrade status reason and throw error\n [\n UpgradeStatusReason.TooCloseToDeparture,\n UpgradeStatusReason.SsrInBooking,\n UpgradeStatusReason.InfantInBooking,\n UpgradeStatusReason.GroupBooking,\n UpgradeStatusReason.TooManyPassengers,\n UpgradeStatusReason.TooFarToDeparture,\n UpgradeStatusReason.TooCloseToDepartureForWaitlist,\n UpgradeStatusReason.SegmentInRequestedUpgradeCabin,\n UpgradeStatusReason.SegmentMissingRequestedUpgradeCabin,\n UpgradeStatusReason.TicketNotIssuedByFinnair,\n UpgradeStatusReason.IneligibleBookingClass,\n UpgradeStatusReason.BookingInIneligibleStatus,\n UpgradeStatusReason.FlownSegment,\n ].forEach((reason) => {\n this.checkFlightStatusReasonAndThrow(flights, reason);\n });\n\n // Check if flights already on waitlist\n this.checkFlightStatusAndThrow(flights, UpgradeStatus.Waitlisted);\n\n // Check Some Flights already upgraded\n this.checkFlightStatusAndThrow(flights, UpgradeStatus.Success);\n\n // Check not Finnair flight\n this.checkNotFinnair(flights);\n\n const finnairFlights = flights.filter((flight) => {\n const code = flight.segmentInfo.codeShareCarrierCode || flight.segmentInfo.carrierCode;\n return FINNAIR_LIKE_AIRLINECODES.includes(code.toUpperCase());\n });\n\n // Check if Waitlist Period\n if (this.isWaitlistPeriod(finnairFlights)) {\n if (!profile) {\n throw new Error(UpgradeError.notLoggedIn);\n }\n\n if (profile.tier === ProfileTier.ACCOUNT) {\n throw new Error(UpgradeError.notAvailableAccount);\n }\n\n throw new Error(UpgradeError.notAvailable);\n }\n\n // throw not Available to handle all other cases\n throw new Error(UpgradeError.notAvailable);\n }),\n // eslint-disable-next-line rxjs/no-implicit-any-catch\n catchError((error: Error | UpgradeError) => {\n // standardise thrown errors. If thrown by new Error then\n if (error instanceof Error) {\n return throwError(() => error.message);\n }\n return throwError(() => error);\n })\n );\n }\n\n private isWaitlistPeriod(flights: FlightsV2): boolean {\n const lastFlight = flights.reduce((acc, cur) => {\n const date =\n !!cur.segmentInfo && !!cur.segmentInfo.departureDateTime\n ? new TzDate(cur.segmentInfo.departureDateTime).millis\n : 0;\n return !acc || date < acc ? date : acc;\n }, 0);\n return lastFlight - Date.now() >= WAITLIST_CUTOFF;\n }\n\n private checkFlightStatusReasonAndThrow(flights: FlightsV2, statusReason: UpgradeStatusReason) {\n const anyFlightHasStatusReason = flights.some((flight) => {\n return flight.upgrades.some((upgrade) => {\n return upgrade.upgradeStatusReason === statusReason;\n });\n });\n\n if (!anyFlightHasStatusReason) {\n return;\n }\n\n if (anyFlightHasStatusReason) {\n const errorMap = {\n [UpgradeStatusReason.TooCloseToDeparture]: UpgradeError.upgradeClosed,\n [UpgradeStatusReason.InfantInBooking]: UpgradeError.notPossible,\n [UpgradeStatusReason.GroupBooking]: UpgradeError.notPossible,\n [UpgradeStatusReason.SsrInBooking]: UpgradeError.notPossible,\n [UpgradeStatusReason.TooManyPassengers]: UpgradeError.notPossible,\n [UpgradeStatusReason.TooFarToDeparture]: UpgradeError.notPossible,\n [UpgradeStatusReason.TooCloseToDepartureForWaitlist]: UpgradeError.notPossible,\n [UpgradeStatusReason.SegmentInRequestedUpgradeCabin]: UpgradeError.notPossible,\n [UpgradeStatusReason.SegmentMissingRequestedUpgradeCabin]: UpgradeError.notPossible,\n [UpgradeStatusReason.TicketNotIssuedByFinnair]: UpgradeError.notPossible,\n [UpgradeStatusReason.IneligibleBookingClass]: UpgradeError.notPossible,\n [UpgradeStatusReason.BookingInIneligibleStatus]: UpgradeError.notPossible,\n [UpgradeStatusReason.FlownSegment]: UpgradeError.notPossible,\n };\n\n throw new Error(errorMap[statusReason] || UpgradeError.notPossible);\n }\n }\n\n private checkFlightStatusAndThrow(flights: FlightsV2, status: UpgradeStatus) {\n const hasFlightsWithStatus = this.checkFlightsForStatus(flights, status);\n\n if (!hasFlightsWithStatus) {\n return;\n }\n\n switch (status) {\n case UpgradeStatus.InProgress:\n throw new Error(UpgradeError.inProgress);\n case UpgradeStatus.Waitlisted:\n throw new Error(UpgradeError.noRemainingUpgrades);\n case UpgradeStatus.Success:\n throw new Error(UpgradeError.noRemainingUpgrades);\n default:\n throw new Error(UpgradeError.notAvailable);\n }\n }\n\n private checkFlightsForStatus(flights: FlightsV2, status: UpgradeStatus): boolean {\n return flights.some((flight) => {\n return flight.upgrades.find((upgrade) => {\n return upgrade.upgradeStatus === status;\n });\n });\n }\n\n private checkNotFinnair(flights: FlightsV2) {\n const notFinnairFlights = flights.every((flight) => {\n return flight.upgrades.every((upgrade) => {\n return upgrade.upgradeStatusReason === UpgradeStatusReason.NotFinnairFlight;\n });\n });\n\n if (notFinnairFlights) {\n throw new Error(UpgradeError.notFinnair);\n }\n }\n\n private setSummary(flights: FlightsV2): void {\n this.store$.dispatch(AuthActions.flightSummary({ summary: getFlightsAsBookingLocationCodes(flights) }));\n }\n\n private getMinimumPoints(flights: FlightsV2) {\n const pointsForAllUpgrades = flights\n .flatMap((flight) => {\n return flight.upgrades.map((upgrade) => {\n return upgrade?.paymentOptions?.points?.price;\n });\n })\n .filter(Boolean);\n\n return Math.min(...pointsForAllUpgrades) || 0;\n }\n\n private checkPaymentAndThrow(\n flights: FlightsV2 = [],\n passengers: Passengers,\n buyer: Buyer = {},\n profile: Profile\n ): void {\n // There should only be money options for loggedOut users so not payment checks required\n if (!profile) {\n return;\n }\n\n const upgradesAvailable = flights.some((flight) =>\n flight.upgrades.some((upgrade) => {\n return upgrade.upgradeStatus === UpgradeStatus.Available;\n })\n );\n\n if (!upgradesAvailable) {\n return;\n }\n\n const minPaxAmountToUpgrade = getMinPaxAmountToUpgrade(passengers);\n const minPoints = this.getMinimumPoints(flights) * minPaxAmountToUpgrade;\n\n const hasEnoughPoints = buyer.points >= minPoints;\n const hasEnoughVouchers =\n getVoucherAmount(VoucherType.UpgradeBenefit, buyer) >= minPaxAmountToUpgrade ||\n getVoucherAmount(VoucherType.EuropeUpgrade, buyer) >= minPaxAmountToUpgrade ||\n getVoucherAmount(VoucherType.LongHaulUpgrade, buyer) >= minPaxAmountToUpgrade;\n\n if (!hasEnoughPoints && !hasEnoughVouchers) {\n const hasMoneyOption = flights.some((flight) =>\n flight.upgrades.some((upgrade) => upgrade?.paymentOptions?.money)\n );\n if (!hasMoneyOption) {\n throw new Error(UpgradeError.insufficientPayment);\n }\n }\n }\n}\n","import { Location } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { Actions, ofType, createEffect } from '@ngrx/effects';\nimport { combineLatest, EMPTY, of } from 'rxjs';\nimport { catchError, map, exhaustMap, take, switchMap } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\n\nimport { profileOrUndefinedIfNotLoggedIn } from '@fcom/core/selectors';\nimport { isAuthenticatedPlusMember } from '@fcom/one-upgrade/utils/profile.utils';\n\nimport { Stage, UpgradeError } from '../../interfaces';\nimport { OffersService } from '../../services/offers.service';\nimport { AuthActions, StatusActions } from '../actions';\nimport { getBasketPassengerIds, getBookingRef } from '../selectors';\n\n@Injectable()\nexport class AuthEffects {\n constructor(\n private offersService: OffersService,\n private store$: Store,\n private readonly actions$: Actions,\n private location: Location,\n private router: Router\n ) {}\n\n loadPnr$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(AuthActions.loadPNR.type),\n exhaustMap(() => {\n return combineLatest([\n this.store$.pipe(profileOrUndefinedIfNotLoggedIn()),\n this.store$.pipe(select(getBookingRef)),\n this.store$.pipe(select(getBasketPassengerIds)),\n ]).pipe(\n take(1),\n switchMap(([profile, booking, passengers]) => {\n if (!booking?.lastName || !booking?.recLoc) {\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOGIN }));\n return of(null);\n }\n\n this.store$.dispatch(StatusActions.setStage({ stage: Stage.LOADING }));\n const shouldUseMemberEndpoint = isAuthenticatedPlusMember(profile);\n\n return this.offersService.getOffers(booking, profile, shouldUseMemberEndpoint).pipe(\n map((response) => {\n this.store$.dispatch(AuthActions.setUpgradeData(response));\n\n // When pressing the browser back, do not go to loading, go to login.\n this.location.replaceState(this.router.url.replace('/loading', ''));\n\n // When the user logs in mid flow then there may be passengers already in the basket\n this.store$.dispatch(\n StatusActions.setStage({ stage: passengers.length ? Stage.FLIGHTS : Stage.PASSENGERS })\n );\n }),\n catchError((e: unknown) => {\n const error = UpgradeError[e as UpgradeError] || UpgradeError.httpError;\n\n this.store$.dispatch(StatusActions.setError({ error }));\n this.store$.dispatch(\n StatusActions.setStage({ stage: error === UpgradeError.httpError ? Stage.LOGIN : Stage.ERROR })\n );\n\n return of(EMPTY);\n })\n );\n })\n );\n })\n );\n },\n {\n dispatch: false,\n }\n );\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { IconLibrary, SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { StoreModule } from '@ngrx/store';\nimport { EffectsModule } from '@ngrx/effects';\n\nimport { UiComponentsModule, IconsPreloadService } from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { ComponentsModule } from '@fcom/common/components/components.module';\nimport { DirectiveModule } from '@fcom/common/directives';\nimport { GtmModule } from '@fcom/common/gtm/gtm.module';\nimport { PipesModule } from '@fcom/common/pipes/pipes.module';\nimport { LoginModule } from '@fcom/common/login/login.module';\nimport { NavigationModule } from '@fcom/common/components/header/navigation.module';\nimport { BookingCommonModule } from '@fcom/booking/modules/common/booking-common.module';\nimport { LocationsModule } from '@fcom/locations';\nimport { ImagesModule } from '@fcom/common/components/images';\nimport { QualtricsModule } from '@fcom/common/qualtrics/qualtrics.module';\nimport { CmsModule } from '@fcom/cms';\nimport { CmsPageService, FragmentService } from '@fcom/common';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/common-booking.module';\n\nimport { PnrWidgetModule } from '../pnr-widget/pnr-widget.module';\nimport { OneUpgradeRouteModule } from './one-upgrade.routes';\nimport { ApiModule } from './api/api.module';\nimport { reducers } from './store';\nimport { StatusEffects } from './store/effects/status.effects';\nimport { UpgradeFlightsEffects } from './store/effects/upgrade-flights.effects';\nimport { AuthEffects } from './store/effects/auth.effects';\nimport { OneUpgradeLayoutComponent } from './views/layout/layout.component';\nimport { LoginComponent } from './views/login/login.component';\nimport { ReviewComponent } from './views/review/review.component';\nimport { ErrorComponent } from './views/error/error.component';\nimport { SuccessComponent } from './views/success/success.component';\nimport { ProcessingComponent } from './views/processing/processing.component';\nimport { BoundCardComponent } from './components/bound-card/bound-card.component';\nimport { JourneyInfoComponent } from './components/journey-info/journey-info.component';\nimport { ReviewBoundsComponent } from './components/review-bounds/review-bounds.component';\nimport { UpgradeBoundsComponent } from './components/upgrade-bounds/upgrade-bounds.component';\nimport { UpgradeFlightsComponent } from './components/upgrade-flights/upgrade-flights.component';\nimport { PassengerSelectionComponent } from './components/passenger-selection/passenger-selection.component';\nimport {\n LoginGuard,\n PNRGuard,\n SinglePaxGuard,\n OneUpgradeGuard,\n ProcessingGuard,\n RefetchGuard,\n BasketGuard,\n SuccessGuard,\n} from './guards/index';\nimport { StatusBarComponent } from './components/status-bar/status-bar.component';\nimport { ContinueFooterComponent } from './components/continue-footer/continue-footer.component';\nimport { UpgradeModalComponent } from './components/modal/modal.component';\nimport { UPGRADE_FEATURE_KEY } from './constants';\nimport { LoadingComponent } from './views/loading/loading.component';\nimport { PassengersSelectionComponent } from './views/passengers-selection/passengers-selection.component';\nimport { FlightsSelectionComponent } from './views/flights-selection/flights-selection.component';\n\n@NgModule({\n imports: [\n OneUpgradeRouteModule,\n CommonModule,\n FormsModule.withConfig({\n callSetDisabledState: 'whenDisabledForLegacyCode',\n }),\n ReactiveFormsModule.withConfig({\n callSetDisabledState: 'whenDisabledForLegacyCode',\n }),\n UiComponentsModule,\n ComponentsModule,\n DirectiveModule,\n GtmModule,\n PipesModule,\n StoreModule.forFeature(UPGRADE_FEATURE_KEY, reducers),\n EffectsModule.forFeature([AuthEffects, StatusEffects, UpgradeFlightsEffects]),\n UiTranslateModule,\n ApiModule,\n LoginModule,\n NavigationModule,\n BookingCommonModule,\n LocationsModule,\n ImagesModule,\n CmsModule,\n QualtricsModule,\n CommonBookingComponentsModule,\n PnrWidgetModule,\n ],\n providers: [\n LoginGuard,\n PNRGuard,\n SinglePaxGuard,\n OneUpgradeGuard,\n ProcessingGuard,\n RefetchGuard,\n BasketGuard,\n SuccessGuard,\n CmsPageService,\n FragmentService,\n ],\n declarations: [\n LoginComponent,\n LoadingComponent,\n PassengersSelectionComponent,\n FlightsSelectionComponent,\n ReviewComponent,\n ErrorComponent,\n SuccessComponent,\n ProcessingComponent,\n BoundCardComponent,\n JourneyInfoComponent,\n ReviewBoundsComponent,\n UpgradeBoundsComponent,\n UpgradeFlightsComponent,\n PassengerSelectionComponent,\n OneUpgradeLayoutComponent,\n StatusBarComponent,\n ContinueFooterComponent,\n UpgradeModalComponent,\n ],\n})\nexport class OneUpgradeModule {\n constructor(iconsPreloadService: IconsPreloadService) {\n iconsPreloadService.preloadIcons([\n { category: IconLibrary.SVG_LIBRARY, name: SvgLibraryIcon.CHECKBOX_SELECTED },\n { category: IconLibrary.SVG_LIBRARY, name: SvgLibraryIcon.CHECKBOX_UNSELECTED },\n { category: IconLibrary.SVG_LIBRARY, name: SvgLibraryIcon.CHECKMARK },\n ]);\n }\n}\n","/* tslint:disable */\n/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiConfiguration } from './api-configuration';\n\n/**\n * Base class for services\n */\n@Injectable()\nexport class BaseService {\n constructor(\n protected config: ApiConfiguration,\n protected http: HttpClient\n ) {\n }\n\n private _rootUrl: string = '';\n\n /**\n * Returns the root url for all operations in this service. If not set directly in this\n * service, will fallback to `ApiConfiguration.rootUrl`.\n */\n get rootUrl(): string {\n return this._rootUrl || this.config.rootUrl;\n }\n\n /**\n * Sets the root URL for API operations in this service.\n */\n set rootUrl(rootUrl: string) {\n this._rootUrl = rootUrl;\n }\n}\n","/* eslint-disable */\nimport { Injectable } from '@angular/core';\nimport { ConfigService } from '@fcom/core';\n\n/**\n * Global configuration\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiConfiguration {\n rootUrl: string = this.configService.cfg.oneUpgradeRootUrl;\n apiKey: string = this.configService.cfg.upgradeApiGwKey\n sigv4: string = '';\n bearerAuth: string = '';\n\n constructor(private configService: ConfigService){}\n}\n\n/**\n * Parameters for `ApiModule.forRoot()`\n */\nexport interface ApiConfigurationParams {\n rootUrl?: string;\n apiKey?: string;\n sigv4?: string;\n bearerAuth?: string;\n}\n"],"x_google_ignoreList":[]}