{"version":3,"file":"default-src_modules_booking_booking_module_ts.fc9595eedf04d09e.js","mappings":"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","names":["BaseService","constructor","config","http","this","_rootUrl","rootUrl","static","__ngFactoryType__","i0","i1","i2","_angular_core__WEBPACK_IMPORTED_MODULE_1__","jDH","factory","ɵfac","ParameterCodecInstance","ParameterCodec","encodeKey","key","encodeURIComponent","encodeValue","value","decodeKey","decodeURIComponent","decodeValue","Parameter","name","options","defaultStyle","defaultExplode","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","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","ApiConfiguration","configService","cfg","oneUpgradeRootUrl","apiKey","upgradeApiGwKey","sigv4","bearerAuth","providedIn","BookingNotificationModule","_angular_core__WEBPACK_IMPORTED_MODULE_4__","$C","G2t","CommonModule","PipesModule","UiTranslateModule","UiComponentsModule","ComponentsModule","uid","HASH_UNDEFINED","funcTag","genTag","reIsHostCtor","freeGlobal","global","freeSelf","self","root","Function","arrayProto","prototype","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","toString","hasOwnProperty","objectToString","reIsNative","RegExp","call","splice","getNative","nativeCreate","Hash","entries","index","length","clear","entry","ListCache","MapCache","assocIndexOf","eq","getMapData","data","__data__","isKeyable","object","getValue","baseIsNative","isObject","isMasked","func","pattern","isFunction","tag","isHostObject","test","toSource","undefined","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","has","get","Cache","other","hashClear","delete","hashDelete","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","mapCacheClear","hash","string","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","module","exports","DataCloudModule","core","initialState","step","BOOKING_STEPS","ENTRY","bookingReducer","state","action","BookingActions","setIn","all","union","setPaymentStatus","PaymentActions","seal","cartStatus","CartStatus","INITIAL","dirty","fareRules","CART_STATUS","CART_URL","CART_DATA","ACCEPT_TERMS","setCartPartStates","newStatus","partIds","DataUtils","wrap","updateIn","updatingState","reduce","acc","cur","generateCartPartId","cartData","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","filter","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","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","maxStops","nextFilters","outboundCache","boundsReducer","BoundsActions","outboundAirBoundId","isSelectedCheapestOffer","boundGroups","some","boundGroup","find","fareFamily","isCheapestOffer","inboundAirBoundId","defaultCabin","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","imports","StoreModule","forFeature","PurchaseCheckoutGuard","store$","bookingService","platform","paymentCheck","termsAndCondition","snapshot","pipe","acceptTerms","cartIdHash","cartIdAndHash","pay","paymentStatus","orderIdHash","orderFetchInformation","isPresent","PaymentStatus","PENDING_VERIFICATION","canActivate","_route","_state","isPlatformServer","setStep","PURCHASE_REVIEW","PLATFORM_ID","PurchaseCheckoutModule","OrderApiModule","CommonBookingComponentsModule","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_Conditional_1_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_container_1_div_1_Conditional_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","_r11","SEAT_WIFI_BUNDLE_REMOVAL_CONFIRM_MODAL_TRANSLATION_KEYS","passengersWithSeatWifiBundleSelected$","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_Conditional_2_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_Conditional_3_Template","SmpComponent_div_2_ng_container_1_ng_container_19_ng_template_2_div_0_Conditional_4_Template","_c1","LOUNGE","MEAL","WIFI","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_r12","_r13","showSubview","closeSidebar","sideBarOpen","boundsOrFlights$","locations$","_c2","points_r14","SvgLibraryIcon","TRANSFER_LOADER","SmpComponent_div_2_ng_container_1_p_3_Template","SmpComponent_div_2_ng_container_1_Conditional_5_Template","_r2","viewDetails","closeConfirmModal","changeStep","emit","loadNextSeatMap","updateCartServices","SmpComponent_div_2_ng_container_1_ng_container_19_Template","SmpComponent_div_2_ng_container_1_Conditional_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$","_r15","closeSeatPreselection","tripType$","seatSelectionLoading$","SmpComponent_div_2_ng_container_1_Template","SmpComponent_div_2_Conditional_3_Template","showSeatPreSelection$","firstContentParagraph","secondContentParagraph","closeButton","continueButton","SmpComponent","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$","enableSpecialUpsellCategory","REGRESSION_TEST_WORKAROUND","currentCategory","services","tier","ProfileTier","CORPORATE","GtmPurchaseFlow","serviceCategories$","serviceCategories","cartFlights$","cartFlights","currentServices","combinedServices$","combinedCartServicesMap","getTripTypeFromBounds","profileType","previousStep","dismissed","cart","PAXDETAILS","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$","productCardNotification$","count","resolveProductCardNotification","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","travelers","enableBookingFlowAncillaryBundles","traveler","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","removeSelection","confirmationModalTranslationKeys","cartBeforeUpdate","cartAfterUpdate","addedServices","removedServices","addedProducts","removedProducts","changedServices","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","flightEligibilities","serviceFlightId","FinnairServiceCatalogEligibilityReason","PURCHASE_SEAT_SELECTION_NOT_ELIGIBLE_WHEN_DISCOUNTS_EXIST_FOR_CORPORATE","PURCHASE_NOT_ELIGIBLE_FOR_OTHER_AIRLINE","CABIN_BAGGAGE","BAGGAGE","bound","passengersMissingCategoryService","notification","messageKey","WARNING","icon","B2B","titleKey","CAMPAIGN","DISCOUNT","i4","i5","i6","viewQuery","SmpComponent_Conditional_0_Template","SmpComponent_div_2_Template","cartDataReady$","AncillariesComponent","ready","C","AppConstants","dataReady$","cartData$","userProfileType","lastName","paxDetails$","paxDetails","serviceCategoriesMap","allFlights$","allFlights","concat","isFlight","seatMapStatus$","seatMapForFlightStatus","s","enableBookingFlowSeatMapPreFetch","seatMapStatus","SeatMapStatus","seatMapForFlight","seatSubViewTopNotificationTranslation$","serviceCatalogCampaignIdsForFragment","translationKey","translate","paxCartData$","passengers$","cartPassengers","passengerDetails","pax","firstName","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","isAward","isAwardBooking","flowData","resolvePurchaseFlow","VERIFIED","globalBookingFlights","globalBookingDiscountCode","orderDataValue","discountCode","tripType","totalPrice","included","completePurchase","serviceFlow","ServiceFlow","AWARD","bufferCount","bufferSize","startBufferEvery","operate","source","subscriber","buffers","createOperatorSubscriber","toEmit","buffer","arrRemove","complete","oldCart","newCart","outboundChanged","equals","inboundChanged","cartDataValue","checkoutFlights","flightSelectionData$","globalBookingPaxAmount","paxAmount","merge","outboundSelectionGtmData","inboundSelectionGtmData","outboundOffersSelectionGtmData","inboundOffersSelectionGtmData","enhancedData","flightSelection","FLIGHT_SELECTION_CLICK","flightSelectionSelect","sendFlightSelectionDataCloud","currentStep_r5","_r4","activateSelectionPhase","languageCode","LANGUAGE_SELECTOR_CONTEXT","currentStep_r7","_r6","toggleMenu","navigateToStep","loginDialog_r3","toggleLogin","navigateBack","onHomeClick","BookingRoutingComponent_fcom_booking_header_1_fin_language_selector_11_Template","BookingRoutingComponent_fcom_booking_header_1_fin_language_selector_13_Template","loginStatus$","breadcrumbs$","phasesAria$","homeLink$","showHeaderLogin$","showHeaderBack$","profileName$","isMobile$","isTablet$","bookingSummary_r9","enableModifySearch$","openBasket","edit","BookingRoutingComponent_fin_sub_header_7_fin_global_booking_widget_summary_header_3_Template","tmp_2_0","FLIGHT_SELECTION","hasBasket$","bookingSummary$","closeBasket","basketOpen$","SHOW_BUTTON_STATES","LoginStatus","LOGGED_IN","NOT_LOGGED_IN","BookingRoutingComponent","navigationMenuService","renderer","pageMetaService","mediaQueryService","joinService","_bookingGtmService","TARGET_HEIGHT_ELEMENT","LanguageSelectorContext","LoginWidgetContext","isFirstStep$","isFirstStep","isBreakpoint$","orderSummary$","dates","TzDate","departure","dateTime","toLocalDate","returnDate","arrival","originLocationCode","locationCode","destinationLocationCode","boundsStatus","offersStatus","select","selectMultiCityStatus","globalBookingSelections","globalBooking","orderSummary","bookingLocations","bookingPaxAmount","adults","children","c15s","infants","getTripTypeFromBookingLocationCodes","lang","isNavigationMenuOpen$","onNavigationSetBookingServiceStepFromUrl","showBasket$","isMobile","phase","ANCILLARIES","isBookingFrontPage$","loginStatus","profileName","scrollToTopOnStepChange","bindBasketHandling","initButtonVisibilities","showLinks$","o","currentStage","breadcrumbs","showLinks","formatBreadcrumbs","sellAncillariesOutbound","sellAncillariesInbound","currentStep","PURCHASE_SUCCESS","indexOf","prevStep","curStep","setTitle","backButtonPressed","setActive","bookingStep","BOOKING_STEPS_ARRAY","item","locale","_event","trackElement","ElementTypes","BUTTON","ElementActions","CLICK","toggleMenuOpen","activateLinks","hideAncillaries","CHECKOUT","active","disabled","navigateByUrl","events","isNavigationEvent","setStepFromUrl","routerState","navigationEnd$","e","NavigationEnd","isErrorRoute$","ERROR_STEPS","getBookingStepFromUrl","skipRouteChange","hideModal$","Observable","observer","listen","target","innerWidth","debounceTime","width","mapTo","basketOpen","modalOpenSubject$","isNavigationMenuOpen","bookingSummary","TripType","MULTICITY","hasBasket","i7","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","EntryModule","BookingCommonModule","DirectiveModule","BookingWidgetModule","BookingEntryRouteComponent","nativeBridge","shouldRender","navigate","replaceUrl","queryParamsHandling","BookingEntryRouteComponent_div_0_Template","PaxDetailsGuard","canAccess","PaxDetailsModule","FormsModule","FinFormsModule","GtmModule","CmsModule","ButtonModule","ModalModule","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","firstPassenger","langKey","country","language","payload","email","pageUrl","NewsLetterSource","postSubscribeRequest","PaxDetailsMarketingConsentComponent_div_0_Template","PaxDetailsMarketingConsentComponent_ng_template_2_Template","PaxDetailsMarketingConsentComponent_ng_template_4_Template","alt","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","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","_r12","addEmail","removeEmail","emailsArray","errors","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","_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","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","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","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","additionalEmail","EMAIL_PATTERN","additionalEmailValidator","frequentFlyerValueChangeValidation","sanitizedData","getRawValue","paxData","trimAndReplaceWhitespace","addedEmail","reset","passengerIndex","pType","FREQUENT_FLIER_AIRLINES","airline","FINNAIR_ACCOUNT","getTravelersForType","ADT","childs","CHD","locked","travellingControl","getField","fieldName","frequentFlyerCards","card","fc","setErrors","sameCardNumberExists","cardEmptyInFormAndCart","hasMatchingCardInCart","travelerIds","getTravelerIdsExcludingInfants","passengerTypeCode","primaryPaxId","serviceMapForCategoriesForTravelers","removeCancellationCoverFromNonPrimaryPax","travelerServices","mapDisplayTitlesForPaxAncillaries","servicesForTraveler","displayTitle","selectionMapForCategoriesForTravelers","PaxDetailsFormComponent_fcom_loader_0_Template","PaxDetailsFormComponent_div_2_Template","PaxDetailsFormComponent_span_14_Template","PaxDetailsFormComponent_span_21_Template","PaxDetailsFormComponent_fcom_icon_25_Template","_selectCommonBookingState","createFeatureSelector","COMMON_BOOKING_FEATURE_KEY","_upgradeOfferState","createSelector","upgradeOffer","flight_r3","bound_r1","i_r2","isDeparture_r5","ctx_r6","AIRCRAFT_HORIZONTAL_BLOCK","AIRCRAFT_HORIZONTAL","uniqueAirlineNames","duration","stops","fareFamilyBrandName","prices$","upgradeOffer_r6","upgradeFareFamily","brandName","UpgradePromotionModalComponent_ng_container_0_ng_container_1_ng_container_5_Template","UpgradePromotionModalComponent_ng_container_0_ng_container_1_ng_template_25_Template","cart_r8","fareFamilyOption_r9","currentFareFamily","currentBenefits$","ARROW_RIGHT","newBenefits$","UpgradePromotionModalComponent_ng_container_0_ng_container_1_Template","upgradeOffer$","benefit_r10","UpgradePromotionModalComponent_ng_template_2_div_14_Template","fareFamily_r11","brandColor","selection_r13","price_r12","brandNameDescription","benefits_r14","UpgradePromotionModalComponent","currencyCode$","offer","currentPrice","inboundPrice","outboundPrice","priceStr","parseFloat","strToAmount","outboundUpgradePrice","inboundUpgradePrice","newPrice","totalUpgradePrice","translatedBenefitRows","benefit","shouldDisplayBenefit","UpgradePromotionModalComponent_ng_container_0_Template","UpgradePromotionModalComponent_ng_template_2_Template","upgradeOffer_r2","ctx_r2","LoaderColor","WHITE","_r5","openFareFamilyModal","key_r6","upgradePriceDiffTrend_r8","upgradePriceDifference_r7","UpgradePromotionComponent_ng_container_0_div_3_div_36_span_1_Template","upgradePriceDifference$","_r9","key_r10","UpgradePromotionComponent_ng_container_0_div_3_button_19_Template","UpgradePromotionComponent_ng_container_0_div_3_div_36_Template","UpgradePromotionComponent_ng_container_0_div_3_button_41_Template","openUpgradeModal","currentTotalPrice$","MMB_TICKET_CHANGES","selectedBenefitKey$","upgradePriceDiffTrend$","suggestedBenefitKey$","ButtonSize","MEDIUM","hide","CHECKMARK_OUTLINE","CLOSE_DELETE","DARK_TERTIARY_GHOST","UpgradePromotionComponent_ng_container_0_div_1_Template","UpgradePromotionComponent_ng_container_0_div_3_Template","UpgradePromotionComponent_ng_container_0_div_5_Template","UpgradePromotionComponent_ng_container_0_div_7_Template","closeModals","UpgradeStatus","LOADING","IN_PROGRESS","DONE","fareFamilyModalOpen","INIT","HIDDEN","GA_ELEMENT_NAME","UpgradePromotionComponent","IconPosition","upgradeModalOpen","selectedUpgradeOffer","safeSelect","_offer","diff","getSelectedBenefitKey","getSuggestedBenefitKey","setStatusListeners","upgradeStatus","BANNER","VIEW","currentCartStatus","japanOrigin","confirmUpgrade","UpgradePromotionComponent_ng_container_0_Template","CUSTOM","PaxDetailsComponent_ng_container_1_fin_upgrade_promotion_1_Template","infoMessageKey$","EMBEDDED","emitReady","setInfoMessage","PaxDetailsComponent","enableTicketTypeUpselling","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","currentCartData","getAllFlightsFromCartOrOrder","allRequests","current","resetSeatMap","queueSeatSelectionReset","_cart","_status","fetchSeatMapOrSetNoAvailability","finnairCart","ffCard","BookingPaxDetailsRouteComponent_fin_korea_notification_1_Template","PurchaseReviewGuard","isReviewAndPayFlow","route","requestedOrderId","queryParamMap","requestedHash","payStatus","isCartInErrorStateOrDoWeHaveTravelers","isAncillariesSkipped","PurchaseReviewModule","localizationProvider","triggerLazyLocalizations","I18nKey","MMB","CommonBookingAncillariesModule","FcomFormsModule","IconsModule","NotificationsModule","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","serviceSelection","_services","_cartOrOrder","cartOrOrder","mapErrorForSentry","SafContributionProductComponent_fin_pax_ancillary_product_0_Template","SafContributionProductComponent_fcom_modal_3_Template","backToDateSelection","booking_r5","summary$","image$","isOrder$","IconLibrary","SVG_LIBRARY","CLOCK","TRAIN","tmp_11_0","rebookPolicies$","i_r7","label","tmp_12_0","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Conditional_3_Conditional_6_Template","cancellationPolicies$","inboundShowFlexTicketNotification$","bound_r10","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_span_1_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Conditional_3_Template","openTicketRulesModal","handleFlightCardToggle","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_div_10_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_Conditional_14_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_button_16_Template","flightCardExpandersOpen","booking_r12","benefits","fareFamilyCode","handleViewDetailsModal","STEPS","PurchaseReviewComponent_ng_template_5_div_7_div_8_div_5_Template","isFirst_r13","PurchaseReviewComponent_ng_template_5_div_7_Conditional_4_Template","PurchaseReviewComponent_ng_template_5_div_7_Conditional_6_Template","PurchaseReviewComponent_ng_template_5_div_7_div_8_Template","multiCityStopoverDurationNotification$","hasTrainSegment$","PurchaseReviewComponent_ng_template_5_ng_container_9_ng_container_6_fin_sustainability_trip_message_1_Template","shouldDisplaySafContributionMessage$","PurchaseReviewComponent_ng_template_5_ng_container_9_ng_container_6_Template","PurchaseReviewComponent_ng_template_5_ng_container_9_fin_sustainability_trip_message_8_Template","safContributionUrl$","shouldDisplayCombinedTripMessage$","_r14","cartOrOrderStatusUpdating$","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","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","goToSelectionPhase","SelectionPhase","OUTBOUND","INBOUND","isOneWayOffers$","departureDate$","returnDate$","selectedOutbound$","selectedInbound$","paxAmount$","selectionPhase$","tripLocations$","phase_r8","handleBoundOpen","selectOutbound","selectOutboundFareFamily","handleShowBenefits","selectSortBy","onShowSpinner","selectedSortBy$","enabledOutboundIds$","cheapestCombinableOutboundPrices$","outbounds$","showOutboundFilters$","outboundSorting$","outboundIdSortOrder$","selectedOutboundFareFamilyCode$","selectInbound","selectInboundFareFamily","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","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","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","request","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","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","cabinAutoScrolled","preSelectedFareFamilyId$","enableFareFamilyAutoScroll$","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","isGlobalBookingWidgetClosed$","isGlobalBookingWidgetClosed","preSelectedFareFamilyId","resetPreselectedBoundId","getItinerary","AirBoundsBoundSelectionComponent_ng_container_0_Template","AirBoundsBoundSelectionComponent_ng_template_2_Template","tmp_3_0","bestBoundsList$","isFlightSelectionFiltersTestVariant$","travelClasses$","nextFilteredBounds$","lastRequestParams$","boundsHasDirectFlights$","allBoundsAreDirect$","amountOfDirectFlights$","boundObs_r5","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_ng_container_6_div_1_span_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_ng_container_6_div_1_span_2_Template","otherBoundsList_r7","boundObs_r9","i_r10","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_ng_container_6_div_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_ng_container_6_li_5_Template","otherBoundsList$","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_li_4_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_ng_container_6_Template","boundObs_r12","i_r13","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_template_3_li_3_Template","allBoundsList$","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_1_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_template_3_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_ng_container_5_Template","allSortedBounds_r15","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_ng_container_0_Template","OptimizedAirBoundsBoundSelectionListComponent","AY_FLIGHTS_SIZE","AY_FLIGHTS_CODE","MAX_SPECIAL_OFFERS","MAX_RESULTS_AMOUNT_WITHOUT_FILTERS","nextFilteredOutbounds","nextFilteredInbounds","unfilteredBounds$","unfilteredOutbounds","unfilteredInbounds","FLIGHT_SELECTION_FILTERS","hideFiltersAndSorter$","isTestVariant","openedBound$","distinctUntilKeyChanged","boundIndex","getCabinClassesForBounds","outboundsResult","selectedSortBy","fastestSortKey","currentBoundGroupsLowestPrice","numericPrice","specialOffers$","openedBoundId","specialOffers","ayBounds","slice","directBounds","cheapestBoundList","generateBoundInfo","bestbounds","bestboundsIds","cabinClassModal","CabinClassModalComponent","OptimizedAirBoundsBoundSelectionListComponent_fin_flight_selection_sort_by_11_Template","OptimizedAirBoundsBoundSelectionListComponent_fin_flight_selection_filters_13_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_container_16_Template","OptimizedAirBoundsBoundSelectionListComponent_ng_template_18_Template","boundResults_r16","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","getSeatUpgradeOffersV2","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","AncillariesGuard","ERROR_ROUTE","ErrorComponent","PAYMENT_ERROR","BookingRoutesModule","NavigationModule","AncillariesModule","RouterModule","forChild","BookingModule","BookingCartService","BookingService","CommonBookingAncillaryService","BookingQueueService","FragmentService","TabsModule","NavigationTriggerModule","HeadersModule","LocationsModule","BookingSummaryModule","_angular_core__WEBPACK_IMPORTED_MODULE_15__","AncillaryService","AncillarySubviewModule","DrawerModule","ProductsModule","ErrorCode","TIMEOUT","SAMELOCATION","NOTFOUND","httpClient","officeId","getUpgradeAvailability","apiUrl","upgradeAvailabilityUrl","formatDate","response","avail","list_flight","err","localYear","pad","localMonth","localDay","_angular_core__WEBPACK_IMPORTED_MODULE_6__","OffersSeatService","GetSeatUpgradeOffersV2Path","getSeatUpgradeOffersV2$Response","rb","r","HttpResponse"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/modules/one-upgrade/api/base-service.ts","./src/modules/one-upgrade/api/request-builder.ts","./src/modules/one-upgrade/api/api-configuration.ts","./src/modules/booking/components/booking-notification/booking-notification.module.ts","./node_modules/.pnpm/lodash.memoize@4.1.2/node_modules/lodash.memoize/index.js","./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/booking/modules/ancillaries/ancillaries.module.ts","./src/modules/loyalty-plus/services/upgrade-availability.service.ts","./src/modules/one-upgrade/api/services/offers-seat.service.ts","./src/modules/booking/modules/ancillaries/services/ancillaries.guard.ts"],"sourcesContent":["/* 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","/* 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","/* 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","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","/**\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 { 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 maxStops: defaultFilterValues.defaultStopsOption,\n },\n nextFilters: {\n stopsCount: defaultFilterValues.defaultStopsOption,\n refundable: defaultFilterValues.defaultRefundabilityOption,\n cabin: defaultFilterValues.defaultTravelClass,\n arrivalTime: [...defaultFilterValues.defaultTimeOptions],\n departureTime: [...defaultFilterValues.defaultTimeOptions],\n maxStops: defaultFilterValues.defaultStopsOption,\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.setNextArrivalTime.type:\n return {\n ...state,\n nextFilters: {\n ...state.nextFilters,\n arrivalTime: action.arrivalTime,\n },\n };\n case BoundsActions.resetNextArrivalTime.type:\n return {\n ...state,\n nextFilters: {\n ...state.nextFilters,\n arrivalTime: defaultFilterValues.defaultTimeOptions,\n },\n };\n case BoundsActions.setNextDepartureTime.type:\n return {\n ...state,\n nextFilters: {\n ...state.nextFilters,\n departureTime: action.departureTime,\n },\n };\n case BoundsActions.resetNextDepartureTime.type:\n return {\n ...state,\n nextFilters: {\n ...state.nextFilters,\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.setMaxStops.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n maxStops: action.maxStops,\n },\n };\n\n case BoundsActions.resetMaxStops.type:\n return {\n ...state,\n filters: {\n ...state.filters,\n maxStops: 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 maxStops: defaultFilterValues.defaultStopsOption,\n },\n };\n }\n case BoundsActions.resetAllNextFilters.type: {\n return {\n ...state,\n nextFilters: {\n stopsCount: state.filters.stopsCount,\n maxStops: state.filters.maxStops,\n refundable: state.filters.refundable,\n cabin: state.filters.cabin,\n arrivalTime: state.filters.arrivalTime,\n departureTime: state.filters.departureTime,\n },\n };\n }\n case BoundsActions.setAllNextFilters.type:\n return {\n ...state,\n nextFilters: {\n ...state.nextFilters,\n ...action.nextFilters,\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","@if ((cartDataReady$ | async) === false) {\n
\n \n
\n}\n\n
\n \n \n

\n {{ 'ancillaries.payWithPoints' | finLocalization }}\n

\n @if (products$ | async) {\n \n }\n
\n \n\n \n\n \n \n \n
\n @if (currentCategory !== Category.PET) {\n \n }\n\n @if (currentCategory === Category.PET) {\n \n }\n
\n
\n\n \n
\n \n @if (currentCategory === Category.SEAT) {\n \n \n }\n\n @if ([Category.LOUNGE, Category.MEAL].includes(currentCategory)) {\n \n }\n\n @if (currentCategory === Category.WIFI) {\n \n }\n \n
\n
\n
\n \n\n @if ((selectedCategory$ | async) !== Category.COVER) {\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 @if ((showSeatPreSelection$ | async) === true) {\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 ProductCardNotification,\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 { 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\nconst SEAT_WIFI_BUNDLE_REMOVAL_CONFIRM_MODAL_TRANSLATION_KEYS = {\n title: 'services.wifi.bundleRemovalConfirmModal.title',\n firstContentParagraph: 'services.wifi.bundleRemovalConfirmModal.firstContentParagraph',\n secondContentParagraph: 'services.wifi.bundleRemovalConfirmModal.secondContentParagraph',\n closeButton: 'services.wifi.bundleRemovalConfirmModal.closeButton',\n continueButton: 'services.wifi.bundleRemovalConfirmModal.continueButton',\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 SEAT_WIFI_BUNDLE_REMOVAL_CONFIRM_MODAL_TRANSLATION_KEYS =\n SEAT_WIFI_BUNDLE_REMOVAL_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 passengersWithSeatWifiBundleSelected$: Observable<{ [flightId: string]: string[] }>;\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 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 = !hasCorporateSeatBenefit && 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 productCardNotification$: count$.pipe(\n map((count) =>\n this.resolveProductCardNotification(category, count, noQuotaLeft, hasCorporateSeatBenefit)\n ),\n finShare()\n ),\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 this.passengersWithSeatWifiBundleSelected$ = combineLatest([this.travelers$, this.flights$]).pipe(\n map(([travelers, flights]) => {\n // TODO: this should also check that traveler has seat + wifi bundle selected\n return flights.reduce(\n (acc, flight) => {\n acc[flight.id] = this.configService.cfg.enableBookingFlowAncillaryBundles\n ? travelers.map((traveler) => traveler.id)\n : [];\n return acc;\n },\n {} as { [flightId: string]: string[] }\n );\n }),\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 removeSelection: confirmData?.removeSelection,\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 private resolveProductCardNotification(\n category: Category,\n count: number,\n noQuotaLeft: boolean,\n hasCorporateSeatBenefit: boolean\n ): ProductCardNotification {\n const notification = { theme: NotificationTheme.INFO };\n if (noQuotaLeft && count === 0) {\n return {\n messageKey: `services.${category}.noQuotaLeft`,\n theme: NotificationTheme.WARNING,\n };\n }\n if (hasCorporateSeatBenefit) {\n return {\n ...notification,\n messageKey: 'services.seat.corporateBenefit',\n icon: SvgLibraryIcon.B2B,\n titleKey: 'services.seat.corporateBenefitTitle',\n };\n }\n // TODO: this should also check from store that theres bundles available for some pax & flight.\n if (this.configService.cfg.enableBookingFlowAncillaryBundles && category === Category.SEAT) {\n return {\n theme: NotificationTheme.CAMPAIGN,\n messageKey: 'services.seat.bundleNotification',\n icon: SvgLibraryIcon.DISCOUNT,\n };\n }\n return notification;\n }\n}\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, switchMap } from 'rxjs/operators';\n\nimport { LoaderType, ToasterMessage } from '@fcom/common/interfaces';\nimport { ConfigService } from '@fcom/core';\nimport { CartStatus, LocationInfoMap, ServiceAvailability, ServiceCatalogCategoryServicesMap } from '@fcom/dapi';\nimport { SeatMapStatus } from '@fcom/common/interfaces/seat-map.interface';\nimport { Category, FinnairBoundItem, FinnairCart, FinnairPassengerItem, FinnairPrice } from '@fcom/dapi/api/models';\nimport { finShare, safeMap } from '@fcom/rx';\nimport { isNotEmpty } from '@fcom/core/utils';\nimport {\n seatMapForFlight,\n seatMapForFlightStatus,\n serviceCatalogCampaignIdsForFragment,\n serviceCategoriesMap,\n} from '@fcom/common-booking/store/selectors';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { getBoundsAndTravelersWhichHavePetcIncompatibleSeats } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { FlightWithStreams } from '@fcom/common-booking/interfaces';\nimport { BookingAppState, PaxDetailsState } from '@fcom/common/interfaces/booking';\nimport { profileType } from '@fcom/core/selectors';\nimport { ProfileType } from '@fcom/core-api/login';\n\nimport { AppConstants } from '../../../app-constants';\nimport { cartStatus, paxDetails } from '../../../store/selectors';\n\n@Component({\n selector: 'fin-ancillaries',\n templateUrl: './ancillaries.component.html',\n styleUrls: ['./ancillaries.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AncillariesComponent implements OnInit {\n @Input()\n cartData$: Observable;\n @Input()\n cartStatus$: Observable;\n @Input()\n serviceAvailability$: Observable;\n @Input()\n servicesReady$: Observable;\n\n @Output()\n ready: EventEmitter = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output()\n message: EventEmitter = new EventEmitter();\n\n public readonly C: typeof AppConstants = AppConstants;\n public readonly LoaderType = LoaderType;\n\n dataReady$: Observable;\n bounds$: Observable;\n allFlights$: Observable;\n passengers$: Observable;\n cartTotalPrice$: Observable;\n priceUpdating$: Observable;\n hasTravelerInCart$: Observable;\n servicesMap$: Observable;\n locations$: Observable;\n passengersWithPetcIncompatibleSeats$: Observable<{ [boundId: string]: string[] }>;\n paxDetails$: Observable;\n\n constructor(\n public configService: ConfigService,\n private store$: Store,\n private languageService: LanguageService\n ) {}\n\n ngOnInit(): void {\n const profileType$ = this.store$.pipe(profileType());\n this.dataReady$ = combineLatest([this.cartData$, profileType$]).pipe(\n safeMap(\n ([data, userProfileType]) =>\n Boolean(data.bounds) && (userProfileType !== ProfileType.CORPORATE || Boolean(data.passengers?.[0].lastName))\n ),\n startWith(false),\n distinctUntilChanged()\n );\n this.locations$ = this.cartData$.pipe(map((cd) => cd.locations));\n this.bounds$ = this.cartData$.pipe(safeMap((data: FinnairCart) => data.bounds));\n this.paxDetails$ = this.store$.pipe(paxDetails());\n this.servicesMap$ = this.store$.pipe(serviceCategoriesMap());\n this.allFlights$ = this.bounds$.pipe(\n map((bounds) =>\n bounds\n .reduce((allFlights, bound) => allFlights.concat(bound.itinerary.filter(isFlight)), [])\n .map((flight) => {\n const seatMapStatus$: Observable = combineLatest([\n this.store$.pipe(seatMapForFlightStatus(flight.id)),\n this.store$.pipe(\n cartStatus(),\n map((s) =>\n this.configService.cfg.enableBookingFlowSeatMapPreFetch\n ? [\n CartStatus.INITIAL,\n CartStatus.PENDING_CREATION,\n CartStatus.CREATION_ERROR,\n CartStatus.LOAD_ERROR,\n ].includes(s) === false\n : s === CartStatus.OK\n )\n ),\n ]).pipe(\n map(([seatMapStatus, cart]) => (!cart ? SeatMapStatus.PENDING : seatMapStatus)),\n distinctUntilChanged()\n );\n return {\n ...flight,\n seatMap$: this.store$.pipe(seatMapForFlight(flight.id)),\n seatMapStatus$,\n seatSubViewTopNotificationTranslation$: this.store$.pipe(\n serviceCatalogCampaignIdsForFragment(flight.id),\n filter((campaigns) => campaigns && campaigns[Category.SEAT] && campaigns[Category.SEAT].length > 0),\n map((campaigns) => `campaign.notifications.seatSubView.${campaigns[Category.SEAT][0]}`),\n switchMap((translationKey) => this.languageService.translate(translationKey))\n ),\n };\n })\n ),\n finShare()\n );\n\n const paxCartData$ = this.cartData$.pipe(\n safeMap((data: FinnairCart) => data.passengers),\n finShare()\n );\n this.passengers$ = combineLatest([paxCartData$.pipe(), this.paxDetails$]).pipe(\n map(([cartPassengers, passengerDetails]) => {\n return cartPassengers.map((pax) => ({\n ...pax,\n firstName: pax.firstName || passengerDetails.passengers.find((p) => p.travelerId === pax.id)?.firstName,\n lastName: pax.lastName || passengerDetails.passengers.find((p) => p.travelerId === pax.id)?.lastName,\n }));\n }),\n finShare()\n );\n\n this.cartTotalPrice$ = this.cartData$.pipe(\n safeMap((data: FinnairCart) => data.prices),\n safeMap((prices) => prices.unpaid.total.total),\n distinctUntilChanged(),\n finShare()\n );\n this.hasTravelerInCart$ = paxCartData$.pipe(\n map((travelers) => isNotEmpty(travelers) && travelers.every((t) => !!t.firstName))\n );\n this.priceUpdating$ = combineLatest([\n this.cartStatus$.pipe(map((status: CartStatus) => status !== CartStatus.OK)),\n this.hasTravelerInCart$,\n ]).pipe(map(([statusNotOk, travelersOk]: [boolean, boolean]) => statusNotOk || !travelersOk));\n\n this.passengersWithPetcIncompatibleSeats$ = this.cartData$.pipe(\n map((booking) => getBoundsAndTravelersWhichHavePetcIncompatibleSeats(booking, 'unpaid')),\n finShare()\n );\n }\n}\n","\n","import { Component } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\n\nimport { ToasterMessage } from '@fcom/common/interfaces';\nimport { ToasterService } from '@fcom/common/services';\nimport { CartStatus, ServiceAvailability } from '@fcom/dapi';\nimport { FinnairCart } from '@fcom/dapi/api/models';\nimport { serviceAvailability, servicesReady } from '@fcom/common-booking/store/selectors';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\n\nimport { cartData, cartStatus } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\n\n@Component({\n selector: 'fin-booking-ancillaries-route',\n templateUrl: './booking-ancillaries-route.component.html',\n})\nexport class BookingAncillariesRouteComponent {\n readonly cartData$: Observable;\n readonly cartStatus$: Observable;\n readonly serviceAvailability$: Observable;\n readonly servicesReady$: Observable;\n\n constructor(\n private bookingService: BookingService,\n private store$: Store,\n private toasterService: ToasterService\n ) {\n this.cartData$ = this.store$.pipe(cartData());\n this.cartStatus$ = this.store$.pipe(cartStatus());\n this.serviceAvailability$ = this.store$.pipe(serviceAvailability());\n this.servicesReady$ = this.store$.pipe(servicesReady());\n }\n\n confirmAncillaries(): void {\n this.bookingService.nextStep();\n }\n\n onMessage(msg: ToasterMessage): void {\n this.toasterService.addMessageToQueue(msg);\n }\n}\n","\n","import { Injectable, OnDestroy } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { merge, Observable, Subject, Subscription } from 'rxjs';\nimport {\n bufferCount,\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n withLatestFrom,\n} from 'rxjs/operators';\n\nimport { DataCloudService } from '@fcom/common/datacloud';\nimport { GtmService } from '@fcom/common/gtm';\nimport { GtmEvent, GtmFlightSelectionData, GtmPurchaseFlow } from '@fcom/common/interfaces';\nimport { entrySet, equals, unsubscribe } from '@fcom/core/utils';\nimport { FinnairCart, ServiceFlow } from '@fcom/dapi/api/models';\nimport { orderData } from '@fcom/common-booking/store';\nimport { PaymentStatus } from '@fcom/common-booking/interfaces';\nimport { paymentStatus } from '@fcom/common-booking/store/selectors';\nimport { isAwardBooking } from '@fcom/common-booking/utils/common-booking.utils';\nimport { profileOrNot } from '@fcom/core/selectors';\nimport { ProfileTier } from '@fcom/core-api/login';\nimport { getTripTypeFromBounds, resolvePurchaseFlow } from '@fcom/common/utils/gtm.utils';\nimport { globalBookingPaxAmount, globalBookingFlights, globalBookingDiscountCode } from '@fcom/common/store';\nimport { PaxAmount } from '@fcom/dapi';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\nimport { finShare } from '@fcom/rx';\n\nimport {\n cartData,\n inboundOffersSelectionGtmData,\n inboundSelectionGtmData,\n outboundOffersSelectionGtmData,\n outboundSelectionGtmData,\n} from '../store/selectors';\n\n@Injectable()\nexport class BookingGtmService implements OnDestroy {\n private sendFlightSelectionDataCloud$: Subject = new Subject();\n private subscription = new Subscription();\n\n constructor(\n private store$: Store,\n private gtmService: GtmService,\n private dataCloudService: DataCloudService\n ) {\n this.initSendFlowData();\n this.initSendCompletePurchase();\n this.initSendCheckoutFlights();\n this.initSendFlightSelection();\n }\n\n ngOnDestroy(): void {\n this.subscription = unsubscribe(this.subscription);\n }\n\n initSendFlowData(): void {\n this.subscription.add(\n this.store$\n .pipe(\n cartData(),\n distinctUntilChanged((a, b) => {\n // Ensure that we only send flowData one time by checking that has flights changed\n return entrySet(a.controlData?.sellAncillariesPerFlight).every(\n (entry) => entry.value === b.controlData?.sellAncillariesPerFlight[entry.key]\n );\n }),\n withLatestFrom(this.store$.pipe(profileOrNot()))\n )\n .subscribe(([data, profile]) => {\n const isAward = isAwardBooking(data.prices.unpaid);\n this.gtmService.flowData(data.controlData, resolvePurchaseFlow(profile, isAward));\n })\n );\n }\n\n initSendCompletePurchase(): void {\n this.subscription.add(\n this.store$\n .pipe(\n paymentStatus(),\n filter((s) => s === PaymentStatus.VERIFIED),\n switchMap(() =>\n this.store$.pipe(\n orderData(),\n filter((v) => !!v),\n take(1)\n )\n ),\n withLatestFrom(\n this.store$.pipe(globalBookingFlights()),\n this.store$.pipe(profileOrNot()),\n this.store$.pipe(globalBookingDiscountCode())\n )\n )\n .subscribe(([orderDataValue, flights, profile, discountCode]) => {\n const tripType = getTripTypeFromBounds(orderDataValue.bounds);\n // Check for the existance of inbound data obj to figure out the trip type\n const totalPrice = orderDataValue.prices.included?.total?.total;\n const total = totalPrice?.totalAmount;\n const totalPoints = totalPrice?.totalPoints?.amount;\n const isAward = orderDataValue.serviceFlow === ServiceFlow.AWARD;\n this.gtmService.completePurchase(\n orderDataValue,\n tripType,\n total,\n flights[0] || { origin: undefined, destination: undefined },\n totalPoints,\n resolvePurchaseFlow(profile, isAward),\n orderDataValue.serviceFlow === ServiceFlow.BOOKING ? discountCode : undefined\n );\n this.dataCloudService.completePurchase();\n })\n );\n }\n\n initSendCheckoutFlights(): void {\n this.subscription.add(\n this.store$\n .pipe(\n cartData(),\n startWith(undefined as FinnairCart),\n bufferCount(2, 1),\n filter(([oldCart, newCart]) => {\n if (typeof oldCart === 'undefined' || typeof newCart === 'undefined') {\n return true;\n }\n const outboundChanged = !equals(oldCart.bounds[0], newCart.bounds[0]);\n const inboundChanged = !equals(oldCart.bounds[1], newCart.bounds[1]);\n return outboundChanged || inboundChanged;\n }),\n map(([, newCart]) => newCart),\n filter((v) => !!v),\n filter((cartDataValue) => !!cartDataValue?.bounds),\n withLatestFrom(this.store$.pipe(profileOrNot()))\n )\n .subscribe(([cartDataValue, profile]) => {\n const isAward = isAwardBooking(cartDataValue.prices.unpaid);\n this.gtmService.checkoutFlights(cartDataValue, resolvePurchaseFlow(profile, isAward));\n })\n );\n }\n\n initSendFlightSelection(): void {\n // TODO: We should try to combine airBounds (FPP) and offers selectors (FP)\n const flightSelectionData$: Observable = this.store$.pipe(\n globalBookingPaxAmount(),\n switchMap((paxAmount: PaxAmount) =>\n merge(\n this.store$.pipe(outboundSelectionGtmData(paxAmount)),\n this.store$.pipe(inboundSelectionGtmData(paxAmount)),\n this.store$.pipe(outboundOffersSelectionGtmData(paxAmount)),\n this.store$.pipe(inboundOffersSelectionGtmData(paxAmount))\n )\n ),\n withLatestFrom(this.store$.pipe(profileOrNot())),\n map(([data, profile]) =>\n profile?.tier === ProfileTier.CORPORATE ? { ...data, purchaseFlow: GtmPurchaseFlow.CORPORATE } : data\n ),\n finShare()\n );\n this.subscription.add(\n flightSelectionData$.subscribe((enhancedData) => {\n this.gtmService.flightSelection(GtmEvent.FLIGHT_SELECTION_CLICK, [enhancedData]);\n })\n );\n this.subscription.add(\n this.sendFlightSelectionDataCloud$\n .pipe(withLatestFrom(flightSelectionData$))\n .subscribe(([, enhancedData]) => this.dataCloudService.flightSelectionSelect([enhancedData]))\n );\n }\n\n sendFlightSelectionDataCloud(): void {\n this.sendFlightSelectionDataCloud$.next();\n }\n}\n","import { OperatorFunction } from '../types';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { arrRemove } from '../util/arrRemove';\n\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.\n *\n * ![](bufferCount.png)\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * ## Examples\n *\n * Emit the last two click events as an array\n *\n * ```ts\n * import { fromEvent, bufferCount } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const buffered = clicks.pipe(bufferCount(2));\n * buffered.subscribe(x => console.log(x));\n * ```\n *\n * On every click, emit the last two click events as an array\n *\n * ```ts\n * import { fromEvent, bufferCount } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const buffered = clicks.pipe(bufferCount(2, 1));\n * buffered.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param bufferSize The maximum size of the buffer emitted.\n * @param startBufferEvery Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return A function that returns an Observable of arrays of buffered values.\n */\nexport function bufferCount(bufferSize: number, startBufferEvery: number | null = null): OperatorFunction {\n // If no `startBufferEvery` value was supplied, then we're\n // opening and closing on the bufferSize itself.\n startBufferEvery = startBufferEvery ?? bufferSize;\n\n return operate((source, subscriber) => {\n let buffers: T[][] = [];\n let count = 0;\n\n source.subscribe(\n createOperatorSubscriber(\n subscriber,\n (value) => {\n let toEmit: T[][] | null = null;\n\n // Check to see if we need to start a buffer.\n // This will start one at the first value, and then\n // a new one every N after that.\n if (count++ % startBufferEvery! === 0) {\n buffers.push([]);\n }\n\n // Push our value into our active buffers.\n for (const buffer of buffers) {\n buffer.push(value);\n // Check to see if we're over the bufferSize\n // if we are, record it so we can emit it later.\n // If we emitted it now and removed it, it would\n // mutate the `buffers` array while we're looping\n // over it.\n if (bufferSize <= buffer.length) {\n toEmit = toEmit ?? [];\n toEmit.push(buffer);\n }\n }\n\n if (toEmit) {\n // We have found some buffers that are over the\n // `bufferSize`. Emit them, and remove them from our\n // buffers list.\n for (const buffer of toEmit) {\n arrRemove(buffers, buffer);\n subscriber.next(buffer);\n }\n }\n },\n () => {\n // When the source completes, emit all of our\n // active buffers.\n for (const buffer of buffers) {\n subscriber.next(buffer);\n }\n subscriber.complete();\n },\n // Pass all errors through to consumer.\n undefined,\n () => {\n // Clean up our memory when we finalize\n buffers = null!;\n }\n )\n );\n });\n}\n","\n\n\n \n \n\n\n\n\n\n\n\n \n\n\n \n \n
\n \n
\n \n \n\n \n \n \n \n\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Inject,\n OnDestroy,\n OnInit,\n PLATFORM_ID,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { select, Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n mapTo,\n startWith,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators';\n\nimport { AirOffersStatus, BookingAppState, BookingLocationCodes } from '@fcom/common/interfaces/booking';\nimport { FinnairOrder } from '@fcom/dapi/api/models';\nimport { BookingHeaderSummary } from '@fcom/common/interfaces';\nimport { Breadcrumb, PhasesAria } from '@fcom/ui-components';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n GlobalBookingTripDates,\n isNavigationEvent,\n MediaQueryService,\n NavigationMenuService,\n ScrollService,\n Step,\n TARGET_HEIGHT_ELEMENT,\n TripType,\n} from '@fcom/common';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { JoinService, LoginDialogComponent, LoginWidgetContext } from '@fcom/common/login';\nimport { PageMetaService } from '@fcom/common/services';\nimport { getBookingStepFromUrl } from '@fcom/common/utils/booking-common.utils';\nimport { NativeBridgeService } from '@fcom/core';\nimport { LoginStatus, ProfileType } from '@fcom/core-api/login';\nimport { loginStatus, profileName, profileType } from '@fcom/core/selectors';\nimport { GlobalBookingFlight } from '@fcom/common/store/store.interface';\nimport { isPresent, TzDate, unsubscribe } from '@fcom/core/utils';\nimport { orderData } from '@fcom/common-booking/store';\nimport { BookingSummaryService } from '@fcom/common-booking';\nimport { GtmService } from '@fcom/common/gtm';\nimport { finShare } from '@fcom/rx';\nimport { globalBookingSelections } from '@fcom/common/store';\nimport { getTripTypeFromBookingLocationCodes } from '@fcom/common-booking/utils/common-booking.utils';\nimport { BOOKING_STEPS, BOOKING_STEPS_ARRAY, ERROR_STEPS } from '@fcom/common/config/booking-config';\nimport { LanguageSelectorContext } from '@fcom/common/components/language-selector/language-selector.component';\n\nimport { AppConstants } from '../../app-constants';\nimport { BookingService } from '../../services';\nimport { BookingGtmService } from '../../services/booking-gtm.service';\nimport { boundsStatus, cartData, offersStatus, selectMultiCityStatus } from '../../store/selectors';\nimport { currentServices } from '../../store/selectors/booking-cart-state.selector';\nimport { BookingActions } from '../../store/actions';\n\nconst SHOW_BUTTON_STATES = [LoginStatus.LOGGED_IN, LoginStatus.NOT_LOGGED_IN, LoginStatus.ERROR];\n\n@Component({\n selector: 'fin-booking-routing',\n templateUrl: './booking-routing.component.html',\n styleUrls: ['./booking-routing.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BookingRoutingComponent implements OnInit, OnDestroy {\n readonly TARGET_HEIGHT_ELEMENT = TARGET_HEIGHT_ELEMENT;\n readonly LANGUAGE_SELECTOR_CONTEXT = LanguageSelectorContext.BOOKING;\n @ViewChild('loginDialog', { static: true }) loginDialog: LoginDialogComponent;\n\n public readonly C: typeof AppConstants = AppConstants;\n public readonly BOOKING_STEPS = BOOKING_STEPS;\n public readonly LoginWidgetContext = LoginWidgetContext;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n currentStep$: Observable;\n isFirstStep$: Observable;\n basketOpen$: BehaviorSubject = new BehaviorSubject(false);\n hasBasket$: Observable;\n enableModifySearch$: Observable;\n isErrorRoute$: Observable;\n showBasket$: Observable;\n isBookingFrontPage$: Observable;\n homeLink$: Observable;\n breadcrumbs$: Observable = of([]);\n phasesAria$: Observable;\n isNavigationMenuOpen$: Observable;\n loginStatus$: Observable;\n showHeaderBack$: Observable;\n showHeaderLogin$: Observable;\n profileName$: Observable;\n profileType$: Observable;\n unpaidServices$: Observable;\n bookingSummary$: Observable;\n orderSummary$: Observable<{\n locations: BookingLocationCodes[];\n dates: GlobalBookingTripDates;\n paxAmount: number;\n }>;\n isMobile$: Observable;\n isTablet$: Observable;\n boundsStatus$: Observable;\n shouldEnableGlobalBookingWidget$: Observable;\n private subscriptions: Subscription = new Subscription();\n\n constructor(\n @Inject(PLATFORM_ID) private platform: unknown,\n private bookingService: BookingService,\n private navigationMenuService: NavigationMenuService,\n private languageService: LanguageService,\n private router: Router,\n private scrollService: ScrollService,\n private renderer: Renderer2,\n private store$: Store,\n private nativeBridgeService: NativeBridgeService,\n private pageMetaService: PageMetaService,\n private gtmService: GtmService,\n private mediaQueryService: MediaQueryService,\n public joinService: JoinService,\n _bookingGtmService: BookingGtmService // to get service into background\n ) {\n this.currentStep$ = this.bookingService.step;\n this.isFirstStep$ = this.bookingService.isFirstStep();\n this.isMobile$ = this.mediaQueryService.isBreakpoint$('mobile');\n this.isTablet$ = this.mediaQueryService.isBreakpoint$('tablet');\n\n this.orderSummary$ = this.store$.pipe(\n orderData(),\n filter((order) => Boolean(order?.bounds.length > 0)),\n map((order) => {\n return {\n dates: {\n departureDate: TzDate.of(order.bounds[0].departure.dateTime)?.toLocalDate(),\n returnDate:\n order.bounds.length > 1\n ? TzDate.of(order.bounds[order.bounds.length - 1].arrival.dateTime)?.toLocalDate()\n : null,\n },\n locations: order.bounds.map((bound) => ({\n originLocationCode: bound.departure.locationCode,\n destinationLocationCode: bound.arrival.locationCode,\n })),\n paxAmount: order.passengers.length,\n };\n })\n );\n\n this.bookingSummary$ = combineLatest([\n this.store$.pipe(boundsStatus(), startWith(null)),\n this.store$.pipe(offersStatus(), startWith(null)),\n this.store$.pipe(select(selectMultiCityStatus), startWith(null)),\n ]).pipe(\n withLatestFrom(this.store$.pipe(globalBookingSelections()), this.orderSummary$.pipe(startWith(null))),\n filter(\n ([_, globalBooking, orderSummary]) =>\n globalBooking.flights.some((flight) => isPresent(flight.origin) && isPresent(flight.destination)) ||\n isPresent(orderSummary)\n ),\n map(([_, { flights, paxAmount }, orderSummary]) => {\n const bookingLocations: BookingLocationCodes[] = flights\n .filter((flight) => isPresent(flight.origin) && isPresent(flight.destination))\n .map((flight: GlobalBookingFlight) => ({\n originLocationCode: flight.origin.locationCode,\n destinationLocationCode: flight.destination.locationCode,\n }));\n\n const bookingPaxAmount = paxAmount.adults + paxAmount.children + paxAmount.c15s + paxAmount.infants;\n const dates: GlobalBookingTripDates = { departureDate: flights[0]?.departureDate };\n\n if (flights.length > 1) {\n dates.returnDate = flights[flights.length - 1].departureDate;\n }\n\n return {\n tripType: bookingLocations.length\n ? getTripTypeFromBookingLocationCodes(bookingLocations)\n : getTripTypeFromBookingLocationCodes(orderSummary.locations),\n locations: bookingLocations.length ? bookingLocations : orderSummary.locations,\n paxAmount: bookingLocations.length ? bookingPaxAmount : orderSummary.paxAmount,\n dates: bookingLocations.length ? dates : orderSummary.dates,\n };\n })\n );\n\n this.homeLink$ = this.languageService.lang.pipe(map((lang) => `/${lang}`));\n this.isNavigationMenuOpen$ = this.navigationMenuService.isNavigationMenuOpen$;\n\n this.onNavigationSetBookingServiceStepFromUrl();\n\n this.showBasket$ = combineLatest([this.bookingService.step, this.isMobile$]).pipe(\n map(\n ([step, isMobile]) =>\n step.phase === BOOKING_STEPS.PAXDETAILS.phase ||\n step.phase === BOOKING_STEPS.ANCILLARIES.phase ||\n (step.phase === BOOKING_STEPS.FLIGHT_SELECTION.phase && isMobile)\n ),\n distinctUntilChanged(),\n finShare()\n );\n\n this.isBookingFrontPage$ = this.bookingService.step.pipe(map((step) => step.phase === BOOKING_STEPS.ENTRY.phase));\n }\n\n ngOnInit(): void {\n this.loginStatus$ = this.store$.pipe(loginStatus());\n this.profileName$ = this.store$.pipe(profileName());\n this.profileType$ = this.store$.pipe(profileType());\n\n this.scrollToTopOnStepChange();\n\n this.bindBasketHandling();\n\n this.initButtonVisibilities();\n\n const showLinks$ = this.store$.pipe(\n orderData(),\n startWith(undefined as FinnairOrder),\n map((o) => !o),\n distinctUntilChanged(),\n finShare()\n );\n\n this.breadcrumbs$ = combineLatest([\n this.currentStep$,\n this.languageService.translate('phases.title'),\n showLinks$,\n this.store$.pipe(cartData(), startWith(undefined)),\n ]).pipe(\n map(([currentStage, breadcrumbs, showLinks, cartData]) => {\n const hideAncillaries =\n cartData && !cartData.controlData.sellAncillariesOutbound && !cartData.controlData.sellAncillariesInbound;\n return this.formatBreadcrumbs(currentStage, breadcrumbs, showLinks, hideAncillaries);\n })\n );\n\n this.phasesAria$ = this.languageService.translate('phases.aria');\n\n this.showHeaderBack$ = combineLatest([this.bookingService.step, showLinks$]).pipe(\n map(\n ([currentStep, showLinks]) =>\n showLinks &&\n BOOKING_STEPS.ENTRY.id !== currentStep.id &&\n (this.nativeBridgeService.isInsideNativeWebView\n ? true\n : BOOKING_STEPS.FLIGHT_SELECTION.id !== currentStep.id) &&\n BOOKING_STEPS.PURCHASE_SUCCESS.id !== currentStep.id\n ),\n distinctUntilChanged()\n );\n\n this.showHeaderLogin$ = combineLatest([this.bookingService.step, this.loginStatus$]).pipe(\n map(([step, status]) => {\n if (this.nativeBridgeService.isInsideNativeWebView) {\n return false;\n }\n\n if (step.id > BOOKING_STEPS.PAXDETAILS.id) {\n return false;\n }\n\n return SHOW_BUTTON_STATES.indexOf(status) !== -1;\n })\n );\n\n this.subscriptions.add(\n this.currentStep$\n .pipe(\n distinctUntilChanged((prevStep, curStep) => prevStep.path === curStep.path),\n switchMap((step) => this.languageService.translate(`phases.title.${step.translationKey}`))\n )\n .subscribe((title) => {\n this.pageMetaService.setTitle(`${title} | Finnair`);\n })\n );\n\n if (isPlatformBrowser(this.platform)) {\n this.subscriptions.add(\n this.nativeBridgeService.backButtonPressed.subscribe(() => {\n this.bookingService.prevStep();\n })\n );\n }\n\n this.unpaidServices$ = this.store$.pipe(currentServices());\n }\n\n ngOnDestroy(): void {\n this.store$.dispatch(BookingActions.reset());\n unsubscribe(this.subscriptions);\n }\n\n setActive(next: Step): void {\n if (!next) {\n return;\n }\n if (next.id !== this.bookingService.currentStep.id) {\n this.bookingService.setStep({\n step: next,\n });\n }\n }\n\n navigateToStep(step: Breadcrumb): void {\n const bookingStep = BOOKING_STEPS_ARRAY.find((item) => item.id === step.id);\n\n this.bookingService.setStep({\n step: bookingStep,\n });\n }\n\n activateSelectionPhase(step: Step, locale?: string): void {\n const bookingStep = BOOKING_STEPS_ARRAY.find((item) => item.id === step.id);\n this.bookingService.setStep({ step: bookingStep, locale });\n }\n\n navigateBack(_event: Event): void {\n this.gtmService.trackElement(\n 'booking-flow-hamburger-navi-back',\n GaContext.BOOKING_FLOW,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.CLICK\n );\n //go to previous step\n this.bookingService.prevStep();\n }\n\n toggleMenu(): void {\n this.navigationMenuService.toggleMenuOpen();\n }\n\n openBasket(): void {\n this.basketOpen$.next(true);\n }\n\n closeBasket(): void {\n this.basketOpen$.next(false);\n }\n\n edit(step: Step): void {\n this.basketOpen$.next(false);\n this.setActive(step);\n }\n\n formatBreadcrumbs(\n currentStep: Step,\n breadcrumbs: Record,\n activateLinks: boolean,\n hideAncillaries: boolean\n ): Breadcrumb[] {\n return BOOKING_STEPS_ARRAY.filter((step) => !hideAncillaries || step.id !== BOOKING_STEPS.ANCILLARIES.id)\n .filter((step) => step.id !== BOOKING_STEPS.ENTRY.id)\n .map((step) => {\n if (step.id > BOOKING_STEPS.CHECKOUT.id) {\n return;\n }\n\n const confirmationPageActive: boolean =\n currentStep.id === BOOKING_STEPS.PURCHASE_SUCCESS.id ? step.id === BOOKING_STEPS.CHECKOUT.id : false;\n\n return {\n id: step.id,\n name: breadcrumbs[step.translationKey],\n active: step.id === currentStep.id || confirmationPageActive,\n disabled: !activateLinks || currentStep.id === BOOKING_STEPS.PURCHASE_SUCCESS.id,\n };\n })\n .filter(Boolean);\n }\n\n onHomeClick(url: string): void {\n this.router.navigateByUrl(url);\n }\n\n private scrollToTopOnStepChange() {\n this.subscriptions.add(\n this.router.events.pipe(filter(isNavigationEvent)).subscribe(() => {\n this.scrollService.scrollTop();\n })\n );\n }\n\n private onNavigationSetBookingServiceStepFromUrl() {\n // Initial navigation\n this.setStepFromUrl(this.router.routerState.snapshot.url);\n\n const navigationEnd$: Observable = this.router.events.pipe(\n filter((e) => e instanceof NavigationEnd),\n finShare()\n );\n\n this.isErrorRoute$ = navigationEnd$.pipe(\n map((event) => event.url.includes(ERROR_STEPS.ERROR.path)),\n startWith(false)\n );\n\n // Successful navigation, e.g., back button or other router.navigate\n this.subscriptions.add(\n navigationEnd$.subscribe((event: NavigationEnd) => {\n this.setStepFromUrl(event.url);\n })\n );\n }\n\n private setStepFromUrl(url: string) {\n this.bookingService.setStep({\n step: getBookingStepFromUrl(url),\n skipRouteChange: true,\n });\n }\n\n private bindBasketHandling() {\n const hideModal$: Observable = new Observable((observer) => {\n return this.renderer.listen('window', 'resize', (event: Event) => observer.next(event.target['innerWidth']));\n }).pipe(\n debounceTime(100),\n filter((width) => width >= 600),\n mapTo(false)\n );\n\n this.subscriptions.add(hideModal$.subscribe(this.basketOpen$));\n this.subscriptions.add(\n this.basketOpen$\n .pipe(map((basketOpen) => this.navigationMenuService.modalOpenSubject$.next(basketOpen)))\n .subscribe()\n );\n }\n\n private initButtonVisibilities(): void {\n this.hasBasket$ = combineLatest([\n this.isFirstStep$,\n this.navigationMenuService.isNavigationMenuOpen$,\n this.currentStep$,\n this.bookingSummary$,\n ]).pipe(\n map(\n ([, isNavigationMenuOpen, currentStep, bookingSummary]) =>\n !isNavigationMenuOpen &&\n currentStep.id < BOOKING_STEPS.PURCHASE_REVIEW.id &&\n !(currentStep.id === BOOKING_STEPS.FLIGHT_SELECTION.id && bookingSummary.tripType !== TripType.MULTICITY)\n ),\n finShare(),\n distinctUntilChanged()\n );\n\n this.enableModifySearch$ = combineLatest([this.hasBasket$, this.currentStep$]).pipe(\n map(([hasBasket, currentStep]) => !hasBasket && currentStep.id === BOOKING_STEPS.FLIGHT_SELECTION.id)\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { ComponentsModule, DirectiveModule, PipesModule } from '@fcom/common';\nimport { BookingWidgetModule } from '@fcom/booking-widget/booking-widget.module';\n\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { BookingEntryRouteComponent } from './routes/booking-entry-route.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n BookingCommonModule,\n PipesModule,\n DirectiveModule,\n UiTranslateModule,\n BookingWidgetModule,\n ],\n declarations: [BookingEntryRouteComponent],\n exports: [BookingEntryRouteComponent],\n providers: [],\n})\nexport class EntryModule {}\n","import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { NativeBridgeService } from '@fcom/core';\n\n@Component({\n selector: 'fin-booking-entry-route',\n template: `\n
\n \n
\n `,\n styleUrls: ['booking-entry-route.component.scss'],\n})\nexport class BookingEntryRouteComponent implements OnInit {\n shouldRender: boolean;\n\n constructor(\n private nativeBridge: NativeBridgeService,\n private languageService: LanguageService,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n this.shouldRender = this.nativeBridge.isInsideNativeWebView;\n\n // Redirect non-mobile-app requests to front page\n if (!this.nativeBridge.isInsideNativeWebView) {\n this.router.navigate([`/${this.languageService.langValue}`], {\n replaceUrl: true,\n queryParamsHandling: 'preserve',\n });\n return;\n }\n }\n}\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { CanActivate } from '@angular/router';\n\nimport { Store } from '@ngrx/store';\n\nimport { CartStatus } from '@fcom/dapi/interfaces';\nimport { snapshot } from '@fcom/rx';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport { BookingAppState } from '@fcom/common/interfaces/booking/booking-state.interface';\n\nimport { cartStatus } from '../../../store/selectors';\nimport { BookingService } from '../../../services';\n\n@Injectable()\nexport class PaxDetailsGuard implements CanActivate {\n constructor(\n private store$: Store,\n private bookingService: BookingService,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n canActivate() {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n const canAccess: boolean = snapshot(this.store$.pipe(cartStatus())) !== CartStatus.INITIAL;\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.FLIGHT_SELECTION });\n }\n\n return canAccess;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ButtonModule, ModalModule, UiComponentsModule } from '@fcom/ui-components';\nimport { UiTranslateModule } from '@fcom/ui-translate';\nimport { CmsModule } from '@fcom/cms/components';\nimport { ComponentsModule, DirectiveModule, FinFormsModule, PipesModule } from '@fcom/common';\nimport { GtmModule } from '@fcom/common/gtm';\nimport { CommonBookingComponentsModule } from '@fcom/common-booking/components';\nimport { DataCloudModule } from '@fcom/common/datacloud';\n\nimport { BookingNotificationModule } from '../../components/booking-notification/booking-notification.module';\nimport { BookingCommonModule } from '../common/booking-common.module';\nimport { KoreaNotificationComponent } from './components/korea-notification.component';\nimport { PaxDetailsFormComponent } from './components/pax-details-form.component';\nimport { PaxDetailsComponent } from './components/pax-details.component';\nimport { BookingPaxDetailsRouteComponent } from './routes/booking-pax-details-route.component';\nimport { PaxDetailsGuard } from './services/pax-details.guard';\nimport { PaxAncillariesComponent } from './components/pax-ancillaries/pax-ancillaries.component';\nimport { UpgradePromotionComponent } from './components/upgrade-promotion/upgrade-promotion.component';\nimport { PaxAncillaryProductComponent } from './components/pax-ancillary-product/pax-ancillary-product.component';\nimport { UpgradePromotionModalComponent } from './components/upgrade-promotion/upgrade-promotion-modal.component';\nimport { PaxDetailsMarketingConsentComponent } from './components/pax-details-marketing-consent/pax-details-marketing-consent.component';\nimport { PaxShortcutToPayComponent } from './components/pax-shortcut-to-pay/pax-shortcut-to-pay.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ComponentsModule,\n BookingCommonModule,\n FormsModule,\n FinFormsModule,\n GtmModule,\n DataCloudModule,\n CmsModule,\n PipesModule,\n DirectiveModule,\n UiTranslateModule,\n ButtonModule,\n ModalModule,\n CommonBookingComponentsModule,\n UiComponentsModule,\n BookingNotificationModule,\n ],\n declarations: [\n BookingPaxDetailsRouteComponent,\n PaxDetailsComponent,\n PaxDetailsFormComponent,\n PaxDetailsMarketingConsentComponent,\n KoreaNotificationComponent,\n PaxAncillariesComponent,\n PaxAncillaryProductComponent,\n PaxShortcutToPayComponent,\n UpgradePromotionComponent,\n UpgradePromotionModalComponent,\n ],\n exports: [BookingPaxDetailsRouteComponent, PaxAncillaryProductComponent],\n providers: [PaxDetailsGuard],\n})\nexport class PaxDetailsModule {}\n","import { Category } from '@fcom/dapi/api/models';\n\nexport const ENABLED_PAX_ANCILLARY_CATEGORIES = [Category.BAGGAGE, Category.LOUNGE];\n","
\n \n \n
\n \n
\n
\n \n
\n\n\n
\n
\n {{ 'paxDetails.marketingConsent.flightOffersDescription' | finLocalization }}\n
\n
\n \n {{ 'paxDetails.marketingConsent.signUpMarketingNewsletter' | finLocalization }}\n \n \n {{ 'paxDetails.marketingConsent.signUpAnalytics' | finLocalization }}\n \n
\n \n
\n
\n\n\n \n
\n \n {{\n (marketingConsentType === MarketingConsentType.MEMBER_OFFERS\n ? 'paxDetails.marketingConsent.memberOffers'\n : 'paxDetails.marketingConsent.flightOffers'\n ) | finLocalization\n }}\n \n \n
\n
\n","import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, iif, Observable, of, Subscription } from 'rxjs';\nimport { catchError, filter, map, switchMap, take, withLatestFrom } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { Consent, ConsentGroup, ConsentStatus, ConsentTextId } from '@fcom/common/interfaces';\nimport { loginToken, profileOrUndefinedIfNotLoggedIn, profileType } from '@fcom/core/selectors';\nimport { finShare } from '@fcom/rx';\nimport { ConsentService } from '@fcom/common/login';\nimport {\n NewsletterSignupPayload,\n NewsletterSignupResponse,\n NewsLetterSource,\n} from '@fcom/cms/interfaces/newsletter-signup.interface';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { NewsletterSignupService } from '@fcom/cms';\nimport { SentryLogger } from '@fcom/core/services';\nimport { CheckboxComponent } from '@fcom/ui-components';\nimport { TypedFormArray, TypedFormGroup } from '@fcom/service-forms';\nimport { BookingAppState } from '@fcom/common/interfaces/booking';\nimport { unsubscribe } from '@fcom/core/utils';\n\nexport enum MarketingConsentType {\n NEWSLETTER = 'NEWSLETTER',\n FLIGHT_OFFERS = 'FLIGHT_OFFERS',\n MEMBER_OFFERS = 'MEMBER_OFFERS',\n}\n\ninterface NewsLetterForm {\n advertising: FormControl;\n marketingNewsletter: FormControl;\n}\n\n@Component({\n selector: 'fin-pax-details-marketing-consent',\n templateUrl: './pax-details-marketing-consent.component.html',\n})\nexport class PaxDetailsMarketingConsentComponent implements OnInit, OnDestroy {\n public readonly MarketingConsentType = MarketingConsentType;\n public readonly SvgLibraryIcon = SvgLibraryIcon;\n\n @Input() passengers: TypedFormArray>;\n\n @ViewChild('consentCheck') private consentCheck: CheckboxComponent;\n\n marketingConsentOpen = true;\n marketingConsentType$: Observable = of(undefined);\n consents$: Observable;\n formGroup: FormGroup;\n subscriptions = new Subscription();\n\n constructor(\n private router: Router,\n private consentService: ConsentService,\n private languageService: LanguageService,\n private newsletterService: NewsletterSignupService,\n private sentryLogger: SentryLogger,\n private store$: Store\n ) {}\n\n ngOnInit(): void {\n this.marketingConsentType$ = this.getMarketingConsentType();\n this.formGroup = new FormGroup({\n marketingNewsletter: new FormControl(false),\n advertising: new FormControl({ value: false, disabled: true }),\n });\n\n this.subscriptions.add(\n this.formGroup.controls.marketingNewsletter.valueChanges.subscribe((marketingEnabled) => {\n if (marketingEnabled) {\n this.formGroup.controls.advertising.enable();\n } else {\n this.formGroup.controls.advertising.setValue(false);\n this.formGroup.controls.advertising.disable();\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscriptions);\n }\n\n private getMarketingConsentType(): Observable {\n return this.store$.pipe(\n profileOrUndefinedIfNotLoggedIn(),\n switchMap((userProfile) =>\n iif(() => !!userProfile, this.getMemberConsent(), of(MarketingConsentType.NEWSLETTER))\n ),\n finShare()\n );\n }\n\n private getMemberConsent(): Observable {\n this.consents$ = combineLatest([\n this.store$.pipe(loginToken(), filter(Boolean), take(1)),\n this.store$.pipe(profileType(), filter(Boolean), take(1)),\n ]).pipe(\n switchMap(([token, type]) => this.consentService.getMarketingConsents({ token }, type)),\n map((consentGroup: ConsentGroup) => consentGroup?.consents)\n );\n\n return this.consents$.pipe(\n map((consents) => {\n const flightOffersAccepted = consents?.find(\n (c) => c.consentTextId === ConsentTextId.FLIGHT_OFFERS && c.consentStatus === ConsentStatus.ACCEPTED\n );\n if (!flightOffersAccepted) {\n return MarketingConsentType.FLIGHT_OFFERS;\n }\n const memberOffersAccepted = consents?.find(\n (c) => c.consentTextId === ConsentTextId.MEMBER_OFFERS && c.consentStatus === ConsentStatus.ACCEPTED\n );\n if (!memberOffersAccepted) {\n return MarketingConsentType.MEMBER_OFFERS;\n }\n return undefined;\n })\n );\n }\n\n public setMarketingConsent(): Observable {\n return this.marketingConsentType$.pipe(\n take(1),\n switchMap((type) => {\n switch (type) {\n case MarketingConsentType.FLIGHT_OFFERS:\n return this.addConsent(ConsentTextId.FLIGHT_OFFERS);\n case MarketingConsentType.MEMBER_OFFERS:\n return this.addConsent(ConsentTextId.MEMBER_OFFERS);\n case MarketingConsentType.NEWSLETTER:\n default:\n return this.subscribeToNewsletter();\n }\n }),\n catchError((e: unknown) => {\n this.sentryLogger.error('Failed to set marketing consents', e);\n return of(false);\n })\n );\n }\n\n private addConsent(textId: string): Observable {\n if (!this.consentCheck?.checked) {\n return of(false);\n }\n return this.consents$.pipe(\n map((consents) =>\n consents?.map((c: Consent) => ({\n ...c,\n consentStatus: c.consentTextId === textId ? ConsentStatus.ACCEPTED : c.consentStatus,\n }))\n ),\n withLatestFrom(this.store$.pipe(loginToken())),\n switchMap(([consents, token]) => this.consentService.sendConsents({ token }, consents, 'booking_flow'))\n );\n }\n\n private subscribeToNewsletter(): Observable {\n // Skip newsletter subscribing if none of the checkboxes have been checked\n if (\n !this.consentCheck?.checked &&\n !this.formGroup.get('marketingNewsletter').value &&\n !this.formGroup.get('advertising').value\n ) {\n return of(null);\n }\n const firstPassenger = this.passengers.controls[0];\n return combineLatest([this.languageService.countryCode, this.languageService.langKey]).pipe(\n switchMap(([country, language]: [string, string]) => {\n const payload: NewsletterSignupPayload = {\n firstName: firstPassenger.get('firstName').value,\n lastName: firstPassenger.get('lastName').value,\n email: firstPassenger.get('email').value,\n country: country?.toUpperCase(),\n language: language?.toUpperCase(),\n pageUrl: this.router.url,\n source: NewsLetterSource.BOOKING_FLOW,\n marketingNewsletter: this.formGroup.get('marketingNewsletter').value,\n advertising: this.formGroup.get('advertising').value,\n };\n return this.newsletterService.postSubscribeRequest(payload);\n })\n );\n }\n}\n","\n
\n
\n \n
\n
\n
\n
\n \n

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

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

{{ serviceInfo.title }}

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

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

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

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

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

{{ 'paxDetails.more' | finLocalization }}

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

{{ 'ticketUpgradePromotion.header' | finLocalization }}

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

\n {{ data.teaserTitle }}\n

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

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

\n \n \n

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

{{ 'purchaseSummaryItemNames.flights' | finLocalization }}

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

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

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

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

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

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

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

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

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

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

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

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

\n \n
\n\n

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

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

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

\n

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

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

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

\n \n

\n

\n
\n
\n\n \n

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

\n

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

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

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

\n

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

\n

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

\n\n

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

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

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

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

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

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

\n
\n }\n
\n }\n\n \n \n \n \n {{ 'purchase.success.pointsUsedToPay' | finLocalization }}\n \n \n \n \n\n \n\n
\n \n \n
\n
\n \n \n \n
\n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n \n {{ 'serverErrorCodes.loadOrderFailed' | finLocalization }}\n \n \n \n\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { Params, Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, startWith, take } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { ElementActions, ElementTypes, GaContext, GtmTripType, LoaderType } from '@fcom/common/interfaces';\nimport { WindowRef } from '@fcom/core/providers/window';\nimport { ConfigService, NativeBridgeService } from '@fcom/core/services';\nimport { IdAndHash } from '@fcom/dapi';\nimport { isPresent, unique, unsubscribe } from '@fcom/core/utils';\nimport { FinnairOrder, FinnairServiceItem, ServiceFlow } from '@fcom/dapi/api/models';\nimport { QualtricsSurvey, QualtricsSurveys } from '@fcom/common/qualtrics/qualtrics.utils';\nimport { OrderStatus } from '@fcom/common-booking/store';\nimport { ButtonMode, ButtonTheme, IconPosition, NotificationLayout, NotificationTheme } from '@fcom/ui-components';\nimport { RootPaths } from '@fcom/core/constants';\nimport { GtmService } from '@fcom/common/gtm';\nimport { getServicesToShow } from '@fcom/common-booking/modules/ancillaries/utils';\nimport { getTripTypeFromBounds } from '@fcom/common/utils/gtm.utils';\n\nimport { GrandTotalTheme } from '../../../common/components/grand-total/grand-total.component';\n\nexport enum PageState {\n LOADING,\n DONE,\n ERROR,\n}\n\n@Component({\n selector: 'fin-purchase-success',\n templateUrl: 'purchase-success.component.html',\n styleUrl: 'purchase-success.component.scss',\n})\nexport class PurchaseSuccessComponent implements OnInit, OnDestroy {\n readonly PageState = PageState;\n readonly LoaderType = LoaderType;\n readonly ServiceFlow = ServiceFlow;\n readonly ElementTypes = ElementTypes;\n readonly TRACKING_CONTEXT = GaContext.BOOKING_FLOW;\n readonly ButtonTheme = ButtonTheme;\n readonly ButtonMode = ButtonMode;\n readonly NotificationTheme = NotificationTheme;\n readonly GrandTotalTheme = GrandTotalTheme;\n readonly IconPosition = IconPosition;\n readonly SvgLibraryIcon = SvgLibraryIcon;\n readonly NotificationLayout = NotificationLayout;\n\n @Input()\n orderStatus$: Observable;\n @Input()\n orderData$: Observable;\n @Input()\n orderFetchInformation$: Observable;\n\n showCorporateUpsell$: Observable;\n hasCorporateSeatBenefit$: Observable;\n\n @Output()\n loadOrderErrorClick: EventEmitter = new EventEmitter();\n @Output()\n ctaClick: EventEmitter = new EventEmitter();\n\n surveyInfo$: Observable;\n\n state$: Observable;\n appUrl$: Observable;\n hasBeenIssuedETickets$: Observable;\n unconfirmedServices$: Observable;\n paidIncludedServices$: Observable;\n\n subscriptions: Subscription;\n\n showPoints$: Observable;\n emails$: Observable;\n openSurvey = false;\n enableAppCtaButton = false;\n enableSynchronousTicketingOnConfirmationPage = false;\n\n private removeGlobalListener: () => void;\n\n constructor(\n public nativeBridgeService: NativeBridgeService,\n private windowRef: WindowRef,\n public languageService: LanguageService,\n public router: Router,\n private gtmService: GtmService,\n private configService: ConfigService\n ) {}\n\n ngOnInit(): void {\n this.enableSynchronousTicketingOnConfirmationPage =\n this.configService.cfg.enableSynchronousTicketingOnConfirmationPage;\n this.surveyInfo$ = this.orderData$.pipe(map((od) => this.getSurveyInfo(od)));\n\n this.showPoints$ = this.orderData$.pipe(\n map(\n (order) =>\n order.serviceFlow === ServiceFlow.AWARD ||\n !!(!order.serviceFlow && order.prices?.included?.total?.total?.totalPoints)\n )\n );\n\n this.state$ = combineLatest({\n status: this.orderStatus$,\n order: this.orderData$.pipe(startWith(undefined as FinnairOrder)),\n fetchInfo: this.orderFetchInformation$,\n }).pipe(\n map(({ status, order, fetchInfo }: { status: OrderStatus; order: FinnairOrder; fetchInfo: IdAndHash }) => {\n if (status === OrderStatus.LOAD_ERROR) {\n return PageState.ERROR;\n }\n if (isPresent(order) && isPresent(order.id) && order.id === fetchInfo.id) {\n return PageState.DONE;\n }\n return PageState.LOADING;\n }),\n distinctUntilChanged()\n );\n\n this.hasBeenIssuedETickets$ = this.orderData$.pipe(\n map((orderData) => {\n return orderData.passengers.every((passenger) => passenger.etickets?.length);\n })\n );\n\n this.unconfirmedServices$ = this.orderData$.pipe(\n map((booking) => getServicesToShow(booking.services, 'unconfirmed'))\n );\n this.paidIncludedServices$ = this.orderData$.pipe(\n map((booking) => {\n return getServicesToShow(booking.services, 'included', true);\n })\n );\n\n this.appUrl$ = this.orderData$.pipe(\n filter((data) => isPresent(data) && this.nativeBridgeService.isInsideNativeWebView),\n map((data: FinnairOrder) => {\n return this.nativeBridgeService.urlForAddAJourneyInApp(data.id, data.passengers[0].lastName);\n })\n );\n\n this.subscriptions = this.orderData$.pipe(filter((data) => isPresent(data))).subscribe((data: FinnairOrder) => {\n if (this.nativeBridgeService.isInsideNativeWebView) {\n this.nativeBridgeService.addBooking({\n recloc: data.id,\n travelers: data.passengers,\n rawBooking: data,\n });\n }\n });\n\n this.emails$ = this.orderData$.pipe(\n map((orderData) => {\n return orderData.passengers\n .map((passenger) => {\n return passenger.email;\n })\n .filter((email) => Boolean(email))\n .map((email) => email.toLowerCase())\n .filter(unique);\n })\n );\n\n this.showCorporateUpsell$ = this.orderData$.pipe(\n map(\n (orderData: FinnairOrder) =>\n this.configService.cfg.corporatePredict &&\n orderData.serviceFlow === ServiceFlow.BOOKING &&\n orderData.otherInformation.predictions?.corporateProbability > 0.6 &&\n orderData.otherInformation.predictions?.corporateProbability <= 1.0\n )\n );\n\n this.hasCorporateSeatBenefit$ = this.orderData$.pipe(\n map(\n (orderData: FinnairOrder) =>\n this.configService.cfg.enableCorporateSeatBenefit &&\n orderData.otherInformation?.corporateUserInformation?.isEligibleForSeatBenefit\n )\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n\n if (this.removeGlobalListener) {\n this.removeGlobalListener();\n }\n }\n\n openInApp(appUrl: string): void {\n this.windowRef.nativeWindow.open(appUrl);\n }\n\n openModal(event: Event): void {\n event.stopPropagation();\n\n this.openSurvey = true;\n }\n\n goToHomePage(): void {\n this.router.navigate([this.languageService.langValue]);\n this.gtmService.trackElement('home-button', this.TRACKING_CONTEXT, ElementTypes.BUTTON, '', ElementActions.CLICK);\n }\n\n goToMMB(extraParams?: Params): void {\n this.subscriptions.add(\n this.orderData$.pipe(take(1)).subscribe((order) => {\n const queryParams = {\n recLoc: order.id,\n lastName: order.passengers[0].lastName,\n ...extraParams,\n };\n const urlTree = this.router.createUrlTree(\n [`${this.languageService.langValue}/${RootPaths.MANAGE_BOOKING_ROOT}`],\n { queryParams }\n );\n const url = this.router.serializeUrl(urlTree);\n this.router.navigateByUrl(url);\n\n this.gtmService.trackElement(\n 'mmb-button',\n this.TRACKING_CONTEXT,\n ElementTypes.BUTTON,\n '',\n ElementActions.CLICK\n );\n })\n );\n }\n\n openCorporateSeatBenefit(): void {\n this.goToMMB({ seatMap: true });\n }\n\n private getSurveyInfo(orderData: FinnairOrder): QualtricsSurvey {\n if (getTripTypeFromBounds(orderData.bounds) == GtmTripType.MULTICITY) {\n return QualtricsSurveys.CONFIRMATION_MULTI_CITY;\n }\n\n return orderData.serviceFlow === ServiceFlow.AWARD\n ? QualtricsSurveys.AWARD_FEEDBACK\n : QualtricsSurveys.PURCHASE_FEEDBACK;\n }\n}\n","import { Component, OnInit, HostBinding, OnDestroy, Inject, HostListener } from '@angular/core';\nimport { Router, ActivatedRoute, ParamMap } from '@angular/router';\nimport { DOCUMENT, Location } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\nimport { Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { FinnairOrder } from '@fcom/dapi/api/models';\nimport { snapshot } from '@fcom/rx';\nimport { IdAndHash } from '@fcom/dapi';\nimport { OrderStatus, orderData, orderStatus, orderFetchInformation, OrderActions } from '@fcom/common-booking/store';\nimport { BookingOrderService } from '@fcom/common-booking';\nimport { PurchaseSuccessService } from '@fcom/common-booking/modules/purchase-success';\nimport { pathSegmentsToPathString } from '@fcom/core/utils/app-url-utils';\nimport { ElementActions, ElementTypes, GaContext, UserAgentService } from '@fcom/common/index';\nimport { GtmService } from '@fcom/common/gtm';\nimport { ConfigService } from '@fcom/core/index';\nimport { BookingAndAppState } from '@fcom/common/interfaces/booking';\n\n@Component({\n selector: 'fin-booking-purchase-success-route',\n templateUrl: './booking-purchase-success-route.component.html',\n})\nexport class BookingPurchaseSuccessRouteComponent implements OnInit, OnDestroy {\n @HostBinding('class') classAttribute = 'grid-col-12 pr-clear';\n @HostListener('window:beforeinstallprompt') onBeforeInstallPrompt(): void {\n if (!this.userAgentService.isAndroid()) {\n return;\n }\n\n this.gtmService.trackElement(\n 'confirmation-page_android_prompt_show',\n GaContext.BOOKING_FLOW,\n ElementTypes.BANNER,\n undefined,\n ElementActions.VIEW\n );\n }\n\n @HostListener('window:appinstalled') onAppInstalled(): void {\n if (!this.userAgentService.isAndroid()) {\n return;\n }\n\n this.gtmService.trackElement(\n 'confirmation-page_android_prompt_install',\n GaContext.BOOKING_FLOW,\n ElementTypes.BANNER,\n undefined,\n ElementActions.CLICK\n );\n }\n\n readonly orderData$: Observable;\n readonly orderStatus$: Observable;\n readonly orderFetchInformation$: Observable;\n\n constructor(\n private store$: Store,\n private bookingOrderService: BookingOrderService,\n private router: Router,\n private languageService: LanguageService,\n private activatedRoute: ActivatedRoute,\n private purchaseSuccessService: PurchaseSuccessService,\n private locationService: Location,\n private gtmService: GtmService,\n private configService: ConfigService,\n private userAgentService: UserAgentService,\n @Inject(DOCUMENT) private document: Document\n ) {\n this.orderData$ = this.store$.pipe(\n orderData(),\n filter((v) => !!v)\n );\n this.orderStatus$ = this.store$.pipe(orderStatus());\n this.orderFetchInformation$ = this.store$.pipe(\n orderFetchInformation(),\n filter((v) => !!v)\n );\n }\n\n ngOnInit(): void {\n const paramMap: ParamMap = this.activatedRoute.snapshot.queryParamMap;\n if (this.purchaseSuccessService.hasOrderQueryParams(paramMap)) {\n this.store$.dispatch(\n OrderActions.setOrderFetchInformation({\n orderInformation: {\n id: paramMap.get(this.purchaseSuccessService.PARAM_ORDER_ID),\n hash: paramMap.get(this.purchaseSuccessService.PARAM_HASH),\n },\n })\n );\n }\n\n if (this.userAgentService.isAndroid()) {\n this.addAppInstallPromptAndroid();\n } else if (this.userAgentService.isIos()) {\n this.addAppInstallPromptIos();\n }\n\n const order: FinnairOrder = snapshot(this.store$.pipe(orderData()));\n const status: OrderStatus = snapshot(this.store$.pipe(orderStatus()));\n const fetchInformation: IdAndHash = snapshot(this.store$.pipe(orderFetchInformation()));\n\n if (this.purchaseSuccessService.orderHasToBeRefetched(order, status, fetchInformation, paramMap)) {\n this.fetchOrder();\n }\n\n // Remove sensitive param from history and browser url\n this.locationService.replaceState(pathSegmentsToPathString(this.activatedRoute.snapshot.pathFromRoot));\n }\n\n ngOnDestroy(): void {\n this.removeAppInstallPrompts();\n }\n\n fetchOrder(): void {\n this.bookingOrderService.queueOrderLoad(false, true);\n }\n\n navigateToFrontPage(): void {\n this.router.navigateByUrl(`/${this.languageService.langValue}`);\n }\n\n addAppInstallPromptIos(): void {\n const appName = this.configService.cfg.appName;\n const appId = this.configService.cfg.appIdIos;\n const head = this.document.querySelector('head');\n const metaTag = this.document.createElement('meta');\n\n metaTag.setAttribute('data-test', 'install-prompt-ios');\n metaTag.setAttribute('name', appName);\n metaTag.setAttribute('content', `app-id=${appId}`);\n head.insertBefore(metaTag, head.firstChild);\n }\n\n addAppInstallPromptAndroid(): void {\n const manifestPath = this.configService.cfg.manifestPathAndroid;\n const head = this.document.querySelector('head');\n const linkTag = this.document.createElement('link');\n\n linkTag.setAttribute('data-test', 'install-prompt-android');\n linkTag.setAttribute('rel', 'manifest');\n linkTag.setAttribute('crossorigin', 'use-credentials');\n linkTag.setAttribute('href', manifestPath);\n head.insertBefore(linkTag, head.firstChild);\n }\n\n removeAppInstallPrompts(): void {\n this.document\n .querySelectorAll('[data-test=\"install-prompt-ios\"], [data-test=\"install-prompt-android\"]')\n .forEach((e) => e.remove());\n }\n}\n","\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer, Location } from '@angular/common';\nimport { ActivatedRouteSnapshot, CanActivate, Params, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\n\nimport { isNull, LocalDate } from '@fcom/core/utils';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { SentryLogger, GlobalBookingTravelClass, ConfigService } from '@fcom/core';\nimport { Cabin } from '@fcom/dapi/api/models';\nimport { FinnairMultiCitySearchInterface } from '@fcom/common/interfaces';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\n\nimport { BookingService } from '../../../services';\nimport { UTM_PARAMS } from '../../../../core/constants';\n\nconst PROMO_CODE_REGEXP = /^[A-Z0-9\\-_]{2,15}$/;\n\nconst validate = {\n flights: (flights: unknown, isMultiCityEnabled: boolean): true | string => {\n const maxBounds = isMultiCityEnabled ? 6 : 2;\n\n if (!flights || !Array.isArray(flights) || flights.length === 0 || flights.length > maxBounds) {\n return 'flights invalid';\n }\n\n const flightsAreValid = flights\n .map((flightSearch, i) => {\n if (!validate.locationCode(flightSearch.origin)) {\n return `flight ${i} origin invalid`;\n }\n\n if (!validate.locationCode(flightSearch.destination)) {\n return `flight ${i} destination invalid`;\n }\n\n if (!validate.date(flightSearch.departureDate)) {\n return `flight ${i} departureDate invalid`;\n }\n\n if (i === 0 && new LocalDate(flightSearch.departureDate).lt(LocalDate.now())) {\n return `flight ${i} departureDate is in the past invalid`;\n }\n\n if (i === 1 && new LocalDate(flightSearch.departureDate).lt(new LocalDate(flights[0].departureDate))) {\n return `flight ${i} departureDate is earlier that the outbound departureDate`;\n }\n\n if (!validate.fareFamily(flightSearch.fareFamily)) {\n return `flight ${i} fareFamily invalid`;\n }\n\n if (!validate.flightNumbers(flightSearch.flightNumbers)) {\n return `flight ${i} flightNumbers invalid`;\n }\n\n return true;\n })\n .find((validated) => typeof validated === 'string');\n\n if (typeof flightsAreValid === 'string') {\n return flightsAreValid;\n }\n\n return true;\n },\n locationCode: (code: unknown): boolean => {\n return typeof code === 'string' && code.length === 3;\n },\n date: (date: unknown): boolean => {\n return typeof date === 'string' && LocalDate.isLocalDate(date);\n },\n fareFamily: (fareFamily: unknown): boolean => {\n if (typeof fareFamily === 'undefined') {\n return true;\n }\n\n return typeof fareFamily === 'string' && fareFamily.length < 20;\n },\n flightNumbers: (flightNumbers: unknown): boolean => {\n if (typeof flightNumbers === 'undefined') {\n return true;\n }\n\n if (!Array.isArray(flightNumbers) || flightNumbers.length > 9) {\n return false;\n }\n\n return Boolean(\n flightNumbers\n .map((flightNumber: unknown) => {\n return typeof flightNumber === 'string' && flightNumber.length < 10;\n })\n .filter(Boolean).length\n );\n },\n cabin: (cabin: unknown): true | string => {\n const isValid =\n typeof cabin === 'string' &&\n Object.keys(GlobalBookingTravelClass)\n .map((k) => GlobalBookingTravelClass[k])\n .indexOf(cabin) !== -1;\n\n return isValid || `cabin ${cabin} invalid`;\n },\n paxAmount: (search: FinnairMultiCitySearchInterface): true | string => {\n // Check that all the different paxTypes are either undefined or numerical <= 9\n const basicCheck = ['adults', 'children', 'infants', 'c15s', 'b15s'].map((paxType) => {\n const amount: unknown = search[paxType];\n const isOk = typeof amount === 'undefined' || (typeof amount === 'number' && amount <= 9);\n\n return isOk || `pax type ${paxType} with value ${amount} invalid`;\n });\n const firstFail = basicCheck.find((check) => typeof check === 'string');\n\n if (firstFail) {\n return firstFail;\n }\n\n if (search.adults < 1) {\n return 'no adults check invalid';\n }\n\n if (search.children || search.c15s) {\n if (search.children + search.c15s >= 0 && search.children + search.c15s > 9 - search.adults) {\n return `more children+c15s (${search.children + search.c15s}) than adults (${search.adults}) check invalid`;\n }\n }\n\n if (search.infants) {\n if (search.infants > search.adults) {\n return `more infants (${search.infants}) than adults (${search.adults}) check invalid`;\n }\n }\n\n return true;\n },\n directFlights: (directFlights: unknown): true | string => {\n const isValid = typeof directFlights === 'undefined' || typeof directFlights === 'boolean';\n\n return isValid || 'directFlights not a boolean';\n },\n isAward: (isAward: unknown): true | string => {\n const isValid = typeof isAward === 'undefined' || isNull(isAward) || typeof isAward === 'boolean';\n\n return isValid || 'isAward not a boolean';\n },\n promoCode: (promoCode: unknown): true | string => {\n const isValid =\n typeof promoCode === 'undefined' || (typeof promoCode === 'string' && PROMO_CODE_REGEXP.test(promoCode));\n\n return isValid || `promoCode is invalid: ${promoCode}`;\n },\n};\n\nconst getQueryParameters = (route: ActivatedRouteSnapshot): FinnairMultiCitySearchInterface => {\n const params = JSON.parse(decodeURIComponent(route.queryParams.json));\n\n return {\n cabin: Cabin.MIXED,\n ...params,\n };\n};\n\n@Injectable()\nexport class TicketSelectionGuard implements CanActivate {\n constructor(\n private bookingService: BookingService,\n private router: Router,\n private languageService: LanguageService,\n private sentryLogger: SentryLogger,\n private configService: ConfigService,\n private location: Location,\n @Inject(PLATFORM_ID) private platform: object\n ) {}\n\n isOldDeeplinkFormat(queryParams: Params): boolean {\n return Boolean(queryParams.origin && queryParams.destination);\n }\n\n redirectToJsonDeeplink({ queryParams }: { queryParams: Params }): UrlTree | boolean {\n try {\n const search: FinnairMultiCitySearchInterface = {\n flights: [],\n };\n\n search.flights.push({\n origin: queryParams.origin,\n destination: queryParams.destination,\n departureDate: queryParams.departureDate,\n });\n\n if (queryParams.departureFlightNumbers) {\n search.flights[0].flightNumbers = queryParams.departureFlightNumbers.split(',');\n }\n\n if (queryParams.departureFareFamily) {\n search.flights[0].fareFamily = queryParams.departureFareFamily;\n }\n\n if (queryParams.returnDate) {\n search.flights.push({\n origin: queryParams.destination,\n destination: queryParams.origin,\n departureDate: queryParams.returnDate,\n });\n }\n\n if (queryParams.returnFlightNumbers) {\n search.flights[1].flightNumbers = queryParams.returnFlightNumbers.split(',');\n }\n\n if (queryParams.returnFareFamily) {\n search.flights[1].fareFamily = queryParams.returnFareFamily;\n }\n\n ['adults', 'b15s', 'c15s', 'children', 'infants'].forEach((paxType) => {\n if (queryParams[paxType]) {\n search[paxType] = Number(queryParams[paxType]);\n }\n });\n\n if (queryParams.cabin) {\n search.cabin = queryParams.cabin;\n }\n\n if (queryParams.directFlights) {\n search.directFlights = queryParams.directFlights === 'true';\n }\n\n if (queryParams.isAward) {\n search.isAward = queryParams.isAward === 'true';\n }\n\n if (queryParams.promoCode) {\n search.promoCode = queryParams.promoCode;\n }\n\n const urlTree = this.router.createUrlTree(\n [this.languageService.langValue, 'booking', BOOKING_STEPS.FLIGHT_SELECTION.path],\n {\n queryParams: {\n json: JSON.stringify(search),\n ...this.filterUtmParams(queryParams),\n },\n }\n );\n\n // We want to replace the history with the json url to avoid quaryParams issues\n // when the user would press the browser's the back button etc.\n const jsonUrl = this.router.serializeUrl(urlTree);\n this.location.replaceState(jsonUrl);\n\n return urlTree;\n } catch (e) {\n this.sentryLogger.error('Error converting to JSON deeplink format', {\n error: queryParams,\n });\n return false;\n }\n }\n\n filterUtmParams(queryParams: Params): Params {\n return Object.keys(queryParams)\n .filter((key) => UTM_PARAMS.includes(key))\n .reduce(\n (params, key) => ({\n ...params,\n [key]: queryParams[key],\n }),\n {}\n );\n }\n\n validateDeeplink(search: FinnairMultiCitySearchInterface): boolean {\n const validations = [];\n\n validations.push(validate.flights(search.flights, this.configService.cfg.enableMultiCity));\n validations.push(validate.cabin(search.cabin));\n validations.push(validate.paxAmount(search));\n validations.push(validate.directFlights(search.directFlights));\n validations.push(validate.isAward(search.isAward));\n validations.push(validate.promoCode(search.promoCode));\n\n const passesValidation = validations.length === validations.filter((validation) => validation === true).length;\n /**\n * Specifically ignore this departureDate case because it happens a lot from customers reusing old links, and this check is\n * not a valid sentry issue for us to investigate.\n */\n if (!passesValidation && !validations.includes('flight 0 departureDate is in the past invalid')) {\n this.sentryLogger.info('validation failed for deeplink', {\n search,\n validations: validations.filter((validation) => typeof validation === 'string'),\n });\n }\n\n return passesValidation;\n }\n\n hasJSONDeeplink(route: ActivatedRouteSnapshot): boolean {\n return Boolean(route.queryParams.json);\n }\n\n canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean | UrlTree {\n if (isPlatformServer(this.platform)) {\n return true;\n }\n\n if (this.isOldDeeplinkFormat(route.queryParams)) {\n return this.redirectToJsonDeeplink(route);\n }\n\n try {\n /**\n * Avoid trying to process if there is no deeplink. This also avoids any extra sentry alerts\n * for this quite common case (logout from pax details page is one situation).\n **/\n if (!this.hasJSONDeeplink(route)) {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n return false;\n }\n\n const search = getQueryParameters(route);\n const canAccess = this.validateDeeplink(search);\n\n if (!canAccess) {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n return true;\n } catch (e) {\n this.sentryLogger.error('Uncaught error reading and validating deeplink', {\n error: route.queryParams,\n });\n return false;\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { FinnairBoundFareFamily } from '@fcom/dapi/api/models';\n\n@Injectable()\nexport class DimensionsAndDetailsModalService {\n get showDimensionsAndDetailsObservable$(): Observable {\n return this.showDimensionsAndDetails$;\n }\n\n get showAllDimensionsAndDetailsObservable$(): Observable {\n return this.showAllDimensionsAndDetails$;\n }\n\n private showDimensionsAndDetails$: BehaviorSubject =\n new BehaviorSubject(undefined);\n private showAllDimensionsAndDetails$: BehaviorSubject = new BehaviorSubject(false);\n\n opedDimensionsAndDetails(bound: FinnairBoundFareFamily): void {\n this.showDimensionsAndDetails$.next(bound);\n }\n\n opedAllDimensionsAndDetails(): void {\n this.showAllDimensionsAndDetails$.next(true);\n }\n\n closeModal(): void {\n this.showDimensionsAndDetails$.next(undefined);\n this.showAllDimensionsAndDetails$.next(false);\n }\n}\n","\n \n {{ 'bookingSearch.errors.fetchFailed' | finLocalization }}\n \n\n \n {{ 'bookingSearch.errors.noFlightsFound' | finLocalization }}\n \n\n \n {{ 'bookingSearch.errors.invalidInput' | finLocalization }}\n \n\n
\n \n
\n
\n \n \n \n\n
\n \n\n \n \n\n \n \n
\n
\n
\n\n\n {{ 'price.continueButtonTotal' | finLocalization }}: \n \n {{ 'award.points' | finLocalization: { pointsAmount: points || 0 | finPoints } }} + \n {{\n selectedOfferPrice$ | async | finPrice | finEmpty: '–'\n }}\n\n\n\n \n \n\n\n\n \n \n\n\n\n
\n \n
\n\n","import { Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { Store } from '@ngrx/store';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport { delay, distinctUntilChanged, filter, map, startWith, switchMap, take, withLatestFrom } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\n\nimport { ButtonPosition, ModalButtons, NotificationTheme, TabLayoutType } from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n GtmEvent,\n LoaderType,\n MediaQueryService,\n ScrollService,\n ToasterService,\n} from '@fcom/common';\nimport { GtmService } from '@fcom/common/gtm/services/gtm.service';\nimport { Amount, BoundType, CheapestBoundPrice, LocationInfoMap, PaxAmount } from '@fcom/dapi';\nimport { finShare, safeMap, snapshot } from '@fcom/rx';\nimport { isPresent, LocalDate, mapValues, stopPropagation, unique, unsubscribe } from '@fcom/core/utils';\nimport {\n Bound,\n FareFamily,\n FareInformation,\n FinnairBoundItem,\n FinnairCabinClass,\n ItineraryItemFlight,\n ItineraryItemLayover,\n Offer,\n OfferList,\n} from '@fcom/dapi/api/models';\nimport { Profile } from '@fcom/core-api/login';\nimport { profile } from '@fcom/core/selectors';\nimport { DimensionsAndDetails, SortBy } from '@fcom/common-booking';\nimport { globalBookingFlights, globalBookingPaxAmount } from '@fcom/common/store';\nimport { compareAsJson, GlobalBookingTravelClass } from '@fcom/core/index';\nimport { FAKE_LOAD_TIME } from '@fcom/common-booking/interfaces/flight-filters.interface';\nimport { BOOKING_STEPS } from '@fcom/common/config/booking-config';\nimport {\n AirOffersStatus,\n BookingAppState,\n BoundInfoWithFareFamilies,\n BoundInfoWithFareFamiliesMap,\n FareFamilyMap,\n QuotasPerBound,\n SelectionPhase,\n BoundWithLocations,\n} from '@fcom/common/interfaces/booking';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { getCabinClassesForAwardBounds } from '@fcom/common-booking/utils/bound.utils';\nimport { BookingWidgetService } from '@fcom/booking-widget/services/booking-widget.service';\n\nimport { OffersActions } from '../../../store/actions';\nimport {\n boundSelectionsDone,\n currentFareFamilies,\n currentOffer,\n currentOffers,\n filteredCurrentOffersInbound,\n filteredCurrentOffersOutbound,\n flightSelectionGtmDataForOffers,\n hasZeroBaggageOnEitherFlight,\n isOneWayOffers,\n offersCurrency,\n offersDepartureDate,\n offersHash,\n offersReturnDate,\n offersStatus,\n quotasForBounds,\n selectedInboundFareFamilyCode,\n selectedInboundId,\n selectedOutboundFareFamilyCode,\n selectedOutboundId,\n selectedTicketSortBy,\n} from '../../../store/selectors';\nimport { BookingQueueService, BookingService } from '../../../services';\nimport { CountryCode } from '../../../utils';\nimport { containsOnlyOneCabin, getBoundFareFamilies } from '../utils/offer.utils';\nimport { LocationNames, ItineraryDetails } from '../interfaces';\n\nexport const offerListSortMap: { [id: string]: string } = Object.freeze({\n [SortBy.DURATION]: 'default',\n [SortBy.PRICE]: 'price',\n [SortBy.ARRIVAL]: 'arrivalTime',\n [SortBy.DEPARTURE]: 'departureTime',\n});\n\ninterface ItineraryModalState {\n open: boolean;\n data: BoundInfos;\n}\n\ninterface ContinueModalState {\n open: boolean;\n data: ContinueModalData;\n}\n\ntype BoundInfos = { outbound?: BoundInfoWithFareFamilies; inbound?: BoundInfoWithFareFamilies };\n\ntype ContinueModalData = {\n /**\n * Whether to show the zeroBaggage warning for the ticket type\n */\n zeroBaggage: boolean;\n};\n\ninterface BenefitsModalState {\n open: boolean;\n data: DimensionsAndDetails;\n}\n\nconst EMPTY_AMOUNT: Amount = { amount: undefined, currencyCode: 'EUR' };\n\nconst boundWithDetails = (offers: OfferList, bound: Bound): BoundWithLocations | undefined => {\n if (!bound) {\n return;\n }\n\n return {\n ...bound,\n departure: {\n ...bound.departure,\n cityName: offers.locations[bound.departure.locationCode]?.cityName,\n name: offers.locations[bound.departure.locationCode]?.name,\n },\n arrival: {\n ...bound.arrival,\n cityName: offers.locations[bound.arrival.locationCode]?.cityName,\n name: offers.locations[bound.arrival.locationCode]?.name,\n },\n };\n};\n\nconst itineraryWithDetails = (\n boundFareInformation: FareInformation[],\n itinerary: (ItineraryItemFlight | ItineraryItemLayover)[],\n locations: LocationInfoMap\n): ItineraryDetails[] => {\n return itinerary.filter(isFlight).map((flight: ItineraryItemFlight) => {\n const matchingSegment = boundFareInformation?.find((segment) => segment.segmentId === flight?.id);\n\n return {\n ...flight,\n cabinClass: matchingSegment?.cabinClass,\n bookingClass: matchingSegment?.bookingClass,\n departure: {\n ...flight.departure,\n cityName: locations[flight.departure.locationCode]?.cityName,\n },\n arrival: {\n ...flight.arrival,\n cityName: locations[flight.arrival.locationCode]?.cityName,\n },\n };\n });\n};\n\n@Component({\n selector: 'fin-booking-ticket-selection-view',\n templateUrl: './booking-ticket-selection-view.component.html',\n styleUrls: ['./booking-ticket-selection-view.component.scss'],\n})\nexport class BookingTicketSelectionViewComponent implements OnInit, OnDestroy {\n public readonly profile$: Observable;\n\n public readonly AirOffersStatus = AirOffersStatus;\n public readonly BoundType = BoundType;\n public readonly SelectionPhase = SelectionPhase;\n public readonly ModalButtons = ModalButtons;\n public readonly LoaderType = LoaderType;\n public readonly ButtonPosition = ButtonPosition;\n public readonly TabLayoutType = TabLayoutType;\n\n public readonly offers$: Observable;\n public readonly outbounds$: Observable;\n public readonly inbounds$: Observable;\n public readonly currencyCode$: Observable;\n public readonly offersStatus$: Observable;\n public readonly departureDate$: Observable;\n public readonly returnDate$: Observable;\n public readonly isOneWayOffers$: Observable;\n public readonly fareFamilies$: Observable;\n public readonly selectedOutbound$: Observable;\n public readonly selectedInbound$: Observable;\n public readonly selectedOutboundFareFamilyCode$: Observable;\n public readonly selectedInboundFareFamilyCode$: Observable;\n public readonly selectedOutboundFareFamilyBenefits$: Observable;\n public readonly selectedInboundFareFamilyBenefits$: Observable;\n public readonly selectedOffer$: Observable;\n public readonly selectedOutboundOfferItinerary$: Observable;\n public readonly selectedInboundOfferItinerary$: Observable;\n public readonly quotas$: Observable;\n public readonly paxAmount$: Observable;\n\n public readonly enabledOutboundIds$: Observable;\n public readonly enabledInboundIds$: Observable;\n\n public readonly cheapestCombinableOutboundPrices$: Observable;\n public readonly cheapestCombinableInboundPrices$: Observable;\n\n /**\n * Whether or not the bounds have been selected (both for two-way and the outbound for one-way trips.)\n */\n public readonly boundsSelected$: Observable;\n public readonly selectableOffers$: Observable;\n public readonly selectedOfferPrice$: Observable;\n public readonly selectedOfferPoints$: Observable;\n\n public readonly locations$: Observable;\n\n public readonly showKoreaNotification$: Observable;\n public readonly isMobile$: Observable;\n\n // == SELECTION PHASE ==\n public readonly selectionPhase$: BehaviorSubject = new BehaviorSubject(\n SelectionPhase.OUTBOUND\n );\n continueEnabled$: Observable;\n continueButtonClicks$: Subject = new Subject();\n continueButtonId$: Observable;\n\n // == SORTING ==\n public readonly selectedSortBy$: Observable;\n public readonly inboundIdSortOrder$: Observable;\n public readonly outboundIdSortOrder$: Observable;\n\n @Input()\n goToOutboundPhase$: Observable;\n\n @Output()\n refetchOffers: EventEmitter = new EventEmitter();\n\n @Output()\n selectionPhaseChange: EventEmitter = new EventEmitter();\n\n itineraryModal: ItineraryModalState = {\n open: false,\n data: {},\n };\n\n continueModal: ContinueModalState = {\n open: false,\n data: null,\n };\n\n benefitsModal: BenefitsModalState = {\n open: false,\n data: null,\n };\n\n availableCabinClasses$: Observable;\n\n private openBoundClick$ = new Subject<{ bound: BoundInfoWithFareFamilies; boundType: BoundType }>();\n private subscription = new Subscription();\n\n isLoading$: BehaviorSubject = new BehaviorSubject(null);\n selectedSortCriteria$ = of(SortBy.PRICE);\n filteredOffersOutbound$: Observable;\n filteredOfferInbound$: Observable;\n outboundSorting$: Observable<{ [key: string]: string[] }>;\n inboundSorting$: Observable<{ [key: string]: string[] }>;\n showOutboundFilters$: Observable;\n showInboundFilters$: Observable;\n activeCabinClassNotificationIds: string[] = [];\n tripLocations$: Observable;\n\n constructor(\n private bookingQueueService: BookingQueueService,\n private languageService: LanguageService,\n private store$: Store,\n private gtmService: GtmService,\n private bookingService: BookingService,\n private scrollService: ScrollService,\n private mediaQueryService: MediaQueryService,\n private toasterService: ToasterService,\n private bookingWidgetService: BookingWidgetService,\n @Inject(PLATFORM_ID) private platform: object\n ) {\n this.offers$ = this.store$.pipe(currentOffers());\n this.filteredOffersOutbound$ = this.store$.pipe(filteredCurrentOffersOutbound());\n this.filteredOfferInbound$ = this.store$.pipe(filteredCurrentOffersInbound());\n this.showKoreaNotification$ = this.offers$.pipe(\n map((offerList: OfferList) => {\n const location = offerList.locations[offerList.finnairSearchParameters?.itinerary[0].departureLocationCode];\n return location && location.countryCode === CountryCode.KOREA;\n }),\n finShare()\n );\n this.currencyCode$ = this.store$.pipe(offersCurrency());\n this.offersStatus$ = this.store$.pipe(offersStatus());\n this.isOneWayOffers$ = this.store$.pipe(isOneWayOffers());\n this.departureDate$ = this.store$.pipe(offersDepartureDate());\n this.returnDate$ = this.store$.pipe(offersReturnDate());\n this.fareFamilies$ = this.store$.pipe(currentFareFamilies());\n this.quotas$ = this.store$.pipe(quotasForBounds());\n\n this.showOutboundFilters$ = this.offers$.pipe(\n filter(Boolean),\n map((bounds) => Object.keys(bounds.outbounds).length > 3),\n finShare()\n );\n this.showInboundFilters$ = this.offers$.pipe(\n filter(Boolean),\n map((bounds) => Object.keys(bounds.inbounds).length > 3),\n finShare()\n );\n\n this.selectedOutbound$ = combineLatest([this.filteredOffersOutbound$, this.store$.pipe(selectedOutboundId())]).pipe(\n map(([offers, boundId]) => boundWithDetails(offers, offers.outbounds[boundId])),\n finShare()\n );\n this.selectedInbound$ = combineLatest([\n this.filteredOfferInbound$.pipe(filter((offers) => offers.finnairSearchParameters?.itinerary.length !== 1)),\n this.store$.pipe(selectedInboundId()),\n ]).pipe(\n map(([offers, boundId]: [OfferList, string]) => boundWithDetails(offers, offers.inbounds[boundId])),\n finShare()\n );\n this.selectedOutboundFareFamilyCode$ = this.store$.pipe(selectedOutboundFareFamilyCode());\n this.selectedInboundFareFamilyCode$ = this.store$.pipe(selectedInboundFareFamilyCode());\n this.selectedOutboundFareFamilyBenefits$ = combineLatest([\n this.selectedOutboundFareFamilyCode$,\n this.fareFamilies$,\n ]).pipe(map(([fareFamilyCode, fareFamilies]) => fareFamilies?.[fareFamilyCode]));\n this.selectedInboundFareFamilyBenefits$ = combineLatest([\n this.selectedInboundFareFamilyCode$,\n this.fareFamilies$,\n ]).pipe(map(([fareFamilyCode, fareFamilies]) => fareFamilies?.[fareFamilyCode]));\n\n this.outbounds$ = this.filteredOffersOutbound$.pipe(\n map((offers) => {\n return mapValues(offers.outbounds, (bound, boundId) => {\n const outboundOffers = offers.offers.filter((o) => o.outboundId === boundId);\n const uniqueBoundFareFamilyCodes = outboundOffers.map((a) => a.outboundFareFamily).filter(unique);\n const fareFamilies = Object.values(offers.fareFamilies).filter((ff) =>\n uniqueBoundFareFamilyCodes.includes(ff.fareFamilyCode)\n );\n\n return {\n ...bound,\n fareFamilies: getBoundFareFamilies(fareFamilies, outboundOffers, bound, 'outbound'),\n };\n });\n }),\n finShare()\n );\n this.inbounds$ = combineLatest([\n this.filteredOfferInbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n ]).pipe(\n map(([offers, outbound, selectedOutboundFareFamilyCode]) => {\n return 'inbounds' in offers\n ? mapValues(offers.inbounds, (bound, boundId) => {\n const inboundOffers = offers.offers.filter(\n (o) =>\n o.inboundId === boundId &&\n o.outboundId === outbound?.boundId &&\n o.outboundFareFamily === selectedOutboundFareFamilyCode\n );\n const uniqueBoundFareFamilyCodes = inboundOffers.map((a) => a.inboundFareFamily).filter(unique);\n const fareFamilies = Object.values(offers.fareFamilies).filter((ff) =>\n uniqueBoundFareFamilyCodes.includes(ff.fareFamilyCode)\n );\n return {\n ...bound,\n fareFamilies: getBoundFareFamilies(fareFamilies, inboundOffers, bound, 'inbound'),\n };\n })\n : {};\n }),\n finShare()\n );\n\n this.boundsSelected$ = this.store$.pipe(boundSelectionsDone());\n\n // == SELECTABLE OFFERS & BOUNDS ==\n type OffersAndType = { offers: Offer[]; oneWay: boolean };\n const offersAndType$: Observable = combineLatest([\n this.offers$.pipe(map((list: OfferList): Offer[] => list.offers)),\n this.isOneWayOffers$,\n ]).pipe(\n map(([offers, oneWay]: [Offer[], boolean]) => ({ offers, oneWay })),\n finShare()\n );\n const outboundId$: Observable = this.selectedOutbound$.pipe(\n map((info) => (info || ({} as BoundInfoWithFareFamilies)).boundId),\n startWith(undefined as string)\n );\n const inboundId$: Observable = this.selectedInbound$.pipe(\n map((info) => (info || ({} as BoundInfoWithFareFamilies)).boundId),\n startWith(undefined as string)\n );\n const byOutboundIdIfPresent =\n (id: string): ((o: Offer) => boolean) =>\n (o) =>\n !id || o.outboundId === id;\n const byInboundIdIfPresent =\n (id: string): ((o: Offer) => boolean) =>\n (o) =>\n !id || o.inboundId === id;\n const boundPrice = (boundId: string, price: string): CheapestBoundPrice => {\n return { boundId, cheapestPrice: price };\n };\n const cheapestPrice = (boundId: string, prices: CheapestBoundPrice[]): CheapestBoundPrice =>\n boundPrice(\n boundId,\n String(Math.min(...prices.filter((p) => p.boundId === boundId).map((p) => Number(p.cheapestPrice))))\n );\n\n this.selectableOffers$ = combineLatest({\n offersAndType: offersAndType$,\n outbound: outboundId$,\n inbound: inboundId$,\n }).pipe(\n map(({ offersAndType: { offers, oneWay }, outbound, inbound }) =>\n offers.filter(byInboundIdIfPresent(!oneWay && inbound)).filter(byOutboundIdIfPresent(outbound))\n ),\n finShare()\n );\n\n this.enabledOutboundIds$ = combineLatest([offersAndType$, inboundId$]).pipe(\n map(([{ offers, oneWay }, inbound]: [OffersAndType, string]): string[] =>\n offers\n .filter(byInboundIdIfPresent(!oneWay && inbound))\n .map((o) => o.outboundId)\n .filter(unique)\n ),\n finShare()\n );\n this.enabledInboundIds$ = combineLatest([offersAndType$, outboundId$]).pipe(\n map(([{ offers }, outbound]: [OffersAndType, string]): string[] =>\n offers\n .filter(byOutboundIdIfPresent(outbound))\n .map((o) => o.inboundId)\n .filter(unique)\n ),\n finShare()\n );\n\n this.cheapestCombinableOutboundPrices$ = combineLatest([offersAndType$, inboundId$]).pipe(\n map(([{ offers, oneWay }, inbound]: [OffersAndType, string]): CheapestBoundPrice[] => {\n const combinableOffers = offers.filter(byInboundIdIfPresent(!oneWay && inbound));\n const outboundIds = combinableOffers.map((offer) => offer.outboundId).filter(unique);\n const prices = combinableOffers.map((offer) => boundPrice(offer.outboundId, offer.outboundPrice));\n return outboundIds.map((outboundId) => cheapestPrice(outboundId, prices));\n }),\n finShare()\n );\n this.cheapestCombinableInboundPrices$ = combineLatest([offersAndType$, outboundId$]).pipe(\n map(([{ offers }, outbound]: [OffersAndType, string]): CheapestBoundPrice[] => {\n const combinableOffers = offers.filter(byOutboundIdIfPresent(outbound));\n const inboundIds = combinableOffers.map((offer) => offer.inboundId).filter(unique);\n const prices = combinableOffers.map((offer) => boundPrice(offer.inboundId, offer.inboundPrice));\n return inboundIds.map((inboundId) => cheapestPrice(inboundId, prices));\n }),\n finShare()\n );\n\n this.selectedOffer$ = this.store$.pipe(currentOffer());\n\n this.selectedOfferPoints$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n this.selectedOffer$.pipe(startWith(undefined)),\n ]).pipe(\n map(([offers, outbound, outBoundFareFamilyCode, o]) => {\n return +(\n o?.totalPointsPrice ||\n offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundPointsPrice\n );\n }),\n distinctUntilChanged()\n );\n this.selectedOfferPrice$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$,\n this.selectedOffer$.pipe(startWith(undefined)),\n this.currencyCode$,\n ]).pipe(\n map(([offers, outbound, outBoundFareFamilyCode, o, currencyCode]) => {\n return {\n amount:\n o?.totalPrice ||\n offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundPrice,\n currencyCode,\n };\n }),\n distinctUntilChanged(),\n startWith(EMPTY_AMOUNT)\n );\n\n this.selectedOutboundOfferItinerary$ = combineLatest([\n this.filteredOffersOutbound$,\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$.pipe(filter(Boolean)),\n ]).pipe(\n distinctUntilChanged(\n (\n [offersPrev, outboundPrev, outBoundFareFamilyCodePrev],\n [offersNext, outboundNext, outBoundFareFamilyCodeNext]\n ) =>\n offersPrev?.hash === offersNext?.hash &&\n outboundPrev?.boundId === outboundNext?.boundId &&\n outBoundFareFamilyCodePrev === outBoundFareFamilyCodeNext\n ),\n map(([offers, outbound, outBoundFareFamilyCode]) => {\n const outboundFareInformation = offers.offers.find(\n (o) => o.outboundFareFamily === outBoundFareFamilyCode && o.outboundId === outbound?.boundId\n )?.outboundFareInformation;\n\n return itineraryWithDetails(outboundFareInformation, outbound?.itinerary, offers.locations);\n })\n );\n\n this.selectedInboundOfferItinerary$ = combineLatest([\n this.filteredOfferInbound$,\n this.selectedInbound$.pipe(filter(Boolean)),\n this.selectedOutbound$,\n this.selectedOutboundFareFamilyCode$.pipe(filter(Boolean)),\n ]).pipe(\n distinctUntilChanged(\n (\n [offersPrev, inboundPrev, outboundPrev, outBoundFareFamilyCodePrev],\n [offersNext, inboundNext, outboundNext, outBoundFareFamilyCodeNext]\n ) =>\n offersPrev?.hash === offersNext?.hash &&\n inboundPrev?.boundId === inboundNext?.boundId &&\n outboundPrev?.boundId === outboundNext?.boundId &&\n outBoundFareFamilyCodePrev === outBoundFareFamilyCodeNext\n ),\n map(([offers, inbound, outbound, outBoundFareFamilyCode]) => {\n const inboundFareInformation = offers.offers.find(\n (o) =>\n o.outboundFareFamily === outBoundFareFamilyCode &&\n o.outboundId === outbound?.boundId &&\n o.inboundId === inbound?.boundId\n )?.inboundFareInformation;\n\n return itineraryWithDetails(inboundFareInformation, inbound?.itinerary, offers.locations);\n })\n );\n\n this.locations$ = this.offers$.pipe(\n safeMap((o) => o.locations),\n finShare()\n );\n this.paxAmount$ = this.offers$.pipe(\n map(({ finnairSearchParameters: { adults = 0, c15s, children, infants } }: OfferList) => ({\n adults,\n c15s,\n children,\n infants,\n }))\n );\n\n this.availableCabinClasses$ = combineLatest([\n this.selectionPhase$.pipe(\n switchMap((phase) => {\n return phase === SelectionPhase.OUTBOUND ? this.outbounds$ : this.inbounds$;\n })\n ),\n this.offers$,\n ]).pipe(\n map(([bounds, offers]) => {\n return [\n Object.keys(bounds).map((bound) => {\n return boundWithDetails(offers, bounds[bound]);\n }),\n offers,\n ];\n }),\n map(([bounds, offers]: [BoundWithLocations[], OfferList]) => {\n return getCabinClassesForAwardBounds(bounds, offers.locations);\n })\n );\n\n // == SORTING ==\n this.selectedSortBy$ = this.store$.pipe(selectedTicketSortBy());\n type OffersAndSort = [OfferList, SortBy];\n this.outboundIdSortOrder$ = combineLatest([this.filteredOffersOutbound$, this.selectedSortBy$]).pipe(\n map(([offers, sortBy]: OffersAndSort): string[] => offers.sorting.outbounds[offerListSortMap[sortBy]])\n );\n this.inboundIdSortOrder$ = combineLatest([this.filteredOfferInbound$, this.selectedSortBy$]).pipe(\n map(([offers, sortBy]: OffersAndSort): string[] => offers.sorting.inbounds[offerListSortMap[sortBy]])\n );\n this.outboundSorting$ = this.filteredOfferInbound$.pipe(map((offers) => offers.sorting.outbounds));\n this.inboundSorting$ = this.filteredOfferInbound$.pipe(map((offers) => offers.sorting.inbounds));\n\n // == CONTINUE BUTTON ==\n this.subscription.add(\n this.continueButtonClicks$\n .pipe(withLatestFrom(this.isOneWayOffers$, this.selectionPhase$))\n .subscribe(([, oneWay, currentPhase]: [boolean, boolean, SelectionPhase]) => {\n if (currentPhase === SelectionPhase.OUTBOUND && !oneWay) {\n // Keep other filters, but reset time filters\n this.store$.dispatch(OffersActions.resetArrivalTime());\n this.store$.dispatch(OffersActions.resetDepartureTime());\n\n this.selectionPhase$.next(SelectionPhase.INBOUND);\n } else {\n this.confirmOffer();\n }\n })\n );\n this.continueEnabled$ = this.selectionPhase$.pipe(\n switchMap((phase: SelectionPhase): Observable => {\n if (phase === SelectionPhase.OUTBOUND) {\n return this.selectedOutbound$.pipe(startWith(undefined as FinnairBoundItem));\n }\n if (phase === SelectionPhase.INBOUND) {\n return this.selectedInbound$.pipe(startWith(undefined as FinnairBoundItem));\n }\n return this.selectedOfferPrice$.pipe(\n map(({ amount }) => amount),\n delay(1), // Prevent ExpressionChangedAfterItHasBeenCheckedError\n startWith(undefined as Amount)\n );\n }),\n map(isPresent),\n distinctUntilChanged()\n );\n this.continueButtonId$ = combineLatest([this.selectionPhase$, this.isOneWayOffers$]).pipe(\n map(([currentPhase, oneWay]: [SelectionPhase, boolean]) => {\n if (currentPhase === SelectionPhase.OUTBOUND && !oneWay) {\n return 'continue-to-inbound-selection';\n } else if ((currentPhase === SelectionPhase.OUTBOUND && oneWay) || currentPhase === SelectionPhase.INBOUND) {\n return 'continue-to-fare-selection';\n } else {\n return 'continue-to-pax-details';\n }\n }),\n distinctUntilChanged()\n );\n\n // Scroll to top and remove toaster messages on every phase change\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n filter(() => isPlatformBrowser(this.platform)),\n delay(1)\n )\n .subscribe(() => {\n this.scrollService.scrollTop();\n if (this.activeCabinClassNotificationIds.length) {\n this.activeCabinClassNotificationIds.forEach((id) => this.toasterService.removeMessage(id));\n this.activeCabinClassNotificationIds = [];\n }\n })\n );\n\n this.subscription.add(\n this.openBoundClick$\n .pipe(\n switchMap(({ bound, boundType }) =>\n this.store$.pipe(\n globalBookingPaxAmount(),\n switchMap((paxAmount: PaxAmount) =>\n this.store$.pipe(flightSelectionGtmDataForOffers(bound, boundType, paxAmount)).pipe(take(1))\n )\n )\n )\n )\n .subscribe((gtmFlightSelectionData) => {\n this.gtmService.flightSelection(GtmEvent.FLIGHT_SELECTION_VIEW, gtmFlightSelectionData);\n })\n );\n\n this.isMobile$ = this.mediaQueryService.isBreakpoint$('mobile');\n this.profile$ = this.store$.pipe(profile(), finShare());\n\n this.tripLocations$ = this.offersStatus$.pipe(\n withLatestFrom(this.store$.pipe(globalBookingFlights())),\n map(([_, locations]) =>\n locations.map(({ destination, origin }) => ({\n destination: destination.cityName,\n origin: origin.cityName,\n }))\n )\n );\n\n this.subscription.add(\n this.selectionPhase$\n .pipe(\n switchMap((phase) => {\n return (phase === SelectionPhase.OUTBOUND ? this.outbounds$ : this.inbounds$).pipe(\n distinctUntilChanged(compareAsJson),\n map((bounds) => [bounds, phase])\n );\n })\n )\n .subscribe(([bounds, phase]) => {\n this.gtmService.trackElement(\n `${phase === SelectionPhase.OUTBOUND ? 'outbound' : 'inbound'}-flights-shown-award`,\n GaContext.FLIGHT_SELECTION,\n ElementTypes.ACCORDION,\n Object.entries(bounds).length.toString(),\n ElementActions.VIEW\n );\n })\n );\n }\n\n ngOnInit(): void {\n this.subscription.add(\n merge(this.selectedOutboundOfferItinerary$, this.selectedInboundOfferItinerary$)\n .pipe(\n filter((itinerary) => !containsOnlyOneCabin(itinerary)),\n switchMap((itinerary) => {\n const businessFaultySegments =\n !containsOnlyOneCabin(itinerary, GlobalBookingTravelClass.BUSINESS) &&\n itinerary.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.BUSINESS);\n\n const ecoPremiumFaultySegments =\n !containsOnlyOneCabin(itinerary, GlobalBookingTravelClass.ECOPREMIUM) &&\n itinerary.filter(({ cabinClass }) => cabinClass !== GlobalBookingTravelClass.ECOPREMIUM);\n\n const faultySegments =\n isPresent(businessFaultySegments) && businessFaultySegments.length === 1\n ? businessFaultySegments\n : isPresent(ecoPremiumFaultySegments) && ecoPremiumFaultySegments.length === 1\n ? ecoPremiumFaultySegments\n : undefined;\n\n const params: LocationNames = {};\n if (faultySegments) {\n // find the origin and destination for the faulty segment.\n const [fs] = faultySegments;\n const [segment] = itinerary.filter((seg) => seg.id === fs.id);\n\n params.origin = segment.departure.cityName;\n params.destination = segment.arrival.cityName;\n }\n\n return combineLatest([\n this.selectedOutbound$,\n this.selectedInbound$,\n this.languageService.translate(\n businessFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassWarningNew'\n : ecoPremiumFaultySegments.length === 1\n ? 'ticketSelection.differentCabinClassPremiumEconomyWarningNew'\n : 'ticketSelection.differentCabinClassComplexWarning',\n params\n ),\n this.languageService.translate('ticketSelection.differentCabinClassWarningLink.linkText'),\n ]);\n }),\n distinctUntilChanged(\n (\n [selectedOutboundPrev, selectedInboundPrev, notificationTextPrev, linkTextPrev],\n [selectedOutboundNext, selectedInboundNext, notificationTextNext, linkTextNext]\n ) => {\n return (\n selectedOutboundPrev?.boundId === selectedOutboundNext?.boundId &&\n selectedInboundPrev?.boundId === selectedInboundNext?.boundId &&\n notificationTextPrev === notificationTextNext &&\n linkTextPrev === linkTextNext\n );\n }\n ),\n finShare()\n )\n .subscribe(([selectedOutbound, selectedInbound, notificationText, linkText]) => {\n const id = uuid();\n this.activeCabinClassNotificationIds.push(id);\n\n this.toasterService.addMessageToQueue({\n id,\n content: notificationText,\n theme: NotificationTheme.WARNING,\n target: {\n linkText: linkText,\n callback: () => {\n this.showDetailsModal(selectedOutbound, selectedInbound, this.selectionPhase$.getValue());\n this.activeCabinClassNotificationIds = this.activeCabinClassNotificationIds.filter(\n (storedId) => storedId !== id\n );\n },\n },\n keepMessageAfterNavigation: false,\n });\n })\n );\n\n this.subscription.add(\n this.selectionPhase$.pipe(distinctUntilChanged()).subscribe((selectionPhase) => {\n this.selectionPhaseChange.emit(selectionPhase);\n })\n );\n\n this.subscription.add(\n this.goToOutboundPhase$?.subscribe(() => {\n const selectionPhase = this.selectionPhase$.getValue();\n if (selectionPhase === SelectionPhase.INBOUND) {\n this.selectionPhase$.next(SelectionPhase.OUTBOUND);\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n unsubscribe(this.subscription);\n }\n\n backToDateSelection(): void {\n this.bookingService.setStep({ step: BOOKING_STEPS.ENTRY });\n }\n\n goToSelectionPhase(phase: SelectionPhase): void {\n if (this.selectionPhase$.getValue() === phase) {\n return;\n }\n this.selectionPhase$.next(phase);\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';\nimport { PseudoLocalActions } from '@fcom/core/actions';\nimport { GLOBAL_BOOKING_WIDGET_EXPANDER_KEY } from '@fcom/booking-widget/constants';\nimport { ExpanderStatus } from '@fcom/booking-widget/interfaces';\nimport { pseudoLocal } from '@fcom/core/selectors';\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$: BehaviorSubject = new BehaviorSubject(null);\n selectedBorderColor$: Observable;\n enableFareFamilyAutoScroll$: 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$.next(isPreSelected ? selectedFareFamily.id : null);\n })\n );\n\n const isGlobalBookingWidgetClosed$ = this.store$.pipe(\n pseudoLocal(GLOBAL_BOOKING_WIDGET_EXPANDER_KEY),\n map(\n (status) => status === undefined || status === `${GLOBAL_BOOKING_WIDGET_EXPANDER_KEY}-${ExpanderStatus.CLOSE}`\n ),\n distinctUntilChanged()\n );\n\n this.enableFareFamilyAutoScroll$ = combineLatest([\n isGlobalBookingWidgetClosed$,\n this.preSelectedFareFamilyId$,\n ]).pipe(\n map(\n ([isGlobalBookingWidgetClosed, preSelectedFareFamilyId]) =>\n isGlobalBookingWidgetClosed && Boolean(preSelectedFareFamilyId)\n ),\n distinctUntilChanged(),\n finShare()\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 if (this.preSelectedFareFamilyId$.getValue()) {\n this.store$.dispatch(\n PseudoLocalActions.setValue({\n key: GLOBAL_BOOKING_WIDGET_EXPANDER_KEY,\n data: `${GLOBAL_BOOKING_WIDGET_EXPANDER_KEY}-${ExpanderStatus.CLOSE}`,\n })\n );\n }\n }\n\n cabinAutoScrolled(): void {\n this.preSelectedFareFamilyId$.next(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 {{ '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, MultivariateTestId, TestVariant } 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';\nimport { MultivariateTestService } from '@fcom/common/multivariate-test/services/multivariate-test.service';\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 {\n filters,\n inbounds,\n lastRequestParams,\n nextFilteredInbounds,\n nextFilteredOutbounds,\n outbounds,\n} 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 isFlightSelectionFiltersTestVariant$: Observable;\n nextFilteredBounds$: Observable;\n unfilteredBounds$: Observable;\n hideFiltersAndSorter$: Observable;\n boundsHasDirectFlights$: Observable;\n allBoundsAreDirect$: Observable;\n amountOfDirectFlights$: 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 readonly MAX_RESULTS_AMOUNT_WITHOUT_FILTERS = 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 private multivariateTestService: MultivariateTestService\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.nextFilteredBounds$ = combineLatest([\n this.store$.pipe(nextFilteredOutbounds()),\n this.store$.pipe(nextFilteredInbounds()),\n ]).pipe(\n map(([filteredOutbounds, filteredInbounds]) =>\n this.boundType === BoundType.inbound ? filteredInbounds : filteredOutbounds\n )\n );\n\n this.unfilteredBounds$ = combineLatest([this.store$.pipe(outbounds()), this.store$.pipe(inbounds())]).pipe(\n map(([unfilteredOutbounds, unfilteredInbounds]) =>\n this.boundType === BoundType.inbound ? unfilteredInbounds : unfilteredOutbounds\n ),\n filter(Boolean)\n );\n\n this.isFlightSelectionFiltersTestVariant$ = this.multivariateTestService\n .getTestVariant(MultivariateTestId.FLIGHT_SELECTION_FILTERS)\n .pipe(\n map(({ variant }) => variant === TestVariant.B),\n finShare()\n );\n\n this.hideFiltersAndSorter$ = combineLatest([\n this.isFlightSelectionFiltersTestVariant$,\n this.unfilteredBounds$,\n ]).pipe(\n map(\n ([isTestVariant, bounds]) =>\n isTestVariant && bounds.boundGroups.length <= this.MAX_RESULTS_AMOUNT_WITHOUT_FILTERS\n )\n );\n\n this.boundsHasDirectFlights$ = this.unfilteredBounds$.pipe(\n map((bounds) => bounds.boundGroups.some((bound) => bound.details.stops === 0))\n );\n\n this.allBoundsAreDirect$ = this.unfilteredBounds$.pipe(\n map((bounds) => bounds.boundGroups.every((bound) => bound.details.stops === 0))\n );\n\n this.amountOfDirectFlights$ = this.unfilteredBounds$.pipe(\n map((bounds) => bounds.boundGroups.filter((bound) => bound.details.stops === 0).length)\n );\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 'maxStops':\n this.store$.dispatch(BoundsActions.setMaxStops({ maxStops: 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","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 { 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","/* 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"],"x_google_ignoreList":[4,27]}