{"version":3,"file":"default-src_modules_booking_booking_module_ts.e0de1214efe36546.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","AncillariesGuard","store$","bookingService","platform","canActivate","isPlatformServer","currentCartData","snapshot","cartData","currentCartStatus","cartStatus","canAccess","isCartInErrorStateOrDoWeHaveTravelers","setStep","step","BOOKING_STEPS","PAXDETAILS","isAncillariesSkipped","PURCHASE_REVIEW","PLATFORM_ID","BookingNotificationModule","_angular_core__WEBPACK_IMPORTED_MODULE_4__","$C","G2t","CommonModule","PipesModule","UiTranslateModule","UiComponentsModule","ComponentsModule","_rootUrl","_angular_core__WEBPACK_IMPORTED_MODULE_1__","AncillariesModule","_angular_core__WEBPACK_IMPORTED_MODULE_15__","AncillaryService","imports","BookingCommonModule","CommonBookingComponentsModule","CommonBookingAncillariesModule","DirectiveModule","GtmModule","TabsModule","CmsModule","FinFormsModule","AncillarySubviewModule","ButtonModule","IconsModule","ModalModule","DrawerModule","ProductsModule","NotificationsModule","DataCloudModule","core","initialState","ENTRY","bookingReducer","state","action","BookingActions","setIn","all","union","setPaymentStatus","PaymentActions","seal","CartStatus","INITIAL","dirty","fareRules","CART_STATUS","CART_URL","CART_DATA","ACCEPT_TERMS","setCartPartStates","newStatus","partIds","DataUtils","wrap","updateIn","updatingState","reduce","acc","cur","generateCartPartId","cartPartId","id","cartReducer","GlobalBookingActions","OffersActions","CartActions","PENDING_CREATION","deleteIn","CREATION_SUCCESS","cartUrl","CREATION_ERROR","PENDING","LOAD_ERROR","OK","CartPartStatus","UPDATING","isArray","cartPartIds","ERROR","SeatMapActions","ServicesActions","travelerId","hasError","ticketRules","isLoading","category","c","rules","clearSelections","setCartData","setFlights","updateFlights","setPaxAmount","increasePaxAmountField","decreasePaxAmountField","setTravelType","selectTravelClass","confirmation","GlobalActions","startLoading","setInboundId","setInboundFareFamily","setOutboundId","setOutboundFareFamily","setSeatMap","setSeatForFlight","setSelectionsForFragment","setSelectionForFragmentForTraveler","setCoverForId","status","AirOffersStatus","currentOffers","undefined","selectedOutboundId","selectedOutboundFareFamilyCode","selectedInboundId","selectedInboundFareFamilyCode","sortBy","SortBy","DURATION","filters","stopsCount","defaultFilterValues","defaultStopsOption","cabin","defaultTravelClass","arrivalTime","defaultTimeOptions","departureTime","multiCity","offers","airlines","bounds","fareFamilies","hasFlightsInUnitedStates","locations","selectedFareFamily","messages","surcharges","selectedItinerary","hashMap","offersReducer","INVALID_INPUT","NO_FLIGHTS_FOUND","outboundId","outboundFareFamily","inboundId","inboundFareFamily","keepCabin","leaveError","lastRequestParams","outbounds","inbounds","selectedOutboundAirBoundId","selectedInboundAirBoundId","refundable","defaultRefundabilityOption","outboundCache","boundsReducer","BoundsActions","outboundAirBoundId","isSelectedCheapestOffer","boundGroups","some","boundGroup","find","fareFamily","isCheapestOffer","inboundAirBoundId","defaultCabin","hash","createdAt","results","statusCode","MultiCityStatus","requestedMoreFlightOfferIds","fareFamiliesPerCabin","multiCityReducer","MultiCityActions","itinerary","READY","offerId","passengers","additionalEmails","reducer","createReducer","on","PaxDetailsActions","passenger","corporateCode","paxDetailsReducer","verifyCartInitialStateMetaReducer","router","languageService","sentryLogger","first","UPDATE","corruptedParts","safeMap","isUpdating","parts","partId","isNotEmpty","error","cartId","navigateToError","langValue","CART_FEATURE_CONFIG_TOKEN","InjectionToken","getCartConfig","metaReducers","BookingStoreModule","provide","deps","Router","LanguageService","SentryLogger","useFactory","StoreModule","forFeature","PurchaseCheckoutGuard","paymentCheck","termsAndCondition","acceptTerms","cartIdHash","cartIdAndHash","pay","paymentStatus","orderIdHash","orderFetchInformation","isPresent","PaymentStatus","PENDING_VERIFICATION","_route","_state","PurchaseCheckoutModule","OrderApiModule","PurchaseCheckoutRouteComponent","nativeBridgeService","paymentFlow","PaymentFlow","BOOKING","orderOrCart$","orderData","finShare","switchMap","order","of","isCorporateFlow$","profileOrNot","profile","isCorporate","serviceName$","combineLatest","isCorporateFlow","orderOrCart","isAwardFlow","prices","unpaid","total","totalPoints","isInsideNativeWebView","VBU","selectors","decls","vars","consts","template","rf","ctx","$event","_r1","ctx_r1","showModal","modalOpen","_c0","isFullWidth","theme","NotificationLayout","EDGE_TO_EDGE","BLOCK","notification_r3","article","teaserTitle","notification$","COVID_COVER_ORIGIN_COUNTRY_CODES","COVID_COVER_VALID_BEFORE_PURCHASE_DATE","LocalDate","forDate","COVID_COVER_VALID_BEFORE_DEPARTURE_DATE","BookingNotificationComponent","timeService","fragmentService","NotificationTheme","INFO","ngOnInit","isPlatformBrowser","isCovidCoverOrigin$","flights","includes","origin","countryCode","isDomesticFinlandTrip$","every","flight","destination","isDepartureBeforeCovidCoverExpiration$","departureDate","lte","isPurchasedBeforeCovidCoverStartDate$","currentLocalDate","currentDate","shouldDisplayCovidCover$","isCovidCoverOrigin","isDomesticFinlandTrip","isDepartureBeforeCovidCoverExpiration","isPurchasedBeforeCovidCoverStartDate","displayCovidCover","distinctUntilChanged","fragmentKey","getFragment","NEVER","event","stopPropagation","i3","inputs","BookingNotificationComponent_ng_container_0_Template","ctx_r0","LoaderType","INLINE","SUCCESS","_r3","bound_r4","$implicit","currentCategory_r5","ngIf","ancillarySubview_r6","setSubTotalPrice","selectedCategory$","servicesReady$","travelers$","currentCombinedServices$","currentServices$","serviceQuantityMap$","paxLevelQuota$","boundOrFlightAncillaryAvailability$","_r7","Category","PET","setConfirmModalData","PETC_CONFIRM_MODAL_TRANSLATION_KEYS","servicesMap$","passengersWithPetcIncompatibleSeats$","confirmModalData$","SmpComponent_div_2_ng_container_1_ng_container_19_ng_container_1_div_1_fin_common_product_selection_1_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_container_1_div_1_fin_common_product_selection_2_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_container_1_div_1_Template","bounds$","_r8","changeSeats","flight_r9","SEAT","cart$","seatSelections$","activeFlight","ancillaryLoader$","_r10","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_ng_container_2_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_fin_common_product_selection_3_Template","WIFI","LOUNGE","MEAL","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_Template","flights$","SmpComponent_div_2_ng_container_1_ng_container_19_ng_container_1_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_Template","BOUND_BASED_CATEGORIES","flights_r11","_r12","showSubview","closeSidebar","sideBarOpen","boundsOrFlights$","locations$","_c1","points_r13","SvgLibraryIcon","TRANSFER_LOADER","SmpComponent_div_2_ng_container_1_p_3_Template","SmpComponent_div_2_ng_container_1_fin_booking_notification_5_Template","_r2","index","viewDetails","closeConfirmModal","changeStep","emit","loadNextSeatMap","updateCartServices","SmpComponent_div_2_ng_container_1_ng_container_19_Template","SmpComponent_div_2_ng_container_1_fin_ancillary_sidebar_21_Template","continueToNextPhase","SmpComponent_div_2_ng_container_1_span_30_Template","SmpComponent_div_2_ng_container_1_fcom_icon_37_Template","profileType$","ProfileType","FPLUS","products$","purchaseFlow$","enableBookingNewProductCardLayout$","ancillarySubviewOpen$","tmp_15_0","buttonText","title","totalPrice$","currentStep$","unpaidServices$","TRACKING_CONTEXT","COVER","showCtaButton$","ButtonPosition","GRID","hasTravelerInCart$","totalPoints$","priceUpdating$","_r14","closeSeatPreselection","tripType$","seatSelectionLoading$","SmpComponent_div_2_ng_container_1_Template","SmpComponent_div_2_ng_container_3_Template","showSeatPreSelection$","SmpComponent","configService","bookingQueueService","gtmService","scrollService","multivariateTestService","buttonTexts","GaContext","BOOKING_FLOW","BehaviorSubject","AncillaryLoaderStatus","OFF","message","EventEmitter","subscriptions","Subscription","open","enableShowCheaperOnlineTag","_showCtaButtonSubject$","_seatPreselectionDismissed$","getTestVariant","MultivariateTestId","NEW_PRODUCT_CARDS","variant","TestVariant","B","enableSpecialUpsellCategory$","cfg","enableSpecialUpsellCategory","REGRESSION_TEST_WORKAROUND","currentCategory","services","tier","ProfileTier","CORPORATE","GtmPurchaseFlow","serviceCategories$","serviceCategories","cartFlights$","cartFlights","currentServices","combinedServices$","combinedCartServicesMap","getTripTypeFromBounds","profileType","previousStep","dismissed","cart","hasCorporateSeatBenefit","seatSelections","add","Boolean","subscribe","next","serviceCatalog","catalog","paxLevelQuota","variants","variantsQuantity","selectedServices","getQuantitiesForFragmentsAndPassenger","cd","fallbackCurrencyCode$","totalAmount","currencyCode","getStatusStream","cartPartStatusForCategory","getCountForCategoryStream","numberOfItems","ButtonState","PLUS","specialUpsellCategory$","getUpsellCategory","startWith","campaignsCategories$","serviceCatalogCampaigns","campaigns","flatMap","categories","unique","specialUpsellCategory","filterCategories","withLatestFrom","campaignsCategories","combinedServices","serviceCatalogCategory","noQuotaLeft","categoryHasQuotaLeft","count$","lowestPrice","getLowestPriceForCategory","translations","description","image","media","status$","price$","getPriceForCategoryStream","notAvailable$","notificationMessage$","count","translationKey","translate","notificationTitle$","notificationIcon","B2B","money","originalPrice","productTag","getProductTag","showCheaperOnlineTag","enableTierBenefitTag","enableTravelExtrasTierBenefitTag","hideViewButton","isSpecialUpsellProduct","products","product","sort","a","b","Number","show","delay","cartTotalPrice$","toAmount","amount","isJourneyBasedCategory","isBoundBasedCategory","availability$","availability","boundsOrFlights","boundOrFlight","allowedToSell","isAllowedToSell","eligibility","isAllowedToUse","ancillarySaleBlockingSupportedReasonKeys","reason","compareAsJson","ngOnDestroy","unsubscribe","slideIndexToOpen","ancillarySubview","isCartDirty","dispatch","cartDataSnapshot","purchaseFlow","requests","getServiceData","queueServicesUpdate","sendEcommerceAddRemoveEvents","updateServices","scrollTop","flightOrBound","isBound","take","eligibilities","controlData","sellAncillariesPerFlight","flightNumber","setNoAvailability","flightId","queueTriggerFetchSeatMap","confirmData","flightOrBoundId","confirmationModalTranslationKeys","cartBeforeUpdate","cartAfterUpdate","addedServices","removedServices","addedProducts","removedProducts","changedServices","length","ecommerceEvent","GtmEvent","ADD_SERVICES","GtmEcommerceMeasurement","ADD","ecommerceEventGA4","ADD_TO_CART","REMOVE_SERVICES","REMOVE","REMOVE_FROM_CART","seatNumber","f","seatMap$","_","cs","seatMap","selectedSeat","seats","seat","seatCategory","seatServices","entries","flightEligibilities","serviceFlightId","FinnairServiceCatalogEligibilityReason","PURCHASE_SEAT_SELECTION_NOT_ELIGIBLE_WHEN_DISCOUNTS_EXIST_FOR_CORPORATE","PURCHASE_NOT_ELIGIBLE_FOR_OTHER_AIRLINE","CABIN_BAGGAGE","BAGGAGE","bound","passengersMissingCategoryService","i4","i5","i6","i7","viewQuery","SmpComponent_div_0_Template","SmpComponent_div_2_Template","cartDataReady$","AncillariesComponent","ready","C","AppConstants","dataReady$","cartData$","data","userProfileType","lastName","paxDetails$","paxDetails","serviceCategoriesMap","allFlights$","allFlights","concat","isFlight","seatMapStatus$","seatMapForFlightStatus","s","enableBookingFlowSeatMapPreFetch","seatMapStatus","SeatMapStatus","seatMapForFlight","seatSubViewTopNotificationTranslation$","serviceCatalogCampaignIdsForFragment","paxCartData$","passengers$","cartPassengers","passengerDetails","pax","firstName","travelers","t","cartStatus$","statusNotOk","travelersOk","booking","getBoundsAndTravelersWhichHavePetcIncompatibleSeats","serviceAvailability$","outputs","BookingAncillariesRouteComponent","toasterService","serviceAvailability","servicesReady","confirmAncillaries","nextStep","onMessage","msg","addMessageToQueue","BookingGtmService","dataCloudService","sendFlightSelectionDataCloud$","Subject","subscription","initSendFlowData","initSendCompletePurchase","initSendCheckoutFlights","initSendFlightSelection","entrySet","entry","isAward","isAwardBooking","flowData","resolvePurchaseFlow","VERIFIED","globalBookingFlights","globalBookingDiscountCode","orderDataValue","discountCode","tripType","totalPrice","included","completePurchase","serviceFlow","ServiceFlow","AWARD","bufferCount","bufferSize","startBufferEvery","operate","source","subscriber","buffers","createOperatorSubscriber","toEmit","buffer","arrRemove","complete","oldCart","newCart","outboundChanged","equals","inboundChanged","cartDataValue","checkoutFlights","flightSelectionData$","globalBookingPaxAmount","paxAmount","merge","outboundSelectionGtmData","inboundSelectionGtmData","outboundOffersSelectionGtmData","inboundOffersSelectionGtmData","enhancedData","flightSelection","FLIGHT_SELECTION_CLICK","flightSelectionSelect","sendFlightSelectionDataCloud","currentStep_r5","_r4","activateSelectionPhase","languageCode","LANGUAGE_SELECTOR_CONTEXT","currentStep_r7","_r6","toggleMenu","navigateToStep","loginDialog_r3","toggleLogin","navigateBack","onHomeClick","BookingRoutingComponent_fcom_booking_header_1_fin_language_selector_11_Template","BookingRoutingComponent_fcom_booking_header_1_fin_language_selector_13_Template","loginStatus$","breadcrumbs$","phasesAria$","homeLink$","showHeaderLogin$","showHeaderBack$","profileName$","isMobile$","isTablet$","bookingSummary_r9","enableModifySearch$","openBasket","edit","BookingRoutingComponent_fin_sub_header_7_fin_global_booking_widget_summary_header_3_Template","tmp_2_0","FLIGHT_SELECTION","hasBasket$","bookingSummary$","closeBasket","basketOpen$","SHOW_BUTTON_STATES","LoginStatus","LOGGED_IN","NOT_LOGGED_IN","BookingRoutingComponent","navigationMenuService","renderer","pageMetaService","mediaQueryService","joinService","_bookingGtmService","TARGET_HEIGHT_ELEMENT","LanguageSelectorContext","LoginWidgetContext","isFirstStep$","isFirstStep","isBreakpoint$","orderSummary$","dates","TzDate","departure","dateTime","toLocalDate","returnDate","arrival","originLocationCode","locationCode","destinationLocationCode","boundsStatus","offersStatus","select","selectMultiCityStatus","globalBookingSelections","globalBooking","orderSummary","bookingLocations","bookingPaxAmount","adults","children","c15s","infants","getTripTypeFromBookingLocationCodes","lang","isNavigationMenuOpen$","onNavigationSetBookingServiceStepFromUrl","showBasket$","isMobile","phase","ANCILLARIES","isBookingFrontPage$","loginStatus","profileName","scrollToTopOnStepChange","bindBasketHandling","initButtonVisibilities","showLinks$","o","currentStage","breadcrumbs","showLinks","formatBreadcrumbs","sellAncillariesOutbound","sellAncillariesInbound","currentStep","PURCHASE_SUCCESS","indexOf","prevStep","curStep","setTitle","backButtonPressed","setActive","bookingStep","BOOKING_STEPS_ARRAY","item","locale","_event","trackElement","ElementTypes","BUTTON","ElementActions","CLICK","toggleMenuOpen","activateLinks","hideAncillaries","CHECKOUT","active","disabled","navigateByUrl","events","isNavigationEvent","setStepFromUrl","routerState","navigationEnd$","e","NavigationEnd","isErrorRoute$","ERROR_STEPS","getBookingStepFromUrl","skipRouteChange","hideModal$","Observable","observer","listen","target","innerWidth","debounceTime","width","mapTo","basketOpen","modalOpenSubject$","isNavigationMenuOpen","bookingSummary","TripType","MULTICITY","hasBasket","i8","i9","i10","BookingRoutingComponent_fcom_booking_header_1_Template","BookingRoutingComponent_fin_join_form_5_Template","BookingRoutingComponent_fin_sub_header_7_Template","BookingRoutingComponent_aside_19_Template","joinDialogOpen$","tmp_4_0","_c2","EntryModule","BookingWidgetModule","BookingEntryRouteComponent","nativeBridge","shouldRender","navigate","replaceUrl","queryParamsHandling","BookingEntryRouteComponent_div_0_Template","PaxDetailsGuard","PaxDetailsModule","FormsModule","ENABLED_PAX_ANCILLARY_CATEGORIES","marketingConsentType_r3","MarketingConsentType","NEWSLETTER","newsletterContent_r4","marketingConsentContent_r5","marketingConsentOpen","PaxDetailsMarketingConsentComponent_div_0_div_4_Template","MAGAZINES_BLOCK","marketingConsentType$","formGroup","marketingConsentType_r6","MEMBER_OFFERS","FLIGHT_OFFERS","PaxDetailsMarketingConsentComponent","consentService","newsletterService","getMarketingConsentType","FormGroup","marketingNewsletter","FormControl","advertising","controls","valueChanges","marketingEnabled","enable","setValue","disable","profileOrUndefinedIfNotLoggedIn","userProfile","iif","getMemberConsent","consents$","loginToken","token","getMarketingConsents","consentGroup","consents","consentTextId","ConsentTextId","consentStatus","ConsentStatus","ACCEPTED","setMarketingConsent","addConsent","subscribeToNewsletter","catchError","textId","consentCheck","checked","sendConsents","get","firstPassenger","langKey","country","language","payload","email","pageUrl","NewsLetterSource","postSubscribeRequest","PaxDetailsMarketingConsentComponent_div_0_Template","PaxDetailsMarketingConsentComponent_ng_template_2_Template","PaxDetailsMarketingConsentComponent_ng_template_4_Template","alt","icon","openInfoModal","IconButtonSize","SMALL","IconButtonTheme","LIGHT_SECONDARY_OUTLINE","actionTextSubTitle","loadingTitle","LoaderTheme","PaxAncillaryProductComponent_div_0_ng_container_13_ng_container_1_ng_container_1_span_8_Template","PaxAncillaryProductComponent_div_0_ng_container_13_ng_container_1_ng_container_1_div_13_Template","firstKey_r4","value_r5","updateServiceSelection","ToggleSwitchStatus","UNCHECKED","_c3","isLoading$","selected","actionText","ACTIVE","PaxAncillaryProductComponent_div_0_ng_container_13_ng_container_1_ng_container_1_Template","entries_r6","PaxAncillaryProductComponent_div_0_ng_container_13_ng_container_1_Template","categoryWithSelections_r7","disclaimerText","PaxAncillaryProductComponent_div_0_div_2_Template","PaxAncillaryProductComponent_div_0_fcom_icon_6_Template","PaxAncillaryProductComponent_div_0_fcom_icon_button_10_Template","PaxAncillaryProductComponent_div_0_div_11_Template","PaxAncillaryProductComponent_div_0_ng_container_13_Template","PaxAncillaryProductComponent_div_0_div_14_Template","customProductTitle","showInfoButton","getFirstValue","serviceInfo","infoModalOpen","PaxAncillaryProductComponent_fcom_modal_2_h4_2_Template","ModalButtons","CLOSE","PaxAncillaryProductComponent","ButtonTheme","analyticsContext","selectionChanged","getServiceInfo","zeroPrice$","price","service","fragmentId","selection","asTravelerService","gtmAnalytic","categoryWithSelections","firstKey","categoryWithSelections$","ngContentSelectors","PaxAncillaryProductComponent_div_0_Template","PaxAncillaryProductComponent_fcom_modal_2_Template","updateSelectionsForFragment","servicesForCategory$_r3","tmp_5_0","tmp_7_0","tmp_8_0","tmp_9_0","subTotal","tmp_10_0","PaxAncillariesComponent_div_0_fin_pax_ancillary_product_4_Template","servicesWithSelectionsAndPrices$","getCurrencyCode","fallBack","pricePerItem","getPreciseMultiplication","multiplier","PreciseNumber","fromString","multiply","from","PaxAncillariesComponent","fallBackCurrencyCode$","services$","selections$","prev","selections","fallbackCurrencyCode","mapSelectionsAndSubTotalPriceToCategoryServices","allCategories","mapValues","servicesForFragment","mapSelectionStatusToServices","calculateCategorySubTotal","selectionsForCategory","categorySubTotal","fragmentSelection","fragmentSubtotal","quantity","SubCategory","CHECKED_BAGGAGE","ZERO","getFragmentSubTotal","PaxAncillariesComponent_div_0_Template","PaxAncillariesComponent_ng_template_2_Template","loader_r4","buttonClick","skipToCheckout","ButtonMode","FILL","PaxShortcutToPayComponent","shortCutFlowActive$","toLowerCase","PaxShortcutToPayComponent_div_0_Template","onUnlockTravelingWith","WARNING","onBlurField","PaxDetailsFormComponent_div_2_ng_container_2_div_11_fcom_notification_4_Template","infantTravelingWithLocked$","FIELDS","travelling","passenger_r5","selectableLeadPassengers$","paxServices$","paxSelections$","paxExpandersOpen","i_r6","PaxFormStatus","INVALID","paxAllowErrorsVisible","paxSummary$","ctx_r3","toggleOpen","onFocusField","checkFrequentFlyerNumberAndUpdateCart","corporateUserSelected","corporateUserCleared","PaxDetailsFormComponent_div_2_ng_container_2_div_11_Template","PaxDetailsFormComponent_div_2_ng_container_2_div_12_Template","PaxDetailsFormComponent_div_2_ng_container_2_ng_template_15_Template","getBorderClasses","SINGLE_PAX_BLOCK","CHECKMARK_BLOCK","getIconClass","descriptionContent_r10","paxTypeLocalizationKey","paxAgeLocalizationKey","typeLocalizationKeys","profile$","corporateUsers$","controlData$","frequentFlyerAirlines$","availableDays","FinnairPassengerCode","INF","enablePaxAncillaries$","enabledPaxServicesAvailable$","paxForm","INPUT","addEmail","removeEmail","emailsArray","errors","_r11","toggleOpenCorporate","PaxDetailsFormComponent_div_2_div_11_Conditional_5_Template","PaxDetailsFormComponent_div_2_div_11_fin_additional_email_6_Template","PaxDetailsFormComponent_div_2_div_11_ng_template_7_Template","getCorporateBorderClasses","corporateExpanderOpen","CORPORATE_BOOKING_BLOCK","getCorporateIconClass","descriptionContent_r13","enableCorporateSeatBenefit","enableAdditionalEmailInBookingFlow","PaxDetailsFormComponent_div_2_ng_container_2_Template","PaxDetailsFormComponent_div_2_div_11_Template","handleShortcutToPayClick","_c4","points_r14","_c5","paxAncillariesSubTotal$","airlineToOption","code","touchAllControls","group","valuesOf","forEach","control","UntypedFormGroup","markAsTouched","includesEnabledPaxAncillaryCategories","isEmptyObjectOrHasEmptyValues","getFragmentOnDTranslationsForService","getAllCartFragmentIds","onlyBounds","i","isBoundBased","cityName","VALID","PaxDetailsFormComponent","fb","elementRef","passengerFormService","corporateService","infoMessageKey","unlockTravelingWith","PaxFormFields","CheckBoxTheme","EMPTY","paxFormReady$","selectedCorporateUsers$","loading","defaultTravelingWithValue","memoize","expanderIsClosed","expanderIsOpen","allowErrorsVisible","hasErrors","hasValue","selectProfileType","additionalEmails$","selectAdditionalEmails","setupPaxDetailsFields","fillInCorporateCodeIfSet","removeExcessPrefillPassengers","setUpPaxSummaryText","fill","safeMapObs","cartForPaxAncillaries$","setupPaxAncillaries","enablePaxAncillaries","selectPaxDetails","enabledPaxServicesAvailable","frequentFlyerCard","cardNumber","companyCode","valid","queuePassengersAndCorporateCodeUpdate","totalPriceForSelectionsForCategories","getPaxFormStatus","getUsers","corporateUsers","selectedUsers","user","paxState","setUpLoginListener","pairwise","curr","isCorporateAdminOrTravelBooker","prefillData","PrefillSource","PROFILE","noop","paxIds","newPassengers","setPaxDetails","paxDetailsReady","marketingConsent","validateForm","updateValueAndValidity","emitEvent","setTimeout","scrollToFirstInvalidInput","paxType","asPaxTypeKey","isPrimaryPax","invalid","frequentFlyerCardAlreadyInCart","filteredPaxDetails","getValidPassengerIds","timeout","clearTimeout","preventDefault","isOpen","markAllAsTouched","touched","basicInfo","getFieldStatus","gender","phoneNumber","getNestedFieldStatus","phone","phonePrefix","frequentFlyer","fields","shouldIgnoreCheck","parentField","corporateUser","userList","splice","tap","paxDetailsSnapshot","setupPaxFormBase","otherInformation","corporateUserInformation","clientId","clientIdInputDisabled","setupTravelers","setupInfantTravelingWithLocking","updateStoreFromFormChanges","triggerInitialValidation","updatePaxDetailsInStore","birthDate","companyName","getAirlineNameByCode","dateOfBirth","monthOfBirth","yearOfBirth","formatDateOfBirth","trim","overrideCorporateCode","corporate","ctrl","createTravelerFormGroups","setupTravellingWithSelectionsForInfants","traveler","typeLocalizationKey","days$","availableDays$","months","rangeFrom","years","createPassengerFormGroup","formGroups","sources","CART","SESSION","setupAirlinePrefixes","getTravelerTypes","setupTravellingWithSelectOptions","setupClearingConflictingTravellingWithSelections","travellingFormGroups","infant","travellingWithPaxIds$","g","zipWithLastValue","clearPreviousConflictingSelections","newSelections","previousSelections","onlyChangedValues","newValue","fieldIndexToChange","indexesOfWantedValue","markAsPristine","markAsUntouched","option","selectableLeadPassengers","ad","mergeDeep","disableCorporateCode","Validators","compose","minLength","maxLength","pattern","additionalEmail","EMAIL_PATTERN","additionalEmailValidator","frequentFlyerValueChangeValidation","sanitizedData","getRawValue","paxData","trimAndReplaceWhitespace","addedEmail","reset","passengerIndex","pType","FREQUENT_FLIER_AIRLINES","airline","FINNAIR_ACCOUNT","getTravelersForType","ADT","childs","CHD","locked","travellingControl","getField","fieldName","frequentFlyerCards","card","fc","setErrors","sameCardNumberExists","cardEmptyInFormAndCart","hasMatchingCardInCart","travelerIds","getTravelerIdsExcludingInfants","passengerTypeCode","primaryPaxId","serviceMapForCategoriesForTravelers","removeCancellationCoverFromNonPrimaryPax","travelerServices","mapDisplayTitlesForPaxAncillaries","servicesForTraveler","displayTitle","selectionMapForCategoriesForTravelers","PaxDetailsFormComponent_fcom_loader_0_Template","PaxDetailsFormComponent_div_2_Template","PaxDetailsFormComponent_span_14_Template","PaxDetailsFormComponent_span_21_Template","PaxDetailsFormComponent_fcom_icon_25_Template","_selectCommonBookingState","createFeatureSelector","COMMON_BOOKING_FEATURE_KEY","_upgradeOfferState","createSelector","upgradeOffer","flight_r3","bound_r1","i_r2","isDeparture_r5","ctx_r6","AIRCRAFT_HORIZONTAL_BLOCK","AIRCRAFT_HORIZONTAL","uniqueAirlineNames","duration","stops","fareFamilyBrandName","prices$","upgradeOffer_r6","upgradeFareFamily","brandName","UpgradePromotionModalComponent_ng_container_0_ng_container_1_ng_container_5_Template","UpgradePromotionModalComponent_ng_container_0_ng_container_1_ng_template_25_Template","cart_r8","fareFamilyOption_r9","currentFareFamily","currentBenefits$","ARROW_RIGHT","newBenefits$","UpgradePromotionModalComponent_ng_container_0_ng_container_1_Template","upgradeOffer$","benefit_r10","UpgradePromotionModalComponent_ng_template_2_div_14_Template","fareFamily_r11","brandColor","selection_r13","price_r12","brandNameDescription","benefits_r14","UpgradePromotionModalComponent","currencyCode$","offer","currentPrice","inboundPrice","outboundPrice","priceStr","parseFloat","strToAmount","outboundUpgradePrice","inboundUpgradePrice","newPrice","totalUpgradePrice","translatedBenefitRows","benefit","shouldDisplayBenefit","UpgradePromotionModalComponent_ng_container_0_Template","UpgradePromotionModalComponent_ng_template_2_Template","upgradeOffer_r2","ctx_r2","LoaderColor","WHITE","_r5","openFareFamilyModal","key_r6","upgradePriceDiffTrend_r8","upgradePriceDifference_r7","UpgradePromotionComponent_ng_container_0_div_3_div_36_span_1_Template","upgradePriceDifference$","_r9","key_r10","UpgradePromotionComponent_ng_container_0_div_3_button_19_Template","UpgradePromotionComponent_ng_container_0_div_3_div_36_Template","UpgradePromotionComponent_ng_container_0_div_3_button_41_Template","openUpgradeModal","currentTotalPrice$","MMB_TICKET_CHANGES","selectedBenefitKey$","upgradePriceDiffTrend$","suggestedBenefitKey$","ButtonSize","MEDIUM","hide","CHECKMARK_OUTLINE","CLOSE_DELETE","DARK_TERTIARY_GHOST","UpgradePromotionComponent_ng_container_0_div_1_Template","UpgradePromotionComponent_ng_container_0_div_3_Template","UpgradePromotionComponent_ng_container_0_div_5_Template","UpgradePromotionComponent_ng_container_0_div_7_Template","closeModals","UpgradeStatus","LOADING","IN_PROGRESS","DONE","fareFamilyModalOpen","INIT","HIDDEN","GA_ELEMENT_NAME","UpgradePromotionComponent","IconPosition","upgradeModalOpen","selectedUpgradeOffer","safeSelect","_offer","diff","getSelectedBenefitKey","getSuggestedBenefitKey","setStatusListeners","upgradeStatus","BANNER","VIEW","japanOrigin","confirmUpgrade","UpgradePromotionComponent_ng_container_0_Template","CUSTOM","PaxDetailsComponent_ng_container_1_fin_upgrade_promotion_1_Template","infoMessageKey$","EMBEDDED","emitReady","setInfoMessage","PaxDetailsComponent","enableTicketTypeUpselling","messageKey","isString","paxDetailState","paxDetailsFormData","emailAddress","memberProgram","memberNumber","PaxDetailsComponent_ng_container_1_Template","PaxDetailsComponent_fin_booking_plain_header_area_3_Template","PaxDetailsComponent_fin_booking_notification_5_Template","PaxDetailsComponent_div_8_Template","PaxDetailsComponent_ng_container_10_Template","data_r2","detailText","dataTestId_r5","form_r3","checkBoxName_r4","KoreaNotificationComponent_section_5_ng_container_1_Template","notification_r8","form","data_r6","KoreaNotificationComponent_section_7_ng_container_1_Template","data_r9","KoreaNotificationComponent","formBuilder","cdr","confirmed","close","useOfPersonalInformation$","overseasTransferOfPersonalInfo$","useOfPersonalInformation","requiredTrue","overseasTransferOfPersonalInfo","openModal","markForCheck","KoreaNotificationComponent_ng_template_0_Template","KoreaNotificationComponent_section_5_Template","KoreaNotificationComponent_section_7_Template","CONTINUE_CANCEL","confirmPaxDetails","continueOrSkip","BookingPaxDetailsRouteComponent","showKoreaNotification$","originCountryCode","CountryCode","KOREA","prefetchAllSeatmaps","openModalOrConfirm","confirmOrDisplayKoreanNotification","koreaNotification","passengerFormDetails","updateCartWithPaxAncillaries","anyPassengerHasChangesToFFDetails","getAllFlightsFromCartOrOrder","allRequests","current","resetSeatMap","queueSeatSelectionReset","_cart","_status","fetchSeatMapOrSetNoAvailability","finnairCart","ffCard","BookingPaxDetailsRouteComponent_fin_korea_notification_1_Template","PurchaseReviewGuard","isReviewAndPayFlow","route","requestedOrderId","queryParamMap","requestedHash","payStatus","PurchaseReviewModule","localizationProvider","triggerLazyLocalizations","I18nKey","MMB","FcomFormsModule","isLongHaulLegAndAy","itineraryArray","location","operatingAirline","isShortHaulFlight","isCabinClassFound","cabinClass","fareInfo","fareInformation","rule","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_div_9_p_1_Template","fareRulesPerPax_r9","category_r5","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_p_1_Template","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_p_4_Template","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_fcom_loader_7_Template","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_div_9_Template","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_ng_container_1_Template","rulesExpandersOpen","passenger_r7","handleRulesExpanderToggle","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_fcom_expand_6_Template","CHEVRON_DOWN","fareRules_r11","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_div_1_Template","FareRuleCategory","handlePassengerTabChange","PurchaseReviewFareRulesComponent_div_0_fcom_tab_2_Template","PurchaseReviewFareRulesComponent","bookingCartService","activePaxId$","fareRules$","activePaxId","rulesPerPax","flightIdsInBound","getFlightIdsInBound","newTicketRules","n","itineraryItem","paxId","closeAllRulesExpanders","detectChanges","travellerId","cartHash","rulesInStore","rulesLoadingOrError","triggerTicketRules","PurchaseReviewFareRulesComponent_div_0_Template","SafContributionProductComponent_fin_pax_ancillary_product_0_div_4_Template","serviceCatalogWithSelection","safServicesWithSelection$","SAF","safIsLoading$","safModalFragment$","fragment_r5","picture","SafContributionProductComponent_fcom_modal_3_fcom_image_1_Template","SafContributionProductComponent_fcom_modal_3_h3_3_Template","SafContributionProductComponent_fcom_modal_3_h3_5_Template","isSafSelected$","SafContributionProductComponent","cartBeforeSafUpdated","safService$","servicesForCategory","safServices","getTotalPrice","cartOrOrder$","oldOrder","isDeepEqual","serviceSelectionsForFragment","flat","isSafSelected","selectedQuantity","serviceCatalogServiceWithSelection","innerAcc","innerFragment","innerServices","scs","serviceReady","subCategory","SAF_LOW","toString","serviceSelection","_services","_cartOrOrder","cartOrOrder","mapErrorForSentry","SafContributionProductComponent_fin_pax_ancillary_product_0_Template","SafContributionProductComponent_fcom_modal_3_Template","backToDateSelection","booking_r5","summary$","image$","isOrder$","IconLibrary","SVG_LIBRARY","CLOCK","TRAIN","tmp_11_0","rebookPolicies$","i_r7","label","tmp_12_0","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Conditional_3_Conditional_6_Template","cancellationPolicies$","inboundShowFlexTicketNotification$","bound_r10","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_span_1_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Conditional_3_Template","openTicketRulesModal","handleFlightCardToggle","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_Conditional_14_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_button_16_Template","flightCardExpandersOpen","booking_r12","benefits","fareFamilyCode","handleViewDetailsModal","STEPS","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_Template","isFirst_r13","PurchaseReviewComponent_ng_template_5_div_7_Conditional_4_Template","PurchaseReviewComponent_ng_template_5_div_7_Conditional_6_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_Template","multiCityStopoverDurationNotification$","hasTrainSegment$","PurchaseReviewComponent_ng_template_5_ng_container_9_ng_container_6_fin_sustainability_trip_message_1_Template","shouldDisplaySafContributionMessage$","PurchaseReviewComponent_ng_template_5_ng_container_9_ng_container_6_Template","PurchaseReviewComponent_ng_template_5_ng_container_9_fin_sustainability_trip_message_8_Template","safContributionUrl$","shouldDisplayCombinedTripMessage$","cartOrOrderStatusUpdating$","_r15","FILL_MOBILE","PurchaseReviewComponent_ng_template_5_Conditional_23_fin_section_review_0_fcom_button_7_Template","corporateCode_r16","PurchaseReviewComponent_ng_template_5_Conditional_23_fin_section_review_0_Template","_r17","_r18","scsWithSelection","coverServicesWithSelection$","catalogCategory$","coverIsLoading$","points_r19","PurchaseReviewComponent_ng_template_5_fcom_notification_1_Template","PurchaseReviewComponent_ng_template_5_fcom_trip_card_3_Template","PurchaseReviewComponent_ng_template_5_fin_saf_contribution_product_5_Template","PurchaseReviewComponent_ng_template_5_div_7_Template","PurchaseReviewComponent_ng_template_5_ng_container_9_Template","PurchaseReviewComponent_ng_template_5_Conditional_21_Template","PurchaseReviewComponent_ng_template_5_Conditional_23_Template","PurchaseReviewComponent_ng_template_5_fin_included_products_24_Template","PurchaseReviewComponent_ng_template_5_ng_container_26_Template","PurchaseReviewComponent_ng_template_5_fin_section_review_40_Template","PurchaseReviewComponent_ng_template_5_span_52_Template","PurchaseReviewComponent_ng_template_5_fcom_icon_58_Template","enableSafContributionCard$","showSustainableMessages$","enableEditPaxDetailsOnReviewPage","allFrequentFlyerCards$","tmp_22_0","serviceFlow$","GrandTotalTheme","RENEWED","GRID_FULL","activeBoundInModal$","PurchaseReviewComponent","BoundType","isTicketRulesModalOpen","isTimelineModalOpen","paxAdditionalEmails$","isChangingStep","cartBeforeCancellationCoverUpdated$","previousBound","currentBound","has24HourDifference","arrivalDateTime","departureDateTime","hoursDifference","hoursTo","hasBound24HourStopOver","VIEW_CART","getGA4Items","handleCover","ffCode","row","mapCancellationPolicy","mapRebookPolicy","points","d","cartOrOrderStatus$","getBookingDestinationSummary","summary","hasBusSegment","isUsingSAF","enableShowingSAF","safAncillary","enableSafContributionCard","safEligibility","boundEligibility","hasServices$","isOneWay$","originCountryCode$","originInChinaOrKorea$","CHINA","shouldDisplayCombinedTripMessage","shouldDisplaySafContributionMessage","safContributionUrl","getServicesToShow","inboundFlight","isFlexFareFamilyBound","containsLongHaulFlight","aircraft","TRAIN_AIRCRAFT_CODE","serviceMapForCategories","CustomServiceType","JOURNEY","isCoverSelected$","selectedCoverAsArray","servicesForFragmentAndCategory","isCoverSelected","coverServices","serviceCatalogServices","journeyId","GROUP","displayName","includedInTicketType","includedInTierBenefit","handleFullTicketRuleModalOpen","MODAL","timelineBoundIndex","PurchaseReviewComponent_ng_container_3_Template","PurchaseReviewComponent_ng_template_5_Template","PurchaseReviewComponent_fin_flight_summary_14_Template","PurchaseReviewComponent_fin_purchase_review_fare_rules_16_Template","reviewContent_r20","outbound","inbound","BookingPurchaseReviewRouteComponent","activatedRoute","bookingOrderService","classAttribute","cartState$","cartState","order$","checkIfReviewAndPayRequestedAndHandleLoadingErrorAndIfAlreadyPaid","proceedToPayment","OrderActions","orderInformation","queueOrderLoad","orderResponseErrorStatus$","orderResponseErrorStatus","DapiErrorStatus","info","showButton","OTHER_ERROR","isPNRAlreadyPaid","relativeTo","queryParams","reviewAndPayRedirect","hostVars","hostBindings","PurchaseSuccessGuard","fetchInformation","isAllowed","orderid","PurchaseSuccessModule","BookingOrderService","PurchaseSuccessService","CommonBookingPurchaseSuccessModule","QualtricsModule","email_r2","goToMMB","LIGHT_PRIMARY_CTA_HEATHER","appUrl_r5","openInApp","PurchaseSuccessComponent_div_5_fin_section_review_2_p_8_Template","PurchaseSuccessComponent_div_5_fin_section_review_2_p_10_Template","PurchaseSuccessComponent_div_5_fin_section_review_2_li_13_Template","PurchaseSuccessComponent_div_5_fin_section_review_2_fcom_button_15_Template","PurchaseSuccessComponent_div_5_fin_section_review_2_fcom_button_16_Template","orderData$","emails$","enableAppCtaButton","appUrl$","hasBeenIssuedETickets$","PurchaseSuccessComponent_div_5_fin_section_review_4_div_7_p_5_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_7_p_7_Template","unconfirmedServices$","email_r6","unconfirmedServices_r7","paidIncludedServices$","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_ng_container_8_fcom_notification_1_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_ng_container_8_Conditional_2_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_ng_container_8_Conditional_3_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_p_1_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_p_3_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_li_6_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_ng_container_8_Template","appUrl_r10","PurchaseSuccessComponent_div_5_fin_section_review_4_div_7_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_div_9_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_fcom_button_11_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_fcom_button_12_Template","openCorporateSeatBenefit","PurchaseSuccessComponent_div_5_Conditional_5_Conditional_9_Template","PurchaseSuccessComponent_div_5_Conditional_5_Conditional_11_Template","B2B_BLOCK","RIGHT","openSurvey","surveyInfo_r13","goToHomePage","LIGHT_TERTIARY_GHOST","PurchaseSuccessComponent_div_5_fin_booking_plain_header_area_1_Template","PurchaseSuccessComponent_div_5_fin_section_review_2_Template","PurchaseSuccessComponent_div_5_fin_booking_plain_header_area_3_Template","PurchaseSuccessComponent_div_5_fin_section_review_4_Template","PurchaseSuccessComponent_div_5_Conditional_5_Template","PurchaseSuccessComponent_div_5_fcom_notification_13_Template","PurchaseSuccessComponent_div_5_div_23_Template","PurchaseSuccessComponent_div_5_ng_container_26_Template","PurchaseSuccessComponent_div_5_fcom_button_29_Template","enableSynchronousTicketingOnConfirmationPage","hasCorporateSeatBenefit$","showPoints$","showCorporateUpsell$","surveyInfo$","loadOrderErrorClick","PageState","PurchaseSuccessComponent","windowRef","ctaClick","od","getSurveyInfo","state$","orderStatus$","fetchInfo","orderFetchInformation$","OrderStatus","etickets","urlForAddAJourneyInApp","addBooking","recloc","rawBooking","corporatePredict","predictions","corporateProbability","isEligibleForSeatBenefit","removeGlobalListener","appUrl","nativeWindow","extraParams","recLoc","urlTree","createUrlTree","RootPaths","MANAGE_BOOKING_ROOT","serializeUrl","GtmTripType","QualtricsSurveys","CONFIRMATION_MULTI_CITY","AWARD_FEEDBACK","PURCHASE_FEEDBACK","PurchaseSuccessComponent_fin_loader_4_Template","PurchaseSuccessComponent_div_5_Template","PurchaseSuccessComponent_fin_bound_selection_error_message_6_Template","BookingPurchaseSuccessRouteComponent","onBeforeInstallPrompt","userAgentService","isAndroid","onAppInstalled","purchaseSuccessService","locationService","document","orderStatus","paramMap","hasOrderQueryParams","PARAM_ORDER_ID","PARAM_HASH","addAppInstallPromptAndroid","isIos","addAppInstallPromptIos","orderHasToBeRefetched","fetchOrder","replaceState","pathSegmentsToPathString","pathFromRoot","removeAppInstallPrompts","navigateToFrontPage","appName","appId","appIdIos","head","querySelector","metaTag","createElement","setAttribute","insertBefore","firstChild","manifestPath","manifestPathAndroid","linkTag","querySelectorAll","remove","DOCUMENT","PROMO_CODE_REGEXP","validate","isMultiCityEnabled","maxBounds","flightsAreValid","flightSearch","date","lt","now","flightNumbers","validated","isLocalDate","GlobalBookingTravelClass","k","search","check","directFlights","isNull","promoCode","test","TicketSelectionGuard","isOldDeeplinkFormat","redirectToJsonDeeplink","departureFlightNumbers","departureFareFamily","returnFlightNumbers","returnFareFamily","json","filterUtmParams","jsonUrl","UTM_PARAMS","validateDeeplink","validations","enableMultiCity","passesValidation","validation","hasJSONDeeplink","parse","Cabin","MIXED","getQueryParameters","DimensionsAndDetailsModalService","showDimensionsAndDetails$","showAllDimensionsAndDetails$","showDimensionsAndDetailsObservable$","showAllDimensionsAndDetailsObservable$","opedDimensionsAndDetails","opedAllDimensionsAndDetails","closeModal","refetchOffers","phase_r6","showDetailsModal","backToOutbound","isOneWayOffers$","departureDate$","returnDate$","selectedOutbound$","selectedInbound$","paxAmount$","selectionPhase$","tripLocations$","phase_r8","handleBoundOpen","selectOutbound","selectOutboundFareFamily","handleShowBenefits","selectSortBy","onShowSpinner","SelectionPhase","OUTBOUND","selectedSortBy$","enabledOutboundIds$","cheapestCombinableOutboundPrices$","outbounds$","showOutboundFilters$","outboundSorting$","outboundIdSortOrder$","selectedOutboundFareFamilyCode$","selectInbound","selectInboundFareFamily","INBOUND","enabledInboundIds$","inboundSorting$","cheapestCombinableInboundPrices$","inbounds$","showInboundFilters$","inboundIdSortOrder$","selectedInboundFareFamilyCode$","BookingTicketSelectionViewComponent_div_6_div_3_fin_bound_selection_list_2_Template","BookingTicketSelectionViewComponent_div_6_div_3_fin_bound_selection_list_3_Template","availableCabinClasses$","BookingTicketSelectionViewComponent_div_6_ng_container_1_Template","BookingTicketSelectionViewComponent_div_6_div_3_Template","points_r10","itineraryModal","benefitsModal","BookingTicketSelectionViewComponent_div_29_cms_unstyled_fragment_2_Template","continueModal","zeroBaggage","offerListSortMap","freeze","PRICE","ARRIVAL","DEPARTURE","EMPTY_AMOUNT","boundWithDetails","itineraryWithDetails","boundFareInformation","matchingSegment","segment","segmentId","bookingClass","BookingTicketSelectionViewComponent","bookingWidgetService","TabLayoutType","continueButtonClicks$","selectionPhaseChange","openBoundClick$","selectedSortCriteria$","activeCabinClassNotificationIds","offers$","filteredOffersOutbound$","filteredCurrentOffersOutbound","filteredOfferInbound$","filteredCurrentOffersInbound","offerList","finnairSearchParameters","departureLocationCode","offersCurrency","offersStatus$","isOneWayOffers","offersDepartureDate","offersReturnDate","fareFamilies$","currentFareFamilies","quotas$","quotasForBounds","boundId","selectedOutboundFareFamilyBenefits$","selectedInboundFareFamilyBenefits$","outboundOffers","uniqueBoundFareFamilyCodes","ff","getBoundFareFamilies","inboundOffers","boundsSelected$","boundSelectionsDone","offersAndType$","list","oneWay","outboundId$","inboundId$","byOutboundIdIfPresent","byInboundIdIfPresent","boundPrice","cheapestPrice","Math","min","selectableOffers$","offersAndType","combinableOffers","outboundIds","inboundIds","selectedOffer$","currentOffer","selectedOfferPoints$","outBoundFareFamilyCode","totalPointsPrice","outboundPointsPrice","selectedOfferPrice$","selectedOutboundOfferItinerary$","offersPrev","outboundPrev","outBoundFareFamilyCodePrev","offersNext","outboundNext","outBoundFareFamilyCodeNext","outboundFareInformation","selectedInboundOfferItinerary$","inboundPrev","inboundNext","inboundFareInformation","getCabinClassesForAwardBounds","FinnairCabinClass","ECONOMY","ECOPREMIUM","BUSINESS","selectedTicketSortBy","sorting","currentPhase","confirmOffer","continueEnabled$","continueButtonId$","removeMessage","boundType","flightSelectionGtmDataForOffers","gtmFlightSelectionData","FLIGHT_SELECTION_VIEW","ACCORDION","containsOnlyOneCabin","businessFaultySegments","ecoPremiumFaultySegments","faultySegments","fs","seg","selectedOutboundPrev","selectedInboundPrev","notificationTextPrev","linkTextPrev","selectedOutboundNext","selectedInboundNext","notificationTextNext","linkTextNext","selectedOutbound","selectedInbound","notificationText","linkText","uuid","content","callback","getValue","storedId","keepMessageAfterNavigation","selectionPhase","goToOutboundPhase$","FAKE_LOAD_TIME","onContinueClick","setGlobalBookingSelectionToOriginal","triggerCreateCart","hasZeroBaggageOnEitherFlight","continueToNextStep","getBoundWithItineraryDetails","LINK","OPEN","offersHashValue","offersHash","queueCartCreate","localeValue","selectedBoundWithItineraryFlightDetails","BookingTicketSelectionViewComponent_fin_bound_selection_error_message_2_Template","BookingTicketSelectionViewComponent_fin_bound_selection_error_message_3_Template","BookingTicketSelectionViewComponent_fin_bound_selection_error_message_4_Template","BookingTicketSelectionViewComponent_div_5_Template","BookingTicketSelectionViewComponent_div_6_Template","BookingTicketSelectionViewComponent_span_14_Template","BookingTicketSelectionViewComponent_fin_itinerary_23_Template","BookingTicketSelectionViewComponent_fin_fare_family_details_v2_26_Template","BookingTicketSelectionViewComponent_div_29_Template","fareFamily_r2","_c9","showFareFamiliesAndScrollToCabinClass","OfferFarefamiliesComponent_div_0_button_1_ng_container_7_Template","OfferFarefamiliesComponent_div_0_button_1_ng_container_8_Template","OfferFarefamiliesComponent_div_0_button_1_span_10_Template","OfferFarefamiliesComponent_div_0_button_1_span_11_Template","first_r4","last_r5","_c6","_c7","CHECKMARK","RADIOBUTTON_UNSELECTED","_c8","OfferFarefamiliesComponent_div_0_button_1_Template","cheapestOrSelectedFareFamilyOfEachCabinClass$","trackByFn","handleSelectFareFamily","accordionId","fareFamily_r9","routeType$","isShortHaul$","scrollBenefits","OfferFarefamiliesComponent_div_1_fin_scroll_handle_container_11_fin_fare_family_option_4_Template","bound$","fareFamilyOptions","extendedFareFamilies_r10","hideFareFamilies","OfferFarefamiliesComponent_div_1_fin_scroll_handle_container_11_Template","extendedFareFamilies$","INFO_BLOCK","OfferFarefamiliesComponent","dimensionsAndDetailsModalService","selectFareFamily","showBenefits","showCabinClassFareFamilies","optionName","showFareFamilyOptions","hasSelected","scrollRequest$","selectedFareFamilyCode$","selectedBoundId$","selectedFareFamilyCode","selectedBoundId","filterAndSortFareFamilyByCabinClass","effectiveCabinClass","fareFamilyIndex","findIndex","scrollToCardByIndex","extendedFareFamilies","ngAfterViewChecked","adjustFareFamilyOptionHeight","scrollContainer","container","nativeElement","maxHeight","getBoundingClientRect","height","flexBasis","selectedCabinClass","activeCabinClassHeaderContainer","focus","scrollToFareFamily","preSelectFareFamily","scrollToElement","toArray","boundFareFamily","ElementRef","OfferFarefamiliesComponent_div_0_Template","OfferFarefamiliesComponent_div_1_Template","JoinPipe","transform","input","joinWith","EJ8","pure","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_20_span_3_Template","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_20_span_4_Template","SUSTAINABILITY","priorityServicesAvailable","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_ng_container_21_fcom_notification_1_Template","selected_r5","operatingAirlineCodes","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_23_span_1_span_3_Template","note_r6","last_r7","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_23_span_1_Template","notes","showDetails","selectBoundAndFarefamily","emitShowCabinClassFareFamilies","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_20_Template","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_ng_container_21_Template","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_fcom_notification_23_Template","tails$","isBusOnlyConnections$","selectedBound$","hasBusLeg","boundObs_r8","BoundSelectionListComponent_ng_template_19_li_3_ng_container_1_Template","clearAllFilters","BoundSelectionListComponent_ng_template_19_li_3_Template","BoundSelectionListComponent_ng_template_19_ng_container_5_Template","boundsList$","BoundSelectionListComponent","locationRouteCffService","openBound","selectBound","showSpinner","UntypedFormControl","routeType","filters$","offerFilters","lastRequestParam$","offerLastRequestParams","isTravelClassDisabled$","sortedBounds$","boundIdSortOrder$","sortOrder","selectedBound","cheapestCombinedPrice","enabledBoundIds$","cheapestCombinablePrices$","enabledBoundIds","cheapestPrices","isByBusOnly","isIn","cheapestCombinablePrice","awardPoints","layoverAmounts$","originLocationCode$","destinationLocationCode$","fastestPrice$","filteredOffers$","sortingId","lowestFFPrice","getFareFamiliesLowestPriceOrPoints","calculateLowesPrice","lowestPrice$","sorted","sortByPrice","routeCffsFor","mapLocationRouteCffDataToCabin","fragment","linkUrl","linkOpenInNewWindow","openInNewTab","boundsList","getAircraftTailForFlight","aircraftCode","BUS_AIRCRAFT_CODE","onSelectSortBy","onSetFilter","flightFilters","filteredFilters","isUndefined","obj","filterName","onResetFilter","onResetAllFilters","flightSelectionFilters","shouldNotClearTravelClass","FlightSelectionFiltersComponent","BoundSelectionListComponent_ng_container_17_Template","BoundSelectionListComponent_ng_template_19_Template","showFlightSelectionFilters","boundsStatus$","tmp_13_0","boundResults_r10","FormatPassengerPipe","formatPaxAmount","trans","adult","child","TicketSelectionHeaderComponent_ng_template_0_div_1_Template","enableNewLanguageSelector","enableNewStepper","outbound$","numberOfBound_r5","titleLocalization_r2","tripLocations","BOUND_SELECTION_PHASE_INDEX","selectionPhase_r4","subTitleLocalization_r3","TicketSelectionHeaderComponent_div_13_ng_container_2_Template","headerTemplate_r6","numberOfBoundText$","promoCode_r7","clickOutbound","clickInbound","inbound$","TicketSelectionHeaderComponent_ng_container_23_button_1_Template","elemRef","TicketSelectionHeaderComponent","boundSelection$","outboundButton","inboundButton","TicketSelectionHeaderComponent_ng_template_0_Template","TicketSelectionHeaderComponent_ng_container_8_Template","TicketSelectionHeaderComponent_div_13_Template","TicketSelectionHeaderComponent_ng_container_16_Template","TicketSelectionHeaderComponent_fcom_notification_17_Template","TicketSelectionHeaderComponent_button_21_Template","TicketSelectionHeaderComponent_ng_container_23_Template","promoCode$","message_r5","teaserText","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_ng_container_3_ng_container_1_fin_flight_selection_warning_1_div_3_Template","multicityErrorNotification$","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_ng_container_3_ng_container_1_fin_flight_selection_warning_1_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_ng_container_3_ng_container_1_fin_flight_selection_warning_2_Template","tripType_r6","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_ng_container_3_ng_container_1_Template","phase_r10","details","handleShowCabinClassFareFamilies","handleShowDimensionsAndDetails","upgradeAvailabilityEnabled","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_div_6_div_5_fin_optimize_air_bounds_bound_selection_list_1_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_div_6_div_5_fin_optimize_air_bounds_bound_selection_list_2_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_div_6_div_5_Template","isOneWayBounds$","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_fin_flight_selection_warning_2_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_ng_container_3_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_fin_flight_selection_warning_4_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_div_5_Template","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_div_6_Template","boundStatus_r12","shouldReload","itineraryAndUpgradesModal","triggerLogin","availableClasses","_r13","activeTab$","AirBoundsBookingTicketSelectionViewComponent_ng_template_20_fin_itinerary_upgrade_availability_11_Template","IN_MODAL","upgradeTabSelected$","dimensionsAndDetailsModal","AirBoundsBookingTicketSelectionViewComponent_div_29_cms_unstyled_fragment_2_Template","modifySearchSelection","closeDiscountModal","promoCodeModal_r16","terms","matchesCampaignFareFamily","AirBoundsBookingTicketSelectionViewComponent","airBoundsService","bookingGtmService","cmsDataService","dimensionsAndDetailsService","SEATS_LEFT_LIMIT","continueModalV2","promoCodeModal$","BEST","showContinueButton$","getBoundWithCabinClass","resetOutboundCache","enableUpgradeAvailabilityInBooking","upgradeTabOpen","outboundBase$","filteredOutbounds","inboundBase$","filteredInbounds","hasSpecialOutbounds$","hasSpecialInbounds$","hasSpecial","mapSpecialOffersStatusToBounds","itineraries","boundsCurrency","isOneWayBounds","airBoundsLastRequestDepartureDate","airBoundsLastRequestReturnDate","fareFamiliesBounds","getTripTypeFromGlobalBookingFlights","hasFlightsInTheUnitedStates$","out","inb","selectedOutboundBound","selectedInboundBound","selectedOutboundAirBoundId$","selectedInboundAirBoundId$","selectedOutboundFareFamilyBenefits","selectedInboundFareFamilyBenefits","selectedOutboundItinerary$","selectedOutboundItinerary","selectedInboundItinerary$","selectedInboundItinerary","outboundHasDiscount$","hasDiscount","isShortHaulFlight$","trackPromoCodeEvent","selectedOutboundAirBoundIdValue","selectedInboundAirBoundIdValue","getPromoCodeTerms","sortByPriceOrDuration$","selectedAirBoundsTicketSortBy","selectedOutboundAirBound","selectedInboundAirBound","fare1","fare2","previous","flightsToFlightSearchParams","errorEvent","AirOffersStatusToText","setUpContinueButton","setUpGtmEventTracking","setUpAlternativeSegmentNotifier","handleBoundsPreSelection","setupUpgradeOffer","isApplied","NOTIFICATION","selectedOutboundAirBound$","getLastRequestParams","isOneWay","isShortHaul","createCart","getReturnBounds","flightSelectionGtmDataForAirBound","gtmData","fare","quota","isSeatsLeftShown","outboundFlights","inboundFlights","selectedInboundAirBound$","currentQuota$","currentQuota","respondToContinueClick","pseudoLocal","GLOBAL_BOOKING_WIDGET_EXPANDER_KEY","pre","isTabletDown","ExpanderStatus","selectedBoundsPrice$","boundsTotalPrice","airBoundsRequest","enableUpgradeTravelClass","_outbound","_inbound","_fareFamilies","triggerUpgradeOffer","selectedOutboundFareFamily","selectedInboundFareFamily","outboundUpgrade","getUpgradeFareFamily","inboundUpgrade","hasMatchingBrandName","UpgradeOfferActions","off","timestamp","Date","roundTrip","getHighestCabinClass","re","regExStart","cabinClassShortCode","getCabinClassShortCode","RegExp","updateDeeplinkOnFareFamilySelection","selectedAirBoundIds","hasZeroBaggageOnEitherBound","contentUrlTranslationKey","getContentUrlTranslationKeySuperLightModalWindow","openSuperLightWarningModal","closeDimensionAndDetailsModal","superLightWarningAnalytics","eventType","closeSuperLightWarningModal","continueSuperLightWarningModal","tabs","selectTab","getAvailableClasses","lowerCaseCabinClass","toLocaleLowerCase","PseudoLocalActions","LoginActions","LoginStep","CREDENTIALS","airBoundsIds","boundsHashValue","boundsHash","queueCartCreateByBounds","classes","bg","hasSpecialOffers","isSpecialOffer","deeplinkParams","updatedParams","mergeParamsToDeeplink","newUrl","prevPageUrl$","warn","flightIndex","i11","i12","AirBoundsBookingTicketSelectionViewComponent_ng_container_0_Template","AirBoundsBookingTicketSelectionViewComponent_fin_itinerary_19_Template","AirBoundsBookingTicketSelectionViewComponent_ng_template_20_Template","AirBoundsBookingTicketSelectionViewComponent_fin_fare_family_details_v2_24_Template","AirBoundsBookingTicketSelectionViewComponent_div_29_Template","AirBoundsBookingTicketSelectionViewComponent_fcom_modal_30_Template","RETURN","tabsContainer_r17","cabinClassFareFamily_r2","AirBoundsFareFamilyOptionListComponent_div_2_ng_template_23_ng_container_0_Template","AirBoundsFareFamilyOptionListComponent_div_2_ng_template_23_ng_container_1_Template","AirBoundsFareFamilyOptionListComponent_div_2_span_25_span_1_Template","AirBoundsFareFamilyOptionListComponent_div_2_span_25_span_2_Template","AirBoundsFareFamilyOptionListComponent_div_2_span_25_span_7_Template","discountReasonCode","lastFareFamily_r8","last","i_r9","last_r10","AirBoundsFareFamilyOptionListComponent_div_2_div_27_fin_fare_family_option_4_Template","selectNextCabinClass","openCabinClassModal","extendedFareFamilies_r12","nextCabinClass","isLongHaulLegAndAy$","AirBoundsFareFamilyOptionListComponent_div_2_div_13_Template","AirBoundsFareFamilyOptionListComponent_div_2_span_17_Template","AirBoundsFareFamilyOptionListComponent_div_2_ng_container_21_Template","AirBoundsFareFamilyOptionListComponent_div_2_ng_template_23_Template","AirBoundsFareFamilyOptionListComponent_div_2_span_25_Template","AirBoundsFareFamilyOptionListComponent_div_2_div_27_Template","tmp_6_0","first_r13","selectedCabinClass$","closedCabinClass_r14","AirBoundsFareFamilyOptionListComponent","showDimensionsAndDetails","enableSpecialOffersBadge","resize$","fromEvent","window","fareFamilyMap$","selectedFareFamily$","getCheapestOrSelectedFareFamilyOfEachCabinClass$","fareFamiliesSorting$","outboundsFareFamiliesSortingSelector","inboundsFareFamiliesSortingSelector","sortedFareFamilies$","fareFamiliesSorting","allBenefits$","fareFamilyMap","getExtendedFareFamilies$","selectedCabin","boundedFareFamily","showAll","globalBookingTripType","scrollToIndex","hasSuperLightCampaign","isNormalFareFamily","hasMatchingCampaignFareFamily","badgeType","getFareFamilyBadgeType","tags","FareFamilyBadgeType","CMS","getPreselectedFareFamily","POPULAR","cheapestFareFamilyOfCabinClass","selectedFareFamilyId","selectedFareFamilyIsInThisBound","sameCabinClassAsSelectedFareFamily","selectedFareFamilyFromBound","displayedFareFamily","allFareFamilies","fareFamiliesWithoutCampaignFiltering","codeStart","brandCode","getBrandNameShortCode","campaignCode","AirBoundsFareFamilyOptionListComponent_div_2_Template","campaignBadge_r3","boundNotification_r5","bound_r2","emitFareFamily","emitShowDimensionsAndDetails","handleCabinExpanding","preSelectedFareFamilyId","AirBoundsBoundSelectionComponent_ng_container_0_div_11_Template","openDetails","AirBoundsBoundSelectionComponent_ng_container_0_div_25_Template","AirBoundsBoundSelectionComponent_ng_container_0_fin_fare_family_option_list_29_Template","AirBoundsBoundSelectionComponent_ng_container_0_fin_fare_family_list_31_Template","AirBoundsBoundSelectionComponent_ng_container_0_ng_container_33_Template","inputId$","selectedBorderColor$","isNewFlightCardStyleTest$","campaignBadge$","tmp_16_0","ufoAirports$","tmp_17_0","hasOnlyBusLegs$","viewDetailsBtnKey","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_0_span_3_Template","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_0_span_5_Template","compact_r8","priorityServicesAvailable$","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_4_span_1_span_3_Template","note_r9","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_4_span_1_Template","bound_r12","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_0_Template","AirBoundsBoundSelectionComponent_ng_template_2_Conditional_2_Template","AirBoundsBoundSelectionComponent_ng_template_2_fcom_notification_4_Template","hasBusLeg$","hasDayChange","localDateString","AirBoundsBoundSelectionComponent","bookingAirBoundsService","selectedCabin$","NEW_FLIGHT_SELECTION_STYLE","hasDayChange$","ariaId$","selectedFareFamilySelector","displayPriceAmount$","selectedFareFamilyBenefitsSelector","displayPriceLabel$","startingFromTitle","legEndpointToUfoAirport","isNewFlightCardStyleTest","showSpecialOfferBadge","isBoundAirDiscount","preselectFareFamily","preselectedBoundId$","preselectedBoundId","isPreSelected","setPreselectedBoundId","resetPreselectedBoundId","getItinerary","AirBoundsBoundSelectionComponent_ng_container_0_Template","AirBoundsBoundSelectionComponent_ng_template_2_Template","boundObs_r4","i_r5","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_ng_container_6_div_1_span_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_ng_container_6_div_1_span_2_Template","otherBoundsList_r6","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_ng_container_6_div_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_ng_container_6_li_5_Template","otherBoundsList$","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_li_4_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_ng_container_6_Template","bestBoundsList$","boundObs_r11","i_r12","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_template_3_li_3_Template","allBoundsList$","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_template_3_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_ng_container_5_Template","allSortedBounds_r14","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_ng_container_0_Template","OptimizedAirBoundsBoundSelectionListComponent","AY_FLIGHTS_SIZE","AY_FLIGHTS_CODE","MAX_SPECIAL_OFFERS","lastRequestParams$","openedBound$","distinctUntilKeyChanged","boundIndex","getCabinClassesForBounds","travelClasses$","outboundsResult","selectedSortBy","fastestSortKey","currentBoundGroupsLowestPrice","numericPrice","specialOffers$","openedBoundId","specialOffers","ayBounds","slice","directBounds","cheapestBoundList","generateBoundInfo","bestbounds","bestboundsIds","cabinClassModal","CabinClassModalComponent","OptimizedAirBoundsBoundSelectionListComponent_ng_container_19_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_21_Template","tmp_14_0","boundResults_r15","ALERT","contentUrl$","notEligibleContentUrl$","cabinUpgradeCell_r5","premiumEconomySeats","index_r4","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_table_5_ng_container_13_td_6_Template","isLast_r6","showPremiumEconomy$","businessSeats","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_table_5_th_8_Template","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_table_5_ng_container_13_Template","flights_r7","waitContentUrl$","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_cms_unstyled_fragment_1_Template","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_fcom_notification_3_Template","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_table_5_Template","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_div_6_Template","seatsOrWaitlistAvailable$","hasPartnerOrDomestic$","hasWaitlisted$","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_ng_container_1_Template","upgradeFlights$","loading_r8","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_ng_container_1_Template","eligible$","notEligible_r9","ItineraryUpgradeAvailabilityComponent_ng_template_3_ng_container_0_Template","profileTier$","notLoggedIn_r10","login","LARGE","ItineraryUpgradeAvailabilityComponent_ng_template_7_fcom_notification_0_Template","ItineraryUpgradeAvailabilityComponent_ng_template_7_fcom_notification_2_Template","tiersForUpgrade","isBusinessOnly$","cabin_r15","CLOSE_DELETE_OUTLINE","flight_r13","domestic","finnairFlight","tooCloseToDeparture","tooCloseToWaitlist","availableSeats_r14","TIME_ZONE","ItineraryUpgradeAvailabilityComponent_ng_template_11_ng_template_2_fcom_icon_0_Template","ItineraryUpgradeAvailabilityComponent_ng_template_11_ng_template_2_fcom_icon_1_Template","ItineraryUpgradeAvailabilityComponent_ng_template_11_ng_container_1_Template","ItineraryUpgradeAvailabilityComponent_ng_template_11_ng_template_2_Template","available_r16","economyOnly","seats_r18","ItineraryUpgradeAvailabilityComponent","offersSeatService","loginClicked","GOLD","LUMO","PLATINUM","displayError$","CUTOFF_HOURS_WAITLIST","CUTOFF_HOURS_HEL","CUTOFF_HOURS_SHORT_HAUL","CUTOFF_HOURS_LONG_HAUL","fetchFlights","detailedFlights","toRequest","boardPoint","offPoint","departureDateTimeLocal","flightCarrierCode","flightNumberWithoutCode","segmentInformation","retryWithBackoff","segmentSeatInfo","flightsWithAvailability","seatInfo","upgradeClass","seatsAvailable","businessTotal","sum","premiumTotal","contentUrlForFragment","enableUpgradeAvailabilityPremiumEconomyInBooking","boundFlights","selectMultiCitySelectedItineraryDetails","outItinerary","inItinerary","multicityBounds","selectedOpened","it","FinnairItineraryItemType","FLIGHT","isEmpty","countryLocations","isShortHaulCountry","flightTooCloseToDeparture","isFinnairNorraOrWetLease","classesForSegments","millis","MILLIS_IN_HOUR","businessOnly","upgradeFlights","waitlisted","cutoffHours","parseInt","ItineraryUpgradeAvailabilityComponent_fcom_notification_1_Template","ItineraryUpgradeAvailabilityComponent_ng_template_3_Template","ItineraryUpgradeAvailabilityComponent_ng_template_5_Template","ItineraryUpgradeAvailabilityComponent_ng_template_7_Template","ItineraryUpgradeAvailabilityComponent_ng_template_9_Template","ItineraryUpgradeAvailabilityComponent_ng_template_11_Template","availabilityForTier_r19","showKoreaNotification","contentCollection$","aspectRatio$","SuperLightWarningModalComponent","confirm","SuperLightWarningModalComponent_div_2_Template","tmp_0_0","TicketSelectionModule","BookingOfferListService","BookingMultiCityService","BookingAirBoundsService","MediaQueryService","UpgradeAvailabilityService","CommonServiceFormsModule","LoginModule","i13","i14","i15","i16","i17","i18","i19","i20","i21","availableCabins$","MultiCityFareFamilyComponent","bookingMultiCityService","continueToMultiCityBounds","selectMultiCityAvailableFareFamilies","selectMultiCityFareFamiliesPerCabin","getCabinForFareFamily","fareBasisCode","isStartingFromPrice","currency$","selectMultiCityCurrency","selectedBounds$","selectMultiCitySelectedBounds","isAllShortHaul$","availableCabins","continueWithSelection","sendSelectedFareFamilySelection","flightSearch$","currency","multi","fareFamilyName","travelClass","combineFlightDates","combineOriginDestination","stage","multicityFareFamilySelection","MultiCityFareFamilyComponent_fin_cabin_class_modal_11_Template","priceDifference$","defaultPrice$","checkboxChange","MultiCityFareFamilySelectorComponent_label_0_ng_container_22_Template","MultiCityFareFamilySelectorComponent_label_0_ng_container_24_Template","fareFamily_r3","isChecked$","CHECKMARK_BUTTON_SELECTED","CHECKMARK_BUTTON_UNSELECTED","MultiCityFareFamilySelectorComponent","fareFamily$","basePrice$","basePrice","MultiCityFareFamilySelectorComponent_label_0_Template","MultiCityJourneyPriceComponent","resetSelection","changeTicketTypeModalOpen","openResetWarningModal","expand_r2","isOpen$","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_10_fcom_notification_1_ng_container_3_span_1_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_10_fcom_notification_1_ng_container_3_span_2_Template","priorityServicesAvailable_r6","offerIndex_r7","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_10_fcom_notification_1_ng_container_3_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_10_fcom_notification_1_Template","hasBusLeg_r8","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_12_Conditional_1_Template","hasTrainSegment_r9","itinerary_r10","offer_r5","openViewDetails","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_ng_container_3_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_ng_container_4_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_ng_container_5_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_ng_container_6_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_fcom_link_7_Template","boundInfo_r12","FIRST","tmp_21_0","itineraryId","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_ng_container_1_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_ng_container_1_Template","itineraryWithDifferentCabinClass","trackByFunction","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_fcom_notification_15_span_1_span_3_Template","note_r13","last_r14","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_fcom_notification_15_span_1_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_10_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_12_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_ng_container_14_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_fcom_notification_15_Template","city","airportCode","airport","tails","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_ng_container_12_Template","clickUniqueItinerary","last_r15","boundInfo","cheapestMatchingOffer$","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_div_1_Template","currentBoundOffers_r16","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_14_Template","MultiCityBoundsComponent_ng_container_0_div_8_ng_container_16_Template","currentBound_r17","amountOfBounds$","PENDING_MORE_FLIGHTS","_r19","boundDetails_r20","MultiCityBoundsComponent_ng_container_0_fcom_tabs_13_fin_itinerary_upgrade_availability_13_Template","resetToBound","MultiCityBoundsComponent_ng_container_0_div_8_Template","onModalClose","MultiCityBoundsComponent_ng_container_0_fcom_tabs_13_Template","offersPerBound$","currentBoundDetails$","MultiCityBoundsComponent","continueToNextBound","selectMultiCityOffers","selectedItinerary$","selectMultiCitySelectedItinerary","getOffersPerBounds","getCurrency","currentBound$","_bound","selectMultiCitySelectedFareFamily","selectedOffer","matchingOffers$","hasCorrectItinerary","hasCorrectFareFamily","offerItems","fareFamilyCodePerBound","findCheapestOffer","cheapestOffer","findMoreFlights","matchingOffers","fetchMultiCityMoreFlights","getGtmMulticityOffertSelectionData","multicityOfferSelection","MultiCityBoundsComponent_ng_container_0_Template","expandOpen","MultiCityViewComponent_ng_container_2_div_1_li_15_Template","flights_r5","continueToBoundsStep","step$","MultiCityViewComponent_ng_container_2_div_1_Template","MultiCityViewComponent_ng_container_2_fin_multi_city_fare_family_3_Template","MultiCityViewComponent_ng_container_2_fin_multi_city_bounds_5_Template","MultiCityStep","FARE_FAMILY","onTryAgain","title_r9","content_r10","MultiCityViewComponent_ng_container_7_ng_container_1_ng_container_1_Template","informBlock_r11","MultiCityViewComponent_ng_container_7_ng_container_2_ng_container_1_Template","MultiCityViewComponent_ng_container_7_ng_container_1_Template","MultiCityViewComponent_ng_container_7_ng_container_2_Template","status_r12","NO_OFFERS","BOUND_1","BOUND_2","BOUND_3","BOUND_4","BOUND_5","BOUND_6","MultiCityViewComponent","selectMultiCity","selectMultiCityAmountOfBounds","availableFareFamilies","fareFamilyCodesByBookingClass","detail","lowerCaseBookingClass","economy","ecopremium","business","multicityTicketTypeOptions","amountOfBounds","selectOffer","setMultiCitySelectedItinerary","MultiCityViewComponent_div_0_Template","MultiCityViewComponent_ng_container_2_Template","MultiCityViewComponent_ng_template_5_Template","MultiCityViewComponent_ng_container_7_Template","fetchParams$","selectionPhaseChanged","fetchOffers","getPreSelectionParams","selectedFlightsAndFareFamily","BookingTicketSelectionRouteComponent","bookingOfferListService","paramsAndLocaleToOfferListFetchParams","useFpp$","locationRouteCffData","setRouteType","fpp","updateBookingSearchParameters","getLocationsFromFlights","isMultiCity$","useFpp","isLoginStatusChanged","fetchMultiCityOffers","triggerFetchBounds","triggerFetchOffers","ond","setTripType","setFlightsFromLocationsCodes","setActiveTab","WidgetTab","go","BookingTicketSelectionRouteComponent_Conditional_0_Template","BookingTicketSelectionRouteComponent_Conditional_3_Template","BookingTicketSelectionRouteComponent_Conditional_4_Template","ErrorRouteGuard","errorParams","iconName","subtitle","cta","ctaAction","then","skipLocationChange","catch","Promise","reject","bookingRoutes","component","BookingGuard","createRoute","ERROR_ROUTE","ErrorComponent","PAYMENT_ERROR","BookingRoutesModule","NavigationModule","RouterModule","forChild","BookingModule","BookingCartService","BookingService","CommonBookingAncillaryService","BookingQueueService","FragmentService","NavigationTriggerModule","HeadersModule","LocationsModule","BookingSummaryModule","ApiConfiguration","oneUpgradeRootUrl","upgradeApiGwKey","sigv4","uid","HASH_UNDEFINED","funcTag","genTag","reIsHostCtor","freeGlobal","global","freeSelf","self","root","Function","arrayProto","prototype","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","hasOwnProperty","objectToString","reIsNative","call","getNative","nativeCreate","Hash","clear","ListCache","MapCache","assocIndexOf","eq","getMapData","__data__","isKeyable","object","baseIsNative","isObject","isMasked","func","isFunction","tag","isHostObject","toSource","resolver","TypeError","memoized","args","arguments","apply","cache","has","Cache","other","hashClear","delete","hashDelete","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","mapCacheClear","string","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","module","exports","ErrorCode","TIMEOUT","SAMELOCATION","NOTFOUND","httpClient","officeId","getUpgradeAvailability","apiUrl","upgradeAvailabilityUrl","formatDate","response","avail","list_flight","err","localYear","pad","localMonth","localDay"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/modules/one-upgrade/api/request-builder.ts","./src/modules/one-upgrade/api/services/offers-seat.service.ts","./src/modules/booking/modules/ancillaries/services/ancillaries.guard.ts","./src/modules/booking/components/booking-notification/booking-notification.module.ts","./src/modules/one-upgrade/api/base-service.ts","./src/modules/booking/modules/ancillaries/ancillaries.module.ts","./src/modules/common/datacloud/datacloud.module.ts","./src/modules/booking/store/reducers/booking.reducer.ts","./src/modules/booking/store/reducers/cart.reducer.ts","./src/modules/booking/store/reducers/offers.reducer.ts","./src/modules/booking/store/reducers/bounds.reducer.ts","./src/modules/booking/store/reducers/multi-city.reducer.ts","./src/modules/booking/store/reducers/pax-details.reducer.ts","./src/modules/booking/store/metareducers/verify-cart-initial-state.meta-reducer.ts","./src/modules/booking/store/booking.store.module.ts","./src/modules/booking/modules/purchase-checkout/services/purchase-checkout.guard.ts","./src/modules/booking/modules/purchase-checkout/purchase-checkout.module.ts","./src/modules/booking/modules/purchase-checkout/routes/purchase-checkout-route.component.ts","./src/modules/booking/modules/purchase-checkout/routes/purchase-checkout-route.component.html","./src/modules/booking/components/booking-notification/booking-notification.component.html","./src/modules/booking/components/booking-notification/booking-notification.component.ts","./src/modules/booking/modules/ancillaries/components/smp/smp.component.html","./src/modules/booking/modules/ancillaries/components/smp/smp.component.ts","./src/modules/booking/modules/ancillaries/components/ancillaries.component.ts","./src/modules/booking/modules/ancillaries/components/ancillaries.component.html","./src/modules/booking/modules/ancillaries/routes/booking-ancillaries-route.component.ts","./src/modules/booking/modules/ancillaries/routes/booking-ancillaries-route.component.html","./src/modules/booking/services/booking-gtm.service.ts","./node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/src/internal/operators/bufferCount.ts","./src/modules/booking/components/booking-routing/booking-routing.component.html","./src/modules/booking/components/booking-routing/booking-routing.component.ts","./src/modules/booking/modules/entry/entry.module.ts","./src/modules/booking/modules/entry/routes/booking-entry-route.component.ts","./src/modules/booking/modules/pax-details/services/pax-details.guard.ts","./src/modules/booking/modules/pax-details/pax-details.module.ts","./src/modules/booking/modules/pax-details/constants.ts","./src/modules/booking/modules/pax-details/components/pax-details-marketing-consent/pax-details-marketing-consent.component.html","./src/modules/booking/modules/pax-details/components/pax-details-marketing-consent/pax-details-marketing-consent.component.ts","./src/modules/booking/modules/pax-details/components/pax-ancillary-product/pax-ancillary-product.component.html","./src/modules/booking/modules/pax-details/components/pax-ancillary-product/pax-ancillary-product.component.ts","./src/modules/booking/modules/pax-details/components/pax-ancillaries/pax-ancillaries.component.html","./src/modules/booking/modules/pax-details/components/pax-ancillaries/pax-ancillaries.component.ts","./src/modules/booking/modules/pax-details/components/pax-shortcut-to-pay/pax-shortcut-to-pay.component.html","./src/modules/booking/modules/pax-details/components/pax-shortcut-to-pay/pax-shortcut-to-pay.component.ts","./src/modules/booking/modules/pax-details/components/pax-details-form.component.html","./src/modules/booking/modules/pax-details/components/pax-details-form.component.ts","./src/modules/common-booking/store/selectors/upgrade-offer.selector.ts","./src/modules/booking/modules/pax-details/components/upgrade-promotion/upgrade-promotion-modal.component.html","./src/modules/booking/modules/pax-details/components/upgrade-promotion/upgrade-promotion-modal.component.ts","./src/modules/booking/modules/pax-details/components/upgrade-promotion/upgrade-promotion.component.html","./src/modules/booking/modules/pax-details/components/upgrade-promotion/upgrade-promotion.component.ts","./src/modules/booking/modules/pax-details/components/pax-details.component.html","./src/modules/booking/modules/pax-details/components/pax-details.component.ts","./src/modules/booking/modules/pax-details/components/korea-notification.component.html","./src/modules/booking/modules/pax-details/components/korea-notification.component.ts","./src/modules/booking/modules/pax-details/routes/booking-pax-details-route.component.html","./src/modules/booking/modules/pax-details/routes/booking-pax-details-route.component.ts","./src/modules/booking/modules/purchase-review/services/purchase-review.guard.ts","./src/modules/booking/modules/purchase-review/purchase-review.module.ts","./src/modules/common-booking/utils/flight.utils.ts","./src/modules/common-booking/utils/bound.utils.ts","./src/modules/booking/modules/purchase-review/components/purchase-review-fare-rules/purchase-review-fare-rules.component.html","./src/modules/booking/modules/purchase-review/components/purchase-review-fare-rules/purchase-review-fare-rules.component.ts","./src/modules/booking/modules/purchase-review/components/saf-contribution-product/saf-contribution-product.component.html","./src/modules/booking/modules/purchase-review/components/saf-contribution-product/saf-contribution-product.component.ts","./src/modules/booking/modules/purchase-review/components/purchase-review/purchase-review.component.html","./src/modules/booking/modules/purchase-review/components/purchase-review/purchase-review.component.ts","./src/modules/booking/modules/purchase-review/routes/booking-purchase-review-route.component.ts","./src/modules/booking/modules/purchase-review/routes/booking-purchase-review-route.component.html","./src/modules/booking/modules/purchase-success/services/purchase-success.guard.ts","./src/modules/booking/modules/purchase-success/purchase-success.module.ts","./src/modules/booking/modules/purchase-success/components/purchase-success/purchase-success.component.html","./src/modules/booking/modules/purchase-success/components/purchase-success/purchase-success.component.ts","./src/modules/booking/modules/purchase-success/routes/booking-purchase-success-route.component.ts","./src/modules/booking/modules/purchase-success/routes/booking-purchase-success-route.component.html","./src/modules/booking/modules/ticket-selection/services/ticket-selection.guard.ts","./src/modules/booking/modules/ticket-selection/services/dimensions-and-details-modal.service.ts","./src/modules/booking/modules/ticket-selection/components/booking-ticket-selection-view.component.html","./src/modules/booking/modules/ticket-selection/components/booking-ticket-selection-view.component.ts","./src/modules/booking/modules/ticket-selection/components/offers/offer-farefamilies.component.html","./src/modules/booking/modules/ticket-selection/components/offers/offer-farefamilies.component.ts","./src/modules/common/pipes/join.pipe.ts","./src/modules/booking/modules/ticket-selection/components/offers/bound-selection-list.component.html","./src/modules/booking/modules/ticket-selection/components/offers/bound-selection-list.component.ts","./src/modules/common/pipes/format-passenger.pipe.ts","./src/modules/booking/modules/ticket-selection/components/offers/ticket-selection-header.component.html","./src/modules/booking/modules/ticket-selection/components/offers/ticket-selection-header.component.ts","./src/modules/booking/modules/ticket-selection/components/air-bounds-booking-ticket-selection-view.component.html","./src/modules/booking/modules/ticket-selection/components/air-bounds-booking-ticket-selection-view.component.ts","./src/modules/booking/modules/ticket-selection/components/air-bounds/fare-family-option-list.component.html","./src/modules/booking/modules/ticket-selection/components/air-bounds/fare-family-option-list.component.ts","./src/modules/booking/modules/ticket-selection/components/air-bounds/bound-selection.component.html","./src/modules/booking/modules/ticket-selection/components/air-bounds/bound-selection.component.ts","./src/modules/booking/modules/ticket-selection/components/air-bounds/optimize-bound-selection-list.component.html","./src/modules/booking/modules/ticket-selection/components/air-bounds/optimize-bound-selection-list.component.ts","./src/modules/booking/modules/ticket-selection/components/itinerary-upgrade-availability/itinerary-upgrade-availability.component.html","./src/modules/booking/modules/ticket-selection/components/itinerary-upgrade-availability/itinerary-upgrade-availability.component.ts","./src/modules/booking/modules/ticket-selection/components/air-bounds/super-light-warning-modal/super-light-warning-modal.component.html","./src/modules/booking/modules/ticket-selection/components/air-bounds/super-light-warning-modal/super-light-warning-modal.component.ts","./src/modules/booking/modules/ticket-selection/ticket-selection.module.ts","./src/modules/booking/modules/ticket-selection/components/multi-city-fare-family/multi-city-fare-family.component.html","./src/modules/booking/modules/ticket-selection/components/multi-city-fare-family/multi-city-fare-family.component.ts","./src/modules/booking/modules/ticket-selection/components/multi-city-fare-family-selector/multi-city-fare-family-selector.component.html","./src/modules/booking/modules/ticket-selection/components/multi-city-fare-family-selector/multi-city-fare-family-selector.component.ts","./src/modules/booking/modules/ticket-selection/components/multi-city-journey-price/multi-city-journey-price.component.ts","./src/modules/booking/modules/ticket-selection/components/multi-city-journey-price/multi-city-journey-price.component.html","./src/modules/booking/modules/ticket-selection/components/multi-city-bounds/multi-city-bounds.component.html","./src/modules/booking/modules/ticket-selection/components/multi-city-bounds/multi-city-bounds.component.ts","./src/modules/booking/modules/ticket-selection/components/multi-city-view/multi-city-view.component.html","./src/modules/booking/modules/ticket-selection/components/multi-city-view/multi-city-view.component.ts","./src/modules/booking/modules/ticket-selection/routes/booking-ticket-selection-route.component.html","./src/modules/booking/modules/ticket-selection/routes/booking-ticket-selection-route.component.ts","./src/modules/booking/services/error-route.guard.ts","./src/modules/booking/booking.routes.ts","./src/modules/booking/booking.module.ts","./src/modules/one-upgrade/api/api-configuration.ts","./node_modules/.pnpm/lodash.memoize@4.1.2/node_modules/lodash.memoize/index.js","./src/modules/loyalty-plus/services/upgrade-availability.service.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 { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { CanActivate } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\n\nimport { snapshot } from '@fcom/rx';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState } from '@fcom/common/interfaces/booking/booking-state.interface';\n\nimport { BookingService } from '../../../services';\nimport { isAncillariesSkipped, isCartInErrorStateOrDoWeHaveTravelers } from '../../../utils';\nimport { cartData, cartStatus } from '../../../store/selectors';\n\n@Injectable()\nexport class AncillariesGuard implements CanActivate {\n constructor(\n private store$: Store,\n private bookingService: BookingService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate() {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n const currentCartData = snapshot(this.store$.pipe(cartData()));\n const currentCartStatus = snapshot(this.store$.pipe(cartStatus()));\n\n const canAccess: boolean = isCartInErrorStateOrDoWeHaveTravelers(currentCartData, currentCartStatus, false);\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.PAXDETAILS });\n }\n\n if (isAncillariesSkipped(snapshot(this.store$.pipe(cartData())))) {\n this.bookingService.setStep({ step: BOOKING_STEPS.PURCHASE_REVIEW });\n }\n\n return canAccess;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { UiComponentsModule } from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { PipesModule } from '@fcom/common/pipes';\nimport { ComponentsModule } from '@fcom/common/components';\n\nimport { BookingNotificationComponent } from './booking-notification.component';\n\n@NgModule({\n imports: [CommonModule, PipesModule, UiTranslateModule, UiComponentsModule, ComponentsModule],\n declarations: [BookingNotificationComponent],\n exports: [BookingNotificationComponent],\n providers: [],\n})\nexport class BookingNotificationModule {}\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","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport {\n ButtonModule,\n DrawerModule,\n IconsModule,\n ModalModule,\n NotificationsModule,\n ProductsModule,\n UiComponentsModule,\n} from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { CmsModule } from '@fcom/cms/components';\nimport { TabsModule } from '@fcom/common-booking/modules/tabs';\nimport { ComponentsModule } from '@fcom/common/components/components.module';\nimport { DirectiveModule } from '@fcom/common/directives/directive.module';\nimport { FinFormsModule } from '@fcom/common/forms';\nimport { GtmModule } from '@fcom/common/gtm/gtm.module';\nimport { PipesModule } from '@fcom/common/pipes/pipes.module';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/components';\nimport { CommonBookingAncillariesModule } from '@fcom/common-booking/modules';\nimport { AncillarySubviewModule } from '@fcom/common-booking/modules/ancillaries/components/ancillary-subview/ancillary-subview.module';\n\nimport { BookingNotificationModule } from '../../components/booking-notification/booking-notification.module';\nimport { AncillaryService } from './services/ancillary.service';\nimport { AncillariesGuard } from './services/ancillaries.guard';\nimport { BookingAncillariesRouteComponent } from './routes/booking-ancillaries-route.component';\nimport { SmpComponent } from './components/smp/smp.component';\nimport { AncillariesComponent } from './components/ancillaries.component';\nimport { BookingCommonModule } from '../common/booking-common.module';\n\n@NgModule({\n imports: [\n BookingCommonModule,\n CommonModule,\n ComponentsModule,\n CommonBookingComponentsModule,\n CommonBookingAncillariesModule,\n DirectiveModule,\n GtmModule,\n PipesModule,\n TabsModule,\n CmsModule,\n FinFormsModule,\n AncillarySubviewModule,\n UiTranslateModule,\n ButtonModule,\n IconsModule,\n ModalModule,\n DrawerModule,\n ProductsModule,\n NotificationsModule,\n UiComponentsModule,\n BookingNotificationModule,\n ],\n declarations: [AncillariesComponent, BookingAncillariesRouteComponent, SmpComponent],\n providers: [AncillaryService, AncillariesGuard],\n})\nexport class AncillariesModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [],\n exports: [],\n})\nexport class DataCloudModule {}\n","import { union } from '@ngrx/store';\n\nimport { PaymentActions } from '@fcom/common-booking';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingState } from '@fcom/common/interfaces/booking';\nimport { setIn } from '@fcom/core/utils';\n\nimport { BookingActions } from '../actions';\n\n// TODO: could the step be moved to the BookingService and this whole state handling removed?\nexport const initialState: BookingState = {\n step: BOOKING_STEPS.ENTRY,\n};\n\nconst all = union({ setPaymentStatus: PaymentActions.setPaymentStatus });\ntype ExtraActions = typeof all;\n\nexport function bookingReducer(state = initialState, action: BookingActions.ActionsUnion | ExtraActions): BookingState {\n switch (action.type) {\n case BookingActions.reset.type:\n return initialState;\n\n case BookingActions.setStep.type:\n return setIn(state, 'step', action.step);\n\n default:\n return state;\n }\n}\n","import { union } from '@ngrx/store';\n\nimport { GlobalActions } from '@fcom/core/actions';\nimport { CartPartStatus, CartState, CartStatus, UpdatingCartPart } from '@fcom/dapi';\nimport { DataUtils, setIn } from '@fcom/core/utils';\nimport { FinnairCart } from '@fcom/dapi/api/models';\nimport { GlobalBookingActions } from '@fcom/common/store';\nimport { SeatMapActions, ServicesActions } from '@fcom/common-booking/store';\n\nimport { BookingActions, CartActions, OffersActions } from '../actions';\n\nexport const initialState: CartState = Object.seal({\n cartStatus: CartStatus.INITIAL,\n dirty: false,\n fareRules: {},\n});\n\n// Extra type safety to make sure assigned constants are valid keys\ntype CartStateKey = T extends keyof CartState ? T : never;\n\nconst CART_STATUS: CartStateKey<'cartStatus'> = 'cartStatus';\nconst CART_URL: CartStateKey<'cartUrl'> = 'cartUrl';\nconst CART_DATA: CartStateKey<'cartData'> = 'cartData';\nconst IS_UPDATING: CartStateKey<'isUpdating'> = 'isUpdating';\nconst DIRTY: CartStateKey<'dirty'> = 'dirty';\nconst ACCEPT_TERMS: CartStateKey<'acceptTerms'> = 'acceptTerms';\n\nconst generateCartPartId = (cartData: FinnairCart, cartPartId: string) => {\n return `${cartData?.id}-${cartPartId}`;\n};\n\nconst setCartPartStates = (state: CartState, newStatus: CartPartStatus, partIds: string[] = []) =>\n DataUtils.wrap(state)\n .updateIn(IS_UPDATING, (updatingState: UpdatingCartPart = {}) =>\n partIds.reduce(\n (acc: UpdatingCartPart, cur: string) => setIn(acc, generateCartPartId(state.cartData, cur), newStatus),\n updatingState\n )\n )\n .value();\n\nconst all = union({\n clearSelections: SeatMapActions.clearSelections,\n setCartData: CartActions.setCartData,\n setFlights: GlobalBookingActions.setFlights,\n updateFlights: GlobalBookingActions.updateFlight,\n setPaxAmount: GlobalBookingActions.setPaxAmount,\n increasePaxAmountField: GlobalBookingActions.increasePaxAmountField,\n decreasePaxAmountField: GlobalBookingActions.decreasePaxAmountField,\n setTravelType: BookingActions.setTravelType,\n selectTravelClass: BookingActions.selectTravelClass,\n confirmation: GlobalActions.confirmation,\n startLoading: OffersActions.startLoading,\n setInboundId: OffersActions.setInboundId,\n setInboundFareFamily: OffersActions.setInboundFareFamily,\n setOutboundId: OffersActions.setOutboundId,\n setOutboundFareFamily: OffersActions.setOutboundFareFamily,\n setSeatMap: SeatMapActions.setSeatMap,\n setSeatForFlight: SeatMapActions.setSeatForFlight,\n setSelectionsForFragment: ServicesActions.setSelectionsForFragment,\n setSelectionForFragmentForTraveler: ServicesActions.setSelectionForFragmentForTraveler,\n setCoverForId: ServicesActions.setCoverForId,\n});\n\ntype ExtraActions = typeof all;\n\n// eslint-disable-next-line complexity\nexport function cartReducer(state = initialState, action: CartActions.ActionsUnion | ExtraActions): CartState {\n switch (action.type) {\n case GlobalBookingActions.setFlights.type:\n case GlobalBookingActions.updateFlight.type:\n case GlobalBookingActions.setPaxAmount.type:\n case GlobalBookingActions.increasePaxAmountField.type:\n case GlobalBookingActions.decreasePaxAmountField.type:\n case BookingActions.setTravelType.type: // @todo Do we need to fix this, as we moved setTravelType from the booking to the globalBooking store?\n case BookingActions.selectTravelClass.type: // @todo Do we need to fix this, as we moved selectTravelClass from the booking to the globalBooking store?\n case OffersActions.setOutboundId.type:\n case OffersActions.setOutboundFareFamily.type:\n case OffersActions.setInboundId.type:\n case OffersActions.setInboundFareFamily.type:\n case CartActions.reset.type:\n return initialState;\n case CartActions.creationStart.type:\n return DataUtils.wrap(state)\n .setIn(CART_STATUS, CartStatus.PENDING_CREATION)\n .deleteIn(CART_URL)\n .deleteIn(CART_DATA)\n .value();\n\n case CartActions.creationSuccess.type:\n return DataUtils.wrap(state)\n .setIn(CART_STATUS, CartStatus.CREATION_SUCCESS)\n .setIn(CART_URL, action.cartUrl)\n .deleteIn(ACCEPT_TERMS)\n .value();\n\n case CartActions.creationError.type:\n return setIn(state, CART_STATUS, CartStatus.CREATION_ERROR);\n\n case CartActions.loadStart.type:\n return setIn(state, CART_STATUS, CartStatus.PENDING);\n case CartActions.loadError.type:\n return setIn(state, CART_STATUS, CartStatus.LOAD_ERROR);\n\n case CartActions.updateStart.type:\n return setIn(state, CART_STATUS, CartStatus.PENDING);\n case CartActions.updateError.type:\n return setIn(state, CART_STATUS, CartStatus.LOAD_ERROR);\n case CartActions.updateNotCompleted.type:\n return setIn(state, CART_STATUS, CartStatus.OK);\n\n case CartActions.setCartData.type:\n return DataUtils.wrap(state)\n .setIn(CART_DATA, action.cartData)\n .setIn(CART_STATUS, CartStatus.OK)\n .setIn(DIRTY, false)\n .deleteIn(ACCEPT_TERMS)\n .value();\n\n case CartActions.isUpdatingPartialCart.type:\n return setCartPartStates(\n state,\n CartPartStatus.UPDATING,\n Array.isArray(action.cartPartIds) ? action.cartPartIds : [action.cartPartIds]\n );\n case CartActions.errorUpdatingPartialCart.type:\n return setCartPartStates(\n state,\n CartPartStatus.ERROR,\n Array.isArray(action.cartPartIds) ? action.cartPartIds : [action.cartPartIds]\n );\n case CartActions.clearUpdatingPartialCart.type:\n return setCartPartStates(\n state,\n CartPartStatus.OK,\n Array.isArray(action.cartPartIds) ? action.cartPartIds : [action.cartPartIds]\n );\n case CartActions.acceptTerms.type:\n return setIn(state, ACCEPT_TERMS, true);\n\n // Setting services to dirty\n case SeatMapActions.setSeatForFlight.type:\n case SeatMapActions.clearSelections.type:\n case ServicesActions.setSelectionsForFragment.type:\n case ServicesActions.setCoverForId.type:\n case ServicesActions.setSelectionForFragmentForTraveler.type:\n return setIn(state, DIRTY, true);\n\n case CartActions.fareRulesLoadStart.type:\n return {\n ...state,\n fareRules: {\n ...(state.fareRules || {}),\n [action.travelerId]: {\n ...(state.fareRules?.[action.travelerId] || { hasError: [], ticketRules: {} }),\n isLoading: [...(state.fareRules?.[action.travelerId]?.isLoading || []), action.category],\n },\n },\n };\n\n case CartActions.fareRulesLoadEnd.type:\n return {\n ...state,\n fareRules: {\n ...state.fareRules,\n [action.travelerId]: {\n ...(state.fareRules?.[action.travelerId] || { hasError: [], ticketRules: {} }),\n isLoading: (state.fareRules?.[action.travelerId]?.isLoading || []).filter((c) => c !== action.category),\n },\n },\n };\n\n case CartActions.fareRulesError.type:\n return {\n ...state,\n fareRules: {\n ...state.fareRules,\n [action.travelerId]: {\n ...(state.fareRules?.[action.travelerId] || { isLoading: [], ticketRules: {} }),\n hasError: [...(state.fareRules?.[action.travelerId]?.hasError || []), action.category],\n },\n },\n };\n\n case CartActions.fareRulesCreateCategories.type:\n return {\n ...state,\n fareRules: {\n ...state.fareRules,\n [action.travelerId]: {\n ...(state.fareRules?.[action.travelerId] || { isLoading: [], hasError: [] }),\n ticketRules: {\n ...(state.fareRules?.[action.travelerId]?.ticketRules || {}),\n ...action.rules,\n },\n },\n },\n };\n\n case CartActions.fareRulesClear.type:\n return {\n ...state,\n fareRules: {},\n };\n\n // Reset cart when back to offer\n case OffersActions.startLoading.type:\n return initialState;\n default:\n return state;\n }\n}\n","import { GlobalActions } from '@fcom/core/actions';\nimport { DataUtils, setIn } from '@fcom/core/utils';\nimport { GlobalBookingActions } from '@fcom/common/store';\nimport { SortBy } from '@fcom/common-booking';\nimport { defaultFilterValues } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport { leaveError } from '@fcom/common/store/actions/error.actions';\nimport { AirOffersState, AirOffersStatus } from '@fcom/common/interfaces/booking/air-offers-state.interface';\n\nimport { BookingActions, OffersActions } from '../actions';\n\nexport const initialState: AirOffersState = Object.seal({\n status: AirOffersStatus.INITIAL,\n currentOffers: undefined,\n selectedOutboundId: undefined,\n selectedOutboundFareFamilyCode: undefined,\n selectedInboundId: undefined,\n selectedInboundFareFamilyCode: undefined,\n sortBy: SortBy.DURATION,\n filters: {\n stopsCount: defaultFilterValues.defaultStopsOption,\n cabin: defaultFilterValues.defaultTravelClass,\n arrivalTime: [...defaultFilterValues.defaultTimeOptions],\n departureTime: [...defaultFilterValues.defaultTimeOptions],\n },\n multiCity: {\n offers: [],\n airlines: {},\n bounds: {},\n fareFamilies: {},\n hasFlightsInUnitedStates: null,\n locations: {},\n selectedFareFamily: null,\n messages: null,\n status: null,\n surcharges: [],\n selectedItinerary: [],\n hashMap: {},\n },\n});\n\ntype OfferActionsUnionType =\n | OffersActions.ActionsUnion\n | GlobalActions.ActionsUnion\n | BookingActions.ActionsUnion\n | GlobalBookingActions.GlobalBookingActionsUnion\n | typeof leaveError;\n\n// eslint-disable-next-line complexity\nexport function offersReducer(state = initialState, action: OfferActionsUnionType): AirOffersState {\n /* eslint-disable no-fallthrough */\n switch (action.type) {\n case OffersActions.startLoading.type:\n return DataUtils.wrap(initialState)\n .setIn('status', AirOffersStatus.PENDING)\n .setIn('sortBy', state.sortBy)\n .value();\n case OffersActions.success.type:\n return setIn(state, 'status', AirOffersStatus.OK);\n case OffersActions.error.type:\n return setIn(state, 'status', AirOffersStatus.ERROR);\n case OffersActions.invalidInput.type:\n return setIn(state, 'status', AirOffersStatus.INVALID_INPUT);\n case OffersActions.noFlightsFound.type:\n return setIn(state, 'status', AirOffersStatus.NO_FLIGHTS_FOUND);\n case OffersActions.setOffers.type:\n return DataUtils.wrap(state).setIn('currentOffers', action.offers).setIn('status', AirOffersStatus.OK).value();\n case OffersActions.offerSetLastRequestParams.type:\n return setIn(state, 'lastRequestParams', action.params);\n case OffersActions.setOutboundId.type:\n return setIn(state, 'selectedOutboundId', action.outboundId);\n case OffersActions.setOutboundFareFamily.type:\n return setIn(state, 'selectedOutboundFareFamilyCode', action.outboundFareFamily);\n case OffersActions.setInboundId.type:\n return setIn(state, 'selectedInboundId', action.inboundId);\n case OffersActions.setInboundFareFamily.type:\n return setIn(state, 'selectedInboundFareFamilyCode', action.inboundFareFamily);\n case OffersActions.setSortBy.type:\n return setIn(state, 'sortBy', action.sortBy);\n case OffersActions.setArrivalTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n arrivalTime: action.arrivalTime,\n },\n };\n\n case OffersActions.resetArrivalTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n arrivalTime: defaultFilterValues.defaultTimeOptions,\n },\n };\n\n case OffersActions.setDepartureTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n departureTime: action.departureTime,\n },\n };\n\n case OffersActions.resetDepartureTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n departureTime: defaultFilterValues.defaultTimeOptions,\n },\n };\n\n case OffersActions.setStopsCount.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n stopsCount: action.stopsCount,\n },\n };\n\n case OffersActions.resetStopsCount.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n stopsCount: defaultFilterValues.defaultStopsOption,\n },\n };\n\n case OffersActions.setCabin.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n cabin: action.cabin,\n },\n };\n\n case OffersActions.resetCabin.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n cabin: defaultFilterValues.defaultTravelClass,\n },\n };\n\n case OffersActions.resetAllFilters.type: {\n return {\n ...state,\n filters: {\n stopsCount: defaultFilterValues.defaultStopsOption,\n cabin: action.keepCabin ? state.filters.cabin : defaultFilterValues.defaultTravelClass,\n arrivalTime: [...defaultFilterValues.defaultTimeOptions],\n departureTime: [...defaultFilterValues.defaultTimeOptions],\n },\n };\n }\n case leaveError.type:\n case OffersActions.reset.type:\n case BookingActions.setTravelType.type: // @todo do we need this ????\n case BookingActions.selectTravelClass.type: // @todo do we need this ????\n // Clean up offers when order created\n case GlobalActions.confirmation.type:\n return setIn({ ...initialState, lastRequestParams: state.lastRequestParams }, 'sortBy', state.sortBy);\n default:\n return state;\n }\n /* eslint-enable no-fallthrough */\n}\n","import { GlobalActions } from '@fcom/core/actions';\nimport { DataUtils, setIn } from '@fcom/core/utils';\nimport { GlobalBookingActions } from '@fcom/common/store';\nimport { SortBy } from '@fcom/common-booking';\nimport { defaultFilterValues } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport { AirOffersStatus } from '@fcom/common/interfaces/booking/air-offers-state.interface';\nimport { AirBoundsState } from '@fcom/common/interfaces/booking/air-bounds-state.interface';\n\nimport { BookingActions, BoundsActions } from '../actions';\n\nexport const initialState: AirBoundsState = Object.seal({\n status: AirOffersStatus.INITIAL,\n outbounds: undefined,\n inbounds: undefined,\n selectedOutboundAirBoundId: undefined,\n selectedInboundAirBoundId: undefined,\n sortBy: SortBy.DURATION,\n filters: {\n stopsCount: defaultFilterValues.defaultStopsOption,\n refundable: defaultFilterValues.defaultRefundabilityOption,\n cabin: defaultFilterValues.defaultTravelClass,\n arrivalTime: [...defaultFilterValues.defaultTimeOptions],\n departureTime: [...defaultFilterValues.defaultTimeOptions],\n },\n outboundCache: {},\n});\n\ntype BoundActionsUnionType =\n | BoundsActions.ActionsUnion\n | GlobalActions.ActionsUnion\n | BookingActions.ActionsUnion\n | GlobalBookingActions.GlobalBookingActionsUnion;\n\n// eslint-disable-next-line complexity\nexport function boundsReducer(state = initialState, action: BoundActionsUnionType): AirBoundsState {\n /* eslint-disable no-fallthrough */\n switch (action.type) {\n case BoundsActions.startLoadingOutbounds.type:\n return DataUtils.wrap(initialState)\n .setIn('status', AirOffersStatus.PENDING)\n .setIn('sortBy', state.sortBy)\n .setIn('filters', state.filters)\n .setIn('outboundCache', state.outboundCache)\n .value();\n case BoundsActions.startLoadingInbounds.type:\n return DataUtils.wrap(state)\n .setIn('inbounds', undefined)\n .setIn('selectedInboundAirBoundId', undefined)\n .setIn('status', AirOffersStatus.PENDING)\n .value();\n case BoundsActions.success.type:\n return setIn(state, 'status', AirOffersStatus.OK);\n case BoundsActions.error.type:\n return DataUtils.wrap(initialState).setIn('status', AirOffersStatus.ERROR).value();\n case BoundsActions.invalidInput.type:\n return DataUtils.wrap(initialState).setIn('status', AirOffersStatus.INVALID_INPUT).value();\n case BoundsActions.noFlightsFound.type:\n return DataUtils.wrap(initialState).setIn('status', AirOffersStatus.NO_FLIGHTS_FOUND).value();\n\n case BoundsActions.setOutbounds.type:\n return DataUtils.wrap(state).setIn('outbounds', action.bounds).setIn('status', AirOffersStatus.OK).value();\n\n case BoundsActions.setInbounds.type:\n return DataUtils.wrap(state).setIn('inbounds', action.bounds).setIn('status', AirOffersStatus.OK).value();\n\n case BoundsActions.setLastRequestParams.type:\n return setIn(state, 'lastRequestParams', action.params);\n\n case BoundsActions.setOutboundAirBoundId.type: {\n const selectedInboundAirBoundId =\n state.selectedOutboundAirBoundId === action.outboundAirBoundId ? state.selectedInboundAirBoundId : undefined;\n\n const isSelectedCheapestOffer =\n state.outbounds?.boundGroups.some(\n (boundGroup) =>\n boundGroup.fareFamilies.find((fareFamily) => fareFamily.id === action.outboundAirBoundId)?.isCheapestOffer\n ) ?? false;\n\n return {\n ...state,\n selectedOutboundAirBoundId: action.outboundAirBoundId,\n selectedInboundAirBoundId,\n isSelectedCheapestOffer,\n };\n }\n\n case BoundsActions.setInboundAirBoundId.type:\n return setIn(state, 'selectedInboundAirBoundId', action.inboundAirBoundId);\n\n case BoundsActions.setSortBy.type:\n return setIn(state, 'sortBy', action.sortBy);\n case BoundsActions.setArrivalTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n arrivalTime: action.arrivalTime,\n },\n };\n case BoundsActions.resetArrivalTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n arrivalTime: defaultFilterValues.defaultTimeOptions,\n },\n };\n case BoundsActions.setDepartureTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n departureTime: action.departureTime,\n },\n };\n case BoundsActions.resetDepartureTime.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n departureTime: defaultFilterValues.defaultTimeOptions,\n },\n };\n case BoundsActions.setRefundable.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n refundable: action.refundable,\n },\n };\n case BoundsActions.resetRefundable.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n refundable: defaultFilterValues.defaultRefundabilityOption,\n },\n };\n case BoundsActions.setStopsCount.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n stopsCount: action.stopsCount,\n },\n };\n\n case BoundsActions.resetStopsCount.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n stopsCount: defaultFilterValues.defaultStopsOption,\n },\n };\n case BoundsActions.setCabin.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n cabin: action.cabin,\n },\n };\n case BoundsActions.resetCabin.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n cabin: action.cabin || defaultFilterValues.defaultTravelClass,\n },\n };\n case BoundsActions.resetAllFilters.type: {\n return {\n ...state,\n filters: {\n stopsCount: defaultFilterValues.defaultStopsOption,\n refundable: defaultFilterValues.defaultRefundabilityOption,\n cabin: action.keepCabin ? state.filters.cabin : action.defaultCabin || defaultFilterValues.defaultTravelClass,\n arrivalTime: [...defaultFilterValues.defaultTimeOptions],\n departureTime: [...defaultFilterValues.defaultTimeOptions],\n },\n };\n }\n case BoundsActions.reset.type:\n case BookingActions.setTravelType.type: // @todo Do we need to fix this, as we moved setTravelType from the booking to the globalBooking store?\n case BookingActions.selectTravelClass.type: // @todo Do we need to fix this, as we moved selectTravelClass from the booking to the globalBooking store?\n // Clean up bounds when order created\n case GlobalActions.confirmation.type:\n return setIn({ ...initialState, lastRequestParams: state.lastRequestParams }, 'sortBy', state.sortBy);\n case BoundsActions.setOutboundCache.type:\n return {\n ...state,\n outboundCache: {\n ...state.outboundCache,\n [action.hash]: {\n createdAt: action.createdAt,\n results: action.bounds,\n },\n },\n };\n case BoundsActions.resetOutboundCache.type:\n return {\n ...state,\n outboundCache: {},\n };\n default:\n return state;\n }\n /* eslint-enable no-fallthrough */\n}\n","import { MultiCityState, MultiCityStatus } from '@fcom/common/interfaces/booking';\n\nimport * as MultiCityActions from '../actions/multi-city.actions';\n\nexport const initialState: MultiCityState = Object.seal({\n offers: [],\n airlines: {},\n bounds: {},\n fareFamilies: {},\n hasFlightsInUnitedStates: null,\n locations: {},\n selectedFareFamily: null,\n messages: null,\n statusCode: null,\n status: MultiCityStatus.INITIAL,\n surcharges: [],\n selectedItinerary: [],\n hashMap: {},\n requestedMoreFlightOfferIds: [],\n fareFamiliesPerCabin: {},\n});\n\n// eslint-disable-next-line complexity\nexport function multiCityReducer(state = initialState, action: MultiCityActions.ActionsUnion): MultiCityState {\n /* eslint-disable no-fallthrough */\n switch (action.type) {\n case MultiCityActions.setMultiCityOffers.type:\n return {\n ...state,\n ...action.offers,\n };\n case MultiCityActions.addMultiCityOffers.type:\n return {\n ...state,\n offers: [...state.offers, ...(action.offers || [])],\n bounds: {\n ...state.bounds,\n ...(action.bounds || {}),\n },\n locations: {\n ...state.locations,\n ...(action.locations || {}),\n },\n hashMap: {\n ...state.hashMap,\n ...(action.hashMap || {}),\n },\n };\n case MultiCityActions.setMultiCitySelectedItinerary.type:\n return {\n ...state,\n selectedItinerary: action.itinerary,\n };\n case MultiCityActions.addMultiCitySelectedItinerary.type:\n return {\n ...state,\n selectedItinerary: [...state.selectedItinerary, action.itinerary],\n };\n case MultiCityActions.setMultiCitySelectedFareFamily.type:\n return {\n ...state,\n selectedFareFamily: action.fareFamily,\n };\n case MultiCityActions.resetSelections.type:\n return {\n ...state,\n selectedFareFamily: null,\n selectedItinerary: [],\n status: MultiCityStatus.READY,\n };\n case MultiCityActions.reset.type:\n return initialState;\n case MultiCityActions.setStatus.type:\n return {\n ...state,\n status: action.status,\n };\n case MultiCityActions.addRequestedMoreFlightOfferIds.type:\n return {\n ...state,\n requestedMoreFlightOfferIds: [...state.requestedMoreFlightOfferIds, action.offerId],\n };\n default:\n return state;\n }\n}\n","import { createReducer, on } from '@ngrx/store';\n\nimport { GlobalActions } from '@fcom/core/actions';\nimport { DataUtils } from '@fcom/core/utils';\nimport { PaxDetailsState } from '@fcom/common/interfaces/booking';\n\nimport { PaxDetailsActions } from '../actions';\n\nexport const initialState: PaxDetailsState = Object.seal({\n passengers: [],\n additionalEmails: [],\n});\n\nconst reducer = createReducer(\n initialState,\n on(PaxDetailsActions.setPaxDetails, (state, { passengers }) => ({\n ...state,\n passengers,\n })),\n on(PaxDetailsActions.setSinglePaxDetails, (state, { passenger }) => ({\n ...state,\n passengers: state.passengers.map((p) => (p.travelerId === passenger.travelerId ? passenger : p)),\n })),\n on(PaxDetailsActions.setCorporateCode, (state, { corporateCode }) => ({\n ...state,\n corporateCode,\n })),\n on(PaxDetailsActions.setAdditionalEmails, (state, { additionalEmails }) => ({\n ...state,\n additionalEmails,\n })),\n on(PaxDetailsActions.reset, () => initialState),\n on(GlobalActions.confirmation, (state) =>\n DataUtils.wrap(state).deleteIn('corporateCode').setIn(['passengers', 0, 'joinFinnairPlus'], false).value()\n )\n);\n\nexport function paxDetailsReducer(\n state: PaxDetailsState,\n action: PaxDetailsActions.ActionsUnion | GlobalActions.ActionsUnion\n) {\n return reducer(state, action);\n}\n","import { Router } from '@angular/router';\n\nimport { ActionReducer, MetaReducer, UPDATE } from '@ngrx/store';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { CartPartStatus, CartState, UpdatingCartPart } from '@fcom/dapi';\nimport { isNotEmpty, safeMap } from '@fcom/core/utils';\nimport { SentryLogger } from '@fcom/core/services';\n\nimport { navigateToError } from '../../utils/route-utils';\n\n/**\n * During reducer UPDATE check that the current CartState is a coherent one. If not navigate to sorry page.\n * @param router Router to use for navigating\n * @param languageService LanguageService to use\n * @param sentryLogger Logger to use\n * @returns {(reducer: ActionReducer) => ActionReducer}\n */\nexport function verifyCartInitialStateMetaReducer(\n router: Router,\n languageService: LanguageService,\n sentryLogger: SentryLogger\n): MetaReducer {\n let first = true;\n return function (reducer: ActionReducer): ActionReducer {\n return (state: CartState, action) => {\n if (first && action.type === UPDATE) {\n first = false;\n const corruptedParts: string[] = safeMap(state?.isUpdating, (parts: UpdatingCartPart) =>\n Object.keys(parts).filter((partId: string) => parts[partId] === CartPartStatus.UPDATING)\n );\n\n if (isNotEmpty(corruptedParts)) {\n sentryLogger.error('Cart was updating during page reload', {\n cartId: state?.cartData?.id,\n corruptedParts,\n });\n navigateToError(router, languageService.langValue, 'TECHNICAL_ERROR');\n }\n }\n return reducer(state, action);\n };\n };\n}\n","import { InjectionToken, NgModule } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { StoreConfig, StoreModule } from '@ngrx/store';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { CartState } from '@fcom/dapi';\nimport { SentryLogger } from '@fcom/core';\n\nimport {\n bookingReducer,\n boundsReducer,\n cartReducer,\n multiCityReducer,\n offersReducer,\n paxDetailsReducer,\n} from './reducers';\nimport { verifyCartInitialStateMetaReducer } from './metareducers';\n\nexport const CART_FEATURE_CONFIG_TOKEN = new InjectionToken>('Cart Feature Config');\n\nexport function getCartConfig(\n router: Router,\n languageService: LanguageService,\n sentryLogger: SentryLogger\n): StoreConfig {\n // return the config synchronously.\n return {\n metaReducers: [verifyCartInitialStateMetaReducer(router, languageService, sentryLogger)],\n };\n}\n\n@NgModule({\n imports: [\n StoreModule.forFeature('booking', bookingReducer),\n StoreModule.forFeature('cart', cartReducer, CART_FEATURE_CONFIG_TOKEN),\n StoreModule.forFeature('offers', offersReducer),\n StoreModule.forFeature('bounds', boundsReducer),\n StoreModule.forFeature('multiCity', multiCityReducer),\n StoreModule.forFeature('paxDetails', paxDetailsReducer),\n ],\n exports: [],\n declarations: [],\n providers: [\n {\n provide: CART_FEATURE_CONFIG_TOKEN,\n deps: [Router, LanguageService, SentryLogger],\n useFactory: getCartConfig,\n },\n ],\n})\nexport class BookingStoreModule {}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';\nimport { isPlatformServer } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\n\nimport { IdAndHash } from '@fcom/dapi';\nimport { snapshot } from '@fcom/rx';\nimport { isPresent } from '@fcom/core/utils';\nimport { orderFetchInformation, paymentStatus } from '@fcom/common-booking/store';\nimport { PaymentStatus } from '@fcom/common-booking/interfaces';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\n\nimport { acceptTerms, cartIdAndHash } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\n\n@Injectable({ providedIn: 'root' })\nexport class PurchaseCheckoutGuard implements CanActivate {\n constructor(\n private store$: Store,\n private bookingService: BookingService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n if (this.paymentCheck()) {\n return true;\n }\n\n this.bookingService.setStep({ step: BOOKING_STEPS.PURCHASE_REVIEW });\n\n return false;\n }\n\n paymentCheck = (): boolean => {\n const termsAndCondition: boolean = snapshot(this.store$.pipe(acceptTerms()));\n const cartIdHash: IdAndHash = snapshot(this.store$.pipe(cartIdAndHash()));\n const pay: PaymentStatus = snapshot(this.store$.pipe(paymentStatus()));\n const orderIdHash: IdAndHash = snapshot(this.store$.pipe(orderFetchInformation()));\n\n return (\n termsAndCondition &&\n ((isPresent(cartIdHash) && isPresent(cartIdHash.id) && isPresent(cartIdHash.hash)) ||\n (isPresent(orderIdHash) && isPresent(orderIdHash.id) && isPresent(orderIdHash.hash))) &&\n PaymentStatus.PENDING_VERIFICATION !== pay\n );\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/components';\nimport { ComponentsModule } from '@fcom/common/components/components.module';\nimport { PipesModule } from '@fcom/common/pipes/pipes.module';\nimport { OrderApiModule } from '@fcom/dapi/api/order-api.module';\n\nimport { PurchaseCheckoutRouteComponent } from './routes/purchase-checkout-route.component';\nimport { PurchaseCheckoutGuard } from './services/purchase-checkout.guard';\n\n@NgModule({\n imports: [CommonModule, PipesModule, ComponentsModule, OrderApiModule, CommonBookingComponentsModule],\n exports: [PurchaseCheckoutRouteComponent],\n declarations: [PurchaseCheckoutRouteComponent],\n providers: [PurchaseCheckoutGuard],\n})\nexport class PurchaseCheckoutModule {}\n","import { Component } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { orderData, PaymentFlow, PaymentServiceName } from '@fcom/common-booking';\nimport { NativeBridgeService } from '@fcom/core/services';\nimport { profileOrNot } from '@fcom/core/selectors';\nimport { finShare } from '@fcom/rx';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\nimport { cartData } from '../../../store/selectors';\n\n@Component({\n selector: 'fin-purchase-checkout-route',\n templateUrl: './purchase-checkout-route.component.html',\n})\nexport class PurchaseCheckoutRouteComponent {\n readonly paymentFlow = PaymentFlow.BOOKING;\n\n serviceName$: Observable;\n\n constructor(\n private store$: Store,\n private nativeBridgeService: NativeBridgeService\n ) {\n const orderOrCart$ = this.store$.pipe(\n orderData(true),\n finShare(),\n switchMap((order) => (order ? of(order) : this.store$.pipe(cartData())))\n );\n\n const isCorporateFlow$ = this.store$.pipe(\n profileOrNot(),\n map((profile) => profile?.isCorporate ?? false)\n );\n\n this.serviceName$ = combineLatest([isCorporateFlow$, orderOrCart$]).pipe(\n map(([isCorporateFlow, orderOrCart]) => {\n if (isCorporateFlow) {\n return 'web_corporate_flow';\n } else {\n const isAwardFlow = !!orderOrCart?.prices?.unpaid?.total?.total?.totalPoints;\n if (this.nativeBridgeService.isInsideNativeWebView) {\n return isAwardFlow ? 'finnairmobileapp_award' : 'finnairmobileapp_booking';\n }\n return isAwardFlow ? 'web_award' : 'finnaircom';\n }\n })\n );\n }\n}\n","\n","\n \n {{ notification.article.teaserTitle }}\n \n\n \n \n \n\n","import { ChangeDetectionStrategy, Component, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { combineLatest, NEVER, Observable } from 'rxjs';\nimport { distinctUntilChanged, map, switchMap } from 'rxjs/operators';\n\nimport { NotificationLayout, NotificationTheme } from '@fcom/ui-components';\nimport { CmsArticle, CmsContent } from '@fcom/core-api/interfaces';\nimport { TimeService } from '@fcom/core/services';\nimport { LocalDate, stopPropagation } from '@fcom/core/utils';\nimport { FragmentService } from '@fcom/common/services';\n\nimport { BookingService } from '../../services';\n\nconst FINLAND_COUNTRY_CODE = 'FI';\nexport const COVID_COVER_ORIGIN_COUNTRY_CODES = [\n 'FI',\n 'SE',\n 'DK',\n 'NO',\n 'EE',\n 'DE',\n 'AT',\n 'CH',\n 'FR',\n 'NL',\n 'BE',\n 'IT',\n 'ES',\n];\nexport const COVID_COVER_VALID_BEFORE_PURCHASE_DATE = LocalDate.forDate(2021, 8, 30);\nexport const COVID_COVER_VALID_BEFORE_DEPARTURE_DATE = LocalDate.forDate(2021, 10, 31);\n\n@Component({\n selector: 'fin-booking-notification',\n styleUrls: ['booking-notification.component.scss'],\n templateUrl: 'booking-notification.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BookingNotificationComponent implements OnInit {\n readonly NotificationLayout = NotificationLayout;\n\n notification$: Observable<{ article: CmsContent; type: string }>;\n\n modalOpen = false;\n\n /**\n * Whether to show as teaser or not\n */\n @Input()\n isFullWidth = true;\n\n /**\n * Theme to be shown\n */\n @Input()\n theme = NotificationTheme.INFO;\n\n constructor(\n private bookingService: BookingService,\n private timeService: TimeService,\n private fragmentService: FragmentService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n ngOnInit(): void {\n if (isPlatformBrowser(this.platform)) {\n const isCovidCoverOrigin$ = this.bookingService.locations.pipe(\n map((flights) => COVID_COVER_ORIGIN_COUNTRY_CODES.includes(flights[0]?.origin?.countryCode?.toUpperCase()))\n );\n\n const isDomesticFinlandTrip$ = this.bookingService.locations.pipe(\n map((flights) =>\n flights.every((flight) => {\n return (\n flight?.origin?.countryCode?.toUpperCase() === FINLAND_COUNTRY_CODE &&\n flight?.destination?.countryCode?.toUpperCase() === FINLAND_COUNTRY_CODE\n );\n })\n )\n );\n\n const isDepartureBeforeCovidCoverExpiration$ = this.bookingService.locations.pipe(\n map(\n (flights) =>\n flights[0]?.departureDate &&\n flights[0].departureDate instanceof LocalDate &&\n flights[0].departureDate.lte(COVID_COVER_VALID_BEFORE_DEPARTURE_DATE)\n )\n );\n\n const isPurchasedBeforeCovidCoverStartDate$ = this.timeService.currentLocalDate.pipe(\n map((currentDate: LocalDate) => currentDate.lte(COVID_COVER_VALID_BEFORE_PURCHASE_DATE))\n );\n\n const shouldDisplayCovidCover$ = combineLatest([\n isCovidCoverOrigin$,\n isDomesticFinlandTrip$,\n isDepartureBeforeCovidCoverExpiration$,\n isPurchasedBeforeCovidCoverStartDate$,\n ]).pipe(\n map(\n ([\n isCovidCoverOrigin,\n isDomesticFinlandTrip,\n isDepartureBeforeCovidCoverExpiration,\n isPurchasedBeforeCovidCoverStartDate,\n ]) =>\n isCovidCoverOrigin &&\n !isDomesticFinlandTrip &&\n isDepartureBeforeCovidCoverExpiration &&\n isPurchasedBeforeCovidCoverStartDate\n )\n );\n\n this.notification$ = shouldDisplayCovidCover$.pipe(\n map((displayCovidCover) =>\n displayCovidCover ? 'fragments.covidCoverNotification.url' : 'fragments.bookingGlobalNotification.url'\n ),\n distinctUntilChanged(),\n switchMap((fragmentKey: string) =>\n this.fragmentService.getFragment(fragmentKey).pipe(\n map((article) => ({\n article,\n type: fragmentKey === 'fragments.covidCoverNotification.url' ? 'corona-cover' : 'flexible-booking',\n }))\n )\n )\n );\n } else {\n this.notification$ = NEVER;\n }\n }\n\n showModal(event: Event): void {\n this.modalOpen = !this.modalOpen;\n stopPropagation(event);\n }\n}\n","
\n \n
\n\n
\n \n \n

\n {{ 'ancillaries.payWithPoints' | 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 {{ 'price.continueButtonTotal' | finLocalization }}: \n {{ 'award.points' | finLocalization: { pointsAmount: points || 0 | finPoints } }} +\n \n {{\n totalPrice$ | async | finPrice | finEmpty: '–'\n }}\n \n \n
\n
\n \n \n \n
\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject, Subscription } from 'rxjs';\nimport { delay, distinctUntilChanged, filter, map, startWith, switchMap, take, withLatestFrom } from 'rxjs/operators';\n\nimport { ButtonPosition, NotificationTheme } from '@fcom/ui-components';\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n GaContext,\n GtmEcommerceMeasurement,\n GtmEvent,\n GtmPurchaseFlow,\n GtmTripType,\n LoaderType,\n MultivariateTestId,\n TestVariant,\n ToasterMessage,\n} from '@fcom/common/interfaces';\nimport { ConfigService } from '@fcom/core/services';\nimport {\n Category,\n FinnairBoundItem,\n FinnairCart,\n FinnairItineraryItemFlight,\n FinnairPassengerItem,\n FinnairPrice,\n FinnairServiceCatalogCampaign,\n FinnairServiceCatalogEligibilityReason,\n FinnairServiceItem,\n PaxLevelQuota,\n} from '@fcom/dapi/api/models';\nimport {\n Amount,\n CartPartStatus,\n CartStatus,\n LocationInfoMap,\n ServiceAvailability,\n ServiceCatalogCategory,\n ServiceCatalogCategoryServicesMap,\n ServiceCatalogSelectionsForAllTravelers,\n ServiceCatalogServices,\n} from '@fcom/dapi/interfaces';\nimport { finShare, snapshot } from '@fcom/rx';\nimport { compareAsJson, isNotEmpty, isPresent, unique, unsubscribe } from '@fcom/core/utils';\nimport {\n ancillarySaleBlockingSupportedReasonKeys,\n BOUND_BASED_CATEGORIES,\n buttonTexts,\n categoryHasQuotaLeft,\n changedServices,\n filterCategories,\n getCountForCategoryStream,\n getLowestPriceForCategory,\n getPriceForCategoryStream,\n getProductTag,\n getQuantitiesForFragmentsAndPassenger,\n isAllowedToSell,\n isBoundBasedCategory,\n isJourneyBasedCategory,\n PETC_CONFIRM_MODAL_TRANSLATION_KEYS,\n} from '@fcom/common-booking/modules/ancillaries/utils';\nimport {\n ButtonState,\n ConfirmModal,\n ConfirmModalData,\n EligibilityWithCategory,\n SeatChangeEvent,\n} from '@fcom/common-booking/modules/ancillaries/interfaces';\nimport {\n AncillarySubviewComponent,\n ConfirmModalTranslationKeys,\n SmpProduct,\n} from '@fcom/common-booking/modules/ancillaries/components';\nimport {\n seatSelections,\n serviceCatalog,\n serviceCatalogCampaigns,\n serviceCategories,\n variantsQuantity,\n} from '@fcom/common-booking/store/selectors';\nimport { QuantityForFragmentAndPassenger, SeatMapActions } from '@fcom/common-booking/store';\nimport { BookingSummaryService, FlightWithStreams } from '@fcom/common-booking';\nimport { ScrollService, Step } from '@fcom/common';\nimport { profileOrNot, profileType } from '@fcom/core/selectors';\nimport { ProfileTier, ProfileType } from '@fcom/core-api/login';\nimport { isBound, passengersMissingCategoryService, toAmount } from '@fcom/common-booking/utils/common-booking.utils';\nimport { getServiceData } from '@fcom/common-booking/utils/ancillaries.utils';\nimport { getTripTypeFromBounds } from '@fcom/common/utils/gtm.utils';\nimport { setNoAvailability } from '@fcom/common-booking/store/actions/seat-map.actions';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { AncillaryLoaderStatus } from '@fcom/common-booking/modules/ancillaries/enums';\nimport { MultivariateTestService } from '@fcom/common/multivariate-test/services/multivariate-test.service';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\n\nimport { cartData, cartFlights, cartPartStatusForCategory, cartStatus, isCartDirty } from '../../../../store/selectors';\nimport { BookingQueueService, BookingService } from '../../../../services';\nimport { combinedCartServicesMap, currentServices } from '../../../../store/selectors/booking-cart-state.selector';\n\n@Component({\n selector: 'fin-smp',\n templateUrl: 'smp.component.html',\n styleUrls: ['./smp.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SmpComponent implements OnInit, OnDestroy {\n readonly Category = Category;\n readonly LoaderType = LoaderType;\n readonly ButtonPosition = ButtonPosition;\n readonly buttonText = buttonTexts;\n readonly NotificationTheme = NotificationTheme;\n readonly BOUND_BASED_CATEGORIES = BOUND_BASED_CATEGORIES;\n readonly PETC_CONFIRM_MODAL_TRANSLATION_KEYS = PETC_CONFIRM_MODAL_TRANSLATION_KEYS;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n readonly ProfileType = ProfileType;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input() cartDataReady$: Observable;\n @Input() priceUpdating$: Observable;\n @Input() hasTravelerInCart$: Observable;\n @Input() flights$: Observable;\n @Input() bounds$: Observable;\n @Input() travelers$: Observable;\n @Input() servicesMap$: Observable;\n @Input() cartTotalPrice$: Observable;\n @Input() servicesReady$: Observable;\n @Input() availability$: Observable;\n @Input() locations$: Observable;\n @Input() passengersWithPetcIncompatibleSeats$: Observable<{ [boundId: string]: string[] }>;\n @Input() ancillaryLoader$: BehaviorSubject = new BehaviorSubject(AncillaryLoaderStatus.OFF);\n\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() message: EventEmitter = new EventEmitter();\n @Output() changeStep: EventEmitter = new EventEmitter();\n @Output() continueToNextPhase: EventEmitter = new EventEmitter();\n\n currentServices$: Observable;\n boundsOrFlights$: Observable<(FinnairBoundItem | FinnairItineraryItemFlight)[]>;\n boundOrFlightAncillaryAvailability$: Observable<{ [fragmentId: string]: EligibilityWithCategory[] }>;\n activeFlight: FinnairBoundItem | FinnairItineraryItemFlight;\n sideBarOpen = false;\n subscriptions: Subscription = new Subscription();\n showCtaButton$: Observable;\n serviceCategories$: Observable;\n products$: Observable;\n cart$: Observable;\n cartFlights$: Observable;\n currentStep$: Observable;\n unpaidServices$: Observable;\n combinedServices$: Observable<{ [category: string]: FinnairServiceItem }>;\n totalPrice$: Observable;\n totalPoints$: Observable;\n profileType$: Observable;\n seatSelectionLoading$ = new BehaviorSubject(false);\n\n currentCombinedServices$: Observable;\n tripType$: Observable;\n purchaseFlow$: Observable;\n confirmModalData$ = new BehaviorSubject({\n open: false,\n });\n serviceQuantityMap$: Observable;\n paxLevelQuota$: Observable;\n showSeatPreSelection$: Observable;\n seatSelections$: Observable;\n\n @ViewChild('ancillarySubview', { static: false })\n ancillarySubview: AncillarySubviewComponent;\n\n selectedCategory$: BehaviorSubject = new BehaviorSubject(undefined);\n ancillarySubviewOpen$: Subject = new BehaviorSubject(false);\n enableBookingNewProductCardLayout$: Observable;\n enableSpecialUpsellCategory$: Observable;\n enableShowCheaperOnlineTag = false;\n specialUpsellCategory$: Observable;\n\n private _showCtaButtonSubject$: BehaviorSubject = new BehaviorSubject(true);\n private _seatPreselectionDismissed$: BehaviorSubject = new BehaviorSubject(false);\n\n constructor(\n private configService: ConfigService,\n private store$: Store,\n private bookingQueueService: BookingQueueService,\n private gtmService: GtmService,\n private bookingService: BookingService,\n private scrollService: ScrollService,\n private languageService: LanguageService,\n private multivariateTestService: MultivariateTestService\n ) {}\n\n ngOnInit(): void {\n this.enableBookingNewProductCardLayout$ = this.multivariateTestService\n .getTestVariant(MultivariateTestId.NEW_PRODUCT_CARDS)\n .pipe(\n map(({ variant }) => variant === TestVariant.B),\n finShare()\n );\n\n // TODO: Create own AB test for this.\n this.enableSpecialUpsellCategory$ = this.configService.cfg.enableSpecialUpsellCategory\n ? this.multivariateTestService.getTestVariant(MultivariateTestId.REGRESSION_TEST_WORKAROUND, false).pipe(\n map(({ variant }) => variant === TestVariant.B),\n finShare()\n )\n : of(false).pipe(finShare());\n this.enableShowCheaperOnlineTag = this.configService.cfg.enableShowCheaperOnlineTag;\n\n this.currentServices$ = this.selectedCategory$.pipe(\n switchMap((currentCategory) => this.servicesMap$.pipe(map((services) => services?.[currentCategory])))\n );\n\n this.purchaseFlow$ = this.store$.pipe(\n profileOrNot(),\n map((profile) => (profile?.tier === ProfileTier.CORPORATE ? GtmPurchaseFlow.CORPORATE : GtmPurchaseFlow.BOOKING))\n );\n this.serviceCategories$ = this.store$.pipe(serviceCategories());\n this.cart$ = this.store$.pipe(cartData());\n this.cartFlights$ = this.store$.pipe(cartFlights());\n this.unpaidServices$ = this.store$.pipe(currentServices());\n this.combinedServices$ = this.store$.pipe(combinedCartServicesMap(), finShare());\n this.currentCombinedServices$ = this.selectedCategory$.pipe(\n switchMap((currentCategory) =>\n this.combinedServices$.pipe(\n map((services) => services?.[currentCategory]),\n finShare()\n )\n )\n );\n this.currentStep$ = this.bookingService.step;\n this.tripType$ = this.bounds$.pipe(map((bounds) => getTripTypeFromBounds(bounds)));\n this.profileType$ = this.store$.pipe(profileType());\n\n this.showSeatPreSelection$ = combineLatest([\n this.bookingService.previousStep,\n this._seatPreselectionDismissed$,\n this.cart$,\n ]).pipe(\n map(([previousStep, dismissed, cart]) => {\n return previousStep.id === BOOKING_STEPS.PAXDETAILS.id && !dismissed && !this.hasCorporateSeatBenefit(cart);\n })\n );\n this.seatSelections$ = this.store$.pipe(seatSelections());\n\n this.subscriptions.add(\n this.showSeatPreSelection$.pipe(filter(Boolean)).subscribe(() => {\n this.selectedCategory$.next(Category.SEAT);\n })\n );\n\n this.paxLevelQuota$ = this.store$.pipe(serviceCatalog()).pipe(\n map((catalog) => catalog.paxLevelQuota),\n distinctUntilChanged(),\n finShare()\n );\n\n this.serviceQuantityMap$ = this.paxLevelQuota$.pipe(\n switchMap(({ variants }) => {\n return combineLatest([this.store$.pipe(variantsQuantity(variants)), this.store$.pipe(cartData())]).pipe(\n map(([selectedServices, cart]) => getQuantitiesForFragmentsAndPassenger(selectedServices, undefined, cart))\n );\n }),\n finShare()\n );\n\n const unpaidServices$ = this.store$.pipe(\n cartData(),\n map((cd: FinnairCart) => cd.services.unpaid)\n );\n\n const fallbackCurrencyCode$ = this.store$.pipe(\n cartData(),\n map((cd: FinnairCart) => cd.prices.unpaid.total.total.totalAmount.currencyCode)\n );\n\n const getStatusStream = (category: Category): Observable => {\n return combineLatest([\n this.store$.pipe(cartPartStatusForCategory(category)),\n getCountForCategoryStream(category, unpaidServices$),\n ]).pipe(\n map(([status, numberOfItems]) => {\n if (status === CartPartStatus.UPDATING) {\n return ButtonState.UPDATING;\n } else if ((status === CartPartStatus.ERROR && numberOfItems < 1) || numberOfItems === 0) {\n return ButtonState.PLUS;\n } else {\n return ButtonState.OK;\n }\n }),\n finShare()\n );\n };\n\n this.specialUpsellCategory$ = combineLatest([this.enableSpecialUpsellCategory$, this.cart$]).pipe(\n map(([enableSpecialUpsellCategory, cart]) =>\n enableSpecialUpsellCategory ? this.getUpsellCategory(cart) : undefined\n ),\n startWith(undefined),\n finShare()\n );\n\n const campaignsCategories$ = this.store$.pipe(\n serviceCatalogCampaigns(),\n startWith([] as FinnairServiceCatalogCampaign[]),\n map((campaigns) =>\n campaigns\n .flatMap((c) => c.categories)\n .flatMap((c) => c.id)\n .filter(unique)\n ),\n finShare()\n );\n\n this.products$ = combineLatest([this.serviceCategories$, this.specialUpsellCategory$]).pipe(\n map(([categories, specialUpsellCategory]) => ({\n categories: filterCategories(categories),\n specialUpsellCategory,\n })),\n withLatestFrom(campaignsCategories$, this.combinedServices$, this.cart$),\n map(([{ categories, specialUpsellCategory }, campaignsCategories, combinedServices, cart]) => {\n return categories.map((serviceCatalogCategory): SmpProduct => {\n const category = serviceCatalogCategory.category;\n const noQuotaLeft = !categoryHasQuotaLeft(category, categories);\n const count$ = getCountForCategoryStream(category, unpaidServices$);\n const hasCorporateSeatBenefit = category === Category.SEAT && this.hasCorporateSeatBenefit(cart);\n const lowestPrice = getLowestPriceForCategory(serviceCatalogCategory);\n return {\n category: category,\n title: serviceCatalogCategory.translations.title,\n description: serviceCatalogCategory.translations.description,\n image: serviceCatalogCategory.media,\n status$: getStatusStream(category),\n price$: getPriceForCategoryStream(category, unpaidServices$, fallbackCurrencyCode$),\n count$: count$,\n noQuotaLeft: noQuotaLeft,\n notAvailable$: of(hasCorporateSeatBenefit),\n notificationMessage$: count$.pipe(\n map((count) => {\n if (noQuotaLeft && count === 0) {\n return `services.${category}.noQuotaLeft`;\n }\n if (hasCorporateSeatBenefit) {\n return 'services.seat.corporateBenefit';\n }\n return undefined;\n }),\n switchMap((translationKey) =>\n translationKey ? this.languageService.translate(translationKey) : of(undefined)\n )\n ),\n notificationTitle$: hasCorporateSeatBenefit\n ? this.languageService.translate('services.seat.corporateBenefitTitle')\n : of(undefined),\n notificationIcon: hasCorporateSeatBenefit ? SvgLibraryIcon.B2B : undefined,\n lowestPrice: lowestPrice?.money,\n originalPrice: lowestPrice?.originalPrice,\n productTag: getProductTag(category, campaignsCategories, combinedServices?.[category], {\n showCheaperOnlineTag: this.enableShowCheaperOnlineTag,\n enableTierBenefitTag: this.configService.cfg.enableTravelExtrasTierBenefitTag,\n }),\n hideViewButton: category === Category.COVER || hasCorporateSeatBenefit,\n isSpecialUpsellProduct: category === specialUpsellCategory,\n };\n });\n }),\n map((products) =>\n products.some((product) => product.isSpecialUpsellProduct)\n ? products.sort((a, b) => Number(b.isSpecialUpsellProduct) - Number(a.isSpecialUpsellProduct))\n : products\n ),\n finShare()\n );\n\n this.showCtaButton$ = this._showCtaButtonSubject$.pipe(\n switchMap((show) => {\n return show ? of(show).pipe(delay(250)) : of(show);\n })\n );\n\n this.totalPrice$ = this.cartTotalPrice$.pipe(\n map((total) => {\n if (!total) {\n return;\n }\n\n return toAmount(total?.totalAmount);\n })\n );\n\n this.totalPoints$ = this.cartTotalPrice$.pipe(\n filter((total) => !!total?.totalPoints),\n map((total) => +total.totalPoints.amount)\n );\n\n this.boundsOrFlights$ = this.selectedCategory$.pipe(\n filter(Boolean),\n switchMap((category) => {\n if (isJourneyBasedCategory(category)) {\n return of([]);\n } else if (isBoundBasedCategory(category)) {\n return this.bounds$;\n } else {\n return this.flights$;\n }\n }),\n startWith([]),\n finShare()\n );\n\n this.boundOrFlightAncillaryAvailability$ = combineLatest([\n this.availability$,\n this.boundsOrFlights$,\n this.selectedCategory$,\n this.store$.pipe(cartData()),\n ]).pipe(\n map(([availability, boundsOrFlights, category, cart]) => {\n return boundsOrFlights.reduce((all, boundOrFlight) => {\n const allowedToSell = isAllowedToSell(category, cart, availability, boundOrFlight);\n all[boundOrFlight.id] = allowedToSell.map((eligibility) => {\n return {\n ...eligibility,\n isAllowedToUse:\n eligibility.isAllowedToUse ||\n Object.keys(ancillarySaleBlockingSupportedReasonKeys).includes(eligibility.reason),\n };\n });\n return all;\n }, {});\n }),\n distinctUntilChanged(compareAsJson),\n finShare()\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n showSubview(category: Category, slideIndexToOpen: number): void {\n this.closeSidebar();\n this.ancillarySubviewOpen$.next(true);\n this.selectedCategory$.next(category);\n this._showCtaButtonSubject$.next(false);\n\n this.ancillarySubview.open(null, slideIndexToOpen);\n }\n\n viewDetails(category: Category): void {\n this.selectedCategory$.next(category);\n if (category !== Category.COVER) {\n this.sideBarOpen = true;\n this._showCtaButtonSubject$.next(false);\n }\n }\n\n updateCartServices(category: Category): void {\n this.selectedCategory$.next(null);\n this.ancillarySubviewOpen$.next(false);\n this._showCtaButtonSubject$.next(true);\n this.confirmModalData$.next({ open: false });\n\n if (snapshot(this.store$.pipe(isCartDirty()))) {\n if (category === Category.PET) {\n this.store$.dispatch(SeatMapActions.reset());\n }\n const bounds = snapshot(this.bounds$);\n const flights = snapshot(this.flights$);\n const cartDataSnapshot = snapshot(this.store$.pipe(cartData()));\n const purchaseFlow = snapshot(this.purchaseFlow$);\n\n const [requests, messages] = getServiceData(this.store$, category, bounds, flights);\n this.bookingQueueService.queueServicesUpdate(requests, {\n next: (cart) => {\n this.sendEcommerceAddRemoveEvents(category, cartDataSnapshot, cart, purchaseFlow);\n },\n error: () => {\n if (category === Category.SEAT) {\n this.store$.dispatch(SeatMapActions.reset());\n this.store$.dispatch(\n SeatMapActions.loadSeatSelectionsFromCart({ cartData: snapshot(this.store$.pipe(cartData())) })\n );\n }\n this.message.emit(messages.error);\n },\n });\n }\n }\n\n closeSeatPreselection(updateServices: boolean): void {\n this._seatPreselectionDismissed$.next(true);\n this.selectedCategory$.next(null);\n this.scrollService.scrollTop();\n if (updateServices) {\n this.updateCartServices(Category.SEAT);\n }\n }\n\n loadNextSeatMap(flightOrBound: FinnairBoundItem | FinnairItineraryItemFlight): void {\n this.activeFlight = flightOrBound;\n if (isPresent(flightOrBound) && !isBound(flightOrBound) && this.selectedCategory$.value === Category.SEAT) {\n this.subscriptions.add(\n this.travelers$\n .pipe(filter(isNotEmpty))\n .pipe(withLatestFrom(this.store$.pipe(cartData(), filter(Boolean), take(1))))\n .subscribe(([, cart]: [FinnairPassengerItem[], FinnairCart]) => {\n const hasAvailability = Object.values(\n cart.eligibilities?.serviceCatalog?.categories.find((c) => c.category === Category.SEAT)?.services?.[\n flightOrBound.id\n ] ?? {}\n ).some(({ isAllowedToUse }) => isAllowedToUse);\n const hasControlAvailability =\n cart.controlData.sellAncillariesPerFlight[flightOrBound.flightNumber] || false;\n\n if ((!hasAvailability && !hasControlAvailability) || this.hasCorporateSeatBenefit(cart, flightOrBound.id)) {\n this.store$.dispatch(setNoAvailability({ flightId: flightOrBound.id }));\n return;\n }\n this.bookingQueueService.queueTriggerFetchSeatMap(\n flightOrBound.id,\n cart.prices.unpaid.total.total.totalAmount.currencyCode\n );\n })\n );\n }\n }\n\n closeSidebar(): void {\n this.sideBarOpen = false;\n this._showCtaButtonSubject$.next(true);\n }\n\n closeConfirmModal(confirmData?: ConfirmModalData): void {\n this.confirmModalData$.next({\n open: false,\n confirmData: {\n variant: confirmData?.variant,\n flightOrBoundId: confirmData?.flightOrBoundId,\n travelerId: confirmData?.travelerId,\n },\n });\n }\n\n setConfirmModalData(\n confirmData: ConfirmModalData,\n confirmationModalTranslationKeys: ConfirmModalTranslationKeys\n ): void {\n this.confirmModalData$.next({\n open: true,\n confirmData: {\n ...confirmData,\n confirmationModalTranslationKeys: confirmationModalTranslationKeys,\n },\n });\n }\n\n private sendEcommerceAddRemoveEvents(\n category: Category,\n cartBeforeUpdate: FinnairCart,\n cartAfterUpdate: FinnairCart,\n purchaseFlow: GtmPurchaseFlow\n ): void {\n const { addedServices, removedServices, addedProducts, removedProducts } = changedServices(\n cartBeforeUpdate,\n cartAfterUpdate,\n category,\n purchaseFlow\n );\n\n if (addedServices.length) {\n this.gtmService.ecommerceEvent(\n GtmEvent.ADD_SERVICES,\n GtmEcommerceMeasurement.ADD,\n addedServices,\n purchaseFlow,\n cartAfterUpdate?.prices.unpaid.total.total.totalAmount.currencyCode\n );\n }\n\n if (addedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.ADD_TO_CART, addedProducts);\n }\n\n if (removedServices.length) {\n this.gtmService.ecommerceEvent(\n GtmEvent.REMOVE_SERVICES,\n GtmEcommerceMeasurement.REMOVE,\n removedServices,\n purchaseFlow\n );\n }\n\n if (removedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.REMOVE_FROM_CART, removedProducts);\n }\n }\n\n changeSeats({ travelerId, flightId, seatNumber }: SeatChangeEvent): void {\n this.seatSelectionLoading$.next(true);\n this.subscriptions.add(\n this.flights$\n .pipe(\n take(1),\n map((flights) => {\n return flights.find((f) => f.id === flightId);\n }),\n switchMap((flight) => {\n return combineLatest([flight.seatMap$, this.store$.pipe(cartStatus())]).pipe(\n filter(([_, cs]) => cs === CartStatus.OK),\n map(([seatMap]) => seatMap)\n );\n })\n )\n .subscribe((seatMap) => {\n const selectedSeat = seatMap.seats.find((seat) => seat.seatNumber === seatNumber);\n this.store$.dispatch(\n SeatMapActions.setSeatForFlight({\n flightId,\n travelerId,\n seat: selectedSeat,\n })\n );\n this.seatSelectionLoading$.next(false);\n })\n );\n }\n\n private hasCorporateSeatBenefit(cart: FinnairCart, flightOrBoundId?: string): boolean {\n const seatCategory = cart.eligibilities?.serviceCatalog?.categories?.find(\n ({ category }) => category === Category.SEAT\n );\n const seatServices = seatCategory?.services ? Object.entries(seatCategory.services) : [];\n if (!seatServices.length) {\n return false;\n }\n const flightEligibilities = seatServices\n .filter(([serviceFlightId]) => !flightOrBoundId || serviceFlightId === flightOrBoundId)\n .flatMap(([_, eligibility]) => Object.values(eligibility));\n if (!flightEligibilities?.length) {\n return false;\n }\n\n return flightEligibilities.every((eligibility) => {\n return (\n !eligibility.isAllowedToUse &&\n (eligibility.reason ===\n FinnairServiceCatalogEligibilityReason.PURCHASE_SEAT_SELECTION_NOT_ELIGIBLE_WHEN_DISCOUNTS_EXIST_FOR_CORPORATE ||\n eligibility.reason === FinnairServiceCatalogEligibilityReason.PURCHASE_NOT_ELIGIBLE_FOR_OTHER_AIRLINE)\n );\n });\n }\n\n // Something of a placeholder for now, but here to be easily extended with more fine-tuned conditions\n private getUpsellCategory(cart: FinnairCart): Category {\n return [Category.SEAT, Category.CABIN_BAGGAGE, Category.BAGGAGE].find((category) =>\n cart.bounds.some((bound) => passengersMissingCategoryService(category, cart, bound))\n );\n }\n}\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, switchMap } from 'rxjs/operators';\n\nimport { LoaderType, ToasterMessage } from '@fcom/common/interfaces';\nimport { ConfigService } from '@fcom/core';\nimport { CartStatus, LocationInfoMap, ServiceAvailability, ServiceCatalogCategoryServicesMap } from '@fcom/dapi';\nimport { SeatMapStatus } from '@fcom/common/interfaces/seat-map.interface';\nimport { Category, FinnairBoundItem, FinnairCart, FinnairPassengerItem, FinnairPrice } from '@fcom/dapi/api/models';\nimport { finShare, safeMap } from '@fcom/rx';\nimport { isNotEmpty } from '@fcom/core/utils';\nimport {\n seatMapForFlight,\n seatMapForFlightStatus,\n serviceCatalogCampaignIdsForFragment,\n serviceCategoriesMap,\n} from '@fcom/common-booking/store/selectors';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { getBoundsAndTravelersWhichHavePetcIncompatibleSeats } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { FlightWithStreams } from '@fcom/common-booking/interfaces';\nimport { BookingAppState, PaxDetailsState } from '@fcom/common/interfaces/booking';\nimport { profileType } from '@fcom/core/selectors';\nimport { ProfileType } from '@fcom/core-api/login';\n\nimport { AppConstants } from '../../../app-constants';\nimport { cartStatus, paxDetails } from '../../../store/selectors';\n\n@Component({\n selector: 'fin-ancillaries',\n templateUrl: './ancillaries.component.html',\n styleUrls: ['./ancillaries.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AncillariesComponent implements OnInit {\n @Input()\n cartData$: Observable;\n @Input()\n cartStatus$: Observable;\n @Input()\n serviceAvailability$: Observable;\n @Input()\n servicesReady$: Observable;\n\n @Output()\n ready: EventEmitter = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output()\n message: EventEmitter = new EventEmitter();\n\n public readonly C: typeof AppConstants = AppConstants;\n public readonly LoaderType = LoaderType;\n\n dataReady$: Observable;\n bounds$: Observable;\n allFlights$: Observable;\n passengers$: Observable;\n cartTotalPrice$: Observable;\n priceUpdating$: Observable;\n hasTravelerInCart$: Observable;\n servicesMap$: Observable;\n locations$: Observable;\n passengersWithPetcIncompatibleSeats$: Observable<{ [boundId: string]: string[] }>;\n paxDetails$: Observable;\n\n constructor(\n public configService: ConfigService,\n private store$: Store,\n private languageService: LanguageService\n ) {}\n\n ngOnInit(): void {\n const profileType$ = this.store$.pipe(profileType());\n this.dataReady$ = combineLatest([this.cartData$, profileType$]).pipe(\n safeMap(\n ([data, userProfileType]) =>\n Boolean(data.bounds) && (userProfileType !== ProfileType.CORPORATE || Boolean(data.passengers?.[0].lastName))\n ),\n startWith(false),\n distinctUntilChanged()\n );\n this.locations$ = this.cartData$.pipe(map((cd) => cd.locations));\n this.bounds$ = this.cartData$.pipe(safeMap((data: FinnairCart) => data.bounds));\n this.paxDetails$ = this.store$.pipe(paxDetails());\n this.servicesMap$ = this.store$.pipe(serviceCategoriesMap());\n this.allFlights$ = this.bounds$.pipe(\n map((bounds) =>\n bounds\n .reduce((allFlights, bound) => allFlights.concat(bound.itinerary.filter(isFlight)), [])\n .map((flight) => {\n const seatMapStatus$: Observable = combineLatest([\n this.store$.pipe(seatMapForFlightStatus(flight.id)),\n this.store$.pipe(\n cartStatus(),\n map((s) =>\n this.configService.cfg.enableBookingFlowSeatMapPreFetch\n ? [\n CartStatus.INITIAL,\n CartStatus.PENDING_CREATION,\n CartStatus.CREATION_ERROR,\n CartStatus.LOAD_ERROR,\n ].includes(s) === false\n : s === CartStatus.OK\n )\n ),\n ]).pipe(\n map(([seatMapStatus, cart]) => (!cart ? SeatMapStatus.PENDING : seatMapStatus)),\n distinctUntilChanged()\n );\n return {\n ...flight,\n seatMap$: this.store$.pipe(seatMapForFlight(flight.id)),\n seatMapStatus$,\n seatSubViewTopNotificationTranslation$: this.store$.pipe(\n serviceCatalogCampaignIdsForFragment(flight.id),\n filter((campaigns) => campaigns && campaigns[Category.SEAT] && campaigns[Category.SEAT].length > 0),\n map((campaigns) => `campaign.notifications.seatSubView.${campaigns[Category.SEAT][0]}`),\n switchMap((translationKey) => this.languageService.translate(translationKey))\n ),\n };\n })\n ),\n finShare()\n );\n\n const paxCartData$ = this.cartData$.pipe(\n safeMap((data: FinnairCart) => data.passengers),\n finShare()\n );\n this.passengers$ = combineLatest([paxCartData$.pipe(), this.paxDetails$]).pipe(\n map(([cartPassengers, passengerDetails]) => {\n return cartPassengers.map((pax) => ({\n ...pax,\n firstName: pax.firstName || passengerDetails.passengers.find((p) => p.travelerId === pax.id)?.firstName,\n lastName: pax.lastName || passengerDetails.passengers.find((p) => p.travelerId === pax.id)?.lastName,\n }));\n }),\n finShare()\n );\n\n this.cartTotalPrice$ = this.cartData$.pipe(\n safeMap((data: FinnairCart) => data.prices),\n safeMap((prices) => prices.unpaid.total.total),\n distinctUntilChanged(),\n finShare()\n );\n this.hasTravelerInCart$ = paxCartData$.pipe(\n map((travelers) => isNotEmpty(travelers) && travelers.every((t) => !!t.firstName))\n );\n this.priceUpdating$ = combineLatest([\n this.cartStatus$.pipe(map((status: CartStatus) => status !== CartStatus.OK)),\n this.hasTravelerInCart$,\n ]).pipe(map(([statusNotOk, travelersOk]: [boolean, boolean]) => statusNotOk || !travelersOk));\n\n this.passengersWithPetcIncompatibleSeats$ = this.cartData$.pipe(\n map((booking) => getBoundsAndTravelersWhichHavePetcIncompatibleSeats(booking, 'unpaid')),\n finShare()\n );\n }\n}\n","\n","import { Component } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\n\nimport { ToasterMessage } from '@fcom/common/interfaces';\nimport { ToasterService } from '@fcom/common/services';\nimport { CartStatus, ServiceAvailability } from '@fcom/dapi';\nimport { FinnairCart } from '@fcom/dapi/api/models';\nimport { serviceAvailability, servicesReady } from '@fcom/common-booking/store/selectors';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\nimport { cartData, cartStatus } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\n\n@Component({\n selector: 'fin-booking-ancillaries-route',\n templateUrl: './booking-ancillaries-route.component.html',\n})\nexport class BookingAncillariesRouteComponent {\n readonly cartData$: Observable;\n readonly cartStatus$: Observable;\n readonly serviceAvailability$: Observable;\n readonly servicesReady$: Observable;\n\n constructor(\n private bookingService: BookingService,\n private store$: Store,\n private toasterService: ToasterService\n ) {\n this.cartData$ = this.store$.pipe(cartData());\n this.cartStatus$ = this.store$.pipe(cartStatus());\n this.serviceAvailability$ = this.store$.pipe(serviceAvailability());\n this.servicesReady$ = this.store$.pipe(servicesReady());\n }\n\n confirmAncillaries(): void {\n this.bookingService.nextStep();\n }\n\n onMessage(msg: ToasterMessage): void {\n this.toasterService.addMessageToQueue(msg);\n }\n}\n","\n","import { Injectable, OnDestroy } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { merge, Observable, Subject, Subscription } from 'rxjs';\nimport {\n bufferCount,\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n withLatestFrom,\n} from 'rxjs/operators';\n\nimport { DataCloudService } from '@fcom/common/datacloud';\nimport { GtmService } from '@fcom/common/gtm';\nimport { GtmEvent, GtmFlightSelectionData, GtmPurchaseFlow } from '@fcom/common/interfaces';\nimport { entrySet, equals, unsubscribe } from '@fcom/core/utils';\nimport { FinnairCart, ServiceFlow } from '@fcom/dapi/api/models';\nimport { orderData } from '@fcom/common-booking/store';\nimport { PaymentStatus } from '@fcom/common-booking/interfaces';\nimport { paymentStatus } from '@fcom/common-booking/store/selectors';\nimport { isAwardBooking } from '@fcom/common-booking/utils/common-booking.utils';\nimport { profileOrNot } from '@fcom/core/selectors';\nimport { ProfileTier } from '@fcom/core-api/login';\nimport { getTripTypeFromBounds, resolvePurchaseFlow } from '@fcom/common/utils/gtm.utils';\nimport { globalBookingPaxAmount, globalBookingFlights, globalBookingDiscountCode } from '@fcom/common/store';\nimport { PaxAmount } from '@fcom/dapi';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\nimport { finShare } from '@fcom/rx';\n\nimport {\n cartData,\n inboundOffersSelectionGtmData,\n inboundSelectionGtmData,\n outboundOffersSelectionGtmData,\n outboundSelectionGtmData,\n} from '../store/selectors';\n\n@Injectable()\nexport class BookingGtmService implements OnDestroy {\n private sendFlightSelectionDataCloud$: Subject = new Subject();\n private subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private gtmService: GtmService,\n private dataCloudService: DataCloudService\n ) {\n this.initSendFlowData();\n this.initSendCompletePurchase();\n this.initSendCheckoutFlights();\n this.initSendFlightSelection();\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\n }\n\n initSendFlowData(): void {\n this.subscription.add(\n this.store$\n .pipe(\n cartData(),\n distinctUntilChanged((a, b) => {\n // Ensure that we only send flowData one time by checking that has flights changed\n return entrySet(a.controlData?.sellAncillariesPerFlight).every(\n (entry) => entry.value === b.controlData?.sellAncillariesPerFlight[entry.key]\n );\n }),\n withLatestFrom(this.store$.pipe(profileOrNot()))\n )\n .subscribe(([data, profile]) => {\n const isAward = isAwardBooking(data.prices.unpaid);\n this.gtmService.flowData(data.controlData, resolvePurchaseFlow(profile, isAward));\n })\n );\n }\n\n initSendCompletePurchase(): void {\n this.subscription.add(\n this.store$\n .pipe(\n paymentStatus(),\n filter((s) => s === PaymentStatus.VERIFIED),\n switchMap(() =>\n this.store$.pipe(\n orderData(),\n filter((v) => !!v),\n take(1)\n )\n ),\n withLatestFrom(\n this.store$.pipe(globalBookingFlights()),\n this.store$.pipe(profileOrNot()),\n this.store$.pipe(globalBookingDiscountCode())\n )\n )\n .subscribe(([orderDataValue, flights, profile, discountCode]) => {\n const tripType = getTripTypeFromBounds(orderDataValue.bounds);\n // Check for the existance of inbound data obj to figure out the trip type\n const totalPrice = orderDataValue.prices.included?.total?.total;\n const total = totalPrice?.totalAmount;\n const totalPoints = totalPrice?.totalPoints?.amount;\n const isAward = orderDataValue.serviceFlow === ServiceFlow.AWARD;\n this.gtmService.completePurchase(\n orderDataValue,\n tripType,\n total,\n flights[0] || { origin: undefined, destination: undefined },\n totalPoints,\n resolvePurchaseFlow(profile, isAward),\n orderDataValue.serviceFlow === ServiceFlow.BOOKING ? discountCode : undefined\n );\n this.dataCloudService.completePurchase();\n })\n );\n }\n\n initSendCheckoutFlights(): void {\n this.subscription.add(\n this.store$\n .pipe(\n cartData(),\n startWith(undefined as FinnairCart),\n bufferCount(2, 1),\n filter(([oldCart, newCart]) => {\n if (typeof oldCart === 'undefined' || typeof newCart === 'undefined') {\n return true;\n }\n const outboundChanged = !equals(oldCart.bounds[0], newCart.bounds[0]);\n const inboundChanged = !equals(oldCart.bounds[1], newCart.bounds[1]);\n return outboundChanged || inboundChanged;\n }),\n map(([, newCart]) => newCart),\n filter((v) => !!v),\n filter((cartDataValue) => !!cartDataValue?.bounds),\n withLatestFrom(this.store$.pipe(profileOrNot()))\n )\n .subscribe(([cartDataValue, profile]) => {\n const isAward = isAwardBooking(cartDataValue.prices.unpaid);\n this.gtmService.checkoutFlights(cartDataValue, resolvePurchaseFlow(profile, isAward));\n })\n );\n }\n\n initSendFlightSelection(): void {\n // TODO: We should try to combine airBounds (FPP) and offers selectors (FP)\n const flightSelectionData$: Observable = this.store$.pipe(\n globalBookingPaxAmount(),\n switchMap((paxAmount: PaxAmount) =>\n merge(\n this.store$.pipe(outboundSelectionGtmData(paxAmount)),\n this.store$.pipe(inboundSelectionGtmData(paxAmount)),\n this.store$.pipe(outboundOffersSelectionGtmData(paxAmount)),\n this.store$.pipe(inboundOffersSelectionGtmData(paxAmount))\n )\n ),\n withLatestFrom(this.store$.pipe(profileOrNot())),\n map(([data, profile]) =>\n profile?.tier === ProfileTier.CORPORATE ? { ...data, purchaseFlow: GtmPurchaseFlow.CORPORATE } : data\n ),\n finShare()\n );\n this.subscription.add(\n flightSelectionData$.subscribe((enhancedData) => {\n this.gtmService.flightSelection(GtmEvent.FLIGHT_SELECTION_CLICK, [enhancedData]);\n })\n );\n this.subscription.add(\n this.sendFlightSelectionDataCloud$\n .pipe(withLatestFrom(flightSelectionData$))\n .subscribe(([, enhancedData]) => this.dataCloudService.flightSelectionSelect([enhancedData]))\n );\n }\n\n sendFlightSelectionDataCloud(): void {\n this.sendFlightSelectionDataCloud$.next();\n }\n}\n","import { OperatorFunction } from '../types';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { arrRemove } from '../util/arrRemove';\n\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.\n *\n * ![](bufferCount.png)\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * ## Examples\n *\n * Emit the last two click events as an array\n *\n * ```ts\n * import { fromEvent, bufferCount } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const buffered = clicks.pipe(bufferCount(2));\n * buffered.subscribe(x => console.log(x));\n * ```\n *\n * On every click, emit the last two click events as an array\n *\n * ```ts\n * import { fromEvent, bufferCount } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const buffered = clicks.pipe(bufferCount(2, 1));\n * buffered.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param bufferSize The maximum size of the buffer emitted.\n * @param startBufferEvery Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return A function that returns an Observable of arrays of buffered values.\n */\nexport function bufferCount(bufferSize: number, startBufferEvery: number | null = null): OperatorFunction {\n // If no `startBufferEvery` value was supplied, then we're\n // opening and closing on the bufferSize itself.\n startBufferEvery = startBufferEvery ?? bufferSize;\n\n return operate((source, subscriber) => {\n let buffers: T[][] = [];\n let count = 0;\n\n source.subscribe(\n createOperatorSubscriber(\n subscriber,\n (value) => {\n let toEmit: T[][] | null = null;\n\n // Check to see if we need to start a buffer.\n // This will start one at the first value, and then\n // a new one every N after that.\n if (count++ % startBufferEvery! === 0) {\n buffers.push([]);\n }\n\n // Push our value into our active buffers.\n for (const buffer of buffers) {\n buffer.push(value);\n // Check to see if we're over the bufferSize\n // if we are, record it so we can emit it later.\n // If we emitted it now and removed it, it would\n // mutate the `buffers` array while we're looping\n // over it.\n if (bufferSize <= buffer.length) {\n toEmit = toEmit ?? [];\n toEmit.push(buffer);\n }\n }\n\n if (toEmit) {\n // We have found some buffers that are over the\n // `bufferSize`. Emit them, and remove them from our\n // buffers list.\n for (const buffer of toEmit) {\n arrRemove(buffers, buffer);\n subscriber.next(buffer);\n }\n }\n },\n () => {\n // When the source completes, emit all of our\n // active buffers.\n for (const buffer of buffers) {\n subscriber.next(buffer);\n }\n subscriber.complete();\n },\n // Pass all errors through to consumer.\n undefined,\n () => {\n // Clean up our memory when we finalize\n buffers = null!;\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 { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Inject,\n OnDestroy,\n OnInit,\n PLATFORM_ID,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { select, Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n mapTo,\n startWith,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators';\n\nimport { AirOffersStatus, BookingAppState, BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { FinnairOrder } from '@fcom/dapi/api/models';\nimport { BookingHeaderSummary } from '@fcom/common/interfaces';\nimport { Breadcrumb, PhasesAria } from '@fcom/ui-components';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n GlobalBookingTripDates,\n isNavigationEvent,\n MediaQueryService,\n NavigationMenuService,\n ScrollService,\n Step,\n TARGET_HEIGHT_ELEMENT,\n TripType,\n} from '@fcom/common';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { JoinService, LoginDialogComponent, LoginWidgetContext } from '@fcom/common/login';\nimport { PageMetaService } from '@fcom/common/services';\nimport { getBookingStepFromUrl } from '@fcom/common/utils/booking-common.utils';\nimport { NativeBridgeService } from '@fcom/core';\nimport { LoginStatus, ProfileType } from '@fcom/core-api/login';\nimport { loginStatus, profileName, profileType } from '@fcom/core/selectors';\nimport { GlobalBookingFlight } from '@fcom/common/store/store.interface';\nimport { isPresent, TzDate, unsubscribe } from '@fcom/core/utils';\nimport { orderData } from '@fcom/common-booking/store';\nimport { BookingSummaryService } from '@fcom/common-booking';\nimport { GtmService } from '@fcom/common/gtm';\nimport { finShare } from '@fcom/rx';\nimport { globalBookingSelections } from '@fcom/common/store';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BOOKING_STEPS, BOOKING_STEPS_ARRAY, ERROR_STEPS } from '@fcom/common/config/booking-config';\nimport { LanguageSelectorContext } from '@fcom/common/components/language-selector/language-selector.component';\n\nimport { AppConstants } from '../../app-constants';\nimport { BookingService } from '../../services';\nimport { BookingGtmService } from '../../services/booking-gtm.service';\nimport { boundsStatus, cartData, offersStatus, selectMultiCityStatus } from '../../store/selectors';\nimport { currentServices } from '../../store/selectors/booking-cart-state.selector';\nimport { BookingActions } from '../../store/actions';\n\nconst SHOW_BUTTON_STATES = [LoginStatus.LOGGED_IN, LoginStatus.NOT_LOGGED_IN, LoginStatus.ERROR];\n\n@Component({\n selector: 'fin-booking-routing',\n templateUrl: './booking-routing.component.html',\n styleUrls: ['./booking-routing.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BookingRoutingComponent implements OnInit, OnDestroy {\n readonly TARGET_HEIGHT_ELEMENT = TARGET_HEIGHT_ELEMENT;\n readonly LANGUAGE_SELECTOR_CONTEXT = LanguageSelectorContext.BOOKING;\n @ViewChild('loginDialog', { static: true }) loginDialog: LoginDialogComponent;\n\n public readonly C: typeof AppConstants = AppConstants;\n public readonly BOOKING_STEPS = BOOKING_STEPS;\n public readonly LoginWidgetContext = LoginWidgetContext;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n currentStep$: Observable;\n isFirstStep$: Observable;\n basketOpen$: BehaviorSubject = new BehaviorSubject(false);\n hasBasket$: Observable;\n enableModifySearch$: Observable;\n isErrorRoute$: Observable;\n showBasket$: Observable;\n isBookingFrontPage$: Observable;\n homeLink$: Observable;\n breadcrumbs$: Observable = of([]);\n phasesAria$: Observable;\n isNavigationMenuOpen$: Observable;\n loginStatus$: Observable;\n showHeaderBack$: Observable;\n showHeaderLogin$: Observable;\n profileName$: Observable;\n profileType$: Observable;\n unpaidServices$: Observable;\n bookingSummary$: Observable;\n orderSummary$: Observable<{\n locations: BookingLocationCodes[];\n dates: GlobalBookingTripDates;\n paxAmount: number;\n }>;\n isMobile$: Observable;\n isTablet$: Observable;\n boundsStatus$: Observable;\n shouldEnableGlobalBookingWidget$: Observable;\n private subscriptions: Subscription = new Subscription();\n\n constructor(\n @Inject(PLATFORM_ID) private platform: unknown,\n private bookingService: BookingService,\n private navigationMenuService: NavigationMenuService,\n private languageService: LanguageService,\n private router: Router,\n private scrollService: ScrollService,\n private renderer: Renderer2,\n private store$: Store,\n private nativeBridgeService: NativeBridgeService,\n private pageMetaService: PageMetaService,\n private gtmService: GtmService,\n private mediaQueryService: MediaQueryService,\n public joinService: JoinService,\n _bookingGtmService: BookingGtmService // to get service into background\n ) {\n this.currentStep$ = this.bookingService.step;\n this.isFirstStep$ = this.bookingService.isFirstStep();\n this.isMobile$ = this.mediaQueryService.isBreakpoint$('mobile');\n this.isTablet$ = this.mediaQueryService.isBreakpoint$('tablet');\n\n this.orderSummary$ = this.store$.pipe(\n orderData(),\n filter((order) => Boolean(order?.bounds.length > 0)),\n map((order) => {\n return {\n dates: {\n departureDate: TzDate.of(order.bounds[0].departure.dateTime)?.toLocalDate(),\n returnDate:\n order.bounds.length > 1\n ? TzDate.of(order.bounds[order.bounds.length - 1].arrival.dateTime)?.toLocalDate()\n : null,\n },\n locations: order.bounds.map((bound) => ({\n originLocationCode: bound.departure.locationCode,\n destinationLocationCode: bound.arrival.locationCode,\n })),\n paxAmount: order.passengers.length,\n };\n })\n );\n\n this.bookingSummary$ = combineLatest([\n this.store$.pipe(boundsStatus(), startWith(null)),\n this.store$.pipe(offersStatus(), startWith(null)),\n this.store$.pipe(select(selectMultiCityStatus), startWith(null)),\n ]).pipe(\n withLatestFrom(this.store$.pipe(globalBookingSelections()), this.orderSummary$.pipe(startWith(null))),\n filter(\n ([_, globalBooking, orderSummary]) =>\n globalBooking.flights.some((flight) => isPresent(flight.origin) && isPresent(flight.destination)) ||\n isPresent(orderSummary)\n ),\n map(([_, { flights, paxAmount }, orderSummary]) => {\n const bookingLocations: BookingLocationCodes[] = flights\n .filter((flight) => isPresent(flight.origin) && isPresent(flight.destination))\n .map((flight: GlobalBookingFlight) => ({\n originLocationCode: flight.origin.locationCode,\n destinationLocationCode: flight.destination.locationCode,\n }));\n\n const bookingPaxAmount = paxAmount.adults + paxAmount.children + paxAmount.c15s + paxAmount.infants;\n const dates: GlobalBookingTripDates = { departureDate: flights[0]?.departureDate };\n\n if (flights.length > 1) {\n dates.returnDate = flights[flights.length - 1].departureDate;\n }\n\n return {\n tripType: bookingLocations.length\n ? getTripTypeFromBookingLocationCodes(bookingLocations)\n : getTripTypeFromBookingLocationCodes(orderSummary.locations),\n locations: bookingLocations.length ? bookingLocations : orderSummary.locations,\n paxAmount: bookingLocations.length ? bookingPaxAmount : orderSummary.paxAmount,\n dates: bookingLocations.length ? dates : orderSummary.dates,\n };\n })\n );\n\n this.homeLink$ = this.languageService.lang.pipe(map((lang) => `/${lang}`));\n this.isNavigationMenuOpen$ = this.navigationMenuService.isNavigationMenuOpen$;\n\n this.onNavigationSetBookingServiceStepFromUrl();\n\n this.showBasket$ = combineLatest([this.bookingService.step, this.isMobile$]).pipe(\n map(\n ([step, isMobile]) =>\n step.phase === BOOKING_STEPS.PAXDETAILS.phase ||\n step.phase === BOOKING_STEPS.ANCILLARIES.phase ||\n (step.phase === BOOKING_STEPS.FLIGHT_SELECTION.phase && isMobile)\n ),\n distinctUntilChanged(),\n finShare()\n );\n\n this.isBookingFrontPage$ = this.bookingService.step.pipe(map((step) => step.phase === BOOKING_STEPS.ENTRY.phase));\n }\n\n ngOnInit(): void {\n this.loginStatus$ = this.store$.pipe(loginStatus());\n this.profileName$ = this.store$.pipe(profileName());\n this.profileType$ = this.store$.pipe(profileType());\n\n this.scrollToTopOnStepChange();\n\n this.bindBasketHandling();\n\n this.initButtonVisibilities();\n\n const showLinks$ = this.store$.pipe(\n orderData(),\n startWith(undefined as FinnairOrder),\n map((o) => !o),\n distinctUntilChanged(),\n finShare()\n );\n\n this.breadcrumbs$ = combineLatest([\n this.currentStep$,\n this.languageService.translate('phases.title'),\n showLinks$,\n this.store$.pipe(cartData(), startWith(undefined)),\n ]).pipe(\n map(([currentStage, breadcrumbs, showLinks, cartData]) => {\n const hideAncillaries =\n cartData && !cartData.controlData.sellAncillariesOutbound && !cartData.controlData.sellAncillariesInbound;\n return this.formatBreadcrumbs(currentStage, breadcrumbs, showLinks, hideAncillaries);\n })\n );\n\n this.phasesAria$ = this.languageService.translate('phases.aria');\n\n this.showHeaderBack$ = combineLatest([this.bookingService.step, showLinks$]).pipe(\n map(\n ([currentStep, showLinks]) =>\n showLinks &&\n BOOKING_STEPS.ENTRY.id !== currentStep.id &&\n (this.nativeBridgeService.isInsideNativeWebView\n ? true\n : BOOKING_STEPS.FLIGHT_SELECTION.id !== currentStep.id) &&\n BOOKING_STEPS.PURCHASE_SUCCESS.id !== currentStep.id\n ),\n distinctUntilChanged()\n );\n\n this.showHeaderLogin$ = combineLatest([this.bookingService.step, this.loginStatus$]).pipe(\n map(([step, status]) => {\n if (this.nativeBridgeService.isInsideNativeWebView) {\n return false;\n }\n\n if (step.id > BOOKING_STEPS.PAXDETAILS.id) {\n return false;\n }\n\n return SHOW_BUTTON_STATES.indexOf(status) !== -1;\n })\n );\n\n this.subscriptions.add(\n this.currentStep$\n .pipe(\n distinctUntilChanged((prevStep, curStep) => prevStep.path === curStep.path),\n switchMap((step) => this.languageService.translate(`phases.title.${step.translationKey}`))\n )\n .subscribe((title) => {\n this.pageMetaService.setTitle(`${title} | Finnair`);\n })\n );\n\n if (isPlatformBrowser(this.platform)) {\n this.subscriptions.add(\n this.nativeBridgeService.backButtonPressed.subscribe(() => {\n this.bookingService.prevStep();\n })\n );\n }\n\n this.unpaidServices$ = this.store$.pipe(currentServices());\n }\n\n ngOnDestroy(): void {\n this.store$.dispatch(BookingActions.reset());\n unsubscribe(this.subscriptions);\n }\n\n setActive(next: Step): void {\n if (!next) {\n return;\n }\n if (next.id !== this.bookingService.currentStep.id) {\n this.bookingService.setStep({\n step: next,\n });\n }\n }\n\n navigateToStep(step: Breadcrumb): void {\n const bookingStep = BOOKING_STEPS_ARRAY.find((item) => item.id === step.id);\n\n this.bookingService.setStep({\n step: bookingStep,\n });\n }\n\n activateSelectionPhase(step: Step, locale?: string): void {\n const bookingStep = BOOKING_STEPS_ARRAY.find((item) => item.id === step.id);\n this.bookingService.setStep({ step: bookingStep, locale });\n }\n\n navigateBack(_event: Event): void {\n this.gtmService.trackElement(\n 'booking-flow-hamburger-navi-back',\n GaContext.BOOKING_FLOW,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.CLICK\n );\n //go to previous step\n this.bookingService.prevStep();\n }\n\n toggleMenu(): void {\n this.navigationMenuService.toggleMenuOpen();\n }\n\n openBasket(): void {\n this.basketOpen$.next(true);\n }\n\n closeBasket(): void {\n this.basketOpen$.next(false);\n }\n\n edit(step: Step): void {\n this.basketOpen$.next(false);\n this.setActive(step);\n }\n\n formatBreadcrumbs(\n currentStep: Step,\n breadcrumbs: Record,\n activateLinks: boolean,\n hideAncillaries: boolean\n ): Breadcrumb[] {\n return BOOKING_STEPS_ARRAY.filter((step) => !hideAncillaries || step.id !== BOOKING_STEPS.ANCILLARIES.id)\n .filter((step) => step.id !== BOOKING_STEPS.ENTRY.id)\n .map((step) => {\n if (step.id > BOOKING_STEPS.CHECKOUT.id) {\n return;\n }\n\n const confirmationPageActive: boolean =\n currentStep.id === BOOKING_STEPS.PURCHASE_SUCCESS.id ? step.id === BOOKING_STEPS.CHECKOUT.id : false;\n\n return {\n id: step.id,\n name: breadcrumbs[step.translationKey],\n active: step.id === currentStep.id || confirmationPageActive,\n disabled: !activateLinks || currentStep.id === BOOKING_STEPS.PURCHASE_SUCCESS.id,\n };\n })\n .filter(Boolean);\n }\n\n onHomeClick(url: string): void {\n this.router.navigateByUrl(url);\n }\n\n private scrollToTopOnStepChange() {\n this.subscriptions.add(\n this.router.events.pipe(filter(isNavigationEvent)).subscribe(() => {\n this.scrollService.scrollTop();\n })\n );\n }\n\n private onNavigationSetBookingServiceStepFromUrl() {\n // Initial navigation\n this.setStepFromUrl(this.router.routerState.snapshot.url);\n\n const navigationEnd$: Observable = this.router.events.pipe(\n filter((e) => e instanceof NavigationEnd),\n finShare()\n );\n\n this.isErrorRoute$ = navigationEnd$.pipe(\n map((event) => event.url.includes(ERROR_STEPS.ERROR.path)),\n startWith(false)\n );\n\n // Successful navigation, e.g., back button or other router.navigate\n this.subscriptions.add(\n navigationEnd$.subscribe((event: NavigationEnd) => {\n this.setStepFromUrl(event.url);\n })\n );\n }\n\n private setStepFromUrl(url: string) {\n this.bookingService.setStep({\n step: getBookingStepFromUrl(url),\n skipRouteChange: true,\n });\n }\n\n private bindBasketHandling() {\n const hideModal$: Observable = new Observable((observer) => {\n return this.renderer.listen('window', 'resize', (event: Event) => observer.next(event.target['innerWidth']));\n }).pipe(\n debounceTime(100),\n filter((width) => width >= 600),\n mapTo(false)\n );\n\n this.subscriptions.add(hideModal$.subscribe(this.basketOpen$));\n this.subscriptions.add(\n this.basketOpen$\n .pipe(map((basketOpen) => this.navigationMenuService.modalOpenSubject$.next(basketOpen)))\n .subscribe()\n );\n }\n\n private initButtonVisibilities(): void {\n this.hasBasket$ = combineLatest([\n this.isFirstStep$,\n this.navigationMenuService.isNavigationMenuOpen$,\n this.currentStep$,\n this.bookingSummary$,\n ]).pipe(\n map(\n ([, isNavigationMenuOpen, currentStep, bookingSummary]) =>\n !isNavigationMenuOpen &&\n currentStep.id < BOOKING_STEPS.PURCHASE_REVIEW.id &&\n !(currentStep.id === BOOKING_STEPS.FLIGHT_SELECTION.id && bookingSummary.tripType !== TripType.MULTICITY)\n ),\n finShare(),\n distinctUntilChanged()\n );\n\n this.enableModifySearch$ = combineLatest([this.hasBasket$, this.currentStep$]).pipe(\n map(([hasBasket, currentStep]) => !hasBasket && currentStep.id === BOOKING_STEPS.FLIGHT_SELECTION.id)\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { ComponentsModule, DirectiveModule, PipesModule } from '@fcom/common';\nimport { BookingWidgetModule } from '@fcom/booking-widget/booking-widget.module';\n\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { BookingEntryRouteComponent } from './routes/booking-entry-route.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n BookingCommonModule,\n PipesModule,\n DirectiveModule,\n UiTranslateModule,\n BookingWidgetModule,\n ],\n declarations: [BookingEntryRouteComponent],\n exports: [BookingEntryRouteComponent],\n providers: [],\n})\nexport class EntryModule {}\n","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { NativeBridgeService } from '@fcom/core';\n\n@Component({\n selector: 'fin-booking-entry-route',\n template: `\n
\n \n
\n `,\n styleUrls: ['booking-entry-route.component.scss'],\n})\nexport class BookingEntryRouteComponent implements OnInit {\n shouldRender: boolean;\n\n constructor(\n private nativeBridge: NativeBridgeService,\n private languageService: LanguageService,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n this.shouldRender = this.nativeBridge.isInsideNativeWebView;\n\n // Redirect non-mobile-app requests to front page\n if (!this.nativeBridge.isInsideNativeWebView) {\n this.router.navigate([`/${this.languageService.langValue}`], {\n replaceUrl: true,\n queryParamsHandling: 'preserve',\n });\n return;\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 } from '@ngrx/store';\n\nimport { CartStatus } from '@fcom/dapi/interfaces';\nimport { snapshot } from '@fcom/rx';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState } from '@fcom/common/interfaces/booking/booking-state.interface';\n\nimport { cartStatus } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\n\n@Injectable()\nexport class PaxDetailsGuard implements CanActivate {\n constructor(\n private store$: Store,\n private bookingService: BookingService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate() {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n const canAccess: boolean = snapshot(this.store$.pipe(cartStatus())) !== CartStatus.INITIAL;\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.FLIGHT_SELECTION });\n }\n\n return canAccess;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ButtonModule, ModalModule, UiComponentsModule } from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { CmsModule } from '@fcom/cms/components';\nimport { ComponentsModule, DirectiveModule, FinFormsModule, PipesModule } from '@fcom/common';\nimport { GtmModule } from '@fcom/common/gtm';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/components';\nimport { DataCloudModule } from '@fcom/common/datacloud';\n\nimport { BookingNotificationModule } from '../../components/booking-notification/booking-notification.module';\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { KoreaNotificationComponent } from './components/korea-notification.component';\nimport { PaxDetailsFormComponent } from './components/pax-details-form.component';\nimport { PaxDetailsComponent } from './components/pax-details.component';\nimport { BookingPaxDetailsRouteComponent } from './routes/booking-pax-details-route.component';\nimport { PaxDetailsGuard } from './services/pax-details.guard';\nimport { PaxAncillariesComponent } from './components/pax-ancillaries/pax-ancillaries.component';\nimport { UpgradePromotionComponent } from './components/upgrade-promotion/upgrade-promotion.component';\nimport { PaxAncillaryProductComponent } from './components/pax-ancillary-product/pax-ancillary-product.component';\nimport { UpgradePromotionModalComponent } from './components/upgrade-promotion/upgrade-promotion-modal.component';\nimport { PaxDetailsMarketingConsentComponent } from './components/pax-details-marketing-consent/pax-details-marketing-consent.component';\nimport { PaxShortcutToPayComponent } from './components/pax-shortcut-to-pay/pax-shortcut-to-pay.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n BookingCommonModule,\n FormsModule,\n FinFormsModule,\n GtmModule,\n DataCloudModule,\n CmsModule,\n PipesModule,\n DirectiveModule,\n UiTranslateModule,\n ButtonModule,\n ModalModule,\n CommonBookingComponentsModule,\n UiComponentsModule,\n BookingNotificationModule,\n ],\n declarations: [\n BookingPaxDetailsRouteComponent,\n PaxDetailsComponent,\n PaxDetailsFormComponent,\n PaxDetailsMarketingConsentComponent,\n KoreaNotificationComponent,\n PaxAncillariesComponent,\n PaxAncillaryProductComponent,\n PaxShortcutToPayComponent,\n UpgradePromotionComponent,\n UpgradePromotionModalComponent,\n ],\n exports: [BookingPaxDetailsRouteComponent, PaxAncillaryProductComponent],\n providers: [PaxDetailsGuard],\n})\nexport class PaxDetailsModule {}\n","import { Category } from '@fcom/dapi/api/models';\n\nexport const ENABLED_PAX_ANCILLARY_CATEGORIES = [Category.BAGGAGE, Category.LOUNGE];\n","
\n \n \n
\n \n
\n
\n \n
\n\n\n
\n
\n {{ 'paxDetails.marketingConsent.flightOffersDescription' | finLocalization }}\n
\n
\n \n {{ 'paxDetails.marketingConsent.signUpMarketingNewsletter' | finLocalization }}\n \n \n {{ 'paxDetails.marketingConsent.signUpAnalytics' | finLocalization }}\n \n
\n \n
\n
\n\n\n \n
\n \n {{\n (marketingConsentType === MarketingConsentType.MEMBER_OFFERS\n ? 'paxDetails.marketingConsent.memberOffers'\n : 'paxDetails.marketingConsent.flightOffers'\n ) | finLocalization\n }}\n \n \n
\n
\n","import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, iif, Observable, of, Subscription } from 'rxjs';\nimport { catchError, filter, map, switchMap, take, withLatestFrom } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { Consent, ConsentGroup, ConsentStatus, ConsentTextId } from '@fcom/common/interfaces';\nimport { loginToken, profileOrUndefinedIfNotLoggedIn, profileType } from '@fcom/core/selectors';\nimport { finShare } from '@fcom/rx';\nimport { ConsentService } from '@fcom/common/login';\nimport {\n NewsletterSignupPayload,\n NewsletterSignupResponse,\n NewsLetterSource,\n} from '@fcom/cms/interfaces/newsletter-signup.interface';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { NewsletterSignupService } from '@fcom/cms';\nimport { SentryLogger } from '@fcom/core/services';\nimport { CheckboxComponent } from '@fcom/ui-components';\nimport { TypedFormArray, TypedFormGroup } from '@fcom/service-forms';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { unsubscribe } from '@fcom/core/utils';\n\nexport enum MarketingConsentType {\n NEWSLETTER = 'NEWSLETTER',\n FLIGHT_OFFERS = 'FLIGHT_OFFERS',\n MEMBER_OFFERS = 'MEMBER_OFFERS',\n}\n\ninterface NewsLetterForm {\n advertising: FormControl;\n marketingNewsletter: FormControl;\n}\n\n@Component({\n selector: 'fin-pax-details-marketing-consent',\n templateUrl: './pax-details-marketing-consent.component.html',\n})\nexport class PaxDetailsMarketingConsentComponent implements OnInit, OnDestroy {\n public readonly MarketingConsentType = MarketingConsentType;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input() passengers: TypedFormArray>;\n\n @ViewChild('consentCheck') private consentCheck: CheckboxComponent;\n\n marketingConsentOpen = true;\n marketingConsentType$: Observable = of(undefined);\n consents$: Observable;\n formGroup: FormGroup;\n subscriptions = new Subscription();\n\n constructor(\n private router: Router,\n private consentService: ConsentService,\n private languageService: LanguageService,\n private newsletterService: NewsletterSignupService,\n private sentryLogger: SentryLogger,\n private store$: Store\n ) {}\n\n ngOnInit(): void {\n this.marketingConsentType$ = this.getMarketingConsentType();\n this.formGroup = new FormGroup({\n marketingNewsletter: new FormControl(false),\n advertising: new FormControl({ value: false, disabled: true }),\n });\n\n this.subscriptions.add(\n this.formGroup.controls.marketingNewsletter.valueChanges.subscribe((marketingEnabled) => {\n if (marketingEnabled) {\n this.formGroup.controls.advertising.enable();\n } else {\n this.formGroup.controls.advertising.setValue(false);\n this.formGroup.controls.advertising.disable();\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n private getMarketingConsentType(): Observable {\n return this.store$.pipe(\n profileOrUndefinedIfNotLoggedIn(),\n switchMap((userProfile) =>\n iif(() => !!userProfile, this.getMemberConsent(), of(MarketingConsentType.NEWSLETTER))\n ),\n finShare()\n );\n }\n\n private getMemberConsent(): Observable {\n this.consents$ = combineLatest([\n this.store$.pipe(loginToken(), filter(Boolean), take(1)),\n this.store$.pipe(profileType(), filter(Boolean), take(1)),\n ]).pipe(\n switchMap(([token, type]) => this.consentService.getMarketingConsents({ token }, type)),\n map((consentGroup: ConsentGroup) => consentGroup?.consents)\n );\n\n return this.consents$.pipe(\n map((consents) => {\n const flightOffersAccepted = consents?.find(\n (c) => c.consentTextId === ConsentTextId.FLIGHT_OFFERS && c.consentStatus === ConsentStatus.ACCEPTED\n );\n if (!flightOffersAccepted) {\n return MarketingConsentType.FLIGHT_OFFERS;\n }\n const memberOffersAccepted = consents?.find(\n (c) => c.consentTextId === ConsentTextId.MEMBER_OFFERS && c.consentStatus === ConsentStatus.ACCEPTED\n );\n if (!memberOffersAccepted) {\n return MarketingConsentType.MEMBER_OFFERS;\n }\n return undefined;\n })\n );\n }\n\n public setMarketingConsent(): Observable {\n return this.marketingConsentType$.pipe(\n take(1),\n switchMap((type) => {\n switch (type) {\n case MarketingConsentType.FLIGHT_OFFERS:\n return this.addConsent(ConsentTextId.FLIGHT_OFFERS);\n case MarketingConsentType.MEMBER_OFFERS:\n return this.addConsent(ConsentTextId.MEMBER_OFFERS);\n case MarketingConsentType.NEWSLETTER:\n default:\n return this.subscribeToNewsletter();\n }\n }),\n catchError((e: unknown) => {\n this.sentryLogger.error('Failed to set marketing consents', e);\n return of(false);\n })\n );\n }\n\n private addConsent(textId: string): Observable {\n if (!this.consentCheck?.checked) {\n return of(false);\n }\n return this.consents$.pipe(\n map((consents) =>\n consents?.map((c: Consent) => ({\n ...c,\n consentStatus: c.consentTextId === textId ? ConsentStatus.ACCEPTED : c.consentStatus,\n }))\n ),\n withLatestFrom(this.store$.pipe(loginToken())),\n switchMap(([consents, token]) => this.consentService.sendConsents({ token }, consents, 'booking_flow'))\n );\n }\n\n private subscribeToNewsletter(): Observable {\n // Skip newsletter subscribing if none of the checkboxes have been checked\n if (\n !this.consentCheck?.checked &&\n !this.formGroup.get('marketingNewsletter').value &&\n !this.formGroup.get('advertising').value\n ) {\n return of(null);\n }\n const firstPassenger = this.passengers.controls[0];\n return combineLatest([this.languageService.countryCode, this.languageService.langKey]).pipe(\n switchMap(([country, language]: [string, string]) => {\n const payload: NewsletterSignupPayload = {\n firstName: firstPassenger.get('firstName').value,\n lastName: firstPassenger.get('lastName').value,\n email: firstPassenger.get('email').value,\n country: country?.toUpperCase(),\n language: language?.toUpperCase(),\n pageUrl: this.router.url,\n source: NewsLetterSource.BOOKING_FLOW,\n marketingNewsletter: this.formGroup.get('marketingNewsletter').value,\n advertising: this.formGroup.get('advertising').value,\n };\n return this.newsletterService.postSubscribeRequest(payload);\n })\n );\n }\n}\n","\n
\n
\n \n
\n
\n
\n
\n \n

\n {{ customProductTitle || translations?.title }}\n

\n
\n
\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n \n \n {{ translations?.actionText }}\n \n \n {{ actionTextSubTitle }}\n \n \n {{ price$ | async | finPrice }}\n \n
\n \n \n {{ loadingTitle }}\n \n
\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n
\n \n\n\n
\n

{{ serviceInfo.title }}

\n \n
\n
\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { Amount, ServiceCatalogTranslations } from '@fcom/dapi';\nimport { ButtonTheme, IconButtonSize, IconButtonTheme, ModalButtons, ToggleSwitchStatus } from '@fcom/ui-components';\nimport { asTravelerService } from '@fcom/common-booking/store/utils/services.utils';\nimport { ElementActions, ElementTypes, LoaderType } from '@fcom/common/interfaces';\nimport { Category } from '@fcom/dapi/api/models';\nimport { GtmService } from '@fcom/common/gtm';\nimport { LoaderTheme } from '@fcom/ui-components/components/loader/enums';\nimport { CmsImageData } from '@fcom/core-api/interfaces';\n\nimport {\n ServiceCatalogServiceWithSelection,\n PaxServiceCategoryPerFragmentWithSelections,\n ServiceSelectionChange,\n} from '../../interfaces/pax-ancillaries.interface';\n\ninterface ServiceInfo {\n title?: string;\n url: string;\n}\n\n@Component({\n selector: 'fin-pax-ancillary-product',\n templateUrl: './pax-ancillary-product.component.html',\n styleUrls: ['./pax-ancillary-product.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaxAncillaryProductComponent implements OnInit {\n readonly ButtonTheme = ButtonTheme;\n readonly IconButtonTheme = IconButtonTheme;\n readonly IconButtonSize = IconButtonSize;\n readonly LoaderType = LoaderType;\n readonly Category = Category;\n readonly ToggleSwitchStatus = ToggleSwitchStatus;\n readonly ModalButtons = ModalButtons;\n readonly LoaderTheme = LoaderTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input({ required: true })\n categoryWithSelections$: Observable;\n\n @Input({ required: true })\n category: Category;\n\n @Input({ required: true })\n price$: Observable;\n\n @Input({ required: true })\n servicesReady$: Observable;\n\n @Input({ required: true })\n translations: ServiceCatalogTranslations;\n\n @Input({ required: true })\n loadingTitle: string;\n\n @Input() customProductTitle?: string;\n\n @Input()\n isLoading$: Observable;\n\n @Input()\n media?: CmsImageData;\n\n @Input()\n icon?: SvgLibraryIcon;\n\n @Input()\n actionTextSubTitle?: string;\n\n @Input()\n showInfoButton = true;\n\n @Input()\n analyticsContext = 'booking-flow_pax-details';\n\n @Output()\n selectionChanged = new EventEmitter();\n\n serviceInfo: ServiceInfo;\n zeroPrice$: Observable;\n infoModalOpen = false;\n\n constructor(private gtmService: GtmService) {}\n\n ngOnInit(): void {\n this.serviceInfo = this.getServiceInfo();\n this.zeroPrice$ = this.price$.pipe(\n map((price) => {\n return { amount: '0.00', currencyCode: price.currencyCode };\n })\n );\n }\n\n updateServiceSelection(selected: boolean, service: ServiceCatalogServiceWithSelection, fragmentId?: string): void {\n const selection = selected ? asTravelerService(service) : undefined;\n this.selectionChanged.emit({ category: service.category, selection, fragmentId });\n const state = `${service.category}-${selected ? 'added' : 'removed'}`;\n\n this.gtmAnalytic(state);\n }\n\n openInfoModal(): void {\n this.infoModalOpen = true;\n this.gtmAnalytic('more-info');\n }\n\n getServiceInfo(): ServiceInfo {\n return { url: `fragments.services.productInfo.${this.category}.url` };\n }\n\n getFirstValue(\n categoryWithSelections: PaxServiceCategoryPerFragmentWithSelections | null\n ): ServiceCatalogServiceWithSelection | null {\n const firstKey = Object.keys(categoryWithSelections || {})[0];\n return categoryWithSelections?.[firstKey]?.[0] || null;\n }\n\n private gtmAnalytic(state: string): void {\n this.gtmService.trackElement(\n 'pax-ancillaries',\n this.analyticsContext,\n ElementTypes.BUTTON,\n state,\n ElementActions.CLICK\n );\n }\n}\n","
\n

{{ 'paxDetails.paxAncillaries.title' | finLocalization }}

\n \n
\n\n\n \n\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\n\nimport { combineLatest, distinctUntilChanged, map, Observable, take } from 'rxjs';\nimport { Store } from '@ngrx/store';\n\nimport { ServiceCatalogService, TravelerService } from '@fcom/dapi';\nimport { ServicesActions } from '@fcom/common-booking';\nimport { Category, FinnairCart, SubCategory } from '@fcom/dapi/api/models';\nimport { PreciseNumber, mapValues } from '@fcom/core/utils';\nimport { mapSelectionStatusToServices } from '@fcom/common-booking/store/utils/services.utils';\nimport { toAmount } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\nimport {\n PaxServiceCategory,\n PaxServiceSelectionPerFragment,\n PaxServiceSelectionsMap,\n PaxServiceSubTotal,\n ServiceSelectionChange,\n} from '../../interfaces/pax-ancillaries.interface';\nimport { cartData } from '../../../../store/selectors';\n\nconst getCurrencyCode = (selection: TravelerService | TravelerService[], fallBack: string): string => {\n const isArray = Array.isArray(selection);\n return !isArray\n ? selection.pricePerItem?.currencyCode\n : (selection.find((s) => s.pricePerItem?.currencyCode)?.pricePerItem.currencyCode ?? fallBack);\n};\n\nconst getPreciseMultiplication = (amount: string, multiplier: number): PreciseNumber => {\n return PreciseNumber.fromString(amount).multiply(PreciseNumber.from(multiplier, 0));\n};\n\nconst getFragmentSubTotal = (\n fragmentSelection: TravelerService | TravelerService[]\n): { quantity: number; amount: PreciseNumber } => {\n if (Array.isArray(fragmentSelection)) {\n return fragmentSelection.reduce(\n (subTotal, selection) => {\n const fragmentQuantity =\n selection.category === SubCategory.CHECKED_BAGGAGE\n ? subTotal.quantity\n : subTotal.quantity + selection.quantity;\n\n return {\n quantity: fragmentQuantity,\n amount: subTotal.amount.add(getPreciseMultiplication(selection.pricePerItem.amount, selection.quantity)),\n };\n },\n {\n quantity: 0,\n amount: PreciseNumber.ZERO,\n }\n );\n }\n\n return {\n quantity: fragmentSelection.quantity,\n amount: getPreciseMultiplication(fragmentSelection.pricePerItem.amount, fragmentSelection.quantity),\n };\n};\n\n@Component({\n selector: 'fin-pax-ancillaries',\n templateUrl: './pax-ancillaries.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaxAncillariesComponent implements OnInit {\n readonly Category = Category;\n\n @Input()\n travelerId: string;\n\n @Input()\n services$: Observable;\n\n @Input()\n selections$: Observable;\n\n @Input()\n servicesReady$: Observable;\n\n servicesWithSelectionsAndPrices$: Observable;\n fallBackCurrencyCode$: Observable;\n\n constructor(private store$: Store) {}\n\n ngOnInit(): void {\n this.fallBackCurrencyCode$ = this.store$.pipe(\n cartData(),\n take(1),\n map((cd: FinnairCart) => cd.prices.unpaid?.total?.total.totalAmount.currencyCode)\n );\n\n this.servicesWithSelectionsAndPrices$ = combineLatest([\n this.services$,\n this.selections$.pipe(distinctUntilChanged((prev, next) => JSON.stringify(prev) === JSON.stringify(next))),\n this.fallBackCurrencyCode$,\n ]).pipe(\n map(([services, selections, fallbackCurrencyCode]) => {\n return this.mapSelectionsAndSubTotalPriceToCategoryServices(services, selections, fallbackCurrencyCode);\n })\n );\n }\n\n updateSelectionsForFragment({ category, selection, fragmentId }: ServiceSelectionChange): void {\n this.store$.dispatch(\n ServicesActions.setSelectionForFragmentForTraveler({\n category,\n fragmentId,\n travelerId: this.travelerId,\n selection,\n })\n );\n }\n\n private mapSelectionsAndSubTotalPriceToCategoryServices(\n serviceCategories: PaxServiceCategory[],\n selections: PaxServiceSelectionsMap,\n fallbackCurrencyCode: string\n ): PaxServiceCategory[] {\n return serviceCategories.reduce((allCategories, category) => {\n const categoryWithSelections = {\n ...category,\n services: mapValues(category.services, (servicesForFragment: ServiceCatalogService[], fragmentId) =>\n mapSelectionStatusToServices(servicesForFragment, selections?.[category.category]?.[fragmentId])\n ),\n subTotal: this.calculateCategorySubTotal(selections?.[category.category], fallbackCurrencyCode),\n };\n return [...allCategories, categoryWithSelections];\n }, []);\n }\n\n private calculateCategorySubTotal(\n selectionsForCategory: PaxServiceSelectionPerFragment = {},\n fallbackCurrencyCode: string\n ): PaxServiceSubTotal {\n const subTotal = Object.values(selectionsForCategory)\n .filter((value) => value !== undefined)\n .reduce(\n (\n categorySubTotal: { quantity: number; price: { amount: PreciseNumber; currencyCode: string } },\n fragmentSelection: TravelerService | TravelerService[]\n ) => {\n const fragmentSubtotal = getFragmentSubTotal(fragmentSelection);\n\n return {\n quantity: categorySubTotal.quantity + fragmentSubtotal.quantity,\n price: {\n amount: categorySubTotal.price.amount.add(fragmentSubtotal.amount),\n currencyCode: getCurrencyCode(fragmentSelection, fallbackCurrencyCode),\n },\n };\n },\n {\n quantity: 0,\n price: {\n amount: PreciseNumber.ZERO,\n currencyCode: fallbackCurrencyCode,\n },\n }\n );\n\n return {\n ...subTotal,\n price: toAmount(subTotal.price),\n };\n }\n}\n","\n
\n

\n {{ 'paxDetails.shortCutFlowNotification.title' | finLocalization }}\n

\n \n {{ 'paxDetails.shortCutFlowNotification.paragraph' | finLocalization }}\n \n
\n \n\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { ButtonMode, ModalButtons, NotificationTheme } from '@fcom/ui-components';\nimport { LoginStatus, ProfileType } from '@fcom/core-api/login';\nimport { loginStatus, profileType } from '@fcom/core/selectors';\nimport { FinnairCart } from '@fcom/dapi/api/models';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\n@Component({\n selector: 'fin-pax-shortcut-to-pay',\n templateUrl: 'pax-shortcut-to-pay.component.html',\n styleUrls: ['pax-shortcut-to-pay.component.scss'],\n})\nexport class PaxShortcutToPayComponent implements OnInit, OnDestroy {\n @Input()\n cartData$: Observable;\n\n @Output()\n buttonClick: EventEmitter<{ skipToCheckout: boolean }> = new EventEmitter<{ skipToCheckout: boolean }>();\n\n readonly NotificationTheme = NotificationTheme;\n readonly ModalButtons = ModalButtons;\n readonly ButtonMode = ButtonMode;\n\n loginStatus$: Observable;\n profileType$: Observable;\n shortCutFlowActive$: Observable;\n\n private subscription = new Subscription();\n\n constructor(private store$: Store) {}\n\n ngOnInit(): void {\n this.loginStatus$ = this.store$.pipe(loginStatus());\n this.profileType$ = this.store$.pipe(profileType());\n\n this.shortCutFlowActive$ = combineLatest([this.cartData$, this.profileType$, this.loginStatus$]).pipe(\n map(([cart, profileType, loginStatus]) => {\n if (loginStatus !== LoginStatus.LOGGED_IN) {\n return false;\n }\n if (profileType === ProfileType.CORPORATE) {\n return true;\n }\n\n return cart.bounds.every((bound) => {\n return bound.fareFamily.name.toLowerCase().includes('flex');\n });\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n}\n","\n\n
\n \n \n \n \n \n \n
\n \n \n\n \n \n \n \n {{ 'paxDetails.fields.travelling.lockedInfo' | finLocalization }}\n \n
\n
\n \n \n \n \n \n\n \n {{\n !paxExpandersOpen[i] && passenger.status === PaxFormStatus.INVALID && this.paxAllowErrorsVisible[i]\n ? ('paxDetails.missingPaxDetails' | finLocalization)\n : (paxSummary$ | async)?.[i]\n }}\n \n \n \n \n
\n {{\n ((servicesReady$ | async) === false\n ? 'paxDetails.paxAncillaries.updatingPrices'\n : (paxServices$ | async)\n ? 'paxDetails.paxAncillaries.pricesUpdated'\n : ''\n ) | finLocalization\n }}\n
\n \n\n

{{ 'paxDetails.more' | finLocalization }}

\n \n \n \n
\n @if (!enableCorporateSeatBenefit) {\n \n \n }\n \n
\n
\n \n\n \n {{ paxForm.get('corporateCode').errors ? ('paxDetails.fields.corporateCode.info' | finLocalization) : '' }}\n \n \n\n \n\n \n\n \n\n\n
\n \n {{ 'price.continueButtonTotal' | finLocalization }}: \n \n {{ 'award.points' | finLocalization: { pointsAmount: points || 0 | finPoints } }} + \n {{\n totalPrice$ | async | finPrice | finEmpty: '–'\n }}\n \n \n \n \n \n \n
\n\n","import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport {\n AbstractControl,\n FormGroup,\n UntypedFormArray,\n UntypedFormBuilder,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, EMPTY, NEVER, Observable, of, Subscription } from 'rxjs';\nimport {\n delay,\n distinctUntilChanged,\n filter,\n map,\n pairwise,\n startWith,\n switchMap,\n take,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport memoize from 'lodash.memoize';\n\nimport { ButtonPosition, CheckBoxTheme, LoaderTheme, NotificationTheme } from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { Airline, ElementActions, ElementTypes, GaContext, SelectOption } from '@fcom/common/interfaces';\nimport { ScrollService } from '@fcom/common/services';\nimport { ValidationErrors } from '@fcom/common/utils';\nimport { ConfigService, SentryLogger } from '@fcom/core';\nimport { LoginStatus, Profile, ProfileType } from '@fcom/core-api/login';\nimport { loginStatus, profile, profileType as selectProfileType } from '@fcom/core/selectors';\nimport { Amount, CartStatus, PaxDetailsFormData, ServiceAvailability, ServiceSelections } from '@fcom/dapi';\nimport { asPaxTypeKey } from '@fcom/dapi/utils';\nimport { finShare, safeMap as safeMapObs, zipWithLastValue } from '@fcom/rx';\nimport {\n EMAIL_PATTERN,\n entrySet,\n FREQUENT_FLIER_AIRLINES,\n getAirlineNameByCode,\n isEmptyObjectOrHasEmptyValues,\n isPresent,\n mapValues,\n mergeDeep,\n noop,\n rangeFrom,\n trimAndReplaceWhitespace,\n unsubscribe,\n valuesOf,\n} from '@fcom/core/utils';\nimport { Category, ControlData, FinnairCart, FinnairPassengerCode, FinnairPassengerItem } from '@fcom/dapi/api/models';\nimport { additionalEmailValidator, isFlight, toAmount } from '@fcom/common-booking/utils/common-booking.utils';\nimport { PaxFormFields } from '@fcom/common-booking/services/passenger-form.service';\nimport { formatDateOfBirth } from '@fcom/common-booking/utils/date-utils';\nimport { TypedFormArray, TypedFormGroup } from '@fcom/service-forms';\nimport {\n PassengerDetails,\n PassengerFormService,\n PrefillSource,\n selectionMapForCategoriesForTravelers,\n serviceAvailability,\n serviceMapForCategoriesForTravelers,\n servicesReady,\n totalPriceForSelectionsForCategories,\n} from '@fcom/common-booking';\nimport { GtmService } from '@fcom/common/gtm';\nimport { BookingAppState, PaxDetailsState } from '@fcom/common/interfaces/booking';\nimport { profileOrUndefinedIfNotLoggedIn } from '@fcom/core/selectors/login.selector';\nimport { CorporateUser } from '@fcom/common/interfaces/corporate/corporate.interface';\nimport { CorporateService } from '@fcom/common/services/corporate/corporate.service';\nimport { isCorporateAdminOrTravelBooker } from '@fcom/common/login/services/utils';\n\nimport { indexesOfWantedValue, onlyChangedValues } from '../../../utils';\nimport { PaxDetailsActions } from '../../../store/actions';\nimport { AppConstants } from '../../../app-constants';\nimport {\n additionalEmails as selectAdditionalEmails,\n filteredPaxDetails,\n paxDetails as selectPaxDetails,\n paxDetails,\n} from '../../../store/selectors';\nimport { PaxServiceCategories, PaxServiceCategory } from '../interfaces/pax-ancillaries.interface';\nimport { BookingQueueService } from '../../../services';\nimport { ENABLED_PAX_ANCILLARY_CATEGORIES } from '../constants';\nimport { PaxDetailsMarketingConsentComponent } from './pax-details-marketing-consent/pax-details-marketing-consent.component';\nimport { setPaxDetails } from '../../../store/actions/pax-details.actions';\n\nconst airlineToOption = ({ name, code }: Airline): SelectOption =>\n name && {\n name,\n value: code,\n };\n\nconst touchAllControls = (group: UntypedFormGroup) =>\n valuesOf(group.controls).forEach((control: AbstractControl) => {\n if (control instanceof UntypedFormGroup) {\n touchAllControls(control);\n }\n control.markAsTouched();\n });\n\nconst includesEnabledPaxAncillaryCategories = (availability: ServiceAvailability): boolean =>\n ENABLED_PAX_ANCILLARY_CATEGORIES.some(\n (category) =>\n isPresent(availability[category]) &&\n !isEmptyObjectOrHasEmptyValues(availability[category]) &&\n entrySet(availability[category]).some(({ value }) => value === true)\n );\n\nconst getTravelerIdsExcludingInfants = (passengers: FinnairPassengerItem[] = []): string[] =>\n passengers.filter((p) => p.passengerTypeCode !== FinnairPassengerCode.INF).map((p) => p.id);\n\nconst removeCancellationCoverFromNonPrimaryPax = (\n services: PaxServiceCategories,\n primaryPaxId: string\n): PaxServiceCategories =>\n mapValues(services, (travelerServices, travelerId) =>\n // we only want to show the cancellation cover for primaryPax so it is removed for nonPrimaryPax\n travelerId !== primaryPaxId ? travelerServices.filter((s) => s.category !== Category.COVER) : travelerServices\n );\n\nconst getAllCartFragmentIds = (cartData: FinnairCart, onlyBounds = false): string[] => {\n return onlyBounds\n ? cartData.bounds.flatMap((b) => b.id)\n : cartData.bounds\n .flatMap((b) => b.itinerary)\n .filter(isFlight)\n .map((i) => i.id);\n};\n\n/**\n * OnD is origin and destination\n */\nconst getFragmentOnDTranslationsForService = (\n service: PaxServiceCategory,\n cartData: FinnairCart\n): Record => {\n const fragmentIds: string[] = getAllCartFragmentIds(cartData, service.isBoundBased);\n\n return fragmentIds.reduce((translations, fragmentId) => {\n const boundOrFlight = service.isBoundBased\n ? cartData.bounds.find((b) => b.id === fragmentId)\n : cartData.bounds\n .flatMap((b) => b.itinerary)\n .filter(isFlight)\n .find((i) => i.id === fragmentId);\n\n return {\n ...translations,\n [fragmentId]: `${cartData.locations[boundOrFlight?.departure.locationCode].cityName} – ${\n cartData.locations[boundOrFlight?.arrival.locationCode].cityName\n }`,\n };\n }, {});\n};\n\nconst mapDisplayTitlesForPaxAncillaries = (\n services: PaxServiceCategories,\n cartData: FinnairCart\n): PaxServiceCategories => {\n return mapValues(services, (servicesForTraveler) => {\n return servicesForTraveler.map((service) => {\n return {\n ...service,\n translations: {\n ...service.translations,\n displayTitle: getFragmentOnDTranslationsForService(service, cartData),\n },\n };\n });\n });\n};\n\nenum PaxFormStatus {\n INITIAL = 'INITIAL',\n ERROR = 'ERROR',\n VALID = 'VALID',\n INVALID = 'INVALID',\n}\n\n/**\n * Offset for scrolling when having errored fields and clicking continue.\n * Accounts for header height and probable input field height.\n */\nconst ERROR_SCROLL_OFFSET = 150;\n\n@Component({\n selector: 'fin-pax-details-form',\n styleUrls: ['pax-details-form.component.scss'],\n templateUrl: 'pax-details-form.component.html',\n})\nexport class PaxDetailsFormComponent implements OnInit, OnDestroy {\n @Input()\n cartStatus$: Observable;\n @Input()\n cartData$: Observable;\n @Output()\n ready: EventEmitter<{ skipToCheckout: boolean }> = new EventEmitter<{ skipToCheckout: boolean }>();\n @Output()\n infoMessageKey: EventEmitter = new EventEmitter();\n @Output()\n unlockTravelingWith: EventEmitter = new EventEmitter();\n\n @ViewChild('marketingConsent') marketingConsent: PaxDetailsMarketingConsentComponent;\n\n public readonly C = AppConstants;\n public readonly FIELDS = PaxFormFields;\n public readonly CART_STATUS = CartStatus;\n public readonly ButtonPosition = ButtonPosition;\n public readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n\n readonly CheckBoxTheme = CheckBoxTheme;\n readonly LoaderTheme = LoaderTheme;\n readonly NotificationTheme = NotificationTheme;\n readonly PaxFormStatus = PaxFormStatus;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n totalPrice$: Observable;\n totalPoints$: Observable;\n priceUpdating$: Observable;\n\n paxForm: TypedFormGroup;\n typeLocalizationKeys: string[];\n availableDays: { days$: Observable; months: number[]; years: number[] }[] = [];\n\n selectableLeadPassengers$: Observable = EMPTY;\n phonePrefixes$: Observable;\n frequentFlyerAirlines$: Observable[] = [];\n\n infantTravelingWithLocked$: Observable;\n\n loginStatus$: Observable;\n profileType$: Observable;\n profile$: Observable;\n\n controlData$: Observable;\n\n enablePaxAncillaries$ = of(false);\n enabledPaxServicesAvailable$: Observable;\n\n paxExpandersOpen: boolean[];\n corporateExpanderOpen: boolean;\n paxAllowErrorsVisible: Record = {};\n paxSummary$: Observable;\n\n paxServices$: Observable;\n paxSelections$: Observable;\n servicesReady$: Observable;\n paxAncillariesSubTotal$: Observable;\n additionalEmails$: Observable;\n emailsArray: string[] = [];\n enableCorporateSeatBenefit: boolean;\n enableAdditionalEmailInBookingFlow = false;\n paxFormReady$ = new BehaviorSubject(false);\n corporateUsers$: Observable;\n selectedCorporateUsers$ = new BehaviorSubject([]);\n\n loading = false;\n\n private subscription = new Subscription();\n private timeout: ReturnType;\n private defaultTravelingWithValue: string[] = [];\n\n constructor(\n private fb: UntypedFormBuilder,\n private store$: Store,\n private languageService: LanguageService,\n private scrollService: ScrollService,\n private elementRef: ElementRef,\n private sentryLogger: SentryLogger,\n private bookingQueueService: BookingQueueService,\n private gtmService: GtmService,\n private configService: ConfigService,\n private passengerFormService: PassengerFormService,\n private corporateService: CorporateService\n ) {}\n\n ngOnInit(): void {\n this.loginStatus$ = this.store$.pipe(loginStatus());\n this.profileType$ = this.store$.pipe(selectProfileType());\n this.profile$ = this.store$.pipe(profileOrUndefinedIfNotLoggedIn(), finShare());\n this.controlData$ = this.cartData$.pipe(map((cart) => cart.controlData));\n\n this.additionalEmails$ = this.store$.pipe(take(1), selectAdditionalEmails());\n this.enableAdditionalEmailInBookingFlow = this.configService.cfg.enableAdditionalEmailInBookingFlow;\n this.enableCorporateSeatBenefit = this.configService.cfg.enableCorporateSeatBenefit;\n\n // TODO: Until we know why some cart updates fail, we'll disable the pax-ancillaries feature\n // this.enablePaxAncillaries$ = this.cartData$.pipe(\n // map((cart: FinnairCart) => {\n // const isAward = !!cart?.prices?.unpaid?.total?.total?.totalPoints;\n // return !isAward && cart?.passengers?.length === 1;\n // }),\n // finShare()\n // );\n\n this.setupPaxDetailsFields();\n this.fillInCorporateCodeIfSet();\n this.removeExcessPrefillPassengers();\n this.setUpPaxSummaryText();\n\n this.paxExpandersOpen = new Array(this.passengers.length).fill(false);\n // Main passenger expander should be open by default\n this.paxExpandersOpen[0] = true;\n\n this.totalPrice$ = this.cartData$.pipe(\n map((data: FinnairCart) => data?.prices),\n safeMapObs((prices) => {\n return toAmount(prices.unpaid.total.total.totalAmount);\n })\n );\n this.totalPoints$ = this.cartData$.pipe(\n filter((data: FinnairCart) => !!data?.prices?.unpaid?.total?.total?.totalPoints),\n map((data) => +data.prices.unpaid.total.total.totalPoints.amount)\n );\n this.priceUpdating$ = this.cartStatus$.pipe(map((status: CartStatus) => status !== CartStatus.OK));\n\n const cartForPaxAncillaries$ = this.enablePaxAncillaries$.pipe(\n filter(Boolean),\n switchMap(() => this.cartData$),\n take(1)\n );\n\n this.subscription.add(\n cartForPaxAncillaries$.subscribe(({ passengers }) => {\n this.setupPaxAncillaries(passengers);\n })\n );\n\n this.enabledPaxServicesAvailable$ = this.enablePaxAncillaries$.pipe(\n switchMap((enablePaxAncillaries) => {\n return enablePaxAncillaries\n ? this.store$.pipe(serviceAvailability(), map(includesEnabledPaxAncillaryCategories), finShare())\n : NEVER;\n })\n );\n\n /**\n * If we have paxDetails in store, we want to update the passengers so we get up-to-date services and prices\n * (due to possible frequent flyer cards).\n */\n this.store$\n .pipe(selectPaxDetails())\n .pipe(\n withLatestFrom(this.enabledPaxServicesAvailable$),\n filter(([passengerDetails, enabledPaxServicesAvailable]) => {\n return (\n enabledPaxServicesAvailable &&\n passengerDetails?.passengers.some(\n (pax) => pax.frequentFlyerCard?.cardNumber && pax.frequentFlyerCard?.companyCode\n ) &&\n this.paxForm.valid\n );\n }),\n take(1)\n )\n .subscribe(([passengerDetails]) => {\n this.bookingQueueService.queuePassengersAndCorporateCodeUpdate(passengerDetails);\n });\n\n this.paxAncillariesSubTotal$ = this.enabledPaxServicesAvailable$.pipe(\n filter(Boolean),\n switchMap(() => this.store$.pipe(totalPriceForSelectionsForCategories(ENABLED_PAX_ANCILLARY_CATEGORIES)))\n );\n\n this.paxForm.get('passengers')['controls'].forEach((group: FormGroup, i: number) => {\n if (this.getPaxFormStatus(group).value) {\n touchAllControls(group);\n this.paxAllowErrorsVisible[String(i)] = true;\n }\n });\n\n this.corporateUsers$ = combineLatest([\n this.corporateService.getUsers().pipe(finShare()),\n this.selectedCorporateUsers$,\n ]).pipe(\n finShare(),\n map(([corporateUsers, selectedUsers]) => {\n return corporateUsers.filter((user) => !selectedUsers.includes(user));\n })\n );\n\n this.subscription.add(\n this.store$.pipe(selectPaxDetails()).subscribe((paxState: PaxDetailsState) => {\n this.emailsArray = paxState?.additionalEmails || this.emailsArray;\n\n if (this.emailsArray.length >= 3) {\n this.paxForm.get('additionalEmail').disable();\n } else {\n this.paxForm.get('additionalEmail').enable();\n }\n })\n );\n\n this.subscription.add(\n combineLatest([this.additionalEmails$, this.profileType$])\n .pipe(take(1))\n .subscribe(([additionalEmails, profileType]) => {\n if (\n profileType === ProfileType.CORPORATE ||\n additionalEmails.length > 0 ||\n this.paxForm.get('corporateCode').value\n ) {\n this.corporateExpanderOpen = true;\n }\n })\n );\n }\n\n /**\n * Wait for a user login when on the pax details page. We detect this by seeing if the login\n * status changes from pending to logged in. When it is detected then try and fill the\n * paxForm.\n */\n setUpLoginListener(passengers: PassengerDetails[]): void {\n this.subscription.add(\n this.profile$\n .pipe(\n pairwise(),\n filter(([prev, curr]: [Profile, Profile]) => prev === undefined && !!curr),\n filter(([_, userProfile]: [unknown, Profile]) => !isCorporateAdminOrTravelBooker(userProfile)),\n take(1),\n switchMap(() => this.passengerFormService.prefillData(passengers[0], [PrefillSource.PROFILE]))\n )\n .subscribe(noop)\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n /**\n * If a user enters 2 passengers information, then they go back to the homepage and re-enter with\n * only 1 pax in the search, then pax 2 will need to be deleted so that it is not sent in cart\n * creation.\n */\n removeExcessPrefillPassengers(): void {\n this.subscription.add(\n combineLatest([this.cartData$, this.store$.pipe(paxDetails())])\n .pipe(take(1))\n .subscribe(([cartData, paxDetails]) => {\n const paxIds = cartData.passengers.map((pax) => pax.id);\n const newPassengers = paxDetails.passengers.filter((passenger) => {\n return paxIds.includes(passenger.travelerId);\n });\n\n if (newPassengers.length < paxDetails.passengers.length) {\n this.store$.dispatch(\n setPaxDetails({\n passengers: newPassengers,\n })\n );\n }\n })\n );\n }\n\n paxDetailsReady(skipToCheckout = false): void {\n if (this.paxForm.valid) {\n this.loading = true;\n\n this.subscription.add(\n this.marketingConsent.setMarketingConsent().subscribe(() => {\n this.loading = false;\n this.ready.emit({ skipToCheckout });\n })\n );\n }\n }\n\n validateForm(): void {\n this.paxForm.updateValueAndValidity({ emitEvent: true });\n this.passengers.controls.forEach((group: UntypedFormGroup, index) => {\n touchAllControls(group);\n if (group.status === PaxFormStatus.INVALID) {\n this.paxExpandersOpen[index] = true;\n }\n });\n setTimeout(() => this.scrollService.scrollToFirstInvalidInput(this.elementRef, ERROR_SCROLL_OFFSET, true), 0);\n }\n\n paxTypeLocalizationKey(paxType: FinnairPassengerCode): string {\n return `passenger.${asPaxTypeKey(paxType).toLowerCase()}`;\n }\n\n paxAgeLocalizationKey(type: string): string {\n return `passenger.age.${type}`;\n }\n\n isPrimaryPax(group: UntypedFormGroup): boolean {\n return group[PaxFormFields.isPrimaryPax];\n }\n\n checkFrequentFlyerNumberAndUpdateCart(): void {\n if (this.paxForm.invalid) {\n return;\n }\n this.subscription.add(\n this.cartData$\n .pipe(\n take(1),\n withLatestFrom(this.enabledPaxServicesAvailable$, this.enablePaxAncillaries$),\n filter(([cartData, enabledPaxServicesAvailable, enablePaxAncillaries]) => {\n return (\n enablePaxAncillaries &&\n enabledPaxServicesAvailable &&\n this.passengers.controls.some((passenger) => !this.frequentFlyerCardAlreadyInCart(cartData, passenger))\n );\n }),\n switchMap(() => this.store$.pipe(filteredPaxDetails(this.getValidPassengerIds())).pipe(take(1))),\n filter((passengerDetails) => passengerDetails.passengers?.length > 0)\n )\n .subscribe((passengerDetails) => {\n this.bookingQueueService.queuePassengersAndCorporateCodeUpdate(passengerDetails);\n })\n );\n }\n\n onBlurField(): void {\n this.timeout = setTimeout(() => this.infoMessageKey.emit(''), 100);\n }\n\n onFocusField(next: string): void {\n clearTimeout(this.timeout);\n this.infoMessageKey.emit(next);\n }\n\n onUnlockTravelingWith(event: Event): void {\n this.unlockTravelingWith.emit();\n event.preventDefault();\n }\n\n toggleOpen(passenger: FormGroup, isOpen: boolean, index: number): void {\n this.paxExpandersOpen[index] = !isOpen;\n\n // When closing the expander, trigger validation\n if (isOpen) {\n this.paxForm.get('passengers').get(String(index)).markAllAsTouched();\n this.paxAllowErrorsVisible[String(index)] = this.getPaxFormStatus(passenger).touched;\n }\n }\n\n toggleOpenCorporate(isOpen: boolean): void {\n this.corporateExpanderOpen = !isOpen;\n }\n\n getPaxFormStatus(formGroup: FormGroup): { value: boolean; touched: boolean } {\n const shouldIgnoreValidationCheck = (key: string) =>\n // If value is filled from the infant tab we shouldn't invalidate the whole form for the traveller\n key === PaxFormFields.travelling &&\n [...this.defaultTravelingWithValue, null, undefined].includes(formGroup.get(key)?.value);\n\n const basicInfo = this.getFieldStatus(\n [\n PaxFormFields.gender,\n PaxFormFields.firstName,\n PaxFormFields.lastName,\n PaxFormFields.email,\n PaxFormFields.travelling,\n ],\n formGroup,\n shouldIgnoreValidationCheck\n );\n\n const phoneNumber = this.getNestedFieldStatus(\n PaxFormFields.phone,\n [PaxFormFields.phoneNumber, PaxFormFields.phonePrefix],\n formGroup\n );\n\n const frequentFlyer = this.getNestedFieldStatus(\n PaxFormFields.frequentFlyerCard,\n [PaxFormFields.companyCode, PaxFormFields.cardNumber],\n formGroup\n );\n\n return {\n touched: basicInfo.touched || phoneNumber.touched || frequentFlyer.touched,\n value: basicInfo.value || phoneNumber.value || frequentFlyer.value,\n };\n }\n\n getFieldStatus(\n fields: Array,\n formGroup: FormGroup,\n shouldIgnoreCheck?: (key: string) => boolean\n ): { value: boolean; touched: boolean } {\n return {\n touched: fields.some((key) => (shouldIgnoreCheck?.(key) ? false : formGroup.get(key)?.touched)),\n value: fields.some((key) => (shouldIgnoreCheck?.(key) ? undefined : formGroup.get(key)?.value)),\n };\n }\n\n getNestedFieldStatus(\n parentField: string,\n fields: Array,\n formGroup: FormGroup\n ): { value: boolean; touched: boolean } {\n return {\n touched: fields.some((key) => formGroup.get(parentField)?.get(key)?.touched),\n value: fields.some((key) => formGroup.get(parentField)?.get(key)?.value),\n };\n }\n\n corporateUserSelected(corporateUser: CorporateUser): void {\n const userList = this.selectedCorporateUsers$.value;\n userList.push(corporateUser);\n this.selectedCorporateUsers$.next(userList);\n }\n\n corporateUserCleared(corporateUser: CorporateUser): void {\n const userList = this.selectedCorporateUsers$.value;\n const index = userList.indexOf(corporateUser);\n if (index > -1) {\n userList.splice(index, 1);\n }\n this.selectedCorporateUsers$.next(userList);\n }\n\n private setupPaxDetailsFields() {\n this.subscription.add(\n this.cartData$\n .pipe(\n withLatestFrom(this.store$.pipe(selectPaxDetails())),\n take(1),\n tap(([cartData, paxDetailsSnapshot]: [FinnairCart, PaxDetailsState]) => {\n this.setupPaxFormBase(\n cartData?.otherInformation?.corporateUserInformation?.clientId || paxDetailsSnapshot.corporateCode,\n cartData?.otherInformation?.corporateUserInformation?.clientIdInputDisabled\n );\n }),\n switchMap(([cartData]: [FinnairCart, PaxDetailsState]) => {\n return this.setupTravelers(cartData.passengers);\n })\n )\n .subscribe((passengers: PassengerDetails[]) => {\n this.setupInfantTravelingWithLocking(passengers);\n this.updateStoreFromFormChanges();\n this.triggerInitialValidation();\n /**\n * An immediate update to the store is done to remove any invalid data. For example if\n * the pax types have changed from ADT, ADT to ADT, CHD then we need to remove the old\n * adult from saved data. If we don't they appear in the sidebar until the paxForm is\n * touched.\n */\n this.updatePaxDetailsInStore();\n this.paxFormReady$.next(true);\n this.setUpLoginListener(passengers);\n })\n );\n }\n\n setUpPaxSummaryText(): void {\n this.paxSummary$ = this.store$.pipe(selectPaxDetails()).pipe(\n map(({ passengers }) => {\n return passengers.map(({ firstName, lastName, birthDate, email, phone, frequentFlyerCard }) => {\n const companyName = getAirlineNameByCode(frequentFlyerCard?.companyCode);\n const hasBirthDate = birthDate?.dateOfBirth && birthDate?.monthOfBirth && birthDate?.yearOfBirth;\n\n return `\n ${firstName || ''}\n ${lastName || ''}\n ${hasBirthDate ? ' / ' + formatDateOfBirth(birthDate) : ''}\n ${email ? ' / ' + email : ''}\n ${phone?.phoneNumber ? `/ (+${phone.phonePrefix.split('|')[1]}) ${phone.phoneNumber}` : ''}\n ${frequentFlyerCard?.cardNumber ? `/ ${companyName}, ${frequentFlyerCard.cardNumber}` : ''}\n `.trim();\n });\n }),\n finShare()\n );\n }\n\n private fillInCorporateCodeIfSet() {\n this.subscription.add(\n combineLatest([this.store$.pipe(selectPaxDetails()), this.store$.pipe(profile())])\n .pipe(\n take(1),\n tap(([paxDetails, userProfile]) => {\n this.overrideCorporateCode(paxDetails.corporateCode || userProfile?.corporate?.clientId || '');\n }),\n // We need the delay to give some time for the store to update the paxDetails\n // Without the delay, the form would be valid but the paxDetails in the following api call would\n // still return potentially empty or falsy details leading to a bad request\n delay(100),\n tap(() => {\n this.checkFrequentFlyerNumberAndUpdateCart();\n })\n )\n .subscribe({\n error: (error: unknown) => {\n this.sentryLogger.error('Override paxDetails with profile failed', {\n error,\n });\n },\n })\n );\n }\n\n private getValidPassengerIds(): string[] {\n const passengers: FormGroup = this.paxForm.get('passengers');\n const passengerControls: AbstractControl[] = Object.values(passengers.controls);\n const validPassengers = passengerControls.filter((ctrl) => ctrl.valid);\n return validPassengers.map((ctrl) => ctrl.get('travelerId').value);\n }\n\n private overrideCorporateCode(value: string) {\n this.paxForm.get('corporateCode').setValue(value);\n }\n\n private setupTravelers(passengers: FinnairPassengerItem[]): Observable {\n return this.createTravelerFormGroups(passengers).pipe(\n tap((travelers) => {\n this.setupTravellingWithSelectionsForInfants(travelers);\n this.typeLocalizationKeys = travelers.map((traveler: PassengerDetails) => traveler.typeLocalizationKey);\n this.availableDays = travelers.map((traveler: PassengerDetails) => ({\n days$: traveler.availableDays$,\n months: rangeFrom(1, 12),\n years: traveler.years,\n }));\n })\n );\n }\n\n private createTravelerFormGroups(passengers: FinnairPassengerItem[]): Observable {\n return combineLatest(\n passengers.map((passenger: FinnairPassengerItem) => {\n return this.passengerFormService.createPassengerFormGroup(passenger.id);\n })\n ).pipe(\n switchMap((formGroups) => {\n return this.profile$.pipe(\n take(1),\n switchMap((userProfile) => {\n // Skip prefilling from session and profile if user is corporate admin or travel booker\n const sources = isCorporateAdminOrTravelBooker(userProfile)\n ? [PrefillSource.CART, PrefillSource.SESSION]\n : [PrefillSource.CART, PrefillSource.SESSION, PrefillSource.PROFILE];\n return combineLatest(\n formGroups.map((formGroup) => {\n return this.passengerFormService.prefillData(formGroup, sources);\n })\n );\n })\n );\n }),\n tap((paxDetails) => {\n paxDetails.forEach((formGroup) => {\n this.passengers.push(formGroup.group);\n });\n\n this.passengers.value.forEach(\n (_, index) => (this.frequentFlyerAirlines$[index] = this.setupAirlinePrefixes(index))\n );\n })\n );\n }\n\n private setupTravellingWithSelectionsForInfants(travelers: PassengerDetails[]) {\n const { adults, infants } = this.getTravelerTypes(travelers);\n this.setupTravellingWithSelectOptions([...adults]);\n this.setupClearingConflictingTravellingWithSelections(infants);\n }\n\n private setupClearingConflictingTravellingWithSelections(infants: PassengerDetails[]) {\n const travellingFormGroups: AbstractControl[] = infants.map((infant: PassengerDetails) =>\n infant.group.get(PaxFormFields.travelling)\n );\n\n const travellingWithPaxIds$: Observable = combineLatest(\n travellingFormGroups.map((g) => g.valueChanges.pipe(startWith(g.value), distinctUntilChanged()))\n );\n\n const clearPreviousConflictingSelections = ([newSelections, previousSelections]: [string[], string[]]) =>\n newSelections\n .map((value, index): [string, number] => [value, index])\n .filter(onlyChangedValues(previousSelections))\n .forEach(([newValue, fieldIndexToChange]) => {\n indexesOfWantedValue(newSelections, fieldIndexToChange, newValue).forEach((i) => {\n if (travellingFormGroups[i].value !== '') {\n travellingFormGroups[i].setValue('');\n travellingFormGroups[i].markAsPristine();\n travellingFormGroups[i].markAsUntouched();\n }\n });\n });\n\n this.subscription.add(\n travellingWithPaxIds$.pipe(zipWithLastValue([])).subscribe(clearPreviousConflictingSelections)\n );\n\n this.subscription.add(\n this.selectableLeadPassengers$.pipe(take(1)).subscribe((options: SelectOption[]) => {\n const hasInfant = !!travellingFormGroups[0];\n const hasOnlyOneLeadPax = options.length === 1;\n if (hasInfant && hasOnlyOneLeadPax) {\n travellingFormGroups[0].setValue(options[0].value);\n travellingFormGroups[0].markAsPristine();\n travellingFormGroups[0].markAsUntouched();\n }\n this.defaultTravelingWithValue = options.map((option) => option.value);\n })\n );\n }\n\n private setupTravellingWithSelectOptions(selectableLeadPassengers: PassengerDetails[]) {\n this.selectableLeadPassengers$ = combineLatest(\n selectableLeadPassengers.map((pax: PassengerDetails) => {\n return pax.group.valueChanges.pipe(\n startWith(pax.group.value),\n distinctUntilChanged(),\n switchMap((ad: PaxDetailsFormData) => {\n return this.languageService\n .translate(\n 'paxDetails.travellingWith',\n mergeDeep(ad, {\n firstName: ad.firstName || '',\n lastName: ad.lastName || '',\n })\n )\n .pipe(map((name): SelectOption => ({ name, value: ad.id })));\n })\n );\n })\n );\n }\n\n private setupPaxFormBase(corporateCode: string, disableCorporateCode: boolean) {\n this.paxForm = this.fb.group({\n passengers: this.fb.array([]),\n corporateCode: this.fb.control(\n {\n value: corporateCode || '',\n disabled: disableCorporateCode,\n },\n Validators.compose([Validators.minLength(8), Validators.maxLength(8), Validators.pattern(/[a-zA-Z0-9]{8}/)])\n ),\n additionalEmail: this.fb.control(\n '',\n [Validators.pattern(EMAIL_PATTERN)],\n [additionalEmailValidator(this.additionalEmails$)]\n ),\n }) as TypedFormGroup | UntypedFormControl>;\n }\n\n updateStoreFromFormChanges(): void {\n this.subscription.add(\n this.passengers.valueChanges\n .pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)))\n .subscribe(() => {\n this.updatePaxDetailsInStore();\n this.frequentFlyerValueChangeValidation(this.passengers);\n })\n );\n\n this.subscription.add(\n this.paxForm.get('corporateCode').valueChanges.subscribe((corporateCode: string) => {\n this.store$.dispatch(PaxDetailsActions.setCorporateCode({ corporateCode }));\n })\n );\n }\n\n updatePaxDetailsInStore(): void {\n // getRawValue contains also disabled fields\n const sanitizedData: PaxDetailsFormData[] = this.passengers.getRawValue().map((paxData: PaxDetailsFormData) => {\n return {\n ...paxData,\n firstName: trimAndReplaceWhitespace(paxData.firstName),\n lastName: trimAndReplaceWhitespace(paxData.lastName),\n };\n });\n\n this.store$.dispatch(PaxDetailsActions.setPaxDetails({ passengers: sanitizedData }));\n }\n\n addEmail(): void {\n const addedEmail = this.paxForm.get('additionalEmail').value;\n\n this.emailsArray.push(addedEmail);\n this.store$.dispatch(PaxDetailsActions.setAdditionalEmails({ additionalEmails: this.emailsArray }));\n this.paxForm.get('additionalEmail').reset();\n\n this.gtmService.trackElement(\n 'additional-email',\n 'booking-flow_pax-details',\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n }\n\n removeEmail(index: number): void {\n this.emailsArray.splice(index, 1);\n this.store$.dispatch(PaxDetailsActions.setAdditionalEmails({ additionalEmails: this.emailsArray }));\n }\n\n private triggerInitialValidation() {\n setTimeout(() => {\n // Trigger initial validation to get continue button showing if initial values are all valid\n this.paxForm.updateValueAndValidity({ emitEvent: true });\n this.passengers.controls.forEach((group: UntypedFormGroup) => {\n valuesOf(group.controls)\n .filter(\n (control) =>\n control.invalid &&\n control.value !== '' &&\n control.value !== null &&\n !this.defaultTravelingWithValue.includes(control.value)\n )\n .forEach((control: UntypedFormControl) => {\n control.markAsTouched();\n });\n });\n\n if (this.paxForm.controls.corporateCode.value) {\n this.paxForm.controls.corporateCode.markAsTouched();\n }\n\n this.frequentFlyerValueChangeValidation(this.passengers);\n });\n }\n\n private setupAirlinePrefixes(passengerIndex) {\n return this.profileType$.pipe(\n map((pType: ProfileType) =>\n FREQUENT_FLIER_AIRLINES.filter((airline) => {\n return !(airline.name === 'Finnair' && pType === ProfileType.FINNAIR_ACCOUNT && passengerIndex === 0);\n }).map(airlineToOption)\n )\n );\n }\n\n get passengers(): TypedFormArray> {\n return this.paxForm.get('passengers') as TypedFormArray;\n }\n\n private getTravelerTypes(travelers: PassengerDetails[]) {\n const getTravelersForType = (type: FinnairPassengerCode) =>\n travelers.filter((traveler: PassengerDetails) => traveler.group.get(PaxFormFields.type).value === type);\n\n return {\n adults: getTravelersForType(FinnairPassengerCode.ADT),\n childs: getTravelersForType(FinnairPassengerCode.CHD),\n infants: getTravelersForType(FinnairPassengerCode.INF),\n };\n }\n\n private setupInfantTravelingWithLocking(passengers: PassengerDetails[]) {\n this.infantTravelingWithLocked$ = this.cartData$.pipe(\n safeMapObs((data: FinnairCart) => {\n // Lock changing travelingWith if we there is seats in cart\n return !!data.services.unpaid.find((s) => s.category === Category.SEAT);\n }),\n distinctUntilChanged()\n );\n\n this.subscription.add(\n combineLatest([this.infantTravelingWithLocked$, this.cartStatus$])\n .pipe(map(([locked, status]: [boolean, CartStatus]) => locked || status === CartStatus.PENDING))\n .subscribe((locked: boolean) => {\n this.getTravelerTypes(passengers).infants.forEach((passenger: PassengerDetails) => {\n const travellingControl = passenger.group.get(PaxFormFields.travelling);\n\n if (locked) {\n travellingControl.disable();\n } else {\n travellingControl.enable();\n }\n });\n })\n );\n }\n\n private frequentFlyerValueChangeValidation(passengers: TypedFormArray) {\n const getField = (control: AbstractControl, fieldName: string) => control?.get(fieldName)?.value;\n\n const frequentFlyerCards = passengers.controls.map((p) => p.get(PaxFormFields.frequentFlyerCard)).filter(Boolean);\n\n frequentFlyerCards.forEach((card) => {\n const isError: boolean = frequentFlyerCards\n .filter((fc) => fc !== card)\n .some((c) => {\n return (\n getField(card, PaxFormFields.cardNumber) === getField(c, PaxFormFields.cardNumber) &&\n getField(card, PaxFormFields.companyCode) === getField(c, PaxFormFields.companyCode) &&\n getField(card, PaxFormFields.cardNumber) !== '' &&\n getField(card, PaxFormFields.companyCode) !== undefined\n );\n });\n if (isError) {\n card.setErrors({ sameCardNumberExists: true });\n if (!card.touched) {\n card.markAsTouched();\n }\n } else {\n card.setErrors(null);\n }\n });\n }\n\n getBorderClasses = memoize(\n (params: { status: string; expanderIsOpen: boolean; allowErrorsVisible: boolean }): string => {\n const expanderIsClosed = !params.expanderIsOpen;\n const allowErrorsVisible = params.allowErrorsVisible;\n\n if (expanderIsClosed && params.status === PaxFormStatus.INVALID && !allowErrorsVisible) {\n return 'nordic-blue-50-border untouched';\n } else if (expanderIsClosed && params.status === PaxFormStatus.VALID) {\n return 'nordic-blue-400-border valid';\n } else if (expanderIsClosed && params.status === PaxFormStatus.INVALID && allowErrorsVisible) {\n return 'error-900-border error';\n }\n }\n );\n\n getCorporateBorderClasses = memoize(\n (params: { corporateExpanderOpen: boolean; errors: ValidationErrors; value: string }): string => {\n const expanderIsClosed = params.corporateExpanderOpen;\n const hasErrors = params.errors;\n const hasValue = params.value;\n\n if (expanderIsClosed && !hasValue) {\n return 'nordic-blue-50-border untouched';\n } else if (expanderIsClosed && !hasErrors && hasValue) {\n return 'nordic-blue-400-border valid';\n } else if (expanderIsClosed && hasErrors && hasValue) {\n return 'error-900-border error';\n }\n }\n );\n\n getIconClass = memoize((params: { status: string; expanderIsOpen: boolean; allowErrorsVisible: boolean }): string => {\n if (params.expanderIsOpen) {\n return 'nordic-blue-900-text';\n }\n\n if (params.status === PaxFormStatus.VALID) {\n return 'nordic-blue-400-text';\n } else if (params.allowErrorsVisible) {\n return 'nordic-blue-900-text';\n } else {\n return 'nordic-blue-50-text';\n }\n });\n\n getCorporateIconClass = memoize((params: { expanderIsOpen: boolean; errors: ValidationErrors; value: string }) => {\n if (params.expanderIsOpen) {\n return 'nordic-blue-900-text';\n }\n\n if (params.errors) {\n return 'nordic-blue-900-text';\n } else if (params.value) {\n return 'nordic-blue-400-text';\n } else {\n return 'nordic-blue-50-text';\n }\n });\n\n handleShortcutToPayClick(): void {\n if (this.paxForm.valid) {\n this.ready.emit({ skipToCheckout: true });\n } else {\n this.validateForm();\n }\n }\n\n private frequentFlyerCardAlreadyInCart(cartData: FinnairCart, passenger: FormGroup): boolean {\n const cardNumber = passenger.get(['frequentFlyerCard', 'cardNumber'])?.value;\n const companyCode = passenger.get(['frequentFlyerCard', 'companyCode'])?.value;\n const travelerId = passenger.get('travelerId').value;\n const frequentFlyerCards = cartData.passengers.find((pax) => pax.id === travelerId)?.frequentFlyerCards;\n\n const cardEmptyInFormAndCart = !isPresent(frequentFlyerCards) && cardNumber === '';\n const hasMatchingCardInCart =\n frequentFlyerCards?.some((card) => card.companyCode === companyCode && card.cardNumber === cardNumber) ?? false;\n\n return cardEmptyInFormAndCart || hasMatchingCardInCart;\n }\n\n private setupPaxAncillaries(passengers: FinnairPassengerItem[]): void {\n // we don't sell ancillaries to infants so we filter them out\n const travelerIds = getTravelerIdsExcludingInfants(passengers);\n const primaryPaxId = this.passengers.controls\n .find((pax) => this.isPrimaryPax(pax))\n .get(PaxFormFields.travelerId).value;\n\n this.paxServices$ = combineLatest([\n this.store$.pipe(\n serviceMapForCategoriesForTravelers(travelerIds, ENABLED_PAX_ANCILLARY_CATEGORIES),\n map((services) => removeCancellationCoverFromNonPrimaryPax(services, primaryPaxId))\n ),\n this.cartData$,\n ])\n .pipe(map(([services, cartData]) => mapDisplayTitlesForPaxAncillaries(services, cartData)))\n .pipe(finShare());\n\n this.paxSelections$ = this.store$\n .pipe(selectionMapForCategoriesForTravelers(travelerIds, ENABLED_PAX_ANCILLARY_CATEGORIES))\n .pipe(finShare());\n\n this.servicesReady$ = this.store$.pipe(servicesReady()).pipe(finShare());\n }\n}\n","import { createFeatureSelector, createSelector } from '@ngrx/store';\n\nimport { safeSelect, StateSelector } from '@fcom/core/selectors/selector-utils';\n\nimport { CommonBookingFeatureState, CommonBookingState, UpgradeOfferState } from '../store.interface';\nimport { COMMON_BOOKING_FEATURE_KEY } from '../constants';\n\nconst _selectCommonBookingState = createFeatureSelector(\n COMMON_BOOKING_FEATURE_KEY\n);\n\nconst _upgradeOfferState = createSelector(\n _selectCommonBookingState,\n (state: CommonBookingState) => state?.upgradeOffer\n);\n\nexport const selectedUpgradeOffer = (): StateSelector =>\n safeSelect(_upgradeOfferState);\n","\n \n
\n {{ 'ticketUpgradePromotion.modal.notification' | finLocalization }}\n \n \n
\n \n
\n
\n {{ 'ticketUpgradePromotion.modal.updateTo' | finLocalization }}\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n \n \n {{ (isDeparture ? 'bookingSearch.departure' : 'bookingSearch.return') | finLocalization }}\n \n
\n
\n {{ bound.departure.dateTime | finTime }} {{ bound.departure.locationCode }}\n \n {{ bound.arrival.dateTime | finTime }} {{ bound.arrival.locationCode }} / \n {{ bound.uniqueAirlineNames.join(', ') }} / \n {{ bound.duration | finDuration | async }} / \n \n {{\n (bound.stops !== 0 ? 'bookingSummary.stops' : 'bookingSummary.directFlight')\n | finLocalization: [bound.stops]\n }}\n /\n \n \n {{ bound.fareFamilyBrandName }} /\n {{ prices$ | finMap: (isDeparture ? 'outboundPrice' : 'inboundPrice') | async | finPrice }}\n >\n \n \n {{ upgradeOffer.upgradeFareFamily.brandName }} /\n {{ prices$ | finMap: (isDeparture ? 'outboundUpgradePrice' : 'inboundUpgradePrice') | async | finPrice }}\n \n
\n
\n
\n
\n
\n\n\n
\n
\n
{{ 'ticketUpgradePromotion.modal.' + selection | finLocalization }}:
\n
{{ fareFamily.brandName }}
\n
{{ price | finPrice }}
\n
\n
\n
{{ fareFamily.brandNameDescription }}
\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 { Observable } from 'rxjs';\nimport { map, withLatestFrom } from 'rxjs/operators';\n\nimport { FinnairCart, TranslatedBenefitRow } from '@fcom/dapi/api/models';\nimport { UpgradeOfferState } from '@fcom/common-booking';\nimport { Amount } from '@fcom/dapi';\nimport { shouldDisplayBenefit } from '@fcom/common-booking/utils/benefit.utils';\n\ninterface Prices {\n outboundPrice: Amount;\n outboundUpgradePrice: Amount;\n inboundPrice: Amount;\n inboundUpgradePrice: Amount;\n currentPrice: Amount;\n newPrice: Amount;\n}\n\n@Component({\n selector: 'fin-upgrade-promotion-modal',\n templateUrl: './upgrade-promotion-modal.component.html',\n styleUrls: ['upgrade-promotion-modal.component.scss'],\n})\nexport class UpgradePromotionModalComponent implements OnInit {\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input() cart$: Observable;\n @Input() upgradeOffer$: Observable;\n\n currencyCode$: Observable;\n\n prices$: Observable;\n currentBenefits$: Observable;\n newBenefits$: Observable;\n\n ngOnInit(): void {\n this.currencyCode$ = this.cart$.pipe(map((cart) => cart.prices?.unpaid?.total?.total.totalAmount.currencyCode));\n this.prices$ = this.upgradeOffer$.pipe(\n withLatestFrom(this.currencyCode$),\n map(([offer, currencyCode]) => {\n const currentPrice = [offer.inboundPrice, offer.outboundPrice].reduce((acc, priceStr) => {\n if (priceStr) {\n return acc + parseFloat(priceStr);\n }\n return 0;\n }, 0);\n return {\n outboundPrice: this.strToAmount(offer.outboundPrice, currencyCode),\n outboundUpgradePrice: this.strToAmount(offer.outboundUpgradePrice, currencyCode),\n inboundPrice: this.strToAmount(offer.inboundPrice, currencyCode),\n inboundUpgradePrice: this.strToAmount(offer.inboundUpgradePrice, currencyCode),\n currentPrice: this.strToAmount(String(currentPrice), currencyCode),\n newPrice: this.strToAmount(String(offer.totalUpgradePrice), currencyCode),\n };\n })\n );\n\n this.currentBenefits$ = this.upgradeOffer$.pipe(\n map((offer) => offer.currentFareFamily.translatedBenefitRows.filter((benefit) => shouldDisplayBenefit(benefit)))\n );\n this.newBenefits$ = this.upgradeOffer$.pipe(\n map((offer) => offer.upgradeFareFamily.translatedBenefitRows.filter((benefit) => shouldDisplayBenefit(benefit)))\n );\n }\n\n private strToAmount(price: string, currencyCode: string): Amount | undefined {\n if (!price) {\n return undefined;\n }\n return {\n currencyCode: currencyCode,\n amount: price,\n };\n }\n}\n","\n \n
\n \n
\n \n
\n

{{ 'ticketUpgradePromotion.header' | finLocalization }}

\n
\n \n
\n
\n {{ 'ticketUpgradePromotion.currentSelection' | finLocalization }}\n {{ upgradeOffer.currentFareFamily.brandName }}\n
\n {{ currentTotalPrice$ | async | finPrice }}\n
\n \n \n \n {{ 'ticketUpgradePromotion.benefits.selected.' + key | finLocalization }}\n \n \n
\n \n \n \n \n \n \n \n \n
\n
\n \n
\n
\n {{ 'ticketUpgradePromotion.updateTo' | finLocalization }}\n {{ upgradeOffer.upgradeFareFamily.brandName }}\n
\n
\n \n {{ upgradePriceDiffTrend ? '+' : '-' }}\n {{ upgradePriceDifference | finPrice | finEmpty: '–' }}\n \n
\n
\n
\n \n \n \n {{ 'ticketUpgradePromotion.benefits.suggested.' + key | finLocalization }}\n \n \n \n
\n
\n \n \n \n {{ 'ticketUpgradePromotion.updating' | finLocalization }}\n
\n \n
\n \n \n \n
\n
\n {{ 'ticketUpgradePromotion.done' | finLocalization }}\n {{ upgradeOffer.upgradeFareFamily.brandName }}\n
\n \n
\n
\n \n \n
\n \n \n \n \n \n
\n\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 } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, filter, map, Observable, Subscription } from 'rxjs';\nimport { withLatestFrom } from 'rxjs/operators';\n\nimport {\n ButtonSize,\n ButtonTheme,\n IconButtonTheme,\n IconButtonSize,\n IconPosition,\n LoaderColor,\n LoaderTheme,\n ModalButtons,\n} from '@fcom/ui-components';\nimport { UpgradeOfferState } from '@fcom/common-booking';\nimport { selectedUpgradeOffer } from '@fcom/common-booking/store/selectors/upgrade-offer.selector';\nimport { isPresent, unsubscribe } from '@fcom/core/utils';\nimport { FareFamily, FinnairCart } from '@fcom/dapi/api/models';\nimport { Amount, CartStatus } from '@fcom/dapi';\nimport { finShare } from '@fcom/rx';\nimport { ElementActions, ElementTypes, GaContext } from '@fcom/common/interfaces';\nimport { GtmService } from '@fcom/common/gtm';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\nimport { cartData, cartStatus } from '../../../../store/selectors';\n\nenum UpgradeStatus {\n INIT,\n LOADING,\n READY,\n IN_PROGRESS,\n DONE,\n HIDDEN,\n}\n\nconst GA_ELEMENT_NAME = 'booking-flow-upsell';\n\n@Component({\n selector: 'fin-upgrade-promotion',\n templateUrl: 'upgrade-promotion.component.html',\n styleUrls: ['upgrade-promotion.component.scss'],\n})\nexport class UpgradePromotionComponent implements OnInit, OnDestroy {\n readonly ButtonSize = ButtonSize;\n readonly ButtonTheme = ButtonTheme;\n readonly IconButtonSize = IconButtonSize;\n readonly IconButtonTheme = IconButtonTheme;\n readonly IconPosition = IconPosition;\n readonly LoaderColor = LoaderColor;\n readonly LoaderTheme = LoaderTheme;\n readonly ModalButtons = ModalButtons;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly UpgradeStatus = UpgradeStatus;\n\n upgradeOffer$: Observable;\n cartData$: Observable;\n upgradePriceDifference$: Observable;\n upgradePriceDiffTrend$: Observable;\n currentTotalPrice$: Observable;\n status$ = new BehaviorSubject(UpgradeStatus.INIT);\n loaded$: Observable;\n\n selectedBenefitKey$: Observable;\n suggestedBenefitKey$: Observable;\n\n upgradeModalOpen = false;\n fareFamilyModalOpen = false;\n\n subscriptions = new Subscription();\n\n constructor(\n private store$: Store,\n private gtmService: GtmService\n ) {}\n\n ngOnInit(): void {\n this.upgradeOffer$ = this.store$.pipe(\n selectedUpgradeOffer(),\n filter((offer) => isPresent(offer?.upgradeFareFamily)),\n finShare()\n );\n this.cartData$ = this.store$.pipe(cartData(), finShare());\n\n this.currentTotalPrice$ = this.cartData$.pipe(map((cart) => cart.prices.unpaid?.total?.total.totalAmount));\n\n this.upgradePriceDifference$ = combineLatest([this.upgradeOffer$, this.currentTotalPrice$]).pipe(\n filter(([_offer, currentPrice]) => isPresent(currentPrice)),\n map(([upgradeOffer, currentPrice]) => ({\n amount: String(upgradeOffer.totalUpgradePrice - parseFloat(currentPrice.amount)),\n currencyCode: currentPrice.currencyCode,\n }))\n );\n this.upgradePriceDiffTrend$ = this.upgradePriceDifference$.pipe(map((diff) => parseFloat(diff.amount) >= 0));\n\n this.selectedBenefitKey$ = combineLatest([this.upgradeOffer$, this.cartData$]).pipe(\n map(([offer, cart]) => {\n const origin = cart.locations[cart.bounds[0].departure.locationCode];\n return this.getSelectedBenefitKey(offer.currentFareFamily, origin.countryCode);\n })\n );\n this.suggestedBenefitKey$ = this.upgradeOffer$.pipe(\n map((offer) => this.getSuggestedBenefitKey(offer.upgradeFareFamily))\n );\n\n this.setStatusListeners();\n }\n\n setStatusListeners(): void {\n // When upgradeOffer is found in store, set status as loading\n this.subscriptions.add(\n combineLatest([this.status$, this.upgradeOffer$])\n .pipe(filter(([upgradeStatus, offer]) => upgradeStatus === UpgradeStatus.INIT && !!offer.upgradeFareFamily))\n .subscribe(() => this.status$.next(UpgradeStatus.LOADING))\n );\n\n // When total prices has been calculated, set status as ready\n this.subscriptions.add(\n combineLatest([this.status$, this.currentTotalPrice$, this.upgradePriceDiffTrend$])\n .pipe(filter(([upgradeStatus]) => upgradeStatus === UpgradeStatus.LOADING))\n .subscribe(() => {\n this.gtmService.trackElement(\n GA_ELEMENT_NAME,\n GaContext.BOOKING_FLOW,\n ElementTypes.BANNER,\n 'view',\n ElementActions.VIEW\n );\n this.status$.next(UpgradeStatus.READY);\n })\n );\n\n // When cart is updated, set status as done\n this.subscriptions.add(\n this.store$\n .pipe(\n cartStatus(),\n withLatestFrom(this.status$),\n filter(\n ([currentCartStatus, upgradeStatus]) =>\n currentCartStatus === CartStatus.OK && upgradeStatus === UpgradeStatus.IN_PROGRESS\n )\n )\n .subscribe(() => this.status$.next(UpgradeStatus.DONE))\n );\n }\n\n getSelectedBenefitKey(fareFamily: FareFamily, countryCode: string): string {\n const name = fareFamily.brandName.toLowerCase();\n if (name.includes('campaign')) {\n if (name.includes('light')) {\n return 'campaignLight';\n }\n if (name.includes('classic')) {\n return 'campaignClassic';\n }\n }\n if (name.includes('saver')) {\n return 'saver';\n }\n const japanOrigin = countryCode === 'JP';\n if (name.includes('classic')) {\n if (japanOrigin) {\n return 'classicJp';\n }\n return 'classic';\n }\n return 'light';\n }\n\n getSuggestedBenefitKey(fareFamily: FareFamily): string {\n const name = fareFamily.brandName.toLowerCase();\n if (name.includes('flex')) {\n return 'flex';\n }\n return 'classic';\n }\n\n openUpgradeModal(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n this.gtmService.trackElement(\n GA_ELEMENT_NAME,\n GaContext.BOOKING_FLOW,\n ElementTypes.BUTTON,\n 'open-modal',\n ElementActions.CLICK\n );\n this.upgradeModalOpen = true;\n }\n\n openFareFamilyModal(event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.fareFamilyModalOpen = true;\n }\n\n confirmUpgrade(): void {\n this.upgradeModalOpen = false;\n this.status$.next(UpgradeStatus.IN_PROGRESS);\n this.gtmService.trackElement(\n GA_ELEMENT_NAME,\n GaContext.BOOKING_FLOW,\n ElementTypes.BUTTON,\n 'confirm',\n ElementActions.CLICK\n );\n // TODO: How to update cart?\n }\n\n hide(): void {\n this.status$.next(UpgradeStatus.HIDDEN);\n }\n\n closeModals(): void {\n this.upgradeModalOpen = false;\n this.fareFamilyModalOpen = false;\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\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 { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\n\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { LoaderType } from '@fcom/common/interfaces';\nimport { CartStatus, FrequentFlyerCard, PaxDetailsFormData, Phone } from '@fcom/dapi';\nimport { isString, unsubscribe } from '@fcom/core/utils';\nimport { FinnairCart } from '@fcom/dapi/api/models';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { DataCloudService } from '@fcom/common/datacloud';\nimport { ConfigService } from '@fcom/core/';\nimport { CommonBookingState } from '@fcom/common-booking';\nimport { SeatMapActions } from '@fcom/common-booking/store';\n\nimport { paxDetails } from '../../../store/selectors';\n\n@Component({\n selector: 'fin-pax-details',\n templateUrl: 'pax-details.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaxDetailsComponent implements OnInit, OnDestroy {\n public readonly LoaderType = LoaderType;\n public readonly NotificationTheme = NotificationTheme;\n\n @Input()\n cartStatus$: Observable;\n\n @Input()\n cartData$: Observable;\n\n @Output()\n ready: EventEmitter<{ skipToCheckout: boolean }> = new EventEmitter<{ skipToCheckout: boolean }>();\n\n @Output()\n unlockTravelingWith: EventEmitter = new EventEmitter();\n\n infoMessageKey$: BehaviorSubject = new BehaviorSubject(undefined);\n\n enableTicketTypeUpselling: boolean;\n\n private subscription = new Subscription();\n\n constructor(\n private configService: ConfigService,\n private store$: Store,\n private dataCloudService: DataCloudService\n ) {}\n\n ngOnInit(): void {\n this.enableTicketTypeUpselling = this.configService.cfg.enableTicketTypeUpselling;\n\n // Clear the seatmap when returning to pax details in case passengers have changed\n this.store$.dispatch(SeatMapActions.reset());\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n setInfoMessage(messageKey = ''): void {\n if (isString(messageKey)) {\n this.infoMessageKey$.next(messageKey);\n }\n }\n\n emitReady({ skipToCheckout }: { skipToCheckout: boolean }): void {\n this.subscription.add(\n this.store$.pipe(paxDetails(), take(1)).subscribe((paxDetailState) => {\n const paxDetailsFormData: PaxDetailsFormData = paxDetailState.passengers[0];\n const phone: Phone = paxDetailsFormData.phone;\n const frequentFlyerCard: FrequentFlyerCard = paxDetailsFormData.frequentFlyerCard;\n this.dataCloudService.paxDetails({\n firstName: paxDetailsFormData.firstName,\n lastName: paxDetailsFormData.lastName,\n emailAddress: paxDetailsFormData.email,\n countryCode: phone?.phonePrefix,\n phoneNumber: phone?.phoneNumber,\n memberProgram: frequentFlyerCard?.companyCode,\n memberNumber: frequentFlyerCard?.cardNumber,\n });\n })\n );\n this.ready.emit({ skipToCheckout });\n }\n}\n","\n

\n {{ data.teaserTitle }}\n

\n\n
\n
\n
\n\n \n
\n\n\n
\n
\n \n
\n\n
\n \n
\n
\n\n","import { Component, EventEmitter, Output, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\n\nimport { Observable, take } from 'rxjs';\n\nimport { ModalButtons } from '@fcom/ui-components';\nimport { CmsArticle } from '@fcom/core-api/interfaces';\nimport { FragmentService } from '@fcom/common/services';\n\n@Component({\n selector: 'fin-korea-notification',\n templateUrl: './korea-notification.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class KoreaNotificationComponent {\n public readonly ModalButtons: typeof ModalButtons = ModalButtons;\n public readonly useOfPersonalInformation$: Observable;\n public readonly overseasTransferOfPersonalInfo$: Observable;\n public readonly form: UntypedFormGroup;\n public readonly dataTestId: string;\n\n modalOpen = false;\n\n @Output()\n confirmed: EventEmitter = new EventEmitter();\n\n @Output()\n close: EventEmitter = new EventEmitter();\n\n constructor(\n private fragmentService: FragmentService,\n private formBuilder: UntypedFormBuilder,\n private cdr: ChangeDetectorRef\n ) {\n this.useOfPersonalInformation$ = this.fragmentService\n .getFragment('koreanPaxInfoNotification.useOfPersonalInformation.url')\n .pipe(take(1));\n\n this.overseasTransferOfPersonalInfo$ = this.fragmentService\n .getFragment('koreanPaxInfoNotification.overseasTransferOfPersonalInfo.url')\n .pipe(take(1));\n\n this.form = this.formBuilder.group({\n useOfPersonalInformation: [false, Validators.requiredTrue],\n overseasTransferOfPersonalInfo: [false, Validators.requiredTrue],\n });\n }\n\n openModal(): void {\n this.modalOpen = true;\n this.cdr.markForCheck();\n }\n}\n","\n\n\n","import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\n\nimport { CartStatus } from '@fcom/dapi';\nimport { snapshot } from '@fcom/rx';\nimport {\n Category,\n ControlData,\n FinnairCart,\n FinnairItineraryItemFlight,\n FinnairPassengerCode,\n FinnairServiceRequestItem,\n} from '@fcom/dapi/api/models';\nimport { ToasterService } from '@fcom/common/services';\nimport { getAllFlightsFromCartOrOrder } from '@fcom/common-booking/utils/common-booking.utils';\nimport { AncillaryToasterMessages, getServiceData } from '@fcom/common-booking/utils/ancillaries.utils';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { ModalButtons, NotificationTheme } from '@fcom/ui-components';\nimport { ElementActions, ElementTypes } from '@fcom/common/interfaces';\nimport { GtmService } from '@fcom/common/gtm';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState, PaxDetailsState } from '@fcom/common/interfaces/booking';\nimport { setNoAvailability } from '@fcom/common-booking/store/actions/seat-map.actions';\nimport { SeatMapActions } from '@fcom/common-booking/store';\nimport { ConfigService } from '@fcom/core/services';\nimport { profileType } from '@fcom/core/selectors';\nimport { ProfileType } from '@fcom/core-api/login';\n\nimport { CartActions } from '../../../store/actions';\nimport { cartData, cartStatus, isCartDirty, paxDetails } from '../../../store/selectors';\nimport { BookingQueueService, BookingService } from '../../../services';\nimport { CountryCode } from '../../../utils';\nimport { KoreaNotificationComponent } from '../components/korea-notification.component';\nimport { ENABLED_PAX_ANCILLARY_CATEGORIES } from '../constants';\n\n@Component({\n selector: 'fin-booking-pax-details-route',\n templateUrl: './booking-pax-details-route.component.html',\n})\nexport class BookingPaxDetailsRouteComponent implements OnInit, OnDestroy {\n readonly cartData$: Observable;\n readonly cartStatus$: Observable;\n readonly showKoreaNotification$: Observable;\n readonly ModalButtons = ModalButtons;\n readonly NotificationTheme = NotificationTheme;\n\n subscription = new Subscription();\n continueOrSkip: 'skip' | 'continue' | null = null;\n\n @ViewChild('koreaNotification', { static: false })\n private koreaNotification: KoreaNotificationComponent;\n\n constructor(\n private bookingService: BookingService,\n private store$: Store,\n private bookingQueueService: BookingQueueService,\n private toasterService: ToasterService,\n private gtmService: GtmService,\n private configService: ConfigService\n ) {\n this.cartData$ = this.store$.pipe(cartData());\n this.cartStatus$ = this.store$.pipe(cartStatus());\n this.showKoreaNotification$ = this.cartData$.pipe(\n map((cd) => cd.controlData),\n filter(Boolean),\n map(({ originCountryCode }: ControlData) => originCountryCode === CountryCode.KOREA)\n );\n }\n\n ngOnInit(): void {\n if (this.configService.cfg.enableBookingFlowSeatMapPreFetch) {\n this.prefetchAllSeatmaps();\n }\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n openModalOrConfirm(event: { skipToCheckout: boolean }): void {\n this.continueOrSkip = event.skipToCheckout ? 'skip' : 'continue';\n\n this.confirmOrDisplayKoreanNotification();\n }\n\n confirmOrDisplayKoreanNotification(): void {\n this.subscription.add(\n this.showKoreaNotification$.pipe(take(1)).subscribe((show) => {\n if (show) {\n this.koreaNotification.openModal();\n } else {\n this.confirmPaxDetails();\n }\n })\n );\n }\n\n confirmPaxDetails(): void {\n const passengerFormDetails: PaxDetailsState = snapshot(this.store$.pipe(paxDetails()));\n this.updateCartWithPaxAncillaries(ENABLED_PAX_ANCILLARY_CATEGORIES);\n\n if (\n this.configService.cfg.enableBookingFlowSeatMapPreFetch &&\n this.anyPassengerHasChangesToFFDetails(passengerFormDetails, snapshot(this.cartData$))\n ) {\n this.store$.dispatch(SeatMapActions.reset());\n }\n this.bookingQueueService.queuePassengersAndCorporateCodeUpdate(passengerFormDetails);\n\n if (this.continueOrSkip === 'skip') {\n this.store$.dispatch(CartActions.acceptTerms());\n this.bookingService.setStep({ step: BOOKING_STEPS.CHECKOUT });\n this.gtmService.trackElement(\n 'go-to-payment',\n 'booking-flow_shortcut',\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n } else {\n this.bookingService.nextStep();\n }\n\n this.continueOrSkip = null;\n }\n\n updateCartWithPaxAncillaries(categories: Category[]): void {\n if (snapshot(this.store$.pipe(isCartDirty()))) {\n this.subscription.add(\n this.cartData$.pipe(take(1)).subscribe((currentCartData) => {\n const flights: FinnairItineraryItemFlight[] = getAllFlightsFromCartOrOrder(currentCartData);\n\n const ancillaryRequestUpdates = categories.map((category) =>\n getServiceData(this.store$, category, currentCartData.bounds, flights)\n );\n\n const allRequests: { requests: FinnairServiceRequestItem[]; messages: AncillaryToasterMessages[] } =\n ancillaryRequestUpdates.reduce(\n (current, [requests, messages]) => {\n return { requests: current.requests.concat(requests), messages: current.messages.concat(messages) };\n },\n { requests: [], messages: [] }\n );\n\n this.bookingQueueService.queueServicesUpdate(allRequests.requests, {\n error: () => {\n allRequests.messages.forEach((msg) => {\n this.toasterService.addMessageToQueue(msg.error);\n });\n },\n });\n })\n );\n }\n }\n\n resetSeatMap(): void {\n this.bookingQueueService.queueSeatSelectionReset();\n }\n\n private prefetchAllSeatmaps(): void {\n this.subscription.add(\n combineLatest([this.cartData$, this.cartStatus$, this.store$.pipe(profileType())])\n .pipe(\n filter(([cart, status]) => !!cart && status === CartStatus.OK),\n filter(([_cart, _status, userProfileType]) => userProfileType !== ProfileType.CORPORATE),\n filter(\n ([cart]) => !cart.passengers?.some((passenger) => passenger.passengerTypeCode === FinnairPassengerCode.INF)\n ),\n take(1)\n )\n .subscribe(([cart]) => {\n const flights = getAllFlightsFromCartOrOrder(cart);\n const currencyCode = cart.prices?.unpaid?.total?.total?.totalAmount?.currencyCode;\n flights.forEach((flight) => this.fetchSeatMapOrSetNoAvailability(flight, cart, currencyCode));\n })\n );\n }\n\n private fetchSeatMapOrSetNoAvailability(\n flight: FinnairItineraryItemFlight,\n cart: FinnairCart,\n currencyCode: string\n ): void {\n const hasAvailability = Object.values(\n cart.eligibilities?.serviceCatalog?.categories.find((c) => c.category === Category.SEAT)?.services?.[flight.id] ??\n {}\n ).some(({ isAllowedToUse }) => isAllowedToUse);\n const hasControlAvailability = cart.controlData.sellAncillariesPerFlight[flight.flightNumber] || false;\n\n if (!hasAvailability && !hasControlAvailability) {\n this.store$.dispatch(setNoAvailability({ flightId: flight.id }));\n return;\n }\n\n this.bookingQueueService.queueTriggerFetchSeatMap(flight.id, currencyCode);\n }\n\n private anyPassengerHasChangesToFFDetails(passengerFormDetails: PaxDetailsState, finnairCart: FinnairCart): boolean {\n return passengerFormDetails.passengers.some(\n (pax) =>\n pax.frequentFlyerCard?.cardNumber &&\n pax.frequentFlyerCard?.companyCode &&\n !finnairCart.passengers\n .find((p) => p.id === pax.travelerId)\n ?.frequentFlyerCards?.some(\n (ffCard) =>\n ffCard.cardNumber === pax.frequentFlyerCard.cardNumber &&\n ffCard.companyCode === pax.frequentFlyerCard.companyCode\n )\n );\n }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\n\nimport { snapshot } from '@fcom/rx';\nimport { isPresent } from '@fcom/core/utils';\nimport { PaymentStatus } from '@fcom/common-booking/interfaces';\nimport { paymentStatus } from '@fcom/common-booking/store/selectors';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState } from '@fcom/common/interfaces/booking/booking-state.interface';\n\nimport { BookingService } from '../../../services';\nimport { isAncillariesSkipped, isCartInErrorStateOrDoWeHaveTravelers } from '../../../utils';\nimport { cartData, cartStatus } from '../../../store/selectors';\n\n@Injectable()\nexport class PurchaseReviewGuard implements CanActivate {\n constructor(\n private store$: Store,\n private bookingService: BookingService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n if (this.isReviewAndPayFlow(route)) {\n return true;\n }\n\n const currentCartData = snapshot(this.store$.pipe(cartData()));\n const currentCartStatus = snapshot(this.store$.pipe(cartStatus()));\n\n const canAccess: boolean =\n isCartInErrorStateOrDoWeHaveTravelers(currentCartData, currentCartStatus, true) ||\n isAncillariesSkipped(currentCartData);\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.ANCILLARIES });\n }\n\n return canAccess;\n }\n\n isReviewAndPayFlow = (route: ActivatedRouteSnapshot): boolean => {\n const requestedOrderId = route.queryParamMap.get('orderid');\n const requestedHash = route.queryParamMap.get('hash');\n\n const payStatus = snapshot(this.store$.pipe(paymentStatus()));\n\n return isPresent(requestedOrderId) && isPresent(requestedHash) && PaymentStatus.PENDING_VERIFICATION !== payStatus;\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport {\n ButtonModule,\n FcomFormsModule,\n IconsModule,\n ModalModule,\n NotificationsModule,\n UiComponentsModule,\n} from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { CmsModule } from '@fcom/cms/components';\nimport { ComponentsModule, DirectiveModule, PipesModule } from '@fcom/common';\nimport { LocalizationProvider } from '@fcom/core/services/language/localization.provider';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/common-booking.module';\nimport { I18nKey } from '@fcom/core';\nimport { CommonBookingAncillariesModule } from '@fcom/common-booking';\n\nimport { BookingNotificationModule } from '../../components/booking-notification/booking-notification.module';\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { PurchaseReviewComponent } from './components/purchase-review/purchase-review.component';\nimport { PurchaseReviewFareRulesComponent } from './components/purchase-review-fare-rules/purchase-review-fare-rules.component';\nimport { BookingPurchaseReviewRouteComponent } from './routes/booking-purchase-review-route.component';\nimport { PurchaseReviewGuard } from './services/purchase-review.guard';\nimport { PaxDetailsModule } from '../pax-details/pax-details.module';\nimport { SafContributionProductComponent } from './components/saf-contribution-product/saf-contribution-product.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n CommonBookingComponentsModule,\n CommonBookingAncillariesModule,\n BookingCommonModule,\n CmsModule,\n PipesModule,\n DirectiveModule,\n UiTranslateModule,\n ButtonModule,\n FcomFormsModule,\n IconsModule,\n ModalModule,\n NotificationsModule,\n UiComponentsModule,\n BookingNotificationModule,\n PaxDetailsModule,\n ],\n declarations: [\n BookingPurchaseReviewRouteComponent,\n PurchaseReviewComponent,\n PurchaseReviewFareRulesComponent,\n SafContributionProductComponent,\n ],\n exports: [BookingPurchaseReviewRouteComponent],\n providers: [PurchaseReviewGuard],\n})\nexport class PurchaseReviewModule {\n constructor(private localizationProvider: LocalizationProvider) {\n // TODO: Should we move the lazy mmb localization to booking localizations, so no need to load mmb here\n this.localizationProvider.triggerLazyLocalizations(I18nKey.MMB);\n }\n}\n","import {\n FinnairItineraryItemFlight,\n FinnairLocation,\n ItineraryItemFlight,\n ItineraryItemLayover,\n} from '@fcom/dapi/api/models';\nimport { isShortHaulFlight } from '@fcom/common/utils';\n\nimport { isFlight } from './common-booking.utils';\n\nexport const isLongHaulLegAndAy = (\n itineraryArray: (ItineraryItemFlight | ItineraryItemLayover)[],\n location: {\n [key: string]: FinnairLocation;\n }\n): boolean => {\n return itineraryArray\n .filter(isFlight)\n .filter((itinerary: FinnairItineraryItemFlight) => itinerary.operatingAirline.code === 'AY')\n .some((itinerary: FinnairItineraryItemFlight) => {\n const departureLocation = itinerary.departure.locationCode;\n const destinationLocation = itinerary.arrival.locationCode;\n\n const departureCountry = location[departureLocation].countryCode;\n const destinationCountry = location[destinationLocation].countryCode;\n\n return !isShortHaulFlight(\n { countryCode: departureCountry } as FinnairLocation,\n { countryCode: destinationCountry } as FinnairLocation\n );\n });\n};\n","import { BoundWithLocations, FinnairAirBounds, FinnairBoundGroupWithLocation } from '@fcom/common/interfaces/booking';\nimport { Cabin, FinnairBoundItem, FinnairCabinClass, OfferList } from '@fcom/dapi/api/models';\nimport { TzDate } from '@fcom/core/utils';\n\nimport { isLongHaulLegAndAy } from './flight.utils';\n\nexport const getCabinClassesForAwardBounds = (\n bounds: BoundWithLocations[],\n locations: OfferList['locations']\n): FinnairCabinClass[] => {\n return [FinnairCabinClass.ECONOMY, FinnairCabinClass.ECOPREMIUM, FinnairCabinClass.BUSINESS].filter((cabinClass) => {\n return bounds.some((bound) => {\n return isCabinClassFound(bound, cabinClass) && isLongHaulLegAndAy(bound.itinerary, locations);\n });\n });\n};\n\nexport const getCabinClassesForBounds = (bounds: FinnairAirBounds): FinnairCabinClass[] => {\n return [FinnairCabinClass.ECONOMY, FinnairCabinClass.ECOPREMIUM, FinnairCabinClass.BUSINESS].filter((cabinClass) => {\n return bounds.boundGroups.find((bound: FinnairBoundGroupWithLocation) => {\n return isCabinClassFound(bound, cabinClass) && isLongHaulLegAndAy(bound.details.itinerary, bounds.locations);\n });\n });\n};\n\nconst isCabinClassFound = (\n bound: BoundWithLocations | FinnairBoundGroupWithLocation,\n cabinClass: FinnairCabinClass | Cabin\n) => {\n return bound.fareFamilies?.find((fareInfo) => {\n return fareInfo.fareInformation.find((fareInformation) => {\n return fareInformation.cabinClass === cabinClass;\n });\n });\n};\n\n/**\n * Check if flight has lees then 24 hours of stopOver\n * @param bounds\n */\nexport const hasBound24HourStopOver = (bounds: FinnairBoundItem[]): boolean => {\n let previousBound: FinnairBoundItem | undefined = undefined;\n\n return bounds.some((currentBound) => {\n if (!previousBound) {\n previousBound = currentBound;\n return false;\n }\n if (has24HourDifference(previousBound.arrival.dateTime, currentBound.departure.dateTime)) {\n return true;\n }\n\n previousBound = currentBound;\n return false;\n });\n};\n\n/**\n * Check if dates has less than 24 hours difference\n *\n * @param arrivalDateTime ISO 8601 format\n * @param departureDateTime ISO 8601 format\n */\nconst has24HourDifference = (arrivalDateTime: string, departureDateTime: string): boolean => {\n const arrival = new TzDate(arrivalDateTime);\n const departure = new TzDate(departureDateTime);\n const hoursDifference = arrival.hoursTo(departure);\n\n return hoursDifference > 0 && hoursDifference < 24;\n};\n","
\n \n \n
\n \n {{ 'purchase.review.fullFareRules.categories.' + category.value | finLocalization }}\n \n \n \n \n \n {{ 'purchase.review.fullFareRules.noResults' | finLocalization }}\n

\n \n {{ 'purchase.review.fullFareRules.error' | finLocalization }}\n

\n \n \n

\n
\n \n \n
\n \n \n\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, OnDestroy } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, Observable, Subscription, combineLatest } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\n\nimport { FareRuleCategory, FinnairBoundItem, FinnairPassengerItem } from '@fcom/dapi/api/models';\nimport { LoaderTheme } from '@fcom/ui-components';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { CartFareRules, PartialCartFareRuleRecord } from '@fcom/dapi';\nimport { finShare } from '@fcom/rx';\n\nimport { BookingCartService } from '../../../../services';\nimport { cartIdAndHash, fareRules } from '../../../../store/selectors';\n\n@Component({\n selector: 'fin-purchase-review-fare-rules',\n templateUrl: './purchase-review-fare-rules.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PurchaseReviewFareRulesComponent implements OnInit, OnDestroy {\n @Input({ required: true })\n passengers: FinnairPassengerItem[];\n\n @Input({ required: true })\n cartId: string;\n\n @Input({ required: true })\n bound: FinnairBoundItem;\n\n rulesExpandersOpen: boolean[];\n fareRules$: Observable;\n activePaxId$: BehaviorSubject = new BehaviorSubject(null);\n\n readonly FareRuleCategory = FareRuleCategory;\n readonly LoaderTheme = LoaderTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n private subscriptions: Subscription = new Subscription();\n\n constructor(\n private bookingCartService: BookingCartService,\n private cdr: ChangeDetectorRef,\n private store$: Store\n ) {}\n\n ngOnInit(): void {\n this.activePaxId$.next(this.passengers[0].id);\n\n this.fareRules$ = combineLatest([this.store$.pipe(fareRules()), this.activePaxId$]).pipe(\n map(([fareRules, activePaxId]): CartFareRules => {\n if (!this.bound) {\n return fareRules;\n }\n\n const rulesPerPax = fareRules[activePaxId]?.ticketRules || {};\n\n const flightIdsInBound = this.getFlightIdsInBound();\n\n const newTicketRules = Object.keys(rulesPerPax).reduce(\n (fareRules, category: FareRuleCategory) => ({\n ...fareRules,\n [category]: rulesPerPax[category].filter((rule) => flightIdsInBound.includes(rule.flightId)),\n }),\n {} as PartialCartFareRuleRecord\n );\n\n return {\n [activePaxId]: {\n ...fareRules[activePaxId],\n ticketRules: newTicketRules,\n },\n };\n }),\n finShare()\n );\n\n this.rulesExpandersOpen = new Array(Object.keys(FareRuleCategory).length).fill(false);\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n getFlightIdsInBound(): string[] {\n return this.bound.itinerary\n .map((itineraryItem) => {\n return isFlight(itineraryItem) ? itineraryItem.id : null;\n })\n .filter(Boolean);\n }\n\n handlePassengerTabChange(paxId: unknown): void {\n this.activePaxId$.next(paxId as string);\n this.closeAllRulesExpanders();\n this.cdr.detectChanges();\n }\n\n closeAllRulesExpanders(): void {\n this.rulesExpandersOpen = this.rulesExpandersOpen.map(() => false);\n }\n\n handleRulesExpanderToggle(index: number, cartId: string, travellerId: string, category: string): void {\n this.rulesExpandersOpen[index] = !this.rulesExpandersOpen[index];\n\n this.subscriptions.add(\n combineLatest([this.fareRules$, this.store$.pipe(cartIdAndHash())])\n .pipe(take(1))\n .subscribe(([fareRules, cartHash]) => {\n const rulesInStore = fareRules[travellerId]?.ticketRules[category];\n const rulesLoadingOrError =\n fareRules[travellerId] &&\n (fareRules[travellerId]?.isLoading?.includes(category as FareRuleCategory) ||\n fareRules[travellerId]?.hasError?.includes(category as FareRuleCategory));\n\n if (rulesInStore || rulesLoadingOrError) {\n return;\n }\n this.bookingCartService.triggerTicketRules(cartId, travellerId, category as FareRuleCategory, cartHash.hash);\n })\n );\n }\n}\n","\n
\n \n {{ 'ancillaries.saf.contributionLinkText' | finLocalization }}\n \n
\n\n\n\n \n
\n \n {{ 'ancillaries.saf.contributionThankYouTitle' | finLocalization }}\n \n\n \n {{ 'ancillaries.saf.contributionJoinUsTitle' | finLocalization }}\n \n\n \n {{ 'ancillaries.saf.readMore.text' | finLocalization }}\n
\n\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { BehaviorSubject, combineLatest, filter, map, Observable, Subject, Subscription, switchMap, take } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\n\nimport {\n CommonBookingState,\n ServicesActions,\n serviceSelectionsForFragment,\n servicesForCategory,\n} from '@fcom/common-booking/store';\nimport { isDeepEqual, isPresent, mapErrorForSentry, SentryLogger, valuesOf } from '@fcom/core/index';\nimport { AppState } from '@fcom/core/interfaces';\nimport { Amount, ServiceCatalogServices, TravelerService } from '@fcom/dapi';\nimport { Category, FinnairItineraryItemFlight, SubCategory } from '@fcom/dapi/api/models';\nimport { getServiceData } from '@fcom/common-booking/utils/ancillaries.utils';\nimport { getAllFlightsFromCartOrOrder } from '@fcom/common-booking/utils/common-booking.utils';\nimport { FragmentService, ToasterService } from '@fcom/common/services';\nimport { finShare } from '@fcom/rx';\nimport { CartOrOrder } from '@fcom/common-booking/interfaces';\nimport { changedServices } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { GtmEvent, GtmPurchaseFlow } from '@fcom/common/interfaces';\nimport { GtmService } from '@fcom/common/gtm';\nimport { ModalButtons } from '@fcom/ui-components';\nimport { CmsArticle } from '@fcom/core-api/interfaces';\n\nimport { BookingQueueService } from '../../../../services';\nimport {\n PaxServiceCategoryPerFragmentWithSelections,\n ServiceCatalogServiceWithSelection,\n ServiceSelectionChange,\n} from '../../../pax-details/interfaces/pax-ancillaries.interface';\n\n@Component({\n selector: 'fin-saf-contribution-product',\n templateUrl: './saf-contribution-product.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SafContributionProductComponent implements OnInit {\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly ModalButtons = ModalButtons;\n\n @Input({ required: true })\n servicesReady$: Observable;\n\n @Input({ required: true })\n cartOrOrder$: Observable;\n\n safIsLoading$ = new BehaviorSubject(false);\n\n serviceCatalogWithSelection: ServiceCatalogServiceWithSelection;\n travelerId: string;\n\n safService$: Observable;\n safServicesWithSelection$: Observable;\n totalPrice$: Observable;\n\n subscriptions: Subscription = new Subscription();\n isSafSelected$: Observable;\n cartBeforeSafUpdated: Subject = new Subject();\n openModal = false;\n safModalFragment$: Observable;\n\n constructor(\n private store$: Store,\n private bookingQueueService: BookingQueueService,\n private toasterService: ToasterService,\n private sentryLogger: SentryLogger,\n private gtmService: GtmService,\n private fragmentService: FragmentService\n ) {}\n\n ngOnInit(): void {\n this.safService$ = this.store$.pipe(servicesForCategory(Category.SAF));\n\n this.totalPrice$ = this.safService$.pipe(map((safServices) => this.getTotalPrice(safServices)));\n this.subscriptions.add(this.totalPrice$.subscribe());\n\n this.subscriptions.add(\n combineLatest([this.cartOrOrder$, this.cartBeforeSafUpdated])\n .pipe(\n map(([order, oldOrder]) => changedServices(oldOrder, order, Category.SAF, GtmPurchaseFlow.BOOKING)),\n distinctUntilChanged(isDeepEqual),\n filter(({ addedProducts, removedProducts }) => addedProducts.length > 0 || removedProducts.length > 0)\n )\n .subscribe(({ addedProducts, removedProducts }) => {\n if (addedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.ADD_TO_CART, addedProducts);\n }\n\n if (removedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.REMOVE_FROM_CART, removedProducts);\n }\n })\n );\n\n const selections$ = this.safService$.pipe(\n switchMap((safServices) =>\n combineLatest(\n Object.keys(safServices).map((fragmentId) =>\n this.store$.pipe(\n serviceSelectionsForFragment(fragmentId, Category.SAF),\n map((selections) =>\n valuesOf(selections)\n .reduce((all, services) => all.concat(...services), [])\n .filter((service) => service.quantity > 0)\n ),\n finShare()\n )\n )\n )\n ),\n map((selections) => selections.flat())\n );\n\n this.isSafSelected$ = selections$.pipe(\n map((services) => services.filter((service) => service?.variant === 'SAFL').length > 0)\n );\n\n this.safServicesWithSelection$ = combineLatest([this.isSafSelected$, this.safService$]).pipe(\n map(([isSafSelected, safServices]) => {\n const selectedQuantity = isSafSelected ? 1 : 0;\n const selection = { selected: isSafSelected, selectedQuantity };\n\n const serviceCatalogServiceWithSelection = Object.entries(Object.values(safServices ?? {})[0] ?? {})?.reduce(\n (innerAcc, [innerFragment, innerServices]) => {\n innerAcc[innerFragment] = innerServices.map((scs) => ({ ...scs, ...selection }));\n return innerAcc;\n },\n {}\n );\n\n this.serviceCatalogWithSelection = Object.values(serviceCatalogServiceWithSelection)[0][0];\n\n return serviceCatalogServiceWithSelection ?? {};\n })\n );\n\n this.subscriptions.add(this.safServicesWithSelection$.subscribe());\n\n this.subscriptions.add(\n this.servicesReady$.subscribe((serviceReady) => {\n if (serviceReady) {\n this.safIsLoading$.next(false);\n }\n })\n );\n\n this.safModalFragment$ = this.fragmentService.getFragment(\n 'fragments.services.productInfo.saf.contributeUrl'\n );\n }\n\n getTotalPrice(safServices: ServiceCatalogServices): Amount {\n return Object.values(safServices)\n .flatMap((entries) => Object.values(entries).flat())\n .filter((item) => item.category === Category.SAF && item.subCategory === SubCategory.SAF_LOW)\n .reduce(\n (acc, item) => ({\n amount: (parseFloat(acc.amount) + parseFloat(item.totalPrice.amount)).toString(),\n currencyCode: item.totalPrice.currencyCode,\n }),\n { amount: '0', currencyCode: '' }\n );\n }\n\n updateSelectionsForFragment(serviceSelection: ServiceSelectionChange): void {\n this.subscriptions.add(\n combineLatest([this.safService$, this.isSafSelected$, this.cartOrOrder$])\n .pipe(\n filter(([_services, isSafSelected, _cartOrOrder]) => isPresent(serviceSelection.selection) !== isSafSelected),\n map(([services, , cartOrOrder]) =>\n Object.entries(services).map(([fragmentId, travelerServices]) => ({\n fragmentId,\n category: serviceSelection.category,\n selections: Object.keys(travelerServices).reduce>((acc, travelerId) => {\n acc[travelerId] = serviceSelection.selection ? [serviceSelection.selection] : [];\n return acc;\n }, {}),\n cartOrOrder,\n }))\n ),\n take(1)\n )\n .subscribe((selections) => {\n selections.forEach((selection) => {\n try {\n this.store$.dispatch(ServicesActions.setSelectionsForFragment(selection));\n } catch (error) {\n this.sentryLogger.error('Selecting sustainable aviation fuel(SAF) failed', {\n error: mapErrorForSentry(error),\n });\n }\n });\n\n this.safIsLoading$.next(true);\n\n const flights: FinnairItineraryItemFlight[] = getAllFlightsFromCartOrOrder(selections[0].cartOrOrder);\n const [requests, messages] = getServiceData(\n this.store$,\n serviceSelection.category,\n selections[0].cartOrOrder.bounds,\n flights\n );\n\n this.bookingQueueService.queueServicesUpdate(requests, {\n error: () => {\n this.toasterService.addMessageToQueue(messages.error);\n },\n complete: () => {\n this.cartBeforeSafUpdated.next(selections[0].cartOrOrder);\n },\n });\n })\n );\n }\n}\n","
\n \n\n \n \n \n\n \n \n {{ 'purchase.createdByCustomerCare' | finLocalization }}\n \n\n 2 ? ('multiCity.flightSelection.title' | finLocalization) : null\"\n [destinations]=\"summary$ | async\"\n [passengerAmount]=\"booking.passengers.length\"\n [image]=\"image$ | async\"\n [showExpandButton]=\"false\"\n [showStartOverButton]=\"(isOrder$ | async) === false\"\n (ctaClick)=\"backToDateSelection()\"\n >\n \n\n \n\n
\n

{{ 'purchaseSummaryItemNames.flights' | finLocalization }}

\n\n @if (multiCityStopoverDurationNotification$ | async) {\n \n {{ 'multiCityNotification.stopOverNotification.text' | finLocalization }}\n \n }\n\n @if (hasTrainSegment$ | async) {\n \n \n {{ 'purchase.review.containsTrainNotification.description' | finLocalization }}\n \n \n }\n\n
\n \n \n \n
\n \n

\n {{ 'purchase.review.ticketDetails' | finLocalization }}\n {{ '(' + bound.fareFamilyBrandName + ')' }}\n

\n \n \n \n 0\" class=\"bold-type\"\n >{{ (rebookPolicies$ | async)[i]?.label }}\n {{ (rebookPolicies$ | async)[i]?.value }}\n @if ((cancellationPolicies$ | async).length > 0) {\n {{ (cancellationPolicies$ | async)?.[i]?.label }}\n {{ (cancellationPolicies$ | async)?.[i]?.value }}\n @if ((inboundShowFlexTicketNotification$ | async) === bound.id) {\n \n

\n \n }\n }\n
\n
\n\n \n
\n \n @if ((inboundShowFlexTicketNotification$ | async) === bound.id) {\n
\n \n

\n \n
\n }\n \n {{ 'purchase.review.fullFareRules.title' | finLocalization }}\n \n
\n \n
\n
\n \n \n

\n {{ 'safNotification.sectionHeader' | finLocalization }}\n

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

\n {{ 'passengerReview.title' | finLocalization }}\n

\n \n \n \n \n \n
\n\n @if (enableAdditionalEmailInBookingFlow && (isOrder$ | async) === false) {\n \n \n

\n {{ 'additionalEmail.sectionTitle' | finLocalization }}\n

\n \n
\n \n }\n\n @if (!enableCorporateSeatBenefit) {\n \n \n
\n {{ corporateCode }}\n \n
\n
\n \n }\n\n \n\n \n

\n {{ 'localSettings.ancillaries.cover.sectionTitle' | finLocalization }}\n

\n \n
\n\n

\n {{ 'purchase.review.priceBreakdown' | finLocalization }}\n

\n\n \n \n \n \n \n \n\n \n\n \n \n \n \n \n \n\n \n\n \n {{ 'price.continueButtonTotal' | finLocalization }}: \n {{ 'award.points' | finLocalization: { pointsAmount: points || 0 | finPoints } }} +\n \n {{\n totalPrice$ | async | finPrice: { useSymbol: false }\n }}\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { FormBuilder, Validators } from '@angular/forms';\n\nimport { IconLibrary, SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { AppState, ConfigService, isDeepEqual, mapErrorForSentry, SentryLogger } from '@fcom/core';\nimport {\n CartOrOrder,\n CommonBookingState,\n ServicesActions,\n servicesReady,\n TRAIN_AIRCRAFT_CODE,\n} from '@fcom/common-booking';\nimport {\n ButtonMode,\n ButtonPosition,\n ButtonSize,\n ButtonTheme,\n LoaderTheme,\n ModalButtons,\n NotificationTheme,\n} from '@fcom/ui-components';\nimport { ToasterService } from '@fcom/common/services';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n GtmEvent,\n GtmPurchaseFlow,\n TestVariantWithId,\n TripType,\n} from '@fcom/common/interfaces';\nimport {\n Amount,\n BoundType,\n CartStatus,\n CustomServiceType,\n LocationUtil,\n ServiceCatalogCategory,\n TravelerService,\n} from '@fcom/dapi';\nimport {\n Category,\n ControlData,\n FareFamily,\n FareRuleCategory,\n FinnairBoundItem,\n FinnairCart,\n FinnairFrequentFlyerCardItem,\n FinnairItineraryItemFlight,\n FinnairOrder,\n FinnairPassengerCode,\n FinnairPicture,\n FinnairServiceItem,\n ServiceFlow,\n TranslatedBenefitRow,\n} from '@fcom/dapi/api/models';\nimport { finShare, safeMap, safeMap as safeMapObs, snapshot } from '@fcom/rx';\nimport { getBookingDestinationSummary } from '@fcom/common/utils/booking.utils';\nimport {\n additionalEmailValidator,\n getAllFlightsFromCartOrOrder,\n getTripTypeFromBounds,\n hasBusSegment,\n isAwardBooking,\n isFlexFareFamilyBound,\n isFlight,\n isUsingSAF,\n toAmount,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { Step } from '@fcom/common';\nimport { changedServices, getServicesToShow } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { containsLongHaulFlight, getGA4Items, resolvePurchaseFlow } from '@fcom/common/utils/gtm.utils';\nimport { profileOrNot, profileType } from '@fcom/core/selectors';\nimport { EMAIL_PATTERN, isPresent, unsubscribe, valuesOf } from '@fcom/core/utils';\nimport {\n serviceMapForCategories,\n serviceSelectionsForFragment,\n servicesForCategory,\n servicesForFragmentAndCategory,\n} from '@fcom/common-booking/store/selectors/services.selector';\nimport { getServiceData } from '@fcom/common-booking/utils/ancillaries.utils';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingSteps } from '@fcom/common/interfaces/booking/booking-step.interface';\nimport { PaxDetailsState } from '@fcom/common/interfaces/booking';\nimport { ProfileType } from '@fcom/core-api/login';\nimport { hasBound24HourStopOver } from '@fcom/common-booking/utils/bound.utils';\n\nimport {\n PaxServiceCategoryPerFragmentWithSelections,\n ServiceCatalogServiceWithSelection,\n ServiceSelectionChange,\n} from '../../../pax-details/interfaces/pax-ancillaries.interface';\nimport { CountryCode } from '../../../../utils';\nimport { BookingQueueService } from '../../../../services/booking-queue.service';\nimport { additionalEmails, paxDetails } from '../../../../store/selectors';\nimport { PaxDetailsActions } from '../../../../store/actions';\nimport { BookingService } from '../../../../services';\nimport { GrandTotalTheme } from '../../../common/components/grand-total/grand-total.component';\n\nexport const mapRebookPolicy = (fareFamily: FareFamily): TranslatedBenefitRow =>\n fareFamily?.translatedBenefitRows.find((row) => row.key === 'rebook');\n\nexport const mapCancellationPolicy = (fareFamily: FareFamily): TranslatedBenefitRow =>\n fareFamily?.translatedBenefitRows.find((row) => row.key === 'cancel');\n\n@Component({\n selector: 'fin-purchase-review',\n styleUrls: ['./purchase-review.component.scss'],\n templateUrl: './purchase-review.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PurchaseReviewComponent implements OnInit, OnDestroy {\n readonly BoundType = BoundType;\n readonly ModalButtons = ModalButtons;\n readonly FinnairPassengerCode = FinnairPassengerCode;\n readonly ButtonPosition = ButtonPosition;\n readonly NotificationTheme = NotificationTheme;\n readonly ButtonTheme = ButtonTheme;\n readonly ButtonSize = ButtonSize;\n readonly ButtonMode = ButtonMode;\n readonly ServiceFlow = ServiceFlow;\n readonly GrandTotalTheme = GrandTotalTheme;\n readonly LoaderTheme = LoaderTheme;\n readonly ProfileType = ProfileType;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n STEPS: BookingSteps = BOOKING_STEPS;\n readonly IconLibrary = IconLibrary;\n\n @Input()\n cartOrOrder$: Observable;\n\n @Input()\n cartOrOrderStatus$: Observable;\n\n @Output()\n ready: EventEmitter = new EventEmitter();\n @Output()\n edit: EventEmitter = new EventEmitter();\n\n readonly FareRuleCategory = FareRuleCategory;\n\n isTicketRulesModalOpen = false;\n isTimelineModalOpen = false;\n timelineBoundIndex: number;\n flightCardExpandersOpen: boolean[];\n\n cartOrOrderStatusUpdating$: Observable;\n safContributionUrl$: Observable;\n hasServices$: Observable;\n isOneWay$: Observable;\n originInChinaOrKorea$: Observable;\n showKoreaNotification$: Observable;\n image$: Observable;\n summary$: Observable;\n isOrder$: Observable;\n totalPrice$: Observable;\n totalPoints$: Observable;\n serviceFlow$: Observable;\n shouldDisplayCombinedTripMessage$: Observable;\n shouldDisplaySafContributionMessage$: Observable;\n services$: Observable;\n testVariant$: Observable;\n\n cancellationPolicies$: Observable;\n rebookPolicies$: Observable;\n\n subscriptions: Subscription = new Subscription();\n\n showSustainableMessages$: Observable;\n\n servicesReady$: Observable;\n isCoverSelected$: Observable;\n coverServicesWithSelection$: Observable;\n catalogCategory$: Observable;\n coverIsLoading$ = new BehaviorSubject(false);\n\n scsWithSelection: ServiceCatalogServiceWithSelection;\n travelerId: string;\n enableCancellationCoverUpsell$: Observable;\n\n paxDetails$: Observable = this.store$.pipe(paxDetails());\n paxAdditionalEmails$: Observable = this.store$.pipe(take(1), additionalEmails());\n paxForm = this.formBuilder.group({\n additionalEmail: this.formBuilder.control(\n '',\n [Validators.pattern(EMAIL_PATTERN)],\n [additionalEmailValidator(this.paxAdditionalEmails$)]\n ),\n });\n emailsArray: string[] = [];\n enableAdditionalEmailInBookingFlow = false;\n enableCorporateSeatBenefit: boolean;\n activeBoundInModal$: BehaviorSubject = new BehaviorSubject(null);\n controlData$: Observable;\n profileType$: Observable;\n\n allFrequentFlyerCards$: Observable;\n enableShowingSAF: boolean;\n enableSafContributionCard$: Observable;\n multiCityStopoverDurationNotification$: Observable;\n isChangingStep = false;\n enableEditPaxDetailsOnReviewPage: boolean;\n hasTrainSegment$: Observable;\n\n cartBeforeCancellationCoverUpdated$: Subject = new Subject();\n\n inboundShowFlexTicketNotification$: Observable = of(undefined);\n\n constructor(\n private languageService: LanguageService,\n private gtmService: GtmService,\n private store$: Store,\n private bookingQueueService: BookingQueueService,\n private bookingService: BookingService,\n private toasterService: ToasterService,\n private configService: ConfigService,\n private sentryLogger: SentryLogger,\n private formBuilder: FormBuilder,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.multiCityStopoverDurationNotification$ = this.cartOrOrder$.pipe(\n distinctUntilChanged(isDeepEqual),\n filter((cartOrOrder) => Boolean(cartOrOrder) && getTripTypeFromBounds(cartOrOrder.bounds) === TripType.MULTICITY),\n map((cartOrOrder) => hasBound24HourStopOver(cartOrOrder.bounds))\n );\n\n this.enableEditPaxDetailsOnReviewPage = this.configService.cfg.enableEditPaxDetailsOnReviewPage;\n this.subscriptions.add(\n combineLatest([\n this.cartOrOrder$.pipe(\n take(1),\n filter((cart) => !!cart)\n ),\n this.store$.pipe(profileOrNot()),\n ]).subscribe(([cartOrOrder, profile]) => {\n this.gtmService.ecommerceEventGA4(\n GtmEvent.VIEW_CART,\n getGA4Items(cartOrOrder, resolvePurchaseFlow(profile, isAwardBooking(cartOrOrder?.prices?.unpaid)), true)\n );\n })\n );\n\n this.handleCover();\n this.subscriptions.add(\n this.paxDetails$.subscribe((paxState: PaxDetailsState) => {\n this.emailsArray = paxState?.additionalEmails || this.emailsArray;\n\n if (this.emailsArray.length >= 3) {\n this.paxForm.get('additionalEmail').disable();\n } else {\n this.paxForm.get('additionalEmail').enable();\n }\n })\n );\n\n this.cancellationPolicies$ = this.cartOrOrder$.pipe(\n map((cartOrOrder) => {\n const ffCodes = cartOrOrder?.bounds?.map((bound) => bound.fareFamily.code);\n\n return ffCodes.map((ffCode: string) => mapCancellationPolicy(cartOrOrder?.benefits[ffCode])).filter(isPresent);\n })\n );\n\n this.allFrequentFlyerCards$ = this.cartOrOrder$.pipe(\n map(({ passengers }) => passengers.flatMap((pax) => pax.frequentFlyerCards ?? []))\n );\n\n this.rebookPolicies$ = this.cartOrOrder$.pipe(\n map((cartOrOrder) => {\n const ffCodes = cartOrOrder?.bounds?.map((bound) => bound.fareFamily.code);\n\n return ffCodes.map((ffCode: string) => mapRebookPolicy(cartOrOrder?.benefits[ffCode])).filter(isPresent);\n })\n );\n\n this.controlData$ = this.cartOrOrder$.pipe(map((order) => order.controlData));\n this.profileType$ = this.store$.pipe(profileType());\n this.totalPrice$ = this.cartOrOrder$.pipe(\n map((data) => data?.prices),\n safeMapObs((prices) => {\n return toAmount(prices.unpaid.total.total.totalAmount);\n })\n );\n\n this.totalPoints$ = this.cartOrOrder$.pipe(\n filter((data) => !!data?.prices?.unpaid?.total?.total?.totalPoints),\n map((data) => +data.prices.unpaid.total.total.totalPoints.amount)\n );\n\n this.serviceFlow$ = this.totalPoints$.pipe(\n map((points) => (points ? ServiceFlow.AWARD : undefined)),\n startWith(undefined),\n finShare()\n );\n\n this.isOrder$ = this.cartOrOrder$.pipe(\n map((d) => d.id.length === 6),\n finShare()\n );\n\n this.cartOrOrderStatusUpdating$ = this.cartOrOrderStatus$.pipe(\n map((status: CartStatus) => status !== CartStatus.OK),\n startWith(false)\n );\n\n this.summary$ = this.cartOrOrder$.pipe(map((cd) => getBookingDestinationSummary(cd)));\n\n this.image$ = combineLatest([this.cartOrOrder$, this.summary$]).pipe(\n map(([cartData, summary]) => cartData.locations[summary[1].code]?.picture),\n filter(Boolean)\n );\n\n this.shouldDisplayCombinedTripMessage$ = this.cartOrOrder$.pipe(map(hasBusSegment));\n\n this.shouldDisplaySafContributionMessage$ = this.cartOrOrder$.pipe(\n map((summary) => summary?.bounds?.some((bound) => isUsingSAF(bound) && this.enableShowingSAF))\n );\n\n this.enableShowingSAF = this.configService.cfg.enableShowingSAF;\n\n this.enableSafContributionCard$ = combineLatest([\n this.cartOrOrder$,\n this.store$.pipe(servicesForCategory(Category.SAF)),\n ]).pipe(\n map(([cartOrOrder, safAncillary]) => {\n if (cartOrOrder.otherInformation.corporateUserInformation) {\n return false;\n }\n if (!this.configService.cfg.enableSafContributionCard || !safAncillary) {\n return false;\n }\n const safEligibility = cartOrOrder.eligibilities.serviceCatalog?.categories.find((eligibility) => {\n return eligibility.category === Category.SAF;\n });\n return cartOrOrder.bounds.every((bound) => {\n const boundEligibility = safEligibility?.services[bound.id];\n\n return cartOrOrder.passengers.every((pax) => boundEligibility[pax.id]?.isAllowedToUse);\n });\n }),\n startWith(false)\n );\n\n this.safContributionUrl$ = this.languageService\n .translate('fragments.safContribution.url')\n .pipe(distinctUntilChanged());\n\n this.hasServices$ = this.cartOrOrder$.pipe(safeMap((c) => c.services.unpaid.length > 0));\n\n this.isOneWay$ = this.cartOrOrder$.pipe(safeMap((c) => c.bounds.length === 1));\n\n const originCountryCode$ = this.cartOrOrder$.pipe(\n filter((cartData) => !!cartData),\n map(\n (cartData) =>\n cartData.locations[(cartData.bounds[0].itinerary[0] as FinnairItineraryItemFlight).departure.locationCode]\n .countryCode\n )\n );\n\n this.originInChinaOrKorea$ = originCountryCode$.pipe(\n map((countryCode: CountryCode) => [CountryCode.KOREA, CountryCode.CHINA].includes(countryCode)),\n finShare()\n );\n\n this.showKoreaNotification$ = originCountryCode$.pipe(\n map((countryCode: CountryCode) => CountryCode.KOREA === countryCode),\n finShare()\n );\n\n this.showSustainableMessages$ = combineLatest([\n this.shouldDisplayCombinedTripMessage$,\n this.shouldDisplaySafContributionMessage$,\n this.safContributionUrl$,\n ]).pipe(\n map(\n ([shouldDisplayCombinedTripMessage, shouldDisplaySafContributionMessage, safContributionUrl]) =>\n shouldDisplayCombinedTripMessage || (shouldDisplaySafContributionMessage && !!safContributionUrl)\n )\n );\n\n this.enableAdditionalEmailInBookingFlow = this.configService.cfg.enableAdditionalEmailInBookingFlow;\n this.enableCorporateSeatBenefit = this.configService.cfg.enableCorporateSeatBenefit;\n\n this.services$ = this.cartOrOrder$.pipe(\n map((cartOrOrder) => getServicesToShow(cartOrOrder?.services, 'unpaid', false, true)),\n finShare()\n );\n\n this.subscriptions.add(\n this.cartOrOrder$.subscribe((cartOrOrder: FinnairCart | FinnairOrder) => {\n this.flightCardExpandersOpen = new Array(cartOrOrder?.bounds?.length).fill(false);\n })\n );\n\n this.subscriptions.add(\n combineLatest([this.cartOrOrder$, this.cartBeforeCancellationCoverUpdated$])\n .pipe(\n map(([order, oldOrder]) => changedServices(oldOrder, order, Category.COVER, GtmPurchaseFlow.BOOKING)),\n distinctUntilChanged(isDeepEqual),\n filter(({ addedProducts, removedProducts }) => addedProducts.length > 0 || removedProducts.length > 0)\n )\n .subscribe(({ addedProducts, removedProducts }) => {\n if (addedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.ADD_TO_CART, addedProducts);\n }\n\n if (removedProducts.length) {\n this.gtmService.ecommerceEventGA4(GtmEvent.REMOVE_FROM_CART, removedProducts);\n }\n })\n );\n\n // Show notification only for long haul flights with flex ticket\n // and only for the inbound flight when there are two bounds (return flight or open-jaw)\n this.inboundShowFlexTicketNotification$ = this.cartOrOrder$.pipe(\n filter((cartOrOrder) => Boolean(cartOrOrder) && cartOrOrder.bounds.length === 2),\n map(({ bounds }) => {\n const inboundFlight = bounds[1];\n return inboundFlight && isFlexFareFamilyBound(inboundFlight) && containsLongHaulFlight([inboundFlight])\n ? inboundFlight.id\n : undefined;\n })\n );\n\n this.hasTrainSegment$ = this.cartOrOrder$.pipe(\n map((cartOrOrder) => {\n return cartOrOrder.bounds.some((bound) => {\n return bound.itinerary.filter(isFlight).some((i) => {\n return i.aircraft?.code?.toUpperCase() === TRAIN_AIRCRAFT_CODE;\n });\n });\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n private handleCover(): void {\n this.servicesReady$ = this.store$.pipe(servicesReady()).pipe(finShare());\n\n this.catalogCategory$ = this.store$.pipe(\n serviceMapForCategories([Category.COVER]),\n map((array) => array[0])\n );\n\n this.subscriptions.add(this.catalogCategory$.subscribe());\n\n const selections$ = this.store$.pipe(\n serviceSelectionsForFragment(CustomServiceType.JOURNEY, Category.COVER),\n map((selections) =>\n valuesOf(selections)\n .reduce((all, services) => all.concat(...services), [])\n .filter((service) => service.quantity > 0)\n ),\n finShare()\n );\n\n this.isCoverSelected$ = selections$.pipe(\n map((services) => {\n const selectedCoverAsArray = services.map((service) => service.variant === 'CACR');\n\n if (selectedCoverAsArray.length === 1) {\n return selectedCoverAsArray[0];\n }\n\n return false;\n })\n );\n\n this.subscriptions.add(this.isCoverSelected$.subscribe());\n\n this.coverServicesWithSelection$ = combineLatest([\n this.isCoverSelected$,\n this.store$.pipe(servicesForFragmentAndCategory(CustomServiceType.JOURNEY, Category.COVER)),\n ]).pipe(\n map(([isCoverSelected, coverServices]) => {\n this.travelerId = Object.keys(coverServices)?.[0];\n const serviceCatalogServices = Object.values(coverServices)?.[0];\n const selectedQuantity = isCoverSelected ? 1 : 0;\n\n const selection = { selected: isCoverSelected, selectedQuantity };\n\n const serviceCatalogServiceWithSelection = serviceCatalogServices?.map((scs) => ({ ...selection, ...scs }));\n if (!isPresent(serviceCatalogServiceWithSelection)) {\n return null;\n }\n\n this.scsWithSelection = serviceCatalogServiceWithSelection[0];\n return { [this.travelerId]: serviceCatalogServiceWithSelection };\n })\n );\n\n this.subscriptions.add(this.coverServicesWithSelection$.subscribe());\n\n this.subscriptions.add(\n this.servicesReady$.subscribe((serviceReady) => {\n if (serviceReady) {\n this.coverIsLoading$.next(false);\n }\n })\n );\n }\n\n updateSelectionsForFragment({ category, selection }: ServiceSelectionChange): void {\n this.subscriptions.add(\n combineLatest([this.cartOrOrder$, this.isCoverSelected$])\n .pipe(take(1))\n .subscribe(([currentCartData, isCoverSelected]) => {\n // Checking if the selection is the same as in the store to prevent 2 store updates as the toggle fires twice\n if (isPresent(selection) === isCoverSelected) {\n return;\n }\n\n try {\n this.store$.dispatch(\n ServicesActions.setCoverForId({\n journeyId: CustomServiceType.JOURNEY,\n travelerId: CustomServiceType.GROUP,\n service: {\n category: this.scsWithSelection.subCategory,\n variant: 'CACR',\n displayName: this.scsWithSelection.translations.title,\n pricePerItem: this.scsWithSelection.totalPrice,\n quantity: isCoverSelected ? 0 : 1,\n includedInTicketType: false,\n includedInTierBenefit: false,\n },\n })\n );\n } catch (error) {\n this.sentryLogger.error('Selecting cancellation cover failed', {\n error: mapErrorForSentry(error),\n });\n }\n\n this.coverIsLoading$.next(true);\n\n const flights: FinnairItineraryItemFlight[] = getAllFlightsFromCartOrOrder(currentCartData);\n const [requests, messages] = getServiceData(this.store$, category, currentCartData.bounds, flights);\n\n this.bookingQueueService.queueServicesUpdate(requests, {\n error: () => {\n this.toasterService.addMessageToQueue(messages.error);\n },\n complete: () => {\n this.cartBeforeCancellationCoverUpdated$.next(currentCartData);\n },\n });\n })\n );\n }\n\n backToDateSelection(): void {\n /**\n * This unloads the page content before changing the step. If this is not done then there\n * is many JS errors as the cartOrOrder$ observable emits undefined before the page is\n * unloaded.\n */\n this.isChangingStep = true;\n this.cdr.detectChanges();\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n addEmail(): void {\n const addedEmail = this.paxForm.get('additionalEmail').value;\n this.emailsArray.push(addedEmail);\n this.store$.dispatch(PaxDetailsActions.setAdditionalEmails({ additionalEmails: this.emailsArray }));\n const passengerFormDetails: PaxDetailsState = snapshot(this.paxDetails$);\n\n this.bookingQueueService.queuePassengersAndCorporateCodeUpdate(passengerFormDetails);\n\n this.paxForm.get('additionalEmail').reset();\n\n this.gtmService.trackElement(\n 'additional-email',\n 'booking-flow_purchase-review',\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n }\n\n removeEmail(index: number): void {\n this.emailsArray.splice(index, 1);\n this.store$.dispatch(PaxDetailsActions.setAdditionalEmails({ additionalEmails: this.emailsArray }));\n const passengerFormDetails: PaxDetailsState = snapshot(this.paxDetails$);\n\n this.bookingQueueService.queuePassengersAndCorporateCodeUpdate(passengerFormDetails);\n }\n\n handleFullTicketRuleModalOpen(): void {\n this.isTicketRulesModalOpen = true;\n\n this.gtmService.trackElement(\n 'full-ticket-rules::open-modal',\n GaContext.BOOKING_FLOW,\n ElementTypes.MODAL,\n undefined,\n ElementActions.CLICK\n );\n }\n\n handleFlightCardToggle(index: number): void {\n this.flightCardExpandersOpen[index] = !this.flightCardExpandersOpen[index];\n }\n\n handleViewDetailsModal(index: number): void {\n this.timelineBoundIndex = index;\n this.isTimelineModalOpen = true;\n }\n\n openTicketRulesModal(bound: FinnairBoundItem): void {\n this.isTicketRulesModalOpen = true;\n\n this.activeBoundInModal$.next(bound);\n }\n}\n","import { Component, HostBinding, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\nimport { Observable, of, Subscription } from 'rxjs';\nimport { filter, map, startWith, switchMap } from 'rxjs/operators';\n\nimport { PaymentStatus } from '@fcom/common-booking/interfaces';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { CartState, CartStatus, DapiErrorStatus } from '@fcom/dapi';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { FinnairCart, FinnairOrder } from '@fcom/dapi/api/models';\nimport { orderData, orderResponseErrorStatus, OrderActions } from '@fcom/common-booking/store';\nimport { PaymentActions, BookingOrderService } from '@fcom/common-booking';\nimport { Step } from '@fcom/common/interfaces';\nimport { finShare } from '@fcom/rx';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { GlobalBookingActions } from '@fcom/common/store';\n\nimport { CartActions } from '../../../store/actions';\nimport { cartState } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\nimport { navigateToError } from '../../../utils/route-utils';\n\n@Component({\n selector: 'fin-booking-purchase-review-route',\n templateUrl: './booking-purchase-review-route.component.html',\n})\nexport class BookingPurchaseReviewRouteComponent implements OnInit, OnDestroy {\n @HostBinding('class') classAttribute = 'grid-col-12 pr-clear';\n readonly cartOrOrder$: Observable;\n readonly cartOrOrderStatus$: Observable;\n\n private subscription: Subscription;\n\n constructor(\n private bookingService: BookingService,\n private store$: Store,\n private activatedRoute: ActivatedRoute,\n private bookingOrderService: BookingOrderService,\n private router: Router,\n private languageService: LanguageService\n ) {\n const cartState$: Observable = this.store$.pipe(cartState(), finShare());\n\n const order$: Observable = this.store$.pipe(orderData(), startWith(null), finShare());\n this.cartOrOrder$ = order$.pipe(\n switchMap((order) => {\n return order ? of(order) : cartState$.pipe(map((state) => state.cartData));\n })\n );\n\n this.cartOrOrderStatus$ = order$.pipe(\n switchMap((order) => {\n return order ? of(CartStatus.OK) : cartState$.pipe(map((state) => state.cartStatus));\n })\n );\n }\n\n ngOnInit(): void {\n this.subscription = new Subscription();\n this.checkIfReviewAndPayRequestedAndHandleLoadingErrorAndIfAlreadyPaid();\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\n }\n\n proceedToPayment(): void {\n this.store$.dispatch(CartActions.acceptTerms());\n this.bookingService.nextStep();\n }\n\n setActive(next: Step): void {\n if (!next) {\n return;\n }\n if (next.id !== this.bookingService.currentStep.id) {\n this.bookingService.setStep({\n step: next,\n });\n }\n }\n\n private checkIfReviewAndPayRequestedAndHandleLoadingErrorAndIfAlreadyPaid(): void {\n const requestedOrderId = this.activatedRoute.snapshot.queryParamMap.get('orderid');\n const requestedHash = this.activatedRoute.snapshot.queryParamMap.get('hash');\n\n if (requestedOrderId && requestedHash) {\n this.store$.dispatch(\n OrderActions.setOrderFetchInformation({ orderInformation: { id: requestedOrderId, hash: requestedHash } })\n );\n\n this.bookingOrderService.queueOrderLoad();\n\n // We show different error page depending on which response error status we get\n const orderResponseErrorStatus$ = this.store$.pipe(orderResponseErrorStatus());\n\n this.subscription.add(\n orderResponseErrorStatus$.subscribe((status) => {\n switch (status) {\n case DapiErrorStatus.INVALID_INPUT:\n navigateToError(this.router, this.languageService.langValue, 'REVIEW_AND_PAY_ORDER_FETCH_INVALID_INPUT', {\n info: 'errors.reviewAndPay.orderFetch.invalidInput.description',\n showButton: false,\n });\n break;\n case DapiErrorStatus.OTHER_ERROR:\n navigateToError(this.router, this.languageService.langValue, 'REVIEW_AND_PAY_ORDER_FETCH_OTHER_ERROR', {\n info: 'errors.reviewAndPay.orderFetch.otherError.description',\n showButton: false,\n });\n break;\n default:\n navigateToError(this.router, this.languageService.langValue, 'REVIEW_AND_PAY_ORDER_FETCH_HTTP_ERROR', {\n info: 'errors.reviewAndPay.orderFetch.httpError.description',\n showButton: false,\n });\n break;\n }\n })\n );\n\n this.isPNRAlreadyPaid();\n }\n }\n\n private isPNRAlreadyPaid(): void {\n this.subscription.add(\n this.cartOrOrder$.pipe(filter((cartOrOrder) => !!cartOrOrder)).subscribe((order: FinnairOrder) => {\n if (!parseFloat(order.prices.unpaid.total.total.totalAmount.amount)) {\n this.store$.dispatch(PaymentActions.setPaymentStatus({ status: PaymentStatus.VERIFIED }));\n this.store$.dispatch(GlobalBookingActions.paymentVerified());\n\n this.router.navigate([`../${BOOKING_STEPS.PURCHASE_SUCCESS.path}`], {\n relativeTo: this.activatedRoute,\n queryParamsHandling: 'merge',\n queryParams: { reviewAndPayRedirect: true },\n });\n }\n })\n );\n }\n}\n","\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { orderFetchInformation } from '@fcom/common-booking/store';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\n\nimport { navigateToError } from '../../../utils/route-utils';\n\n@Injectable()\nexport class PurchaseSuccessGuard implements CanActivate {\n constructor(\n private router: Router,\n private languageService: LanguageService,\n private store$: Store,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): Observable {\n if (isPlatformServer(this.platform)) {\n return of(true);\n }\n\n return this.store$.pipe(orderFetchInformation()).pipe(\n map((fetchInformation) => {\n const urlContainsOrderId = route.queryParams?.['orderid'] !== undefined;\n const isAllowed = urlContainsOrderId || !!fetchInformation;\n if (!isAllowed) {\n navigateToError(this.router, this.languageService.langValue, 'FORBIDDEN');\n }\n return isAllowed;\n })\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { IconsModule, UiComponentsModule } from '@fcom/ui-components';\nimport { CmsModule } from '@fcom/cms/components';\nimport { ComponentsModule, DirectiveModule, PipesModule } from '@fcom/common';\nimport { QualtricsModule } from '@fcom/common/qualtrics/qualtrics.module';\nimport { OrderApiModule } from '@fcom/dapi/api/order-api.module';\nimport { LocalizationProvider } from '@fcom/core/services/language/localization.provider';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/common-booking.module';\nimport { BookingOrderService, CommonBookingAncillariesModule } from '@fcom/common-booking';\nimport {\n CommonBookingPurchaseSuccessModule,\n PurchaseSuccessService,\n} from '@fcom/common-booking/modules/purchase-success';\nimport { GtmModule } from '@fcom/common/gtm';\nimport { I18nKey } from '@fcom/core';\n\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { PurchaseSuccessComponent } from './components/purchase-success/purchase-success.component';\nimport { BookingPurchaseSuccessRouteComponent } from './routes/booking-purchase-success-route.component';\nimport { PurchaseSuccessGuard } from './services/purchase-success.guard';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n BookingCommonModule,\n CommonBookingComponentsModule,\n CommonBookingAncillariesModule,\n CommonBookingPurchaseSuccessModule,\n CmsModule,\n QualtricsModule,\n PipesModule,\n UiTranslateModule,\n IconsModule,\n OrderApiModule,\n UiComponentsModule,\n DirectiveModule,\n GtmModule,\n ],\n declarations: [BookingPurchaseSuccessRouteComponent, PurchaseSuccessComponent],\n exports: [BookingPurchaseSuccessRouteComponent],\n providers: [BookingOrderService, PurchaseSuccessGuard, PurchaseSuccessService],\n})\nexport class PurchaseSuccessModule {\n constructor(private localizationProvider: LocalizationProvider) {\n // TODO: Should we move the lazy mmb localization to booking localizations, so no need to load mmb here\n this.localizationProvider.triggerLazyLocalizations(I18nKey.MMB);\n }\n}\n","
\n
\n \n \n \n\n \n
\n \n\n \n \n
\n \n {{ (orderData$ | async)?.id }}\n
\n
\n

\n {{ 'purchase.success.emailInfoText' | finLocalization }}:\n

\n

1\" class=\"font-body-1 ps-small-b\">\n {{ 'purchase.success.emailInfoTextMulti' | finLocalization }}:\n

\n
    \n
  • \n {{ email }}\n
  • \n
\n
\n
\n \n \n \n {{ 'purchase.success.ticketDeliveryNote' | finLocalization }}\n \n
\n \n\n \n\n \n \n
\n \n {{ (orderData$ | async)?.id }}\n
\n
\n\n \n

\n {{ 'purchase.success.ticketNotOkDescription' | finLocalization }}\n

\n \n

\n

\n
\n
\n\n \n

\n {{ 'purchase.success.ticketOkNoTravelExtrasDescription' | finLocalization }}\n

\n

\n {{\n ((unconfirmedServices$ | async).length\n ? 'purchase.success.ticketOkTravelExtrasNotOkDescription'\n : 'purchase.success.ticketOkTravelExtrasOkDescription'\n ) | finLocalization\n }}\n

\n
    \n
  • \n {{ email }}\n
  • \n
\n \n \n

\n {{ 'purchase.success.ticketOkTravelExtrasNotOkNotification.title1' | finLocalization }}\n

\n

\n {{ 'purchase.success.ticketOkTravelExtrasNotOkNotification.para1' | finLocalization }}\n

\n

\n {{\n 'purchase.success.ticketOkTravelExtrasNotOkNotification.title2'\n | finLocalization\n : {\n travelExtrasList: (unconfirmedServices | finMap: 'title').join(', '),\n }\n }}\n

\n\n

\n \n\n @if (unconfirmedServices.length) {\n

\n }\n\n @if (!unconfirmedServices.length) {\n

\n }\n
\n \n\n \n \n \n \n\n @if (hasCorporateSeatBenefit$ | async) {\n
\n

\n \n {{ 'purchase.success.corporateSeatBenefitTitle' | finLocalization }}\n

\n
\n {{ 'purchase.success.corporateSeatBenefit' | finLocalization }}\n
\n @if (hasBeenIssuedETickets$ | async) {\n \n }\n @if ((hasBeenIssuedETickets$ | async) === false) {\n \n

\n {{ 'purchase.success.corporateSeatBenefitWaitForTickets' | finLocalization }}\n

\n
\n }\n
\n }\n\n \n \n \n \n {{ 'purchase.success.pointsUsedToPay' | 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 {{ 'serverErrorCodes.loadOrderFailed' | finLocalization }}\n \n \n \n\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { Params, Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, take } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { ElementActions, ElementTypes, GaContext, GtmTripType, LoaderType } from '@fcom/common/interfaces';\nimport { WindowRef } from '@fcom/core/providers/window';\nimport { ConfigService, NativeBridgeService } from '@fcom/core/services';\nimport { IdAndHash } from '@fcom/dapi';\nimport { isPresent, unique, unsubscribe } from '@fcom/core/utils';\nimport { FinnairOrder, FinnairServiceItem, ServiceFlow } from '@fcom/dapi/api/models';\nimport { QualtricsSurvey, QualtricsSurveys } from '@fcom/common/qualtrics/qualtrics.utils';\nimport { OrderStatus } from '@fcom/common-booking/store';\nimport { ButtonMode, ButtonTheme, IconPosition, NotificationLayout, NotificationTheme } from '@fcom/ui-components';\nimport { RootPaths } from '@fcom/core/constants';\nimport { GtmService } from '@fcom/common/gtm';\nimport { getServicesToShow } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { getTripTypeFromBounds } from '@fcom/common/utils/gtm.utils';\n\nimport { GrandTotalTheme } from '../../../common/components/grand-total/grand-total.component';\n\nexport enum PageState {\n LOADING,\n DONE,\n ERROR,\n}\n\n@Component({\n selector: 'fin-purchase-success',\n templateUrl: 'purchase-success.component.html',\n styleUrl: 'purchase-success.component.scss',\n})\nexport class PurchaseSuccessComponent implements OnInit, OnDestroy {\n readonly PageState = PageState;\n readonly LoaderType = LoaderType;\n readonly ServiceFlow = ServiceFlow;\n readonly ElementTypes = ElementTypes;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n readonly ButtonTheme = ButtonTheme;\n readonly ButtonMode = ButtonMode;\n readonly NotificationTheme = NotificationTheme;\n readonly GrandTotalTheme = GrandTotalTheme;\n readonly IconPosition = IconPosition;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly NotificationLayout = NotificationLayout;\n\n @Input()\n orderStatus$: Observable;\n @Input()\n orderData$: Observable;\n @Input()\n orderFetchInformation$: Observable;\n\n showCorporateUpsell$: Observable;\n hasCorporateSeatBenefit$: Observable;\n\n @Output()\n loadOrderErrorClick: EventEmitter = new EventEmitter();\n @Output()\n ctaClick: EventEmitter = new EventEmitter();\n\n surveyInfo$: Observable;\n\n state$: Observable;\n appUrl$: Observable;\n hasBeenIssuedETickets$: Observable;\n unconfirmedServices$: Observable;\n paidIncludedServices$: Observable;\n\n subscriptions: Subscription;\n\n showPoints$: Observable;\n emails$: Observable;\n openSurvey = false;\n enableAppCtaButton = false;\n enableSynchronousTicketingOnConfirmationPage = false;\n\n private removeGlobalListener: () => void;\n\n constructor(\n public nativeBridgeService: NativeBridgeService,\n private windowRef: WindowRef,\n public languageService: LanguageService,\n public router: Router,\n private gtmService: GtmService,\n private configService: ConfigService\n ) {}\n\n ngOnInit(): void {\n this.enableSynchronousTicketingOnConfirmationPage =\n this.configService.cfg.enableSynchronousTicketingOnConfirmationPage;\n this.surveyInfo$ = this.orderData$.pipe(map((od) => this.getSurveyInfo(od)));\n\n this.showPoints$ = this.orderData$.pipe(\n map(\n (order) =>\n order.serviceFlow === ServiceFlow.AWARD ||\n !!(!order.serviceFlow && order.prices?.included?.total?.total?.totalPoints)\n )\n );\n\n this.state$ = combineLatest({\n status: this.orderStatus$,\n order: this.orderData$.pipe(startWith(undefined as FinnairOrder)),\n fetchInfo: this.orderFetchInformation$,\n }).pipe(\n map(({ status, order, fetchInfo }: { status: OrderStatus; order: FinnairOrder; fetchInfo: IdAndHash }) => {\n if (status === OrderStatus.LOAD_ERROR) {\n return PageState.ERROR;\n }\n if (isPresent(order) && isPresent(order.id) && order.id === fetchInfo.id) {\n return PageState.DONE;\n }\n return PageState.LOADING;\n }),\n distinctUntilChanged()\n );\n\n this.hasBeenIssuedETickets$ = this.orderData$.pipe(\n map((orderData) => {\n return orderData.passengers.every((passenger) => passenger.etickets?.length);\n })\n );\n\n this.unconfirmedServices$ = this.orderData$.pipe(\n map((booking) => getServicesToShow(booking.services, 'unconfirmed'))\n );\n this.paidIncludedServices$ = this.orderData$.pipe(\n map((booking) => {\n return getServicesToShow(booking.services, 'included', true);\n })\n );\n\n this.appUrl$ = this.orderData$.pipe(\n filter((data) => isPresent(data) && this.nativeBridgeService.isInsideNativeWebView),\n map((data: FinnairOrder) => {\n return this.nativeBridgeService.urlForAddAJourneyInApp(data.id, data.passengers[0].lastName);\n })\n );\n\n this.subscriptions = this.orderData$.pipe(filter((data) => isPresent(data))).subscribe((data: FinnairOrder) => {\n if (this.nativeBridgeService.isInsideNativeWebView) {\n this.nativeBridgeService.addBooking({\n recloc: data.id,\n travelers: data.passengers,\n rawBooking: data,\n });\n }\n });\n\n this.emails$ = this.orderData$.pipe(\n map((orderData) => {\n return orderData.passengers\n .map((passenger) => {\n return passenger.email;\n })\n .filter((email) => Boolean(email))\n .map((email) => email.toLowerCase())\n .filter(unique);\n })\n );\n\n this.showCorporateUpsell$ = this.orderData$.pipe(\n map(\n (orderData: FinnairOrder) =>\n this.configService.cfg.corporatePredict &&\n orderData.serviceFlow === ServiceFlow.BOOKING &&\n orderData.otherInformation.predictions?.corporateProbability > 0.6 &&\n orderData.otherInformation.predictions?.corporateProbability <= 1.0\n )\n );\n\n this.hasCorporateSeatBenefit$ = this.orderData$.pipe(\n map(\n (orderData: FinnairOrder) =>\n this.configService.cfg.enableCorporateSeatBenefit &&\n orderData.otherInformation?.corporateUserInformation?.isEligibleForSeatBenefit\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n\n if (this.removeGlobalListener) {\n this.removeGlobalListener();\n }\n }\n\n openInApp(appUrl: string): void {\n this.windowRef.nativeWindow.open(appUrl);\n }\n\n openModal(event: Event): void {\n event.stopPropagation();\n\n this.openSurvey = true;\n }\n\n goToHomePage(): void {\n this.router.navigate([this.languageService.langValue]);\n this.gtmService.trackElement('home-button', this.TRACKING_CONTEXT, ElementTypes.BUTTON, '', ElementActions.CLICK);\n }\n\n goToMMB(extraParams?: Params): void {\n this.subscriptions.add(\n this.orderData$.pipe(take(1)).subscribe((order) => {\n const queryParams = {\n recLoc: order.id,\n lastName: order.passengers[0].lastName,\n ...extraParams,\n };\n const urlTree = this.router.createUrlTree(\n [`${this.languageService.langValue}/${RootPaths.MANAGE_BOOKING_ROOT}`],\n { queryParams }\n );\n const url = this.router.serializeUrl(urlTree);\n this.router.navigateByUrl(url);\n\n this.gtmService.trackElement(\n 'mmb-button',\n this.TRACKING_CONTEXT,\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n })\n );\n }\n\n openCorporateSeatBenefit(): void {\n this.goToMMB({ seatMap: true });\n }\n\n private getSurveyInfo(orderData: FinnairOrder): QualtricsSurvey {\n if (getTripTypeFromBounds(orderData.bounds) == GtmTripType.MULTICITY) {\n return QualtricsSurveys.CONFIRMATION_MULTI_CITY;\n }\n\n return orderData.serviceFlow === ServiceFlow.AWARD\n ? QualtricsSurveys.AWARD_FEEDBACK\n : QualtricsSurveys.PURCHASE_FEEDBACK;\n }\n}\n","import { Component, OnInit, HostBinding, OnDestroy, Inject, HostListener } from '@angular/core';\nimport { Router, ActivatedRoute, ParamMap } from '@angular/router';\nimport { DOCUMENT, Location } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { FinnairOrder } from '@fcom/dapi/api/models';\nimport { snapshot } from '@fcom/rx';\nimport { IdAndHash } from '@fcom/dapi';\nimport { OrderStatus, orderData, orderStatus, orderFetchInformation, OrderActions } from '@fcom/common-booking/store';\nimport { BookingOrderService } from '@fcom/common-booking';\nimport { PurchaseSuccessService } from '@fcom/common-booking/modules/purchase-success';\nimport { pathSegmentsToPathString } from '@fcom/core/utils/app-url-utils';\nimport { ElementActions, ElementTypes, GaContext, UserAgentService } from '@fcom/common/index';\nimport { GtmService } from '@fcom/common/gtm';\nimport { ConfigService } from '@fcom/core/index';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\n\n@Component({\n selector: 'fin-booking-purchase-success-route',\n templateUrl: './booking-purchase-success-route.component.html',\n})\nexport class BookingPurchaseSuccessRouteComponent implements OnInit, OnDestroy {\n @HostBinding('class') classAttribute = 'grid-col-12 pr-clear';\n @HostListener('window:beforeinstallprompt') onBeforeInstallPrompt(): void {\n if (!this.userAgentService.isAndroid()) {\n return;\n }\n\n this.gtmService.trackElement(\n 'confirmation-page_android_prompt_show',\n GaContext.BOOKING_FLOW,\n ElementTypes.BANNER,\n undefined,\n ElementActions.VIEW\n );\n }\n\n @HostListener('window:appinstalled') onAppInstalled(): void {\n if (!this.userAgentService.isAndroid()) {\n return;\n }\n\n this.gtmService.trackElement(\n 'confirmation-page_android_prompt_install',\n GaContext.BOOKING_FLOW,\n ElementTypes.BANNER,\n undefined,\n ElementActions.CLICK\n );\n }\n\n readonly orderData$: Observable;\n readonly orderStatus$: Observable;\n readonly orderFetchInformation$: Observable;\n\n constructor(\n private store$: Store,\n private bookingOrderService: BookingOrderService,\n private router: Router,\n private languageService: LanguageService,\n private activatedRoute: ActivatedRoute,\n private purchaseSuccessService: PurchaseSuccessService,\n private locationService: Location,\n private gtmService: GtmService,\n private configService: ConfigService,\n private userAgentService: UserAgentService,\n @Inject(DOCUMENT) private document: Document\n ) {\n this.orderData$ = this.store$.pipe(\n orderData(),\n filter((v) => !!v)\n );\n this.orderStatus$ = this.store$.pipe(orderStatus());\n this.orderFetchInformation$ = this.store$.pipe(\n orderFetchInformation(),\n filter((v) => !!v)\n );\n }\n\n ngOnInit(): void {\n const paramMap: ParamMap = this.activatedRoute.snapshot.queryParamMap;\n if (this.purchaseSuccessService.hasOrderQueryParams(paramMap)) {\n this.store$.dispatch(\n OrderActions.setOrderFetchInformation({\n orderInformation: {\n id: paramMap.get(this.purchaseSuccessService.PARAM_ORDER_ID),\n hash: paramMap.get(this.purchaseSuccessService.PARAM_HASH),\n },\n })\n );\n }\n\n if (this.userAgentService.isAndroid()) {\n this.addAppInstallPromptAndroid();\n } else if (this.userAgentService.isIos()) {\n this.addAppInstallPromptIos();\n }\n\n const order: FinnairOrder = snapshot(this.store$.pipe(orderData()));\n const status: OrderStatus = snapshot(this.store$.pipe(orderStatus()));\n const fetchInformation: IdAndHash = snapshot(this.store$.pipe(orderFetchInformation()));\n\n if (this.purchaseSuccessService.orderHasToBeRefetched(order, status, fetchInformation, paramMap)) {\n this.fetchOrder();\n }\n\n // Remove sensitive param from history and browser url\n this.locationService.replaceState(pathSegmentsToPathString(this.activatedRoute.snapshot.pathFromRoot));\n }\n\n ngOnDestroy(): void {\n this.removeAppInstallPrompts();\n }\n\n fetchOrder(): void {\n this.bookingOrderService.queueOrderLoad(false, true);\n }\n\n navigateToFrontPage(): void {\n this.router.navigateByUrl(`/${this.languageService.langValue}`);\n }\n\n addAppInstallPromptIos(): void {\n const appName = this.configService.cfg.appName;\n const appId = this.configService.cfg.appIdIos;\n const head = this.document.querySelector('head');\n const metaTag = this.document.createElement('meta');\n\n metaTag.setAttribute('data-test', 'install-prompt-ios');\n metaTag.setAttribute('name', appName);\n metaTag.setAttribute('content', `app-id=${appId}`);\n head.insertBefore(metaTag, head.firstChild);\n }\n\n addAppInstallPromptAndroid(): void {\n const manifestPath = this.configService.cfg.manifestPathAndroid;\n const head = this.document.querySelector('head');\n const linkTag = this.document.createElement('link');\n\n linkTag.setAttribute('data-test', 'install-prompt-android');\n linkTag.setAttribute('rel', 'manifest');\n linkTag.setAttribute('crossorigin', 'use-credentials');\n linkTag.setAttribute('href', manifestPath);\n head.insertBefore(linkTag, head.firstChild);\n }\n\n removeAppInstallPrompts(): void {\n this.document\n .querySelectorAll('[data-test=\"install-prompt-ios\"], [data-test=\"install-prompt-android\"]')\n .forEach((e) => e.remove());\n }\n}\n","\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer, Location } from '@angular/common';\nimport { ActivatedRouteSnapshot, CanActivate, Params, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\n\nimport { isNull, LocalDate } from '@fcom/core/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { SentryLogger, GlobalBookingTravelClass, ConfigService } from '@fcom/core';\nimport { Cabin } from '@fcom/dapi/api/models';\nimport { FinnairMultiCitySearchInterface } from '@fcom/common/interfaces';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\n\nimport { BookingService } from '../../../services';\nimport { UTM_PARAMS } from '../../../../core/constants';\n\nconst PROMO_CODE_REGEXP = /^[A-Z0-9\\-_]{2,15}$/;\n\nconst validate = {\n flights: (flights: unknown, isMultiCityEnabled: boolean): true | string => {\n const maxBounds = isMultiCityEnabled ? 6 : 2;\n\n if (!flights || !Array.isArray(flights) || flights.length === 0 || flights.length > maxBounds) {\n return 'flights invalid';\n }\n\n const flightsAreValid = flights\n .map((flightSearch, i) => {\n if (!validate.locationCode(flightSearch.origin)) {\n return `flight ${i} origin invalid`;\n }\n\n if (!validate.locationCode(flightSearch.destination)) {\n return `flight ${i} destination invalid`;\n }\n\n if (!validate.date(flightSearch.departureDate)) {\n return `flight ${i} departureDate invalid`;\n }\n\n if (i === 0 && new LocalDate(flightSearch.departureDate).lt(LocalDate.now())) {\n return `flight ${i} departureDate is in the past invalid`;\n }\n\n if (i === 1 && new LocalDate(flightSearch.departureDate).lt(new LocalDate(flights[0].departureDate))) {\n return `flight ${i} departureDate is earlier that the outbound departureDate`;\n }\n\n if (!validate.fareFamily(flightSearch.fareFamily)) {\n return `flight ${i} fareFamily invalid`;\n }\n\n if (!validate.flightNumbers(flightSearch.flightNumbers)) {\n return `flight ${i} flightNumbers invalid`;\n }\n\n return true;\n })\n .find((validated) => typeof validated === 'string');\n\n if (typeof flightsAreValid === 'string') {\n return flightsAreValid;\n }\n\n return true;\n },\n locationCode: (code: unknown): boolean => {\n return typeof code === 'string' && code.length === 3;\n },\n date: (date: unknown): boolean => {\n return typeof date === 'string' && LocalDate.isLocalDate(date);\n },\n fareFamily: (fareFamily: unknown): boolean => {\n if (typeof fareFamily === 'undefined') {\n return true;\n }\n\n return typeof fareFamily === 'string' && fareFamily.length < 20;\n },\n flightNumbers: (flightNumbers: unknown): boolean => {\n if (typeof flightNumbers === 'undefined') {\n return true;\n }\n\n if (!Array.isArray(flightNumbers) || flightNumbers.length > 9) {\n return false;\n }\n\n return Boolean(\n flightNumbers\n .map((flightNumber: unknown) => {\n return typeof flightNumber === 'string' && flightNumber.length < 10;\n })\n .filter(Boolean).length\n );\n },\n cabin: (cabin: unknown): true | string => {\n const isValid =\n typeof cabin === 'string' &&\n Object.keys(GlobalBookingTravelClass)\n .map((k) => GlobalBookingTravelClass[k])\n .indexOf(cabin) !== -1;\n\n return isValid || `cabin ${cabin} invalid`;\n },\n paxAmount: (search: FinnairMultiCitySearchInterface): true | string => {\n // Check that all the different paxTypes are either undefined or numerical <= 9\n const basicCheck = ['adults', 'children', 'infants', 'c15s', 'b15s'].map((paxType) => {\n const amount: unknown = search[paxType];\n const isOk = typeof amount === 'undefined' || (typeof amount === 'number' && amount <= 9);\n\n return isOk || `pax type ${paxType} with value ${amount} invalid`;\n });\n const firstFail = basicCheck.find((check) => typeof check === 'string');\n\n if (firstFail) {\n return firstFail;\n }\n\n if (search.adults < 1) {\n return 'no adults check invalid';\n }\n\n if (search.children || search.c15s) {\n if (search.children + search.c15s >= 0 && search.children + search.c15s > 9 - search.adults) {\n return `more children+c15s (${search.children + search.c15s}) than adults (${search.adults}) check invalid`;\n }\n }\n\n if (search.infants) {\n if (search.infants > search.adults) {\n return `more infants (${search.infants}) than adults (${search.adults}) check invalid`;\n }\n }\n\n return true;\n },\n directFlights: (directFlights: unknown): true | string => {\n const isValid = typeof directFlights === 'undefined' || typeof directFlights === 'boolean';\n\n return isValid || 'directFlights not a boolean';\n },\n isAward: (isAward: unknown): true | string => {\n const isValid = typeof isAward === 'undefined' || isNull(isAward) || typeof isAward === 'boolean';\n\n return isValid || 'isAward not a boolean';\n },\n promoCode: (promoCode: unknown): true | string => {\n const isValid =\n typeof promoCode === 'undefined' || (typeof promoCode === 'string' && PROMO_CODE_REGEXP.test(promoCode));\n\n return isValid || `promoCode is invalid: ${promoCode}`;\n },\n};\n\nconst getQueryParameters = (route: ActivatedRouteSnapshot): FinnairMultiCitySearchInterface => {\n const params = JSON.parse(decodeURIComponent(route.queryParams.json));\n\n return {\n cabin: Cabin.MIXED,\n ...params,\n };\n};\n\n@Injectable()\nexport class TicketSelectionGuard implements CanActivate {\n constructor(\n private bookingService: BookingService,\n private router: Router,\n private languageService: LanguageService,\n private sentryLogger: SentryLogger,\n private configService: ConfigService,\n private location: Location,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n isOldDeeplinkFormat(queryParams: Params): boolean {\n return Boolean(queryParams.origin && queryParams.destination);\n }\n\n redirectToJsonDeeplink({ queryParams }: { queryParams: Params }): UrlTree | boolean {\n try {\n const search: FinnairMultiCitySearchInterface = {\n flights: [],\n };\n\n search.flights.push({\n origin: queryParams.origin,\n destination: queryParams.destination,\n departureDate: queryParams.departureDate,\n });\n\n if (queryParams.departureFlightNumbers) {\n search.flights[0].flightNumbers = queryParams.departureFlightNumbers.split(',');\n }\n\n if (queryParams.departureFareFamily) {\n search.flights[0].fareFamily = queryParams.departureFareFamily;\n }\n\n if (queryParams.returnDate) {\n search.flights.push({\n origin: queryParams.destination,\n destination: queryParams.origin,\n departureDate: queryParams.returnDate,\n });\n }\n\n if (queryParams.returnFlightNumbers) {\n search.flights[1].flightNumbers = queryParams.returnFlightNumbers.split(',');\n }\n\n if (queryParams.returnFareFamily) {\n search.flights[1].fareFamily = queryParams.returnFareFamily;\n }\n\n ['adults', 'b15s', 'c15s', 'children', 'infants'].forEach((paxType) => {\n if (queryParams[paxType]) {\n search[paxType] = Number(queryParams[paxType]);\n }\n });\n\n if (queryParams.cabin) {\n search.cabin = queryParams.cabin;\n }\n\n if (queryParams.directFlights) {\n search.directFlights = queryParams.directFlights === 'true';\n }\n\n if (queryParams.isAward) {\n search.isAward = queryParams.isAward === 'true';\n }\n\n if (queryParams.promoCode) {\n search.promoCode = queryParams.promoCode;\n }\n\n const urlTree = this.router.createUrlTree(\n [this.languageService.langValue, 'booking', BOOKING_STEPS.FLIGHT_SELECTION.path],\n {\n queryParams: {\n json: JSON.stringify(search),\n ...this.filterUtmParams(queryParams),\n },\n }\n );\n\n // We want to replace the history with the json url to avoid quaryParams issues\n // when the user would press the browser's the back button etc.\n const jsonUrl = this.router.serializeUrl(urlTree);\n this.location.replaceState(jsonUrl);\n\n return urlTree;\n } catch (e) {\n this.sentryLogger.error('Error converting to JSON deeplink format', {\n error: queryParams,\n });\n return false;\n }\n }\n\n filterUtmParams(queryParams: Params): Params {\n return Object.keys(queryParams)\n .filter((key) => UTM_PARAMS.includes(key))\n .reduce(\n (params, key) => ({\n ...params,\n [key]: queryParams[key],\n }),\n {}\n );\n }\n\n validateDeeplink(search: FinnairMultiCitySearchInterface): boolean {\n const validations = [];\n\n validations.push(validate.flights(search.flights, this.configService.cfg.enableMultiCity));\n validations.push(validate.cabin(search.cabin));\n validations.push(validate.paxAmount(search));\n validations.push(validate.directFlights(search.directFlights));\n validations.push(validate.isAward(search.isAward));\n validations.push(validate.promoCode(search.promoCode));\n\n const passesValidation = validations.length === validations.filter((validation) => validation === true).length;\n /**\n * Specifically ignore this departureDate case because it happens a lot from customers reusing old links, and this check is\n * not a valid sentry issue for us to investigate.\n */\n if (!passesValidation && !validations.includes('flight 0 departureDate is in the past invalid')) {\n this.sentryLogger.info('validation failed for deeplink', {\n search,\n validations: validations.filter((validation) => typeof validation === 'string'),\n });\n }\n\n return passesValidation;\n }\n\n hasJSONDeeplink(route: ActivatedRouteSnapshot): boolean {\n return Boolean(route.queryParams.json);\n }\n\n canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean | UrlTree {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n if (this.isOldDeeplinkFormat(route.queryParams)) {\n return this.redirectToJsonDeeplink(route);\n }\n\n try {\n /**\n * Avoid trying to process if there is no deeplink. This also avoids any extra sentry alerts\n * for this quite common case (logout from pax details page is one situation).\n **/\n if (!this.hasJSONDeeplink(route)) {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n return false;\n }\n\n const search = getQueryParameters(route);\n const canAccess = this.validateDeeplink(search);\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n return true;\n } catch (e) {\n this.sentryLogger.error('Uncaught error reading and validating deeplink', {\n error: route.queryParams,\n });\n return false;\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { FinnairBoundFareFamily } from '@fcom/dapi/api/models';\n\n@Injectable()\nexport class DimensionsAndDetailsModalService {\n get showDimensionsAndDetailsObservable$(): Observable {\n return this.showDimensionsAndDetails$;\n }\n\n get showAllDimensionsAndDetailsObservable$(): Observable {\n return this.showAllDimensionsAndDetails$;\n }\n\n private showDimensionsAndDetails$: BehaviorSubject =\n new BehaviorSubject(undefined);\n private showAllDimensionsAndDetails$: BehaviorSubject = new BehaviorSubject(false);\n\n opedDimensionsAndDetails(bound: FinnairBoundFareFamily): void {\n this.showDimensionsAndDetails$.next(bound);\n }\n\n opedAllDimensionsAndDetails(): void {\n this.showAllDimensionsAndDetails$.next(true);\n }\n\n closeModal(): void {\n this.showDimensionsAndDetails$.next(undefined);\n this.showAllDimensionsAndDetails$.next(false);\n }\n}\n","\n \n {{ 'bookingSearch.errors.fetchFailed' | finLocalization }}\n \n\n \n {{ 'bookingSearch.errors.noFlightsFound' | finLocalization }}\n \n\n \n {{ 'bookingSearch.errors.invalidInput' | 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 {{ 'price.continueButtonTotal' | finLocalization }}: \n \n {{ 'award.points' | finLocalization: { pointsAmount: points || 0 | finPoints } }} + \n {{\n selectedOfferPrice$ | async | finPrice | finEmpty: '–'\n }}\n\n\n\n \n \n\n\n\n \n \n\n\n\n
\n \n
\n\n","import { Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport { delay, distinctUntilChanged, filter, map, startWith, switchMap, take, withLatestFrom } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\n\nimport { ButtonPosition, ModalButtons, NotificationTheme, TabLayoutType } from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n GtmEvent,\n LoaderType,\n MediaQueryService,\n ScrollService,\n ToasterService,\n} from '@fcom/common';\nimport { GtmService } from '@fcom/common/gtm/services/gtm.service';\nimport { Amount, BoundType, CheapestBoundPrice, LocationInfoMap, PaxAmount } from '@fcom/dapi';\nimport { finShare, safeMap, snapshot } from '@fcom/rx';\nimport { isPresent, LocalDate, mapValues, stopPropagation, unique, unsubscribe } from '@fcom/core/utils';\nimport {\n Bound,\n FareFamily,\n FareInformation,\n FinnairBoundItem,\n FinnairCabinClass,\n ItineraryItemFlight,\n ItineraryItemLayover,\n Offer,\n OfferList,\n} from '@fcom/dapi/api/models';\nimport { Profile } from '@fcom/core-api/login';\nimport { profile } from '@fcom/core/selectors';\nimport { DimensionsAndDetails, SortBy } from '@fcom/common-booking';\nimport { globalBookingFlights, globalBookingPaxAmount } from '@fcom/common/store';\nimport { compareAsJson, GlobalBookingTravelClass } from '@fcom/core/index';\nimport { FAKE_LOAD_TIME } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport {\n AirOffersStatus,\n BookingAppState,\n BoundInfoWithFareFamilies,\n BoundInfoWithFareFamiliesMap,\n FareFamilyMap,\n QuotasPerBound,\n SelectionPhase,\n BoundWithLocations,\n} from '@fcom/common/interfaces/booking';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { getCabinClassesForAwardBounds } from '@fcom/common-booking/utils/bound.utils';\nimport { BookingWidgetService } from '@fcom/booking-widget/services/booking-widget.service';\n\nimport { OffersActions } from '../../../store/actions';\nimport {\n boundSelectionsDone,\n currentFareFamilies,\n currentOffer,\n currentOffers,\n filteredCurrentOffersInbound,\n filteredCurrentOffersOutbound,\n flightSelectionGtmDataForOffers,\n hasZeroBaggageOnEitherFlight,\n isOneWayOffers,\n offersCurrency,\n offersDepartureDate,\n offersHash,\n offersReturnDate,\n offersStatus,\n quotasForBounds,\n selectedInboundFareFamilyCode,\n selectedInboundId,\n selectedOutboundFareFamilyCode,\n selectedOutboundId,\n selectedTicketSortBy,\n} from '../../../store/selectors';\nimport { BookingQueueService, BookingService } from '../../../services';\nimport { CountryCode } from '../../../utils';\nimport { containsOnlyOneCabin, getBoundFareFamilies } from '../utils/offer.utils';\nimport { LocationNames, ItineraryDetails } from '../interfaces';\n\nexport const offerListSortMap: { [id: string]: string } = Object.freeze({\n [SortBy.DURATION]: 'default',\n [SortBy.PRICE]: 'price',\n [SortBy.ARRIVAL]: 'arrivalTime',\n [SortBy.DEPARTURE]: 'departureTime',\n});\n\ninterface ItineraryModalState {\n open: boolean;\n data: BoundInfos;\n}\n\ninterface ContinueModalState {\n open: boolean;\n data: ContinueModalData;\n}\n\ntype BoundInfos = { outbound?: BoundInfoWithFareFamilies; inbound?: BoundInfoWithFareFamilies };\n\ntype ContinueModalData = {\n /**\n * Whether to show the zeroBaggage warning for the ticket type\n */\n zeroBaggage: boolean;\n};\n\ninterface BenefitsModalState {\n open: boolean;\n data: DimensionsAndDetails;\n}\n\nconst EMPTY_AMOUNT: Amount = { amount: undefined, currencyCode: 'EUR' };\n\nconst boundWithDetails = (offers: OfferList, bound: Bound): BoundWithLocations | undefined => {\n if (!bound) {\n return;\n }\n\n return {\n ...bound,\n departure: {\n ...bound.departure,\n cityName: offers.locations[bound.departure.locationCode]?.cityName,\n name: offers.locations[bound.departure.locationCode]?.name,\n },\n arrival: {\n ...bound.arrival,\n cityName: offers.locations[bound.arrival.locationCode]?.cityName,\n name: offers.locations[bound.arrival.locationCode]?.name,\n },\n };\n};\n\nconst itineraryWithDetails = (\n boundFareInformation: FareInformation[],\n itinerary: (ItineraryItemFlight | ItineraryItemLayover)[],\n locations: LocationInfoMap\n): ItineraryDetails[] => {\n return itinerary.filter(isFlight).map((flight: ItineraryItemFlight) => {\n const matchingSegment = boundFareInformation?.find((segment) => segment.segmentId === flight?.id);\n\n return {\n ...flight,\n cabinClass: matchingSegment?.cabinClass,\n bookingClass: matchingSegment?.bookingClass,\n departure: {\n ...flight.departure,\n cityName: locations[flight.departure.locationCode]?.cityName,\n },\n arrival: {\n ...flight.arrival,\n cityName: locations[flight.arrival.locationCode]?.cityName,\n },\n };\n });\n};\n\n@Component({\n selector: 'fin-booking-ticket-selection-view',\n templateUrl: './booking-ticket-selection-view.component.html',\n styleUrls: ['./booking-ticket-selection-view.component.scss'],\n})\nexport class BookingTicketSelectionViewComponent implements OnInit, OnDestroy {\n public readonly profile$: Observable;\n\n public readonly AirOffersStatus = AirOffersStatus;\n public readonly BoundType = BoundType;\n public readonly SelectionPhase = SelectionPhase;\n public readonly ModalButtons = ModalButtons;\n public readonly LoaderType = LoaderType;\n public readonly ButtonPosition = ButtonPosition;\n public readonly TabLayoutType = TabLayoutType;\n\n public readonly offers$: Observable;\n public readonly outbounds$: Observable;\n public readonly inbounds$: Observable;\n public readonly currencyCode$: Observable;\n public readonly offersStatus$: Observable;\n public readonly departureDate$: Observable;\n public readonly returnDate$: Observable;\n public readonly isOneWayOffers$: Observable;\n public readonly fareFamilies$: Observable;\n public readonly selectedOutbound$: Observable;\n public readonly selectedInbound$: Observable;\n public readonly selectedOutboundFareFamilyCode$: Observable;\n public readonly selectedInboundFareFamilyCode$: Observable;\n public readonly selectedOutboundFareFamilyBenefits$: Observable;\n public readonly selectedInboundFareFamilyBenefits$: Observable;\n public readonly selectedOffer$: Observable;\n public readonly selectedOutboundOfferItinerary$: Observable;\n public readonly selectedInboundOfferItinerary$: Observable;\n public readonly quotas$: Observable;\n public readonly paxAmount$: Observable;\n\n public readonly enabledOutboundIds$: Observable;\n public readonly enabledInboundIds$: Observable;\n\n public readonly cheapestCombinableOutboundPrices$: Observable;\n public readonly cheapestCombinableInboundPrices$: Observable;\n\n /**\n * Whether or not the bounds have been selected (both for two-way and the outbound for one-way trips.)\n */\n public readonly boundsSelected$: Observable;\n public readonly selectableOffers$: Observable;\n public readonly selectedOfferPrice$: Observable;\n public readonly selectedOfferPoints$: Observable;\n\n public readonly locations$: Observable;\n\n public readonly showKoreaNotification$: Observable;\n public readonly isMobile$: Observable;\n\n // == SELECTION PHASE ==\n public readonly selectionPhase$: BehaviorSubject = new BehaviorSubject(\n SelectionPhase.OUTBOUND\n );\n continueEnabled$: Observable;\n continueButtonClicks$: Subject = new Subject();\n continueButtonId$: Observable;\n\n // == SORTING ==\n public readonly selectedSortBy$: Observable;\n public readonly inboundIdSortOrder$: Observable;\n public readonly outboundIdSortOrder$: Observable;\n\n @Input()\n goToOutboundPhase$: Observable;\n\n @Output()\n refetchOffers: EventEmitter = new EventEmitter();\n\n @Output()\n selectionPhaseChange: EventEmitter = new EventEmitter();\n\n itineraryModal: ItineraryModalState = {\n open: false,\n data: {},\n };\n\n continueModal: ContinueModalState = {\n open: false,\n data: null,\n };\n\n benefitsModal: BenefitsModalState = {\n open: false,\n data: null,\n };\n\n availableCabinClasses$: Observable;\n\n private openBoundClick$ = new Subject<{ bound: BoundInfoWithFareFamilies; boundType: BoundType }>();\n private subscription = new Subscription();\n\n isLoading$: BehaviorSubject = new BehaviorSubject(null);\n selectedSortCriteria$ = of(SortBy.PRICE);\n filteredOffersOutbound$: Observable;\n filteredOfferInbound$: Observable;\n outboundSorting$: Observable<{ [key: string]: string[] }>;\n inboundSorting$: Observable<{ [key: string]: string[] }>;\n showOutboundFilters$: Observable;\n showInboundFilters$: Observable;\n activeCabinClassNotificationIds: string[] = [];\n tripLocations$: Observable;\n\n constructor(\n private bookingQueueService: BookingQueueService,\n private languageService: LanguageService,\n private store$: Store,\n private gtmService: GtmService,\n private bookingService: BookingService,\n private scrollService: ScrollService,\n private mediaQueryService: MediaQueryService,\n private toasterService: ToasterService,\n private bookingWidgetService: BookingWidgetService,\n @Inject(PLATFORM_ID) private platform: object\n ) {\n this.offers$ = this.store$.pipe(currentOffers());\n this.filteredOffersOutbound$ = this.store$.pipe(filteredCurrentOffersOutbound());\n this.filteredOfferInbound$ = this.store$.pipe(filteredCurrentOffersInbound());\n this.showKoreaNotification$ = this.offers$.pipe(\n map((offerList: OfferList) => {\n const location = offerList.locations[offerList.finnairSearchParameters?.itinerary[0].departureLocationCode];\n return location && location.countryCode === CountryCode.KOREA;\n }),\n finShare()\n );\n this.currencyCode$ = this.store$.pipe(offersCurrency());\n this.offersStatus$ = this.store$.pipe(offersStatus());\n this.isOneWayOffers$ = this.store$.pipe(isOneWayOffers());\n this.departureDate$ = this.store$.pipe(offersDepartureDate());\n this.returnDate$ = this.store$.pipe(offersReturnDate());\n this.fareFamilies$ = this.store$.pipe(currentFareFamilies());\n this.quotas$ = this.store$.pipe(quotasForBounds());\n\n this.showOutboundFilters$ = this.offers$.pipe(\n filter(Boolean),\n map((bounds) => Object.keys(bounds.outbounds).length > 3),\n finShare()\n );\n this.showInboundFilters$ = this.offers$.pipe(\n filter(Boolean),\n map((bounds) => Object.keys(bounds.inbounds).length > 3),\n finShare()\n );\n\n this.selectedOutbound$ = combineLatest([this.filteredOffersOutbound$, this.store$.pipe(selectedOutboundId())]).pipe(\n map(([offers, boundId]) => boundWithDetails(offers, offers.outbounds[boundId])),\n finShare()\n );\n this.selectedInbound$ = combineLatest([\n this.filteredOfferInbound$.pipe(filter((offers) => offers.finnairSearchParameters?.itinerary.length !== 1)),\n this.store$.pipe(selectedInboundId()),\n ]).pipe(\n map(([offers, boundId]: [OfferList, string]) => boundWithDetails(offers, offers.inbounds[boundId])),\n finShare()\n );\n this.selectedOutboundFareFamilyCode$ = this.store$.pipe(selectedOutboundFareFamilyCode());\n this.selectedInboundFareFamilyCode$ = this.store$.pipe(selectedInboundFareFamilyCode());\n this.selectedOutboundFareFamilyBenefits$ = combineLatest([\n this.selectedOutboundFareFamilyCode$,\n this.fareFamilies$,\n ]).pipe(map(([fareFamilyCode, fareFamilies]) => fareFamilies?.[fareFamilyCode]));\n this.selectedInboundFareFamilyBenefits$ = combineLatest([\n this.selectedInboundFareFamilyCode$,\n this.fareFamilies$,\n ]).pipe(map(([fareFamilyCode, fareFamilies]) => fareFamilies?.[fareFamilyCode]));\n\n this.outbounds$ = this.filteredOffersOutbound$.pipe(\n map((offers) => {\n return mapValues(offers.outbounds, (bound, boundId) => {\n const outboundOffers = offers.offers.filter((o) => o.outboundId === boundId);\n const uniqueBoundFareFamilyCodes = outboundOffers.map((a) => a.outboundFareFamily).filter(unique);\n const fareFamilies = Object.values(offers.fareFamilies).filter((ff) =>\n uniqueBoundFareFamilyCodes.includes(ff.fareFamilyCode)\n );\n\n return {\n ...bound,\n fareFamilies: getBoundFareFamilies(fareFamilies, outboundOffers, bound, 'outbound'),\n };\n });\n }),\n finShare()\n );\n this.inbounds$ = combineLatest([\n this.filteredOfferInbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n ]).pipe(\n map(([offers, outbound, selectedOutboundFareFamilyCode]) => {\n return 'inbounds' in offers\n ? mapValues(offers.inbounds, (bound, boundId) => {\n const inboundOffers = offers.offers.filter(\n (o) =>\n o.inboundId === boundId &&\n o.outboundId === outbound?.boundId &&\n o.outboundFareFamily === selectedOutboundFareFamilyCode\n );\n const uniqueBoundFareFamilyCodes = inboundOffers.map((a) => a.inboundFareFamily).filter(unique);\n const fareFamilies = Object.values(offers.fareFamilies).filter((ff) =>\n uniqueBoundFareFamilyCodes.includes(ff.fareFamilyCode)\n );\n return {\n ...bound,\n fareFamilies: getBoundFareFamilies(fareFamilies, inboundOffers, bound, 'inbound'),\n };\n })\n : {};\n }),\n finShare()\n );\n\n this.boundsSelected$ = this.store$.pipe(boundSelectionsDone());\n\n // == SELECTABLE OFFERS & BOUNDS ==\n type OffersAndType = { offers: Offer[]; oneWay: boolean };\n const offersAndType$: Observable = combineLatest([\n this.offers$.pipe(map((list: OfferList): Offer[] => list.offers)),\n this.isOneWayOffers$,\n ]).pipe(\n map(([offers, oneWay]: [Offer[], boolean]) => ({ offers, oneWay })),\n finShare()\n );\n const outboundId$: Observable = this.selectedOutbound$.pipe(\n map((info) => (info || ({} as BoundInfoWithFareFamilies)).boundId),\n startWith(undefined as string)\n );\n const inboundId$: Observable = this.selectedInbound$.pipe(\n map((info) => (info || ({} as BoundInfoWithFareFamilies)).boundId),\n startWith(undefined as string)\n );\n const byOutboundIdIfPresent =\n (id: string): ((o: Offer) => boolean) =>\n (o) =>\n !id || o.outboundId === id;\n const byInboundIdIfPresent =\n (id: string): ((o: Offer) => boolean) =>\n (o) =>\n !id || o.inboundId === id;\n const boundPrice = (boundId: string, price: string): CheapestBoundPrice => {\n return { boundId, cheapestPrice: price };\n };\n const cheapestPrice = (boundId: string, prices: CheapestBoundPrice[]): CheapestBoundPrice =>\n boundPrice(\n boundId,\n String(Math.min(...prices.filter((p) => p.boundId === boundId).map((p) => Number(p.cheapestPrice))))\n );\n\n this.selectableOffers$ = combineLatest({\n offersAndType: offersAndType$,\n outbound: outboundId$,\n inbound: inboundId$,\n }).pipe(\n map(({ offersAndType: { offers, oneWay }, outbound, inbound }) =>\n offers.filter(byInboundIdIfPresent(!oneWay && inbound)).filter(byOutboundIdIfPresent(outbound))\n ),\n finShare()\n );\n\n this.enabledOutboundIds$ = combineLatest([offersAndType$, inboundId$]).pipe(\n map(([{ offers, oneWay }, inbound]: [OffersAndType, string]): string[] =>\n offers\n .filter(byInboundIdIfPresent(!oneWay && inbound))\n .map((o) => o.outboundId)\n .filter(unique)\n ),\n finShare()\n );\n this.enabledInboundIds$ = combineLatest([offersAndType$, outboundId$]).pipe(\n map(([{ offers }, outbound]: [OffersAndType, string]): string[] =>\n offers\n .filter(byOutboundIdIfPresent(outbound))\n .map((o) => o.inboundId)\n .filter(unique)\n ),\n finShare()\n );\n\n this.cheapestCombinableOutboundPrices$ = combineLatest([offersAndType$, inboundId$]).pipe(\n map(([{ offers, oneWay }, inbound]: [OffersAndType, string]): CheapestBoundPrice[] => {\n const combinableOffers = offers.filter(byInboundIdIfPresent(!oneWay && inbound));\n const outboundIds = combinableOffers.map((offer) => offer.outboundId).filter(unique);\n const prices = combinableOffers.map((offer) => boundPrice(offer.outboundId, offer.outboundPrice));\n return outboundIds.map((outboundId) => cheapestPrice(outboundId, prices));\n }),\n finShare()\n );\n this.cheapestCombinableInboundPrices$ = combineLatest([offersAndType$, outboundId$]).pipe(\n map(([{ offers }, outbound]: [OffersAndType, string]): CheapestBoundPrice[] => {\n const combinableOffers = offers.filter(byOutboundIdIfPresent(outbound));\n const inboundIds = combinableOffers.map((offer) => offer.inboundId).filter(unique);\n const prices = combinableOffers.map((offer) => boundPrice(offer.inboundId, offer.inboundPrice));\n return inboundIds.map((inboundId) => cheapestPrice(inboundId, prices));\n }),\n finShare()\n );\n\n this.selectedOffer$ = this.store$.pipe(currentOffer());\n\n this.selectedOfferPoints$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n this.selectedOffer$.pipe(startWith(undefined)),\n ]).pipe(\n map(([offers, outbound, outBoundFareFamilyCode, o]) => {\n return +(\n o?.totalPointsPrice ||\n offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundPointsPrice\n );\n }),\n distinctUntilChanged()\n );\n this.selectedOfferPrice$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n this.selectedOffer$.pipe(startWith(undefined)),\n this.currencyCode$,\n ]).pipe(\n map(([offers, outbound, outBoundFareFamilyCode, o, currencyCode]) => {\n return {\n amount:\n o?.totalPrice ||\n offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundPrice,\n currencyCode,\n };\n }),\n distinctUntilChanged(),\n startWith(EMPTY_AMOUNT)\n );\n\n this.selectedOutboundOfferItinerary$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$.pipe(filter(Boolean)),\n ]).pipe(\n distinctUntilChanged(\n (\n [offersPrev, outboundPrev, outBoundFareFamilyCodePrev],\n [offersNext, outboundNext, outBoundFareFamilyCodeNext]\n ) =>\n offersPrev?.hash === offersNext?.hash &&\n outboundPrev?.boundId === outboundNext?.boundId &&\n outBoundFareFamilyCodePrev === outBoundFareFamilyCodeNext\n ),\n map(([offers, outbound, outBoundFareFamilyCode]) => {\n const outboundFareInformation = offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundFareInformation;\n\n return itineraryWithDetails(outboundFareInformation, outbound?.itinerary, offers.locations);\n })\n );\n\n this.selectedInboundOfferItinerary$ = combineLatest([\n this.filteredOfferInbound$,\n this.selectedInbound$.pipe(filter(Boolean)),\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$.pipe(filter(Boolean)),\n ]).pipe(\n distinctUntilChanged(\n (\n [offersPrev, inboundPrev, outboundPrev, outBoundFareFamilyCodePrev],\n [offersNext, inboundNext, outboundNext, outBoundFareFamilyCodeNext]\n ) =>\n offersPrev?.hash === offersNext?.hash &&\n inboundPrev?.boundId === inboundNext?.boundId &&\n outboundPrev?.boundId === outboundNext?.boundId &&\n outBoundFareFamilyCodePrev === outBoundFareFamilyCodeNext\n ),\n map(([offers, inbound, outbound, outBoundFareFamilyCode]) => {\n const inboundFareInformation = offers.offers.find(\n (o) =>\n o.outboundFareFamily === outBoundFareFamilyCode &&\n o.outboundId === outbound?.boundId &&\n o.inboundId === inbound?.boundId\n )?.inboundFareInformation;\n\n return itineraryWithDetails(inboundFareInformation, inbound?.itinerary, offers.locations);\n })\n );\n\n this.locations$ = this.offers$.pipe(\n safeMap((o) => o.locations),\n finShare()\n );\n this.paxAmount$ = this.offers$.pipe(\n map(({ finnairSearchParameters: { adults = 0, c15s, children, infants } }: OfferList) => ({\n adults,\n c15s,\n children,\n infants,\n }))\n );\n\n this.availableCabinClasses$ = combineLatest([\n this.selectionPhase$.pipe(\n switchMap((phase) => {\n return phase === SelectionPhase.OUTBOUND ? this.outbounds$ : this.inbounds$;\n })\n ),\n this.offers$,\n ]).pipe(\n map(([bounds, offers]) => {\n return [\n Object.keys(bounds).map((bound) => {\n return boundWithDetails(offers, bounds[bound]);\n }),\n offers,\n ];\n }),\n map(([bounds, offers]: [BoundWithLocations[], OfferList]) => {\n return getCabinClassesForAwardBounds(bounds, offers.locations);\n })\n );\n\n // == SORTING ==\n this.selectedSortBy$ = this.store$.pipe(selectedTicketSortBy());\n type OffersAndSort = [OfferList, SortBy];\n this.outboundIdSortOrder$ = combineLatest([this.filteredOffersOutbound$, this.selectedSortBy$]).pipe(\n map(([offers, sortBy]: OffersAndSort): string[] => offers.sorting.outbounds[offerListSortMap[sortBy]])\n );\n this.inboundIdSortOrder$ = combineLatest([this.filteredOfferInbound$, this.selectedSortBy$]).pipe(\n map(([offers, sortBy]: OffersAndSort): string[] => offers.sorting.inbounds[offerListSortMap[sortBy]])\n );\n this.outboundSorting$ = this.filteredOfferInbound$.pipe(map((offers) => offers.sorting.outbounds));\n this.inboundSorting$ = this.filteredOfferInbound$.pipe(map((offers) => offers.sorting.inbounds));\n\n // == CONTINUE BUTTON ==\n this.subscription.add(\n this.continueButtonClicks$\n .pipe(withLatestFrom(this.isOneWayOffers$, this.selectionPhase$))\n .subscribe(([, oneWay, currentPhase]: [boolean, boolean, SelectionPhase]) => {\n if (currentPhase === SelectionPhase.OUTBOUND && !oneWay) {\n // Keep other filters, but reset time filters\n this.store$.dispatch(OffersActions.resetArrivalTime());\n this.store$.dispatch(OffersActions.resetDepartureTime());\n\n this.selectionPhase$.next(SelectionPhase.INBOUND);\n } else {\n this.confirmOffer();\n }\n })\n );\n this.continueEnabled$ = this.selectionPhase$.pipe(\n switchMap((phase: SelectionPhase): Observable => {\n if (phase === SelectionPhase.OUTBOUND) {\n return this.selectedOutbound$.pipe(startWith(undefined as FinnairBoundItem));\n }\n if (phase === SelectionPhase.INBOUND) {\n return this.selectedInbound$.pipe(startWith(undefined as FinnairBoundItem));\n }\n return this.selectedOfferPrice$.pipe(\n map(({ amount }) => amount),\n delay(1), // Prevent ExpressionChangedAfterItHasBeenCheckedError\n startWith(undefined as Amount)\n );\n }),\n map(isPresent),\n distinctUntilChanged()\n );\n this.continueButtonId$ = combineLatest([this.selectionPhase$, this.isOneWayOffers$]).pipe(\n map(([currentPhase, oneWay]: [SelectionPhase, boolean]) => {\n if (currentPhase === SelectionPhase.OUTBOUND && !oneWay) {\n return 'continue-to-inbound-selection';\n } else if ((currentPhase === SelectionPhase.OUTBOUND && oneWay) || currentPhase === SelectionPhase.INBOUND) {\n return 'continue-to-fare-selection';\n } else {\n return 'continue-to-pax-details';\n }\n }),\n distinctUntilChanged()\n );\n\n // Scroll to top and remove toaster messages on every phase change\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n filter(() => isPlatformBrowser(this.platform)),\n delay(1)\n )\n .subscribe(() => {\n this.scrollService.scrollTop();\n if (this.activeCabinClassNotificationIds.length) {\n this.activeCabinClassNotificationIds.forEach((id) => this.toasterService.removeMessage(id));\n this.activeCabinClassNotificationIds = [];\n }\n })\n );\n\n this.subscription.add(\n this.openBoundClick$\n .pipe(\n switchMap(({ bound, boundType }) =>\n this.store$.pipe(\n globalBookingPaxAmount(),\n switchMap((paxAmount: PaxAmount) =>\n this.store$.pipe(flightSelectionGtmDataForOffers(bound, boundType, paxAmount)).pipe(take(1))\n )\n )\n )\n )\n .subscribe((gtmFlightSelectionData) => {\n this.gtmService.flightSelection(GtmEvent.FLIGHT_SELECTION_VIEW, gtmFlightSelectionData);\n })\n );\n\n this.isMobile$ = this.mediaQueryService.isBreakpoint$('mobile');\n this.profile$ = this.store$.pipe(profile(), finShare());\n\n this.tripLocations$ = this.offersStatus$.pipe(\n withLatestFrom(this.store$.pipe(globalBookingFlights())),\n map(([_, locations]) =>\n locations.map(({ destination, origin }) => ({\n destination: destination.cityName,\n origin: origin.cityName,\n }))\n )\n );\n\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n switchMap((phase) => {\n return (phase === SelectionPhase.OUTBOUND ? this.outbounds$ : this.inbounds$).pipe(\n distinctUntilChanged(compareAsJson),\n map((bounds) => [bounds, phase])\n );\n })\n )\n .subscribe(([bounds, phase]) => {\n this.gtmService.trackElement(\n `${phase === SelectionPhase.OUTBOUND ? 'outbound' : 'inbound'}-flights-shown-award`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.ACCORDION,\n Object.entries(bounds).length.toString(),\n ElementActions.VIEW\n );\n })\n );\n }\n\n ngOnInit(): void {\n this.subscription.add(\n merge(this.selectedOutboundOfferItinerary$, this.selectedInboundOfferItinerary$)\n .pipe(\n filter((itinerary) => !containsOnlyOneCabin(itinerary)),\n switchMap((itinerary) => {\n const businessFaultySegments =\n !containsOnlyOneCabin(itinerary, GlobalBookingTravelClass.BUSINESS) &&\n itinerary.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.BUSINESS);\n\n const ecoPremiumFaultySegments =\n !containsOnlyOneCabin(itinerary, GlobalBookingTravelClass.ECOPREMIUM) &&\n itinerary.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.ECOPREMIUM);\n\n const faultySegments =\n isPresent(businessFaultySegments) && businessFaultySegments.length === 1\n ? businessFaultySegments\n : isPresent(ecoPremiumFaultySegments) && ecoPremiumFaultySegments.length === 1\n ? ecoPremiumFaultySegments\n : undefined;\n\n const params: LocationNames = {};\n if (faultySegments) {\n // find the origin and destination for the faulty segment.\n const [fs] = faultySegments;\n const [segment] = itinerary.filter((seg) => seg.id === fs.id);\n\n params.origin = segment.departure.cityName;\n params.destination = segment.arrival.cityName;\n }\n\n return combineLatest([\n this.selectedOutbound$,\n this.selectedInbound$,\n this.languageService.translate(\n businessFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassWarningNew'\n : ecoPremiumFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassPremiumEconomyWarningNew'\n : 'ticketSelection.differentCabinClassComplexWarning',\n params\n ),\n this.languageService.translate('ticketSelection.differentCabinClassWarningLink.linkText'),\n ]);\n }),\n distinctUntilChanged(\n (\n [selectedOutboundPrev, selectedInboundPrev, notificationTextPrev, linkTextPrev],\n [selectedOutboundNext, selectedInboundNext, notificationTextNext, linkTextNext]\n ) => {\n return (\n selectedOutboundPrev?.boundId === selectedOutboundNext?.boundId &&\n selectedInboundPrev?.boundId === selectedInboundNext?.boundId &&\n notificationTextPrev === notificationTextNext &&\n linkTextPrev === linkTextNext\n );\n }\n ),\n finShare()\n )\n .subscribe(([selectedOutbound, selectedInbound, notificationText, linkText]) => {\n const id = uuid();\n this.activeCabinClassNotificationIds.push(id);\n\n this.toasterService.addMessageToQueue({\n id,\n content: notificationText,\n theme: NotificationTheme.WARNING,\n target: {\n linkText: linkText,\n callback: () => {\n this.showDetailsModal(selectedOutbound, selectedInbound, this.selectionPhase$.getValue());\n this.activeCabinClassNotificationIds = this.activeCabinClassNotificationIds.filter(\n (storedId) => storedId !== id\n );\n },\n },\n keepMessageAfterNavigation: false,\n });\n })\n );\n\n this.subscription.add(\n this.selectionPhase$.pipe(distinctUntilChanged()).subscribe((selectionPhase) => {\n this.selectionPhaseChange.emit(selectionPhase);\n })\n );\n\n this.subscription.add(\n this.goToOutboundPhase$?.subscribe(() => {\n const selectionPhase = this.selectionPhase$.getValue();\n if (selectionPhase === SelectionPhase.INBOUND) {\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n backToDateSelection(): void {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n backToOutbound(): void {\n if (this.selectionPhase$.getValue() === SelectionPhase.OUTBOUND) {\n return;\n }\n\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n\n this.store$.dispatch(OffersActions.resetArrivalTime());\n this.store$.dispatch(OffersActions.resetDepartureTime());\n }\n\n selectOutbound(bound: BoundInfoWithFareFamilies): void {\n this.store$.dispatch(OffersActions.setOutboundId({ outboundId: bound.boundId }));\n }\n\n selectInbound(bound: BoundInfoWithFareFamilies): void {\n this.store$.dispatch(OffersActions.setInboundId({ inboundId: bound.boundId }));\n }\n\n selectOutboundFareFamily(outboundFareFamily: string): void {\n this.store$.dispatch(OffersActions.setOutboundFareFamily({ outboundFareFamily }));\n\n const offer: Offer = snapshot(this.store$.pipe(currentOffer()));\n if (!offer) {\n this.store$.dispatch(OffersActions.setInboundId({ inboundId: undefined }));\n this.store$.dispatch(OffersActions.setInboundFareFamily({ inboundFareFamily: undefined }));\n }\n }\n\n selectInboundFareFamily(inboundFareFamily: string): void {\n this.store$.dispatch(OffersActions.setInboundFareFamily({ inboundFareFamily }));\n }\n\n selectSortBy(sortBy: SortBy): void {\n this.store$.dispatch(OffersActions.setSortBy({ sortBy }));\n\n this.selectedSortCriteria$ = of(sortBy);\n this.onShowSpinner();\n }\n\n onShowSpinner(): void {\n this.isLoading$.next(true);\n\n setTimeout(() => {\n this.isLoading$.next(false);\n }, FAKE_LOAD_TIME);\n }\n\n onContinueClick(event: Event): void {\n stopPropagation(event);\n this.bookingWidgetService.setGlobalBookingSelectionToOriginal();\n this.continueButtonClicks$.next(true);\n }\n\n confirmOffer(): void {\n const offer: Offer = snapshot(this.store$.pipe(currentOffer()));\n this.triggerCreateCart(offer);\n const zeroBaggage: boolean = snapshot(this.store$.pipe(hasZeroBaggageOnEitherFlight(offer)));\n\n if (zeroBaggage) {\n this.continueModal = {\n open: true,\n data: {\n zeroBaggage,\n },\n };\n } else {\n this.continueToNextStep();\n }\n }\n\n continueToNextStep(): void {\n this.bookingService.setStep({ step: BOOKING_STEPS.PAXDETAILS });\n }\n\n closeModals(): void {\n this.itineraryModal = { open: false, data: {} };\n this.continueModal = { open: false, data: null };\n this.benefitsModal = { open: false, data: null };\n }\n\n showDetailsModal(\n outbound: BoundInfoWithFareFamilies,\n inbound: BoundInfoWithFareFamilies,\n selectionPhase: SelectionPhase\n ): void {\n this.itineraryModal = {\n open: true,\n data: {\n outbound: this.getBoundWithItineraryDetails(outbound, snapshot(this.selectedOutboundOfferItinerary$)),\n inbound: this.getBoundWithItineraryDetails(inbound, snapshot(this.selectedInboundOfferItinerary$)),\n },\n };\n\n this.gtmService.trackElement(\n `${selectionPhase.toLowerCase()}::view-flight-details`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.LINK,\n undefined,\n ElementActions.CLICK\n );\n }\n\n handleShowBenefits($event: DimensionsAndDetails): void {\n this.benefitsModal = {\n open: true,\n data: $event,\n };\n\n this.gtmService.trackElement(\n 'benefits',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.MODAL,\n undefined,\n ElementActions.OPEN\n );\n }\n\n handleBoundOpen(bound: BoundInfoWithFareFamilies, boundType: BoundType): void {\n this.openBoundClick$.next({ bound, boundType });\n }\n\n private triggerCreateCart(offer: Offer): void {\n const offersHashValue: string = snapshot(this.store$.pipe(offersHash()));\n const locale = this.languageService.localeValue;\n this.bookingQueueService.queueCartCreate(offer.offerId, locale, offersHashValue);\n }\n\n private getBoundWithItineraryDetails(\n bound: BoundInfoWithFareFamilies | null,\n selectedBoundWithItineraryFlightDetails: ItineraryDetails[] | null\n ): BoundInfoWithFareFamilies | null {\n if (!isPresent(bound)) {\n return null;\n }\n\n const hasBoundAndDetails = isPresent(bound) && isPresent(selectedBoundWithItineraryFlightDetails);\n\n return hasBoundAndDetails\n ? {\n ...bound,\n itinerary: bound.itinerary.map((flight) => {\n const fareInformation = selectedBoundWithItineraryFlightDetails.find(\n (fareInfo: ItineraryDetails) => fareInfo.id === (flight as ItineraryItemFlight)?.id\n );\n\n return {\n ...flight,\n ...(isPresent(fareInformation) && fareInformation),\n };\n }),\n }\n : bound;\n }\n}\n","
\n \n \n \n \n \n \n \n \n \n \n {{ fareFamily.brandName }}\n \n \n {{\n ('travelClass.' + fareFamily.cabinClass?.toLowerCase() | finLocalization) ||\n ('travelClass.mixed' | finLocalization)\n }}\n \n \n\n \n {{ 'pricesStartingFrom' | finLocalization }}\n\n {{ 'award.points' | finLocalization: { pointsAmount: +fareFamily.points || 0 | finPoints } }} + \n\n {{\n { amount: fareFamily.price, currencyCode: currencyCode$ | async } | finPrice\n }}\n \n \n \n \n
\n\n
\n \n \n {{\n 'ticketSelection.header.selectTicketTypeBelow' | finLocalization\n }}\n \n\n \n \n \n
\n\n \n
\n \n
\n \n \n \n {{ 'ticketSelection.baggageAndTicketTypeDetails' | finLocalization }}\n \n \n\n","import {\n AfterViewChecked,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, Observable, Subject, Subscription } from 'rxjs';\nimport { delay, map, withLatestFrom } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\n\nimport { stopPropagation, unsubscribe } from '@fcom/core/utils';\nimport { FinnairBoundFareFamily } from '@fcom/dapi/api/models';\nimport { DimensionsAndDetails, ExtendedFareFamily } from '@fcom/common-booking';\nimport { ScrollHandleContainerComponent } from '@fcom/common/components/scroll-handle-container/scroll-handle-container.component';\nimport { GaContext } from '@fcom/common/interfaces';\nimport { Direction } from '@fcom/common/interfaces/utils.interface';\nimport { LocationRouteType } from '@fcom/core-api/interfaces';\nimport { NotificationTheme } from '@fcom/ui-components';\n\nimport { DimensionsAndDetailsModalService } from '../../services/dimensions-and-details-modal.service';\nimport { CabinClassSelectionFareFamily } from '../../interfaces';\nimport { effectiveCabinClass, filterAndSortFareFamilyByCabinClass } from '../../utils/offer.utils';\n\n@Component({\n selector: 'fin-offer-farefamilies',\n templateUrl: 'offer-farefamilies.component.html',\n styleUrls: ['./offer-farefamilies.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OfferFarefamiliesComponent implements OnInit, OnDestroy, AfterViewChecked {\n readonly GaContext = GaContext;\n readonly NotificationTheme = NotificationTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input() bound$: Observable;\n @Input() selectedBoundId$: Observable;\n @Input() selectedFareFamilyCode$: Observable;\n @Input() currencyCode$: Observable;\n @Input() isMobile$: Observable;\n @Input() isShortHaul$: Observable;\n @Input() routeType$: Observable;\n\n @Output()\n selectFareFamily: EventEmitter = new EventEmitter();\n @Output()\n showBenefits: EventEmitter = new EventEmitter();\n @Output()\n scrollBenefits: EventEmitter = new EventEmitter();\n @Output()\n showCabinClassFareFamilies: EventEmitter = new EventEmitter();\n\n isMobile: boolean;\n optionName = `fare-family-option-${uuid()}`;\n accordionId = `benefit-accordion-${uuid()}`;\n showFareFamilyOptions = false;\n extendedFareFamilies$: Observable;\n extendedFareFamilies: ExtendedFareFamily[];\n cheapestOrSelectedFareFamilyOfEachCabinClass$: Observable;\n hasSelected = false;\n selectedCabinClass: string;\n\n private scrollRequest$: Subject = new Subject();\n private subscription = new Subscription();\n\n @ViewChild('scrollContainer', { static: false }) scrollContainer: ScrollHandleContainerComponent;\n @ViewChild('activeCabinClassHeaderContainer', { static: false, read: ElementRef })\n activeCabinClassHeaderContainer: ElementRef;\n @ViewChild('scrollHandleLeft', { static: false, read: ElementRef }) scrollHandleLeft: ElementRef;\n @ViewChild('scrollHandleRight', { static: false, read: ElementRef }) scrollHandleRight: ElementRef;\n @ViewChildren('fareFamilyOption', { read: ElementRef }) fareFamilyOptions: QueryList;\n\n constructor(private dimensionsAndDetailsModalService: DimensionsAndDetailsModalService) {}\n\n ngOnInit(): void {\n this.cheapestOrSelectedFareFamilyOfEachCabinClass$ = combineLatest([\n this.bound$,\n this.selectedFareFamilyCode$,\n this.selectedBoundId$,\n ]).pipe(\n map(\n ([bound, selectedFareFamilyCode, selectedBoundId]) =>\n filterAndSortFareFamilyByCabinClass(bound.fareFamilies).map((f) => ({\n ...f,\n cabinClass: effectiveCabinClass(f),\n selected: f.fareFamilyCode === selectedFareFamilyCode && bound.boundId === selectedBoundId,\n })) as any[]\n )\n );\n\n this.extendedFareFamilies$ = combineLatest([this.bound$, this.selectedFareFamilyCode$, this.selectedBoundId$]).pipe(\n map(([bound, selectedFareFamilyCode, selectedBoundId]) =>\n bound.fareFamilies.map(\n (fareFamily): ExtendedFareFamily => ({\n ...fareFamily,\n benefits: fareFamily,\n selected: fareFamily.fareFamilyCode === selectedFareFamilyCode && bound.boundId === selectedBoundId,\n })\n )\n )\n );\n\n this.subscription.add(\n this.scrollRequest$\n .pipe(withLatestFrom(this.extendedFareFamilies$), delay(0))\n .subscribe(([fareFamily, fareFamilies]) => {\n const fareFamilyIndex = fareFamilies.findIndex((f) => f.id === fareFamily.id);\n this.scrollToCardByIndex(fareFamilyIndex);\n })\n );\n\n this.subscription.add(\n this.extendedFareFamilies$.subscribe((val) => {\n this.extendedFareFamilies = val;\n })\n );\n\n this.subscription.add(\n this.selectedFareFamilyCode$.subscribe((fareFamilyCode) => {\n this.hasSelected = !!fareFamilyCode;\n })\n );\n\n this.subscription.add(this.isMobile$.subscribe((isMobile) => (this.isMobile = isMobile)));\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n ngAfterViewChecked(): void {\n this.adjustFareFamilyOptionHeight();\n }\n\n adjustFareFamilyOptionHeight(): void {\n if (this.scrollContainer && this.isMobile$) {\n const children: HTMLElement[] = this.scrollContainer.container.nativeElement.querySelectorAll(\n 'fin-fare-family-option .brand-name-description'\n );\n\n const itemHeights = Array.from(children).map((e) => e.getBoundingClientRect().height);\n const maxHeight = itemHeights.reduce((prev, curr) => (curr > prev ? curr : prev), 0);\n\n Array.from(children)\n .filter((e) => e.style.flexBasis !== `${maxHeight}px`)\n .forEach((e) => {\n e.style.flexBasis = `${maxHeight}px`;\n });\n }\n }\n\n trackByFn(index: number): number {\n return index;\n }\n\n showFareFamiliesAndScrollToCabinClass(event: Event, fareFamily: CabinClassSelectionFareFamily): void {\n stopPropagation(event);\n\n this.showCabinClassFareFamilies.emit(fareFamily.cabinClass);\n\n this.selectedCabinClass = fareFamily.cabinClass;\n\n if (!this.hasSelected) {\n this.selectFareFamily.emit(fareFamily);\n }\n\n this.showFareFamilyOptions = true;\n\n setTimeout(() => {\n this.activeCabinClassHeaderContainer?.nativeElement?.focus();\n }, 0);\n this.scrollToFareFamily(fareFamily.preSelectFareFamily || fareFamily);\n }\n\n /**\n * Displays card center based on container\n * @param index, Card index to display centered\n */\n scrollToCardByIndex(index: number): void {\n this.scrollContainer.scrollToElement(this.fareFamilyOptions.toArray()[index]);\n }\n\n private scrollToFareFamily(fareFamily: CabinClassSelectionFareFamily | FinnairBoundFareFamily): void {\n this.scrollRequest$.next(fareFamily);\n }\n\n hideFareFamilies(event: Event): void {\n stopPropagation(event);\n\n this.showFareFamilyOptions = false;\n }\n\n handleShowBenefits(): void {\n this.dimensionsAndDetailsModalService.opedAllDimensionsAndDetails();\n this.showBenefits.emit({\n extendedFareFamilies: this.extendedFareFamilies,\n cabinClass: this.selectedCabinClass || 'ECONOMY',\n });\n }\n\n handleSelectFareFamily(boundFareFamily: FinnairBoundFareFamily): void {\n this.selectFareFamily.emit(boundFareFamily);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'finJoin',\n})\nexport class JoinPipe implements PipeTransform {\n transform(input: any[], joinWith = ''): string {\n return Array.isArray(input) ? input.join(joinWith) : '';\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 {{ 'routeNotification.sustainableRoute' | finLocalization }}\n \n \n {{ 'routeNotification.sustainableRouteNoPriorities' | finLocalization }}\n \n \n\n \n \n {{ 'award.notifications.partnerFlightsPrices' | finLocalization }} \n \n \n\n 0\"\n class=\"mr-xsmall-t bound-selection-notes\"\n [theme]=\"NotificationTheme.WARNING\"\n >\n {{ 'ticketSelection.notes.' + note | finLocalization }}, \n \n
\n {{\n 'ticketSelection.aria.boundInformation'\n | finLocalization\n : {\n departureLocationCode: bound.departure.locationCode,\n departureDate: bound.departure.dateTime | finDateFormat: 'FULL_NO_YEAR',\n departureTime: bound.departure.dateTime | finTime,\n arrivalLocationCode: bound.arrival.locationCode,\n arrivalTime: bound.arrival.dateTime | finTime,\n arrivalDate: bound.arrival.dateTime | finDateFormat: 'FULL_NO_YEAR',\n stops: bound.stops,\n priceStartingFrom: boundObs | finMap: 'cheapestPrice' | finOffersPrice: currencyCode$ | async,\n operatingAirlineNames: bound.uniqueAirlineNames | finJoin: ', ',\n }\n }}\n \n \n \n\n \n \n \n \n
\n\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, NEVER, Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, switchMap, take, withLatestFrom } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { LocationRouteCffService } from '@fcom/core';\nimport { BoundType, CheapestBoundPrice, LocationInfoMap } from '@fcom/dapi/interfaces';\nimport { isIn, isNotEmpty, isPresent, isUndefined, unsubscribe } from '@fcom/core/utils';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { Profile } from '@fcom/core-api/login';\nimport { CmsTeaser, LocationRouteType } from '@fcom/core-api/interfaces';\nimport { FragmentService, ToasterService } from '@fcom/common/services';\nimport {\n Bound,\n Cabin,\n FareFamily,\n FinnairBoundFareFamily,\n FinnairLocation,\n LocationWithDateTime,\n OfferList,\n} from '@fcom/dapi/api/models';\nimport {\n isByBusOnly,\n isFlight,\n getAircraftTailForFlight,\n priorityServicesAvailable,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { finShare } from '@fcom/rx';\nimport { Direction } from '@fcom/common/interfaces/utils.interface';\nimport { DimensionsAndDetails, SortBy } from '@fcom/common-booking';\nimport { LoaderType, OfferListFetchParams } from '@fcom/common/interfaces';\nimport {\n FlightSelectionFiltersComponent,\n ResetFiltersEvent,\n} from '@fcom/common-booking/components/flight-selection-filters/flight-selection-filters.component';\nimport {\n getFareFamiliesLowestPriceOrPoints,\n mapLocationRouteCffDataToCabin,\n sortByPrice,\n} from '@fcom/common/utils/booking.utils';\nimport { isShortHaulFlight } from '@fcom/common/utils/flight.utils';\nimport { FlightFilters, FlightTimeOption } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport { calculateLowesPrice } from '@fcom/common/utils/price-utils';\nimport {\n AirOffersStatus,\n BookingAppState,\n BoundInfoWithFareFamilies,\n BoundInfoWithFareFamiliesMap,\n SelectionPhase,\n} from '@fcom/common/interfaces/booking';\n\nimport { OffersActions } from '../../../../store/actions';\nimport { AppConstants } from '../../../../app-constants';\nimport { BUS_AIRCRAFT_CODE } from '../../interfaces';\nimport { BookingService } from '../../../../services';\nimport { offerFilters, offerLastRequestParams } from '../../../../store/selectors/offers.selector';\nimport { offerListSortMap } from '../booking-ticket-selection-view.component';\n\nexport interface CabinClassFareFamily extends FareFamily {\n disabled: boolean;\n}\n\nexport interface ExtendedBoundInfo extends Bound {\n disabled: boolean;\n selected: boolean;\n hasBusLeg: boolean;\n priorityServicesAvailable: boolean;\n cheapestCombinablePrice: string;\n fareFamilies?: CabinClassFareFamily[];\n departure: LocationWithDateTime & { cityName: string; name: string; countryCode: string };\n arrival: LocationWithDateTime & { cityName: string; name: string; countryCode: string };\n}\n\n@Component({\n selector: 'fin-bound-selection-list',\n styleUrls: ['./bound-selection-list.component.scss'],\n templateUrl: './bound-selection-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BoundSelectionListComponent implements OnInit, OnDestroy {\n readonly AirOffersStatus = AirOffersStatus;\n readonly C: typeof AppConstants = AppConstants;\n readonly LoaderType = LoaderType;\n readonly NotificationTheme = NotificationTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input()\n currencyCode$: Observable;\n @Input()\n boundType: BoundType;\n @Input()\n isLoading: boolean;\n @Input()\n selectionPhase: SelectionPhase;\n @Input()\n boundsStatus$: Observable;\n @Input()\n selectedSortBy$: Observable;\n @Input()\n bounds$: Observable;\n @Input()\n cheapestCombinablePrices$: Observable;\n @Input()\n locations$: Observable;\n @Input()\n filteredOffers$: Observable<{ [key: string]: string[] }>;\n\n /** The sort order for the bound ids. */\n @Input()\n boundIdSortOrder$: Observable;\n @Input()\n enabledBoundIds$: Observable;\n @Input()\n selectedBound$: Observable;\n @Input()\n selectedFareFamilyCode$: Observable;\n @Input()\n isMobile$: Observable;\n @Input()\n selectedOutbound$: Observable = NEVER;\n @Input()\n profile$: Observable = NEVER;\n @Input()\n showFlightSelectionFilters: boolean;\n\n @Output()\n openBound: EventEmitter = new EventEmitter();\n @Output()\n selectBound: EventEmitter = new EventEmitter();\n @Output()\n selectFareFamily: EventEmitter = new EventEmitter();\n @Output()\n showDetails: EventEmitter = new EventEmitter();\n @Output()\n showBenefits: EventEmitter = new EventEmitter();\n @Output()\n scrollBenefits: EventEmitter = new EventEmitter();\n @Output()\n showCabinClassFareFamilies: EventEmitter = new EventEmitter();\n @Output()\n selectSortBy: EventEmitter = new EventEmitter();\n @Output()\n showSpinner: EventEmitter = new EventEmitter();\n\n @ViewChild(FlightSelectionFiltersComponent)\n private flightSelectionFilters: FlightSelectionFiltersComponent;\n\n boundsList$: Observable;\n tails$: Observable<{ [boundId: string]: string[] }>;\n isBusOnlyConnections$: Observable<{ [boundId: string]: boolean }>;\n control: UntypedFormControl;\n\n routeType$: Observable;\n isShortHaul$: Observable;\n layoverAmounts$: Observable;\n originLocationCode$: Observable;\n destinationLocationCode$: Observable;\n fastestPrice$: Observable;\n lowestPrice$: Observable;\n\n private subscription: Subscription = new Subscription();\n\n readonly BoundType = BoundType;\n availableCabinClasses$: Observable;\n filters$: Observable;\n lastRequestParam$: Observable;\n isTravelClassDisabled$: Observable;\n\n constructor(\n private toasterService: ToasterService,\n private fragmentService: FragmentService,\n private bookingService: BookingService,\n private locationRouteCffService: LocationRouteCffService,\n private store$: Store\n ) {}\n\n ngOnInit(): void {\n this.control = new UntypedFormControl('');\n\n this.routeType$ = this.bookingService.routeType;\n\n this.filters$ = this.store$.pipe(offerFilters());\n\n this.lastRequestParam$ = this.store$.pipe(offerLastRequestParams());\n this.isTravelClassDisabled$ = this.lastRequestParam$.pipe(\n map((params) => (params?.cabin === Cabin.MIXED ? false : true))\n );\n\n const selectedBoundId$: Observable = this.selectedBound$.pipe(\n filter(isPresent),\n map(({ boundId }): string => boundId),\n distinctUntilChanged()\n );\n\n const sortedBounds$: Observable = combineLatest([\n this.bounds$.pipe(filter(isPresent)),\n this.boundIdSortOrder$.pipe(filter(isNotEmpty)),\n ]).pipe(\n map(([bounds, sortOrder]: [OfferList['outbounds'], string[]]): Bound[] =>\n sortOrder.map((id: string) => bounds[id]).filter(Boolean)\n ),\n filter((bounds) => bounds.every(Boolean)),\n finShare()\n );\n\n this.subscription.add(\n selectedBoundId$\n .pipe(\n withLatestFrom(sortedBounds$),\n map(([selected, bounds]: [string, Bound[]]): Bound => bounds.find(({ boundId }) => boundId === selected))\n )\n .subscribe((selectedBound) => this.control.setValue(selectedBound))\n );\n\n const cheapestCombinedPrice = (p: CheapestBoundPrice, b: Bound): string => p?.cheapestPrice || b.cheapestPrice;\n\n this.boundsList$ = combineLatest([\n sortedBounds$,\n this.enabledBoundIds$,\n this.cheapestCombinablePrices$,\n selectedBoundId$.pipe(startWith(undefined as string)),\n this.locations$,\n this.profile$,\n ]).pipe(\n map(([bounds, enabledBoundIds, cheapestPrices, selected, locations, profile]): ExtendedBoundInfo[] =>\n bounds\n .map((bound) => {\n return {\n ...bound,\n priorityServicesAvailable: priorityServicesAvailable(bound.itinerary),\n hasBusLeg: bound.itinerary.filter(isFlight).some(isByBusOnly),\n departure: {\n ...bound.departure,\n name: locations[bound.departure.locationCode]?.name,\n cityName: locations[bound.departure.locationCode]?.cityName,\n countryCode: locations[bound.departure.locationCode]?.countryCode,\n },\n arrival: {\n ...bound.arrival,\n name: locations[bound.arrival.locationCode]?.name,\n cityName: locations[bound.arrival.locationCode]?.cityName,\n countryCode: locations[bound.arrival.locationCode]?.countryCode,\n },\n disabled: !isIn(bound.boundId, ...enabledBoundIds),\n selected: bound.boundId === selected,\n cheapestCombinablePrice: cheapestCombinedPrice(\n cheapestPrices.find((p) => p.boundId === bound.boundId),\n bound\n ),\n fareFamilies: bound.fareFamilies.map((ff) => ({\n ...ff,\n disabled: (profile && +profile.awardPoints < +ff.totalPoints) ?? false,\n })),\n };\n })\n .filter((bound) => bound.fareFamilies.length)\n ),\n finShare()\n );\n\n this.isShortHaul$ = this.boundsList$.pipe(\n map((bounds) =>\n isShortHaulFlight(\n { countryCode: bounds[0]?.departure.countryCode } as FinnairLocation,\n { countryCode: bounds[bounds.length - 1]?.arrival.countryCode } as FinnairLocation\n )\n )\n );\n\n this.layoverAmounts$ = this.boundsList$.pipe(map((bounds) => bounds.map((bound) => bound.stops)));\n\n this.originLocationCode$ = this.boundsList$.pipe(\n take(1),\n map((bounds) => bounds[0]?.departure.locationCode)\n );\n this.destinationLocationCode$ = this.boundsList$.pipe(\n take(1),\n map((bounds) => bounds[0]?.arrival.locationCode)\n );\n\n this.fastestPrice$ = combineLatest([\n this.bounds$.pipe(filter(isPresent)),\n this.filteredOffers$.pipe(filter(isPresent)),\n ]).pipe(\n filter(isPresent),\n map(([bounds, offers]: [BoundInfoWithFareFamiliesMap, { [key: string]: string[] }]) => {\n return offers[offerListSortMap[SortBy.DURATION]].reduce((lowestPrice, sortingId) => {\n const fareFamilies = bounds[sortingId]?.fareFamilies;\n const lowestFFPrice = getFareFamiliesLowestPriceOrPoints(fareFamilies, true);\n\n return calculateLowesPrice(lowestPrice, lowestFFPrice);\n }, null);\n })\n );\n\n this.lowestPrice$ = combineLatest([\n this.bounds$.pipe(filter(isPresent)),\n this.filteredOffers$.pipe(filter(isPresent)),\n ])\n .pipe(filter(isPresent))\n .pipe(\n map(([bounds, offers]: [BoundInfoWithFareFamiliesMap, { [key: string]: string[] }]) => {\n const sortOrder = offers[offerListSortMap[SortBy.PRICE]];\n\n const results = sortOrder?.map((id: string) => bounds[id]).filter(Boolean);\n\n const sorted = sortByPrice(results);\n\n return sorted[0]?.fareFamilies\n ? getFareFamiliesLowestPriceOrPoints(sorted[0]?.fareFamilies, true)\n : undefined;\n }),\n finShare()\n );\n\n this.availableCabinClasses$ = combineLatest([this.originLocationCode$, this.destinationLocationCode$]).pipe(\n switchMap(([origin, destination]) => {\n return this.locationRouteCffService.routeCffsFor(origin, destination).pipe(\n take(1),\n map((result) => mapLocationRouteCffDataToCabin(result))\n );\n })\n );\n\n this.subscription.add(\n this.boundsList$\n .pipe(\n map((bounds) => bounds.some((bound) => bound.fareFamilies.some((ff) => ff.disabled))),\n filter(Boolean),\n switchMap(() => this.fragmentService.getFragment('fragments.notEnoughPoints.url')),\n filter(Boolean),\n finShare()\n )\n .subscribe((fragment: CmsTeaser) => {\n this.toasterService.addMessageToQueue({\n id: 'AWARD_NOT_ENOUGH_POINTS_NOTIFICATION',\n content: fragment.teaserTitle,\n theme: NotificationTheme.WARNING,\n target: fragment.target\n ? {\n linkUrl: fragment.target.url,\n linkText: fragment.target.teaserTitle,\n linkOpenInNewWindow: fragment.target.openInNewTab,\n }\n : undefined,\n });\n })\n );\n\n this.tails$ = this.boundsList$.pipe(\n map((boundsList) => {\n return boundsList.reduce((all, bound) => {\n all[bound.boundId] = bound.itinerary\n .filter(isFlight)\n .flatMap((itinerary) => getAircraftTailForFlight(itinerary));\n return all;\n }, {});\n })\n );\n\n this.isBusOnlyConnections$ = this.boundsList$.pipe(\n map((boundsList) => {\n return boundsList.reduce((all, bound) => {\n all[bound.boundId] = bound.itinerary\n .filter(isFlight)\n .flatMap((flight) => flight.aircraft?.code)\n .every((aircraftCode) => aircraftCode?.toUpperCase() === BUS_AIRCRAFT_CODE);\n return all;\n }, {});\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\n }\n\n selectBoundAndFarefamily(bound: ExtendedBoundInfo, fareFamily: FinnairBoundFareFamily): void {\n this.selectBound.emit(bound);\n this.selectFareFamily.emit(fareFamily.fareFamilyCode);\n }\n\n emitShowCabinClassFareFamilies(bound: Bound, cabin: string): void {\n this.openBound.emit(bound);\n this.showCabinClassFareFamilies.emit(cabin);\n }\n\n onSelectSortBy(data: SortBy): void {\n this.selectSortBy.emit(data);\n }\n\n onSetFilter(flightFilters: FlightFilters): void {\n const filteredFilters = Object.entries(flightFilters)\n .filter(([_, value]) => !isUndefined(value))\n .reduce((obj, [filterName, value]) => ({ ...obj, [filterName]: value }), {});\n\n Object.entries(filteredFilters).forEach(([filterName, value]) => {\n switch (filterName as keyof FlightFilters) {\n case 'stopsCount':\n this.store$.dispatch(OffersActions.setStopsCount({ stopsCount: value as number | null }));\n break;\n\n case 'cabin':\n this.store$.dispatch(OffersActions.setCabin({ cabin: value as Cabin }));\n break;\n\n case 'departureTime':\n this.store$.dispatch(OffersActions.setDepartureTime({ departureTime: value as FlightTimeOption[] }));\n break;\n\n case 'arrivalTime':\n this.store$.dispatch(OffersActions.setArrivalTime({ arrivalTime: value as FlightTimeOption[] }));\n break;\n\n default:\n break;\n }\n });\n }\n\n onResetFilter(event: ResetFiltersEvent): void {\n switch (event.type) {\n case 'stopsCount':\n this.store$.dispatch(OffersActions.resetStopsCount());\n break;\n\n case 'cabin':\n this.store$.dispatch(OffersActions.resetCabin());\n break;\n\n case 'departureTime':\n this.store$.dispatch(OffersActions.resetDepartureTime());\n break;\n\n case 'arrivalTime':\n this.store$.dispatch(OffersActions.resetArrivalTime());\n break;\n\n default:\n break;\n }\n }\n\n onResetAllFilters(): void {\n this.store$.dispatch(\n OffersActions.resetAllFilters({ keepCabin: this.flightSelectionFilters.shouldNotClearTravelClass })\n );\n }\n\n clearAllFilters(): void {\n this.flightSelectionFilters.clearAllFilters('empty-state');\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { PaxAmount } from '@fcom/dapi/interfaces';\n\n@Pipe({\n name: 'finFormatPassenger',\n})\nexport class FormatPassengerPipe implements PipeTransform {\n transform(trans: any, paxAmount: PaxAmount): string {\n return this.formatPaxAmount(paxAmount, trans);\n }\n\n private formatPaxAmount = (paxAmount: PaxAmount, trans: any): string => {\n if (!paxAmount || !trans) {\n return '';\n }\n const info: string[] = [];\n const adults = paxAmount.adults;\n if (adults > 0) {\n info.push(`${adults} ${adults === 1 ? trans.adult : trans.adults}`);\n }\n const children = paxAmount.children + paxAmount.c15s;\n if (children > 0) {\n info.push(`${children} ${children === 1 ? trans.child : trans.children}`);\n }\n const infants = paxAmount.infants;\n if (infants > 0) {\n info.push(`${infants} ${infants === 1 ? trans.infant : trans.infants}`);\n }\n return info.join(', ');\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 {{ 'promoCode.applied' | finLocalization: { code: promoCode } }}\n\n\n\n\n
\n \n \n \n \n \n \n \n \n
\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\n\nimport { combineLatest, Observable, Subscription, of } from 'rxjs';\nimport { delay, map, startWith, distinctUntilChanged } from 'rxjs/operators';\n\nimport { PaxAmount } from '@fcom/dapi';\nimport { isPresent, LocalDate, unsubscribe } from '@fcom/core/utils';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { FinnairBoundItemWithLocation } from '@fcom/common-booking';\nimport { GaContext } from '@fcom/common/interfaces';\nimport { SelectionPhase } from '@fcom/common/interfaces/booking';\nimport { LanguageSelectorContext } from '@fcom/common/components/language-selector/language-selector.component';\n\nimport { LocationNames } from '../../interfaces/locations.interface';\nimport { AppConstants } from '../../../../app-constants';\n\nconst focus = (elemRef: ElementRef): void => {\n if (isPresent(elemRef) && isPresent(elemRef.nativeElement)) {\n elemRef.nativeElement.focus();\n }\n};\n\n@Component({\n selector: 'fin-ticket-selection-header',\n styleUrls: ['./ticket-selection-header.component.scss'],\n templateUrl: './ticket-selection-header.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TicketSelectionHeaderComponent implements OnInit, OnDestroy {\n readonly SelectionPhase = SelectionPhase;\n readonly C = AppConstants;\n readonly NotificationTheme = NotificationTheme;\n readonly TRACKING_CONTEXT = GaContext.FLIGHT_SELECTION;\n readonly BOUND_SELECTION_PHASE_INDEX = {\n [SelectionPhase.OUTBOUND]: 0,\n [SelectionPhase.INBOUND]: 1,\n };\n readonly LANGUAGE_SELECTOR_CONTEXT = LanguageSelectorContext.BOOKING;\n\n @Input()\n departureDate$: Observable;\n @Input()\n returnDate$: Observable;\n @Input()\n outbound$: Observable;\n @Input()\n inbound$: Observable;\n @Input()\n isOneWay$: Observable;\n @Input()\n paxAmount$: Observable;\n @Input()\n currencyCode$: Observable;\n @Input()\n selectionPhase$: Observable;\n @Input()\n promoCode$: Observable;\n @Input()\n enableNewLanguageSelector = false;\n @Input()\n tripLocations: LocationNames[];\n @Input()\n enableNewStepper = false;\n\n @Output()\n clickOutbound: EventEmitter = new EventEmitter();\n @Output()\n clickInbound: EventEmitter = new EventEmitter();\n\n boundSelection$: Observable;\n numberOfBoundText$ = of('');\n\n @ViewChild('outboundButton', { static: false })\n private outboundButton: ElementRef;\n @ViewChild('inboundButton', { static: false })\n private inboundButton: ElementRef;\n\n private subscription: Subscription;\n ngOnInit(): void {\n this.numberOfBoundText$ = this.selectionPhase$.pipe(\n distinctUntilChanged(),\n map((selectionPhase) => `${this.BOUND_SELECTION_PHASE_INDEX[selectionPhase] + 1}. `)\n );\n this.boundSelection$ = combineLatest([\n this.outbound$,\n this.inbound$.pipe(startWith(undefined as FinnairBoundItemWithLocation)),\n ]).pipe(map((bounds) => bounds.filter(Boolean)));\n\n this.subscription = this.selectionPhase$\n .pipe(\n delay(1) // Won't work with ContinueButton without delay\n )\n .subscribe((selectionPhase: SelectionPhase) => {\n if (selectionPhase === SelectionPhase.OUTBOUND) {\n focus(this.outboundButton);\n } else if (selectionPhase === SelectionPhase.INBOUND) {\n focus(this.inboundButton);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\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 {{ 'price.totalPriceAllPassengers' | finLocalization }}:\n \n {{\n selectedBoundsPrice$ | async | finPrice | finEmpty: '–'\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 {{ 'promoCode.modalWarning' | finLocalization: { code: promoCodeModal.promoCode } }}\n
\n\n
\n
{{ 'promoCode.termsTitle' | finLocalization }}
\n
{{ promoCodeModal.title }}
\n
\n
\n
\n
\n \n \n
\n\n","import {\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n PLATFORM_ID,\n ViewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport {\n delay,\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport {\n ButtonPosition,\n ButtonTheme,\n ModalButtons,\n NotificationTheme,\n TabLayoutType,\n TabsComponent,\n} from '@fcom/ui-components';\nimport {\n ElementActions,\n ElementTypes,\n FlightSegment,\n FragmentService,\n LoaderType,\n MediaQueryService,\n PageMetaService,\n ScrollService,\n ToasterService,\n TripType,\n} from '@fcom/common';\nimport { GtmService } from '@fcom/common/gtm/services/gtm.service';\nimport { CmsDataService, ConfigService } from '@fcom/core/services';\nimport { equals, GlobalBookingTravelClass, isDeepEqual, NativeBridgeService, SentryLogger } from '@fcom/core';\nimport { Amount, BoundType, LocationInfoMap, PaxAmount } from '@fcom/dapi';\nimport { finShare, snapshot } from '@fcom/rx';\nimport { isPresent, isUndefined, LocalDate, stopPropagation, unsubscribe } from '@fcom/core/utils';\nimport {\n Cabin,\n FareFamily,\n FareInformation,\n FinnairBoundFareFamily,\n FinnairCabinClass,\n FinnairItineraryItemFlight,\n ItineraryItemFlight,\n} from '@fcom/dapi/api/models';\nimport {\n FinnairMultiCitySearchInterface,\n GaContext,\n GtmEvent,\n GtmFlightSelectionData,\n GtmPurchaseFlow,\n} from '@fcom/common/interfaces';\nimport {\n DimensionsAndDetails,\n ExtendedFareFamily,\n FinnairBoundItemWithLocation,\n SortBy,\n UpgradeOfferActions,\n} from '@fcom/common-booking';\nimport { CmsArticle } from '@fcom/core-api/';\nimport {\n GlobalBookingActions,\n globalBookingFlights,\n globalBookingPaxAmount,\n globalBookingSelections,\n} from '@fcom/common/store';\nimport { profileOrNot, pseudoLocal } from '@fcom/core/selectors';\nimport { LoginStep, ProfileTier } from '@fcom/core-api/login';\nimport {\n getCabinClassShortCode,\n getTripTypeFromGlobalBookingFlights,\n isFlight,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { UpgradeOffer } from '@fcom/common-booking/interfaces/upgrade-offer.interface';\nimport { LoginActions, PseudoLocalActions } from '@fcom/core/actions';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport {\n AirOffersStatus,\n AirOffersStatusToText,\n BookingAndAppState,\n FinnairAirBounds,\n FinnairBoundGroupWithLocation,\n SelectionPhase,\n} from '@fcom/common/interfaces/booking';\nimport { isShortHaulFlight } from '@fcom/common/utils';\nimport { ExpanderStatus } from '@fcom/booking-widget/interfaces/booking-widget.interface';\nimport { GLOBAL_BOOKING_WIDGET_EXPANDER_KEY } from '@fcom/booking-widget/constants';\nimport { BookingWidgetService } from '@fcom/booking-widget/services/booking-widget.service';\n\nimport { DimensionsAndDetailsModalService } from '../services/dimensions-and-details-modal.service';\nimport { CountryCode } from '../../../utils';\nimport { BoundsActions } from '../../../store/actions';\nimport {\n airBoundsLastRequestDepartureDate,\n airBoundsLastRequestReturnDate,\n airBoundsRequest,\n boundsCurrency,\n boundSelectionsDone,\n boundsHash,\n boundsStatus,\n boundsTotalPrice,\n fareFamiliesBounds,\n filteredInbounds,\n filteredOutbounds,\n flightSelectionGtmDataForAirBound,\n hasZeroBaggageOnEitherBound,\n inbounds,\n isOneWayBounds,\n lastRequestParams,\n outbounds,\n selectedAirBoundIds,\n selectedAirBoundsTicketSortBy,\n selectedInboundAirBound,\n selectedInboundAirBoundId,\n selectedInboundBound,\n selectedInboundFareFamilyBenefits,\n selectedInboundItinerary,\n selectedOutboundAirBound,\n selectedOutboundAirBoundId,\n selectedOutboundBound,\n selectedOutboundFareFamilyBenefits,\n selectedOutboundItinerary,\n} from '../../../store/selectors';\nimport { BookingQueueService, BookingService } from '../../../services';\nimport { BookingGtmService } from '../../../services/booking-gtm.service';\nimport { LocationNames } from '../interfaces';\nimport { BookingAirBoundsService, TicketSelectionParams } from '../services';\nimport { containsOnlyOneCabin, getHighestCabinClass } from '../utils/offer.utils';\nimport { resetOutboundCache } from '../../../store/actions/bounds.actions';\n\nexport const offerListSortMap: { [id: string]: string } = Object.freeze({\n [SortBy.DURATION]: 'default',\n [SortBy.PRICE]: 'price',\n [SortBy.ARRIVAL]: 'arrivalTime',\n [SortBy.DEPARTURE]: 'departureTime',\n});\n\nconst matchesCampaignFareFamily = (ffCode: string) => ffCode.includes('CAMP');\n\ninterface ItineraryAndUpgradesModalState {\n open: boolean;\n data: BoundInfos;\n}\n\ninterface DimensionsAndDetailsModalState {\n open: boolean;\n data: DimensionsAndDetails;\n}\n\ninterface ContinueModalState {\n open: boolean;\n data: ContinueModalData;\n}\n\ninterface ContinueModalV2State {\n open: boolean;\n data: {\n contentUrlTranslationKey?: string;\n };\n}\n\ninterface PromoCodeModalState {\n open: boolean;\n title: string;\n terms: string;\n promoCode: string;\n}\n\ntype BoundInfos = {\n outbound?: FinnairBoundItemWithLocation;\n inbound?: FinnairBoundItemWithLocation;\n availableClasses?: { [segmentId: string]: FinnairCabinClass[] };\n};\n\ntype ContinueModalData = {\n /**\n * Whether to show the zeroBaggage warning for the ticket type\n */\n zeroBaggage: boolean;\n contentUrlTranslationKey?: string;\n};\n\nconst fragmentKey = 'fragments.multiCityError.url';\n\n@Component({\n selector: 'fin-air-bounds-booking-ticket-selection-view',\n templateUrl: './air-bounds-booking-ticket-selection-view.component.html',\n styleUrls: ['./air-bounds-booking-ticket-selection-view.component.scss'],\n})\nexport class AirBoundsBookingTicketSelectionViewComponent implements OnDestroy, OnInit {\n readonly AirOffersStatus = AirOffersStatus;\n readonly BoundType = BoundType;\n readonly SelectionPhase = SelectionPhase;\n readonly ModalButtons = ModalButtons;\n readonly LoaderType = LoaderType;\n readonly ButtonPosition = ButtonPosition;\n readonly NotificationTheme = NotificationTheme;\n readonly ButtonTheme = ButtonTheme;\n readonly TabLayoutType = TabLayoutType;\n readonly SortBy = SortBy;\n\n outbounds$: Observable;\n inbounds$: Observable;\n currencyCode$: Observable;\n boundsStatus$: Observable;\n departureDate$: Observable;\n returnDate$: Observable;\n isOneWayBounds$: Observable;\n selectedOutbound$: Observable;\n selectedInbound$: Observable;\n selectedOutboundAirBoundId$: Observable;\n selectedOutboundAirBoundIdValue: string;\n selectedInboundAirBoundId$: Observable;\n selectedInboundAirBoundIdValue: string;\n selectedOutboundFareFamilyBenefits$: Observable;\n selectedInboundFareFamilyBenefits$: Observable;\n selectedOutboundItinerary$: Observable;\n selectedInboundItinerary$: Observable;\n paxAmount$: Observable;\n hasFlightsInTheUnitedStates$: Observable;\n fareFamilies$: Observable;\n tripLocations$: Observable;\n\n /**\n * Whether or not the bounds have been selected (both for two-way and the outbound for one-way trips.)\n */\n boundsSelected$: Observable;\n locations$: Observable;\n showKoreaNotification$: Observable;\n SEATS_LEFT_LIMIT = 9;\n selectedBoundsPrice$: Observable;\n TripType = TripType;\n\n itineraryAndUpgradesModal: ItineraryAndUpgradesModalState = {\n open: false,\n data: {},\n };\n\n dimensionsAndDetailsModal: DimensionsAndDetailsModalState = {\n open: false,\n data: null,\n };\n\n continueModal: ContinueModalState = {\n open: false,\n data: null,\n };\n\n continueModalV2: ContinueModalV2State = {\n open: false,\n data: null,\n };\n\n promoCodeModal$: Observable = of({\n open: false,\n title: null,\n terms: null,\n promoCode: null,\n });\n\n // == SELECTION PHASE ==\n selectionPhase$: BehaviorSubject = new BehaviorSubject(SelectionPhase.OUTBOUND);\n continueEnabled$: Observable;\n continueButtonClicks$: Subject = new Subject();\n\n // == SORTING ==\n sortByPriceOrDuration$: Observable;\n inboundIdSortOrder$: Observable;\n outboundIdSortOrder$: Observable;\n isShortHaulFlight$: Observable;\n\n @Input()\n goToOutboundPhase$: Observable;\n\n @Output()\n refetchOffers: EventEmitter = new EventEmitter();\n\n @Output()\n selectionPhaseChange: EventEmitter = new EventEmitter();\n\n @ViewChild('tabs', { static: false })\n tabs: TabsComponent;\n\n promoCode$: Observable;\n multicityErrorNotification$: Observable;\n tripType$: Observable;\n upgradeTabSelected$: Observable;\n boundsSortBy$: Observable;\n\n activeTab$ = new Subject();\n private openBoundClick$ = new Subject<{ bound: FinnairBoundGroupWithLocation; boundType: BoundType }>();\n private subscription = new Subscription();\n\n upgradeAvailabilityEnabled = false;\n enableTicketTypeUpselling = false;\n isLoading: boolean;\n enableNewLanguageSelector: boolean;\n enableNewStepper: boolean;\n showOutboundFilters$: Observable;\n showInboundFilters$: Observable;\n\n // This is actuallly the variable that knows which sorting tab has been selected\n // But since the information is not needed/used outside this component,this hack\n // of this component knowing the truth, and the var (sortByPriceOrDuration$)\n // that comes from the bounds state via selector showing only part-truth, has been ok\n selectedSortCriteria$ = of(SortBy.BEST);\n shouldReload: boolean = true;\n activeCabinClassNotificationIds: string[] = [];\n showContinueButton$ = of(true);\n\n constructor(\n private router: Router,\n private bookingQueueService: BookingQueueService,\n private airBoundsService: BookingAirBoundsService,\n private languageService: LanguageService,\n private store$: Store,\n private gtmService: GtmService,\n private bookingGtmService: BookingGtmService,\n private bookingService: BookingService,\n private scrollService: ScrollService,\n private toasterService: ToasterService,\n private cmsDataService: CmsDataService,\n private fragmentService: FragmentService,\n private configService: ConfigService,\n @Inject(PLATFORM_ID) private platform: object,\n private cdr: ChangeDetectorRef,\n private dimensionsAndDetailsService: DimensionsAndDetailsModalService,\n private activatedRoute: ActivatedRoute,\n private pageMetaService: PageMetaService,\n private sentryLogger: SentryLogger,\n private nativeBridgeService: NativeBridgeService,\n private bookingWidgetService: BookingWidgetService,\n private mediaQueryService: MediaQueryService\n ) {}\n\n ngOnInit(): void {\n this.store$.dispatch(resetOutboundCache());\n\n this.subscription.add(\n this.store$.pipe(outbounds(), filter(Boolean)).subscribe(() => {\n this.shouldReload = false;\n })\n );\n this.subscription.add(\n this.store$.pipe(inbounds(), filter(Boolean)).subscribe(() => {\n this.shouldReload = false;\n })\n );\n\n this.subscription.add(\n this.goToOutboundPhase$?.subscribe(() => {\n const selectionPhase = this.selectionPhase$.getValue();\n if (selectionPhase === SelectionPhase.INBOUND) {\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n }\n })\n );\n\n this.subscription.add(\n this.selectionPhase$.pipe(distinctUntilChanged()).subscribe((selectionPhase) => {\n this.selectionPhaseChange.emit(selectionPhase);\n })\n );\n\n this.upgradeAvailabilityEnabled = this.configService.cfg.enableUpgradeAvailabilityInBooking;\n this.enableTicketTypeUpselling = this.configService.cfg.enableTicketTypeUpselling;\n this.upgradeTabSelected$ = this.activeTab$.pipe(\n distinctUntilChanged(),\n map((index) => index === 1),\n tap(\n (upgradeTabOpen) =>\n upgradeTabOpen &&\n this.gtmService.trackElement(\n 'upgrade-availability::open_modal',\n GaContext.BOOKING_FLOW,\n ElementTypes.MODAL,\n undefined,\n ElementActions.VIEW\n )\n )\n );\n\n this.enableNewLanguageSelector = !this.nativeBridgeService.isInsideNativeWebView;\n\n this.enableNewStepper = this.configService.cfg.enableNewStepper;\n\n const outboundBase$ = this.store$.pipe(filteredOutbounds(), filter(Boolean), finShare());\n const inboundBase$ = this.store$.pipe(filteredInbounds(), filter(Boolean), finShare());\n\n const hasSpecialOutbounds$: Observable = outboundBase$.pipe(\n map((bounds) => Object.keys(bounds.fareFamilies).some((ffCode) => matchesCampaignFareFamily(ffCode))),\n finShare()\n );\n\n const hasSpecialInbounds$: Observable = inboundBase$.pipe(\n map((bounds) => Object.keys(bounds.fareFamilies).some((ffCode) => matchesCampaignFareFamily(ffCode))),\n finShare()\n );\n\n this.outbounds$ = combineLatest([outboundBase$, hasSpecialOutbounds$]).pipe(\n map(([bounds, hasSpecial]) => (hasSpecial ? this.mapSpecialOffersStatusToBounds(bounds) : bounds)),\n finShare()\n );\n\n this.inbounds$ = combineLatest([inboundBase$, hasSpecialInbounds$]).pipe(\n map(([bounds, hasSpecial]) => (hasSpecial ? this.mapSpecialOffersStatusToBounds(bounds) : bounds)),\n finShare()\n );\n\n this.showKoreaNotification$ = this.outbounds$.pipe(\n map((bounds) => {\n const location = bounds.locations[bounds.request.itineraries[0].departureLocationCode];\n return location && location.countryCode === CountryCode.KOREA;\n }),\n finShare()\n );\n this.showOutboundFilters$ = this.store$.pipe(\n outbounds(),\n filter(Boolean),\n map((bounds) => bounds.boundGroups.length > 3),\n finShare()\n );\n this.showInboundFilters$ = this.store$.pipe(\n inbounds(),\n filter(Boolean),\n map((bounds) => bounds.boundGroups.length > 3),\n finShare()\n );\n this.multicityErrorNotification$ = this.fragmentService.getFragment(fragmentKey);\n this.currencyCode$ = this.store$.pipe(boundsCurrency());\n this.boundsStatus$ = this.store$.pipe(boundsStatus());\n this.isOneWayBounds$ = this.store$.pipe(isOneWayBounds());\n this.departureDate$ = this.store$.pipe(airBoundsLastRequestDepartureDate());\n this.returnDate$ = this.store$.pipe(airBoundsLastRequestReturnDate());\n this.fareFamilies$ = this.store$.pipe(fareFamiliesBounds());\n\n this.tripLocations$ = this.boundsStatus$.pipe(\n withLatestFrom(this.store$.pipe(globalBookingFlights())),\n map(([_, locations]) =>\n locations.map(({ destination, origin }) => ({\n destination: destination.cityName,\n origin: origin.cityName,\n }))\n )\n );\n\n this.tripType$ = this.store$\n .pipe(globalBookingFlights())\n .pipe(map((flights) => getTripTypeFromGlobalBookingFlights(flights)));\n\n this.hasFlightsInTheUnitedStates$ = combineLatest([this.outbounds$, this.inbounds$]).pipe(\n map(\n ([out, inb]) =>\n (isPresent(out) && out.hasFlightsInUnitedStates) || (isPresent(inb) && inb.hasFlightsInUnitedStates)\n ),\n finShare()\n );\n\n //check\n this.subscription.add(\n this.boundsStatus$.pipe(distinctUntilChanged()).subscribe((status) => {\n if (status === AirOffersStatus.PENDING) {\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n this.shouldReload = true;\n }\n })\n );\n this.subscription.add(\n this.boundsStatus$\n .pipe(\n filter((s) => s === AirOffersStatus.ERROR || s === AirOffersStatus.NO_FLIGHTS_FOUND),\n distinctUntilChanged()\n )\n .subscribe(() => {\n // Reset the phase to Outbound in case of error\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n })\n );\n this.subscription.add(\n this.selectionPhase$.subscribe((selectionPhase) => {\n if (selectionPhase === SelectionPhase.INBOUND) {\n this.shouldReload = true;\n }\n })\n );\n this.boundsSelected$ = this.store$.pipe(boundSelectionsDone());\n\n // the bounds that have boundFareFamilies\n this.selectedOutbound$ = this.store$.pipe(selectedOutboundBound());\n this.selectedInbound$ = this.store$.pipe(selectedInboundBound());\n\n this.selectedOutboundAirBoundId$ = this.store$.pipe(selectedOutboundAirBoundId());\n this.selectedInboundAirBoundId$ = this.store$.pipe(selectedInboundAirBoundId());\n\n this.selectedOutboundFareFamilyBenefits$ = this.store$.pipe(selectedOutboundFareFamilyBenefits());\n this.selectedInboundFareFamilyBenefits$ = this.store$.pipe(selectedInboundFareFamilyBenefits());\n this.selectedOutboundItinerary$ = this.store$.pipe(selectedOutboundItinerary());\n this.selectedInboundItinerary$ = this.store$.pipe(selectedInboundItinerary());\n\n this.locations$ = combineLatest([this.outbounds$, this.inbounds$.pipe(startWith(null))]).pipe(\n map(([outbounds, inbounds]) => ({\n ...outbounds.locations,\n ...inbounds?.locations,\n })),\n finShare()\n );\n\n this.paxAmount$ = this.outbounds$.pipe(\n map(\n ({\n request: {\n travelers: { adults = 0, c15s = 0, children = 0, infants = 0 },\n },\n }) => ({\n adults,\n c15s,\n children,\n infants,\n })\n )\n );\n\n // if we have original prices, the promotion code has been applied\n const outboundHasDiscount$ = this.outbounds$.pipe(\n map((bounds) => bounds?.boundGroups.some((group) => group.fareFamilies.some((ff) => ff.originalPrice)))\n );\n\n const promoCode$: Observable = this.store$.pipe(\n lastRequestParams(),\n filter(Boolean),\n map((params: TicketSelectionParams) => params?.promoCode || null)\n );\n\n this.promoCode$ = combineLatest([promoCode$, outboundHasDiscount$]).pipe(\n filter(([promoCode, hasDiscount]) => isPresent(promoCode) && !!hasDiscount),\n map(([promoCode]) => promoCode),\n distinctUntilChanged()\n );\n\n this.isShortHaulFlight$ = this.outbounds$.pipe(\n map((bounds) =>\n bounds.request.itineraries.every((i) => {\n const departureLocation = bounds.locations[i.departureLocationCode];\n const destinationLocation = bounds.locations[i.destinationLocationCode];\n return isShortHaulFlight(departureLocation, destinationLocation);\n })\n )\n );\n\n this.subscription.add(\n this.promoCode$.subscribe((promoCode) => {\n this.trackPromoCodeEvent(promoCode, true);\n })\n );\n\n this.subscription.add(\n this.selectedOutboundAirBoundId$.subscribe((id) => {\n this.selectedOutboundAirBoundIdValue = id;\n })\n );\n\n this.subscription.add(\n this.selectedInboundAirBoundId$.subscribe((id) => {\n this.selectedInboundAirBoundIdValue = id;\n })\n );\n\n this.promoCodeModal$ = this.boundsStatus$.pipe(\n filter((s) => s !== AirOffersStatus.PENDING && s !== AirOffersStatus.INITIAL),\n withLatestFrom(promoCode$, outboundHasDiscount$),\n filter(([, promoCode, hasDiscount]) => isPresent(promoCode) && !hasDiscount),\n switchMap(([, promoCode]) => {\n this.trackPromoCodeEvent(promoCode, false);\n return this.cmsDataService\n .getPromoCodeTerms(promoCode, this.languageService.langValue, this.languageService.localeValue)\n .pipe(\n map((terms) => {\n return {\n open: !!terms,\n terms: terms?.description,\n title: terms?.title,\n promoCode: promoCode,\n };\n })\n );\n }),\n finShare()\n );\n\n // == SORTING ==\n // This is supposed to be the variable that tells which sort tab is selected\n // but actually it can be only SortBy.PRICE or SortBy.DURATION, so therefore the name\n this.sortByPriceOrDuration$ = this.store$.pipe(selectedAirBoundsTicketSortBy());\n this.outboundIdSortOrder$ = combineLatest([this.outbounds$, this.sortByPriceOrDuration$]).pipe(\n filter(([o]) => !!o?.sorting?.boundGroups),\n map(([bounds, sortBy]): string[] => bounds.sorting.boundGroups[offerListSortMap[sortBy]])\n );\n this.inboundIdSortOrder$ = combineLatest([this.inbounds$, this.sortByPriceOrDuration$]).pipe(\n filter(([i]) => !!i?.sorting?.boundGroups),\n map(([bounds, sortBy]): string[] => bounds.sorting.boundGroups[offerListSortMap[sortBy]])\n );\n\n // Scroll to top and remove toaster messages on every phase change\n this.subscription.add(\n this.selectionPhase$.pipe(filter(() => isPlatformBrowser(this.platform))).subscribe(() => {\n this.scrollService.scrollTop();\n if (this.activeCabinClassNotificationIds.length) {\n this.activeCabinClassNotificationIds.forEach((id) => this.toasterService.removeMessage(id));\n this.activeCabinClassNotificationIds = [];\n }\n })\n );\n\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n switchMap((selectionPhase) =>\n this.store$.pipe(\n selectionPhase === SelectionPhase.OUTBOUND ? selectedOutboundAirBound() : selectedInboundAirBound()\n )\n ),\n filter(Boolean),\n filter(({ fareInformation }) => !containsOnlyOneCabin(fareInformation)),\n distinctUntilChanged((fare1, fare2) => fare1.id === fare2.id),\n withLatestFrom(\n this.selectionPhase$.pipe(\n switchMap((selectionPhase) => {\n return selectionPhase === SelectionPhase.OUTBOUND ? this.selectedOutbound$ : this.selectedInbound$;\n })\n ),\n this.locations$\n ),\n switchMap(([selectedFareFamily, selectedBound, locations]) => {\n const { fareInformation } = selectedFareFamily;\n const businessFaultySegments =\n !containsOnlyOneCabin(fareInformation, GlobalBookingTravelClass.BUSINESS) &&\n fareInformation.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.BUSINESS);\n\n const ecoPremiumFaultySegments =\n !containsOnlyOneCabin(fareInformation, GlobalBookingTravelClass.ECOPREMIUM) &&\n fareInformation.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.ECOPREMIUM);\n\n const faultySegments =\n isPresent(businessFaultySegments) && businessFaultySegments.length === 1\n ? businessFaultySegments\n : isPresent(ecoPremiumFaultySegments) && ecoPremiumFaultySegments.length === 1\n ? ecoPremiumFaultySegments\n : undefined;\n\n const params: LocationNames = {};\n if (faultySegments) {\n // find the origin and destination for the faulty segment.\n const [fs] = faultySegments;\n const [segment] = selectedBound.details.itinerary\n .filter(isFlight)\n .filter((seg) => seg.id === fs.segmentId);\n\n params.origin = locations[segment.departure.locationCode].cityName;\n params.destination = locations[segment.arrival.locationCode].cityName;\n }\n\n return combineLatest([\n this.selectedOutbound$,\n this.selectedInbound$,\n this.languageService.translate(\n businessFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassWarningNew'\n : ecoPremiumFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassPremiumEconomyWarningNew'\n : 'ticketSelection.differentCabinClassComplexWarning',\n params\n ),\n this.languageService.translate('ticketSelection.differentCabinClassWarningLink.linkText'),\n of(selectedFareFamily),\n ]);\n }),\n distinctUntilChanged((previous, next) => previous[4]?.id === next[4]?.id),\n finShare()\n )\n .subscribe(([selectedOutbound, selectedInbound, notificationText, linkText]) => {\n const selectionPhase = this.selectionPhase$.getValue();\n\n if (this.activeCabinClassNotificationIds.length) {\n this.activeCabinClassNotificationIds.forEach((id) => this.toasterService.removeMessage(id));\n }\n\n const id = uuid();\n\n const delay = this.activeCabinClassNotificationIds.length > 0;\n\n this.activeCabinClassNotificationIds = [id];\n\n this.toasterService.addMessageToQueue({\n id,\n content: notificationText,\n theme: NotificationTheme.WARNING,\n target: {\n linkText: linkText,\n callback: () => {\n this.showDetailsModal(\n selectionPhase === SelectionPhase.OUTBOUND ? selectedOutbound?.details : null,\n selectionPhase === SelectionPhase.INBOUND ? selectedInbound?.details : null,\n selectionPhase,\n selectionPhase === SelectionPhase.OUTBOUND\n ? selectedOutbound?.fareFamilies\n : selectedInbound?.fareFamilies\n );\n this.activeCabinClassNotificationIds = this.activeCabinClassNotificationIds.filter(\n (storedId) => storedId !== id\n );\n },\n },\n keepMessageAfterNavigation: false,\n delay,\n });\n })\n );\n\n /**\n * gtm error event based on boundsStatus error\n */\n this.subscription.add(\n combineLatest([this.boundsStatus$, this.store$.pipe(globalBookingSelections())])\n .pipe(\n filter(\n ([boundsStatus]) =>\n boundsStatus === AirOffersStatus.ERROR ||\n boundsStatus === AirOffersStatus.INVALID_INPUT ||\n boundsStatus === AirOffersStatus.NO_FLIGHTS_FOUND\n ),\n distinctUntilChanged((prev, next) => prev[0] === next[0] && isDeepEqual(prev[1], next[1]))\n )\n .subscribe(([boundsStatus, selection]) => {\n const isValidSelection = selection.flights.some((f) => isPresent(f?.origin) && isPresent(f?.destination));\n const flightsToFlightSearchParams: FlightSegment[] = isValidSelection\n ? selection.flights.map((f) => ({\n origin: f.origin?.locationCode,\n destination: f.destination.locationCode,\n departureDate: f.departureDate,\n }))\n : [];\n\n this.gtmService.errorEvent(AirOffersStatusToText[boundsStatus], flightsToFlightSearchParams);\n })\n );\n\n this.setUpContinueButton();\n this.setUpGtmEventTracking();\n this.setUpAlternativeSegmentNotifier();\n this.handleBoundsPreSelection();\n this.setupUpgradeOffer();\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n this.store$.dispatch(resetOutboundCache());\n this.store$.dispatch(BoundsActions.reset());\n }\n\n trackPromoCodeEvent(promoCode: string, isApplied: boolean): void {\n this.gtmService.trackElement(\n `promo-code_${isApplied ? 'applied' : 'not-applied'}`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.NOTIFICATION,\n promoCode,\n ElementActions.VIEW\n );\n }\n\n handleBoundsPreSelection(): void {\n const selectedOutboundAirBound$ = this.store$.pipe(selectedOutboundAirBound());\n const queryParams = this.airBoundsService.getLastRequestParams();\n\n if (queryParams.departureFlightNumbers) {\n // if outbound flight is selected, but inbound is not selected\n this.subscription.add(\n selectedOutboundAirBound$\n .pipe(filter(Boolean), take(1), delay(0), withLatestFrom(this.isOneWayBounds$, this.isShortHaulFlight$))\n .subscribe(([outbound, isOneWay, isShortHaul]: [FinnairBoundFareFamily, boolean, boolean]) => {\n if (isOneWay) {\n this.createCart(isShortHaul);\n this.continueToNextStep();\n } else {\n this.airBoundsService.getReturnBounds(outbound.id, outbound.fareFamilyCode);\n }\n })\n );\n\n // if both outbound and inbound flights are selected\n this.subscription.add(\n combineLatest([this.selectedOutboundAirBoundId$, this.selectedInboundAirBoundId$])\n .pipe(\n filter(([outboundId, inboundId]) => !isUndefined(outboundId) && !isUndefined(inboundId)),\n take(1),\n switchMap(() => this.isShortHaulFlight$)\n )\n .subscribe((isShortHaul) => {\n this.createCart(isShortHaul);\n this.bookingService.setStep({ step: BOOKING_STEPS.PAXDETAILS });\n })\n );\n }\n }\n\n setUpGtmEventTracking(): void {\n this.subscription.add(\n this.openBoundClick$\n .pipe(\n switchMap(({ bound, boundType }: { bound: FinnairBoundGroupWithLocation; boundType: BoundType }) =>\n this.store$.pipe(\n globalBookingPaxAmount(),\n switchMap((paxAmount: PaxAmount) =>\n this.store$.pipe(flightSelectionGtmDataForAirBound(bound, boundType, paxAmount))\n ),\n take(1),\n withLatestFrom(this.store$.pipe(profileOrNot())),\n map(([gtmData, profile]) =>\n profile?.tier === ProfileTier.CORPORATE\n ? gtmData.map((d) => ({ ...d, purchaseFlow: GtmPurchaseFlow.CORPORATE }))\n : gtmData\n )\n )\n )\n )\n .subscribe((gtmFlightSelectionData: GtmFlightSelectionData[]) => {\n this.gtmService.flightSelection(GtmEvent.FLIGHT_SELECTION_VIEW, gtmFlightSelectionData);\n })\n );\n\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n switchMap((phase) =>\n (phase === SelectionPhase.OUTBOUND ? this.outbounds$ : this.inbounds$).pipe(\n map((bound) =>\n bound.boundGroups.find(({ fareFamilies }) =>\n fareFamilies.find((fare) => fare.quota < this.SEATS_LEFT_LIMIT)\n )\n )\n )\n ),\n map(isPresent)\n )\n .subscribe((isSeatsLeftShown) => {\n this.gtmService.trackElement(\n 'seat-notification-shown',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.LINK,\n isSeatsLeftShown.toString(),\n ElementActions.VIEW\n );\n })\n );\n\n this.subscription.add(\n this.outbounds$.pipe(distinctUntilChanged()).subscribe((outboundFlights) => {\n this.gtmService.trackElement(\n 'outbound-flights-shown-revenue',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.ACCORDION,\n outboundFlights.boundGroups.length.toString(),\n ElementActions.VIEW\n );\n })\n );\n\n this.subscription.add(\n this.inbounds$.pipe(distinctUntilChanged()).subscribe((inboundFlights) => {\n this.gtmService.trackElement(\n 'inbound-flights-shown-revenue',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.ACCORDION,\n inboundFlights.boundGroups.length.toString(),\n ElementActions.VIEW\n );\n })\n );\n }\n\n setUpContinueButton(): void {\n const selectedOutboundAirBound$ = this.store$.pipe(selectedOutboundAirBound());\n const selectedInboundAirBound$ = this.store$.pipe(selectedInboundAirBound());\n\n const currentQuota$ = this.selectionPhase$.pipe(\n switchMap((phase) => (phase === SelectionPhase.OUTBOUND ? selectedOutboundAirBound$ : selectedInboundAirBound$)),\n map((fareFamily) => fareFamily?.quota ?? this.SEATS_LEFT_LIMIT)\n );\n\n this.subscription.add(\n this.continueButtonClicks$\n .pipe(\n withLatestFrom(currentQuota$),\n map(([, currentQuota]) => currentQuota),\n filter((currentQuota) => currentQuota < this.SEATS_LEFT_LIMIT)\n )\n .subscribe((currentQuota) => {\n this.gtmService.trackElement(\n 'seat-notification-chosen',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.BUTTON,\n currentQuota.toString(),\n ElementActions.CLICK\n );\n })\n );\n\n this.subscription.add(\n this.continueButtonClicks$\n .pipe(\n withLatestFrom(this.isOneWayBounds$, this.selectionPhase$, selectedOutboundAirBound$, this.isShortHaulFlight$)\n )\n .subscribe(this.respondToContinueClick())\n );\n\n this.subscription.add(\n this.continueButtonClicks$.subscribe(() => {\n this.bookingGtmService.sendFlightSelectionDataCloud();\n })\n );\n\n this.showContinueButton$ = combineLatest([\n this.store$.pipe(pseudoLocal(GLOBAL_BOOKING_WIDGET_EXPANDER_KEY)),\n this.mediaQueryService.isBreakpoint$('tablet_down'),\n ]).pipe(\n distinctUntilChanged((pre, next) => equals(pre, next)),\n map(\n ([status, isTabletDown]) =>\n status !== `${GLOBAL_BOOKING_WIDGET_EXPANDER_KEY}-${ExpanderStatus.OPEN}` || !status || !isTabletDown\n )\n );\n\n this.continueEnabled$ = this.selectionPhase$.pipe(\n switchMap((phase: SelectionPhase): Observable => {\n if (phase === SelectionPhase.OUTBOUND) {\n return this.selectedOutboundAirBoundId$.pipe(startWith(undefined as string));\n }\n if (phase === SelectionPhase.INBOUND) {\n return this.selectedInboundAirBoundId$.pipe(startWith(undefined as string));\n }\n return of(true);\n }),\n map(isPresent),\n distinctUntilChanged()\n );\n\n this.selectedBoundsPrice$ = this.store$.pipe(boundsTotalPrice());\n }\n\n private respondToContinueClick(): (\n value: [boolean, boolean, SelectionPhase, FinnairBoundFareFamily, boolean]\n ) => void {\n return ([_, isOneWay, phase, { id, fareFamilyCode }, isShortHaulFlight]) => {\n const isAtOutboundSelection = phase === SelectionPhase.OUTBOUND;\n const shouldDisplayInboundView = isAtOutboundSelection && !isOneWay;\n\n if (shouldDisplayInboundView) {\n // Keep other filters, but reset time filters\n this.store$.dispatch(BoundsActions.resetArrivalTime());\n this.store$.dispatch(BoundsActions.resetDepartureTime());\n\n this.airBoundsService.getReturnBounds(id, fareFamilyCode);\n this.selectionPhase$.next(SelectionPhase.INBOUND);\n return;\n }\n\n this.createCart(isShortHaulFlight);\n };\n }\n\n setUpAlternativeSegmentNotifier(): void {\n this.subscription.add(\n merge(this.store$.pipe(selectedOutboundAirBound()), this.store$.pipe(selectedInboundAirBound()))\n .pipe(\n filter(Boolean),\n withLatestFrom(\n this.languageService.translate('ticketSelection.travelClassAlternative'),\n this.store$.pipe(airBoundsRequest())\n )\n )\n .subscribe(([{ fareInformation }, notificationText, { cabin }]) => {\n if (cabin !== Cabin.MIXED) {\n const hasTravelType = fareInformation.some(\n (fareInformation: FareInformation) => fareInformation.cabinClass === cabin\n );\n if (!hasTravelType) {\n this.toasterService.addMessageToQueue({\n id: 'travel-class-alternative',\n content: notificationText,\n });\n }\n }\n })\n );\n }\n\n setupUpgradeOffer(): void {\n if (!this.configService.cfg.enableUpgradeTravelClass) {\n return;\n }\n this.subscription.add(\n combineLatest([\n this.selectedOutbound$,\n this.selectedInbound$,\n this.selectedOutboundAirBoundId$,\n this.selectedInboundAirBoundId$,\n this.fareFamilies$,\n this.isOneWayBounds$,\n ])\n .pipe(\n filter(([_outbound, _inbound, outboundId, inboundId, _fareFamilies, isOneWay]) => {\n return isOneWay ? isPresent(outboundId) : isPresent(inboundId);\n })\n )\n .subscribe((params) => {\n this.triggerUpgradeOffer(params);\n })\n );\n }\n\n triggerUpgradeOffer(\n params: [\n FinnairBoundGroupWithLocation,\n FinnairBoundGroupWithLocation,\n string,\n string,\n FinnairAirBounds['fareFamilies'],\n boolean,\n ]\n ): void {\n const [outbound, inbound, selectedOutboundId, selectedInboundId, fareFamilies] = params;\n const selectedOutboundFareFamily = outbound.fareFamilies.find((ff) => ff.id === selectedOutboundId);\n const selectedInboundFareFamily = inbound?.fareFamilies.find((ff) => ff.id === selectedInboundId);\n const outboundUpgrade = this.getUpgradeFareFamily(selectedOutboundFareFamily, outbound);\n if (!outboundUpgrade?.upgradeFareFamily) {\n return;\n }\n\n const inboundUpgrade = selectedInboundFareFamily\n ? this.getUpgradeFareFamily(selectedInboundFareFamily, inbound)\n : null;\n\n const currentFareFamily = fareFamilies[selectedOutboundFareFamily.fareFamilyCode];\n const upgradeFareFamily = fareFamilies[outboundUpgrade.upgradeFareFamily.fareFamilyCode];\n\n if (!this.hasMatchingBrandName(!!inbound, outboundUpgrade, inboundUpgrade, fareFamilies)) {\n this.store$.dispatch(UpgradeOfferActions.clearUpgradeOffer());\n return;\n }\n\n const totalPrice = [outboundUpgrade, inboundUpgrade].reduce((acc: number, off: UpgradeOffer) => {\n const ff = off?.upgradeFareFamily;\n if (!ff?.price) {\n return acc;\n }\n return acc + parseFloat(ff.price);\n }, 0);\n const offer = {\n currentFareFamily,\n upgradeFareFamily,\n outboundId: outboundUpgrade.upgradeFareFamily.id,\n inboundId: inboundUpgrade?.upgradeFareFamily.id,\n timestamp: Date.now(),\n outboundPrice: selectedOutboundFareFamily.price,\n outboundUpgradePrice: outboundUpgrade.upgradeFareFamily.price,\n inboundPrice: selectedInboundFareFamily?.price,\n inboundUpgradePrice: inboundUpgrade?.upgradeFareFamily.price,\n totalUpgradePrice: totalPrice,\n };\n this.store$.dispatch(UpgradeOfferActions.setUpgradeOffer({ offer }));\n }\n\n hasMatchingBrandName(\n roundTrip: boolean,\n outboundUpgrade: UpgradeOffer,\n inboundUpgrade: UpgradeOffer,\n fareFamilies: FinnairAirBounds['fareFamilies']\n ): boolean {\n if (!roundTrip) {\n return true;\n }\n if (!inboundUpgrade) {\n return false;\n }\n const currentOutbound = fareFamilies[outboundUpgrade.currentFareFamily.fareFamilyCode];\n const currentInbound = fareFamilies[inboundUpgrade.currentFareFamily.fareFamilyCode];\n if (currentOutbound.brandName !== currentInbound.brandName) {\n return false;\n }\n\n const outboundNew = fareFamilies[outboundUpgrade.upgradeFareFamily.fareFamilyCode];\n const inboundNew = fareFamilies[inboundUpgrade.upgradeFareFamily.fareFamilyCode];\n return outboundNew.brandName === inboundNew.brandName;\n }\n\n /**\n * Returns fare family that is \"one step\" better than currently selected\n * fare family in current cabin class.\n * E.g.\n * Economy light -> Economy Classic\n * Economy flex -> null\n * Business classic -> Business flex\n * @param current\n * @param bound\n */\n getUpgradeFareFamily(current: FinnairBoundFareFamily, bound: FinnairBoundGroupWithLocation): UpgradeOffer | null {\n const cabinClass = getHighestCabinClass(current);\n const cabinClassShortCode = getCabinClassShortCode(cabinClass);\n\n /**\n * Fare family code can have optional A or S at the beginning (A for AJB bounds, S for SJB bounds),\n * next there is the cabin class code E / PE / B and after that there can be some campaign code before the actual\n * fare family code\n */\n let re: RegExp;\n const regExStart = `^[AS]{0,1}${cabinClassShortCode}.*`;\n if (current.fareFamilyCode.includes('LIGHT')) {\n re = new RegExp(regExStart + 'CLASI');\n } else if (current.fareFamilyCode.includes('CLASI')) {\n re = new RegExp(regExStart + 'FLEX');\n } else {\n return null;\n }\n const fareFamily = re ? bound.fareFamilies.find((ff) => re.test(ff.fareFamilyCode)) : null;\n if (!fareFamily) {\n return null;\n }\n return {\n currentFareFamily: current,\n upgradeFareFamily: fareFamily,\n };\n }\n\n backToDateSelection(): void {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n selectOutboundFareFamily(selectedFareFamily: { fareFamily: ExtendedFareFamily; checked: boolean }): void {\n this.store$.dispatch(\n BoundsActions.setOutboundAirBoundId({\n outboundAirBoundId: selectedFareFamily?.checked ? selectedFareFamily?.fareFamily?.id : null,\n })\n );\n\n this.updateDeeplinkOnFareFamilySelection(BoundType.outbound, selectedFareFamily?.fareFamily?.fareFamilyCode);\n }\n\n selectInboundFareFamily(selectedFareFamily: { fareFamily: ExtendedFareFamily; checked: boolean }): void {\n this.store$.dispatch(\n BoundsActions.setInboundAirBoundId({\n inboundAirBoundId: selectedFareFamily?.checked ? selectedFareFamily?.fareFamily?.id : null,\n })\n );\n\n this.updateDeeplinkOnFareFamilySelection(BoundType.inbound, selectedFareFamily?.fareFamily?.fareFamilyCode);\n }\n\n activateSelectionPhase(selectionPhase: SelectionPhase): void {\n this.selectionPhase$.next(selectionPhase);\n }\n\n onShowSpinner(): void {\n this.isLoading = true;\n\n setTimeout(() => {\n this.isLoading = false;\n this.cdr.detectChanges();\n }, 300);\n }\n\n selectSortBy(sortBy: SortBy): void {\n // We don't dispatch an action on best, because something somewhere makes a new BE call if we dispatch the SortBy.BEST\n // This also affects the naming of this.sortByPriceOrDuration$, because that var won't return SortBy.BEST\n if (sortBy !== SortBy.BEST) {\n this.store$.dispatch(BoundsActions.setSortBy({ sortBy }));\n }\n\n this.selectedSortCriteria$ = of(sortBy);\n this.onShowSpinner();\n }\n\n onContinueClick(event: Event): void {\n stopPropagation(event);\n // dispatch the original selection from booking widget service\n this.bookingWidgetService.setGlobalBookingSelectionToOriginal();\n this.continueButtonClicks$.next(true);\n }\n\n createCart(isShortHaulFlight: boolean): void {\n const bounds: string[] = snapshot(this.store$.pipe(selectedAirBoundIds()));\n // TODO: Validate that both bounds have been selected\n this.triggerCreateCart(bounds);\n const zeroBaggage: boolean = snapshot(this.store$.pipe(hasZeroBaggageOnEitherBound()));\n\n if (zeroBaggage && !this.enableTicketTypeUpselling) {\n const contentUrlTranslationKey =\n this.bookingService.getContentUrlTranslationKeySuperLightModalWindow(isShortHaulFlight);\n\n if (contentUrlTranslationKey) {\n this.openSuperLightWarningModal(contentUrlTranslationKey);\n }\n }\n if (!this.continueModalV2.open && !this.continueModal.open) {\n this.continueToNextStep();\n }\n }\n\n closeDimensionAndDetailsModal(): void {\n this.dimensionsAndDetailsService.closeModal();\n this.dimensionsAndDetailsModal = { open: false, data: null };\n }\n\n superLightWarningAnalytics(eventType: 'open' | 'close' | 'continue'): void {\n this.gtmService.trackElement(\n `baggage-superlight-modal-${eventType}`,\n 'flight-selection',\n ElementTypes.LINK,\n 'true',\n ElementActions.CLICK\n );\n }\n\n openSuperLightWarningModal(contentUrlTranslationKey: string): void {\n if (this.continueModalV2.open) {\n return;\n }\n this.continueModalV2 = {\n open: true,\n data: {\n contentUrlTranslationKey,\n },\n };\n this.superLightWarningAnalytics('open');\n }\n\n closeSuperLightWarningModal(): void {\n if (!this.continueModalV2.open) {\n return;\n }\n this.continueModalV2 = {\n open: false,\n data: null,\n };\n\n this.superLightWarningAnalytics('close');\n }\n\n continueSuperLightWarningModal(): void {\n if (!this.continueModalV2.open) {\n return;\n }\n this.continueModalV2 = {\n open: false,\n data: null,\n };\n\n this.superLightWarningAnalytics('continue');\n this.continueToNextStep();\n }\n\n closeModals(): void {\n this.itineraryAndUpgradesModal = { open: false, data: {} };\n this.continueModal = { open: false, data: null };\n this.continueModalV2 = { open: false, data: null };\n this.dimensionsAndDetailsModal = { open: false, data: null };\n this.promoCodeModal$ = of({ open: false, title: null, terms: null, promoCode: null });\n this.tabs.selectTab(this.tabs?.tabs[0]);\n }\n\n closeDiscountModal(): void {\n this.promoCodeModal$ = of({ open: false, title: null, terms: null, promoCode: null });\n this.store$.dispatch(GlobalBookingActions.setDiscountCode({ discountCode: null }));\n }\n\n continueToNextStep(): void {\n this.bookingService.setStep({ step: BOOKING_STEPS.PAXDETAILS });\n }\n\n showDetailsModal(\n outbound: FinnairBoundItemWithLocation,\n inbound: FinnairBoundItemWithLocation,\n selectionPhase: SelectionPhase,\n fareFamilies: FinnairBoundFareFamily[] = undefined\n ): void {\n const { cabin } = this.airBoundsService.getLastRequestParams();\n const availableClasses =\n fareFamilies && cabin === Cabin.MIXED ? this.getAvailableClasses(outbound || inbound, fareFamilies) : [];\n\n const outboundFareFamily = this.selectedOutboundAirBoundIdValue\n ? fareFamilies.find(({ id }) => id === this.selectedOutboundAirBoundIdValue)\n : null;\n const inboundFareFamily = this.selectedInboundAirBoundIdValue\n ? fareFamilies.find(({ id }) => id === this.selectedInboundAirBoundIdValue)\n : null;\n\n const selectedOutbound = snapshot(this.selectedOutbound$);\n const data = {\n outbound:\n selectionPhase === SelectionPhase.INBOUND\n ? selectedOutbound.details\n : this.getBoundWithCabinClass(outbound, outboundFareFamily),\n inbound: this.getBoundWithCabinClass(inbound, inboundFareFamily),\n availableClasses,\n };\n\n this.itineraryAndUpgradesModal = {\n open: true,\n data,\n };\n\n this.gtmService.trackElement(\n `${selectionPhase.toLowerCase()}::view-flight-details`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.LINK,\n undefined,\n ElementActions.CLICK\n );\n }\n\n handleShowDimensionsAndDetails($event: DimensionsAndDetails): void {\n this.dimensionsAndDetailsModal = {\n open: true,\n data: $event,\n };\n }\n\n handleShowCabinClassFareFamilies(cabinClass: string, selectionPhase: SelectionPhase): void {\n const lowerCaseCabinClass = cabinClass.toLocaleLowerCase();\n\n this.gtmService.trackElement(\n `${selectionPhase.toLowerCase()}::cabin-class-options-navigation`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.BUTTON,\n lowerCaseCabinClass,\n ElementActions.CLICK\n );\n }\n\n handleBoundOpen(bound: FinnairBoundGroupWithLocation, boundType: BoundType): void {\n this.openBoundClick$.next({ bound, boundType });\n }\n\n modifySearchSelection(): void {\n this.subscription.add(\n this.languageService.lang\n .pipe(\n take(1),\n map((lang) => `/${lang}`),\n withLatestFrom(this.tripType$)\n )\n .subscribe(([url, tripType]) => {\n if (tripType !== TripType.MULTICITY) {\n this.store$.dispatch(\n PseudoLocalActions.setValue({\n key: GLOBAL_BOOKING_WIDGET_EXPANDER_KEY,\n data: `${GLOBAL_BOOKING_WIDGET_EXPANDER_KEY}-${ExpanderStatus.OPEN}`,\n })\n );\n this.closeModals();\n } else {\n this.router.navigateByUrl(url);\n }\n })\n );\n }\n\n triggerLogin(): void {\n this.closeModals();\n this.store$.dispatch(LoginActions.setLoginPhaseStep({ step: LoginStep.CREDENTIALS }));\n }\n\n private triggerCreateCart(airBoundsIds: string[]): void {\n const boundsHashValue: string = snapshot(this.store$.pipe(boundsHash()));\n const locale = this.languageService.localeValue;\n this.bookingQueueService.queueCartCreateByBounds(airBoundsIds, locale, boundsHashValue);\n }\n\n private getAvailableClasses(bound: FinnairBoundItemWithLocation, fareFamilies: FinnairBoundFareFamily[]) {\n return bound.itinerary.filter(isFlight).reduce((acc, flight) => {\n acc[flight.id] = fareFamilies.reduce((classes, a) => {\n const { cabinClass } = a.fareInformation.find(({ segmentId }) => segmentId === flight.id);\n if (!classes.includes(cabinClass)) {\n classes.push(cabinClass);\n }\n return classes;\n }, []);\n return acc;\n }, {});\n }\n\n private mapSpecialOffersStatusToBounds(bounds: FinnairAirBounds): FinnairAirBounds {\n return {\n ...bounds,\n boundGroups: bounds?.boundGroups?.map((bg) => ({\n ...bg,\n hasSpecialOffers: bg.fareFamilies.some((ff) => matchesCampaignFareFamily(ff.fareFamilyCode)),\n fareFamilies: bg.fareFamilies?.map((ff) => ({\n ...ff,\n isSpecialOffer: matchesCampaignFareFamily(ff.fareFamilyCode),\n })),\n })),\n };\n }\n\n private updateDeeplinkOnFareFamilySelection(boundType: BoundType, fareFamilyCode: string): void {\n if (this.enableNewLanguageSelector) {\n this.subscription.add(\n combineLatest([\n boundType === BoundType.outbound ? this.selectedOutboundItinerary$ : this.selectedInboundItinerary$,\n this.activatedRoute.queryParams,\n ])\n .pipe(take(1))\n .subscribe(([selectedItinerary, params]) => {\n try {\n const deeplinkParams = JSON.parse(decodeURIComponent(params.json));\n\n const updatedParams = this.mergeParamsToDeeplink(\n boundType === BoundType.outbound ? 0 : 1,\n deeplinkParams,\n selectedItinerary,\n fareFamilyCode\n );\n\n const newUrl =\n this.router.url.replace(/\\?.+/, '') + '?json=' + encodeURIComponent(JSON.stringify(updatedParams));\n\n this.pageMetaService.prevPageUrl$.next(newUrl.replace(/^\\/[\\w-]+\\//, '/'));\n } catch (error) {\n this.sentryLogger.warn('Failed to parse deeplink', { params, error });\n }\n })\n );\n }\n }\n\n private mergeParamsToDeeplink(\n index: number,\n params: FinnairMultiCitySearchInterface,\n selectedItinerary: FinnairItineraryItemFlight[],\n fareFamilyCode: string\n ): FinnairMultiCitySearchInterface {\n return {\n ...params,\n flights: (params.flights || []).map((flight, flightIndex) =>\n flightIndex === index\n ? {\n ...flight,\n flightNumbers: selectedItinerary.map(({ flightNumber }) => flightNumber),\n fareFamily: fareFamilyCode,\n }\n : flight\n ),\n };\n }\n\n private getBoundWithCabinClass = (\n bound: FinnairBoundItemWithLocation | null,\n fareFamily: FinnairBoundFareFamily | null\n ): FinnairBoundItemWithLocation | null => {\n if (!isPresent(bound)) {\n return null;\n }\n\n const hasBoundAndDetails = isPresent(bound) && isPresent(fareFamily);\n\n return hasBoundAndDetails\n ? {\n ...bound,\n itinerary: bound.itinerary.map((flight) => {\n const fareInformation = fareFamily.fareInformation.find(\n (fareInfo) => fareInfo.segmentId === (flight as ItineraryItemFlight)?.id\n );\n return {\n ...flight,\n ...(isPresent(fareInformation) && {\n cabinClass: fareInformation?.cabinClass as FinnairCabinClass,\n bookingClass: fareInformation?.bookingClass,\n }),\n };\n }),\n }\n : bound;\n };\n}\n","
\n
\n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n {{\n ('travelClass.' + cabinClassFareFamily.cabinClass.toLowerCase() | finLocalization) ||\n ('travelClass.mixed' | finLocalization)\n }}:\n \n {{ 'ticketSelection.header.selectTicketTypeBelow' | finLocalization }}\n \n \n \n \n \n \n {{ cabinClassFareFamily.brandName }}\n \n \n
\n {{\n ('travelClass.' + cabinClassFareFamily.cabinClass.toLowerCase() | finLocalization) ||\n ('travelClass.mixed' | finLocalization)\n }}\n
\n
\n
\n
\n \n \n {{ 'leftSeatsAvailable' | finPluralLocalization: cabinClassFareFamily.quota }}\n \n \n {{ 'pricesStartingFrom' | finLocalization }}\n \n \n {{ { amount: cabinClassFareFamily.price, currencyCode: currencyCode$ | async } | finPrice }}\n \n \n {{ { amount: cabinClassFareFamily.originalPrice, currencyCode: currencyCode$ | async } | finPrice }}\n \n \n
\n
\n
\n \n\n \n \n
\n \n\n \n
\n \n \n \n {{ 'ticketSelection.baggageAndTicketTypeDetails' | finLocalization }}\n \n \n \n \n \n\n","import {\n AfterViewChecked,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, fromEvent, Observable, Subject, Subscription, switchMap } from 'rxjs';\nimport { debounceTime, delay, distinctUntilChanged, filter, map, withLatestFrom } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\n\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n adjustFareFamilyOptionHeight,\n getBrandNameShortCode,\n getCabinClassShortCode,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { ElementActions, ElementTypes, GaContext } from '@fcom/common';\nimport { TripType } from '@fcom/core/interfaces';\nimport { DimensionsAndDetails, ExtendedFareFamily, FareFamilyBadgeType } from '@fcom/common-booking';\nimport { StateSelector } from '@fcom/core/selectors/selector-utils';\nimport { FareFamily, FinnairAirBoundsResponse, FinnairBoundFareFamily, FinnairLocation } from '@fcom/dapi/api/models';\nimport { BoundType } from '@fcom/dapi/interfaces';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { isPresent, stopPropagation, unsubscribe } from '@fcom/core/utils';\nimport { Direction } from '@fcom/common/interfaces/utils.interface';\nimport { ScrollHandleContainerComponent } from '@fcom/common/components/scroll-handle-container/scroll-handle-container.component';\nimport { LocationRouteType } from '@fcom/core-api/interfaces';\nimport { BookingAppState, BookingFeatureState } from '@fcom/common/interfaces/booking';\nimport { isLongHaulLegAndAy } from '@fcom/common-booking/utils/flight.utils';\nimport { isShortHaulFlight } from '@fcom/common/utils';\nimport { globalBookingTripType } from '@fcom/common/store';\nimport { fareFamiliesWithoutCampaignFiltering } from '@fcom/common/config/booking-config';\n\nimport { DimensionsAndDetailsModalService } from '../../services/dimensions-and-details-modal.service';\nimport {\n fareFamiliesBounds,\n inboundsFareFamiliesSortingSelector,\n outboundsFareFamiliesSortingSelector,\n selectedInboundAirBound,\n selectedInboundAirBoundId,\n selectedOutboundAirBound,\n selectedOutboundAirBoundId,\n} from '../../../../store/selectors/bounds.selector';\nimport { CabinClassSelectionFareFamily, ExtendedBoundInfo } from '../../interfaces';\nimport {\n effectiveCabinClass,\n filterAndSortFareFamilyByCabinClass,\n getPreselectedFareFamily,\n} from '../../utils/offer.utils';\nimport { BookingService } from '../../../../services';\n\n@Component({\n selector: 'fin-fare-family-option-list',\n styleUrls: ['./fare-family-option-list.component.scss'],\n templateUrl: './fare-family-option-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AirBoundsFareFamilyOptionListComponent implements OnInit, OnDestroy, AfterViewChecked {\n readonly NotificationTheme = NotificationTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly GaContext = GaContext;\n readonly SEATS_LEFT_LIMIT = 9;\n\n @Input()\n bound$: Observable;\n @Input()\n boundType: BoundType;\n @Input()\n currencyCode$: Observable;\n @Input()\n locations$: Observable<{ [key: string]: FinnairLocation }>;\n\n @Output()\n selectFareFamily: EventEmitter = new EventEmitter();\n @Output()\n scrollBenefits: EventEmitter = new EventEmitter();\n @Output()\n showCabinClassFareFamilies: EventEmitter = new EventEmitter();\n @Output()\n openCabinClassModal: EventEmitter = new EventEmitter();\n @Output()\n showDimensionsAndDetails: EventEmitter = new EventEmitter();\n\n extendedFareFamilies$: Observable;\n allBenefits$: Observable;\n selectedBoundId$: Observable;\n selectedCabinClass$: Subject = new BehaviorSubject(null);\n cheapestOrSelectedFareFamilyOfEachCabinClass$: Observable;\n optionName = `fare-family-option-${uuid()}`;\n accordionId = `benefit-accordion-${uuid()}`;\n\n resize$: Observable;\n routeType$: Observable;\n enableSpecialOffersBadge = false;\n isShortHaul$: Observable;\n isLongHaulLegAndAy$: Observable;\n tripType$: Observable;\n\n private scrollRequest$: Subject = new Subject();\n private subscription = new Subscription();\n\n @ViewChild('scrollContainer', { static: false }) scrollContainer: ScrollHandleContainerComponent;\n @ViewChild('activeCabinClassHeaderContainer', { static: false, read: ElementRef })\n activeCabinClassHeaderContainer: ElementRef;\n @ViewChild('scrollHandleLeft', { static: false, read: ElementRef }) scrollHandleLeft: ElementRef;\n @ViewChild('scrollHandleRight', { static: false, read: ElementRef }) scrollHandleRight: ElementRef;\n @ViewChildren('fareFamilyOption', { read: ElementRef }) fareFamilyOptions: QueryList;\n\n constructor(\n private store$: Store,\n private gtmService: GtmService,\n private bookingService: BookingService,\n private dimensionsAndDetailsModalService: DimensionsAndDetailsModalService\n ) {}\n\n ngOnInit(): void {\n this.routeType$ = this.bookingService.routeType;\n\n this.resize$ = fromEvent(window, 'resize').pipe(debounceTime(300));\n\n this.subscription.add(\n this.resize$.subscribe(() => {\n this.adjustFareFamilyOptionHeight();\n })\n );\n\n this.isShortHaul$ = this.bound$.pipe(\n map((bound) =>\n isShortHaulFlight(\n { countryCode: bound.details.departure.countryCode } as FinnairLocation,\n { countryCode: bound.details.arrival.countryCode } as FinnairLocation\n )\n )\n );\n\n const fareFamilyMap$: Observable = this.store$.pipe(fareFamiliesBounds());\n\n const selectedFareFamilySelector =\n this.boundType === BoundType.outbound ? selectedOutboundAirBound : selectedInboundAirBound;\n\n const selectedFareFamily$ = this.store$.pipe(selectedFareFamilySelector());\n\n this.cheapestOrSelectedFareFamilyOfEachCabinClass$ = this.getCheapestOrSelectedFareFamilyOfEachCabinClass$(\n this.bound$,\n selectedFareFamily$,\n fareFamilyMap$\n );\n\n const boundIdSelector: () => StateSelector =\n this.boundType === BoundType.outbound ? selectedOutboundAirBoundId : selectedInboundAirBoundId;\n\n this.selectedBoundId$ = this.store$.pipe(boundIdSelector());\n\n const fareFamiliesSortingSelector =\n this.boundType === BoundType.outbound\n ? outboundsFareFamiliesSortingSelector\n : inboundsFareFamiliesSortingSelector;\n\n const fareFamiliesSorting$: Observable = this.store$.pipe(fareFamiliesSortingSelector());\n\n const sortedFareFamilies$ = combineLatest([this.bound$, fareFamiliesSorting$]).pipe(\n map(([bound, fareFamiliesSorting]) =>\n [...bound.fareFamilies].sort(\n (a, b) => fareFamiliesSorting?.indexOf(a.fareFamilyCode) - fareFamiliesSorting?.indexOf(b.fareFamilyCode)\n )\n )\n );\n\n this.allBenefits$ = combineLatest([fareFamilyMap$, sortedFareFamilies$]).pipe(\n map(([fareFamilyMap, fareFamilies]) => {\n return fareFamilies.map((fareFamily) => fareFamilyMap?.[fareFamily.fareFamilyCode]);\n })\n );\n\n this.extendedFareFamilies$ = this.getExtendedFareFamilies$(\n fareFamilyMap$,\n sortedFareFamilies$,\n this.selectedBoundId$,\n this.selectedCabinClass$\n );\n\n this.subscription.add(\n this.scrollRequest$\n .pipe(withLatestFrom(this.extendedFareFamilies$), delay(0))\n .subscribe(([fareFamily, fareFamilies]) => {\n const fareFamilyIndex = fareFamilies.findIndex((f) => f.id === fareFamily.id);\n this.scrollToCardByIndex(fareFamilyIndex);\n })\n );\n\n this.subscription.add(\n combineLatest([\n fareFamilyMap$,\n sortedFareFamilies$,\n this.selectedCabinClass$.pipe(distinctUntilChanged(), filter(Boolean)),\n ])\n .pipe(\n switchMap(([fareFamilyMap, fareFamilies, selectedCabin]) => {\n return combineLatest([\n this.dimensionsAndDetailsModalService.showDimensionsAndDetailsObservable$,\n this.dimensionsAndDetailsModalService.showAllDimensionsAndDetailsObservable$,\n ]).pipe(\n filter(([boundedFareFamily, showAll]) => isPresent(boundedFareFamily) || showAll),\n map(([boundedFareFamily, showAll]) => ({\n extendedFareFamilies: fareFamilies.map((fareFamily) => ({\n ...fareFamily,\n benefits: fareFamilyMap?.[fareFamily.fareFamilyCode],\n selected:\n !showAll && boundedFareFamily && fareFamily.fareFamilyCode === boundedFareFamily.fareFamilyCode,\n })),\n cabinClass: selectedCabin,\n }))\n );\n })\n )\n .subscribe((data) => this.showDimensionsAndDetails.emit(data))\n );\n\n this.isLongHaulLegAndAy$ = combineLatest([this.bound$, this.locations$]).pipe(\n map(([bound, locations]) => isLongHaulLegAndAy(bound.details.itinerary, locations))\n );\n\n this.tripType$ = this.store$.pipe(globalBookingTripType());\n }\n\n ngAfterViewChecked(): void {\n this.adjustFareFamilyOptionHeight();\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n adjustFareFamilyOptionHeight(): void {\n adjustFareFamilyOptionHeight(\n this.scrollContainer,\n 'fin-fare-family-option .fare-header, fin-upsell-option .top-banner',\n 'height'\n );\n }\n\n trackByFn(index: number): number {\n return index;\n }\n\n handleShowDimensionsAndDetails(boundedFareFamily?: FinnairBoundFareFamily): void {\n if (boundedFareFamily) {\n this.dimensionsAndDetailsModalService.opedDimensionsAndDetails(boundedFareFamily);\n } else {\n this.dimensionsAndDetailsModalService.opedAllDimensionsAndDetails();\n }\n this.gtmService.trackElement(\n `${this.boundType}_compare_tickets`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.LINK,\n undefined,\n ElementActions.CLICK\n );\n }\n\n handleSelectFareFamily(boundFareFamily: FinnairBoundFareFamily, scrollToIndex: number = undefined): void {\n this.selectFareFamily.emit(boundFareFamily);\n if (scrollToIndex !== undefined) {\n this.scrollToCardByIndex(scrollToIndex);\n }\n }\n\n hideFareFamilies(event: Event): void {\n stopPropagation(event);\n\n this.selectedCabinClass$.next(null);\n }\n\n showFareFamiliesAndScrollToCabinClass(event: Event, fareFamily: CabinClassSelectionFareFamily): void {\n stopPropagation(event);\n\n this.selectedCabinClass$.next(fareFamily.cabinClass);\n\n this.showCabinClassFareFamilies.emit(fareFamily.cabinClass);\n\n if (fareFamily.preSelectFareFamily) {\n this.selectFareFamily.emit(fareFamily.preSelectFareFamily);\n }\n\n setTimeout(() => {\n this.activeCabinClassHeaderContainer?.nativeElement?.focus();\n }, 0);\n\n this.scrollToFareFamily(fareFamily.preSelectFareFamily || fareFamily);\n }\n\n selectNextCabinClass(fareFamily: CabinClassSelectionFareFamily): void {\n this.gtmService.trackElement(\n 'move-to-next-cabin-class-button',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.BUTTON,\n fareFamily.cabinClass,\n ElementActions.CLICK\n );\n this.showFareFamiliesAndScrollToCabinClass(null, fareFamily);\n }\n\n /**\n * Displays card center based on container\n * @param index Card index to display centered\n */\n scrollToCardByIndex(index: number): void {\n this.scrollContainer.scrollToElement(this.fareFamilyOptions.toArray()[index]);\n }\n\n private getExtendedFareFamilies$(\n fareFamilyMap$: Observable,\n sortedFareFamilies$: Observable,\n selectedBoundId$: Observable,\n selectedCabinClass$: Subject\n ): Observable {\n return combineLatest([fareFamilyMap$, sortedFareFamilies$, selectedBoundId$, selectedCabinClass$]).pipe(\n map(([fareFamilyMap, fareFamilies, selectedBoundId, selectedCabinClass]) => {\n const hasSuperLightCampaign = fareFamilies.some(\n (fareFamily) =>\n fareFamilyMap?.[fareFamily.fareFamilyCode].brandName.toLowerCase().includes('superlight') &&\n fareFamilyMap?.[fareFamily.fareFamilyCode].brandName.toLowerCase().includes('campaign')\n );\n\n return fareFamilies\n .filter((fareFamily) => {\n const brandName = fareFamilyMap?.[fareFamily.fareFamilyCode].brandName.toLowerCase();\n if (hasSuperLightCampaign && brandName.includes('superlight') && !brandName.includes('campaign')) {\n return false;\n }\n\n if (!selectedCabinClass) {\n return true;\n }\n\n if (selectedCabinClass !== effectiveCabinClass(fareFamily)) {\n return false;\n }\n\n return !(\n this.isNormalFareFamily(fareFamily) &&\n this.hasMatchingCampaignFareFamily(fareFamily, fareFamilies, selectedCabinClass, fareFamilyMap)\n );\n })\n .map((fareFamily): ExtendedFareFamily => {\n const benefits: FareFamily = fareFamilyMap?.[fareFamily.fareFamilyCode];\n\n const badgeType: FareFamilyBadgeType = this.getFareFamilyBadgeType(\n benefits,\n fareFamily,\n selectedCabinClass,\n fareFamilies\n );\n return {\n ...fareFamily,\n benefits,\n selected: fareFamily.id === selectedBoundId,\n badgeType,\n };\n });\n })\n );\n }\n\n private getFareFamilyBadgeType(\n benefits: FareFamily,\n fareFamily: FinnairBoundFareFamily,\n selectedCabinClass: string,\n fareFamilies: FinnairBoundFareFamily[]\n ): FareFamilyBadgeType {\n if (benefits?.tags?.length) {\n return FareFamilyBadgeType.CMS;\n }\n\n if (fareFamily.id === getPreselectedFareFamily(selectedCabinClass, fareFamilies)?.id) {\n return FareFamilyBadgeType.POPULAR;\n }\n\n return undefined;\n }\n\n private getCheapestOrSelectedFareFamilyOfEachCabinClass$(\n bound$: Observable,\n selectedFareFamily$: Observable,\n fareFamilyMap$: Observable\n ): Observable {\n return combineLatest([bound$, selectedFareFamily$, fareFamilyMap$]).pipe(\n map(([bound, selectedFareFamily, fareFamilyMap]) =>\n filterAndSortFareFamilyByCabinClass(bound.fareFamilies).map((cheapestFareFamilyOfCabinClass) => {\n const selectedFareFamilyId = selectedFareFamily?.id;\n const selectedFareFamilyIsInThisBound = bound.fareFamilies.some(\n (fareFamily) => fareFamily.id === selectedFareFamilyId\n );\n const cabinClass = effectiveCabinClass(cheapestFareFamilyOfCabinClass);\n const sameCabinClassAsSelectedFareFamily = cabinClass === effectiveCabinClass(selectedFareFamily);\n const selected = selectedFareFamilyIsInThisBound && sameCabinClassAsSelectedFareFamily;\n const selectedFareFamilyFromBound = bound?.fareFamilies?.find((ff) => ff.id === selectedFareFamily?.id);\n const displayedFareFamily = selected\n ? (selectedFareFamilyFromBound ?? selectedFareFamily)\n : cheapestFareFamilyOfCabinClass;\n\n const preSelectFareFamily = !selectedFareFamilyId && getPreselectedFareFamily(cabinClass, bound.fareFamilies);\n\n return {\n ...displayedFareFamily,\n brandName: fareFamilyMap?.[displayedFareFamily.fareFamilyCode]?.brandName,\n selected,\n cabinClass,\n preSelectFareFamily,\n };\n })\n ),\n map((fareFamilies) => {\n return fareFamilies.map((fareFamily, index) => ({\n ...fareFamily,\n nextCabinClass: fareFamilies[index + 1],\n }));\n })\n );\n }\n\n private scrollToFareFamily(fareFamily: CabinClassSelectionFareFamily | FinnairBoundFareFamily): void {\n this.scrollRequest$.next(fareFamily);\n }\n\n private isNormalFareFamily(fareFamily: FinnairBoundFareFamily): boolean {\n return !fareFamily.fareFamilyCode.includes('CAMP');\n }\n\n private hasMatchingCampaignFareFamily(\n fareFamily: FinnairBoundFareFamily,\n allFareFamilies: FinnairBoundFareFamily[],\n cabinClass: string,\n fareFamilyMap: { [p: string]: FareFamily }\n ): boolean {\n if (\n allFareFamilies.some(\n (ff) => ff.fareFamilyCode === fareFamiliesWithoutCampaignFiltering[fareFamily.fareFamilyCode]\n )\n ) {\n return false;\n }\n const codeStart = getCabinClassShortCode(cabinClass);\n const brandName = fareFamilyMap?.[fareFamily.fareFamilyCode].brandName;\n const brandCode = getBrandNameShortCode(brandName);\n const campaignCode = new RegExp(`${codeStart}${brandCode}CAMP`);\n return allFareFamilies.some((ff) => campaignCode.test(ff.fareFamilyCode));\n }\n}\n","\n \n \n \n \n {{ campaignBadge | finLocalization }}\n \n
\n \n
\n
\n \n
\n
\n \n\n \n \n \n
\n \n {{\n 'ticketSelection.aria.boundInformation'\n | finLocalization\n : {\n departureLocationCode: bound.details.departure.locationCode,\n departureDate: bound.details.departure.dateTime | finDateFormat: 'FULL_NO_YEAR',\n departureTime: bound.details.departure.dateTime | finTime,\n arrivalLocationCode: bound.details.arrival.locationCode,\n arrivalDate: bound.details.arrival.dateTime | finDateFormat: 'FULL_NO_YEAR',\n arrivalTime: bound.details.arrival.dateTime | finTime,\n stops: bound.details.stops,\n priceStartingFrom: bound$ | finMap: 'cheapestPrice' | finOffersPrice: currencyCode$ | async,\n operatingAirlineNames: bound.details.uniqueAirlineNames | finJoin: ', ',\n }\n }}\n
\n\n \n \n {{ 'routeNotification.sustainableRoute' | finLocalization }}\n \n {{ 'routeNotification.sustainableRouteNoPriorities' | finLocalization }}\n \n \n\n @if (hasTrainSegment$ | async) {\n \n \n {{ 'routeNotification.containsTrainSegment.description' | finLocalization }}\n \n \n }\n\n 0\"\n class=\"mr-xsmall-t bound-selection-notes\"\n [theme]=\"NotificationTheme.WARNING\"\n [compact]=\"compact\"\n >\n {{ 'ticketSelection.notes.' + note | finLocalization }}, \n \n\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\n\nimport { IconLibrary, SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, switchMap, withLatestFrom } from 'rxjs/operators';\n\nimport {\n isBoundAirDiscount,\n isByBusOnly,\n isFlight,\n legEndpointToUfoAirport,\n getAircraftTailForFlight,\n priorityServicesAvailable,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { BoundType } from '@fcom/dapi';\nimport {\n Cabin,\n FareFamily,\n FinnairBoundFareFamily,\n FinnairCabinClass,\n FinnairItineraryItemFlight,\n FinnairLocation,\n} from '@fcom/dapi/api/models';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { stopPropagation, TzDate, unsubscribe } from '@fcom/core/utils';\nimport { Direction } from '@fcom/common/interfaces/utils.interface';\nimport { DimensionsAndDetails, ExtendedFareFamily, FareFamilyBadgeType } from '@fcom/common-booking';\nimport { Airport, BookingAppState } from '@fcom/common/interfaces/booking';\nimport { FinnairBoundGroupWithLocation } from '@fcom/common/interfaces/booking/offers.interface';\nimport { isShortHaulFlight } from '@fcom/common/utils';\nimport { isLongHaulLegAndAy } from '@fcom/common-booking/utils/flight.utils';\nimport { MultivariateTestService } from '@fcom/common/multivariate-test/services/multivariate-test.service';\nimport { MultivariateTestId, TestVariant } from '@fcom/common/interfaces';\nimport { finShare } from '@fcom/rx';\n\nimport { AppConstants } from '../../../../app-constants';\nimport {\n fareFamiliesBounds,\n inboundsFareFamiliesSortingSelector,\n outboundsFareFamiliesSortingSelector,\n selectedInboundAirBound,\n selectedInboundFareFamilyBenefits,\n selectedOutboundAirBound,\n selectedOutboundFareFamilyBenefits,\n} from '../../../../store/selectors';\nimport { BUS_AIRCRAFT_CODE, ExtendedBoundInfo, TRAIN_AIRCRAFT_CODE } from '../../interfaces';\nimport { effectiveCabinClass, getPreselectedFareFamily } from '../../utils/offer.utils';\nimport { BookingAirBoundsService } from '../../services';\n\nexport const hasDayChange = ({ details: { arrival, departure } }: FinnairBoundGroupWithLocation): boolean =>\n new TzDate(departure.dateTime).localDateString !== new TzDate(arrival.dateTime).localDateString;\n\n@Component({\n selector: 'fin-air-bounds-bound-selection',\n styleUrls: ['./bound-selection.component.scss'],\n templateUrl: './bound-selection.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AirBoundsBoundSelectionComponent implements OnInit, OnDestroy {\n readonly C: typeof AppConstants = AppConstants;\n readonly IconLibrary = IconLibrary;\n readonly NotificationTheme = NotificationTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input()\n bound$: Observable;\n @Input()\n boundType: BoundType;\n @Input()\n currencyCode$: Observable;\n @Input()\n index: number;\n @Input()\n control: UntypedFormControl;\n @Input()\n isMobile$: Observable;\n @Input()\n viewDetailsBtnKey = 'manageMyBooking.widget.viewFullOrder';\n @Input()\n locations$: Observable<{ [key: string]: FinnairLocation }>;\n\n @Output()\n showDetails: EventEmitter = new EventEmitter();\n @Output()\n selectFareFamily: EventEmitter<{\n fareFamily: ExtendedFareFamily;\n checked: boolean;\n }> = new EventEmitter();\n @Output()\n scrollBenefits: EventEmitter = new EventEmitter();\n @Output()\n showCabinClassFareFamilies: EventEmitter = new EventEmitter();\n @Output()\n showDimensionsAndDetails: EventEmitter = new EventEmitter();\n @Output()\n openCabinClassModal: EventEmitter = new EventEmitter();\n\n hasDayChange$: Observable;\n hasBusLeg$: Observable;\n hasTrainSegment$: Observable;\n priorityServicesAvailable$: Observable;\n hasOnlyBusLegs$: Observable;\n inputId$: Observable;\n ariaId$: Observable;\n\n displayPriceAmount$: Observable;\n displayPriceLabel$: Observable;\n ufoAirports$: Observable<{ departure: Airport; arrival: Airport }>;\n tails$: Observable;\n campaignBadge$: Observable;\n fareFamilies$: Observable;\n isShortHaul$: Observable;\n isLongHaulLegAndAy$: Observable;\n isNewFlightCardStyleTest$ = of(true);\n selectedBoundId$ = new BehaviorSubject('');\n selectedCabin$ = new BehaviorSubject(null);\n preSelectedFareFamilyId: string = null;\n selectedBorderColor$: Observable;\n private subscriptions: Subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private languageService: LanguageService,\n private multivariateTestService: MultivariateTestService,\n private bookingAirBoundsService: BookingAirBoundsService\n ) {}\n\n ngOnInit(): void {\n this.isNewFlightCardStyleTest$ = this.multivariateTestService\n .getTestVariant(MultivariateTestId.NEW_FLIGHT_SELECTION_STYLE)\n .pipe(\n map((variant) => variant.variant === TestVariant.B),\n finShare()\n );\n\n this.hasDayChange$ = this.bound$.pipe(map(hasDayChange));\n this.hasBusLeg$ = this.bound$.pipe(\n map((bound) =>\n bound.details.itinerary.filter(isFlight).some((i) => i.aircraft?.code?.toUpperCase() === BUS_AIRCRAFT_CODE)\n )\n );\n\n this.hasTrainSegment$ = this.bound$.pipe(\n map((bound) =>\n bound.details.itinerary.filter(isFlight).some((i) => i.aircraft?.code?.toUpperCase() === TRAIN_AIRCRAFT_CODE)\n )\n );\n\n this.priorityServicesAvailable$ = this.bound$.pipe(\n map((bound) => priorityServicesAvailable(bound.details.itinerary))\n );\n this.hasOnlyBusLegs$ = this.bound$.pipe(map((bound) => isByBusOnly(bound.details)));\n this.inputId$ = this.bound$.pipe(\n map(({ sortingId }: ExtendedBoundInfo): string => `bound-select-input-${sortingId}`)\n );\n this.ariaId$ = this.bound$.pipe(\n map(({ sortingId }: ExtendedBoundInfo): string => `flight-aria-label-${sortingId}`)\n );\n\n const selectedFareFamilySelector =\n this.boundType === BoundType.outbound ? selectedOutboundAirBound : selectedInboundAirBound;\n\n this.displayPriceAmount$ = combineLatest([this.bound$, this.store$.pipe(selectedFareFamilySelector())]).pipe(\n map(([{ selected, cheapestPrice }, boundFareFamily]) => (selected ? boundFareFamily?.price : cheapestPrice))\n );\n\n const selectedFareFamilyBenefitsSelector =\n this.boundType === BoundType.outbound ? selectedOutboundFareFamilyBenefits : selectedInboundFareFamilyBenefits;\n\n this.displayPriceLabel$ = combineLatest([\n this.bound$,\n this.languageService.translate('startingFromTitle'),\n this.store$.pipe(selectedFareFamilyBenefitsSelector()),\n ]).pipe(\n map(([{ selected }, startingFromTitle, benefits]: [ExtendedBoundInfo, string, FareFamily]) =>\n selected ? benefits?.brandName : startingFromTitle\n )\n );\n\n this.ufoAirports$ = combineLatest([this.bound$, this.languageService.translate('date')]).pipe(\n map(([bound, translations]) => ({\n departure: legEndpointToUfoAirport(bound.details.departure, translations),\n arrival: legEndpointToUfoAirport(bound.details.arrival, translations),\n }))\n );\n\n this.tails$ = this.bound$.pipe(\n map((bound) => bound.details.itinerary.filter(isFlight).flatMap((flight) => getAircraftTailForFlight(flight)))\n );\n\n this.campaignBadge$ = combineLatest([this.bound$, this.isNewFlightCardStyleTest$]).pipe(\n map(([bound, isNewFlightCardStyleTest]) => {\n if (isNewFlightCardStyleTest) {\n return bound.showSpecialOfferBadge ? 'destinationSearch.campaignPrice' : undefined;\n }\n return bound.hasSpecialOffers || isBoundAirDiscount(bound) ? 'destinationSearch.campaignPrice' : undefined;\n })\n );\n\n const fareFamiliesSortingSelector =\n this.boundType === BoundType.outbound\n ? outboundsFareFamiliesSortingSelector\n : inboundsFareFamiliesSortingSelector;\n\n const fareFamiliesSorting$: Observable = this.store$.pipe(fareFamiliesSortingSelector());\n\n this.fareFamilies$ = combineLatest([\n this.bound$,\n this.store$.pipe(fareFamiliesBounds()),\n this.store$.pipe(selectedFareFamilySelector()),\n ]).pipe(\n map(([bound, fareFamilyMap, selectedFareFamily]) =>\n bound.fareFamilies.map((fareFamily) => {\n const preselectFareFamily = getPreselectedFareFamily(effectiveCabinClass(fareFamily), bound.fareFamilies);\n return {\n ...fareFamily,\n benefits: fareFamilyMap?.[fareFamily.fareFamilyCode],\n selected: fareFamily.id === selectedFareFamily?.id,\n badgeType: fareFamily.id === preselectFareFamily?.id ? FareFamilyBadgeType.POPULAR : undefined,\n };\n })\n ),\n withLatestFrom(fareFamiliesSorting$),\n map(([fareFamilies, fareFamiliesSorting]) =>\n fareFamilies.sort(\n (a: FinnairBoundFareFamily, b: FinnairBoundFareFamily) =>\n fareFamiliesSorting?.indexOf(a?.fareFamilyCode) - fareFamiliesSorting?.indexOf(b?.fareFamilyCode)\n )\n )\n );\n\n this.isShortHaul$ = this.bound$.pipe(\n map((bound) =>\n isShortHaulFlight(\n { countryCode: bound.details.departure.countryCode } as FinnairLocation,\n { countryCode: bound.details.arrival.countryCode } as FinnairLocation\n )\n )\n );\n\n this.isLongHaulLegAndAy$ = combineLatest([this.bound$, this.locations$]).pipe(\n map(([bound, locations]) => isLongHaulLegAndAy(bound.details.itinerary, locations))\n );\n\n this.selectedBorderColor$ = combineLatest([\n this.fareFamilies$,\n this.store$.pipe(selectedFareFamilySelector()),\n this.isNewFlightCardStyleTest$,\n ]).pipe(\n map(([fareFamilies, selectedFareFamily, isNewFlightCardStyleTest]) =>\n isNewFlightCardStyleTest\n ? (fareFamilies.find((fareFamily) => fareFamily.id === selectedFareFamily?.id)?.benefits?.brandColor ?? null)\n : null\n )\n );\n\n this.subscriptions.add(\n merge(\n this.selectedCabin$.pipe(\n filter(Boolean),\n switchMap((cabin) => {\n const selectedFareFamilySelector =\n this.boundType === BoundType.outbound ? selectedOutboundAirBound : selectedInboundAirBound;\n return combineLatest([\n this.bound$,\n this.fareFamilies$,\n this.store$.pipe(selectedFareFamilySelector()),\n ]).pipe(\n map(([bound, fareFamilies, selectedFareFamily]) => {\n if (selectedFareFamily) {\n return;\n }\n const preselectFareFamily = getPreselectedFareFamily(cabin, bound.fareFamilies);\n return fareFamilies.find((fareFamily) => fareFamily?.id === preselectFareFamily?.id);\n })\n );\n }),\n withLatestFrom(this.bookingAirBoundsService.preselectedBoundId$),\n map(([selectedFareFamily, preselectedBoundId]) => ({\n selectedFareFamily: preselectedBoundId ? null : selectedFareFamily,\n isPreSelected: !!selectedFareFamily && !preselectedBoundId,\n }))\n ),\n this.selectedBoundId$.pipe(\n distinctUntilChanged(),\n withLatestFrom(this.fareFamilies$),\n map(([boundId, fareFamilies]) => fareFamilies.find((fareFamily) => fareFamily.id === boundId)),\n filter(Boolean),\n map((selectedFareFamily) => ({ selectedFareFamily: selectedFareFamily, isPreSelected: false }))\n )\n ).subscribe(({ selectedFareFamily, isPreSelected }) => {\n if (selectedFareFamily) {\n this.selectFareFamily.emit({\n fareFamily: selectedFareFamily,\n checked: true,\n });\n }\n\n if (isPreSelected) {\n this.bookingAirBoundsService.setPreselectedBoundId(selectedFareFamily.id);\n }\n\n //use for preselecting auto scroll\n this.preSelectedFareFamilyId = isPreSelected ? selectedFareFamily.id : null;\n })\n );\n }\n\n ngOnDestroy(): void {\n this.bookingAirBoundsService.resetPreselectedBoundId();\n unsubscribe(this.subscriptions);\n }\n\n openDetails(e: Event, bound: FinnairBoundGroupWithLocation): void {\n stopPropagation(e);\n this.showDetails.emit(bound);\n }\n\n private getItinerary(bound: FinnairBoundGroupWithLocation, code: string): FinnairItineraryItemFlight[] {\n const fareInformation = bound.fareFamilies.find((f) => f.fareFamilyCode === code)?.fareInformation;\n\n return bound.details.itinerary.filter(isFlight).map((flight, index) => ({\n ...flight,\n bookingClass: fareInformation?.[index]?.bookingClass,\n cabinClass: fareInformation?.[index]?.cabinClass as FinnairCabinClass,\n }));\n }\n\n emitShowDimensionsAndDetails(e: DimensionsAndDetails, bound: FinnairBoundGroupWithLocation): void {\n const code = e.extendedFareFamilies[0].fareFamilyCode;\n const itinerary = this.getItinerary(bound, code);\n this.showDimensionsAndDetails.emit({\n ...e,\n itineraries: [itinerary],\n });\n }\n\n emitFareFamily(boundFareFamily: FinnairBoundFareFamily): void {\n this.selectedBoundId$.next(boundFareFamily.id);\n }\n\n handleCabinExpanding(cabin: Cabin): void {\n this.selectedCabin$.next(cabin);\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 {{ 'BoundCategory.otherDeparting' | finLocalization }}\n \n {{\n 'BoundCategory.otherReturning' | finLocalization\n }}\n ({{ otherBoundsList.length }})\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 ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\n\nimport { combineLatest, Observable, of, Subscription } from 'rxjs';\nimport {\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { MediaQueryService } from '@fcom/common';\nimport { BoundType } from '@fcom/dapi/interfaces';\nimport { finShare } from '@fcom/rx';\nimport { isPresent, isUndefined, unsubscribe } from '@fcom/core/utils';\nimport { Cabin, FinnairCabinClass } from '@fcom/dapi/api/models';\nimport { mapLocationRouteCffDataToCabin, sortByPrice } from '@fcom/common/utils/booking.utils';\nimport { NotificationTheme } from '@fcom/ui-components';\nimport { LoaderType } from '@fcom/common/interfaces';\nimport { ExtendedFareFamily, SortBy } from '@fcom/common-booking';\nimport { Direction } from '@fcom/common/interfaces/utils.interface';\nimport { DimensionsAndDetails } from '@fcom/common-booking/interfaces/flight-selection.interface';\nimport { LocationRouteCffService } from '@fcom/core/index';\nimport {\n FlightSelectionFiltersComponent,\n ResetAllFiltersEvent,\n ResetFiltersEvent,\n} from '@fcom/common-booking/components/flight-selection-filters/flight-selection-filters.component';\nimport { FlightFilters, FlightTimeOption } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport {\n FinnairAirBounds,\n FinnairBoundGroupWithLocation,\n SelectionPhase,\n} from '@fcom/common/interfaces/booking/offers.interface';\nimport { AirOffersStatus } from '@fcom/common/interfaces/booking/air-offers-state.interface';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { getCabinClassesForBounds } from '@fcom/common-booking/utils/bound.utils';\nimport { profileType } from '@fcom/core/selectors';\nimport { ProfileType } from '@fcom/core-api/login';\nimport { CabinClassModalComponent } from '@fcom/common-booking/components/flight-selection/cabin-class-modal/cabin-class-modal.component';\nimport { isBoundAirDiscount } from '@fcom/common-booking/utils/common-booking.utils';\n\nimport { BoundsActions } from '../../../../store/actions';\nimport { AppConstants } from '../../../../app-constants';\nimport { ExtendedBoundInfo } from '../../interfaces';\nimport { offerListSortMap } from '../air-bounds-booking-ticket-selection-view.component';\nimport { filters, lastRequestParams, outbounds } from '../../../../store/selectors';\nimport { TicketSelectionParams } from '../../../../modules/ticket-selection/services';\n\n@Component({\n selector: 'fin-optimize-air-bounds-bound-selection-list',\n styleUrls: ['./optimize-bound-selection-list.component.scss'],\n templateUrl: './optimize-bound-selection-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OptimizedAirBoundsBoundSelectionListComponent implements OnInit, OnDestroy {\n @Input()\n currencyCode$: Observable;\n @Input()\n boundType: BoundType;\n @Input()\n bounds$: Observable;\n\n /** The sort order for the bound ids. */\n @Input()\n boundIdSortOrder$: Observable;\n @Input()\n selectedBound$: Observable;\n @Input()\n selectedSortBy$: Observable;\n @Input()\n isLoading: boolean;\n @Input()\n boundsStatus$: Observable;\n @Input()\n selectionPhase: SelectionPhase;\n @Input()\n viewDetailsBtnKey = 'manageMyBooking.widget.viewFullOrder';\n @Input()\n showFlightSelectionFilters: boolean;\n\n @Output()\n openBound: EventEmitter = new EventEmitter();\n @Output()\n selectFareFamily: EventEmitter<{\n fareFamily: ExtendedFareFamily;\n checked: boolean;\n }> = new EventEmitter();\n @Output()\n showDetails: EventEmitter = new EventEmitter();\n @Output()\n scrollBenefits: EventEmitter = new EventEmitter();\n @Output()\n showCabinClassFareFamilies: EventEmitter = new EventEmitter();\n @Output()\n showDimensionsAndDetails: EventEmitter = new EventEmitter();\n @Output()\n selectSortBy: EventEmitter = new EventEmitter();\n @Output()\n showSpinner: EventEmitter = new EventEmitter();\n\n @ViewChild(FlightSelectionFiltersComponent)\n private flightSelectionFilters: FlightSelectionFiltersComponent;\n\n @ViewChild(CabinClassModalComponent)\n private cabinClassModal: CabinClassModalComponent;\n\n otherBoundsList$: Observable;\n bestBoundsList$: Observable;\n allBoundsList$: Observable;\n control: UntypedFormControl;\n openedBound$: Observable;\n availableCabinClasses$: Observable;\n fastestPrice$: Observable;\n lowestPrice$: Observable;\n isTablet$: Observable;\n isMobile$: Observable;\n layoverAmounts$: Observable;\n originLocationCode$: Observable;\n destinationLocationCode$: Observable;\n travelClasses$: Observable;\n filters$: Observable;\n lastRequestParams$: Observable;\n outbounds$: Observable;\n profileType$: Observable;\n\n readonly BoundType = BoundType;\n readonly AirOffersStatus = AirOffersStatus;\n readonly SortBy = SortBy;\n readonly AY_FLIGHTS_SIZE = 3;\n readonly AY_FLIGHTS_CODE = 'AY';\n readonly MAX_SPECIAL_OFFERS = 3;\n\n private subscription: Subscription = new Subscription();\n\n public readonly C: typeof AppConstants = AppConstants;\n public readonly NotificationTheme = NotificationTheme;\n readonly LoaderType = LoaderType;\n\n constructor(\n private mediaQueryService: MediaQueryService,\n private store$: Store,\n private locationRouteCffService: LocationRouteCffService\n ) {}\n\n ngOnInit(): void {\n this.control = new UntypedFormControl('');\n\n this.isMobile$ = this.mediaQueryService.isBreakpoint$('mobile');\n this.isTablet$ = this.mediaQueryService.isBreakpoint$('tablet_down');\n\n this.filters$ = this.store$.pipe(filters());\n this.lastRequestParams$ = this.store$.pipe(lastRequestParams());\n\n this.layoverAmounts$ = this.bounds$.pipe(map((bounds) => bounds.boundGroups.map((obj) => obj.details.stops)));\n this.openedBound$ = this.control.valueChanges.pipe(filter(isPresent), distinctUntilKeyChanged('sortingId'));\n\n const boundIndex = this.boundType === BoundType.outbound ? 0 : 1;\n this.originLocationCode$ = this.bounds$.pipe(\n map((bounds) => bounds.request.itineraries[boundIndex].departureLocationCode)\n );\n this.destinationLocationCode$ = this.bounds$.pipe(\n map((bounds) => bounds.request.itineraries[boundIndex].destinationLocationCode)\n );\n\n this.availableCabinClasses$ = this.bounds$.pipe(map((bounds) => getCabinClassesForBounds(bounds)));\n\n this.profileType$ = this.store$.pipe(profileType());\n this.travelClasses$ = this.store$.pipe(\n outbounds(),\n take(1),\n map((outboundsResult) => {\n if (!outboundsResult?.request?.itineraries) {\n return null;\n }\n\n const itinerary = outboundsResult.request.itineraries;\n\n const originLocationCode = itinerary[0].departureLocationCode;\n const destinationLocationCode = itinerary[0].destinationLocationCode;\n\n return { originLocationCode, destinationLocationCode };\n }),\n withLatestFrom(this.profileType$),\n switchMap(([locations, userProfileType]) => {\n if (!locations) {\n return of([]);\n }\n const { destinationLocationCode, originLocationCode } = locations;\n return this.locationRouteCffService\n .routeCffsFor(\n originLocationCode,\n destinationLocationCode,\n undefined,\n undefined,\n String(userProfileType === ProfileType.CORPORATE)\n )\n .pipe(\n take(1),\n map((result) => mapLocationRouteCffDataToCabin(result))\n );\n }),\n finShare()\n );\n\n const sortedBounds$: Observable = combineLatest([\n this.bounds$.pipe(filter(isPresent)),\n this.boundIdSortOrder$.pipe(filter(Boolean)),\n this.selectedSortBy$,\n ]).pipe(\n map(\n ([bounds, sortOrder, selectedSortBy]: [\n FinnairAirBounds,\n string[],\n SortBy,\n ]): FinnairBoundGroupWithLocation[] => {\n const results = sortOrder\n .map((id: string) => bounds.boundGroups.find((b) => b.sortingId === id))\n .filter(Boolean)\n .filter((boundGroup) => boundGroup.fareFamilies.length > 0);\n\n let sorted = results;\n if (selectedSortBy === SortBy.PRICE) {\n sorted = sortByPrice(results);\n }\n\n return sorted;\n }\n ),\n finShare()\n );\n\n const fastestSortKey = offerListSortMap[SortBy.DURATION];\n let lowestPrice: number;\n this.fastestPrice$ = this.bounds$.pipe(\n filter(isPresent),\n map((bound) => {\n let currentBoundGroupsLowestPrice;\n for (const sortingId of bound.sorting.boundGroups[fastestSortKey]) {\n currentBoundGroupsLowestPrice = bound.boundGroups\n .find((group) => group.sortingId === sortingId)\n ?.fareFamilies.reduce((min, ff) => {\n const numericPrice = parseFloat(ff.price);\n return !min || numericPrice < min ? numericPrice : min;\n }, null);\n\n if (currentBoundGroupsLowestPrice) {\n lowestPrice = currentBoundGroupsLowestPrice;\n // We want to break the for loop because found the lowest price of the fastest boundGroup\n break;\n }\n }\n\n return lowestPrice;\n })\n );\n\n this.lowestPrice$ = combineLatest([\n this.bounds$.pipe(filter(isPresent)),\n this.boundIdSortOrder$.pipe(filter(Boolean)),\n ]).pipe(\n map(([bounds, sortOrder]: [FinnairAirBounds, string[]]) => {\n const results = sortOrder\n .map((id: string) => bounds.boundGroups.find((b) => b.sortingId === id))\n .filter(Boolean);\n\n const sorted = sortByPrice(results);\n\n return sorted[0]?.fareFamilies.reduce((min, ff) => {\n const numericPrice = parseFloat(ff.price);\n return !min || numericPrice < min ? numericPrice : min;\n }, null);\n }),\n finShare()\n );\n\n const selectedBoundId$: Observable = this.selectedBound$.pipe(\n filter(isPresent),\n map(({ sortingId }): string => sortingId),\n distinctUntilChanged()\n );\n\n this.subscription.add(\n this.openedBound$\n .pipe(map(({ ...bound }: ExtendedBoundInfo) => bound))\n .subscribe((bound: FinnairBoundGroupWithLocation) => {\n this.openBound.emit(bound);\n })\n );\n\n this.subscription.add(\n selectedBoundId$\n .pipe(\n withLatestFrom(sortedBounds$),\n map(\n ([selected, bounds]: [string, FinnairBoundGroupWithLocation[]]): FinnairBoundGroupWithLocation =>\n bounds.find(({ sortingId }: ExtendedBoundInfo) => sortingId === selected)\n )\n )\n .subscribe((selectedBound: FinnairBoundGroupWithLocation) => {\n this.control.setValue(selectedBound);\n })\n );\n\n const specialOffers$ = sortedBounds$.pipe(\n map((bounds) => {\n const offers = bounds.filter((bound) => bound.hasSpecialOffers || isBoundAirDiscount(bound));\n return offers.length < this.MAX_SPECIAL_OFFERS && offers.length !== 0 ? offers : null;\n })\n );\n\n this.bestBoundsList$ = combineLatest([\n sortedBounds$,\n selectedBoundId$.pipe(startWith(undefined as string)),\n this.openedBound$.pipe(\n map((bound: ExtendedBoundInfo) => bound.sortingId),\n startWith(undefined as string)\n ),\n specialOffers$,\n ]).pipe(\n map(([bounds, selectedBoundId, openedBoundId, specialOffers]): ExtendedBoundInfo[] => {\n if (bounds.length === 0) {\n return [];\n }\n // Max 3 AY direct bound\n const ayBounds: FinnairBoundGroupWithLocation[] = bounds\n .filter((bound: FinnairBoundGroupWithLocation) =>\n bound.details.operatingAirlineCodes.every((code) => code === this.AY_FLIGHTS_CODE)\n )\n .slice(0, this.AY_FLIGHTS_SIZE);\n\n let directBounds = ayBounds;\n\n if (ayBounds.length < this.AY_FLIGHTS_SIZE) {\n directBounds = ayBounds\n .concat(\n bounds.filter(\n (bound: FinnairBoundGroupWithLocation) =>\n bound.details.operatingAirlineCodes.some((code) => code !== this.AY_FLIGHTS_CODE) &&\n bound.details.stops === 0\n )\n )\n .slice(0, this.AY_FLIGHTS_SIZE);\n }\n\n // 1 cheapest bound\n const cheapestBoundList: FinnairBoundGroupWithLocation[] = [...bounds].sort(\n (a, b) => Number(a.cheapestPrice) - Number(b.cheapestPrice)\n );\n\n // check if cheapest bound is not include in the ay bounds\n if (directBounds.find((bound) => bound.sortingId === cheapestBoundList[0].sortingId)) {\n return this.generateBoundInfo(directBounds, selectedBoundId, openedBoundId, specialOffers);\n }\n return this.generateBoundInfo(\n directBounds.concat([cheapestBoundList[0]]),\n selectedBoundId,\n openedBoundId,\n specialOffers\n );\n }),\n finShare()\n );\n\n this.otherBoundsList$ = combineLatest([\n this.bestBoundsList$,\n sortedBounds$,\n selectedBoundId$.pipe(startWith(undefined as string)),\n this.openedBound$.pipe(\n map((bound: ExtendedBoundInfo) => bound.sortingId),\n startWith(undefined as string)\n ),\n specialOffers$,\n ]).pipe(\n map(([bestbounds, bounds, selectedBoundId, openedBoundId, specialOffers]): ExtendedBoundInfo[] => {\n const bestboundsIds = bestbounds.map(({ sortingId }) => sortingId);\n return this.generateBoundInfo(\n bounds.filter((bound) => !bestboundsIds.includes(bound.sortingId)),\n selectedBoundId,\n openedBoundId,\n specialOffers\n );\n }),\n finShare()\n );\n\n this.allBoundsList$ = combineLatest([\n sortedBounds$,\n selectedBoundId$.pipe(startWith(undefined as string)),\n this.openedBound$.pipe(\n map((bound: ExtendedBoundInfo) => bound.sortingId),\n startWith(undefined as string)\n ),\n specialOffers$,\n ]).pipe(\n map(([bounds, selectedBoundId, openedBoundId, specialOffers]): ExtendedBoundInfo[] => {\n return this.generateBoundInfo(bounds, selectedBoundId, openedBoundId, specialOffers);\n }),\n finShare()\n );\n }\n\n private generateBoundInfo(\n bounds: FinnairBoundGroupWithLocation[],\n selectedBoundId: string,\n openedBoundId: string,\n specialOffers: FinnairBoundGroupWithLocation[]\n ): ExtendedBoundInfo[] {\n if (bounds.length === 0) {\n return [];\n }\n\n return bounds.map((bound: FinnairBoundGroupWithLocation) => ({\n ...bound,\n selected: bound.sortingId === selectedBoundId,\n open: bound.sortingId === openedBoundId,\n showSpecialOfferBadge: specialOffers?.some((offer) => offer.sortingId === bound.sortingId),\n }));\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\n }\n\n openCabinClassModal(cabinClass: string): void {\n this.cabinClassModal.openModal(null, cabinClass.toLowerCase());\n }\n\n onSelectSortBy(data: SortBy): void {\n this.selectSortBy.emit(data);\n }\n\n onSetFilter(flightFilters: FlightFilters): void {\n const filteredFilters = Object.entries(flightFilters)\n .filter(([_, value]) => !isUndefined(value))\n .reduce((obj, [filterName, value]) => ({ ...obj, [filterName]: value }), {});\n\n Object.entries(filteredFilters).forEach(([filterName, value]) => {\n switch (filterName as keyof FlightFilters) {\n case 'stopsCount':\n this.store$.dispatch(BoundsActions.setStopsCount({ stopsCount: value as number | null }));\n break;\n\n case 'cabin':\n this.store$.dispatch(BoundsActions.setCabin({ cabin: value as Cabin }));\n break;\n\n case 'refundable':\n this.store$.dispatch(BoundsActions.setRefundable({ refundable: value as boolean }));\n break;\n\n case 'departureTime':\n this.store$.dispatch(BoundsActions.setDepartureTime({ departureTime: value as FlightTimeOption[] }));\n break;\n\n case 'arrivalTime':\n this.store$.dispatch(BoundsActions.setArrivalTime({ arrivalTime: value as FlightTimeOption[] }));\n break;\n\n default:\n break;\n }\n });\n }\n\n onResetFilter(event: ResetFiltersEvent): void {\n switch (event.type) {\n case 'stopsCount':\n this.store$.dispatch(BoundsActions.resetStopsCount());\n break;\n case 'cabin':\n this.store$.dispatch(BoundsActions.resetCabin({ cabin: event.cabin }));\n break;\n case 'refundable':\n this.store$.dispatch(BoundsActions.resetRefundable());\n break;\n\n case 'departureTime':\n this.store$.dispatch(BoundsActions.resetDepartureTime());\n break;\n\n case 'arrivalTime':\n this.store$.dispatch(BoundsActions.resetArrivalTime());\n break;\n\n default:\n break;\n }\n }\n\n onResetAllFilters(event: ResetAllFiltersEvent): void {\n this.store$.dispatch(\n BoundsActions.resetAllFilters({\n keepCabin: this.flightSelectionFilters.shouldNotClearTravelClass,\n defaultCabin: event.defaultCabin,\n })\n );\n }\n\n clearAllFilters(): void {\n this.flightSelectionFilters.clearAllFilters('empty-state');\n }\n}\n","
\n \n {{ 'itineraryAndUpgradesModal.upgradeAvailability.error' | finLocalization }}\n \n\n \n \n \n \n \n\n \n \n \n\n 0\">\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n {{\n 'itineraryAndUpgradesModal.upgradeAvailability.caption' | finLocalization\n }}\n
\n {{ 'itineraryAndUpgradesModal.upgradeAvailability.flight' | finLocalization }}\n \n {{ 'itineraryAndUpgradesModal.upgradeAvailability.premiumEconomy' | finLocalization }}\n \n {{ 'itineraryAndUpgradesModal.upgradeAvailability.business' | finLocalization }}\n
\n {{ flight.departure.locationCode }}-{{ flight.arrival.locationCode }}\n
\n {{ flight.flightNumber }}\n
\n \n \n \n
\n\n
\n \n
\n
\n
\n
\n
\n
\n\n\n

\n {{ 'itineraryAndUpgradesModal.upgradeAvailability.requirements' | finLocalization }}\n

\n \n
\n\n\n \n {{ 'itineraryAndUpgradesModal.upgradeAvailability.requirements' | finLocalization }}\n \n \n {{ 'itineraryAndUpgradesModal.upgradeAvailability.businessOnly' | finLocalization }}\n \n\n\n\n \n\n\n\n \n \n \n \n \n {{\n 'itineraryAndUpgradesModal.upgradeAvailability.' +\n (flight.domestic || !flight.finnairFlight\n ? 'notEligible'\n : flight.tooCloseToDeparture || (flight.tooCloseToWaitlist && availableSeats === 0)\n ? 'notPossible'\n : 'notAvailable') | finLocalization\n }}\n \n \n \n \n \n \n {{\n availableSeats === 0\n ? ('itineraryAndUpgradesModal.upgradeAvailability.waitlist' | finLocalization)\n : ((availableSeats === 1\n ? 'itineraryAndUpgradesModal.upgradeAvailability.seat'\n : 'itineraryAndUpgradesModal.upgradeAvailability.seats'\n ) | finLocalization: { seats: availableSeats > 5 ? '5+' : availableSeats })\n }}\n \n \n\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\n\nimport { SentryLogger } from '@fcom/core';\nimport {\n isEmpty,\n isFinnairNorraOrWetLease,\n MILLIS_IN_HOUR,\n TzDate,\n unsubscribe,\n mapErrorForSentry,\n} from '@fcom/core/utils';\nimport { ProfileTier } from '@fcom/core-api/login';\nimport { profile } from '@fcom/core/selectors';\nimport { ButtonSize, ButtonTheme, NotificationTheme } from '@fcom/ui-components';\nimport { ElementActions, ElementTypes, GaContext } from '@fcom/common/';\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n Cabin,\n FinnairCabinClass,\n FinnairItineraryItemFlight,\n FinnairItineraryItemType,\n FinnairTravelEndpoint,\n ItineraryItemFlight,\n ItineraryItemLayover,\n} from '@fcom/dapi/api/models';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { LocationInfoMap } from '@fcom/dapi';\nimport { FinnairBoundItemWithLocation } from '@fcom/common-booking';\nimport { ConfigService } from '@fcom/core/services';\nimport { OffersSeatService } from '@fcom/one-upgrade/api/services/offers-seat.service';\nimport { retryWithBackoff } from '@fcom/rx';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BookingAppState, SelectionPhase } from '@fcom/common/interfaces/booking';\nimport { isShortHaulCountry } from '@fcom/common/utils/flight.utils';\n\nimport {\n lastRequestParams,\n selectedInboundItinerary,\n selectedOutboundItinerary,\n selectMultiCitySelectedItineraryDetails,\n} from '../../../../store/selectors';\n\ninterface UpgradeFlight extends FinnairItineraryItemFlight {\n domestic?: boolean;\n tooCloseToDeparture?: boolean;\n tooCloseToWaitlist?: boolean;\n premiumEconomySeats?: number;\n businessSeats?: number;\n finnairFlight?: boolean;\n economyOnly?: boolean;\n}\n\n@Component({\n selector: 'fin-itinerary-upgrade-availability',\n templateUrl: './itinerary-upgrade-availability.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ItineraryUpgradeAvailabilityComponent implements OnInit, OnDestroy {\n @Input()\n selectionPhase$: Observable;\n @Input()\n locations: LocationInfoMap;\n @Input()\n bound: FinnairBoundItemWithLocation;\n @Input()\n classesForSegments: { [segmentId: string]: FinnairCabinClass[] };\n\n @Output()\n loginClicked: EventEmitter = new EventEmitter();\n\n readonly ButtonSize = ButtonSize;\n readonly ButtonTheme = ButtonTheme;\n readonly NotificationTheme = NotificationTheme;\n readonly ProfileTier = ProfileTier;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n profileTier$: Observable;\n contentUrl$: Observable;\n waitContentUrl$: Observable;\n notEligibleContentUrl$: Observable;\n hasPartnerOrDomestic$: Observable;\n hasWaitlisted$: Observable;\n seatsOrWaitlistAvailable$: Observable;\n upgradeFlights$ = new BehaviorSubject(undefined);\n tiersForUpgrade = [ProfileTier.GOLD, ProfileTier.LUMO, ProfileTier.PLATINUM];\n isBusinessOnly$: Observable;\n eligible$: Observable;\n displayError$ = new BehaviorSubject(false);\n showPremiumEconomy$: Observable;\n\n private subscription = new Subscription();\n private CUTOFF_HOURS_WAITLIST = 40;\n private CUTOFF_HOURS_HEL = 3;\n private CUTOFF_HOURS_SHORT_HAUL = 24;\n private CUTOFF_HOURS_LONG_HAUL = 8;\n\n constructor(\n private store$: Store,\n private gtmService: GtmService,\n private languageService: LanguageService,\n private offersSeatService: OffersSeatService,\n private configService: ConfigService,\n private sentryLogger: SentryLogger\n ) {}\n\n ngOnInit(): void {\n this.showPremiumEconomy$ = this.store$.pipe(\n lastRequestParams(),\n map(\n ({ cabin }) =>\n this.configService.cfg.enableUpgradeAvailabilityPremiumEconomyInBooking && cabin !== Cabin.ECOPREMIUM\n )\n );\n this.profileTier$ = this.store$.pipe(\n profile(),\n take(1),\n map(({ tier }) => tier)\n );\n\n const boundFlights = this.bound.itinerary.filter(isFlight);\n this.isBusinessOnly$ = combineLatest([\n this.store$.pipe(lastRequestParams()),\n this.selectionPhase$,\n this.store$.pipe(selectedOutboundItinerary()),\n this.store$.pipe(selectedInboundItinerary()),\n this.store$.pipe(select(selectMultiCitySelectedItineraryDetails)),\n ]).pipe(\n map(([{ cabin }, phase, outItinerary, inItinerary, multicityBounds]) => {\n if (cabin === Cabin.BUSINESS) {\n return true;\n }\n const itinerary = this.getItinerary(phase, outItinerary, multicityBounds, inItinerary);\n const selectedOpened = boundFlights.every((flight: FinnairItineraryItemFlight) =>\n itinerary.some((it) => it.type === FinnairItineraryItemType.FLIGHT && it.id === flight.id)\n );\n\n return (\n !isEmpty(itinerary) &&\n selectedOpened &&\n itinerary.every((it) => ('cabinClass' in it ? it.cabinClass === FinnairCabinClass.BUSINESS : false))\n );\n })\n );\n\n const detailedFlights: UpgradeFlight[] = boundFlights.map((flight: FinnairItineraryItemFlight) => {\n const countryLocations = [\n this.locations[flight.departure.locationCode]?.countryCode,\n this.locations[flight.arrival.locationCode]?.countryCode,\n ];\n const domestic = countryLocations.every((code) => code === 'FI');\n const isShortHaul = countryLocations.every(isShortHaulCountry);\n const tooCloseToDeparture = this.flightTooCloseToDeparture(flight.departure, isShortHaul);\n const finnairFlight = isFinnairNorraOrWetLease(flight.operatingAirline.name, flight.operatingAirline.code);\n const classes = this.classesForSegments?.[flight.id] || [];\n const economyOnly = classes.length === 1 && classes[0] === FinnairCabinClass.ECONOMY;\n const tooCloseToWaitlist =\n new TzDate(flight.departure.dateTime).millis - Date.now() < this.CUTOFF_HOURS_WAITLIST * MILLIS_IN_HOUR;\n\n return {\n ...flight,\n domestic,\n tooCloseToDeparture,\n tooCloseToWaitlist,\n finnairFlight,\n isShortHaul,\n economyOnly,\n };\n });\n\n this.eligible$ = combineLatest([this.profileTier$, this.isBusinessOnly$]).pipe(\n map(([tier, businessOnly]) => this.tiersForUpgrade.includes(tier) && !businessOnly)\n );\n\n this.subscription.add(\n this.eligible$.pipe(filter(Boolean), take(1)).subscribe(() => this.fetchFlights(detailedFlights))\n );\n\n this.hasPartnerOrDomestic$ = this.upgradeFlights$.pipe(\n map((upgradeFlights) => upgradeFlights.some(({ domestic, finnairFlight }) => domestic || !finnairFlight))\n );\n\n this.hasWaitlisted$ = this.upgradeFlights$.pipe(\n map((flights) =>\n flights.some(\n ({ finnairFlight, domestic, tooCloseToDeparture, businessSeats, premiumEconomySeats, tooCloseToWaitlist }) =>\n finnairFlight &&\n !domestic &&\n !tooCloseToDeparture &&\n !tooCloseToWaitlist &&\n (businessSeats === 0 || premiumEconomySeats === 0)\n )\n )\n );\n this.seatsOrWaitlistAvailable$ = combineLatest([this.hasWaitlisted$, this.upgradeFlights$]).pipe(\n map(\n ([waitlisted, flights]) =>\n waitlisted ||\n flights.some(\n ({ premiumEconomySeats, businessSeats, tooCloseToDeparture, economyOnly }) =>\n !economyOnly && !tooCloseToDeparture && premiumEconomySeats + businessSeats > 0\n )\n )\n );\n\n this.contentUrl$ = this.contentUrlForFragment('fragments.itineraryAndUpgradesModalUpgradeAvailabilityAvailable');\n this.notEligibleContentUrl$ = this.contentUrlForFragment(\n 'fragments.itineraryAndUpgradesModalUpgradeAvailabilityNotEligible'\n );\n this.waitContentUrl$ = this.contentUrlForFragment('fragments.itineraryAndUpgradesModalUpgradeAvailabilityWaitlist');\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n fetchFlights = (detailedFlights: UpgradeFlight[]): void => {\n const toRequest = detailedFlights\n .filter(\n ({ finnairFlight, domestic, tooCloseToDeparture, economyOnly }) =>\n !domestic && !tooCloseToDeparture && finnairFlight && !economyOnly\n )\n .map(({ departure, arrival, operatingAirline, flightNumber }) => ({\n boardPoint: departure.locationCode,\n offPoint: arrival.locationCode,\n departureDateTimeLocal: departure.dateTime,\n flightCarrierCode: operatingAirline.code,\n flightNumber: this.flightNumberWithoutCode(flightNumber, operatingAirline.code),\n }));\n\n this.gtmService.trackElement(\n `upgrade-availability_flights::eligible_${toRequest.length}::ineligible_${\n detailedFlights.length - toRequest.length\n }`,\n GaContext.BOOKING_FLOW,\n ElementTypes.MODAL,\n undefined,\n ElementActions.VIEW\n );\n\n if (toRequest.length === 0) {\n this.upgradeFlights$.next(detailedFlights);\n return;\n }\n\n this.subscription.add(\n this.offersSeatService\n .getSeatUpgradeOffersV2({\n body: {\n segmentInformation: toRequest,\n },\n })\n .pipe(retryWithBackoff(1))\n .subscribe({\n next: ({ segmentSeatInfo }) => {\n const flightsWithAvailability = detailedFlights.map((flight) => {\n const seatInfo = segmentSeatInfo.find(\n ({ segmentInformation }) =>\n segmentInformation.flightNumber ===\n this.flightNumberWithoutCode(flight.flightNumber, flight.operatingAirline.code)\n )?.seatInfo;\n\n const premiumEconomySeats = seatInfo?.find(({ upgradeClass }) => upgradeClass === 'F')?.seatsAvailable;\n const businessSeats = seatInfo?.find(({ upgradeClass }) => upgradeClass === 'U')?.seatsAvailable;\n return { ...flight, premiumEconomySeats, businessSeats };\n });\n\n const businessTotal = flightsWithAvailability.reduce((sum, { businessSeats }) => sum + businessSeats, 0);\n const premiumTotal = flightsWithAvailability.reduce(\n (sum, { premiumEconomySeats }) => sum + premiumEconomySeats,\n 0\n );\n this.gtmService.trackElement(\n `upgrade-availability_business_${businessTotal}::premium_economy_${premiumTotal}`,\n GaContext.BOOKING_FLOW,\n ElementTypes.MODAL,\n undefined,\n ElementActions.VIEW\n );\n\n this.upgradeFlights$.next(flightsWithAvailability);\n },\n error: (error: unknown) => {\n this.displayError$.next(true);\n this.upgradeFlights$.next([]);\n this.sentryLogger.error('checking seat upgrade availability failed', {\n error: mapErrorForSentry(error),\n });\n },\n })\n );\n };\n\n getItinerary(\n phase: SelectionPhase,\n outItinerary: FinnairItineraryItemFlight[],\n multicityBounds: (ItineraryItemFlight | ItineraryItemLayover)[][],\n inItinerary: FinnairItineraryItemFlight[]\n ): ItineraryItemFlight[] | FinnairItineraryItemFlight[] {\n if (phase === SelectionPhase.OUTBOUND) {\n return outItinerary;\n } else if (phase === SelectionPhase.MULTICITY) {\n return multicityBounds.flat();\n } else {\n return inItinerary;\n }\n }\n\n contentUrlForFragment = (fragmentKey: string): Observable =>\n this.languageService.translate(fragmentKey).pipe(\n take(1),\n map(({ url }) => url)\n );\n\n login(): void {\n this.gtmService.trackElement(\n 'itinerary-upgrade-availability-login',\n GaContext.BOOKING_FLOW,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.CLICK\n );\n this.loginClicked.emit();\n }\n\n private flightTooCloseToDeparture(departure: FinnairTravelEndpoint, isShortHaul: boolean): boolean {\n const cutoffHours =\n departure.locationCode === 'HEL'\n ? this.CUTOFF_HOURS_HEL\n : isShortHaul\n ? this.CUTOFF_HOURS_SHORT_HAUL\n : this.CUTOFF_HOURS_LONG_HAUL;\n return new TzDate(departure.dateTime).millis - Date.now() < cutoffHours * MILLIS_IN_HOUR;\n }\n\n private flightNumberWithoutCode(flightNumber: string, code: string): string {\n return parseInt(flightNumber.replace(code, ''), 10).toString();\n }\n}\n","\n
\n \n \n
\n
\n \n \n
\n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\nimport { filter, switchMap } from 'rxjs/operators';\n\nimport { AspectRatioString } from '@fcom/common/interfaces';\nimport { ButtonTheme, ModalButtons } from '@fcom/ui-components';\nimport { FragmentService, MediaQueryService } from '@fcom/common/services';\nimport { CmsArticle, CmsCollection, CmsMedia } from '@fcom/core-api/interfaces';\n\n@Component({\n selector: 'fin-super-light-warning-modal',\n templateUrl: './super-light-warning-modal.component.html',\n styleUrls: ['./super-light-warning-modal.component.scss'],\n})\nexport class SuperLightWarningModalComponent implements OnInit {\n @Input() modalOpen: boolean;\n @Input() showKoreaNotification: boolean;\n @Input() contentUrl$: Observable;\n\n @Output()\n closeModal: EventEmitter = new EventEmitter();\n\n @Output()\n confirm: EventEmitter = new EventEmitter();\n\n public readonly ModalButtons = ModalButtons;\n public readonly ButtonTheme = ButtonTheme;\n aspectRatio$: Observable;\n contentCollection$: Observable>;\n\n constructor(\n private fragmentService: FragmentService,\n private mediaQueryService: MediaQueryService\n ) {}\n\n ngOnInit(): void {\n this.contentCollection$ = this.contentUrl$.pipe(\n filter(Boolean),\n switchMap((url) => this.fragmentService.getFragment>(`${url}.url`))\n );\n\n this.aspectRatio$ = this.mediaQueryService\n .isBreakpoint$('mobile')\n .pipe(map((isMobile) => (isMobile ? '1x1' : '16x9')));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { ButtonModule, IconsModule, ModalModule, NotificationsModule, UiComponentsModule } from '@fcom/ui-components';\nimport { CmsModule } from '@fcom/cms/components';\nimport { ComponentsModule, DirectiveModule, FinFormsModule, MediaQueryService, PipesModule } from '@fcom/common';\nimport { GtmModule } from '@fcom/common/gtm';\nimport { BoundContainerComponent, CommonBookingComponentsModule } from '@fcom/common-booking/components';\nimport { UpgradeAvailabilityService } from '@fcom/loyalty-plus/services/upgrade-availability.service';\nimport { CommonServiceFormsModule } from '@fcom/service-forms/components/common/common-service-forms.module';\nimport { LoginModule } from '@fcom/common/login';\nimport { DataCloudModule } from '@fcom/common/datacloud';\nimport { QualtricsModule } from '@fcom/common/qualtrics/qualtrics.module';\n\nimport { DimensionsAndDetailsModalService } from './services/dimensions-and-details-modal.service';\nimport { BookingNotificationModule } from '../../components/booking-notification/booking-notification.module';\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { BookingTicketSelectionViewComponent } from './components/booking-ticket-selection-view.component';\nimport { BoundSelectionListComponent } from './components/offers/bound-selection-list.component';\nimport { TicketSelectionHeaderComponent } from './components/offers/ticket-selection-header.component';\nimport { AirBoundsBookingTicketSelectionViewComponent } from './components/air-bounds-booking-ticket-selection-view.component';\nimport { OptimizedAirBoundsBoundSelectionListComponent } from './components/air-bounds/optimize-bound-selection-list.component';\nimport { AirBoundsBoundSelectionComponent } from './components/air-bounds/bound-selection.component';\nimport { AirBoundsFareFamilyOptionListComponent } from './components/air-bounds/fare-family-option-list.component';\nimport { BookingTicketSelectionRouteComponent } from './routes/booking-ticket-selection-route.component';\nimport { TicketSelectionGuard } from './services/ticket-selection.guard';\nimport { BookingAirBoundsService, BookingOfferListService, BookingMultiCityService } from './services';\nimport { OfferFarefamiliesComponent } from './components/offers/offer-farefamilies.component';\nimport { ItineraryUpgradeAvailabilityComponent } from './components/itinerary-upgrade-availability/itinerary-upgrade-availability.component';\nimport { SuperLightWarningModalComponent } from './components/air-bounds/super-light-warning-modal/super-light-warning-modal.component';\nimport { MultiCityViewComponent } from './components/multi-city-view/multi-city-view.component';\nimport { MultiCityFareFamilyComponent } from './components/multi-city-fare-family/multi-city-fare-family.component';\nimport { MultiCityFareFamilySelectorComponent } from './components/multi-city-fare-family-selector/multi-city-fare-family-selector.component';\nimport { MultiCityBoundsComponent } from './components/multi-city-bounds/multi-city-bounds.component';\nimport { MultiCityJourneyPriceComponent } from './components/multi-city-journey-price/multi-city-journey-price.component';\n\n@NgModule({\n imports: [\n BookingCommonModule,\n CommonModule,\n ComponentsModule,\n CommonBookingComponentsModule,\n CmsModule,\n DirectiveModule,\n FinFormsModule,\n CommonServiceFormsModule,\n GtmModule,\n DataCloudModule,\n PipesModule,\n UiTranslateModule,\n ButtonModule,\n IconsModule,\n ModalModule,\n NotificationsModule,\n UiComponentsModule,\n NotificationsModule,\n BookingNotificationModule,\n LoginModule,\n QualtricsModule,\n ],\n declarations: [\n BookingTicketSelectionRouteComponent,\n BookingTicketSelectionViewComponent,\n BoundSelectionListComponent,\n TicketSelectionHeaderComponent,\n OfferFarefamiliesComponent,\n AirBoundsBookingTicketSelectionViewComponent,\n AirBoundsBoundSelectionComponent,\n AirBoundsFareFamilyOptionListComponent,\n ItineraryUpgradeAvailabilityComponent,\n OptimizedAirBoundsBoundSelectionListComponent,\n SuperLightWarningModalComponent,\n MultiCityFareFamilyComponent,\n MultiCityViewComponent,\n MultiCityFareFamilySelectorComponent,\n MultiCityBoundsComponent,\n MultiCityJourneyPriceComponent,\n ],\n exports: [BookingTicketSelectionRouteComponent, TicketSelectionHeaderComponent, BoundContainerComponent],\n providers: [\n BookingOfferListService,\n BookingMultiCityService,\n BookingAirBoundsService,\n TicketSelectionGuard,\n MediaQueryService,\n UpgradeAvailabilityService,\n DimensionsAndDetailsModalService,\n ],\n})\nexport class TicketSelectionModule {}\n","

\n {{ 'multiCity.flightSelection.fareFamilyTitle' | finLocalization }}\n

\n\n {{ 'multiCity.flightSelection.fareFamilyNotification' | finLocalization }}\n\n\n\n\n\n\n\n\n\n {{ 'price.continueButtonTotal' | finLocalization }}: \n {{\n { amount: (selectedFareFamily$ | async)?.totalPrice, currencyCode: currency$ | async } | finPrice\n }}\n\n","import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\n\nimport { BehaviorSubject, combineLatest, map, Observable, Subscription, take } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\n\nimport { BoundType, PaxAmount } from '@fcom/dapi';\nimport { ButtonPosition } from '@fcom/ui-components';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { Bound, Cabin, FareInformation, FinnairCabinClass } from '@fcom/dapi/api/models';\nimport { ExtendedFareFamily, FareFamilyBadgeType } from '@fcom/common-booking/index';\nimport { GlobalBookingFlight, globalBookingFlights } from '@fcom/common/store';\nimport { CabinClassModalComponent } from '@fcom/common-booking/components/flight-selection/cabin-class-modal/cabin-class-modal.component';\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n GtmEvent,\n GtmMulticityFareFamilySelectionData,\n GtmPurchaseFlow,\n OfferListFetchParams,\n} from '@fcom/common/interfaces';\nimport { combineFlightDates, combineOriginDestination } from '@fcom/common/utils/gtm.utils';\nimport { isShortHaulFlight } from '@fcom/common/utils';\n\nimport { BookingMultiCityService } from '../../services';\nimport {\n selectMultiCityAvailableFareFamilies,\n selectMultiCityCurrency,\n selectMultiCityFareFamiliesPerCabin,\n selectMultiCitySelectedBounds,\n} from '../../../../store/selectors';\nimport { CountryCode } from '../../../../utils';\nimport { getPreselectedFareFamily } from '../../utils/offer.utils';\n\n@Component({\n selector: 'fin-multi-city-fare-family',\n templateUrl: './multi-city-fare-family.component.html',\n})\nexport class MultiCityFareFamilyComponent implements OnInit {\n public ButtonPosition = ButtonPosition;\n\n private subscriptions = new Subscription();\n\n @Input() paxAmount$: Observable;\n\n @Input() flightSearch$: Observable;\n\n @Output() continueToMultiCityBounds = new EventEmitter();\n\n fareFamilies$: Observable;\n selectedFareFamily$ = new BehaviorSubject(null);\n currency$: Observable;\n showKoreaNotification$: Observable;\n availableCabins$: Observable;\n\n @ViewChild(CabinClassModalComponent)\n private cabinClassModal: CabinClassModalComponent;\n selectedBounds$: Observable;\n flights$: Observable;\n isAllShortHaul$: Observable;\n\n constructor(\n private store$: Store,\n private bookingMultiCityService: BookingMultiCityService,\n private gtmService: GtmService\n ) {}\n\n ngOnInit(): void {\n this.fareFamilies$ = combineLatest([\n this.store$.pipe(select(selectMultiCityAvailableFareFamilies)),\n this.store$.pipe(select(selectMultiCityFareFamiliesPerCabin)),\n this.selectedFareFamily$,\n ]).pipe(\n map(([fareFamilies, fareFamiliesPerCabin, selectedFareFamily]) => {\n return fareFamilies.map((fareFamily) => {\n const cabinClass = this.bookingMultiCityService.getCabinForFareFamily(\n fareFamily.fareFamilyCode,\n fareFamiliesPerCabin\n ) as FareInformation['cabinClass'];\n\n return {\n id: `${fareFamily.fareFamilyCode}-multi`,\n fareFamilyCode: fareFamily.fareFamilyCode,\n fareInformation: [\n {\n bookingClass: cabinClass,\n cabinClass,\n fareBasisCode: null,\n segmentId: `${fareFamily.fareFamilyCode}-multi`,\n },\n ],\n benefits: fareFamily,\n price: fareFamily.totalPrice,\n totalPrice: fareFamily.totalPrice,\n isStartingFromPrice: true,\n disabled: false,\n selected: fareFamily.fareFamilyCode === selectedFareFamily?.fareFamilyCode,\n badgeType:\n fareFamily.fareFamilyCode === getPreselectedFareFamily(cabinClass, fareFamilies)?.fareFamilyCode\n ? FareFamilyBadgeType.POPULAR\n : null,\n };\n });\n })\n );\n\n this.currency$ = this.store$.pipe(select(selectMultiCityCurrency));\n\n this.selectedBounds$ = this.store$.select(selectMultiCitySelectedBounds);\n\n this.flights$ = this.store$.pipe(globalBookingFlights());\n\n this.isAllShortHaul$ = this.flights$.pipe(\n map((flights) => flights.every((flight) => isShortHaulFlight(flight.origin, flight.destination)))\n );\n\n this.showKoreaNotification$ = this.flights$.pipe(\n map((flights) => {\n return flights[0].origin.countryCode === CountryCode.KOREA;\n })\n );\n\n this.availableCabins$ = this.fareFamilies$.pipe(\n map((fareFamilies) => {\n return fareFamilies.reduce((acc, fareFamily) => {\n const cabinClass = fareFamily.fareInformation[0].cabinClass as FinnairCabinClass;\n const availableCabins = [FinnairCabinClass.ECONOMY, FinnairCabinClass.ECOPREMIUM, FinnairCabinClass.BUSINESS];\n\n if (!acc.includes(cabinClass) && availableCabins.includes(cabinClass)) {\n acc.push(cabinClass);\n }\n\n return acc;\n }, []);\n })\n );\n }\n\n selectFareFamily(selectedFareFamily: { fareFamily: ExtendedFareFamily; checked: boolean }): void {\n this.subscriptions.add(\n this.store$.pipe(select(selectMultiCityAvailableFareFamilies), take(1)).subscribe((fareFamilies) => {\n if (!selectedFareFamily.checked) {\n this.selectedFareFamily$.next(null);\n\n return;\n }\n\n this.selectedFareFamily$.next(\n fareFamilies?.find((fareFamily) => {\n return fareFamily.fareFamilyCode === selectedFareFamily.fareFamily.fareFamilyCode;\n })\n );\n })\n );\n }\n\n continueWithSelection(): void {\n const selectedFareFamily = this.selectedFareFamily$.getValue();\n this.continueToMultiCityBounds.emit(selectedFareFamily);\n\n this.sendSelectedFareFamilySelection(selectedFareFamily);\n }\n\n sendSelectedFareFamilySelection(fareFamily: ExtendedFareFamily): void {\n this.subscriptions.add(\n combineLatest([this.flightSearch$, this.paxAmount$, this.currency$])\n .pipe(take(1))\n .subscribe(([params, paxAmount, currency]) => {\n const enhancedData: GtmMulticityFareFamilySelectionData = {\n boundType: BoundType.multi,\n fareFamilyName: fareFamily.brandName,\n travelClass: params.cabin,\n currencyCode: currency,\n price: fareFamily.totalPrice,\n points: null,\n paxAmount: (paxAmount.adults + paxAmount.children + paxAmount.infants).toString(),\n purchaseFlow: GtmPurchaseFlow.BOOKING,\n dates: combineFlightDates(params.flights),\n route: combineOriginDestination(params.flights),\n stage: 'fareFamilySelection',\n };\n\n this.gtmService.multicityFareFamilySelection(GtmEvent.FLIGHT_SELECTION_CLICK, enhancedData);\n })\n );\n }\n\n openCabinClassModal(cabinClass: string): void {\n this.cabinClassModal.openModal(null, cabinClass.toLowerCase());\n }\n}\n","\n \n \n \n \n \n \n \n \n \n {{ fareFamily.brandName }}\n \n\n \n \n \n {{\n (+(priceDifference$ | finMap: 'amount' | async) < 0 ? '-' : '+') +\n (priceDifference$ | async | finPrice: { absoluteValue: true })\n }}\n \n \n {{ defaultPrice$ | async | finPrice }}\n \n \n \n \n \n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, filter, map, Observable, of } from 'rxjs';\n\nimport { Amount } from '@fcom/dapi';\nimport { ExtendedFareFamily } from '@fcom/common-booking/interfaces';\n\n@Component({\n selector: 'fin-multi-city-fare-family-selector',\n styleUrls: ['./multi-city-fare-family-selector.component.scss'],\n templateUrl: './multi-city-fare-family-selector.component.html',\n})\nexport class MultiCityFareFamilySelectorComponent implements OnInit {\n readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input({ required: true }) fareFamily$: Observable;\n @Input({ required: true }) currencyCode: string;\n @Input({ required: true }) basePrice$: Observable;\n @Input() selectedFareFamily$: Observable = of(null);\n\n @Output() selectFareFamily: EventEmitter = new EventEmitter();\n\n priceDifference$: Observable;\n defaultPrice$: Observable;\n isChecked$: Observable;\n\n ngOnInit(): void {\n this.defaultPrice$ = this.fareFamily$.pipe(\n map((fareFamily) => ({ amount: fareFamily.totalPrice, currencyCode: this.currencyCode }))\n );\n\n this.isChecked$ = combineLatest([this.fareFamily$, this.selectedFareFamily$]).pipe(\n map(([fareFamily, selectedFareFamily]) => fareFamily?.fareFamilyCode === selectedFareFamily?.fareFamilyCode)\n );\n\n this.priceDifference$ = combineLatest([this.fareFamily$, this.basePrice$]).pipe(\n filter(([fareFamily, basePrice]) => Boolean(fareFamily && basePrice)),\n map(([fareFamily, basePrice]) => ({\n amount: String(Number(fareFamily.totalPrice) - Number(basePrice)),\n currencyCode: this.currencyCode,\n }))\n );\n }\n\n checkboxChange(): void {\n this.selectFareFamily.emit();\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\n\nimport { ElementActions, ElementTypes, GaContext } from '@fcom/common/interfaces';\nimport { ButtonSize, ButtonTheme, IconPosition, ModalButtons, NotificationLayout } from '@fcom/ui-components';\nimport { ExtendedFareFamily } from '@fcom/common-booking/interfaces';\nimport { GtmService } from '@fcom/common/gtm';\n\n@Component({\n selector: 'fin-multi-city-journey-price',\n templateUrl: './multi-city-journey-price.component.html',\n styleUrls: ['./multi-city-journey-price.component.scss'],\n})\nexport class MultiCityJourneyPriceComponent {\n readonly ButtonSize = ButtonSize;\n readonly ButtonTheme = ButtonTheme;\n readonly ElementTypes = ElementTypes;\n readonly IconPosition = IconPosition;\n readonly NotificationLayout = NotificationLayout;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n readonly ModalButtons = ModalButtons;\n\n @Input() fareFamily: ExtendedFareFamily;\n @Input() price: string;\n @Output() resetSelection = new EventEmitter();\n\n modalOpen = false;\n changeTicketTypeModalOpen = false;\n\n constructor(private gtmService: GtmService) {}\n\n openInfoModal(): void {\n this.modalOpen = true;\n\n this.gtmService.trackElement(\n 'multicity-ticket-type-info-modal',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n }\n\n openResetWarningModal(): void {\n this.changeTicketTypeModalOpen = true;\n\n this.gtmService.trackElement(\n 'multicity-change-ticket-type',\n GaContext.FLIGHT_SELECTION,\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n }\n}\n","
\n
\n
\n \n \n \n
\n
\n \n {{ 'multiCity.flightSelection.changeTicketType' | finLocalization }}\n \n
\n
\n
\n
\n {{ 'multiCity.flightSelection.totalPrice' | finLocalization }}\n
\n
{{ price }}
\n
\n
\n\n\n \n {{ 'multiCity.flightSelection.ffModalNotificationSubtitle' | finLocalization }}\n \n
\n \n
\n
\n
\n \n
\n

\n {{ 'bookingSearch.boundSelection.informationAboutBenefits' | finLocalization }}\n

\n \n
\n
\n \n
\n \n \n \n \n
\n\n\n
\n {{ 'multiCity.flightSelection.changeTicketTypeWarningModal' | finLocalization }}\n
\n
\n \n \n
\n\n","\n \n \n\n
\n
\n {{\n 'multiCity.flightSelection.boundTitle'\n | finLocalization\n : {\n index: currentBound,\n totalCount: amountOfBounds$ | async,\n origin: flights$ | finMap: currentBound - 1 + '.origin.cityName' | async,\n destination: flights$ | finMap: currentBound - 1 + '.destination.cityName' | async,\n }\n }}\n
\n {{\n (flights$ | finMap: '' + (currentBound - 1) | async).departureDate | finDateFormat: 'FULL'\n }}\n \n \n \n \n \n \n \n \n \n \n \n {{ 'routeNotification.sustainableRoute' | finLocalization }}\n \n {{ 'routeNotification.sustainableRouteNoPriorities' | finLocalization }}\n \n \n \n \n\n \n @if (hasTrainSegment[offerIndex]) {\n \n \n {{ 'routeNotification.containsTrainSegment.description' | finLocalization }}\n \n \n }\n \n\n 0\">\n \n \n \n \n \n {{\n 'ticketSelection.differentCabinClassFirstWarningNew'\n | finLocalization\n : {\n origin: itinerary.departure.locationCode,\n destination: itinerary.arrival.locationCode,\n }\n }}\n \n \n {{\n 'ticketSelection.differentCabinClassWarningNew'\n | finLocalization\n : {\n origin: itinerary.departure.locationCode,\n destination: itinerary.arrival.locationCode,\n }\n }}\n \n \n {{\n 'ticketSelection.differentCabinClassPremiumEconomyWarningNew'\n | finLocalization\n : {\n origin: itinerary.departure.locationCode,\n destination: itinerary.arrival.locationCode,\n }\n }}\n \n \n {{\n 'ticketSelection.differentCabinClassEconomyWarningNew'\n | finLocalization\n : {\n origin: itinerary.departure.locationCode,\n destination: itinerary.arrival.locationCode,\n }\n }}\n \n \n\n \n {{ 'ticketSelection.differentCabinClassWarningLink.linkText' | finLocalization }}\n \n \n \n \n \n\n 0\"\n class=\"mr-xsmall bound-selection-notes\"\n [theme]=\"NotificationTheme.WARNING\"\n >\n {{ 'ticketSelection.notes.' + note | 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 {{ 'price.continueButtonTotal' | finLocalization }}: \n {{\n selectedOfferPrice$ | async | finPrice\n }}\n\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { IconLibrary, SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n map,\n Observable,\n of,\n Subject,\n Subscription,\n take,\n} from 'rxjs';\n\nimport {\n BookingAppState,\n MultiCityOffer,\n MultiCityStatus,\n OffersPerBound,\n SelectionPhase,\n} from '@fcom/common/interfaces/booking';\nimport {\n ButtonPosition,\n ButtonSize,\n ButtonTheme,\n ModalButtons,\n NotificationTheme,\n TabLayoutType,\n} from '@fcom/ui-components';\nimport { GlobalBookingFlight } from '@fcom/common/store';\nimport { BUS_AIRCRAFT_CODE, ExtendedFareFamily, TRAIN_AIRCRAFT_CODE } from '@fcom/common-booking/interfaces';\nimport { GtmEvent, LoaderType } from '@fcom/common/interfaces';\nimport { LoginActions } from '@fcom/core/actions';\nimport { LoginStep } from '@fcom/core-api/login';\nimport { Bound, FinnairCabinClass, FinnairLocation } from '@fcom/dapi/api/models';\nimport { Amount, BoundType, PaxAmount } from '@fcom/dapi';\nimport { isFlight, priorityServicesAvailable } from '@fcom/common-booking/utils/common-booking.utils';\nimport { GtmService } from '@fcom/common/gtm';\nimport { getGtmMulticityOffertSelectionData } from '@fcom/common/utils/gtm.utils';\n\nimport { BookingMultiCityService } from '../../services';\nimport {\n selectMultiCityAvailableFareFamilies,\n selectMultiCityOffers,\n selectMultiCitySelectedBounds,\n selectMultiCitySelectedFareFamily,\n selectMultiCitySelectedItinerary,\n selectMultiCityStatus,\n} from '../../../../store/selectors';\n\n@Component({\n selector: 'fin-multi-city-bounds',\n templateUrl: './multi-city-bounds.component.html',\n styleUrls: ['./multi-city-bounds.component.scss'],\n})\nexport class MultiCityBoundsComponent implements OnInit {\n readonly BoundType = BoundType;\n readonly ButtonPosition = ButtonPosition;\n readonly ButtonSize = ButtonSize;\n readonly ButtonTheme = ButtonTheme;\n readonly IconLibrary = IconLibrary;\n readonly LoaderType = LoaderType;\n readonly ModalButtons = ModalButtons;\n readonly MultiCityStatus = MultiCityStatus;\n readonly NotificationTheme = NotificationTheme;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly TabLayoutType = TabLayoutType;\n readonly FinnairCabinClass = FinnairCabinClass;\n\n modalOpen = false;\n\n private subscriptions = new Subscription();\n currentBoundDetails$: Subject = new Subject();\n activeTab$ = new Subject();\n upgradeTabSelected$: Observable;\n selectionPhase$ = of(SelectionPhase.MULTICITY);\n\n offers$: Observable;\n matchingOffers$: Observable;\n selectedFareFamily$: Observable;\n selectedItinerary$: Observable;\n selectedBounds$: Observable;\n offersPerBound$: Observable;\n currency$: Observable;\n selectedOffer$ = new BehaviorSubject(null);\n offersStatus$: Observable;\n cheapestMatchingOffer$: Observable<{\n price: string;\n offer: MultiCityOffer;\n }>;\n fareFamilies$: Observable;\n selectedOfferPrice$: Observable;\n hasBusLeg$: Observable;\n hasTrainSegment$: Observable;\n priorityServicesAvailable$: Observable;\n\n @Input({ required: true }) amountOfBounds$: Observable;\n @Input({ required: true }) currentBound$: Observable;\n @Input({ required: true }) flights$: Observable;\n @Input({ required: true }) paxAmount$: Observable;\n\n @Output() continueToNextBound = new EventEmitter();\n @Output() resetSelection = new EventEmitter();\n @Output() resetToBound = new EventEmitter<{\n bound: Bound;\n index: number;\n }>();\n locations$: Observable<{ [key: string]: FinnairLocation }>;\n\n constructor(\n private store$: Store,\n private bookingMultiCityService: BookingMultiCityService,\n private gtmService: GtmService\n ) {}\n\n ngOnInit(): void {\n this.offers$ = this.store$.pipe(select(selectMultiCityOffers), filter(Boolean));\n this.selectedItinerary$ = this.store$.pipe(select(selectMultiCitySelectedItinerary));\n this.offersStatus$ = this.store$.pipe(select(selectMultiCityStatus));\n this.fareFamilies$ = this.store$.pipe(select(selectMultiCityAvailableFareFamilies));\n this.offersPerBound$ = this.bookingMultiCityService.getOffersPerBounds();\n this.currency$ = this.bookingMultiCityService.getCurrency();\n this.locations$ = this.bookingMultiCityService.locations$;\n this.hasBusLeg$ = combineLatest([this.offersPerBound$, this.currentBound$]).pipe(\n filter(([_bound, index]) => {\n return index >= 1;\n }),\n map(([bound, index]) =>\n bound[index - 1].map((b) =>\n b.boundInfo.itinerary.filter(isFlight).some((i) => i.aircraft?.code?.toUpperCase() === BUS_AIRCRAFT_CODE)\n )\n )\n );\n\n this.hasTrainSegment$ = combineLatest([this.offersPerBound$, this.currentBound$]).pipe(\n filter(([_bound, index]) => {\n return index >= 1;\n }),\n map(([bound, index]) =>\n bound[index - 1].map((b) =>\n b.boundInfo.itinerary.filter(isFlight).some((i) => i.aircraft?.code?.toUpperCase() === TRAIN_AIRCRAFT_CODE)\n )\n )\n );\n this.priorityServicesAvailable$ = combineLatest([this.offersPerBound$, this.currentBound$]).pipe(\n filter(([_bound, index]) => {\n return index >= 1;\n }),\n map(([bound, index]) => bound[index - 1].map((b) => priorityServicesAvailable(b.boundInfo.itinerary)))\n );\n\n this.selectedFareFamily$ = combineLatest([\n this.fareFamilies$,\n this.store$.pipe(select(selectMultiCitySelectedFareFamily)),\n ]).pipe(\n map(([fareFamilies, selectedFareFamily]) => {\n return fareFamilies?.find((fareFamily) => {\n return fareFamily.fareFamilyCode === selectedFareFamily;\n });\n })\n );\n\n this.selectedOfferPrice$ = combineLatest([this.selectedOffer$, this.currency$]).pipe(\n map(([selectedOffer, currency]) => ({\n amount: selectedOffer?.fareFamily?.totalPrice,\n currencyCode: currency,\n }))\n );\n\n this.matchingOffers$ = combineLatest([this.selectedItinerary$, this.offers$, this.selectedFareFamily$]).pipe(\n map(([selectedItinerary, offers, selectedFareFamily]) => {\n return offers.filter((offer) => {\n const hasCorrectItinerary = selectedItinerary.every((itinerary, i) => {\n return itinerary === offer.itinerary[i];\n });\n\n const hasCorrectFareFamily = Object.values(offer.offerItems[0].fareFamilyCodePerBound).includes(\n selectedFareFamily?.fareFamilyCode\n );\n\n return hasCorrectItinerary && hasCorrectFareFamily;\n });\n })\n );\n\n this.cheapestMatchingOffer$ = combineLatest([this.matchingOffers$, this.selectedOffer$]).pipe(\n map(([offers, selectedOffer]) => {\n return this.bookingMultiCityService.findCheapestOffer(selectedOffer ? [selectedOffer.cheapestOffer] : offers);\n })\n );\n\n this.selectedBounds$ = this.store$.pipe(select(selectMultiCitySelectedBounds));\n\n this.upgradeTabSelected$ = this.activeTab$.pipe(map((index) => index === 1));\n\n this.subscriptions.add(\n this.currentBound$.pipe(distinctUntilChanged()).subscribe((currentBound) => {\n if (currentBound > 1) {\n this.findMoreFlights(currentBound - 1);\n }\n })\n );\n }\n\n clickUniqueItinerary(offer: OffersPerBound): void {\n if (this.selectedOffer$.getValue()?.itineraryId === offer.itineraryId) {\n this.selectedOffer$.next(null);\n } else {\n this.selectedOffer$.next(offer);\n }\n }\n\n findMoreFlights(boundIndex: number): void {\n this.subscriptions.add(\n this.matchingOffers$.pipe(take(1)).subscribe((matchingOffers) => {\n const cheapestOffer = this.bookingMultiCityService.findCheapestOffer(matchingOffers);\n\n this.bookingMultiCityService.fetchMultiCityMoreFlights(cheapestOffer.offer, boundIndex);\n })\n );\n }\n\n continueWithSelection(): void {\n this.subscriptions.add(\n combineLatest([this.selectedOffer$, this.currentBound$, this.currency$, this.paxAmount$])\n .pipe(take(1))\n .subscribe(([offer, currentBound, currency, paxAmount]) => {\n this.continueToNextBound.emit(offer);\n const data = getGtmMulticityOffertSelectionData(offer, currentBound, currency, paxAmount);\n this.gtmService.multicityOfferSelection(GtmEvent.FLIGHT_SELECTION_CLICK, data);\n this.selectedOffer$.next(null);\n })\n );\n }\n\n openViewDetails(bound: OffersPerBound): void {\n this.modalOpen = true;\n this.currentBoundDetails$.next(bound);\n }\n\n trackByFunction(index: number): number {\n return index;\n }\n\n triggerLogin(): void {\n this.modalOpen = false;\n this.store$.dispatch(LoginActions.setLoginPhaseStep({ step: LoginStep.CREDENTIALS }));\n }\n\n onModalClose(): void {\n this.currentBoundDetails$.next(null);\n }\n}\n","\n \n\n\n\n
\n

\n {{ 'multiCity.flightSelection.title' | finLocalization }}\n

\n\n \n
\n

\n \n {{\n 'multiCity.flightSelection.subtitle'\n | finLocalization\n : {\n noOfFlights: flights.length,\n startDate: flights[0].departureDate | finDateFormat: 'FULL_NO_YEAR',\n endDate: flights[flights.length - 1].departureDate | finDateFormat: 'FULL_NO_YEAR',\n }\n }}\n \n

\n \n
\n \n \n
    \n \n
    \n
    \n {{ flight.origin.cityName }}–{{ flight.destination.cityName }}\n
    \n
    \n
    \n {{ flight.departureDate | finDateFormat: 'FULL' }}\n
    \n \n
\n \n\n

\n
\n\n \n \n\n\n\n \n
\n
{{ title | finLocalization }}
\n

{{ content | finLocalization }}

\n\n

\n {{ 'multiCity.flightSelection.faq.title' | finLocalization }}\n \n {{ 'multiCity.flightSelection.faq.linkTitle' | finLocalization }}\n

\n
\n {{ 'bookingSearch.tryAgain' | finLocalization }}\n \n\n \n
\n\n\n \n \n \n\n \n \n \n\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { select, Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\n\nimport { GtmService } from '@fcom/common/gtm';\nimport { ButtonSize, ButtonTheme, NotificationTheme, IconPosition } from '@fcom/ui-components';\nimport { BookingAppState, MultiCityState, OffersPerBound, MultiCityStatus } from '@fcom/common/interfaces/booking';\nimport {\n ElementActions,\n GTtmMulticityTicketTypeOptions,\n GaContext,\n LoaderType,\n OfferListFetchParams,\n} from '@fcom/common/interfaces';\nimport { unsubscribe } from '@fcom/core/utils';\nimport { PaxAmount } from '@fcom/dapi';\nimport { GlobalBookingFlight, globalBookingFlights, globalBookingPaxAmount } from '@fcom/common/store';\nimport { ScrollService } from '@fcom/common/services';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { Bound } from '@fcom/dapi/api/models';\nimport { ExtendedFareFamily } from '@fcom/common-booking/interfaces';\n\nimport { BookingMultiCityService } from '../../services';\nimport {\n selectMultiCityAmountOfBounds,\n selectMultiCity,\n selectMultiCitySelectedItinerary,\n selectMultiCityStatus,\n selectMultiCityFareFamiliesPerCabin,\n selectMultiCityAvailableFareFamilies,\n} from '../../../../store/selectors';\nimport { MultiCityActions } from '../../../../store/actions';\nimport { BookingService } from '../../../../services';\nimport { setMultiCitySelectedItinerary } from '../../../../store/actions/multi-city.actions';\n\nexport enum MultiCityStep {\n FARE_FAMILY,\n BOUND_1,\n BOUND_2,\n BOUND_3,\n BOUND_4,\n BOUND_5,\n BOUND_6,\n}\n\n@Component({\n selector: 'fin-multi-city-view',\n styleUrls: ['./multi-city-view.component.scss'],\n templateUrl: './multi-city-view.component.html',\n})\nexport class MultiCityViewComponent implements OnInit, OnDestroy {\n @Input({ required: true }) flightSearch$: Observable;\n\n public MultiCityStep = MultiCityStep;\n public LoaderType = LoaderType;\n\n public readonly ButtonTheme = ButtonTheme;\n public readonly ButtonSize = ButtonSize;\n public readonly IconPosition = IconPosition;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n private subscriptions = new Subscription();\n\n step$ = new BehaviorSubject(MultiCityStep.FARE_FAMILY);\n\n MultiCityStatus = MultiCityStatus;\n NotificationTheme = NotificationTheme;\n offersStatus$: Observable;\n offers$: Observable;\n flights$: Observable;\n paxAmount$: Observable;\n currencyCode$: Observable;\n amountOfBounds$: Observable;\n selectedItinerary$: Observable;\n\n expandOpen = false;\n\n constructor(\n private store$: Store,\n private bookingMultiCityService: BookingMultiCityService,\n private scrollService: ScrollService,\n private bookingService: BookingService,\n private gtmService: GtmService\n ) {}\n\n ngOnInit(): void {\n this.flights$ = this.store$.pipe(globalBookingFlights());\n this.offersStatus$ = this.store$.pipe(select(selectMultiCityStatus));\n this.offers$ = this.store$.pipe(select(selectMultiCity), filter(Boolean));\n this.currencyCode$ = this.offers$.pipe(map((offers) => offers.currency));\n this.paxAmount$ = this.store$.pipe(globalBookingPaxAmount());\n this.selectedItinerary$ = this.store$.pipe(select(selectMultiCitySelectedItinerary));\n this.amountOfBounds$ = this.store$.pipe(select(selectMultiCityAmountOfBounds), filter(Boolean));\n this.scrollService.scrollTop();\n\n this.subscriptions.add(\n combineLatest([\n this.flightSearch$,\n this.store$.pipe(select(selectMultiCityFareFamiliesPerCabin)),\n this.store$.pipe(select(selectMultiCityAvailableFareFamilies)),\n this.offersStatus$.pipe(\n filter((status) => status === MultiCityStatus.READY),\n take(1)\n ),\n ])\n .pipe(take(1))\n .subscribe(([flightSearch, fareFamiliesPerCabin, availableFareFamilies]) => {\n const fareFamilyCodesByBookingClass: GTtmMulticityTicketTypeOptions = availableFareFamilies.reduce(\n (acc, detail) => {\n const fareFamilyCode = detail.fareFamilyCode;\n const bookingClass = Object.keys(fareFamiliesPerCabin).find((key) =>\n fareFamiliesPerCabin[key].includes(fareFamilyCode)\n );\n\n if (bookingClass) {\n const lowerCaseBookingClass = bookingClass.toLowerCase();\n return {\n ...acc,\n [lowerCaseBookingClass]: acc[lowerCaseBookingClass]\n ? `${acc[lowerCaseBookingClass]}_${fareFamilyCode}`\n : fareFamilyCode,\n };\n }\n\n return acc;\n },\n {\n economy: '',\n ecopremium: '',\n business: '',\n } as GTtmMulticityTicketTypeOptions\n );\n\n this.gtmService.multicityTicketTypeOptions(flightSearch.cabin, fareFamilyCodesByBookingClass);\n })\n );\n\n this.subscriptions.add(\n this.offersStatus$\n .pipe(\n filter((status) => {\n return [MultiCityStatus.ERROR, MultiCityStatus.NO_OFFERS, MultiCityStatus.READY].includes(status);\n }),\n take(1)\n )\n .subscribe((status) => {\n this.gtmService.trackElement(\n 'multicity-search-results',\n GaContext.BOOKING_FLOW,\n undefined,\n status,\n ElementActions.VIEW\n );\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n continueToBoundsStep(fareFamily: ExtendedFareFamily): void {\n this.store$.dispatch(\n MultiCityActions.setMultiCitySelectedFareFamily({\n fareFamily: fareFamily.fareFamilyCode,\n })\n );\n this.step$.next(MultiCityStep.BOUND_1);\n }\n\n continueToNextBound(offer: OffersPerBound): void {\n this.store$.dispatch(\n MultiCityActions.addMultiCitySelectedItinerary({\n itinerary: offer.itineraryId,\n })\n );\n\n this.subscriptions.add(\n combineLatest([this.selectedItinerary$, this.amountOfBounds$])\n .pipe(take(1))\n .subscribe(([selectedItinerary, amountOfBounds]) => {\n if (selectedItinerary.length === amountOfBounds) {\n this.selectOffer(offer);\n } else {\n this.step$.next(this.step$.getValue() + 1);\n this.scrollService.scrollTop();\n }\n })\n );\n }\n\n selectOffer(offer: OffersPerBound): void {\n this.bookingMultiCityService.createCart(offer.cheapestOffer);\n this.bookingService.setStep({ step: BOOKING_STEPS.PAXDETAILS });\n this.store$.dispatch(MultiCityActions.reset());\n }\n\n resetSelection(): void {\n this.store$.dispatch(MultiCityActions.resetSelections());\n this.step$.next(MultiCityStep.FARE_FAMILY);\n }\n\n resetToBound({ index }: { bound: Bound; index: number }): void {\n this.subscriptions.add(\n this.selectedItinerary$.pipe(take(1)).subscribe((itinerary) => {\n this.store$.dispatch(\n setMultiCitySelectedItinerary({\n itinerary: itinerary.slice(0, index),\n })\n );\n this.step$.next(index + 1);\n })\n );\n }\n\n onTryAgain(): void {\n this.bookingService.setStep({\n step: BOOKING_STEPS.ENTRY,\n });\n }\n}\n","@if (isMultiCity$ | async) {\n \n} @else if (useFpp$ | async) {\n \n \n} @else {\n \n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Params } from '@angular/router';\nimport { Location } from '@angular/common';\n\nimport { distinctUntilChanged, map, switchMap, take, tap, withLatestFrom } from 'rxjs/operators';\nimport { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';\nimport { Store } from '@ngrx/store';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { LocalDate, unsubscribe } from '@fcom/core/utils';\nimport { LocationRouteCffService } from '@fcom/core/services';\nimport { AppState, GlobalBookingTravelClass, SentryLogger } from '@fcom/core';\nimport { finShare } from '@fcom/rx';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { GtmService } from '@fcom/common/gtm';\nimport { Cabin } from '@fcom/dapi/api/models';\nimport { DataCloudService } from '@fcom/common/datacloud';\nimport { FinnairMultiCitySearchInterface, OfferListFetchParams } from '@fcom/common/interfaces';\nimport { BookingLocationCodes, SelectionPhase } from '@fcom/common/interfaces/booking';\nimport { WidgetTab } from '@fcom/booking-widget/interfaces';\nimport { loginStatus } from '@fcom/core/selectors';\nimport { LoginStatus } from '@fcom/core-api/login';\n\nimport { BookingService } from '../../../services';\nimport {\n BookingAirBoundsService,\n BookingMultiCityService,\n BookingOfferListService,\n PreSelectionParams,\n TicketSelectionParams,\n} from '../services';\n\nconst getPreSelectionParams = (p: Params): PreSelectionParams => {\n const selectedFlightsAndFareFamily: PreSelectionParams = {\n departureFlightNumbers: '',\n returnFlightNumbers: '',\n departureFareFamily: null,\n returnFareFamily: null,\n };\n if (p.flights?.[0]) {\n selectedFlightsAndFareFamily.departureFlightNumbers = p.flights[0].flightNumbers?.join(',');\n selectedFlightsAndFareFamily.departureFareFamily = p.flights[0].fareFamily;\n }\n\n if (p.flights?.[1]) {\n selectedFlightsAndFareFamily.returnFlightNumbers = p.flights[1].flightNumbers?.join(',');\n selectedFlightsAndFareFamily.returnFareFamily = p.flights[1].fareFamily;\n }\n\n return selectedFlightsAndFareFamily;\n};\n\nconst paramsAndLocaleToOfferListFetchParams = (\n queryParams: Params,\n locale: string,\n sentryLogger: SentryLogger\n): TicketSelectionParams => {\n let params: FinnairMultiCitySearchInterface;\n\n try {\n params = JSON.parse(decodeURIComponent(queryParams.json));\n } catch (error) {\n sentryLogger.error('Error parsing json query params', { error: error.message, json: queryParams.json });\n }\n const {\n cabin = Cabin.MIXED,\n flights = [],\n adults = 0,\n children = 0,\n infants = 0,\n c15s = 0,\n directFlights = false,\n isAward = false,\n promoCode,\n } = params ?? {};\n\n return {\n locale,\n flights: flights.map((flight) => {\n return {\n ...flight,\n departureDate: new LocalDate(flight.departureDate),\n };\n }),\n cabin: cabin === Cabin.FIRST ? Cabin.BUSINESS : Cabin[cabin],\n paxAmount: {\n adults,\n children,\n infants,\n c15s,\n },\n directFlights,\n ...getPreSelectionParams(params),\n isAward,\n promoCode,\n };\n};\n\n@Component({\n selector: 'fin-booking-ticket-selection-route',\n templateUrl: './booking-ticket-selection-route.component.html',\n})\nexport class BookingTicketSelectionRouteComponent implements OnInit, OnDestroy {\n fetchParams$: Observable;\n useFpp$: Observable;\n isMultiCity$: Observable;\n selectionPhase: SelectionPhase;\n goToOutboundPhase$: BehaviorSubject = new BehaviorSubject(undefined);\n\n private subscriptions = new Subscription();\n\n constructor(\n private languageService: LanguageService,\n private bookingService: BookingService,\n private bookingOfferListService: BookingOfferListService,\n private bookingAirBoundsService: BookingAirBoundsService,\n private locationRouteCffService: LocationRouteCffService,\n private activatedRoute: ActivatedRoute,\n private gtmService: GtmService,\n private dataCloudService: DataCloudService,\n private bookingMultiCityService: BookingMultiCityService,\n private store$: Store,\n private sentryLogger: SentryLogger,\n private location: Location\n ) {}\n\n ngOnInit(): void {\n this.location.subscribe(() => {\n if (this.selectionPhase === SelectionPhase.INBOUND) {\n this.goToOutboundPhase$.next();\n }\n });\n\n this.fetchParams$ = this.activatedRoute.queryParams.pipe(\n distinctUntilChanged(),\n withLatestFrom(this.languageService.locale),\n map(([params, locale]) => paramsAndLocaleToOfferListFetchParams(params, locale, this.sentryLogger)),\n finShare()\n );\n\n this.useFpp$ = this.activatedRoute.queryParams.pipe(\n switchMap((p) => {\n const params = p.json ? JSON.parse(decodeURIComponent(p.json)) : p;\n const origin = params.origin || params.flights[0].origin;\n const destination = params.destination || params.flights[0].destination;\n return this.locationRouteCffService\n .routeCffsFor(origin, destination, params.isAward, this.languageService.localeValue)\n .pipe(\n take(1),\n tap((locationRouteCffData) => {\n this.bookingService.setRouteType(locationRouteCffData.routeType);\n }),\n map((locationRouteCffData) => !!locationRouteCffData.fpp)\n );\n }),\n finShare()\n );\n\n this.subscriptions.add(\n this.fetchParams$.subscribe((p) => {\n this.updateBookingSearchParameters(p);\n this.dataCloudService.flightSearch(p);\n })\n );\n\n this.subscriptions.add(\n this.fetchParams$\n .pipe(\n distinctUntilChanged(),\n switchMap((p) =>\n this.bookingService.getLocationsFromFlights(p.flights).pipe(\n map((locations) => ({\n params: p,\n locations,\n }))\n )\n )\n )\n .subscribe(({ params, locations }) => this.gtmService.flightSearch(params, locations))\n );\n\n this.isMultiCity$ = this.fetchParams$.pipe(\n map((params) => {\n return params.flights.length > 2;\n })\n );\n\n this.fetchOffers();\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n fetchOffers(): void {\n this.subscriptions.add(\n combineLatest([\n this.fetchParams$,\n this.useFpp$,\n this.store$.pipe(\n loginStatus(),\n map((status) => status === LoginStatus.LOGGED_IN || status === LoginStatus.NOT_LOGGED_IN),\n distinctUntilChanged(),\n finShare()\n ),\n ])\n .pipe(distinctUntilChanged())\n .subscribe(([params, useFpp, isLoginStatusChanged]) => {\n // Fetch multicity offers if this is a multi-city search.\n if (params.flights.length > 2) {\n this.bookingMultiCityService.fetchMultiCityOffers(params);\n return;\n }\n if (useFpp) {\n this.bookingAirBoundsService.triggerFetchBounds(params, isLoginStatusChanged);\n } else {\n this.bookingOfferListService.triggerFetchOffers(params);\n }\n })\n );\n }\n\n /**\n * Updates the search parameters for previous steps of the flow to allow deep-linked\n * flows to access previous steps\n * @param {OfferListFetchParams} p\n */\n private updateBookingSearchParameters(p: OfferListFetchParams) {\n const locations: BookingLocationCodes[] = p.flights.map((ond) => ({\n originLocationCode: ond.origin,\n destinationLocationCode: ond.destination,\n }));\n this.bookingService.setTripType(getTripTypeFromBookingLocationCodes(locations));\n this.bookingService.setFlightsFromLocationsCodes(p.flights);\n this.bookingService.setPaxAmount(p.paxAmount);\n this.bookingService.selectTravelClass(GlobalBookingTravelClass[p.cabin]);\n this.bookingService.setActiveTab(p.isAward ? WidgetTab.AWARD : WidgetTab.FLIGHT);\n }\n\n selectionPhaseChanged(phase: SelectionPhase): void {\n if (phase === SelectionPhase.INBOUND) {\n // Add current phase to the browser history stack so that\n // when the user navigates back from the inbound phase\n // the browser will stay in flight selection\n this.location.go(this.location.path());\n }\n this.selectionPhase = phase;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Params, Router } from '@angular/router';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { ERROR_CTA_ACTIONS } from '@fcom/common/components';\n\n@Injectable()\nexport class ErrorRouteGuard implements CanActivate {\n constructor(\n private router: Router,\n private languageService: LanguageService\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n const errorParams: Params = {\n iconName: route.queryParams?.iconName,\n title: route.queryParams?.title ?? 'sorry',\n subtitle: route.queryParams?.subtitle ?? 'errors.payment.title',\n info: route.queryParams?.info ?? 'errors.payment.description',\n cta: route.queryParams?.cta ?? 'errors.payment.cta',\n ctaAction: ERROR_CTA_ACTIONS.NAVIGATE_TO_BOOKING,\n showButton: true,\n };\n\n // To clear the url params altogether, we need to work around the routing behavior a bit\n // We have the possible params saved to our errorParams object, that we got from /payment/error?params=...\n // First we clear current queryParams by navigating to the generic /error route without any params and overwriting the history\n this.router\n .navigate([this.languageService.langValue, 'booking', 'error'], { replaceUrl: true })\n .then(() => {\n // The second navigation here is the actual navigation to the /error where we pass the saved errorParams from before\n // Here we can pass the params but use the skipLocationChange option to not update the url so we'll get just /booking/error\n const urlTree = this.router.createUrlTree(\n [this.languageService.langValue, 'booking', 'error', 'PAYMENT_ERROR'],\n {\n queryParams: errorParams,\n }\n );\n this.router.navigateByUrl(urlTree, { skipLocationChange: true });\n })\n .catch(() => Promise.reject());\n\n return false;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { ErrorComponent, NavigationModule } from '@fcom/common';\nimport { createRoute } from '@fcom/common/utils';\nimport { BOOKING_STEPS, ERROR_STEPS } from '@fcom/common/config/booking-config';\n\nimport { PurchaseCheckoutModule } from './modules/purchase-checkout/purchase-checkout.module';\nimport { PurchaseCheckoutRouteComponent } from './modules/purchase-checkout/routes/purchase-checkout-route.component';\nimport { PurchaseCheckoutGuard } from './modules/purchase-checkout/services/purchase-checkout.guard';\nimport { AncillariesModule } from './modules/ancillaries/ancillaries.module';\nimport { BookingAncillariesRouteComponent } from './modules/ancillaries/routes/booking-ancillaries-route.component';\nimport { AncillariesGuard } from './modules/ancillaries/services/ancillaries.guard';\nimport { BookingRoutingComponent } from './components/booking-routing/booking-routing.component';\nimport { EntryModule } from './modules/entry/entry.module';\nimport { BookingEntryRouteComponent } from './modules/entry/routes/booking-entry-route.component';\nimport { PaxDetailsModule } from './modules/pax-details/pax-details.module';\nimport { BookingPaxDetailsRouteComponent } from './modules/pax-details/routes/booking-pax-details-route.component';\nimport { PaxDetailsGuard } from './modules/pax-details/services/pax-details.guard';\nimport { PurchaseReviewModule } from './modules/purchase-review/purchase-review.module';\nimport { BookingPurchaseReviewRouteComponent } from './modules/purchase-review/routes/booking-purchase-review-route.component';\nimport { PurchaseReviewGuard } from './modules/purchase-review/services/purchase-review.guard';\nimport { PurchaseSuccessModule } from './modules/purchase-success/purchase-success.module';\nimport { BookingPurchaseSuccessRouteComponent } from './modules/purchase-success/routes/booking-purchase-success-route.component';\nimport { PurchaseSuccessGuard } from './modules/purchase-success/services/purchase-success.guard';\nimport { TicketSelectionGuard } from './modules/ticket-selection/services/ticket-selection.guard';\nimport { TicketSelectionModule } from './modules/ticket-selection/ticket-selection.module';\nimport { BookingGuard } from './services/booking.guard';\nimport { BookingTicketSelectionRouteComponent } from './modules/ticket-selection/routes/booking-ticket-selection-route.component';\nimport { ErrorRouteGuard } from './services/error-route.guard';\n\nexport const bookingRoutes: Routes = [\n {\n path: '',\n component: BookingRoutingComponent,\n canActivate: [BookingGuard],\n children: [\n createRoute(BOOKING_STEPS.ENTRY, BookingEntryRouteComponent, [], []),\n createRoute(BOOKING_STEPS.FLIGHT_SELECTION, BookingTicketSelectionRouteComponent, [], [TicketSelectionGuard]),\n createRoute(BOOKING_STEPS.PAXDETAILS, BookingPaxDetailsRouteComponent, [], [PaxDetailsGuard]),\n createRoute(BOOKING_STEPS.ANCILLARIES, BookingAncillariesRouteComponent, [], [AncillariesGuard]),\n createRoute(BOOKING_STEPS.PURCHASE_REVIEW, BookingPurchaseReviewRouteComponent, [], [PurchaseReviewGuard]),\n // Resets order on window.confirm()\n createRoute(BOOKING_STEPS.CHECKOUT, PurchaseCheckoutRouteComponent, [], [PurchaseCheckoutGuard]),\n createRoute(BOOKING_STEPS.PURCHASE_SUCCESS, BookingPurchaseSuccessRouteComponent, [], [PurchaseSuccessGuard]),\n createRoute(ERROR_STEPS.ERROR_ROUTE, ErrorComponent, [], []),\n createRoute(ERROR_STEPS.ERROR, ErrorComponent, [], []),\n createRoute(ERROR_STEPS.PAYMENT_ERROR, ErrorComponent, [], [ErrorRouteGuard]),\n ],\n },\n];\n\n@NgModule({\n imports: [\n NavigationModule,\n EntryModule,\n TicketSelectionModule,\n PaxDetailsModule,\n AncillariesModule,\n PurchaseReviewModule,\n PurchaseCheckoutModule,\n PurchaseSuccessModule,\n RouterModule.forChild(bookingRoutes),\n ],\n declarations: [],\n providers: [BookingGuard, ErrorRouteGuard],\n exports: [RouterModule],\n})\nexport class BookingRoutesModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { HeadersModule, IconsModule } from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { CmsModule } from '@fcom/cms/components/cms.module';\nimport { ComponentsModule, NavigationTriggerModule } from '@fcom/common/components';\nimport { DirectiveModule } from '@fcom/common/directives/directive.module';\nimport { FinFormsModule } from '@fcom/common/forms';\nimport { GtmModule } from '@fcom/common/gtm/gtm.module';\nimport { LoginModule } from '@fcom/common/login';\nimport { PipesModule } from '@fcom/common/pipes/pipes.module';\nimport { LocationsModule } from '@fcom/locations';\nimport { TabsModule } from '@fcom/common-booking/modules/tabs';\nimport { CommonBookingAncillaryService } from '@fcom/common-booking/modules/ancillaries/services';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/common-booking.module';\nimport { BookingSummaryModule } from '@fcom/common-booking/components/booking-summary/booking-summary.module';\nimport { FragmentService } from '@fcom/common';\nimport { DataCloudModule } from '@fcom/common/datacloud';\n\nimport { BookingStoreModule } from './store/booking.store.module';\nimport { BookingCommonModule } from './modules/common/booking-common.module';\nimport { BookingRoutingComponent } from './components/booking-routing/booking-routing.component';\nimport { BookingRoutesModule } from './booking.routes';\nimport { BookingCartService, BookingQueueService, BookingService } from './services';\nimport { BookingGtmService } from './services/booking-gtm.service';\nimport { BookingNotificationModule } from './components/booking-notification/booking-notification.module';\nimport { BookingWidgetModule } from '../booking-widget/booking-widget.module';\n\n@NgModule({\n providers: [\n BookingCartService,\n BookingService,\n BookingGtmService,\n CommonBookingAncillaryService,\n BookingQueueService,\n FragmentService,\n ],\n imports: [\n BookingStoreModule,\n BookingRoutesModule,\n BookingCommonModule,\n CommonBookingComponentsModule,\n TabsModule,\n CmsModule,\n CommonModule,\n ComponentsModule,\n DirectiveModule,\n FinFormsModule,\n GtmModule,\n DataCloudModule,\n LoginModule,\n NavigationTriggerModule,\n PipesModule,\n RouterModule,\n UiTranslateModule,\n HeadersModule,\n IconsModule,\n LocationsModule,\n BookingNotificationModule,\n BookingSummaryModule,\n BookingWidgetModule,\n ],\n declarations: [BookingRoutingComponent],\n})\nexport class BookingModule {}\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","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = memoize;\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\n\nimport { map, catchError } from 'rxjs/operators';\nimport { Observable, of } from 'rxjs';\n\nimport { ConfigService } from '@fcom/core';\nimport { ProfileTier } from '@fcom/core-api/login';\nimport { LocalDate, pad } from '@fcom/core/utils';\n\nimport { FlightListSegment, AmadeusError } from '../interfaces/upgrade-availability.interface';\n\nenum ErrorCode {\n TIMEOUT = '3001',\n SAMELOCATION = '10001',\n NOTFOUND = '9100',\n}\n\n@Injectable()\nexport class UpgradeAvailabilityService {\n private officeId = {\n GOLD: 'HELAY08FG',\n PLATINUM: 'HELAY08FP',\n LUMO: 'HELAY08FL',\n };\n\n constructor(\n private httpClient: HttpClient,\n private configService: ConfigService\n ) {}\n\n getUpgradeAvailability(\n tier: ProfileTier,\n departure: string,\n destination: string,\n departureDate: LocalDate,\n country: string,\n language: string\n ): Observable {\n const officeId = this.officeId[tier.toUpperCase()] ? this.officeId[tier.toUpperCase()] : 'HELAY08AA';\n const error = {\n code: '',\n message: 'LOYALTY.upgradeAvailability.error.generic',\n };\n const apiUrl = this.configService.cfg.upgradeAvailabilityUrl;\n const params: HttpParams = new HttpParams()\n .set('SO_SITE_OFFICE_ID', officeId)\n .set('COUNTRY_SITE', country)\n .set('SITE', 'FINRFINR')\n .set('LANGUAGE', language)\n .set('PAGE', 'UPGD')\n .set('B_LOCATION_1', departure)\n .set('E_LOCATION_1', destination)\n .set('B_DATE_1', this.formatDate(departureDate))\n .set('EMBEDDED_TRANSACTION', 'AirAvailability')\n .set('WDS_RBD_CATALOG', '1');\n return this.httpClient.get(`${apiUrl}/`, { params }).pipe(\n map((response: any) => {\n // eslint-disable-next-line camelcase\n if (response?.avail?.list_flight) {\n return JSON.parse(JSON.stringify(response.avail.list_flight));\n } else {\n const code = response.ERROR[0].code;\n if (code === ErrorCode.TIMEOUT) {\n error.message = 'LOYALTY.upgradeAvailability.error.timeout';\n } else if (code === ErrorCode.SAMELOCATION) {\n error.message = 'LOYALTY.upgradeAvailability.error.sameLocations';\n } else if (code === ErrorCode.NOTFOUND) {\n error.message = 'LOYALTY.upgradeAvailability.error.notFound';\n }\n error.code = code;\n return error;\n }\n }),\n // eslint-disable-next-line rxjs/no-implicit-any-catch\n catchError((err) => {\n if (err.status === 504 || err.status === 408) {\n error.message = 'LOYALTY.upgradeAvailability.error.timeout';\n }\n error.code = err.status.toString();\n return of(error);\n })\n );\n }\n\n private formatDate(date: LocalDate): string {\n return `${date.localYear}${pad(date.localMonth)}${pad(date.localDay)}0000`;\n }\n}\n"],"x_google_ignoreList":[28,116]}