{"version":3,"file":"default-src_modules_booking_booking_module_ts.fb395fbe5dc9c091.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","paxDetails$","paxDetails","serviceCategoriesMap","allFlights$","allFlights","concat","isFlight","seatMapStatus$","seatMapForFlightStatus","s","enableBookingFlowSeatMapPreFetch","seatMapStatus","SeatMapStatus","seatMapForFlight","seatSubViewTopNotificationTranslation$","serviceCatalogCampaignIdsForFragment","paxCartData$","passengers$","cartPassengers","passengerDetails","pax","firstName","lastName","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","BookingRoutingComponent_fcom_booking_header_1_ng_template_10_fin_language_selector_0_Template","toggleMenu","navigateToStep","loginDialog_r3","toggleLogin","navigateBack","onHomeClick","BookingRoutingComponent_fcom_booking_header_1_ng_template_10_Template","loginStatus$","breadcrumbs$","phasesAria$","homeLink$","showHeaderLogin$","showHeaderBack$","profileName$","languageSelector_r6","isMobile$","isTablet$","bookingSummary_r8","enableModifySearch$","openBasket","edit","BookingRoutingComponent_fin_sub_header_7_fin_global_booking_widget_summary_header_3_Template","tmp_2_0","FLIGHT_SELECTION","hasBasket$","bookingSummary$","_r9","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$","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","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","_r6","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","userProfileType","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';\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 this.dataReady$ = this.cartData$.pipe(\n safeMap((data: FinnairCart) => !!data.bounds),\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\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 { BookingAppState, BookingLocationCodes, AirOffersStatus } 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 } from '@fcom/core-api/login';\nimport { loginStatus, profileName } 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 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\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';\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$])\n .pipe(\n filter(([cart, status]) => !!cart && status === CartStatus.OK),\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]}