{"version":3,"file":"desktop_common-a89763b10dae8d1e509d.client.js","mappings":"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","sources":["webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/iconMortgageFamily.url.svg?c6b4","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/iconMortgagePreferential.url.svg?4f1c","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconSuccess.url.svg?a61f","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/NoOffersBanner/NoOffersImg.url.svg?1bdc","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/mortgageBuyOrDieImg.url.svg?f8c2","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/bankLogos.url.svg?4bb9","webpack://@search/whitelabel-search-www/../graphql-gateway/server/typenames/SuggestItemTypeEnum.ts","webpack://@search/whitelabel-search-www/../graphql-gateway/typings/index.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperAppLandingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperLandingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperSearchRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingCardRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingConstructionRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingQuizRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchMapRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchMapTileRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/ClassifiedRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/RouterProvider.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/parkingsMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/livingTenantMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/sortOffersMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/windowsDirectionMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchSeoType.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchType.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/searchDefaults.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchSeoChpuMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/phoneCallRoute/PhoneCallRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/unsubscribeRoute/UnsubscribeRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/dedupeValues.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/authorTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/categoryTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/dealTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/newBuildingMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/renovationMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/roomMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/sellTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/bathroomMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/wallsMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/livingFacilityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/furnitureMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/bankPledgeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/layoutImageMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/buildEpochMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/finishingMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/newBuilding/mappers.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskMetroBranchMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskCityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskDistrictMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskMetroMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskRayonMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/regionMetroSlugMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/regionMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbCityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbDistrictMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbMetroMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/offerRoute/OfferRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/BuildEpochSeoMatcher.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/PriceSeoMatcher.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/dict/filters/regions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/GtmContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/boot/ssr/script/sentry-fixes.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/domainHelpers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/emails/useCallbackEmail.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/AddressStore.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/District.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/district.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/MetroRoute.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/route.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/MetroStation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/metroStaionRaw.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/geoBaseStoreFromGql.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/GeoBase.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/useGeoTips.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/dataLayerPush.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/useGoogleOptimize.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/useGtmOnVisible.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazy.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazySeo.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazySrcSet.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderActiveItem.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderCross.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/ImageSlider.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderItems.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/useIntersectionTrigger.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/analytics/NewBuildingAnalytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/CustomTypography/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/IconTransport/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/ImageBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/List/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/MediaKitFixedSizeBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/MetroRoute/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/SnippetPhone/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/desktop/FilterCollapser/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/desktop/NewBuildingBaseSnippet/snippetContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/developer-promo/analytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterDeserializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterFactory.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewBuildingFilterInitial.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterSerializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/converters.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/hooks/useCalltouchReplacement.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/libs/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/libs/root-regions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/analytics/ClassifiedAnalytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/analytics/ClassifiedOfferGtmContext.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/regionToBackoffice.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Container.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Link.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Switch.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Desktop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Mobile/YMapClickPane.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/SeoSearchUtm.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/enums/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/init-cookie-modal-hack.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/DefaultBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/GalleryBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/NewBuildingClassBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/IconPercent/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/PreferentialMortgageBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BadgeBox/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/MortgageOfferIcon.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/WorkingHours/WorkingHours.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/useCallbackRequest.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/sendCalltouchCallbackRequest.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CoreSvgSpriteIcon/CoreSvgSpriteIcon.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/CustomerFeedback/OpenButton/Blue/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/CustomerFeedback/OpenButton/BlueBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/OpenButton/Default/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/OpenButton/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/CustomerFeedbackMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/useSendCustomerFeedback.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/state.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/dict.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/CustomerFeedback/Modal/NewBuildings/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/successImage.url.svg?7d77","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/CustomerFeedback/Modal/NewBuildings/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/CustomerFeedbackAnketologModal/CustomerFeedbackAnketologModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useKey.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/useCustomerFeedbackExternalState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/components/SPBCenterDistricts/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/components/NewMoscowDistrict/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/BasicError.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoriteLimitModal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/SharePrintButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useQueryDisplayValues/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/metadata/ClassifiedFilterMetadata.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterFactory.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/services/codecs/FilterDeserializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/services/codecs/FilterSerializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/presetBounds.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/seoSearchFlatRoom.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/seoSearchLand.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersCount/SearchOffersCountQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersQuery/SearchOffersQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersQuery/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/page/SearchOffersMapQuery/SearchOffersMapQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/page/useOfferYMapPageState2.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/HiddenMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/useFavoritesButtonState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Footer/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/usePopper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/useDomOnClickOutside.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/SuggestPopup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/GeoSuggest.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/MetroMark.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Header/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/developer-promo/helpers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Html/HtmlHead/ldEventScript.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Image/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageEconomy/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageFields/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageFields/useBankMortgageForm.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageAppSourceContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgagePurposeEnum.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/contants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/declensions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/domain/MortgageField.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/minimalBanksMortgageUrl.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/field/Mortgage2Field.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconWrap.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/mortgage2ContactsFormSend.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/mortgage2ParamsFromClasified.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/starter/Mortgage2StarterModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/success/Mortgage2SuccessContent.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2BestOffer.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2Request.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useAppTypeById.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2User.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/consult/Mortgage2ConsultModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/MortgageOfferSkeleton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieResultCard.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieReason.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/calculateBuyOrDie.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/validate-helper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/mapRegionToSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieFormField.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieForm.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/MortgageBuyOrDieModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/MortgageBuyOrDieTrigger.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageCalculatorFields/MortgageCalculatorFields.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButtonPair.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButtonPop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/useArrowButton.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/CardScroller/CardScroller.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageOffersScroller/MortgageOffersScroller.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageDiscountConditions/MortgageDiscountConditions.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/NoOffersBanner/NoOffersBanner.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/useChangeDiscount.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/getLocalStorageLastValue.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/domain/MortgageFieldsBuilder.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/MortgageStupidModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/useStupidMortgage.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/useGovernmentMortgage.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/useMinimalBanksMortageState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/OfferRouteCard/IconBus.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/OfferRouteCard/IconPedestrian.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/getWindowSize.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/QRCodePhoneButton/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Slider/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SlimSelect/SlimMultiSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SlimSelect/SlimSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SubwayStation/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/WorkingHours/useWorkingHours.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/Desktop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/Provider.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/YMapPOI/dict/poi.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/YMapPOI/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/icons/IconClose.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/LoadingSpinner/LoadingSpinner.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Picture/Picture.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Arrow/Arrow.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/HeroPicture/HeroPicture.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconM2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Gallery/Gallery.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/FSGallery/FSGallery.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/ButtonTwoState.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/ShareButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/useShareLinks.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryMobile2/GalleryButtons/GalleryButtons.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryMobile2/GalleryMobile2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/useGetCurrentIndexImages.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useDebouncedCallback.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useIdle.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useInitialPhone.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useSwiper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useVHProperty.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/tools/makeOfferUrl.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/constants/keycode.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/MinimalBanksMortgageSnippetDesktop/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/NewsTinyCard/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/NewBuildingNews/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/NewBuildingPromoBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/NewBuildingPromoBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/selectors/get_new_building_link.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/NavButtons/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/GalleryPreview/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/ThumbnailSnippet/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/CheckboxGroup2/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/FilterSelect/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/NewRangeInput/RangeInput.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/NewNumberInputRange/NumberInputRange.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/Filter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/MobileFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/MobileFilter2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/apartments/DesktopApartmentFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/area/AreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/bathroom/BathroomFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/ceil_height/CeilHeightFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/common/MultiSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/common/RadioSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/area/DesktopAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/balcony/DesktopBalconyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/buildings/DesktopBuildingsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/commissioning/DesktopCommissioningFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/commissioning_list/DesktopCommissioningListFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/finishing/DesktopFinishingFlatTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/finishing_type/DesktopFinishingTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/floor/DesktopFloorFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/DesktopGeoFiltersView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/DesktopGeoFiltersView2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList/FilterTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList/FilterTagListItem.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList2/FilterTagList2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapEkb.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapKzn.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapMsk.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapNnv.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapNsk.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapSmr.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapSpb.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/transportLimit/MobileTransportLimitFilterView2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/GeoErrorBoundary/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/MetroSuggest/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/DistricsTab/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_accreditation/DesktopAccreditationFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_building_class/DesktopBuildingClassFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_closedSales/DesktopClosedSalesFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_new_building_deal/DesktopNewBuildingDealFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_payment_type/DesktopPaymentTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_position/DesktopPositionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_safety/DesktopSafetyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/parking/DesktopParkingFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/PriceInput/priceTypeMapping.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/PriceInput/PriceInput.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/contants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/price/DesktopPriceFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/region/DesktopRegionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/rooms/DesktopRoomsTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopFlatsSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopMiscSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopOtherSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/walls/DesktopWallsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/floor/FloorFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/floors_total/FloorsTotalFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/kitchen_area/KitchenAreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/living_area/LivingAreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/accreditation/MobileAccreditationFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/apartments/MobileApartmentsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/balcony/MobileBalconyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/bathroom/MobileBathroomFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/building_class/MobileBuildingClassFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/ceilHeight/MobileCeilHeightFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/closedSales/MobileClosedSalesFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/commissioning/MobileCommissioningFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/developer/MobileDeveloperSuggestModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/developer/MobileDeveloperFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/finishing_type/MobileFinishingTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/floor/MobileFloorFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/floors_total/MobileFloorsTotalFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroMark2/MetroMark2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroSelect/MetroSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroSelect/useMetroSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/SuggestModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/components/DistrictSelectItem/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/components/DistrictSelectGroup/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/DistrictSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/useDistrictSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/GeoTagItem.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/GeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/FullGeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/PreviewGeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MobileGeoFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/kitchenArea/MobileKitchenAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/livingArea/MobileLivingAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/new_building_deal/MobileNewBuildingDealFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/notOnlyM2Pro/MobileNotOnlyM2ProFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/parking/MobileParkingFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/payment_type/MobilePaymentTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/position/MobilePositionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/price/MobilePriceFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/region/MobileRegionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/room/MobileRoomFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/safety/MobileSafetyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileFlatsSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileMiscSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileOtherSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/totalArea/MobileTotalAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/transportLimit/MobileTransportLimitFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/walls/MobileWallsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/region/RenderRegionSelectUikitContent.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/new_filter/Filter2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/districtHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/priceHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/regionHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/models/Filter.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/models/FilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/ModalHeading/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/StickyPhoneWrapper/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/FiltersForm/FiltersFormTips/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/IconClose/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/FiltersForm/FiltersFormTips/FiltersFormTip/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/serializeToTips.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/OffersSearchTips/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/labels.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Breadcrumb/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Modal/Modal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Paper/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Button/Button.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Checkbox/CheckboxControl/CheckboxControl.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Checkbox/Checkbox.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/CheckboxGroup/CheckboxGroup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Highlight/Highlight.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Icon/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Input/InputControl/InputControl.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Input/Input.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getDimensions.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getPosition.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getViewportFactor.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/utils.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/enums/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Suggest/useSuggestionList.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Suggest/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/PopupTail/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/Popup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/InlinePopup/InlinePopup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Tooltip/Tooltip.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/lib/mergeRefs.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/size.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/tone.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/view.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/mode.ts"],"sourcesContent":["export default \"2efcca13fd43b67c9c99e97bfef38db9.svg\";","export default \"334d04dcd714b1fd42f83fb98df974bf.svg\";","export default \"4138435e3b6b41c80ea8074e38263380.svg\";","export default \"dc195dc74c4ba180d5070c3a7bf6e6f3.svg\";","export default \"87685346be520c1da76d3a204796603d.svg\";","export default \"6bc5d1786bc934a4ead38a0748906172.svg\";","\nexport enum SuggestItemTypeEnum {\n NewBuilding = 'SuggestItemNewBuilding',\n Metro = 'SuggestItemMetro',\n District = 'SuggestItemDistrict',\n Address = 'SuggestItemAddress',\n Developer = 'SuggestItemDeveloper',\n Default = 'SuggestItemDefault'\n}\n","/* eslint-disable comma-dangle */\nimport { IncomingMessage } from 'http';\nimport { MetadataValue } from '@grpc/grpc-js';\nimport Cookies from 'universal-cookie';\nimport type { RedisOptions } from 'ioredis';\nimport { Image } from '@vtblife/classified-model/dist-grpcjs/classified/common_pb';\nimport { QuarterEnum } from '@vtblife/classified-model/dist-grpcjs/util/common_pb';\nimport { HeaderConfig, MenuConfig } from '@vtblife/layout-config/dist/types';\nimport type { Purpose } from '@vtblife/mortgage-api/build-grpcjs/ru/vtblife/mortgage/v1/model/common_pb';\nimport type { MortgageProperty } from '@vtblife/mortgage-api/build-grpcjs/ru/vtblife/mortgage/v1/model/mortgage_property_pb';\nimport type { HivePluginOptions } from '@graphql-hive/client';\nimport { NewBuildingWhitelabelEnum } from '../server/enums/NewBuildingWhitelabelEnum';\nimport type { UserInfo } from '../server/lib/auth';\nimport { buildGqlContext } from '../server/gql-context';\nimport type { MortgageClientTimeouts } from '../api/MortgageClient';\nimport type {\n Mg2CalculationTimeouts,\n Mg2PreviewCalculationTimeouts,\n Mg2BorrowerTimeouts,\n Mg2RosterClientTimeouts,\n} from '../server/mortgage2/clients';\nimport type { MortgageCalculatorClientTimeouts } from '../api/MortgageCalculatorClient';\nimport type { PreferencesPersonalClientTimeouts } from '../api/PreferencesPersonalClient';\nimport type { PreferencesPersonalOpenClientTimeouts } from '../api/PreferencesPersonalOpenClient';\nimport type { PreferencesBusinessClientTimeouts } from '../api/PreferencesBusinessClient';\nimport type { OfferPlacementClientTimeouts } from '../server/offer-placement/OfferPlacementClient';\nimport type { ClickerTrackerClientTimeouts } from '../server/clicker-tracker/ClickerTrackerClient';\nimport type { ClickerStatsClientTimeouts } from '../server/clicker-stats/ClickerStatsClient';\nimport type { FeedsClientTimeouts } from '../src/domains/user-offer-stat/FeedsClient';\nimport type { BastilleExternalClientTimeouts } from '../api/BastilleExternalClient';\nimport type { MonetizationClientTimeouts } from '../api/MonetizationClient';\nimport type { BillingApiClientTimeouts } from '../api/BillingApiClient';\nimport type { VarlamovClientTimeouts } from '../api/VarlamovClient';\nimport type { ReglamentClientTimeouts } from '../server/sobor/ReglamentClient';\nimport type { FileClientTimeouts as ReglamentFileClientTimeouts } from '../server/sobor/FileClient';\nimport type { SearchClientTimeouts } from '../api/SearchClient';\nimport type { ExternalGeoClientTimeouts } from '../api/ExternalGeoClient';\nimport type { GeoSuggestClientTimeouts } from '../api/GeoSuggestClient';\nimport type { GeoSupportedRegionsClientTimeouts } from '../api/GeoSupportedRegionsClient';\nimport type { DeveloperSearchClientTimeouts } from '../api/DeveloperSearchClient';\nimport type { NewBuildingRootRegionsClientTimeouts } from '../api/NewBuildingRootRegionsClient';\nimport type { NewBuildingSearchClientTimeouts } from '../api/NewBuildingSearchClient';\nimport type { NewBuildingPreferencesClientTimeouts } from '../api/NewBuildingPreferencesClient';\nimport type { NewBuildingSuggestClientTimeouts } from '../api/NewBuildingSuggestClient';\nimport type { SuggestClientTimeouts } from '../api/SuggestClient';\nimport type { UserDetailsClientTimeouts } from '../api/UserDetailsClient';\nimport type { MailConfirmationClientTimeouts } from '../api/MailConfirmationClients';\nimport type { UserProfileClientTimeouts } from '../api/UserProfileClient';\nimport type { UserProfileV2ClientTimeouts } from '../api/UserProfileV2Client';\nimport type { PersonsSearchClientTimeouts } from '../api/PersonsSearchClient';\nimport type { CompanyApiClientTimeouts } from '../api/CompanyApiClient';\nimport type { EmailGatewayClientTimeouts } from '../api/EmailGatewayClient';\nimport type { RegistraturaClientTimeouts } from '../api/RegistraturaClient';\nimport type { OnboardingApiClientTimeouts } from '../api/OnboardingClient';\nimport type { SimilarsClientTimeouts } from '../api/SimilarsClient';\nimport type { SportlotoClientTimeouts } from '../api/SportlotoClient';\nimport type { CallbackClientTimeouts } from '../api/CallbackClient';\nimport type { ShawshankClientTimeouts } from '../api/ShawshankClient';\nimport type { HoosegowMortgageCommentClientTimeouts } from '../api/HoosegowMortgageCommentClient';\nimport type { ParoleClientTimeouts } from '../api/ParoleClient';\nimport type { OfficersClientTimeouts } from '../api/OfficersClient';\nimport type { PagesClientTimeouts } from '../api/PagesClient';\nimport type { RepairClientTimeouts } from '../api/RepairClient';\nimport type { DocumentStorageClientTimeouts } from '../api/DocumentStorageClient';\nimport type { MangoustClientTimeouts } from '../api/MangoustClient';\nimport type { SRGClientData } from '../api/SRGClient';\nimport { RouletteClientTimeouts } from '../api/RouletteClient';\nimport { Mg2DynamoTimeouts } from '../server/mortgage2/dynamo/client';\nimport { MortgageDictionaryClientTimeouts } from '../api/MortgageDictionaryClient';\nimport { Mg2IdxAdapterTimeouts } from '../server/mortgage2/idx/client';\nimport { Mg2DispatchTimeouts } from '../server/mortgage2/dispatch/client';\nimport { Mg2DispatchFileTimeouts } from '../server/mortgage2/dispatch/clientFiles';\nimport { Mg2DealerTimeouts } from '../server/mortgage2/dealer/client';\nimport { Mg2DocumentsLoaderTimeouts } from '../server/mortgage2/documentsLoader/client';\nimport { ReglamentClient } from 'graphql-gateway/server/sobor/ReglamentClient';\n\nexport * from '../server/typenames';\n\nexport enum View {\n mobile = 'mobile',\n desktop = 'desktop'\n}\n\nexport type MetadataOptions = Record<string, MetadataValue>;\n\nexport interface Request extends IncomingMessage {\n url: string;\n xTraceId: string;\n body: object;\n searchIndex: NewBuildingWhitelabelEnum;\n universalCookies: Cookies;\n user?: UserInfo;\n}\n\nexport type ConfigItem<T extends Record<string, number>> = {\n host: string;\n timeouts: T;\n}\n\nexport interface Config {\n env: string;\n isBranch?: boolean;\n M2_HOST: string;\n\n API_MORTGAGE: ConfigItem<MortgageClientTimeouts>;\n API_MORTGAGE_DICTIONARY: ConfigItem<MortgageDictionaryClientTimeouts>;\n API_MORTGAGE_HAGGLER: ConfigItem<Mg2CalculationTimeouts & Mg2PreviewCalculationTimeouts>;\n API_MORTGAGE_ROSTER: ConfigItem<Mg2RosterClientTimeouts>;\n API_MORTGAGE_BORROWER: ConfigItem<Mg2BorrowerTimeouts>;\n API_DYNAMO: ConfigItem<Mg2DynamoTimeouts>;\n API_RELAY: ConfigItem<Mg2DispatchTimeouts>;\n API_RELAY_FILES: ConfigItem<Mg2DispatchFileTimeouts>;\n API_DEALER: ConfigItem<Mg2DealerTimeouts>;\n IDX_ADAPTER: ConfigItem<Mg2IdxAdapterTimeouts>;\n API_MORTGAGE_CALCULATOR: ConfigItem<MortgageCalculatorClientTimeouts>;\n API_PREFERENCES_PERSONAL: ConfigItem<PreferencesPersonalClientTimeouts>;\n API_PREFERENCES_PERSONAL_OPEN: ConfigItem<PreferencesPersonalOpenClientTimeouts>;\n API_PREFERENCES_BUSINESS: ConfigItem<PreferencesBusinessClientTimeouts>;\n API_OFFER_PLACEMENT: ConfigItem<OfferPlacementClientTimeouts>;\n API_CLICKER_TRACKER: ConfigItem<ClickerTrackerClientTimeouts>;\n API_CLICKER_STATS: ConfigItem<ClickerStatsClientTimeouts>;\n API_FEEDS: ConfigItem<FeedsClientTimeouts>;\n API_BASTILLE_EXTERNAL: ConfigItem<BastilleExternalClientTimeouts>;\n API_MONETIZATION: ConfigItem<MonetizationClientTimeouts>;\n API_BILLING: ConfigItem<BillingApiClientTimeouts>;\n API_VARLAMOV: ConfigItem<VarlamovClientTimeouts>;\n API_REGLAMENT: ConfigItem<ReglamentClientTimeouts>;\n API_REGLAMENT_FILE: ConfigItem<ReglamentFileClientTimeouts>;\n GRPS_API: string;\n staticPath?: string;\n API_OFFER_SEARCH: ConfigItem<SearchClientTimeouts>;\n API_GEO_SEARCH: ConfigItem<ExternalGeoClientTimeouts | GeoSuggestClientTimeouts>;\n API_GEO_ROOT_REGIONS: ConfigItem<GeoSupportedRegionsClientTimeouts>;\n API_NEW_BUILDING_SEARCH: ConfigItem<\n DeveloperSearchClientTimeouts |\n NewBuildingRootRegionsClientTimeouts |\n NewBuildingSearchClientTimeouts |\n NewBuildingSuggestClientTimeouts\n >;\n API_NEW_BUILDING_WHITELABEL_SEARCH: ConfigItem<\n DeveloperSearchClientTimeouts |\n NewBuildingRootRegionsClientTimeouts |\n NewBuildingSearchClientTimeouts\n >;\n API_NEW_BUILDING_PREFERENCES: ConfigItem<NewBuildingPreferencesClientTimeouts>;\n API_SUGGEST: ConfigItem<SuggestClientTimeouts>;\n API_AUTH: ConfigItem<UserDetailsClientTimeouts>;\n API_PROFILE: ConfigItem<\n MailConfirmationClientTimeouts |\n UserProfileClientTimeouts |\n UserProfileV2ClientTimeouts\n >;\n API_PERSON: ConfigItem<PersonsSearchClientTimeouts>;\n API_COMPANY: ConfigItem<CompanyApiClientTimeouts>;\n API_REPAIR: string;\n API_EMAIL_GATEWAY: ConfigItem<EmailGatewayClientTimeouts>;\n NEW_BUILDING_CALLBACK_DEFAULT_EMAIL_SENDER: string;\n NEW_BUILDING_CALLBACK_MSK_EMAIL_SENDER: string;\n NEW_BUILDING_CALLBACK_SPB_EMAIL_SENDER: string;\n NEW_BUILDING_ONLINE_BOOKING_MSK_EMAIL_SENDER: string;\n NEW_BUILDING_ONLINE_BOOKING_SPB_EMAIL_SENDER: string;\n NEW_BUILDING_QUIZ_URL: string;\n NEW_BUILDING_DESCRIPTION_URL: string;\n NEW_BUILDING_SAMOLET_DEVELOPER_PROMO?: string;\n NEW_BUILDING_SAMOLET_PLUS_DEVELOPER_PROMO?: string;\n NEW_BUILDING_CDS_DEVELOPER_PROMO?: string;\n SALES_CALLBACK_EMAIL_RECIPIENT: string;\n CLASSIFIED_SEARCH_CALLBACK_EMAIL_SENDER: string;\n CLASSIFIED_SEARCH_PATH_SEO_FILES: string;\n MORTGAGE_CALLBACK_EMAIL_RECIPIENT: string;\n MORTGAGE_CALC_ANALYTICS_EMAIL_RECIPIENT: string;\n FEED_STATS_EMAIL_RECIPIENT: string;\n FEED_STATS_EMAIL_SENDER: string;\n API_REGISTRATURA: ConfigItem<RegistraturaClientTimeouts>;\n S3_HOST: string;\n API_ONBOARDING: ConfigItem<OnboardingApiClientTimeouts>;\n port?: number;\n MAP_TILE_URL: string;\n API_SLACK_HOOKS: string;\n API_MM_HOOKS: string;\n API_OFFERS_SIMILAR: ConfigItem<SimilarsClientTimeouts>;\n GRAPHQL_GATEWAY: string;\n API_MENU: string;\n API_SPORTLOTO: ConfigItem<SportlotoClientTimeouts>;\n API_NEWS: string;\n API_CALLBACK: ConfigItem<CallbackClientTimeouts>;\n tracingReporter?: {\n agentHost?: string;\n agentPort?: number;\n collectorEndpoint?: string;\n };\n redis?: RedisOptions;\n REMONT: {\n LANDING_IZHS_EMAIL_RECIPIENT: string[];\n LANDING_IZHS_EMAIL_FROM: string;\n };\n MORTGAGE: {\n LANDING_IT_EMAIL_RECIPIENT: string[];\n LANDING_IT_EMAIL_FROM: string;\n };\n API_CAPTCHA_VALIDATOR: string;\n\n API_HOOSEGOW_SHAWSHANK: ConfigItem<ShawshankClientTimeouts>;\n API_HOOSEGOW_PAROLE: ConfigItem<ParoleClientTimeouts>;\n API_BANK_SERVICE: string;\n API_HOOSEGOW_OFFICER: ConfigItem<OfficersClientTimeouts>;\n API_HOOSEGOW_MORTGAGE_COMMENT: ConfigItem<HoosegowMortgageCommentClientTimeouts>;\n API_PAGES: ConfigItem<PagesClientTimeouts>;\n RIELTORS_MSK_CALLBACK_EMAIL_RECIPIENTS: string[];\n RIELTORS_SPB_CALLBACK_EMAIL_RECIPIENTS: string[];\n API_REPAIR_CL: ConfigItem<RepairClientTimeouts>;\n API_DOCUMENT_STORAGE: ConfigItem<DocumentStorageClientTimeouts>;\n API_MANGOUST: ConfigItem<MangoustClientTimeouts>;\n hive: Partial<HivePluginOptions>;\n API_SRG: SRGClientData;\n API_ROULETTE: ConfigItem<RouletteClientTimeouts>;\n API_DOCUMENT_GENERATOR: ConfigItem<Mg2DocumentsLoaderTimeouts>;\n}\n\nexport type GraphqlContext = ReturnType<typeof buildGqlContext>;\n\nexport interface Breadcrumbs {\n items: BreadcrumbsItem[];\n rdfMeta: string;\n}\n\nexport interface BreadcrumbsItem {\n title: string;\n path: string;\n active?: boolean;\n}\n\nexport interface Menu extends MenuConfig{\n isAuth: boolean;\n}\nexport interface Header extends HeaderConfig{\n isAuth: boolean;\n}\nexport interface HeaderPersonalButton {\n url: string;\n professionalUrl?: string;\n authorizedUrl?: string;\n}\n\nexport interface RepairRequestResult {\n errorText: string;\n}\n\nexport type ArrayElement<A> = A extends readonly (infer T)[] ? T : never;\n\nexport type NewBuildingCardSeoText = {\n appInstance: string;\n site: string;\n siteFull: string;\n titleNominative: string;\n titleLocative: string;\n fullTypeNominative: string;\n typeGenitive: string;\n titleGenitive: string;\n address: string;\n priceMin: number | null;\n developerName: string | null;\n hasApartmentsOnly: boolean;\n seoTitle?: string;\n geo?: string;\n geoLocative?: string;\n metaTitle?: string;\n metaDescription?: string;\n name: string;\n}\n\nexport type NewBuildingOffersSeoText = {\n dealType: {\n verb: string;\n noun: string;\n };\n realtyObject: {\n singular: {\n accusative: string;\n };\n plural: {\n nominative: string;\n genitive: string;\n accusative: string;\n };\n };\n typeLocative: string;\n mainName: string;\n additionalName: string;\n regionLocative?: string;\n}\n\ninterface IElementSeoText {\n header: string;\n title: string;\n metaDescription: string;\n seoInfo: string;\n}\n\nexport interface SearchNewBuildingsSeoText {\n region: string;\n district: IElementSeoText | null;\n metro: IElementSeoText | null;\n buildingClass: IElementSeoText | null;\n commissioning: IElementSeoText | null;\n room: IElementSeoText | null;\n finishingType: IElementSeoText | null;\n appInstance: string;\n}\n\nexport interface IConstructionProgress {\n image: Image.AsObject;\n year: number;\n quarter: QuarterEnum.Quarter;\n address?: string;\n baseUrl?: string;\n}\n\nexport enum InspectionStatusEnum {\n Passed = 'PASSED',\n Failed = 'FAILED'\n}\n\nexport interface IInspectionStatus {\n isVerified?: boolean;\n value: InspectionStatusEnum;\n detailText: string;\n desktopLink?: string;\n mobileLink?: string;\n statusText?: string;\n}\n\nexport interface INewBuildingRouteParams {\n id: number;\n regionId: number;\n region: string;\n subRegion: string | null;\n subRegionDisplayName: string | null;\n type: string;\n name: string;\n}\n\nexport type ValueOf<T> = T[keyof T];\n\nexport interface INewBuildingMortgageParams {\n term: number;\n regionId: number;\n isMainRegion: boolean;\n propertyCost: number;\n ownAmount: number;\n purpose: ValueOf<typeof Purpose.PurposeValue>;\n claimType: ValueOf<typeof MortgageProperty.ClaimType>;\n}\n\nexport type NewBuildingOfferMortgageParamsType = Pick<\n INewBuildingMortgageParams, 'term' | 'propertyCost' | 'ownAmount' | 'purpose' | 'claimType'\n>\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport {\n developerAppLandingMapper,\n developerLandingMapper\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const DeveloperAppLandingType = s.rec({\n developerId: developerLandingMapper.Type,\n developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperAppLandingType = ReturnType<typeof DeveloperAppLandingType>\n\nexport const DeveloperAppLandingSeoType = s.rec({\n origin: s.nullOpt(s.str),\n developerNameSeo: developerAppLandingMapper.SeoType\n});\n\nexport type IDeveloperAppLandingSeoType = ReturnType<typeof DeveloperAppLandingSeoType>\n\nexport const developerAppLandingDefaults = {} as const;\n\nexport class DeveloperAppLandingRoute extends SusaninRoute<\n IDeveloperAppLandingSeoType,\n IDeveloperAppLandingType,\n IRouterContext,\n typeof developerAppLandingDefaults\n> {\n displayName = 'DeveloperAppLandingRoute';\n\n protected metadata = DeveloperAppLandingSeoType.config;\n\n protected pattern(p: Tokens<IDeveloperAppLandingSeoType>) {\n return `${this.patternHost()}/${p.developerNameSeo}/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n developerNameSeo: developerAppLandingMapper.keys\n };\n }\n\n defaults() {\n return developerAppLandingDefaults;\n }\n\n protected fromQuery() {\n const developerName = 'samolet';\n\n return DeveloperAppLandingType({\n developerId: developerLandingMapper.typeFromSeo(developerName),\n developerName\n });\n }\n\n protected toQuery() {\n return DeveloperAppLandingSeoType({\n developerNameSeo: developerAppLandingMapper.seoFromType('samolet')\n });\n }\n}\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport { developerLandingMapper } from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const DeveloperLandingType = s.rec({\n developerId: developerLandingMapper.Type,\n developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperLandingType = ReturnType<typeof DeveloperLandingType>\n\nexport const DeveloperLandingSeoType = s.rec({\n origin: s.nullOpt(s.str),\n developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperLandingSeoType = ReturnType<typeof DeveloperLandingSeoType>\n\nexport const developerLandingDefaults = {} as const;\n\nexport class DeveloperLandingRoute extends SusaninRoute<\n IDeveloperLandingSeoType,\n IDeveloperLandingType,\n IRouterContext,\n typeof developerLandingDefaults\n> {\n displayName = 'DeveloperLandingRoute';\n\n protected metadata = DeveloperLandingSeoType.config;\n\n protected pattern(p: Tokens<IDeveloperLandingSeoType>) {\n return `${this.patternHost()}/${p.developerName}/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n developerName: developerLandingMapper.keys\n };\n }\n\n defaults() {\n return developerLandingDefaults;\n }\n\n protected fromQuery({ developerName }: IDeveloperLandingSeoType) {\n return DeveloperLandingType({\n developerId: developerLandingMapper.typeFromSeo(developerName),\n developerName\n });\n }\n\n protected toQuery({ developerId }: IDeveloperLandingType) {\n return DeveloperLandingSeoType({\n developerName: developerLandingMapper.seoFromType(developerId)\n });\n }\n}\n","import { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const DeveloperType = s.rec({\n id: s.num,\n name: s.str,\n region: s.nullOpt(s.num),\n pageNumber: s.nullOpt(s.num)\n});\n\nexport type IDeveloperType = ReturnType<typeof DeveloperType>\n\nexport const DeveloperSeoType = s.rec({\n origin: s.nullOpt(s.str),\n id: s.str,\n name: s.str,\n region: s.nullOpt(s.str),\n pageNumber: s.nullOpt(s.str)\n});\n\nexport type IDeveloperSeoType = ReturnType<typeof DeveloperSeoType>\n\nexport const developerDefaults = {} as const;\n\nexport class DeveloperRoute extends NewBuildingRoute<\n IDeveloperSeoType,\n IDeveloperType,\n typeof developerDefaults\n> {\n displayName = 'DeveloperRoute';\n\n protected metadata = DeveloperSeoType.config;\n\n protected pattern(params: Tokens<IDeveloperSeoType>) {\n return `${this.patternHost()}(/${params.region})/novostroyki/zastroyshik-${params.name}-${params.id}/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n id: '\\\\d+'\n };\n }\n\n defaults() {\n return developerDefaults;\n }\n\n protected fromQuery(seoParams: IDeveloperSeoType) {\n seoParams = DeveloperSeoType(seoParams);\n\n const region = this.regionId(seoParams.region);\n\n return DeveloperType({\n region: region === this.defaultRegion().id ? undefined : region,\n id: Number(seoParams.id),\n name: seoParams.name,\n pageNumber: strToNum(seoParams.pageNumber)\n });\n }\n\n protected toQuery(params: IDeveloperType) {\n const parsedParams = DeveloperType(params);\n\n const result = this.regionParams(parsedParams.region);\n const region = result?.region;\n\n return DeveloperSeoType({\n ...result,\n region: region === this.defaultRegion().translit ? undefined : region,\n name: parsedParams.name,\n id: String(parsedParams.id),\n pageNumber: numToStr(parsedParams.pageNumber)\n });\n }\n}\n\nexport class WLDeveloperRoute extends DeveloperRoute {\n displayName = 'WLDeveloperRoute';\n\n protected pattern(params: Tokens<IDeveloperSeoType>) {\n return `${this.patternHost()}/zastroyshik-${params.name}-${params.id}/`;\n }\n\n protected fromQuery(seoParams: IDeveloperSeoType) {\n return {\n ...super.fromQuery(seoParams),\n region: strToNum(seoParams.region)\n };\n }\n\n protected toQuery(params: IDeveloperType) {\n return {\n ...super.toQuery(params),\n region: numToStr(params.region),\n origin: undefined\n };\n }\n}\n","import { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport type { Writeable } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const DeveloperSearchType = s.rec({\n region: s.nullOpt(s.num),\n pageNumber: s.nullOpt(s.num)\n});\n\nexport type IDeveloperSearchType = ReturnType<typeof DeveloperSearchType>\n\nexport const DeveloperSearchSeoType = s.rec({\n origin: s.nullOpt(s.str),\n region: s.nullOpt(s.str),\n pageNumber: s.nullOpt(s.str)\n});\n\nexport type IDeveloperSearchSeoType = ReturnType<typeof DeveloperSearchSeoType>\n\nexport const developerSearchDefaults = {} as const;\n\nexport class DeveloperSearchRoute extends NewBuildingRoute<\n IDeveloperSearchSeoType,\n IDeveloperSearchType,\n typeof developerSearchDefaults\n> {\n displayName = 'DeveloperSearchRoute';\n\n protected metadata = DeveloperSearchSeoType.config;\n\n protected pattern(params: Tokens<IDeveloperSearchSeoType>) {\n return `${this.patternHost()}(/${params.region})/novostroyki/zastroyshiki/`;\n }\n\n defaults() {\n return developerSearchDefaults;\n }\n\n protected fromQuery(seoParams: IDeveloperSearchSeoType) {\n seoParams = DeveloperSearchSeoType(seoParams);\n\n const region = this.regionId(seoParams.region);\n\n return DeveloperSearchType({\n region: region === this.defaultRegion().id ? undefined : region,\n pageNumber: strToNum(seoParams.pageNumber)\n });\n }\n\n protected toQuery(params: IDeveloperSearchType) {\n const parsedParams = DeveloperSearchType(params);\n\n const result = this.regionParams(parsedParams.region);\n const region = result?.region;\n\n return DeveloperSearchSeoType({\n ...result,\n region: region === this.defaultRegion().translit ? undefined : region,\n pageNumber: numToStr(parsedParams.pageNumber)\n });\n }\n}\n\nexport class WLDeveloperSearchRoute extends DeveloperSearchRoute {\n displayName = 'WLDeveloperSearchRoute';\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected pattern(params: Tokens<IDeveloperSearchSeoType>) {\n return '/zastroyshiki/';\n }\n\n protected fromQuery(seoParams: IDeveloperSearchSeoType) {\n const ret: Partial<Writeable<IDeveloperSearchType>> = super.fromQuery(seoParams);\n\n ret.region = strToNum(seoParams.region);\n\n return ret;\n }\n\n protected toQuery(params: IDeveloperSearchType) {\n const ret: Partial<Writeable<IDeveloperSearchSeoType>> = super.toQuery(params);\n\n ret.region = numToStr(params.region);\n delete ret.origin;\n\n return ret;\n }\n}\n","import {\n NewBuildingOffersSortEnum,\n} from '@search/graphql-typings';\nimport {\n newBuildingTypeMapper,\n roomMapper,\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\nimport { SusaninRoute } from '@search/router/src/susanin';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nconst NewBuildingCardCommonParams = {\n id: s.nullOpt(s.num),\n commissioningDate: s.maybeArray(s.str),\n\n finishingFlat: s.maybeArray(s.str),\n\n floorMin: s.nullOpt(s.num),\n floorMax: s.nullOpt(s.num),\n floorFirst: s.nullOpt(s.str),\n floorLast: s.nullOpt(s.str),\n\n bathroom: s.maybeArray(s.str),\n\n rooms: s.maybeArray(roomMapper.Type),\n\n priceMin: s.nullOpt(s.num),\n priceMax: s.nullOpt(s.num),\n priceType: s.nullOpt(s.str),\n\n totalAreaRangeMin: s.nullOpt(s.num),\n totalAreaRangeMax: s.nullOpt(s.num),\n livingAreaRangeMin: s.nullOpt(s.num),\n livingAreaRangeMax: s.nullOpt(s.num),\n kitchenAreaRangeMin: s.nullOpt(s.num),\n\n buildingId: s.maybeArray(s.num),\n\n pageNumber: s.nullOpt(s.num),\n pageSize: s.nullOpt(s.num),\n sort: s.nullOpt(s.str),\n\n from: s.nullOpt(s.str)\n};\n\nconst NewBuildingCardCommonType = s.rec(NewBuildingCardCommonParams);\n\ntype INewBuildingCardCommonType = ReturnType<typeof NewBuildingCardCommonType>\n\nconst NewBuildingCardCommonSeoParams = {\n origin: s.nullOpt(s.str),\n id: s.nullOpt(s.str),\n commissioningDate: s.maybeArray(s.str),\n\n finishingFlat: s.maybeArray(s.str),\n\n floorMin: s.nullOpt(s.str),\n floorMax: s.nullOpt(s.str),\n floorFirst: s.nullOpt(s.str),\n floorLast: s.nullOpt(s.str),\n\n bathroom: s.maybeArray(s.str),\n\n rooms: s.maybeArray(roomMapper.Type),\n\n priceMin: s.nullOpt(s.str),\n priceMax: s.nullOpt(s.str),\n priceType: s.nullOpt(s.str),\n\n totalAreaRangeMin: s.nullOpt(s.str),\n totalAreaRangeMax: s.nullOpt(s.str),\n livingAreaRangeMin: s.nullOpt(s.str),\n livingAreaRangeMax: s.nullOpt(s.str),\n kitchenAreaRangeMin: s.nullOpt(s.str),\n\n buildingId: s.maybeArray(s.str),\n\n pageNumber: s.nullOpt(s.str),\n pageSize: s.nullOpt(s.str),\n sort: s.nullOpt(s.str),\n\n from: s.nullOpt(s.str)\n};\n\nconst NewBuildingCardCommonSeoType = s.rec(NewBuildingCardCommonSeoParams);\n\ntype INewBuildingCardCommonSeoType = ReturnType<typeof NewBuildingCardCommonSeoType>\n\nconst newBuildingCardCommonDefaults = {\n pageSize: 20 as number,\n pageNumber: 1 as number,\n sort: NewBuildingOffersSortEnum.PriceAsc as string\n};\n\nconst fromCommonQuery = (\n seoParams: INewBuildingCardCommonSeoType,\n defaults: typeof newBuildingCardCommonDefaults\n) => ({\n commissioningDate: seoParams.commissioningDate,\n\n finishingFlat: seoParams.finishingFlat,\n\n floorMin: strToNum(seoParams.floorMin),\n floorMax: strToNum(seoParams.floorMax),\n floorFirst: seoParams.floorFirst,\n floorLast: seoParams.floorLast,\n\n bathroom: seoParams.bathroom,\n\n rooms: seoParams.rooms,\n\n priceMin: strToNum(seoParams.priceMin),\n priceMax: strToNum(seoParams.priceMax),\n priceType: seoParams.priceType,\n\n totalAreaRangeMin: strToNum(seoParams.totalAreaRangeMin),\n totalAreaRangeMax: strToNum(seoParams.totalAreaRangeMax),\n livingAreaRangeMin: strToNum(seoParams.livingAreaRangeMin),\n livingAreaRangeMax: strToNum(seoParams.livingAreaRangeMax),\n kitchenAreaRangeMin: strToNum(seoParams.kitchenAreaRangeMin),\n\n buildingId: seoParams.buildingId ? (\n Array.isArray(seoParams.buildingId) ? seoParams.buildingId : [ seoParams.buildingId ]\n ).map(strToNum) as number[] : undefined,\n\n pageNumber: strToNum(seoParams.pageNumber) || defaults.pageNumber,\n pageSize: strToNum(seoParams.pageSize) ?? defaults.pageSize,\n sort: seoParams.sort || defaults.sort,\n\n from: seoParams.from\n});\n\nconst toCommonQuery = (\n params: INewBuildingCardCommonType,\n defaults: typeof newBuildingCardCommonDefaults\n) => ({\n commissioningDate: params.commissioningDate,\n\n finishingFlat: params.finishingFlat,\n\n floorMin: numToStr(params.floorMin),\n floorMax: numToStr(params.floorMax),\n floorFirst: params.floorFirst,\n floorLast: params.floorLast,\n\n bathroom: params.bathroom,\n\n rooms: params.rooms,\n\n priceMin: numToStr(params.priceMin),\n priceMax: numToStr(params.priceMax),\n priceType: params.priceType,\n\n totalAreaRangeMin: numToStr(params.totalAreaRangeMin),\n totalAreaRangeMax: numToStr(params.totalAreaRangeMax),\n livingAreaRangeMin: numToStr(params.livingAreaRangeMin),\n livingAreaRangeMax: numToStr(params.livingAreaRangeMax),\n kitchenAreaRangeMin: numToStr(params.kitchenAreaRangeMin),\n\n buildingId: params.buildingId ? (\n Array.isArray(params.buildingId) ? params.buildingId : [ params.buildingId ]\n ).map(numToStr) as string[] : undefined,\n\n pageNumber: params.pageNumber && params.pageNumber !== defaults.pageNumber ?\n numToStr(params.pageNumber) :\n undefined,\n pageSize: params.pageSize && params.pageSize !== defaults.pageSize ?\n numToStr(params.pageSize) :\n undefined,\n sort: params.sort && params.sort !== defaults.sort ?\n params.sort :\n undefined,\n\n from: params.from\n});\n\nexport const NewBuildingCardType = s.rec({\n region: s.str,\n subRegion: s.nullOpt(s.str),\n type: s.opt(newBuildingTypeMapper.Type),\n name: s.str,\n\n ...NewBuildingCardCommonParams\n});\n\nexport type INewBuildingCardType = ReturnType<typeof NewBuildingCardType>\n\nexport const NewBuildingCardSeoType = s.rec({\n region: s.nullOpt(s.str),\n subRegion: s.nullOpt(s.str),\n type: s.opt(newBuildingTypeMapper.SeoType),\n name: s.str,\n\n ...NewBuildingCardCommonSeoParams\n});\n\nexport type INewBuildingCardSeoType = ReturnType<typeof NewBuildingCardSeoType>\n\nexport const newBuildingCardDefaults = {\n region: 'rossiya',\n\n ...newBuildingCardCommonDefaults\n} as const;\n\nexport class NewBuildingCardRoute extends NewBuildingRoute<\n INewBuildingCardSeoType,\n INewBuildingCardType,\n typeof newBuildingCardDefaults\n> {\n displayName = 'NewBuildingCardRoute';\n\n protected metadata = NewBuildingCardSeoType.config;\n\n protected pattern(params: Tokens<INewBuildingCardSeoType>) {\n return `${this.patternHost()}(/${\n params.region\n })/novostroyki(/${\n params.subRegion\n })/${\n params.type\n }-${\n params.name\n }-${\n params.id\n }/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n id: '\\\\d+',\n type: newBuildingTypeMapper.keys\n };\n }\n\n defaults() {\n return newBuildingCardDefaults;\n }\n\n regionSlugSimple(regionId: number) {\n return this.context.rootRegions?.getById(regionId)?.translit ??\n this.defaultRegion().translit;\n }\n\n protected fromQuery(seoParams: INewBuildingCardSeoType) {\n seoParams = NewBuildingCardSeoType(seoParams);\n\n return NewBuildingCardType({\n region: this.regionSlugSimple(this.regionId(seoParams.region)),\n subRegion: seoParams.subRegion,\n type: seoParams.type,\n name: seoParams.name,\n id: strToNum(seoParams.id),\n\n ...fromCommonQuery(seoParams, this.defaults())\n });\n }\n\n protected toQuery(params: INewBuildingCardType) {\n params = NewBuildingCardType(params);\n\n return NewBuildingCardSeoType({\n ...this.regionParams(this.regionId(params.region)),\n subRegion: params.subRegion,\n type: params.type as INewBuildingCardSeoType['type'],\n name: params.name,\n id: numToStr(params.id),\n\n ...toCommonQuery(params, this.defaults())\n });\n }\n}\n\nexport const WlNewBuildingCardType = s.rec({\n ...NewBuildingCardCommonParams\n});\n\nexport type IWlNewBuildingCardType = ReturnType<typeof WlNewBuildingCardType>\n\nexport const WLNewBuildingCardSeoType = s.rec({\n ...NewBuildingCardCommonSeoParams\n});\n\nexport type IWLNewBuildingCardSeoType = ReturnType<typeof WLNewBuildingCardSeoType>\n\nexport const wlNewBuildingCardDefaults = {\n ...newBuildingCardCommonDefaults\n} as const;\n\nexport class WLNewBuildingCardRoute extends SusaninRoute<\n IWLNewBuildingCardSeoType,\n IWlNewBuildingCardType,\n IRouterContext,\n typeof wlNewBuildingCardDefaults\n> {\n displayName = 'WLNewBuildingCardRoute';\n\n protected metadata = WLNewBuildingCardSeoType.config;\n\n protected pattern(params: Tokens<IWLNewBuildingCardSeoType>) {\n return `${this.patternHost()}/novostroyki/${params.id}/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n id: '\\\\d+'\n };\n }\n\n defaults() {\n return wlNewBuildingCardDefaults;\n }\n\n protected fromQuery(seoParams: IWLNewBuildingCardSeoType) {\n seoParams = WLNewBuildingCardSeoType(seoParams);\n\n return WlNewBuildingCardType({\n id: strToNum(seoParams.id),\n\n ...fromCommonQuery(seoParams, this.defaults())\n });\n }\n\n protected toQuery(params: IWlNewBuildingCardType) {\n params = WlNewBuildingCardType(params);\n\n return WLNewBuildingCardSeoType({\n id: numToStr(params.id),\n\n ...toCommonQuery(params, this.defaults()),\n\n origin: undefined\n });\n }\n}\n","import {\n newBuildingTypeMapper\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nconst NewBuildingConstructionCommonParams = {\n id: s.nullOpt(s.num)\n};\n\nconst NewBuildingConstructionCommonSeoParams = {\n origin: s.nullOpt(s.str),\n id: s.nullOpt(s.str)\n};\n\nconst newBuildingConstructionCommonDefaults = {};\n\nexport const NewBuildingConstructionType = s.rec({\n region: s.str,\n subRegion: s.nullOpt(s.str),\n type: s.opt(newBuildingTypeMapper.Type),\n name: s.str,\n\n ...NewBuildingConstructionCommonParams\n});\n\nexport type INewBuildingConstructionType = ReturnType<typeof NewBuildingConstructionType>\n\nexport const NewBuildingConstructionSeoType = s.rec({\n region: s.nullOpt(s.str),\n subRegion: s.nullOpt(s.str),\n type: s.opt(newBuildingTypeMapper.SeoType),\n name: s.str,\n\n ...NewBuildingConstructionCommonSeoParams\n});\n\nexport type INewBuildingConstructionSeoType = ReturnType<typeof NewBuildingConstructionSeoType>\n\nexport const newBuildingConstructionDefaults = {\n region: 'rossiya',\n\n ...newBuildingConstructionCommonDefaults\n} as const;\n\nexport class NewBuildingConstructionRoute extends NewBuildingRoute<\n INewBuildingConstructionSeoType,\n INewBuildingConstructionType,\n typeof newBuildingConstructionDefaults\n> {\n displayName = 'NewBuildingConstructionRoute';\n\n protected metadata = NewBuildingConstructionSeoType.config;\n\n protected pattern(params: Tokens<INewBuildingConstructionSeoType>) {\n return `${this.patternHost()}(/${\n params.region\n })/novostroyki(/${\n params.subRegion\n })/${\n params.type\n }-${\n params.name\n }-${\n params.id\n }/hod-stroitelstva/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n id: '\\\\d+',\n type: newBuildingTypeMapper.keys\n };\n }\n\n defaults() {\n return newBuildingConstructionDefaults;\n }\n\n regionSlugSimple(regionId: number) {\n return this.context.rootRegions?.getById(regionId)?.translit ??\n this.defaultRegion().translit;\n }\n\n protected fromQuery(seoParams: INewBuildingConstructionSeoType) {\n seoParams = NewBuildingConstructionSeoType(seoParams);\n\n return NewBuildingConstructionType({\n region: this.regionSlugSimple(this.regionId(seoParams.region)),\n subRegion: seoParams.subRegion,\n type: seoParams.type,\n name: seoParams.name,\n id: strToNum(seoParams.id)\n });\n }\n\n protected toQuery(params: INewBuildingConstructionType) {\n params = NewBuildingConstructionType(params);\n\n return NewBuildingConstructionSeoType({\n ...this.regionParams(this.regionId(params.region)),\n subRegion: params.subRegion,\n type: params.type as INewBuildingConstructionSeoType['type'],\n name: params.name,\n id: numToStr(params.id)\n });\n }\n}\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport type { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const NewBuildingQuizType = s.rec({\n id: s.nullOpt(s.str)\n});\n\nexport type INewBuildingQuizType = ReturnType<typeof NewBuildingQuizType>\n\nexport const NewBuildingQuizSeoType = s.rec({\n origin: s.nullOpt(s.str),\n id: s.nullOpt(s.str)\n});\n\nexport type INewBuildingQuizSeoType = ReturnType<typeof NewBuildingQuizSeoType>\n\nexport class NewBuildingQuizRoute extends SusaninRoute<\n INewBuildingQuizSeoType,\n INewBuildingQuizType,\n IRouterContext\n> {\n displayName = 'NewBuildingQuizRoute';\n\n protected metadata = NewBuildingQuizSeoType.config;\n\n protected pattern(p: Tokens<INewBuildingQuizSeoType>) {\n return `${this.patternHost()}/novostroyki/quiz(/${p.id})/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n id: '[\\\\w]+[-\\\\w]*'\n };\n }\n\n defaults() {\n return {};\n }\n\n protected fromQuery(seoParams: INewBuildingQuizSeoType) {\n return NewBuildingQuizType({\n id: seoParams.id\n });\n }\n\n protected toQuery(params: INewBuildingQuizType) {\n return NewBuildingQuizSeoType({\n id: params.id\n });\n }\n}\n","import { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { ROSSIYA } from '@search/filter-enums/enums/Region';\n\nimport { INewBuildingRouterContext } from '../types';\n\nexport abstract class NewBuildingRoute<External, Internal, Defaults = unknown> extends SusaninRoute<\n External, Internal, INewBuildingRouterContext, Defaults\n> {\n protected patternHost(): string {\n return '(<origin>)';\n }\n\n protected conditions() {\n return {\n origin: 'https?://[^\\/]+'\n };\n }\n\n protected defaultRegion() {\n return {\n id: ROSSIYA,\n translit: 'rossiya'\n };\n }\n\n protected regionSlugHost(regionId: number) {\n let result = super.regionSlugHost(regionId);\n\n if (result) return result;\n\n const parentId = this.context.rootRegions?.getById(regionId)?.narrowRegion?.id;\n\n if (parentId) result = super.regionSlugHost(parentId);\n\n return result;\n }\n\n regionId(regionSlug?: string | null) {\n let regionId = regionSlug ? this.context.rootRegions?.getByTranslitName(regionSlug)?.id : undefined;\n\n if (! regionId) regionId = this.hostParts()?.regionId;\n\n return regionId ?? this.defaultRegion().id;\n }\n\n regionSlugPath(regionId: number) {\n return this.context.rootRegions?.getById(regionId)?.translit ??\n this.defaultRegion().translit;\n }\n\n countrySlugPath(regionId: number) {\n return this.context.rootRegions?.getSlugFromGeo?.(regionId);\n }\n\n countrySlugId(slug: string, regionId: number) {\n return this.context.rootRegions?.getGeoFromSlug?.(slug, regionId);\n }\n}\n","import { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport {\n NewBuildingSearchRoute,\n INewBuildingSearchSeoType,\n WLNewBuildingSearchRoute\n} from './NewBuildingSearchRoute';\n\nexport class NewBuildingSearchMapRoute extends NewBuildingSearchRoute {\n displayName = 'NewBuildingSearchMapRoute';\n\n protected pattern(p: Tokens<INewBuildingSearchSeoType>) {\n return `${this.patternHost()}(/${\n p.region\n })/novostroyki/karta(/srok-${\n p.commissioningSeo\n })(/${\n p.roomSeo\n })(/${\n p.euroPlanningSeo\n })(/${\n p.hasFinishingSeo\n })(/otdelka-${\n p.finishingTypeSeo\n })(/klass-${\n p.buildingClassSeo\n })(/${\n p.wallsTypeSeo\n })(/${\n p.floorLastSeo\n })(/${\n p.ceilingHeightSeo\n })(/${\n p.kitchenAreaRangeMinSeo\n })(/${\n p.law214Seo\n })(/${\n p.escrowSeo\n })(/${\n p.armyMortgageSeo\n })(/${\n p.motherCapitalSeo\n })(/${\n p.installmentSeo\n })(/${\n p.closedAreaSeo\n })(/${\n p.conciergeSeo\n })(/${\n p.balconySeo\n })(/${\n p.apartmentsSeo\n })(/${\n p.parkingSeo\n })(/${\n p.flatsSpecialEventsSeo\n })(/${\n p.priceMaxSeo\n })(/${\n p.pricePerMeterMaxSeo\n })(/${\n p.cheapSeo\n })(/${\n p.closeToMetroSeo\n })(/metro-${\n p.metroSeo\n })(/rayon-${\n p.rayon\n })(/${\n p.okrug\n }-okrug)(/${\n p.geoSlugSeo\n })(/${\n p.city\n })/`;\n }\n}\n\nexport class WLNewBuildingSearchMapRoute extends WLNewBuildingSearchRoute {\n displayName = 'WLNewBuildingSearchMapRoute';\n\n protected pattern() {\n return `${this.patternHost()}/karta/`;\n }\n}\n","import { s } from '@search/router/src/schema';\nimport {\n INewBuildingSearchType,\n NewBuildingSearchParams,\n NewBuildingSearchSeoParams,\n WLNewBuildingSearchRoute\n} from './NewBuildingSearchRoute';\n\nexport const NewBuildingSearchMapTileType = s.rec({\n ...NewBuildingSearchParams,\n\n excludeLong: s.opt(s.num),\n excludeLat: s.opt(s.num)\n});\n\nexport type INewBuildingSearchMapTileType = ReturnType<typeof NewBuildingSearchMapTileType>\n\nexport const NewBuildingSearchMapTileSeoType = s.rec({\n ...NewBuildingSearchSeoParams,\n\n excludeLong: s.opt(s.str),\n excludeLat: s.opt(s.str)\n});\n\nexport type INewBuildingSearchMapTileSeoType = ReturnType<typeof NewBuildingSearchMapTileSeoType>\n\nexport class NewBuildingSearchMapTileRoute extends WLNewBuildingSearchRoute {\n displayName = 'NewBuildingSearchMapTileRoute';\n\n protected pattern() {\n return `${this.patternHost()}/search/nb/tile/`;\n }\n\n protected fromQuery(seo: INewBuildingSearchMapTileSeoType) {\n return {\n ...super.fromQuery(seo),\n excludeLat: seo.excludeLat && parseFloat(seo.excludeLat) || undefined,\n excludeLong: seo.excludeLong && parseFloat(seo.excludeLong) || undefined\n };\n }\n\n protected toQuery(p: INewBuildingSearchMapTileType) {\n return {\n ...super.toQuery(p as unknown as INewBuildingSearchType),\n excludeLat: p.excludeLat && String(p.excludeLat) || undefined,\n excludeLong: p.excludeLong && String(p.excludeLong) || undefined\n };\n }\n}\n","import { AreaUnitEnum, CommissioningEnum, FinishingEnum, NewBuildingSortEnum } from '@search/graphql-typings';\nimport { FinishingTypeEnum } from '@search/filter-enums/gql/schema-types-fix';\nimport { RegionIdEnum, ROSSIYA } from '@search/filter-enums/enums/Region';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\nimport { mskCityMapper } from '@search/offer-search-routes/src/mappers/regions/msk/mskCityMapper';\nimport { spbCityMapper } from '@search/offer-search-routes/src/mappers/regions/spb/spbCityMapper';\nimport { mskRayonMapper } from '@search/offer-search-routes/src/mappers/regions/msk/mskRayonMapper';\nimport {\n getCityMapperByRegion,\n getDistrictMapperByRegion,\n getMetroMapperByRegion\n} from '@search/offer-search-routes/src/mappers/regions';\nimport {\n apartmentsMapper,\n armyMortgageMapper,\n balconyMapper,\n buildingClassMapper,\n ceilingHeightMapper,\n cheapMapper,\n closedAreaMapper,\n closeToMetroMapper,\n commissioningMapper,\n conciergeMapper,\n escrowMapper,\n euroPlanningMapper,\n finishingMapper,\n finishingTypeMapper,\n flatsSpecialEventMapper,\n floorLastMapper,\n installmentMapper,\n kitchenAreaRangeMinMapper,\n law214Mapper,\n motherCapitalMapper,\n newBuildingTypes,\n parkingMapper,\n priceMaxMapper,\n pricePerMeterMaxMapper,\n quarterMapper,\n roomMapper,\n sOtdelkoySeoValue,\n wallsTypeMapper,\n YES\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { YMapVector, yMapVectorPack, yMapVectorUnpack } from '@search/common-core/ymap/Vector';\nimport {\n CeilingHeightString,\n FlatsSpecialEventString,\n IsApartmentsOptionsString,\n ParkingTypeString\n} from '@search/filter-enums/enums';\n\nimport type { Writeable } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const NewBuildingSearchParams = {\n region: s.num,\n\n commissioning: s.nullOpt(s.str),\n\n rooms: s.maybeArray(roomMapper.Type),\n\n addressId: s.maybeArray(s.num),\n metroId: s.maybeArray(s.num),\n districtId: s.maybeArray(s.num),\n newBuildingId: s.maybeArray(s.num),\n developerId: s.nullOpt(s.num),\n\n transportType: s.nullOpt(s.str),\n maxMinutes: s.nullOpt(s.str),\n\n wallsType: s.maybeArray(wallsTypeMapper.Type),\n parking: s.maybeArray(parkingMapper.Type),\n\n floorsTotalMin: s.nullOpt(s.num),\n floorsTotalMax: s.nullOpt(s.num),\n\n priceMin: s.nullOpt(s.num),\n priceMax: s.nullOpt(s.num),\n priceType: s.nullOpt(s.str),\n\n totalAreaRangeMin: s.nullOpt(s.num),\n totalAreaRangeMax: s.nullOpt(s.num),\n\n livingAreaRangeMin: s.nullOpt(s.num),\n livingAreaRangeMax: s.nullOpt(s.num),\n\n kitchenAreaRangeMin: s.nullOpt(s.num),\n\n floorMin: s.nullOpt(s.num),\n floorMax: s.nullOpt(s.num),\n floorFirst: s.nullOpt(s.str),\n floorLast: s.nullOpt(floorLastMapper.Type),\n\n ceilingHeight: s.nullOpt(s.str),\n\n bathroom: s.maybeArray(s.str),\n balcony: s.nullOpt(s.boolExt),\n\n buildingClass: s.maybeArray(buildingClassMapper.Type),\n\n hasFinishing: s.nullOpt(finishingMapper.Type),\n finishingType: s.nullOpt(s.list(finishingTypeMapper.Type)),\n\n standalone: s.nullOpt(s.boolExt),\n apartments: s.nullOpt(apartmentsMapper.Type),\n\n concierge: s.nullOpt(s.boolExt),\n closedArea: s.nullOpt(s.boolExt),\n guardedArea: s.nullOpt(s.boolExt),\n\n accreditedByVTB: s.nullOpt(s.boolExt),\n\n law214: s.nullOpt(s.boolExt),\n escrow: s.nullOpt(s.boolExt),\n\n armyMortgage: s.nullOpt(s.boolExt),\n installment: s.nullOpt(s.boolExt),\n motherCapital: s.nullOpt(s.boolExt),\n\n closedSales: s.nullOpt(s.bool),\n\n pageNumber: s.nullOpt(s.num),\n pageSize: s.nullOpt(s.num),\n sort: s.nullOpt(s.str),\n\n selectedNewBuildingId: s.nullOpt(s.num),\n\n flatsSpecialEvents: s.maybeArray(s.str),\n otherSpecialEvents: s.maybeArray(s.str),\n miscSpecialEvents: s.maybeArray(s.str),\n\n notOnlyM2Pro: s.nullOpt(s.bool),\n\n geoSlug: s.opt(s.str),\n\n mapBounds: s.opt(s.rec({\n bounds: s.opt(s.rec({\n min: s.rec({\n x: s.num,\n y: s.num\n }),\n max: s.rec({\n x: s.num,\n y: s.num\n })\n })),\n\n polygon: s.opt(s.list(s.rec({\n x: s.num,\n y: s.num\n })))\n })),\n\n x: s.nullOpt(s.num),\n y: s.nullOpt(s.num),\n z: s.nullOpt(s.num),\n\n showHighlighted: s.nullOpt(s.bool)\n};\n\nexport const NewBuildingSearchType = s.rec(NewBuildingSearchParams);\n\nexport type INewBuildingSearchType = ReturnType<typeof NewBuildingSearchType>\n\nexport const NewBuildingSearchSeoParams = {\n origin: s.nullOpt(s.str),\n region: s.nullOpt(s.str),\n\n geoSlugSeo: s.opt(s.str),\n\n metroSeo: s.nullOpt(s.str),\n rayon: s.nullOpt(s.str),\n okrug: s.nullOpt(s.str),\n city: s.nullOpt(s.str),\n\n commissioningSeo: s.nullOpt(s.str),\n commissioning: s.nullOpt(s.str),\n\n roomSeo: s.nullOpt(roomMapper.SeoType),\n rooms: s.maybeArray(roomMapper.Type),\n euroPlanningSeo: s.nullOpt(euroPlanningMapper.SeoType),\n\n addressId: s.maybeArray(s.str),\n metroId: s.maybeArray(s.str),\n districtId: s.maybeArray(s.str),\n newBuildingId: s.maybeArray(s.str),\n developerId: s.nullOpt(s.str),\n\n transportType: s.nullOpt(s.str),\n maxMinutes: s.nullOpt(s.str),\n closeToMetroSeo: s.nullOpt(closeToMetroMapper.SeoType),\n\n wallsTypeSeo: s.nullOpt(wallsTypeMapper.SeoType),\n wallsType: s.maybeArray(wallsTypeMapper.Type),\n\n parking: s.maybeArray(parkingMapper.Type),\n parkingSeo: s.nullOpt(parkingMapper.SeoType),\n\n floorsTotalMin: s.nullOpt(s.str),\n floorsTotalMax: s.nullOpt(s.str),\n\n priceMin: s.nullOpt(s.str),\n priceMax: s.nullOpt(s.str),\n priceMaxSeo: s.nullOpt(priceMaxMapper.SeoType),\n cheapSeo: s.nullOpt(cheapMapper.SeoType),\n priceType: s.nullOpt(s.str),\n priceTypeSeo: s.nullOpt(s.str),\n pricePerMeterMaxSeo: s.nullOpt(pricePerMeterMaxMapper.SeoType),\n\n totalAreaRangeMin: s.nullOpt(s.str),\n totalAreaRangeMax: s.nullOpt(s.str),\n\n livingAreaRangeMin: s.nullOpt(s.str),\n livingAreaRangeMax: s.nullOpt(s.str),\n\n kitchenAreaRangeMin: s.nullOpt(s.str),\n kitchenAreaRangeMinSeo: s.nullOpt(kitchenAreaRangeMinMapper.SeoType),\n\n floorMin: s.nullOpt(s.str),\n floorMax: s.nullOpt(s.str),\n floorFirst: s.nullOpt(s.str),\n\n floorLastSeo: s.nullOpt(floorLastMapper.SeoType),\n floorLast: s.nullOpt(floorLastMapper.Type),\n\n ceilingHeight: s.nullOpt(s.str),\n ceilingHeightSeo: s.nullOpt(ceilingHeightMapper.SeoType),\n\n bathroom: s.maybeArray(s.str),\n\n balcony: s.nullOpt(balconyMapper.Type),\n balconySeo: s.nullOpt(balconyMapper.SeoType),\n\n buildingClassSeo: s.nullOpt(buildingClassMapper.SeoType),\n buildingClass: s.maybeArray(buildingClassMapper.Type),\n\n hasFinishingSeo: s.nullOpt(finishingMapper.SeoType),\n hasFinishing: s.nullOpt(finishingMapper.SeoType),\n\n finishingTypeSeo: s.nullOpt(finishingTypeMapper.SeoType),\n finishingType: s.maybeArray(finishingTypeMapper.Type),\n\n standalone: s.maybeArray(s.str),\n\n apartments: s.nullOpt(apartmentsMapper.Type),\n apartmentsSeo: s.nullOpt(apartmentsMapper.SeoType),\n\n concierge: s.nullOpt(conciergeMapper.Type),\n conciergeSeo: s.nullOpt(conciergeMapper.SeoType),\n\n closedArea: s.nullOpt(closedAreaMapper.Type),\n closedAreaSeo: s.nullOpt(closedAreaMapper.SeoType),\n\n guardedArea: s.nullOpt(s.str),\n\n accreditedByVTB: s.nullOpt(s.str),\n\n law214Seo: s.nullOpt(law214Mapper.SeoType),\n law214: s.nullOpt(law214Mapper.Type),\n\n escrowSeo: s.nullOpt(escrowMapper.SeoType),\n escrow: s.nullOpt(escrowMapper.Type),\n\n armyMortgageSeo: s.nullOpt(armyMortgageMapper.SeoType),\n armyMortgage: s.nullOpt(armyMortgageMapper.Type),\n\n installmentSeo: s.nullOpt(installmentMapper.SeoType),\n installment: s.nullOpt(installmentMapper.Type),\n\n motherCapital: s.nullOpt(motherCapitalMapper.Type),\n motherCapitalSeo: s.nullOpt(motherCapitalMapper.SeoType),\n\n closedSales: s.nullOpt(s.str),\n\n pageNumber: s.nullOpt(s.str),\n pageSize: s.nullOpt(s.str),\n sort: s.nullOpt(s.str),\n\n selectedNewBuildingId: s.nullOpt(s.str),\n\n flatsSpecialEvents: s.maybeArray(s.str),\n flatsSpecialEventsSeo: s.nullOpt(flatsSpecialEventMapper.SeoType),\n\n otherSpecialEvents: s.maybeArray(s.str),\n miscSpecialEvents: s.maybeArray(s.str),\n\n notOnlyM2Pro: s.nullOpt(s.str),\n\n lx: s.opt(s.str),\n ly: s.opt(s.str),\n rx: s.opt(s.str),\n ry: s.opt(s.str),\n\n pol: s.opt(s.str),\n\n x: s.nullOpt(s.str),\n y: s.nullOpt(s.str),\n z: s.nullOpt(s.str),\n\n showHighlighted: s.nullOpt(s.str)\n};\n\nexport const NewBuildingSearchSeoType = s.rec(NewBuildingSearchSeoParams);\n\nexport type INewBuildingSearchSeoType = ReturnType<typeof NewBuildingSearchSeoType>\n\nconst fillGeoSeo = (\n result: Partial<Writeable<INewBuildingSearchSeoType>>,\n region: number,\n geoIds: number | number[],\n name: 'districtId' | 'addressId',\n isCloseToMetro: boolean\n) => {\n if (\n ! isCloseToMetro &&\n ! (result.metroSeo || result.city || result.rayon || result.okrug) &&\n Array.isArray(geoIds) && geoIds.length === 1\n ) {\n const geoId = geoIds[0];\n\n const cityMapper = getCityMapperByRegion(region);\n\n result.city = cityMapper?.seoFromTypeOptional(geoId);\n\n if (! result.city) {\n const districtMapper = getDistrictMapperByRegion(region);\n\n const rayon = mskRayonMapper.seoFromTypeOptional(geoId);\n const rayonOrOkrug = districtMapper?.seoFromTypeOptional(geoId);\n\n if (rayon || districtMapper?.name === 'spbDistrictMapper') {\n result.rayon = rayon || rayonOrOkrug;\n }\n\n if (districtMapper?.name === 'mskDistrictMapper') {\n result.okrug = rayonOrOkrug;\n }\n }\n\n result[name] = result.city || result.rayon || result.okrug ?\n undefined :\n [ numToStr(geoId) as string ];\n } else {\n result[name] = (\n Array.isArray(geoIds) ? geoIds : [ geoIds ]\n ).map(numToStr) as string[];\n }\n};\n\nfunction addGeo<T>(geoArray: T | readonly T[] | undefined | null, geoId?: T) {\n if (! geoId) {\n return geoArray;\n }\n\n if (! geoArray) {\n return geoId;\n }\n\n return Array.isArray(geoArray) ? [ ...geoArray, geoId ] : [ geoArray, geoId ];\n}\n\nfunction getGeoNumber(geo: number | readonly number[] | null | undefined) {\n if (Array.isArray(geo)) {\n return geo.length;\n }\n\n return geo ? 1 : 0;\n}\n\nexport const searchDefaults = {\n rooms: [],\n addressId: [],\n metroId: [],\n districtId: [],\n pageSize: 10 as number,\n pageNumber: 1 as number,\n sort: NewBuildingSortEnum.RelevanceDesc as string\n} as const;\n\nexport class NewBuildingSearchRoute extends NewBuildingRoute<\n INewBuildingSearchSeoType,\n INewBuildingSearchType,\n typeof searchDefaults\n> {\n displayName = 'NewBuildingSearchRoute';\n\n protected metadata = NewBuildingSearchSeoType.config;\n\n protected pattern(p: Tokens<INewBuildingSearchSeoType>) {\n return `${\n this.patternHost()\n }(/${\n p.region\n })/novostroyki(/srok-${\n p.commissioningSeo\n })(/${\n p.roomSeo\n })(/${\n p.euroPlanningSeo\n })(/${\n p.hasFinishingSeo\n })(/otdelka-${\n p.finishingTypeSeo\n })(/klass-${\n p.buildingClassSeo\n })(/${\n p.wallsTypeSeo\n })(/${\n p.floorLastSeo\n })(/${\n p.ceilingHeightSeo\n })(/${\n p.kitchenAreaRangeMinSeo\n })(/${\n p.law214Seo\n })(/${\n p.escrowSeo\n })(/${\n p.armyMortgageSeo\n })(/${\n p.motherCapitalSeo\n })(/${\n p.installmentSeo\n })(/${\n p.closedAreaSeo\n })(/${\n p.conciergeSeo\n })(/${\n p.balconySeo\n })(/${\n p.apartmentsSeo\n })(/${\n p.parkingSeo\n })(/${\n p.flatsSpecialEventsSeo\n })(/${\n p.priceMaxSeo\n })(/${\n p.pricePerMeterMaxSeo\n })(/${\n p.cheapSeo\n })(/${\n p.closeToMetroSeo\n })(/metro-${\n p.metroSeo\n })(/rayon-${\n p.rayon\n })(/${\n p.okrug\n }-okrug)(/${\n p.geoSlugSeo\n })(/${\n p.city\n })/`;\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n city: [ ...mskCityMapper.keys, ...spbCityMapper.keys ],\n geoSlugSeo: `(?!karta|zastroyshik|quiz|${newBuildingTypes.join('|')})[\\\\w\\\\d\\\\-_]+`,\n roomSeo: roomMapper.keys,\n buildingClassSeo: buildingClassMapper.keys,\n hasFinishingSeo: finishingMapper.keys,\n finishingTypeSeo: finishingTypeMapper.keys,\n wallsTypeSeo: wallsTypeMapper.keys,\n floorLastSeo: floorLastMapper.keys,\n law214Seo: law214Mapper.keys,\n escrowSeo: escrowMapper.keys,\n armyMortgageSeo: armyMortgageMapper.keys,\n installmentSeo: installmentMapper.keys,\n priceMaxSeo: priceMaxMapper.keys,\n pricePerMeterMaxSeo: pricePerMeterMaxMapper.keys,\n cheapSeo: cheapMapper.keys,\n closeToMetroSeo: closeToMetroMapper.keys,\n closedAreaSeo: closedAreaMapper.keys,\n conciergeSeo: conciergeMapper.keys,\n balconySeo: balconyMapper.keys,\n motherCapitalSeo: motherCapitalMapper.keys,\n apartmentsSeo: apartmentsMapper.keys,\n parkingSeo: parkingMapper.keys,\n ceilingHeightSeo: ceilingHeightMapper.keys,\n kitchenAreaRangeMinSeo: kitchenAreaRangeMinMapper.keys,\n euroPlanningSeo: euroPlanningMapper.keys,\n flatsSpecialEventsSeo: flatsSpecialEventMapper.keys\n };\n }\n\n defaults() {\n return searchDefaults;\n }\n\n // eslint-disable-next-line complexity\n protected fromQuery(seo: INewBuildingSearchSeoType) {\n const defaults = this.defaults();\n\n const result: Partial<Writeable<INewBuildingSearchType>> = {\n rooms: [],\n finishingType: []\n };\n\n const raw = NewBuildingSearchSeoType(seo);\n\n result.region = this.regionId(raw.region);\n\n const commissioning = raw.commissioningSeo || raw.commissioning;\n\n if (commissioning) {\n if (commissioning.indexOf('q') !== -1) {\n const [ year, quarter ] = commissioning.split('q');\n const quarterNumber = parseInt(quarter, 10) as 1 | 2 | 3 | 4;\n\n result.commissioning = `${quarterMapper.seoFromType(quarterNumber)}_${year}`;\n } else {\n if (Object.values(CommissioningEnum).includes(commissioning as CommissioningEnum)) {\n result.commissioning = commissioning;\n } else if (commissioningMapper.hasSeo(commissioning)) {\n result.commissioning = commissioningMapper.typeFromSeo(commissioning);\n } else {\n const [ quarter, year ] = commissioning.split('_');\n\n if (quarter && year) {\n result.commissioning = `${quarterMapper.typeFromSeo(quarter)}_${year}`;\n }\n }\n }\n }\n\n if (raw.roomSeo) {\n result.rooms = roomMapper.toEnums(raw.roomSeo);\n }\n\n if (raw.rooms) {\n result.rooms = Array.isArray(raw.rooms) ? raw.rooms : [ raw.rooms ];\n }\n\n if (raw.euroPlanningSeo) {\n const [\n rooms,\n kitchen\n ] = euroPlanningMapper.typeFromSeo(raw.euroPlanningSeo).split('|');\n\n // @ts-ignore\n result.rooms = [ rooms ];\n result.kitchenAreaRangeMin = strToNum(kitchen);\n }\n\n const hasFinishing = raw.hasFinishingSeo || raw.hasFinishing;\n\n if (hasFinishing) {\n let finishingTypeFromHasFinishing: typeof sOtdelkoySeoValue | [ FinishingTypeEnum.WithoutFinishing ];\n\n if (hasFinishing === 'bez-otdelki') {\n finishingTypeFromHasFinishing = [ FinishingTypeEnum.WithoutFinishing ];\n } else {\n finishingTypeFromHasFinishing = sOtdelkoySeoValue;\n result.hasFinishing = finishingMapper.typeFromSeo(hasFinishing);\n }\n\n if (result.finishingType) {\n // @ts-expect-error\n result.finishingType = result.finishingType.concat(finishingTypeFromHasFinishing);\n } else {\n // @ts-expect-error\n result.finishingType = finishingTypeFromHasFinishing;\n }\n }\n\n if (raw.finishingTypeSeo) {\n result.finishingType = finishingTypeMapper.toEnums(raw.finishingTypeSeo);\n }\n\n if (raw.finishingType && result.finishingType) {\n result.finishingType = result.finishingType.concat(raw.finishingType);\n }\n\n // eslint-disable-next-line no-nested-ternary\n result.buildingClass = raw.buildingClassSeo ?\n buildingClassMapper.toEnums(raw.buildingClassSeo) :\n // eslint-disable-next-line no-nested-ternary\n raw.buildingClass ?\n Array.isArray(raw.buildingClass) ?\n raw.buildingClass :\n [ raw.buildingClass ] :\n [];\n\n // eslint-disable-next-line no-nested-ternary\n result.wallsType = raw.wallsTypeSeo ? wallsTypeMapper.toEnums(raw.wallsTypeSeo) :\n // eslint-disable-next-line no-nested-ternary\n raw.wallsType ?\n Array.isArray(raw.wallsType) ?\n raw.wallsType :\n [ raw.wallsType ] :\n [];\n\n result.floorLast = raw.floorLastSeo ?\n floorLastMapper.toEnums(raw.floorLastSeo)[0] :\n raw.floorLast;\n\n result.law214 = (\n raw.law214Seo ?\n law214Mapper.toEnums(raw.law214Seo)[0] :\n raw.law214\n ) === YES;\n\n result.escrow = (\n raw.escrowSeo ?\n escrowMapper.toEnums(raw.escrowSeo)[0] :\n raw.escrow\n ) === YES;\n\n result.armyMortgage = (\n raw.armyMortgageSeo ?\n armyMortgageMapper.toEnums(raw.armyMortgageSeo)[0] :\n raw.armyMortgage\n ) === YES;\n\n result.installment = (\n raw.installmentSeo ?\n installmentMapper.toEnums(raw.installmentSeo)[0] :\n raw.installment\n ) === YES;\n\n result.closedArea = (\n raw.closedAreaSeo ?\n closedAreaMapper.toEnums(raw.closedAreaSeo)[0] :\n raw.closedArea\n ) === YES;\n\n result.concierge = (\n raw.conciergeSeo ?\n conciergeMapper.toEnums(raw.conciergeSeo)[0] :\n raw.concierge\n ) === YES;\n\n result.balcony = (\n raw.balconySeo ?\n balconyMapper.toEnums(raw.balconySeo)[0] :\n raw.balcony\n ) === YES;\n\n result.motherCapital = (\n raw.motherCapitalSeo ?\n motherCapitalMapper.toEnums(raw.motherCapitalSeo)[0] :\n raw.motherCapital\n ) === YES;\n\n const apartmentsOnlySeoStr = apartmentsMapper.seoFromType(IsApartmentsOptionsString.APARTMENTS_ONLY);\n\n result.apartments = raw.apartmentsSeo === apartmentsOnlySeoStr ?\n apartmentsMapper.toEnums(raw.apartmentsSeo)[0] :\n raw.apartments;\n\n if (raw.ceilingHeightSeo) {\n result.ceilingHeight = ceilingHeightMapper.typeFromSeo(raw.ceilingHeightSeo);\n }\n\n if (raw.kitchenAreaRangeMinSeo) {\n result.kitchenAreaRangeMin = kitchenAreaRangeMinMapper.typeFromSeo(raw.kitchenAreaRangeMinSeo);\n }\n\n if (raw.parkingSeo === parkingMapper.seoFromType(ParkingTypeString.UNDERGROUND)) {\n result.parking = [ ParkingTypeString.UNDERGROUND ];\n } else if (raw.parkingSeo === parkingMapper.seoFromType(ParkingTypeString.AVAILABLE)) {\n result.parking = [ ParkingTypeString.UNDERGROUND, ParkingTypeString.CLOSED, ParkingTypeString.OPEN ];\n } else {\n // eslint-disable-next-line no-nested-ternary\n result.parking = raw.parking ? (\n Array.isArray(raw.parking) ? raw.parking : [ raw.parking ]\n ) : [];\n }\n\n if (raw.flatsSpecialEventsSeo) {\n result.flatsSpecialEvents = [ flatsSpecialEventMapper.typeFromSeo(raw.flatsSpecialEventsSeo) ];\n }\n\n if (raw.priceMaxSeo) {\n result.priceMax = priceMaxMapper.toEnums(raw.priceMaxSeo)[0];\n }\n\n if (raw.pricePerMeterMaxSeo) {\n result.priceMax = pricePerMeterMaxMapper.toEnums(raw.pricePerMeterMaxSeo)[0];\n result.priceType = AreaUnitEnum.Meter;\n }\n\n if (raw.cheapSeo) {\n result.priceMax = cheapMapper.toEnums(raw.cheapSeo)[0];\n\n result.sort = NewBuildingSortEnum.PriceAsc;\n } else {\n result.sort = raw.sort || defaults.sort;\n }\n\n if (raw.city) {\n const cityMapper = result.region ? getCityMapperByRegion(result.region) : undefined;\n\n result.districtId = cityMapper?.toIds(raw.districtId, raw.city);\n }\n\n if (raw.rayon) {\n const districtMapper = result.region ? getDistrictMapperByRegion(result.region) : undefined;\n const mskDistrictIds = mskRayonMapper.hasSeo(raw.rayon) ?\n mskRayonMapper.toIds(raw.districtId, raw.rayon) :\n null;\n\n result.districtId = mskDistrictIds ?? districtMapper?.toIds(raw.districtId, raw.rayon);\n }\n\n if (raw.okrug) {\n const districtMapper = result.region ? getDistrictMapperByRegion(result.region) : undefined;\n\n result.districtId = districtMapper?.toIds(raw.districtId, raw.okrug);\n }\n\n if (! result.districtId) {\n result.districtId = raw.districtId?.length ? (\n Array.isArray(raw.districtId) ?\n raw.districtId :\n [ raw.districtId ]\n ).map(strToNum) as number[] : undefined;\n }\n\n if (raw.closedSales) {\n result.closedSales = Boolean(raw.closedSales);\n }\n\n if (raw.notOnlyM2Pro) {\n result.notOnlyM2Pro = Boolean(raw.notOnlyM2Pro);\n }\n\n const hasBounds = ! [ raw.lx, raw.ly, raw.rx, raw.ry ].some(coord => coord === undefined);\n\n if (hasBounds || raw.pol) {\n result.mapBounds = {\n bounds: hasBounds ? {\n min: {\n x: Number(raw.lx),\n y: Number(raw.ly)\n },\n max: {\n x: Number(raw.rx),\n y: Number(raw.ry)\n }\n } : undefined,\n polygon: raw.pol ? yMapVectorUnpack(raw.pol) : []\n };\n }\n\n if (raw.showHighlighted) {\n result.showHighlighted = Boolean(raw.showHighlighted);\n }\n\n const metroMapper = result.region ? getMetroMapperByRegion(result.region) : undefined;\n\n if (raw.closeToMetroSeo) {\n [\n result.transportType,\n result.maxMinutes\n ] = closeToMetroMapper.toEnums(raw.closeToMetroSeo)[0]\n .split('|');\n } else {\n // eslint-disable-next-line no-nested-ternary\n result.metroId = metroMapper ?\n metroMapper.toIds(raw.metroId, raw.metroSeo) :\n raw.metroId?.length ? (\n Array.isArray(raw.metroId) ?\n raw.metroId :\n [ raw.metroId ]\n ).map(strToNum) as number[] : undefined;\n\n result.transportType = raw.transportType;\n result.maxMinutes = raw.maxMinutes;\n }\n\n if (raw.geoSlugSeo) {\n result.geoSlug = raw.geoSlugSeo;\n\n const geo = result.region ? this.countrySlugId(raw.geoSlugSeo, result.region) : undefined;\n\n if (geo?.kind === 'LOCALITY') {\n result.addressId = addGeo(result.addressId, geo?.id);\n }\n\n if (geo?.kind === 'DISTRICT') {\n result.districtId = addGeo(result.districtId, geo?.id);\n }\n }\n\n if (! result.addressId) {\n result.addressId = raw.addressId?.length ? (\n Array.isArray(raw.addressId) ?\n raw.addressId :\n [ raw.addressId ]).map(strToNum) as number[] : undefined;\n }\n\n if (! result.districtId) {\n result.districtId = raw.districtId?.length ? (\n Array.isArray(raw.districtId) ?\n raw.districtId :\n [ raw.districtId ]).map(strToNum) as number[] : undefined;\n }\n\n return NewBuildingSearchType({\n region: Number(result.region),\n\n priceMin: strToNum(raw.priceMin),\n priceMax: strToNum(raw.priceMax),\n priceType: raw.priceType,\n\n totalAreaRangeMin: strToNum(raw.totalAreaRangeMin),\n totalAreaRangeMax: strToNum(raw.totalAreaRangeMax),\n\n livingAreaRangeMin: strToNum(raw.livingAreaRangeMin),\n livingAreaRangeMax: strToNum(raw.livingAreaRangeMax),\n\n kitchenAreaRangeMin: strToNum(raw.kitchenAreaRangeMin),\n\n floorMin: strToNum(raw.floorMin),\n floorMax: strToNum(raw.floorMax),\n floorFirst: raw.floorFirst,\n\n floorsTotalMin: strToNum(raw.floorsTotalMin),\n floorsTotalMax: strToNum(raw.floorsTotalMax),\n\n ceilingHeight: raw.ceilingHeight,\n\n bathroom: raw.bathroom,\n\n newBuildingId: raw.newBuildingId ? (\n Array.isArray(raw.newBuildingId) ?\n raw.newBuildingId :\n [ raw.newBuildingId ]\n ).map(strToNum) as number[] : undefined,\n developerId: raw.developerId ? strToNum(raw.developerId) : undefined,\n\n standalone: raw.standalone === YES,\n\n accreditedByVTB: raw.accreditedByVTB === YES,\n\n guardedArea: raw.guardedArea === YES,\n\n pageNumber: strToNum(raw.pageNumber) || defaults.pageNumber,\n pageSize: strToNum(raw.pageSize) || defaults.pageSize,\n\n selectedNewBuildingId: strToNum(raw.selectedNewBuildingId),\n\n flatsSpecialEvents: raw.flatsSpecialEvents,\n otherSpecialEvents: raw.otherSpecialEvents,\n miscSpecialEvents: raw.miscSpecialEvents,\n\n x: strToNum(raw.x),\n y: strToNum(raw.y),\n z: strToNum(raw.z),\n\n ...result\n });\n }\n\n // eslint-disable-next-line complexity\n protected toQuery(p: INewBuildingSearchType) {\n const defaults = this.defaults();\n\n p = NewBuildingSearchType(p);\n\n let result: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n\n // https://jira.m2.ru/browse/NB-1625\n const seoResult: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n const queryResult: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n\n let totalSegments = 0;\n\n if (p.commissioning) {\n let commissioning;\n\n if (commissioningMapper.hasType(p.commissioning)) {\n commissioning = commissioningMapper.seoFromType(p.commissioning);\n } else {\n const [ quarter, year ] = p.commissioning.split('_');\n\n commissioning = [ year, quarterMapper.typeFromSeo(quarter) ].join('q');\n }\n\n seoResult.commissioningSeo = commissioning;\n queryResult.commissioning = commissioning;\n\n totalSegments++;\n }\n\n if (\n euroPlanningMapper.hasType(`${p.rooms}|${p.kitchenAreaRangeMin}`) &&\n (! p.apartments || p.apartments !== IsApartmentsOptionsString.APARTMENTS_ONLY)\n ) {\n seoResult.euroPlanningSeo = euroPlanningMapper.seoFromType(`${p.rooms}|${p.kitchenAreaRangeMin}`);\n\n totalSegments++;\n\n queryResult.rooms = p.rooms;\n queryResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n } else {\n if (p.rooms && Array.isArray(p.rooms)) {\n if (p.rooms.length === 1) {\n seoResult.roomSeo = roomMapper.seoFromType(p.rooms[0]);\n\n totalSegments++;\n } else {\n seoResult.rooms = p.rooms;\n }\n\n queryResult.rooms = p.rooms;\n }\n\n if (p.kitchenAreaRangeMin) {\n if (kitchenAreaRangeMinMapper.hasType(p.kitchenAreaRangeMin)) {\n seoResult.kitchenAreaRangeMinSeo = kitchenAreaRangeMinMapper.seoFromType(p.kitchenAreaRangeMin);\n\n totalSegments++;\n } else {\n seoResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n }\n\n queryResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n }\n }\n\n if (p.finishingType) {\n // в finishingTypeMapper под-ключ и чистовая принимают одно и тоже значение\n // чтобы убрать дубли, в случае\n // /novostroyki/otdelka-pod-klyuch/?finishingType=FINE&finishingType=PRE_FINISHING -> /novostroyki/?finishingType=FINE&finishingType=PRE_FINISHING\n const finishingTypeDeduplicated = Array.from(new Set(p.finishingType));\n\n if (p.finishingType.length === 1) {\n const finishingSeoTag = finishingTypeMapper.seoFromType(p.finishingType[0]);\n\n // не для всех есть ЧПУ (предчистовая)\n if (finishingSeoTag) {\n // переехало в новый finishingTypeEnum, но тег нужно оставить прошлого вида\n if (finishingSeoTag === 'bez-otdelki') seoResult.hasFinishingSeo = 'bez-otdelki';\n else seoResult.finishingTypeSeo = finishingSeoTag;\n // отдельного значения в Enum отправляемом на бэк более нет и теперь\n // подключ === чистовая\n if (finishingSeoTag === 'pod-klyuch') seoResult.finishingTypeSeo = 'chistovaya';\n\n seoResult.finishingType = undefined;\n totalSegments++;\n }\n }\n if (p.hasFinishing === FinishingEnum.Available && ! seoResult.finishingTypeSeo) {\n seoResult.hasFinishingSeo = 's-otdelkoy';\n seoResult.finishingType = undefined;\n totalSegments++;\n }\n\n if (! seoResult.finishingTypeSeo && ! seoResult.hasFinishingSeo) {\n seoResult.finishingType = finishingTypeDeduplicated;\n }\n\n queryResult.finishingType = finishingTypeDeduplicated;\n }\n\n if (p.buildingClass) {\n if (Array.isArray(p.buildingClass) && p.buildingClass.length === 1) {\n seoResult.buildingClassSeo = buildingClassMapper.seoFromType(p.buildingClass[0]);\n\n totalSegments++;\n } else {\n seoResult.buildingClass = p.buildingClass;\n }\n\n queryResult.buildingClass = p.buildingClass;\n }\n\n if (p.wallsType) {\n if (Array.isArray(p.wallsType) && p.wallsType.length === 1) {\n seoResult.wallsTypeSeo = wallsTypeMapper.seoFromType(p.wallsType[0]);\n\n totalSegments++;\n } else {\n seoResult.wallsType = p.wallsType;\n }\n\n queryResult.wallsType = p.wallsType;\n }\n\n if (p.floorLast) {\n seoResult.floorLastSeo = floorLastMapper.seoFromType(p.floorLast);\n\n totalSegments++;\n\n queryResult.floorLast = p.floorLast;\n }\n\n if (p.law214) {\n seoResult.law214Seo = law214Mapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.law214 = YES;\n }\n\n if (p.escrow) {\n seoResult.escrowSeo = escrowMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.escrow = YES;\n }\n\n if (p.armyMortgage) {\n seoResult.armyMortgageSeo = armyMortgageMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.armyMortgage = YES;\n }\n\n if (p.installment) {\n seoResult.installmentSeo = installmentMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.installment = YES;\n }\n\n if (p.closedArea) {\n seoResult.closedAreaSeo = closedAreaMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.closedArea = YES;\n }\n\n if (p.concierge) {\n seoResult.conciergeSeo = conciergeMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.concierge = YES;\n }\n\n if (p.balcony) {\n seoResult.balconySeo = balconyMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.balcony = YES;\n }\n\n if (p.motherCapital) {\n seoResult.motherCapitalSeo = motherCapitalMapper.seoFromType(YES);\n\n totalSegments++;\n\n queryResult.motherCapital = YES;\n }\n\n if (p.apartments) {\n if (p.apartments === IsApartmentsOptionsString.APARTMENTS_ONLY) {\n seoResult.apartmentsSeo = apartmentsMapper.seoFromType(p.apartments);\n\n totalSegments++;\n } else {\n seoResult.apartments = p.apartments;\n }\n\n queryResult.apartments = p.apartments;\n }\n\n if (p.ceilingHeight) {\n if (ceilingHeightMapper.hasType(p.ceilingHeight)) {\n seoResult.ceilingHeightSeo = ceilingHeightMapper.seoFromType(p.ceilingHeight as CeilingHeightString);\n\n totalSegments++;\n } else {\n seoResult.ceilingHeight = p.ceilingHeight;\n }\n\n queryResult.ceilingHeight = p.ceilingHeight;\n }\n\n if (p.parking) {\n if (Array.isArray(p.parking) && p.parking.length === 3) {\n seoResult.parkingSeo = parkingMapper.seoFromType(ParkingTypeString.AVAILABLE);\n\n totalSegments++;\n } else if (p.parking.length === 1 && p.parking[0] === ParkingTypeString.UNDERGROUND) {\n seoResult.parkingSeo = parkingMapper.seoFromType(ParkingTypeString.UNDERGROUND);\n\n totalSegments++;\n } else {\n seoResult.parking = p.parking;\n }\n\n queryResult.parking = Array.isArray(p.parking) ? p.parking : [ p.parking ];\n }\n\n if (p.flatsSpecialEvents) {\n if (p.flatsSpecialEvents.length === 1 && flatsSpecialEventMapper.hasType(p.flatsSpecialEvents[0])) {\n seoResult.flatsSpecialEventsSeo = flatsSpecialEventMapper.seoFromType(\n p.flatsSpecialEvents[0] as FlatsSpecialEventString\n );\n\n totalSegments++;\n } else {\n seoResult.flatsSpecialEvents = p.flatsSpecialEvents;\n }\n\n queryResult.flatsSpecialEvents = Array.isArray(p.flatsSpecialEvents) ?\n p.flatsSpecialEvents :\n [ p.flatsSpecialEvents ];\n }\n\n if (p.priceMax && priceMaxMapper.hasType(p.priceMax)) {\n if (cheapMapper.hasType(p.priceMax) && p.sort === NewBuildingSortEnum.PriceAsc) {\n seoResult.cheapSeo = cheapMapper.seoFromType(p.priceMax);\n } else {\n seoResult.priceMaxSeo = priceMaxMapper.seoFromType(p.priceMax);\n }\n\n totalSegments++;\n\n queryResult.priceMax = numToStr(p.priceMax);\n queryResult.priceType = p.priceType;\n } else if (p.priceMax && pricePerMeterMaxMapper.hasType(p.priceMax) && p.priceType === 'METER') {\n seoResult.pricePerMeterMaxSeo = pricePerMeterMaxMapper.seoFromType(p.priceMax);\n\n totalSegments++;\n\n queryResult.priceMax = numToStr(p.priceMax);\n queryResult.priceType = p.priceType;\n } else {\n result.priceMax = numToStr(p.priceMax);\n result.priceType = p.priceType;\n }\n\n const isCloseToMetro = Boolean(\n p.transportType && p.maxMinutes &&\n closeToMetroMapper.hasType(`${p.transportType}|${p.maxMinutes}`)\n );\n\n if (! (\n (Array.isArray(p.metroId) ? p.metroId.length : p.metroId) ||\n (Array.isArray(p.districtId) ? p.districtId.length : p.districtId) ||\n (Array.isArray(p.addressId) ? p.addressId.length : p.addressId)\n ) && isCloseToMetro) {\n seoResult.closeToMetroSeo = closeToMetroMapper.seoFromType(`${p.transportType}|${p.maxMinutes}`);\n\n totalSegments++;\n\n queryResult.transportType = p.transportType;\n queryResult.maxMinutes = p.maxMinutes;\n } else {\n result.transportType = p.transportType;\n result.maxMinutes = p.maxMinutes;\n }\n\n const slugNumber = getGeoNumber(p.addressId) + getGeoNumber(p.districtId);\n let slugSource;\n\n if (p.geoSlug) {\n result.geoSlugSeo = p.geoSlug;\n } else if (p.addressId || p.districtId) {\n if (slugNumber === 1) {\n const addressId = Array.isArray(p.addressId) ? p.addressId[0] : p.addressId;\n const districtId = Array.isArray(p.districtId) ? p.districtId[0] : p.districtId;\n\n if (addressId) {\n const slug = this.countrySlugPath(addressId) ?? undefined;\n\n result.geoSlugSeo = slug;\n slugSource = slug ? 'addressId' : undefined;\n } else if (districtId) {\n const slug = this.countrySlugPath(districtId) ?? undefined;\n\n result.geoSlugSeo = slug;\n slugSource = slug ? 'districtId' : undefined;\n }\n }\n }\n\n p.addressId && slugSource !== 'addressId' && fillGeoSeo(\n result,\n p.region,\n p.addressId as number | number[],\n 'addressId',\n isCloseToMetro\n );\n\n p.districtId && slugSource !== 'districtId' && fillGeoSeo(\n result,\n p.region,\n p.districtId as number | number[],\n 'districtId',\n isCloseToMetro\n );\n\n result = {\n ...result,\n ...(totalSegments <= 2 ? seoResult : queryResult)\n };\n\n if (! result.cheapSeo) {\n result.sort = p.sort && p.sort !== defaults.sort ? p.sort : undefined;\n }\n\n const metroMapper = getMetroMapperByRegion(p.region);\n let metroSeo: string | undefined;\n\n if (metroMapper && Array.isArray(p.metroId) && p.metroId.length === 1) {\n metroSeo = metroMapper.seoFromTypeOptional(p.metroId[0]);\n }\n\n if (metroSeo && ! isCloseToMetro) {\n result.metroSeo = metroSeo;\n } else {\n result.metroId = (\n Array.isArray(p.metroId) ?\n p.metroId :\n [ p.metroId ]\n ).map(numToStr) as string[];\n }\n\n if (p.closedSales) {\n result.closedSales = 'YES';\n }\n\n if (p.notOnlyM2Pro) {\n result.notOnlyM2Pro = 'YES';\n }\n\n const { bounds, polygon } = p.mapBounds ?? {};\n\n if (p.showHighlighted) {\n result.showHighlighted = 'YES';\n }\n\n return NewBuildingSearchSeoType({\n ...result,\n ...this.regionParams(p.region),\n\n priceMin: numToStr(p.priceMin),\n\n totalAreaRangeMin: numToStr(p.totalAreaRangeMin),\n totalAreaRangeMax: numToStr(p.totalAreaRangeMax),\n\n livingAreaRangeMin: numToStr(p.livingAreaRangeMin),\n livingAreaRangeMax: numToStr(p.livingAreaRangeMax),\n\n floorMin: numToStr(p.floorMin),\n floorMax: numToStr(p.floorMax),\n floorFirst: p.floorFirst,\n\n floorsTotalMin: numToStr(p.floorsTotalMin),\n floorsTotalMax: numToStr(p.floorsTotalMax),\n\n bathroom: p.bathroom,\n\n newBuildingId: p.newBuildingId ? (\n Array.isArray(p.newBuildingId) ?\n p.newBuildingId :\n [ p.newBuildingId ]\n ).map(numToStr) as string[] : undefined,\n developerId: p.developerId ? numToStr(p.developerId) : undefined,\n\n standalone: p.standalone ? YES : undefined,\n\n accreditedByVTB: p.accreditedByVTB ? YES : undefined,\n\n guardedArea: p.guardedArea ? YES : undefined,\n\n pageNumber: p.pageNumber && p.pageNumber !== defaults.pageNumber ? numToStr(p.pageNumber) : undefined,\n pageSize: p.pageSize && p.pageSize !== defaults.pageSize ? numToStr(p.pageSize) : undefined,\n\n selectedNewBuildingId: numToStr(p.selectedNewBuildingId),\n\n otherSpecialEvents: p.otherSpecialEvents,\n miscSpecialEvents: p.miscSpecialEvents,\n\n lx: bounds?.min.x.toString(),\n ly: bounds?.min.y.toString(),\n rx: bounds?.max.x.toString(),\n ry: bounds?.max.y.toString(),\n\n pol: polygon ? yMapVectorPack(polygon as YMapVector[]) : undefined,\n\n x: numToStr(p.x),\n y: numToStr(p.y),\n z: numToStr(p.z)\n });\n }\n}\n\nexport class WLNewBuildingSearchRoute extends NewBuildingSearchRoute {\n displayName = 'WLNewBuildingSearchRoute';\n\n protected pattern() {\n return `${this.patternHost()}/`;\n }\n\n protected defaultRegion() {\n return {\n id: RegionIdEnum.MSK,\n translit: 'moskva'\n };\n }\n\n protected fromQuery(seo: INewBuildingSearchSeoType) {\n const ret = super.fromQuery(seo);\n const regionRet: { region?: number } = {};\n\n if (seo.region) {\n regionRet.region = strToNum(seo.region);\n }\n\n return {\n ...ret,\n ...regionRet,\n\n rooms: seo.rooms,\n commissioning: seo.commissioning,\n buildingClass: seo.buildingClass,\n wallsType: seo.wallsType,\n floorLast: seo.floorLast,\n\n law214: seo.law214 === YES,\n escrow: seo.escrow === YES,\n armyMortgage: seo.armyMortgage === YES,\n installment: seo.installment === YES,\n concierge: seo.concierge === YES,\n closedArea: seo.closedArea === YES,\n balcony: seo.balcony === YES,\n motherCapital: seo.motherCapital === YES,\n apartments: seo.apartments,\n parking: seo.parking\n };\n }\n\n protected toQuery(p: INewBuildingSearchType) {\n const ret: Partial<Writeable<INewBuildingSearchSeoType>> = super.toQuery(p);\n\n ret.region = String(p.region);\n\n ret.rooms = p.rooms;\n ret.commissioning = p.commissioning;\n ret.finishingType = p.finishingType ?? undefined;\n ret.buildingClass = p.buildingClass;\n ret.wallsType = p.wallsType;\n ret.floorLast = p.floorLast;\n\n ret.law214 = p.law214 ? YES : undefined;\n ret.escrow = p.escrow ? YES : undefined;\n ret.armyMortgage = p.armyMortgage ? YES : undefined;\n ret.installment = p.installment ? YES : undefined;\n ret.concierge = p.concierge ? YES : undefined;\n ret.balcony = p.balcony ? YES : undefined;\n ret.motherCapital = p.motherCapital ? YES : undefined;\n ret.closedArea = p.closedArea ? YES : undefined;\n ret.apartments = p.apartments;\n ret.parking = p.parking;\n ret.flatsSpecialEvents = p.flatsSpecialEvents;\n ret.ceilingHeight = p.ceilingHeight;\n ret.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n\n ret.districtId = Array.isArray(p.districtId) ?\n p.districtId :\n [ p.districtId ];\n ret.metroId = Array.isArray(p.metroId) ?\n p.metroId :\n [ p.metroId ];\n\n if (ret.geoSlugSeo) {\n const geo = p.region ? this.countrySlugId(ret.geoSlugSeo, p.region) : undefined;\n\n if (geo?.kind === 'LOCALITY') {\n ret.addressId = addGeo(ret.addressId, geo?.id.toString());\n }\n\n if (geo?.kind === 'DISTRICT') {\n ret.districtId = addGeo(ret.districtId, geo?.id.toString());\n }\n }\n\n delete ret.metroSeo;\n delete ret.rayon;\n delete ret.okrug;\n delete ret.city;\n delete ret.roomSeo;\n delete ret.commissioningSeo;\n delete ret.finishingTypeSeo;\n delete ret.buildingClassSeo;\n delete ret.wallsTypeSeo;\n delete ret.floorLastSeo;\n delete ret.law214Seo;\n delete ret.escrowSeo;\n delete ret.armyMortgageSeo;\n delete ret.installmentSeo;\n delete ret.conciergeSeo;\n delete ret.closedAreaSeo;\n delete ret.apartmentsSeo;\n delete ret.parkingSeo;\n delete ret.ceilingHeightSeo;\n delete ret.kitchenAreaRangeMinSeo;\n delete ret.euroPlanningSeo;\n delete ret.balconySeo;\n delete ret.motherCapitalSeo;\n delete ret.flatsSpecialEventsSeo;\n delete ret.origin;\n delete ret.geoSlugSeo;\n\n return ret;\n }\n}\n\nexport const convertParamsToGQLFilters = (params: INewBuildingSearchType) => ({\n regionId: Number(params.region ?? ROSSIYA),\n commissioning: params.commissioning,\n rooms: params.rooms,\n addressId: params.addressId,\n metroId: params.metroId,\n districtId: params.districtId,\n newBuildingId: Array.isArray(params.newBuildingId) ? params.newBuildingId[0] : undefined,\n developerId: params.developerId,\n transportType: params.transportType,\n maxMinutes: params.maxMinutes,\n wallsType: params.wallsType,\n parking: params.parking,\n floorsTotalMin: params.floorsTotalMin,\n floorsTotalMax: params.floorsTotalMax,\n priceMin: params.priceMin,\n priceMax: params.priceMax,\n floorMin: params.floorMin,\n floorMax: params.floorMax,\n floorFirst: params.floorFirst,\n floorLast: params.floorLast,\n totalAreaRangeMin: params.totalAreaRangeMin,\n totalAreaRangeMax: params.totalAreaRangeMax,\n livingAreaRangeMin: params.livingAreaRangeMin,\n livingAreaRangeMax: params.livingAreaRangeMax,\n kitchenAreaRangeMin: params.kitchenAreaRangeMin,\n ceilingHeight: params.ceilingHeight,\n bathroom: params.bathroom,\n balcony: params.balcony,\n buildingClass: params.buildingClass,\n hasFinishing: params.hasFinishing,\n finishingType: params.finishingType,\n standalone: params.standalone,\n apartments: params.apartments,\n concierge: params.concierge,\n closedArea: params.closedArea,\n guardedArea: params.guardedArea,\n accreditedByVTB: params.accreditedByVTB,\n law214: params.law214,\n escrow: params.escrow,\n armyMortgage: params.armyMortgage,\n installment: params.installment,\n motherCapital: params.motherCapital,\n priceType: params.priceType,\n closedSales: params.closedSales,\n mapBounds: params.mapBounds,\n flatsSpecialEvents: params.flatsSpecialEvents,\n otherSpecialEvents: params.otherSpecialEvents,\n miscSpecialEvents: params.miscSpecialEvents,\n notOnlyM2Pro: params.notOnlyM2Pro,\n});\n","import { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\n\nimport { regionMapper } from './mappers/regions/regionMapper';\nimport { RouterContext } from './RouterProvider';\n\nexport abstract class ClassifiedRoute<External, Internal, Defaults = unknown> extends SusaninRoute<\n External, Internal, RouterContext, Defaults\n> {\n protected patternHost(): string {\n return '(<origin>)';\n }\n\n protected conditions() {\n return {\n origin: 'https?://[^\\/]+'\n };\n }\n\n protected regionSlugHost(regionId: number) {\n let result = super.regionSlugHost(regionId);\n\n if (result) return result;\n\n const parentId = this.context.rootRegions?.byId(regionId)?.narrowRegion?.id;\n\n if (parentId) result = super.regionSlugHost(parentId);\n\n return result;\n }\n\n regionId(regionSlug?: string | null) {\n let regionId = regionSlug ? this.context.rootRegions?.bySlug(regionSlug)?.id : undefined;\n\n if (! regionId) regionId = this.hostParts()?.regionId;\n\n return regionId;\n }\n\n regionSlugPath(regionId: number) {\n const regGeo = this.context.rootRegions?.byId(regionId);\n\n return regGeo?.translit ??\n regionMapper.seoFromTypeOptional(regionId) ??\n regionMapper.seoFromTypeOptional(this.regionIdDefault());\n }\n}\n","import { createRouterProvider, RouterProviderProps } from '@search/router/src/react/createRouterProvider';\nimport type { SlugMapper } from '@search/geo/src/SlugMapper';\n\nexport type IRootRegions = {\n byId(id: number): { translit?: string | null; narrowRegion?: {id: number} | null } | undefined;\n bySlug(slug: string): { id: number } | undefined;\n slugs: SlugMapper;\n};\n\nexport type RouterContext = {\n urlMapper?(src: string): string | undefined;\n isMobile?: boolean;\n isServer?: boolean;\n isCanonical?: boolean;\n onlyRelativeUrl?: boolean;\n preferRelativeUrl?: boolean;\n rootRegions?: IRootRegions;\n}\n\nexport type RouterProviderAppProps = RouterProviderProps<RouterContext>;\n\nconst { RouterProvider, useRouter } = createRouterProvider<RouterContext>();\n\nexport { RouterProvider, useRouter };\n","// import { Bathroom } from '../../view/enums/Bathroom';\nimport { SeoMapper } from '@search/router/src';\n\nexport const parkingsMapper = new SeoMapper('parkingsMapper', {\n UNKNOWN: 'UNKNOWN',\n CLOSED: 'CLOSED',\n UNDERGROUND: 'UNDERGROUND',\n OPEN: 'OPEN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const livingTenantMapper = new SeoMapper('livingTenantMapper', {\n UNKNOWN: 'UNKNOWN',\n CHILDREN_ALLOWED: 'CHILDREN_ALLOWED',\n PETS_ALLOWED: 'PETS_ALLOWED',\n} as const);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { SeoMapper } from '@search/router/src';\n\nexport const sortOffersMapper = new SeoMapper('sortOffersMapper', {\n '': 'unknown',\n date: 'date',\n timeToMetro: 'timeToMetro',\n room: 'room',\n floor: 'floor',\n totalArea: 'totalArea',\n price: 'price',\n date_asc: 'date_asc',\n timeToMetro_desc: 'timeToMetro_desc',\n room_desc: 'room_desc',\n floor_desc: 'floor_desc',\n totalArea_desc: 'totalArea_desc',\n price_desc: 'price_desc',\n priceSqMeter: 'priceSqMeter',\n priceSqMeter_desc: 'priceSqMeter_desc',\n distanceToCityCenter: 'distanceToCityCenter',\n updateDate_desc: 'updateDate_desc',\n updateDate: 'updateDate'\n} as const);\n\nexport type SortOffersType =\n 'unknown'\n | 'date'\n | 'timeToMetro'\n | 'room' | 'floor'\n | 'totalArea'\n | 'price'\n | 'date_asc'\n | 'timeToMetro_desc'\n | 'room_desc'\n | 'floor_desc'\n | 'totalArea_desc'\n | 'price_desc'\n | 'priceSqMeter'\n | 'priceSqMeter_desc'\n | 'distanceToCityCenter'\n | 'updateDate_desc'\n | 'updateDate'\n | undefined\n;\n","import { SeoMapper } from '@search/router/src';\n\nexport const windowsDirectionMapper = new SeoMapper('windowsDirectionMapper', {\n BOTH: 'BOTH',\n REAR: 'REAR',\n FRONT: 'FRONT',\n UNKNOWN: 'UNKNOWN'\n} as const);\n","import { s } from '@search/router/src/schema/schema';\n\nimport {\n authorTypeMapper, bankPledgeMapper, bathroomMapper, categoryTypeMapper, dealTypeMapper,\n furnitureMapper, layoutImageMapper, livingFacilityMapper, newBuildingMapper,\n renovationMapper, roomMapper, sellTypeMapper, wallsMapper, buildEpochMapper,\n finishingMapper\n} from '../mappers';\nimport { newBuildingTypeMapper } from '../mappers/newBuilding/mappers';\nimport { windowsDirectionMapper } from '../mappers/windowsDirectionMapper';\nimport { sortOffersMapper } from '../mappers/sortOffersMapper';\nimport { parkingsMapper } from '../mappers/parkingsMapper';\nimport { livingTenantMapper } from '../mappers/livingTenantMapper';\n\nexport const SearchSeoType = s.rec({\n seoSeg1: s.nullOpt(s.str),\n seoSeg2: s.nullOpt(s.str),\n seoSegPrice: s.nullOpt(s.str),\n geoSlug1: s.nullOpt(s.str),\n geoSlug2: s.nullOpt(s.str),\n origin: s.nullOpt(s.str),\n region: s.nullOpt(s.str),\n\n renovation: s.maybeArray(renovationMapper.SeoType),\n finishingType: s.maybeArray(finishingMapper.SeoType),\n commissioning: s.nullOpt(s.str),\n renovationSegment: s.nullOpt(renovationMapper.SeoType),\n metroIds: s.maybeArray(s.str),\n metroSegment: s.nullOpt(s.str),\n metroBranch: s.nullOpt(s.str),\n newSegment: s.nullOpt(newBuildingMapper.SeoType),\n newBuilding: s.maybeArray(newBuildingMapper.SeoType),\n bankPledgeOptionsSegment: s.nullOpt(bankPledgeMapper.SeoType),\n bankPledgeOptions: s.nullOpt(bankPledgeMapper.SeoType),\n apartments: s.nullOpt(s.str),\n houseCategory: s.maybeArray(s.str),\n houseCategorySegment: s.nullOpt(s.str),\n cotedjSegment: s.nullOpt(s.str),\n rayon: s.nullOpt(s.str),\n okrug: s.nullOpt(s.str),\n\n room: s.nullOpt(s.str),\n rooms: s.maybeArray(roomMapper.SeoType),\n roomsInOffer: s.maybeArray(s.str),\n addresses: s.maybeArray(s.str),\n geohash: s.nullOpt(s.str),\n districtIds: s.maybeArray(s.str),\n newBuildingIds: s.maybeArray(s.str),\n\n newBuildingId: s.nullOpt(s.str),\n newBuildingType: s.nullOpt(newBuildingTypeMapper.SeoType),\n newBuildingName: s.nullOpt(s.str),\n\n dealType: s.nullOpt(dealTypeMapper.SeoType),\n categoryType: s.nullOpt(categoryTypeMapper.SeoType),\n\n totalAreaMin: s.nullOpt(s.str),\n totalAreaMax: s.nullOpt(s.str),\n\n landAreaMin: s.nullOpt(s.str),\n landAreaMax: s.nullOpt(s.str),\n\n houseAreaMin: s.nullOpt(s.str),\n houseAreaMax: s.nullOpt(s.str),\n bathroomLocation: s.maybeArray(s.str),\n\n priceMin: s.nullOpt(s.str),\n priceMax: s.nullOpt(s.str),\n mortgagePayment: s.nullOpt(s.str),\n priceMaxSegment: s.nullOpt(s.str),\n priceUnit: s.nullOpt(s.str),\n\n livingAreaMin: s.nullOpt(s.str),\n livingAreaMax: s.nullOpt(s.str),\n\n kitchenAreaMin: s.nullOpt(s.str),\n kitchenAreaMax: s.nullOpt(s.str),\n\n seoSegBuildEpoch: s.nullOpt(s.str),\n builtYearMin: s.nullOpt(s.str),\n builtYearMax: s.nullOpt(s.str),\n\n floorMin: s.nullOpt(s.str),\n floorMax: s.nullOpt(s.str),\n\n last: s.nullOpt(s.str),\n first: s.nullOpt(s.str),\n\n floorsTotalMin: s.nullOpt(s.str),\n floorsTotalMax: s.nullOpt(s.str),\n\n cellHeight: s.nullOpt(s.str),\n\n bathroom: s.maybeArray(bathroomMapper.SeoType),\n bathroomSegment: s.nullOpt(bathroomMapper.SeoType),\n landStatus: s.maybeArray(s.str),\n landStatusSegment: s.nullOpt(s.str),\n\n heating: s.maybeArray(s.str),\n gas: s.maybeArray(s.str),\n water: s.maybeArray(s.str),\n electricity: s.maybeArray(s.str),\n sewerage: s.maybeArray(s.str),\n communications: s.nullOpt(s.str),\n\n // @deprecated use transport & transportTimeLimit\n transportType: s.nullOpt(s.str),\n // @deprecated use transport & transportTimeLimit\n timeLimit: s.nullOpt(s.str),\n\n transport: s.nullOpt(s.str),\n transportTimeLimit: s.nullOpt(s.str),\n nearMetroSegment: s.nullOpt(s.str),\n\n livingFacility: s.maybeArray(livingFacilityMapper.SeoType),\n furniture: s.maybeArray(furnitureMapper.SeoType),\n livingTenantOptions: s.maybeArray(livingTenantMapper.SeoType),\n utilitiesIncluded: s.nullOpt(s.str),\n depositType: s.nullOpt(s.str),\n commisionType: s.nullOpt(s.str),\n rentPrepayment: s.nullOpt(s.str),\n rentPrepaymentSegment: s.nullOpt(s.str),\n walls: s.maybeArray(wallsMapper.SeoType),\n parkings: s.maybeArray(parkingsMapper.SeoType),\n parkingsSegment: s.nullOpt(s.str),\n author: s.maybeArray(authorTypeMapper.SeoType),\n userId: s.nullOpt(s.str),\n authorSegment: s.nullOpt(s.str),\n sellType: s.maybeArray(sellTypeMapper.SeoType),\n balcony: s.nullOpt(s.str),\n photoOptions: s.nullOpt(s.str),\n layoutImageOptions: s.maybeArray(layoutImageMapper.SeoType),\n renovationProgram: s.nullOpt(s.str),\n nearbyOptions: s.nullOpt(s.str),\n sellerOrganizationName: s.nullOpt(s.str),\n\n infrastructure: s.maybeArray(s.str),\n\n hasLift: s.nullOpt(s.str),\n seoMortgageAllowed: s.nullOpt(s.str),\n seoMortgageAllowedSegment: s.nullOpt(s.str),\n\n windowsDirection: s.maybeArray(windowsDirectionMapper.SeoType),\n\n buildEpoch: s.maybeArray(buildEpochMapper.SeoType),\n\n onlineView: s.nullOpt(s.str),\n\n selectedOffers: s.maybeArray(s.str),\n pageNumber: s.nullOpt(s.str),\n pageSize: s.nullOpt(s.str),\n sort: s.nullOpt(sortOffersMapper.SeoType),\n\n x: s.opt(s.str),\n y: s.opt(s.str),\n z: s.opt(s.str),\n\n lx: s.opt(s.str),\n ly: s.opt(s.str),\n rx: s.opt(s.str),\n ry: s.opt(s.str),\n pol: s.opt(s.str),\n\n citySegment: s.opt(s.str)\n});\n","import { s } from '@search/router/src/schema/schema';\n\nimport {\n authorTypeMapper, bankPledgeMapper, bathroomMapper, categoryTypeMapper, dealTypeMapper,\n furnitureMapper, layoutImageMapper, livingFacilityMapper, newBuildingMapper,\n renovationMapper, roomMapper, sellTypeMapper, wallsMapper, buildEpochMapper, finishingMapper\n} from '../mappers';\nimport { livingTenantMapper } from '../mappers/livingTenantMapper';\nimport { newBuildingTypeMapper } from '../mappers/newBuilding/mappers';\nimport { parkingsMapper } from '../mappers/parkingsMapper';\nimport { sortOffersMapper } from '../mappers/sortOffersMapper';\nimport { windowsDirectionMapper } from '../mappers/windowsDirectionMapper';\nimport { mskMetroBranchMapper } from '../mappers/regions/msk';\n\nexport const SearchType = s.rec({\n segments: s.opt(s.rec({\n isGetEmpty: s.bool,\n infrastructure: s.nullOpt(s.list(s.str)),\n balcony: s.nullOpt(s.str),\n hasLift: s.nullOpt(s.str),\n kitchenAreaMin: s.nullOpt(s.num),\n tagCount: s.num,\n rooms: s.list(roomMapper.Type),\n addresses: s.list(s.num),\n districtIds: s.list(s.num),\n nearMetroSegment: s.opt(s.str),\n metroIds: s.list(s.num),\n metroBranch: s.nullOpt(mskMetroBranchMapper.Type),\n floorMax: s.nullOpt(s.num),\n floorMin: s.nullOpt(s.num),\n floorsTotalMin: s.nullOpt(s.num),\n floorsTotalMax: s.nullOpt(s.num),\n cellHeight: s.nullOpt(s.str),\n totalAreaMax: s.nullOpt(s.num),\n renovation: s.list(renovationMapper.Type),\n last: s.nullOpt(s.str),\n nearbyOptions: s.nullOpt(s.str),\n renovationProgram: s.nullOpt(s.str),\n newBuilding: s.list(newBuildingMapper.Type),\n bankPledgeOptions: s.nullOpt(bankPledgeMapper.Type),\n apartments: s.nullOpt(s.str),\n bathroom: s.list(bathroomMapper.Type),\n furniture: s.list(furnitureMapper.Type),\n parkings: s.list(parkingsMapper.Type),\n author: s.list(authorTypeMapper.Type),\n seoMortgageAllowed: s.opt(s.bool),\n houseCategory: s.list(s.str),\n landStatus: s.list(s.str),\n bathroomLocation: s.nullOpt(s.list(s.str)),\n rentPrepayment: s.nullOpt(s.str),\n heating: s.nullOpt(s.list(s.str)),\n gas: s.nullOpt(s.list(s.str)),\n water: s.nullOpt(s.list(s.str)),\n electricity: s.nullOpt(s.list(s.str)),\n sewerage: s.nullOpt(s.list(s.str)),\n communications: s.nullOpt(s.str),\n priceMax: s.opt(s.num),\n priceMin: s.opt(s.num),\n transport: s.opt(s.str),\n transportTimeLimit: s.opt(s.str),\n landAreaMin: s.nullOpt(s.num),\n landAreaMax: s.nullOpt(s.num),\n builtYearMin: s.opt(s.num),\n builtYearMax: s.opt(s.num)\n })),\n geoSlugs: s.opt(s.list(s.str)),\n seoMortgageAllowed: s.opt(s.bool),\n region: s.num,\n rooms: s.list(roomMapper.Type),\n roomsInOffer: s.list(s.num),\n renovation: s.list(renovationMapper.Type),\n finishingType: s.list(finishingMapper.Type),\n commissioning: s.nullOpt(s.str),\n\n addresses: s.list(s.num),\n metroIds: s.list(s.num),\n metroBranch: s.nullOpt(mskMetroBranchMapper.Type),\n districtIds: s.list(s.num),\n newBuildingIds: s.list(s.num),\n\n newBuildingType: s.opt(newBuildingTypeMapper.Type),\n newBuildingName: s.opt(s.str),\n\n dealType: dealTypeMapper.Type,\n categoryType: categoryTypeMapper.Type,\n\n totalAreaMin: s.nullOpt(s.num),\n totalAreaMax: s.nullOpt(s.num),\n\n landAreaMin: s.nullOpt(s.num),\n landAreaMax: s.nullOpt(s.num),\n\n houseCategory: s.list(s.str),\n houseAreaMin: s.nullOpt(s.num),\n houseAreaMax: s.nullOpt(s.num),\n bathroomLocation: s.nullOpt(s.list(s.str)),\n\n priceMin: s.nullOpt(s.num),\n priceMax: s.nullOpt(s.num),\n mortgagePayment: s.nullOpt(s.num),\n priceUnit: s.nullOpt(s.str),\n\n livingAreaMin: s.nullOpt(s.num),\n livingAreaMax: s.nullOpt(s.num),\n\n kitchenAreaMin: s.nullOpt(s.num),\n kitchenAreaMax: s.nullOpt(s.num),\n\n builtYearMin: s.nullOpt(s.num),\n builtYearMax: s.nullOpt(s.num),\n\n floorMin: s.nullOpt(s.num),\n floorMax: s.nullOpt(s.num),\n\n last: s.nullOpt(s.str),\n first: s.nullOpt(s.str),\n\n floorsTotalMin: s.nullOpt(s.num),\n floorsTotalMax: s.nullOpt(s.num),\n\n cellHeight: s.nullOpt(s.str),\n\n newBuilding: s.list(newBuildingMapper.Type),\n bathroom: s.list(bathroomMapper.Type),\n\n landStatus: s.list(s.str),\n\n heating: s.list(s.str),\n gas: s.list(s.str),\n water: s.list(s.str),\n electricity: s.list(s.str),\n sewerage: s.list(s.str),\n\n // @deprecated use transport & transportTimeLimit\n transportType: s.nullOpt(s.str),\n // @deprecated use transport & transportTimeLimit\n timeLimit: s.nullOpt(s.str),\n\n transport: s.nullOpt(s.str),\n transportTimeLimit: s.nullOpt(s.str),\n\n livingFacility: s.list(livingFacilityMapper.Type),\n furniture: s.list(furnitureMapper.Type),\n livingTenantOptions: s.list(livingTenantMapper.Type),\n utilitiesIncluded: s.nullOpt(s.bool),\n depositType: s.nullOpt(s.str),\n commisionType: s.nullOpt(s.str),\n rentPrepayment: s.nullOpt(s.str),\n walls: s.list(wallsMapper.Type),\n parkings: s.list(parkingsMapper.Type),\n author: s.list(authorTypeMapper.Type),\n userId: s.nullOpt(s.str),\n sellType: s.list(sellTypeMapper.Type),\n balcony: s.nullOpt(s.str),\n photoOptions: s.nullOpt(s.str),\n renovationProgram: s.nullOpt(s.str),\n nearbyOptions: s.nullOpt(s.str),\n sellerOrganizationName: s.nullOpt(s.str),\n layoutImageOptions: s.list(layoutImageMapper.Type),\n bankPledgeOptions: s.nullOpt(bankPledgeMapper.Type),\n apartments: s.nullOpt(s.str),\n infrastructure: s.nullOpt(s.list(s.str)),\n hasLift: s.nullOpt(s.str),\n\n windowsDirection: s.list(windowsDirectionMapper.Type),\n\n buildEpoch: s.list(buildEpochMapper.Type),\n\n onlineView: s.nullOpt(s.str),\n\n pageNumber: s.num,\n pageSize: s.num,\n sort: s.opt(sortOffersMapper.Type),\n\n tile: s.opt(s.rec({\n x: s.num,\n y: s.num,\n z: s.num\n })),\n selectedOffers: s.opt(s.list(s.str)),\n mapBounds: s.opt(s.rec({\n geohash: s.opt(s.str),\n bounds: s.opt(s.rec({\n min: s.rec({\n x: s.num,\n y: s.num\n }),\n max: s.rec({\n x: s.num,\n y: s.num\n })\n })),\n polygon: s.opt(s.list(s.rec({\n x: s.num,\n y: s.num\n })))\n })),\n utm_source: s.opt(s.str),\n utm_medium: s.opt(s.str),\n utm_campaign: s.opt(s.str),\n utm_content: s.opt(s.str),\n utm_term: s.opt(s.str),\n});\n","import { DealType } from '@search/filter-enums/enums/DealType';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\n\nexport const searchDefaults = {\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.FLAT,\n priceUnit: 'ALL',\n rooms: [],\n layoutImageOptions: [],\n roomsInOffer: [],\n renovation: [],\n addresses: [],\n metroIds: [],\n districtIds: [],\n newBuildingIds: [],\n pageNumber: 1,\n pageSize: 20 as number,\n // sort: undefined,\n newBuilding: [],\n bathroom: [],\n livingFacility: [],\n furniture: [],\n finishingType: [],\n livingTenantOptions: [],\n walls: [],\n parkings: [],\n author: [],\n houseCategory: [],\n bathroomLocation: [],\n heating: [],\n sellType: [],\n infrastructure: [],\n landStatus: [],\n gas: [],\n water: [],\n electricity: [],\n sewerage: [],\n windowsDirection: [],\n buildEpoch: []\n} as const;\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { SeoChpuMapper } from '@search/router/src';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums';\n\nexport type TSearchSeoChpuMapper = ReturnType<typeof SearchSeoChpuMapper.chpuMap>;\ntype SearchSeoChpuMapperKeys = (keyof TSearchSeoChpuMapper)[];\n\nconst floorArr = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ] as const;\nconst areArr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 20, 25, 30, 40, 50, 100 ] as const;\n\ntype TFloorMap = { [x in `${typeof floorArr[number]}-etazh`]?: { floorMin: number; floorMax: number} };\ntype TAreMap = { [x in `${typeof areArr[number]}-sotok`]?: { landAreaMin?: number; landAreaMax: number} };\n\nconst generateFloorMap = ({ returnParams }: { returnParams?: boolean }) => floorArr.reduce(\n (prev, cur: typeof floorArr[number]) => {\n prev[`${cur}-etazh`] = returnParams ? { floorMax: cur, floorMin: cur } : undefined;\n return prev;\n },\n {} as TFloorMap\n);\n\nexport const generateAreChpuMap = ({ returnParams }: { returnParams?: boolean }) => areArr.reduce(\n (prev, cur: typeof areArr[number]) => {\n if (cur === 1 && returnParams) prev[`${cur}-sotok`] = { landAreaMax: cur };\n prev[`${cur}-sotok`] = returnParams ? { landAreaMin: cur, landAreaMax: cur } : undefined;\n return prev;\n },\n {} as TAreMap\n);\n\nexport class SearchSeoChpuMapper extends SeoChpuMapper<typeof SearchSeoChpuMapper.chpuMap> {\n static chpuKeys = Object.keys(SearchSeoChpuMapper.chpuMap()) as SearchSeoChpuMapperKeys;\n\n extraTagWeight = new Map([\n [ 's-gazom-i-vodoj', 2 ],\n ]);\n\n tagsIntersection = new Map<SearchSeoChpuMapperKeys[number], string[]>([\n [ 's-gazom-i-vodoj', [ 's-gazom', 's-vodoj' ] ],\n [ 'cottage', [ 's-otopleniem', 's-vodoj', 's-kanalizacziej', 's-elektrichestvom' ] ],\n ]);\n\n static euroKitchenArea = 17;\n\n // eslint-disable-next-line complexity\n static chpuMap(ctx: {\n categoryType?: RealtyObjectType;\n dealType?: DealType;\n apartments?: string | null;\n rooms?: readonly Rooms[];\n kitchenAreaMin?: string | null | number;\n last?: string | null | number;\n livingTenantOptions?: readonly ('UNKNOWN' | 'CHILDREN_ALLOWED' | 'PETS_ALLOWED')[] | null;\n commisionType?: string | null;\n } = {}) {\n const isFlat = ctx.categoryType === RealtyObjectType.FLAT;\n // const isSell = ctx.dealType === DealType.SELL;\n const isRent = ctx.dealType === DealType.RENT;\n const isHouse = ctx.categoryType === RealtyObjectType.HOUSE;\n const isLand = ctx.categoryType === RealtyObjectType.LAND;\n const isApartments = ctx.apartments === 'APARTMENTS_ONLY';\n const isEuroLayout = ctx.rooms?.length === 1 && [ Rooms.ROOM_1, Rooms.ROOM_2, Rooms.ROOM_3 ].includes(ctx.rooms[0]) && Number(ctx.kitchenAreaMin) === this.euroKitchenArea;\n const isLastFloor = ctx.last === 'ONLY';\n const isChpuDeposite = ctx.dealType === DealType.RENT &&\n ctx.commisionType !== 'NO_CLIENT_COMMISSION' &&\n ! ctx.livingTenantOptions?.includes('PETS_ALLOWED') &&\n ! ctx.livingTenantOptions?.includes('CHILDREN_ALLOWED');\n\n return {\n 'vysokie-potolki': { cellHeight: 'FROM_3' },\n '1-etazh': isLastFloor ? undefined : { floorMax: 1 },\n 'poslednij-etazh': { last: 'ONLY' },\n 'bolshaya-kukhnya': { kitchenAreaMin: 15 },\n renovacziya: { renovationProgram: 'HAS_ANY' },\n 'okhrana-territorii': { infrastructure: [ 'CLOSED_AREA' ] },\n 's-konserzhem': { infrastructure: [ 'CONCIERGE' ] },\n 'ryadom-shkola': { nearbyOptions: 'GOOD_SCHOOL' },\n evroodnushka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_1 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n evrodvushka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_2 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n evrotreshka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_3 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n malogabaritnaya: isFlat ? { totalAreaMax: 29 } : undefined,\n 's-liftom': { hasLift: 'HAS_ANY' },\n 's-balkonom': { balcony: 'HAS_ANY' },\n apartamenty: isFlat && ! isEuroLayout ? { apartments: 'APARTMENTS_ONLY' } : undefined,\n 's-sanuzlom': { bathroomLocation: [ 'INSIDE' ] },\n 's-otopleniem': isHouse ? { heating: [ 'HAS_ANY' ] } : undefined,\n 's-gazom': isHouse || isLand ? { gas: [ 'HAS_ANY' ] } : undefined,\n 's-vodoj': isHouse || isLand ? { water: [ 'HAS_ANY' ] } : undefined,\n 's-elektrichestvom': isHouse || isLand ? { electricity: [ 'HAS_ANY' ] } : undefined,\n 's-kanalizacziej': isHouse || isLand ? { sewerage: [ 'HAS_ANY' ] } : undefined,\n 's-gazom-i-vodoj': isHouse || isLand ? { water: [ 'HAS_ANY' ], gas: [ 'HAS_ANY' ] } : undefined,\n 's-kommunikaciyami': isHouse || isLand ? { water: [ 'HAS_ANY' ], gas: [ 'HAS_ANY' ], electricity: [ 'HAS_ANY' ], sewerage: [ 'HAS_ANY' ] } : undefined,\n cottage: isHouse ?\n {\n heating: [ 'HAS_ANY' ],\n water: [ 'HAS_ANY' ],\n sewerage: [ 'HAS_ANY' ],\n electricity: [ 'HAS_ANY' ],\n houseCategory: [ 'STANDALONE' ],\n landStatus: [ 'DNP', 'IZHS', 'SNT' ]\n } :\n undefined,\n ...generateFloorMap({ returnParams: ! isLastFloor }),\n ...generateAreChpuMap({ returnParams: isLand }),\n odnoetazhnyj: isHouse ? { floorsTotalMax: 1 } : undefined,\n dvuhetazhnyj: isHouse ? { floorsTotalMax: 2, floorsTotalMin: 2 } : undefined,\n trekhetazhnyj: isHouse ? { floorsTotalMax: 3, floorsTotalMin: 3 } : undefined,\n 'bez-mebeli': isFlat || isHouse ? { furniture: [ 'NO' ] as ('NO' | 'ALL' | 'UNKNOWN' | 'KITCHEN')[] } : undefined,\n 's-mebelyu': isFlat || isHouse ? { furniture: [ 'ALL' ] as ('NO' | 'ALL' | 'UNKNOWN' | 'KITCHEN')[] } : undefined,\n 'dlya-postoyannogo-prozhivaniya': isHouse ? { houseCategory: [ 'STANDALONE' ] } : undefined,\n 'bez-komissii': isRent ? { commisionType: 'NO_CLIENT_COMMISSION' } : undefined,\n 's-zhivotnymi': isRent ? { livingTenantOptions: [ 'PETS_ALLOWED' ] as ('UNKNOWN' | 'PETS_ALLOWED' | 'CHILDREN_ALLOWED')[] } : undefined,\n 's-detmi': isRent ? { livingTenantOptions: [ 'CHILDREN_ALLOWED' ] as ('UNKNOWN' | 'PETS_ALLOWED' | 'CHILDREN_ALLOWED')[] } : undefined,\n 'bez-zaloga': isChpuDeposite ? { depositType: 'NO_DEPOSIT' } : undefined,\n };\n }\n}\n\n// new SearchSeoChpuMapper({}).toChpu({}).chpuParams\n// new SearchSeoChpuMapper({}).toChpu({\n// rooms: [] as readonly[]\n// });\n","import { s, SusaninRoute } from '@search/router/src';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { RouterContext } from '../RouterProvider';\n\nconst PhoneCallType = s.rec({\n offerId: s.str\n});\n\nexport type IPhoneCallType = ReturnType<typeof PhoneCallType>;\n\nconst PhoneCallSeoType = s.rec({\n origin: s.nullOpt(s.str),\n offerId: s.str\n});\n\nexport type IPhoneCallSeoType = ReturnType<typeof PhoneCallSeoType>;\n\nexport class PhoneCallRoute extends SusaninRoute<IPhoneCallSeoType, IPhoneCallType, RouterContext> {\n displayName = 'PhoneCallRoute';\n\n protected metadata = PhoneCallSeoType.config;\n\n static middlewareUrl = '/m/search/phone-call';\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected pattern(p: Tokens<IPhoneCallSeoType>) {\n return `${this.patternHost()}/m/search/phone-call(/)`;\n }\n\n defaults() {\n return {};\n }\n\n protected fromQuery(seo: IPhoneCallSeoType) {\n return PhoneCallType({\n offerId: seo.offerId\n });\n }\n\n protected toQuery(p: IPhoneCallType) {\n const offerId = p.offerId;\n\n try {\n return PhoneCallSeoType({\n offerId\n });\n } catch (e) {\n // @ts-expect-error\n e.message += `, offerId: ${offerId}`;\n throw e;\n }\n }\n}\n","import {\n s,\n SusaninRoute,\n queryParamtoArray\n} from '@search/router/src';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { RouterContext } from '../RouterProvider';\n\nconst UnsubscribeType = s.rec({\n sid: s.list(s.str),\n uid: s.str,\n oid: s.opt(s.str)\n});\n\ntype IUnsubscribeType = ReturnType<typeof UnsubscribeType>;\n\nconst UnsubscribeSeoType = s.rec({\n origin: s.nullOpt(s.str),\n sid: s.list(s.str),\n uid: s.str,\n oid: s.opt(s.str)\n});\n\ntype IUnsubscribeSeoType = ReturnType<typeof UnsubscribeSeoType>;\n\nexport class UnsubscribeRoute extends SusaninRoute<IUnsubscribeSeoType, IUnsubscribeType, RouterContext> {\n displayName = 'UnsubscribeRoute';\n\n protected metadata = UnsubscribeSeoType.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected pattern(p: Tokens<IUnsubscribeSeoType>) {\n return `${this.patternHost()}/search/unsubscribe/`;\n }\n\n defaults() {\n return {};\n }\n\n protected fromQuery(seo: IUnsubscribeSeoType) {\n return UnsubscribeType({\n sid: queryParamtoArray(seo.sid),\n oid: seo.oid,\n uid: seo.uid\n });\n }\n\n protected toQuery({ sid, uid, oid }: IUnsubscribeType) {\n try {\n return UnsubscribeSeoType({\n sid,\n uid,\n oid\n });\n } catch (e) {\n // @ts-expect-error\n e.message += `, searchId: ${sid}`;\n throw e;\n }\n }\n}\n","export function dedupeValues(o: Record<string, number>) {\n const keys = Object.keys(o) as (keyof typeof o)[];\n const result = new Set<number>();\n\n for (const key of keys) {\n if (key.match(/\\d$/)) continue;\n\n result.add(o[key]);\n }\n\n return Array.from(result);\n}\n","import { SeoMapper } from '@search/router/src';\nimport { AuthorTypeOptionsWithRealtor } from '@search/filter-enums/enums/AuthorTypeOptions';\n\nexport const authorTypeMapper = new SeoMapper('authorTypeMapper', {\n unknown: AuthorTypeOptionsWithRealtor.UNKNOWN,\n owner: AuthorTypeOptionsWithRealtor.OWNER,\n agency: AuthorTypeOptionsWithRealtor.AGENCY,\n developer: AuthorTypeOptionsWithRealtor.DEVELOPER,\n partner: AuthorTypeOptionsWithRealtor.PARTNER,\n realtor: AuthorTypeOptionsWithRealtor.REALTOR,\n pit: AuthorTypeOptionsWithRealtor.PIT\n} as const);\n","import { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { SeoMapper } from '@search/router/src';\n\nexport const categoryTypeMapper = new SeoMapper('categoryTypeMapper', {\n kvartiru: RealtyObjectType.FLAT,\n komnatu: RealtyObjectType.ROOM,\n unknown: RealtyObjectType.UNKNOWN,\n uchastok: RealtyObjectType.LAND,\n dom: RealtyObjectType.HOUSE,\n usadba: RealtyObjectType.COUNTRY_ESTATE,\n 1: RealtyObjectType.FLAT,\n 2: RealtyObjectType.ROOM\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { DealType } from '@search/filter-enums/enums/DealType';\n\nexport const dealTypeMapper = new SeoMapper('dealTypeMapper', {\n kupit: DealType.SELL,\n snyat: DealType.RENT,\n UNKNOWN: DealType.UNKNOWN,\n // impl_not_set: DealType.UNKNOWN\n} as const);\n","import { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { SeoMapper } from '@search/router/src';\n\nexport const newBuildingMapper = new SeoMapper('newBuildingMapper', {\n new: NewBuilding.NEW,\n second: NewBuilding.SECOND,\n unknown: NewBuilding.UNKNOWN\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { Renovation } from '@search/filter-enums/enums/Renovation';\n\nexport const renovationMapper = new SeoMapper('renovation', {\n unknown: Renovation.UNKNOWN,\n euro: Renovation.EURO,\n cosmeticheskii: Renovation.COSMETIC,\n disainerskii: Renovation.DESIGNED,\n 'nujen-remont': Renovation.NEED,\n 'net-remonta': Renovation.NONE\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\n\nexport const roomMapper = new SeoMapper('roomMapper', {\n unknown: Rooms.UNKNOWN,\n studiya: Rooms.STUDIO,\n '1-komnata': Rooms.ROOM_1,\n '2-komnaty': Rooms.ROOM_2,\n '3-komnaty': Rooms.ROOM_3,\n '4-komnaty': Rooms.ROOM_4,\n '5-komnat_i_bolee': Rooms.ROOM_5_AND_MORE,\n 'svobodnaya-planirovka': Rooms.OPEN_PLAN\n // 'hz-planirovka': 8\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { SellType } from '@search/filter-enums/enums/SellType';\n\nexport const sellTypeMapper = new SeoMapper('sellTypeMapper', {\n unknown: SellType.UNKNOWN,\n secondary_primary: SellType.SECONDARY_PRIMARY,\n secondary: SellType.SECONDARY,\n primary_reassignment: SellType.PRIMARY_REASSIGNMENT,\n primary: SellType.PRIMARY,\n alternative: SellType.ALTERNATIVE\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const bathroomMapper = new SeoMapper('bathroomMapper', {\n 'razdelnyj-sanuzel': 'PARTED',\n 'sovmeshhennyj-sanuzel': 'COMBINED',\n 'hz-kakoi-sanuzel': 'UNKNOWN',\n 'neskolko-sanuzlov': 'SEVERAL'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const wallsMapper = new SeoMapper('wallsMapper', {\n UNKNOWN: 'UNKNOWN',\n MONOLITH: 'MONOLITH',\n BRICK_MONOLITH: 'BRICK_MONOLITH',\n BRICK: 'BRICK',\n PANEL: 'PANEL',\n BLOCK: 'BLOCK',\n WOOD: 'WOOD'\n} as const);\n","// import { Bathroom } from '../../view/enums/Bathroom';\nimport { SeoMapper } from '@search/router/src';\n\nexport const livingFacilityMapper = new SeoMapper('livingFacilityMapper', {\n UNKNOWN: 'UNKNOWN',\n INTERNET: 'INTERNET',\n WASHING_MACHINE: 'WASHING_MACHINE',\n FRIDGE: 'FRIDGE',\n DISHWASHER: 'DISHWASHER',\n AIR_CONDITIONER: 'AIR_CONDITIONER',\n TV: 'TV',\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const furnitureMapper = new SeoMapper('furnitureMapper', {\n UNKNOWN: 'UNKNOWN',\n NO: 'NO',\n KITCHEN: 'KITCHEN',\n ALL: 'ALL'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const bankPledgeMapper = new SeoMapper('bankPledgeMapper', {\n 'v-zaloge': 'IN_PLEDGE',\n notInPledge: 'NOT_IN_PLEDGE',\n unknown: 'UNKNOWN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const layoutImageMapper = new SeoMapper('layoutImageMapper', {\n HAS_ANY: 'HAS_ANY',\n UNKNOWN: 'UNKNOWN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const buildEpochMapper = new SeoMapper('buildEpochMapper', {\n unknown: 'UNKNOWN',\n stalin: 'STALIN',\n brezhnev: 'BREZHNEV',\n khrushchev: 'KHRUSHCHEV'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const finishingMapper = new SeoMapper('finishingMapper', {\n UNKNOWN: 'UNKNOWN',\n WITHOUT_FINISHING: 'WITHOUT_FINISHING',\n PRE_FINISHING: 'PRE_FINISHING',\n FINE: 'FINE',\n WITH_FURNITURE: 'WITH_FURNITURE'\n} as const);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { SeoMapper } from '@search/router/src/schema/SeoMapper';\nimport { BuildingClass } from '@search/filter-enums/enums/BuildingClass';\nimport { WallsTypeString } from '@search/filter-enums/enums/WallsType';\nimport { FloorConstraintsString } from '@search/filter-enums/enums/FloorConstraints';\nimport { FinishingEnum, FinishingTypeEnum, FinishingFlatEnum } from '@search/filter-enums/gql/schema-types-fix';\nimport { IsApartmentsOptionsString } from '@search/filter-enums/enums/IsApartmentsOptions';\nimport { ParkingTypeString } from '@search/filter-enums/enums/ParkingType';\nimport { CeilingHeightString } from '@search/filter-enums/enums/CeilingHeight';\nimport { FlatsSpecialEventString } from '@search/filter-enums/enums/SpecialEvents';\n\nexport const YES = 'YES';\n\nexport const roomMapper = new SeoMapper('roomsMapper', {\n studii: 'STUDIO',\n '1-komnatnye': 'ROOM_1',\n '2-komnatnye': 'ROOM_2',\n '3-komnatnye': 'ROOM_3',\n '4-komnatnye': 'ROOM_4',\n '5-komnatnye-i-bolee': 'ROOM_5_AND_MORE',\n 'so-svobodnoy-planirovkoy': 'OPEN_PLAN'\n} as const);\n\nexport const quarterMapper = new SeoMapper('quarterMapper', {\n UNKNOWN: 0,\n FIRST: 1,\n SECOND: 2,\n THIRD: 3,\n FOURTH: 4\n} as const);\n\nexport const finishingFlatMapper = new SeoMapper('finishingFlatMapper', {\n '': FinishingFlatEnum.NotRelevant,\n YES: FinishingFlatEnum.Available,\n NO: FinishingFlatEnum.NotAvailable\n} as const);\n\n// eslint-disable-next-line max-len\nexport const sOtdelkoySeoValue = [ FinishingTypeEnum.Fine, FinishingTypeEnum.PreFinishing, FinishingTypeEnum.WithFurniture ];\n\nexport const finishingMapper = new SeoMapper('finishingMapper', {\n '': FinishingEnum.NotRelevant,\n 's-otdelkoy': FinishingEnum.Available,\n 'bez-otdelki': FinishingEnum.NotAvailable // оставляем, т.к. такое ЧПУ ещё существует и нам нужно учитывать этот ключ\n} as const);\n\nexport const finishingTypeMapper = new SeoMapper('finishingTypeMapper', {\n chistovaya: FinishingTypeEnum.Fine,\n 's-mebelyu': FinishingTypeEnum.WithFurniture,\n 'pod-klyuch': FinishingTypeEnum.Fine, // заменяем на чистовую, т.к. такого фильтра больше нет, но ЧПУ может встречаться\n '': FinishingTypeEnum.PreFinishing,\n 'bez-otdelki': FinishingTypeEnum.WithoutFinishing // для ts\n} as const);\n\nexport const buildingClassMapper = new SeoMapper('buildingClassMapper', {\n biznes: BuildingClass.BUSINESS,\n komfort: BuildingClass.COMFORT,\n 'komfort-plus': BuildingClass.COMFORT_PLUS,\n ekonom: BuildingClass.ECONOMY,\n elitnyy: BuildingClass.ELITE\n});\n\nexport const wallsTypeMapper = new SeoMapper('wallsTypeMapper', {\n kirpichnye: WallsTypeString.BRICK,\n monolitnye: WallsTypeString.MONOLITH,\n 'kirpichno-monolitnye': WallsTypeString.BRICK_MONOLITH,\n panelnye: WallsTypeString.PANEL,\n blochnye: WallsTypeString.BLOCK\n});\n\nexport const floorLastMapper = new SeoMapper('floorLastMapper', {\n 'na-poslednem-etazhe': FloorConstraintsString.ONLY,\n 'ne-na-poslednem-etazhe': FloorConstraintsString.EXCLUDE\n});\n\nexport const law214Mapper = new SeoMapper('law214Mapper', {\n '214-fz': YES\n});\n\nexport const escrowMapper = new SeoMapper('escrowMapper', {\n 'eskrou-scheta': YES\n});\n\nexport const armyMortgageMapper = new SeoMapper('armyMortgageMapper', {\n 'voennaya-ipoteka': YES\n});\n\nexport const installmentMapper = new SeoMapper('installmentMapper', {\n 'v-rassrochku': YES\n});\n\nexport const commissioningMapper = new SeoMapper('commissioningMapper', {\n sdan: 'COMMISSIONED',\n stroitsya: 'IN_PROGRESS',\n lyuboy: 'UNKNOWN'\n});\n\nexport const newBuildingTypes = [ 'zhk', 'zhiloi-raion', 'apart-kompleks', 'apart-otel', 'kvartal',\n 'loft', 'mfk', 'rezidentsiya', 'mikroraion', 'dom', 'klubnii-dom' ];\nexport const newBuildingTypeMapper = new SeoMapper('newBuildingTypeMapper', {\n zhk: 'zhk',\n 'zhiloi-raion': 'zhiloi-raion',\n 'apart-kompleks': 'apart-kompleks',\n 'apart-otel': 'apart-otel',\n kvartal: 'kvartal',\n loft: 'loft',\n mfk: 'mfk',\n rezidentsiya: 'rezidentsiya',\n mikroraion: 'mikroraion',\n dom: 'dom',\n 'klubnii-dom': 'klubnii-dom'\n} as const);\n\nexport const developerAppLandingMapper = new SeoMapper('developerAppLandingMapper', {\n 'samolet-app': 'samolet',\n} as const);\n\nexport const developerLandingMapper = new SeoMapper('developerLandingMapper', {\n samolet: 114,\n} as const);\n\nexport const priceMaxMapper = new SeoMapper('priceMaxMapper', {\n 'do-1-mln-rub': 1e6,\n 'do-1,5-mln-rub': 1.5e6,\n 'do-2-mln-rub': 2e6,\n 'do-3-mln-rub': 3e6,\n 'do-3,5-mln-rub': 3.5e6,\n 'do-4-mln-rub': 4e6,\n 'do-5-mln-rub': 5e6,\n 'do-6-mln-rub': 6e6,\n 'do-7-mln-rub': 7e6,\n 'do-8-mln-rub': 8e6,\n 'do-10-mln-rub': 10e6,\n 'do-15-mln-rub': 15e6,\n 'do-20-mln-rub': 20e6\n});\n\nexport const pricePerMeterMaxMapper = new SeoMapper('pricePerMeterMaxMapper', {\n '100000-rub-za-m2': 100e3,\n '150000-rub-za-m2': 150e3,\n '200000-rub-za-m2': 200e3,\n '250000-rub-za-m2': 250e3\n});\n\nexport const cheapMapper = new SeoMapper('cheapMapper', {\n deshevyye: 8e6\n});\n\nexport const closeToMetroMapper = new SeoMapper('closeToMetroMapper', {\n 'ryadom-s-metro': 'FOOT|MAX_20_MINUTES'\n});\n\nexport const closedAreaMapper = new SeoMapper('closedAreaMapper', {\n 's-zakrytoj-territoriej': YES\n});\n\nexport const conciergeMapper = new SeoMapper('conciergeMapper', {\n 's-konserzhem': YES\n});\n\nexport const balconyMapper = new SeoMapper('balconyMapper', {\n 's-balkonom': YES\n});\n\nexport const motherCapitalMapper = new SeoMapper('motherCapitalMapper', {\n 'materinskij-kapital': YES\n});\n\nexport const parkingMapper = new SeoMapper('parkingMapper', {\n 'parkovka-podzemnaya': ParkingTypeString.UNDERGROUND,\n 's-parkovkoi': ParkingTypeString.AVAILABLE,\n 'parkovka-zakrytaya': ParkingTypeString.CLOSED,\n 'parkovka-otkrytaya': ParkingTypeString.OPEN\n});\n\nexport const apartmentsMapper = new SeoMapper('apartmentsMapper', {\n apartamenty: IsApartmentsOptionsString.APARTMENTS_ONLY,\n 'bez-apartamentov': IsApartmentsOptionsString.NO_APARTMENTS\n});\n\nexport const ceilingHeightMapper = new SeoMapper('ceilingHeightMapper', {\n 'vysokie-potolki': CeilingHeightString.FROM_3\n});\n\nexport const kitchenAreaRangeMinMapper = new SeoMapper('kitchenAreaRangeMinMapper', {\n 'bolshaya-kukhnya': 15\n});\n\nexport const euroPlanningMapper = new SeoMapper('euroPlanningMapper', {\n evrodvushki: 'ROOM_1|17',\n evrotreshki: 'ROOM_2|17'\n});\n\nexport const flatsSpecialEventMapper = new SeoMapper('flatsSpecialEventMapper', {\n 'po-skidke': FlatsSpecialEventString.FLAT_DISCOUNT,\n 'na-starte-prodazh': FlatsSpecialEventString.FLAT_SALES_START\n});\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskMetroBranchMapper = new SeoMapper('mskMetroLinesMapper', {\n 'kaluzhsko-rizhskaya': 158,\n zamoskvoretskaya: 58,\n 'serpukhovsko-timiryazevskaya': 264,\n 'arbatsko-pokrovskaya': 101,\n 'tagansko-krasnopresnenskaya': 155,\n 'lyublinsko-dmitrovskaya': 271,\n solncevskaya: 234,\n sokolnicheskaya: 4,\n mck: 305,\n 'mcd-1': 169286,\n 'mcd-2': 169288\n} as const);\n\nexport const stationsIdsByBranchSeo = new Map([\n [\n 'zamoskvoretskaya',\n [ 59, 62, 98, 96, 94, 91, 92, 89, 84, 83, 80, 14571, 79, 77, 76, 75, 74, 73, 72, 71, 69, 67, 65, 64 ]\n ],\n [\n 'sokolnicheskaya',\n [ 1842, 56, 54, 51, 49, 44, 43, 41, 39, 36, 35, 34, 33, 31, 28, 25, 24, 22, 21, 19, 18, 14, 12, 11, 9, 5 ]\n ],\n [\n 'serpukhovsko-timiryazevskaya',\n [ 299, 298, 296, 294, 293, 291, 290, 288, 287, 285, 284, 283, 282,\n 281, 280, 279, 278, 277, 275, 274, 272, 270, 268, 267, 265 ]\n ],\n [\n 'kaluzhsko-rizhskaya',\n [ 200, 199, 197, 194, 191, 189, 188, 186, 184, 181, 3500, 152,\n 180, 179, 178, 177, 159, 176, 174, 172, 170, 168, 166, 163 ]\n ],\n [\n 'arbatsko-pokrovskaya',\n [ 129, 130, 131, 133, 134, 136, 137, 138, 14568, 14567, 128,\n 123, 102, 105, 106, 107, 110, 112, 114, 118, 120, 117 ]\n ],\n [\n 'tagansko-krasnopresnenskaya',\n [ 230, 229, 228, 226, 224, 222, 220, 217, 216, 156, 215, 214,\n 213, 179, 212, 211, 1067, 210, 208, 207, 205, 203, 201 ]\n ],\n [\n 'lyublinsko-dmitrovskaya',\n [ 169312, 169345, 169350, 331, 330, 328, 327, 324, 322, 321, 319, 318, 317,\n 316, 315, 314, 313, 312, 311, 309, 307, 6478, 3227, 303, 301, 272 ]\n ],\n [\n 'solncevskaya',\n [ 169341, 169321, 235, 238, 240, 242, 244,\n 246, 248, 249, 250, 251, 120, 253 ]\n ],\n [\n 'mck',\n [ 14593, 7450, 944, 4286, 4633, 6474, 14596, 14595, 8431, 1095, 3890, 14594,\n 1191, 8240, 8954, 14598, 7772, 1899, 14597, 306, 2155, 726,\n 4695, 3483, 4644, 2630, 2603, 145, 332, 3192, 270 ]\n ],\n [\n 'mcd-1',\n [ 169374, 169362, 169348, 169292, 169287, 169330, 169296, 118,\n 169366, 169336, 169379, 169382, 274, 169291, 169327, 169322, 169364,\n 169343, 169365, 169357, 169381, 169376, 169298, 169358, 211 ]\n ],\n [\n 'mcd-2',\n [ 169302, 169289, 169361, 169340, 169303, 169306, 169307, 169331, 169373,\n 169319, 926048, 169359, 169294, 169311, 169324, 169368, 169300, 169349,\n 169325, 169353, 578220, 169309, 169372, 169371, 169308, 169315, 169314,\n 169380, 169290, 169297, 169333, 309, 3483, 319, 220, 1095, 129 ]\n ],\n]);\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblCity = {\n balashikha: 511,\n dubna: 6152,\n aprelevka: 2345,\n bronnitsy: 1581,\n vidnoe: 700,\n volokolamsk: 8342,\n voskresensk: 4299,\n vysokovsk: 8022,\n golitsyno: 7628,\n dedovsk: 4124,\n dzerzhinskiy: 8923,\n dmitrov: 3280,\n dolgoprudniy: 811,\n domodedovo: 949,\n drezna: 32255,\n egorevsk: 23338,\n zhukovskiy: 778,\n zvenigorod: 971,\n ivanteevka: 482,\n istra: 2775,\n kashira: 1220,\n klin: 4068,\n kolomna: 460996,\n korolyov: 526,\n kotelniki: 232,\n krasnoarmeysk: 3986,\n krasnogorsk: 643,\n krasnozavodsk: 15489,\n krasnoznamensk: 16975,\n kubinka: 46933,\n 'likino-dulyovo': 19625,\n lobnya: 498,\n 'losino-petrovskiy': 6082,\n lukhovitsy: 31429,\n lytkarino: 806,\n lyubertsy: 571,\n mozhaisk: 6417,\n mytischi: 516,\n 'naro-fominsk': 7784,\n noginsk: 4901,\n odintsovo: 1324,\n ozyory: 20877,\n 'orekhovo-zuevo': 9142,\n 'pavlovskiy-posad': 31812,\n podolsk: 1078,\n protvino: 76951,\n pushkino: 488335,\n puschino: 8204,\n ramenskoe: 629,\n reutov: 830,\n ruza: 7512,\n 'sergiev-posad': 1680,\n serpukhov: 3290,\n solnechnogorsk: 1723,\n 'staraya-kupavna': 1440,\n stupino: 8488,\n taldom: 499,\n fryazino: 617,\n khimki: 544,\n khotkovo: 7576,\n chekhov: 2359,\n shatura: 8461,\n schyolkovo: 601,\n elektrogorsk: 77408,\n elektrostal: 3436,\n yakhroma: 1649\n};\n\nexport const mskCity = {\n 'novaya-moskva': 141530\n};\n\nexport const mskCityMapper = new SeoMapper('mskCityMapper', {\n ...mskOblCity,\n ...mskCity\n});\n\nexport const mskOblCityIds = Object.values(mskOblCity);\nexport const mskCityIds = Object.values(mskCity) as number[];\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblDistrict = {\n 'istra-gorodskoi': 948,\n 'bogorodskii-gorodskoi': 1438,\n 'volokolamskii-gorodskoi': 1075,\n 'dmitrovskii-gorodskoi': 921,\n 'kolomenskii-gorodskoi': 460995,\n 'leninskii-gorodskoi': 608,\n 'mozhaiskii-gorodskoi': 1235,\n 'naro-fominskii-gorodskoi': 1474,\n 'odintsovskii-gorodskoi': 487,\n 'orekhovo-zuevskii-gorodskoi': 2394,\n 'pushkinskii-gorodskoi': 488334,\n 'ramenskii-gorodskoi': 600,\n 'ruzskii-gorodskoi': 578,\n 'sergievo-posadskii-gorodskoi': 1156,\n 'taldomskii-gorodskoi': 497,\n 'balashikha-gorodskoi': 510,\n 'bronnitsi-gorodskoi': 1580,\n 'vlasikha-gorodskoi': 2764,\n 'voskresensk-gorodskoi': 3011,\n 'voskhod-gorodskoi': 14540,\n 'dzerzhinskii-gorodskoi': 8922,\n 'dolgoprudnii-gorodskoi': 809,\n 'domodedovo-gorodskoi': 947,\n 'dubna-gorodskoi': 6151,\n 'yegorevsk-gorodskoi': 9000,\n 'zhukovskii-gorodskoi': 777,\n 'zaraisk-gorodskoi': 8701,\n 'zvyozdnii-gorodok-gorodskoi': 14543,\n 'ivanteevka-gorodskoi': 481,\n 'kashira-gorodskoi': 1219,\n 'klin-gorodskoi': 1596,\n 'korolyov-gorodskoi': 525,\n 'kotelniki-gorodskoi': 231,\n 'krasnoarmeisk-gorodskoi': 3985,\n 'krasnogorsk-gorodskoi': 109,\n 'krasnoznamensk-gorodskoi': 4069,\n 'lobnya-gorodskoi': 495,\n 'losino-petrovskii-gorodskoi': 565,\n 'lotoshino-gorodskoi': 4104,\n 'lukhovitsi-gorodskoi': 14545,\n 'litkarino-gorodskoi': 805,\n 'lyubertsy-gorodskoi': 534,\n 'molodyozhnii-gorodskoi': 14546,\n 'mytischi-gorodskoi': 500,\n 'ozyori-gorodskoi': 14547,\n 'pavlovskii-posad-gorodskoi': 4049,\n 'podolsk-gorodskoi': 1077,\n 'protvino-gorodskoi': 14548,\n 'pushchino-gorodskoi': 8203,\n 'reutov-gorodskoi': 828,\n 'roshal-gorodskoi': 14550,\n 'serebryanie-prudi-gorodskoi': 6190,\n 'serpukhov-gorodskoi': 2805,\n 'solnechnogorsk-gorodskoi': 686,\n 'stupino-gorodskoi': 2940,\n 'fryazino-gorodskoi': 616,\n 'khimki-gorodskoi': 543,\n 'chernogolovka-gorodskoi': 2472,\n 'chekhov-gorodskoi': 1167,\n 'shatura-gorodskoi': 8460,\n 'shakhovskaya-gorodskoi': 1697,\n 'shchyolkovo-gorodskoi': 599,\n 'elektrogorsk-gorodskoi': 14551,\n 'elektrostal-gorodskoi': 3435\n} as const;\n\nexport const mskSpecialDistricts = {\n 'zelenogradskii-administrativnii': 381\n} as const;\n\nexport const mskDistrict = {\n ...mskSpecialDistricts,\n 'vostochnii-administrativnii': 7,\n 'zapadnii-administrativnii': 37,\n 'novomoskovskii-administrativnii': 45,\n 'severnii-administrativnii': 60,\n 'severo-vostochnii-administrativnii': 164,\n 'severo-zapadnii-administrativnii': 103,\n 'troitskii-administrativnii': 414,\n 'tsentralnii-administrativnii': 15,\n 'yugo-vostochnii-administrativnii': 218,\n 'yugo-zapadnii-administrativnii': 182,\n 'yuzhnii-administrativnii': 81\n} as const;\n\nexport const mskDistrictMapper = new SeoMapper('mskDistrictMapper', {\n ...mskOblDistrict,\n ...mskDistrict\n} as const);\n\nexport const mskOblDistrictIds = Object.values(mskOblDistrict);\nexport const mskDistrictIds = Object.values(mskDistrict);\n","import { SeoMapper } from '@search/router/src';\nimport { dedupeValues } from '../../dedupeValues';\n\nexport const mskOblMetroStation = {\n myakinino: 107\n} as const;\n\nexport const mskMetroStation = {\n aeroport: 71,\n akademicheskaya: 184,\n 'aleksandrovskii-sad': 151,\n alekseevskaya: 174,\n 'alma-atinskaya': 98,\n altufevo: 265,\n aminevskaya: 169305,\n andronovka: 3890,\n anikeevka: 169290,\n annino: 298,\n arbatskaya: 14567,\n arbatskaya2: 126,\n aviamotornaya: 256,\n aviamotornaya2: 256,\n 'aviamotornaya-2': 169339,\n 'aviamotornaya-3': 501821,\n avtozavodskaya: 14596,\n avtozavodskaya2: 80,\n babushkinskaya: 166,\n bagrationovskaya: 143,\n bakovka: 169362,\n balakovka: 169362,\n baltiiskaya: 4695,\n barrikadnaya: 213,\n baumanskaya: 130,\n begovaya: 211,\n 'begovaya-2': 169355,\n belokamennaya: 7772,\n belomorskaya: 62,\n belorusskaya: 73,\n belorusskaya2: 169379,\n 'belorusskaya-3': 14576,\n belyaevo: 191,\n beskudnikovo: 169322,\n bibirevo: 267,\n 'biblioteka-imeni-lenina': 25,\n bittsa: 169306,\n 'bittsevskii-park': 341,\n borisovo: 328,\n borovitskaya: 281,\n 'borovskoe-shosse': 240,\n 'botanicheskii-sad': 14597,\n 'botanicheskii-sad2': 170,\n bratislavskaya: 324,\n 'bulvar-admirala-ushakova': 346,\n 'bulvar-dmitriya-donskogo': 299,\n 'bulvar-rokossovskogo': 14598,\n 'bulvar-rokossovskogo2': 5,\n 'buninskaya-alleya': 348,\n 'buninskaya-alleya-2': 285747,\n butirskaya: 307,\n butovo: 169303,\n chekhovskaya: 280,\n cherkizovskaya: 9,\n chertanovskaya: 291,\n 'chistie-prudi': 21,\n chkalovskaya: 314,\n davidkovo: 169285,\n degunino: 169327,\n 'delovoi-tsentr': 14593,\n 'delovoi-tsentr2': 253,\n 'delovoi-tsentr-3': 495007,\n depo: 169294,\n dinamo: 72,\n dmitrovskaya: 275,\n dmitrovskaya2: 169333,\n dobrininskaya: 154,\n dolgoprudnaya: 169357,\n domodedovskaya: 94,\n dostoevskaya: 311,\n dubrovka: 14595,\n dubrovka2: 317,\n elektrozavodskaya: 131,\n 'elektrozavodskaya-2': 169342,\n 'elektrozavodskaya-3': 487162,\n 'filatov-lug': 51,\n fili: 144,\n fili2: 169366,\n 'filyovskii-park': 141,\n fiztekh: 169350,\n fonvizinskaya: 6478,\n frunzenskaya: 33,\n govorovo: 244,\n grazhdanskaya: 169325,\n izmailovo: 8240,\n izmailovskaya: 136,\n kakhovskaya: 339,\n 'kakhovskaya-2': 169375,\n kalanchyovskaya: 169300,\n kalitniki: 169324,\n kaluzhskaya: 189,\n kantemirovskaya: 89,\n kashirskaya: 14571,\n khlebnikovo: 169376,\n khoroshyovo: 2603,\n khoroshyovskaya: 333,\n 'khoroshyovskaya-2': 14587,\n khovrino: 59,\n kievskaya: 123,\n 'kievskaya-2': 14569,\n 'kievskaya-3': 14575,\n 'kitai-gorod': 179,\n 'kitai-gorod-2': 14589,\n 'klenovii-bulvar': 169367,\n kolomenskaya: 84,\n kommunarka: 1842,\n komsomolskaya: 18,\n 'komsomolskaya-2': 14581,\n konkovo: 194,\n koptevo: 726,\n kosino: 351,\n kotelniki: 230,\n kozhukhovskaya: 318,\n 'krasnie-vorota': 19,\n 'krasnii-baltiets': 169353,\n 'krasnii-stroitel': 169307,\n krasnogorskaya: 169314,\n krasnogvardeiskaya: 96,\n krasnopresnenskaya: 162,\n krasnoselskaya: 14,\n 'krestyanskaya-zastava': 316,\n krilatskoe: 112,\n krimskaya: 4286,\n kropotkinskaya: 28,\n kubanskaya: 169311,\n kuntsevskaya: 117,\n kuntsevskaya2: 169296,\n 'kuntsevskaya-3': 14590,\n 'kuntsevskaya-4': 169301,\n kurskaya: 129,\n 'kurskaya-2': 169310,\n 'kurskaya-3': 14574,\n kutuzovskaya: 145,\n 'kutuzovskaya-2': 14592,\n kuzminki: 222,\n 'kuznetskii-most': 215,\n lefortovo: 269422,\n 'lefortovo-2': 169326,\n 'leninskii-prospekt': 181,\n 'lermontovskii-prospekt': 228,\n lesoparkovaya: 342,\n lianozovo: 169345,\n lianozovo2: 169364,\n likhobori: 2155,\n lobnya: 169358,\n lokomotiv: 8954,\n 'lomonosovskii-prospekt': 250,\n lubyanka: 22,\n lukhmanovskaya: 355,\n luzhniki: 7450,\n lyublino: 322,\n 'marina-roshcha': 309,\n 'marina-roshcha-2': 169332,\n marino: 327,\n mark: 169343,\n marksistskaya: 254,\n mayakovskaya: 74,\n medvedkovo: 163,\n mendeleevskaya: 278,\n mezhdunarodnaya: 147,\n 'michurinskii-prospekt': 248,\n 'michurinskii-prospekt-2': 169317,\n minskaya: 251,\n mitino: 105,\n mnyovniki: 169316,\n molodyozhnaya: 114,\n 'moskva-tovarnaya': 169368,\n 'moskva-tovarnaya-2': 235038,\n moskvoreche: 169319,\n nagatinskaya: 285,\n 'nagatinskii-zaton': 169304,\n nagornaya: 287,\n nakhabino: 169297,\n 'nakhimovskii-prospekt': 288,\n 'narodnoe-opolchenie': 169383,\n nekrasovka: 356,\n nemchinovka: 169292,\n nizhegorodskaya: 3192,\n 'nizhegorodskaya-2': 169351,\n 'nizhegorodskaya-3': 169335,\n novatorskaya: 169313,\n 'novie-cheryomushki': 188,\n novodachnaya: 169365,\n novogireevo: 261,\n novokhokhlovskaya: 1095,\n 'novokhokhlovskaya-2': 169352,\n novokosino: 262,\n novokuznetskaya: 77,\n novoperedelkino: 238,\n novoslobodskaya: 161,\n novoyasenevskaya: 200,\n odintsovo: 169374,\n 'okhotnii-ryad': 24,\n okruzhnaya: 3227,\n okruzhnaya2: 169291,\n okruzhnaya3: 306,\n okskaya: 169360,\n oktyabrskaya: 152,\n 'oktyabrskaya-2': 14573,\n 'oktyabrskoe-pole': 210,\n olkhovaya: 56,\n opalikha: 169380,\n orekhovo: 92,\n ostafevo: 169361,\n otradnoe: 268,\n ozyornaya: 246,\n panfilovskaya: 4644,\n 'park-kulturi': 31,\n 'park-kulturi-2': 14582,\n 'park-pobedi': 120,\n 'park-pobedi-2': 14583,\n partizanskaya: 134,\n paveletskaya: 79,\n 'paveletskaya-2': 14570,\n pavshino: 169315,\n pechatniki: 319,\n 'pechatniki-2': 169338,\n 'pechatniki-3': 169354,\n penyagino: 169308,\n pererva: 169359,\n perovo: 259,\n pervomaiskaya: 137,\n 'petrovskii-park': 337,\n 'petrovskii-park-2': 14586,\n 'petrovsko-razumovskaya': 272,\n 'petrovsko-razumovskaya-2': 14579,\n pikhtino: 169321,\n pionerskaya: 140,\n planernaya: 201,\n 'ploshchad-gagarina': 944,\n 'ploshchad-ilicha': 255,\n 'ploshchad-revolyutsii': 128,\n podolsk: 169302,\n pokrovskoe: 169331,\n 'pokrovskoe-streshnevo': 169347,\n polezhaevskaya: 1067,\n polyanka: 282,\n novomoskovskaya: 169370,\n prazhskaya: 294,\n 'preobrazhenskaya-ploshchad': 11,\n profsoyuznaya: 186,\n prokshino: 54,\n proletarskaya: 216,\n 'prospekt-mira': 159,\n 'prospekt-mira-2': 14577,\n 'prospekt-vernadskogo': 39,\n 'prospekt-vernadskogo-2': 169299,\n pushkinskaya: 214,\n 'pyatnitskoe-shosse': 102,\n 'rabochii-posyolok': 169330,\n ramenki: 249,\n rasskazovka: 235,\n 'rechnoi-vokzal': 64,\n rimskaya: 315,\n rizhskaya: 176,\n 'rizhskaya-2': 169349,\n 'rizhskaya-3': 169346,\n rostokino: 1899,\n rumyantsevo: 44,\n 'ryazanskii-prospekt': 224,\n salarevo: 49,\n savyolovskaya: 277,\n savyolovskaya2: 169382,\n 'savyolovskaya-3': 14584,\n 'savyolovskaya-4': 14580,\n seligerskaya: 301,\n semyonovskaya: 133,\n serpukhovskaya: 283,\n setun: 169287,\n sevastopolskaya: 290,\n shabolovskaya: 3500,\n shcherbinka: 169340,\n shchukinskaya: 208,\n 'shchukinskaya-2': 578220,\n shchyolkovskaya: 138,\n shelepikha: 332,\n 'shelepikha-2': 1217,\n 'shelepikha-3': 14585,\n sheremetevskaya: 169298,\n shipilovskaya: 330,\n 'shosse-entuziastov': 14594,\n 'shosse-entuziastov2': 258,\n silikatnaya: 169289,\n skhodnenskaya: 203,\n skolkovo: 169348,\n 'slavyanskii-bulvar': 118,\n 'slavyanskii-bulvar-2': 169328,\n smolenskaya: 14568,\n smolenskaya2: 124,\n sokol: 69,\n 'sokolinaya-gora': 1191,\n sokolniki: 12,\n 'sokolniki-2': 169295,\n solntsevo: 242,\n spartak: 207,\n sportivnaya: 34,\n 'sretenskii-bulvar': 313,\n stakhanovskaya: 169377,\n streshnevo: 3483,\n 'streshnevo-2': 169378,\n strogino: 110,\n studencheskaya: 146,\n sukharevskaya: 177,\n sviblovo: 168,\n taganskaya: 156,\n 'taganskaya-2': 14578,\n teatralnaya: 76,\n tekhnopark: 83,\n tekstilshchiki: 220,\n 'tekstilshchiki-2': 169363,\n 'tekstilshchiki-3': 169356,\n terekhovo: 169334,\n testovskaya: 169336,\n timiryazevskaya: 274,\n timiryazevskaya2: 169318,\n tretyakovskaya: 180,\n 'tretyakovskaya-2': 14572,\n trikotazhnaya: 169372,\n troparyovo: 43,\n trubnaya: 312,\n tsaritsino: 91,\n tsaritsino2: 169373,\n tsska: 335,\n 'tsska-2': 14588,\n 'tsvetnoi-bulvar': 279,\n tulskaya: 284,\n turgenevskaya: 178,\n tushinskaya: 205,\n tushinskaya2: 169309,\n tverskaya: 75,\n 'tyoplii-stan': 197,\n ugreshskaya: 8431,\n 'ulitsa-1905-goda': 212,\n 'ulitsa-800-letiya-moskvi': 169312,\n 'ulitsa-akademika-yangelya': 296,\n 'ulitsa-dmitrievskogo': 352,\n 'ulitsa-gorchakova': 347,\n 'ulitsa-skobelevskaya': 344,\n 'ulitsa-starokachalovskaya': 343,\n universitet: 36,\n varshavskaya: 169344,\n 'varshavskaya-2': 338,\n vdnkh: 172,\n 'verkhnie-kotli': 4633,\n 'verkhnie-likhobori': 303,\n vikhino: 226,\n vistavochnaya: 150,\n vladikino: 270,\n 'vladikino-2': 14591,\n vnukovo: 169341,\n 'vodnii-stadion': 65,\n vodniki: 169381,\n voikovskaya: 67,\n 'volgogradskii-prospekt': 217,\n volokolamskaya: 106,\n volokolamskaya2: 169371,\n volzhskaya: 321,\n 'vorobyovi-gori': 35,\n voroncovskaya: 427507,\n voroncovskaya2: 408984,\n yasenevo: 199,\n 'yugo-vostochnaya': 169293,\n 'yugo-zapadnaya': 41,\n yuzhnaya: 293,\n zhulebino: 229,\n zil: 6474,\n zorge: 2630,\n zyablikovo: 331,\n zyuzino: 169329\n} as const;\n\nexport const mskMetroMapper = new SeoMapper('mskMetroMapper', {\n ...mskOblMetroStation,\n ...mskMetroStation\n} as const);\n\nexport const mskOblMetroIds = dedupeValues(mskOblMetroStation);\nexport const mskMetroIds = dedupeValues(mskMetroStation);\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblRayon = {} as const;\n\nexport const mskRayon = {\n bogorodskoe: 8,\n sokolniki: 13,\n golovinskiy: 66,\n aeroport: 70,\n brateevo: 99,\n tsaritsino: 90,\n 'moskvoreche-saburovo': 88,\n 'fili-davidkovo': 119,\n mitino: 104,\n filyovskiy_park: 142,\n taganskiy: 157,\n meschanskiy: 160,\n kuzminki: 223,\n solntsevo: 243,\n ostankinskiy: 173,\n cheryomushki: 187,\n zyuzino: 289,\n beskudnikovskiy: 302,\n chertanovo_severnoe: 292,\n marina_roscha: 310,\n pechatniki: 320,\n khoroshyovskiy: 334,\n veshnyaki: 364,\n vostochnoe_izmailovo: 368,\n koptevo: 379,\n savyolki: 403,\n yuzhnoe_medvedkovo: 411,\n preobrazhenskoe: 10,\n basmannyi: 20,\n khovrino: 61,\n strogino: 111,\n severnoe_izmailovo: 139,\n presnenskiy: 148,\n severnoe_tushino: 202,\n tekstilschiki: 221,\n lefortovo: 257,\n 'ochakovo-matveevskoe': 247,\n severnoe_medvedkovo: 165,\n babushkinskiy: 167,\n alekseevskiy: 175,\n akademicheskiy: 185,\n rostokino: 171,\n konkovo: 192,\n chertanovo_yuzhnoe: 297,\n severnoe_butovo: 300,\n yuzhnoe_butovo: 345,\n nekrasovka: 357,\n altufevskiy: 359,\n biryulyovo_vostochnoe: 362,\n vostochnyi: 369,\n kurkino: 383,\n losinoostrovskiy: 387,\n kotlovka: 380,\n lomonosovskiy: 386,\n molzhaninovskiy: 394,\n nizhegorodskiy: 397,\n matushkino: 389,\n 'khoroshyovo-mnyovniki': 410,\n staroe_kryukovo: 409,\n metrogorodok: 2546,\n krasnoselskiy: 16,\n khamovniki: 29,\n zamoskvoreche: 78,\n prospekt_vernadskogo: 40,\n zyablikovo: 97,\n kuntsevo: 115,\n sokolinaya_gora: 132,\n yakimanka: 153,\n 'pokrovskoe-streshnevo': 206,\n schukino: 209,\n ryazanskiy: 225,\n gagarinskiy: 183,\n savyolovskiy: 276,\n timiryazevskiy: 273,\n novokosino: 263,\n marino: 325,\n vnukovo: 365,\n biryulyovo_zapadnoe: 363,\n golyanovo: 370,\n dmitrovskiy: 371,\n donskoi: 373,\n marfino: 388,\n lianozovo: 385,\n mozhaiskiy: 393,\n perovo: 401,\n kryukovo: 382,\n sokol: 407,\n silino: 406,\n arbat: 26,\n tverskoi: 23,\n danilovskiy: 82,\n ramenki: 38,\n 'troparyovo-nikulino': 42,\n levoberezhnyi: 63,\n voikovskiy: 68,\n 'orekhovo-borisovo_yuzhnoe': 95,\n 'orekhovo-borisovo_severnoe': 93,\n 'nagatino-sadovniki': 85,\n dorogomilovo: 121,\n krilatskoe: 113,\n izmailovo: 135,\n yuzhnoe_tushino: 204,\n 'vyhino-zhulebino': 227,\n yuzhnoportovyi: 219,\n 'novo-peredelkino': 239,\n sviblovo: 169,\n obruchevskiy: 190,\n tyopliy_stan: 195,\n yasenevo: 198,\n bibirevo: 266,\n novogireevo: 260,\n otradnoe: 269,\n nagornyi: 286,\n chertanovo_tsentralnoe: 295,\n zapadnoe_degunino: 304,\n lyublino: 323,\n butyrskiy: 308,\n 'kosino-ukhtomskiy': 353,\n begovoi: 360,\n vostochnoe_degunino: 366,\n ivanovskoe: 375,\n kapotnya: 376,\n severnyi: 405,\n yaroslavskiy: 412\n} as const;\n\nexport const mskRayonMapper = new SeoMapper('mskRayonMapper', {\n ...mskOblRayon,\n ...mskRayon\n} as const);\n\nexport const mskOblRayonIds = Object.values(mskOblRayon) as number[];\nexport const mskRayonIds = Object.values(mskRayon);\n","import { SeoMapper } from '@search/router/src';\n\nconst ekbMetroMapper = new SeoMapper('ekbMetroMapper', {\n uralmash: 169323,\n geologicheskaya: 3317,\n botanicheskaya: 6291,\n dinamo: 169337,\n 'ploshchad-1905-goda': 2059,\n mashinostroitelei: 169320,\n uralskaya: 1008,\n 'prospekt-kosmonavtov': 4829,\n chkalovskaya: 6510\n});\n\nconst kznMetroMapper = new SeoMapper('kznMetroMapper', {\n 'severnii-vokzal': 5475,\n 'ploshchad-gabdulli-tukaya': 14623,\n aviastroitelnaya: 14621,\n 'sukonnaya-sloboda': 14624,\n yashlek: 14622,\n ametevo: 5429,\n 'kozya-sloboda': 2269,\n gorki: 2295,\n dubravnaya: 14625,\n kremlyovskaya: 2177,\n 'prospekt-pobedi': 3665\n});\n\nconst nskMetroMapper = new SeoMapper('nskMetroMapper', {\n 'marshala-pokrishkina': 4632,\n oktyabrskaya: 4332,\n studencheskaya: 3934,\n 'zolotaya-niva': 14601,\n 'ploshchad-marksa': 2156,\n 'beryozovaya-roshcha': 14600,\n 'rechnoi-vokzal': 3809,\n 'krasnii-prospekt': 4447,\n sibirskaya: 14599,\n 'ploshchad-garina-mikhailovskogo': 4701,\n 'ploshchad-lenina': 14602,\n gagarinskaya: 2988,\n zaeltsovskaya: 1319\n});\n\nconst samaraMetroMapper = new SeoMapper('samaraMetroMapper', {\n bezimyanka: 3346,\n moskovskaya: 5732,\n kirovskaya: 14605,\n gagarinskaya: 14608,\n yungorodok: 14604,\n rossiiskaya: 14609,\n pobeda: 14606,\n sovetskaya: 14607,\n alabinskaya: 4378,\n sportivnaya: 3916\n});\n\nconst nnMetroMapper = new SeoMapper('nnMetroMapper', {\n gorkovskaya: 1968,\n 'dvigatel-revolyutsii': 14613,\n burevestnik: 14620,\n leninskaya: 14612,\n burnakovskaya: 2194,\n kirovskaya: 14617,\n avtozavodskaya: 14615,\n kanavinskaya: 14619,\n moskovskaya: 14610,\n chkalovskaya: 14611,\n strelka: 24659,\n 'park-kulturi': 4879,\n proletarskaya: 14614,\n zarechnaya: 5452,\n komsomolskaya: 14616\n});\n\nexport function regionMetroSlugMapper(region: number) {\n if (region === 1961) return nnMetroMapper;\n if (region === 3339) return samaraMetroMapper;\n if (region === 1310) return nskMetroMapper;\n if (region === 2165) return kznMetroMapper;\n if (region === 993) return ekbMetroMapper;\n}\n","import { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { SeoMapper } from '@search/router/src';\nimport { isSpbWide, isMskWide } from '@search/helpers/src/isRegion';\nimport { mskDistrictMapper, mskMetroMapper } from './msk';\nimport { spbDistrictMapper, spbMetroMapper } from './spb';\nimport { mskCityMapper } from './msk/mskCityMapper';\nimport { spbCityMapper } from './spb/spbCityMapper';\nimport { regionMetroSlugMapper } from './regionMetroSlugMapper';\n\nexport const regionMapper = new SeoMapper('regionMapper', {\n moskva: RegionIdEnum.MSK,\n 'moskva-i-oblast': RegionIdEnum.MSK_AND_MSK_OBL,\n 'sankt-peterburg-i-oblast': RegionIdEnum.SPB_AND_LEN_OBL,\n 'sankt-peterburg': RegionIdEnum.SPB,\n 'moskovskaya-oblast': RegionIdEnum.MSK_OBL,\n 'leningradskaya-oblast': RegionIdEnum.LEN_OBL\n} as const);\n\nexport function getMetroMapperByRegion(region: number) {\n if (isMskWide(region)) return mskMetroMapper;\n if (isSpbWide(region)) return spbMetroMapper;\n\n return regionMetroSlugMapper(region);\n}\n\nexport function getDistrictMapperByRegion(\n region: ReturnType<typeof regionMapper.Type>\n) {\n if (isMskWide(region)) return mskDistrictMapper;\n if (isSpbWide(region)) return spbDistrictMapper;\n}\n\nexport function getCityMapperByRegion(\n region: number\n) {\n if (isMskWide(region)) return mskCityMapper;\n if (isSpbWide(region)) return spbCityMapper;\n}\n","import { SeoMapper } from '@search/router/src';\n\nexport const lenOblCity = {} as const;\n\nexport const spbInnerTowns = {\n kolpino: 2258,\n 'krasnoe-selo': 4848,\n kronshtadt: 7689,\n zelenogorsk: 919,\n sestroretsk: 2898,\n lomonosov: 4983,\n petergof: 469,\n pavlovsk: 8095,\n pushkin: 718\n};\n\nexport const spbInnerLocalities = {\n pargolovo: 3925,\n levashovo: 69835,\n pontonniy: 41212,\n 'ust-izhora': 71536,\n 'petro-slavyanka': 71323,\n sapyorniy: 72330,\n metallostroi: 2273,\n beloostrov: 47020,\n komarovo: 47373,\n molodyozhnoe: 69214,\n pesochniy: 8678,\n repino: 8420,\n serovo: 74973,\n smolyachkovo: 5329,\n solnechnoe: 7879,\n ushkovo: 75561,\n strelna: 8680,\n lisiy_nos: 8093,\n shushary: 7659,\n aleksandrovskaya: 57851,\n tyarlevo: 55715\n};\n\nexport const spbCity = {\n ...spbInnerTowns,\n ...spbInnerLocalities\n};\n\nexport const spbCityMapper = new SeoMapper('spbCityMapper', {\n ...lenOblCity,\n ...spbCity\n});\n\nexport const lenOblCityIds = Object.values(lenOblCity) as number[];\nexport const spbCityIds = Object.values(spbCity);\n","import { SeoMapper } from '@search/router/src';\n\nexport const lenOblDistrict = {\n boksitogorskii: 14552,\n volosovskii: 4511,\n volkhovskii: 4672,\n vsevolozhskii: 887,\n viborgskii_lo: 1060,\n gatchinskii: 3486,\n kingiseppskii: 4318,\n kirishskii: 8525,\n kirovskii_lo: 7811,\n lodeinopolskii: 3598,\n lomonosovskii: 996,\n luzhskii: 4715,\n podporozhskii: 14561,\n priozerskii: 1376,\n slantsevskii: 14564,\n sosnovoborskii: 7860,\n tikhvinskii: 7885,\n tosnenskii: 1032\n} as const;\n\nexport const spbDistrict = {\n admiralteiskii: 446,\n vasileostrovskii: 448,\n viborgskii: 450,\n kalininskii: 451,\n kirovskii: 453,\n kolpinskii: 455,\n krasnogvardeiskii: 456,\n krasnoselskii: 458,\n kronshtadtskii: 460,\n kurortnii: 461,\n moskovskii: 462,\n nevskii: 464,\n petrogradskii: 466,\n petrodvortsovii: 468,\n primorskii: 471,\n pushkinskii: 473,\n frunzenskii: 474,\n tsentralnii: 476\n} as const;\n\nexport const spbDistrictMapper = new SeoMapper('spbDistrictMapper', {\n ...lenOblDistrict,\n ...spbDistrict\n} as const);\n\nexport const lenOblDistrictIds = Object.values(lenOblDistrict);\nexport const spbDistrictIds = Object.values(spbDistrict);\n","import { SeoMapper } from '@search/router/src';\nimport { dedupeValues } from '../../dedupeValues';\n\nexport const lenOblMetroStation = {\n devyatkino: 894\n} as const;\n\nexport const spbMetroStation = {\n avtovo: 7588,\n admiralteiskaya: 5229,\n akademicheskaya: 7502,\n baltiiskaya: 4994,\n begovaya: 2175,\n bukharestskaya: 9366,\n vasileostrovskaya: 2787,\n vladimirskaya: 7834,\n volkovskaya: 8359,\n viborgskaya: 7573,\n gorkovskaya: 8206,\n 'gostinii-dvor': 14627,\n 'grazhdanskii-prospekt': 6299,\n dostoevskaya: 2208,\n dunaiskaya: 1387,\n elizarovskaya: 1005,\n zvenigorodskaya: 7832,\n zvyozdnaya: 2846,\n 'kirovskii-zavod': 8124,\n 'komendantskii-prospekt': 5611,\n 'krestovskii-ostrov': 6873,\n kupchino: 4487,\n ladozhskaya: 560,\n 'leninskii-prospekt': 7587,\n lesnaya: 2125,\n 'ligovskii-prospekt': 5115,\n lomonosovskaya: 3565,\n mayakovskaya: 7882,\n mezhdunarodnaya: 8418,\n moskovskaya: 4847,\n 'moskovskie-vorota': 3434,\n 'nevskii-prospekt': 2247,\n 'obvodnii-kanal': 7968,\n narvskaya: 3954,\n // Old and new mapping for Zenit (Novokrestovskaya)\n // First map entry (novokrestovskaya) keeps the link https://m2.ru/sankt-peterburg-i-oblast/nedvizhimost/kupit-kvartiru/metro-novokrestovskaya/ working\n // Second entry is the main entry (the code is written in a such a way) - it is used for route building (when reverse mapping is needed) (e.g. build an url after selecting in geo suggest, build an url for sitemap)\n novokrestovskaya: 7589,\n zenit: 7589,\n novocherkasskaya: 4784,\n obukhovo: 3000,\n ozerki: 2221,\n parnas: 1234,\n petrogradskaya: 6665,\n pionerskaya: 3564,\n 'park-pobedi': 8147,\n 'ploshchad-aleksandra-nevskogo': 2845,\n // These two are kept for backward compatibility only\n 'ploshchad-aleksandra-nevskogo-1': 2845,\n 'ploshchad-aleksandra-nevskogo-2': 2845,\n 'ploshchad-vosstaniya': 6231,\n 'ploshchad-lenina': 2136,\n 'ploshchad-muzhestva': 4480,\n politekhnicheskaya: 7524,\n primorskaya: 7539,\n proletarskaya: 4578,\n 'prospekt-bolshevikov': 3413,\n 'prospekt-veteranov': 1150,\n 'prospekt-prosveshcheniya': 5096,\n pushkinskaya: 2135,\n ribatskoe: 1389,\n sadovaya: 5435,\n 'sennaya-ploshchad': 9039,\n spasskaya: 5252,\n sportivnaya: 3953,\n 'staraya-derevnya': 5615,\n 'tekhnologicheskii-institut': 1338,\n // These two are kept for backward compatibility only\n 'tekhnologicheskii-institut-1': 1338,\n 'tekhnologicheskii-institut-2': 1338,\n udelnaya: 3691,\n 'ulitsa-dibenko': 5309,\n frunzenskaya: 1189,\n chernishevskaya: 1354,\n chkalovskaya: 7572,\n 'chyornaya-rechka': 3401,\n elektrosila: 4995,\n 'prospekt-slavy': 20613,\n shushary: 67241,\n 'yugo-zapadnaya': 174415,\n putylovskaya: 174417,\n teatralnaya: 257084,\n 'gorniy-institut': 257085\n} as const;\n\nexport const spbMetroMapper = new SeoMapper('spbMetroMapper', {\n ...lenOblMetroStation,\n ...spbMetroStation\n} as const);\n\nexport const lenOblMetroIds = dedupeValues(lenOblMetroStation);\nexport const spbMetroIds = dedupeValues(spbMetroStation);\n","/* eslint-disable padding-line-between-statements */\n/* eslint-disable complexity */\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\n// @ts-nocheck\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { s, SchemaTypeError, Tokens } from '@search/router/src';\n\nimport { ClassifiedRoute } from '../ClassifiedRoute';\nimport { categoryTypeMapper, dealTypeMapper, newBuildingMapper, roomMapper } from '../mappers';\n\nconst OfferType = s.rec({\n offerId: s.str,\n slug: s.opt(s.str),\n region: s.opt(s.num),\n dealType: s.opt(dealTypeMapper.Type),\n categoryType: s.opt(categoryTypeMapper.Type),\n room: s.opt(roomMapper.Type),\n newBuilding: s.opt(newBuildingMapper.Type),\n mapBounds: s.opt(s.rec({\n lx: s.num,\n ly: s.num,\n rx: s.num,\n ry: s.num\n }))\n});\n\nexport type IOfferType = ReturnType<typeof OfferType>;\n\nconst OfferSeoType = s.rec({\n origin: s.nullOpt(s.str),\n // offerId: s.str,\n region: s.opt(s.str),\n dealType: s.opt(dealTypeMapper.SeoType),\n categoryType: s.opt(categoryTypeMapper.SeoType),\n room: s.opt(roomMapper.SeoType),\n newBuilding: s.opt(newBuildingMapper.SeoType),\n lx: s.opt(s.str),\n ly: s.opt(s.str),\n rx: s.opt(s.str),\n ry: s.opt(s.str),\n slugAndId: s.str\n});\n\nexport type IOfferSeoType = ReturnType<typeof OfferSeoType>;\n\nconst offerDefaults = {\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.FLAT,\n newBuilding: NewBuilding.UNKNOWN\n} as const;\n\nconst dealReg = '(?<deal>prodazha|arenda)';\n\nconst realtyReg = '(?:(?<flat>kvartiri)|(?<room>komnat(?:i|a|noi)?)|(?<house>usadbi|doma)|(?<land>uchastka))';\n\nconst roomReg = '(?:(?<studio>studii)|(?:(?<rooms>[1-4])(-komnatnoi)?)' +\n '|(?<multiroom>mnogokomnatnoi)|(?<openplan>so-svobodnoi-planirovkoi))';\n\nconst offerIdReg = '(?<offerId>[a-z,0-9]+(-[a-z,0-9]+){4,4})';\n\nconst slugRegExp = new RegExp(`(?:(?<slug>${dealReg}(?:-${roomReg})?-${realtyReg}(?:-.+)?)|(?:offer))?-${offerIdReg}$`);\n\nexport class OfferRoute extends ClassifiedRoute<IOfferSeoType, IOfferType> {\n displayName = 'OfferRoute';\n\n protected metadata = OfferSeoType.config;\n\n protected pattern(p: Tokens<IOfferSeoType>) {\n return `${this.patternHost()}(/${p.region})/nedvizhimost(/${p.dealType}-${p.categoryType})(/${p.room\n })(/${p.newBuilding})/${p.slugAndId}/`;\n }\n\n protected extraPatterns(p: Tokens<IOfferSeoType>) {\n return [\n `${this.patternHost()}/search/${p.slugAndId}/`\n ];\n }\n\n protected conditions() {\n return {\n ...super.conditions(),\n room: roomMapper.keys,\n categoryType: categoryTypeMapper.keys,\n slugAndId: '(?:prodazha|arenda|offer)-.*',\n dealType: dealTypeMapper.keys,\n newBuilding: newBuildingMapper.keys\n };\n }\n\n defaults() {\n return offerDefaults;\n }\n\n protected fromQuery(seo: IOfferSeoType) {\n const raw = OfferSeoType(seo);\n const regionSlug = raw.region === 'search' ? 'moskva' : raw.region;\n\n const region = regionSlug ? this.regionId(regionSlug) : undefined;\n\n const p = raw.slugAndId.match(slugRegExp)?.groups;\n\n if (! p?.offerId) {\n throw new SchemaTypeError(`offer id not found, slugAndId: ${raw.slugAndId}`);\n }\n\n let dealType = DealType.SELL;\n\n if (p.deal === 'arenda') dealType = DealType.RENT;\n\n let categoryType = RealtyObjectType.FLAT;\n\n if (p.room) categoryType = RealtyObjectType.ROOM;\n if (p.house) categoryType = RealtyObjectType.HOUSE;\n if (p.land) categoryType = RealtyObjectType.LAND;\n\n let room: undefined | Rooms;\n\n if (p.studio) room = Rooms.STUDIO;\n if (p.rooms === '1') room = Rooms.ROOM_1;\n if (p.rooms === '2') room = Rooms.ROOM_2;\n if (p.rooms === '3') room = Rooms.ROOM_3;\n if (p.rooms === '4') room = Rooms.ROOM_4;\n if (p.multiroom) room = Rooms.ROOM_5_AND_MORE;\n if (p.openplan) room = Rooms.OPEN_PLAN;\n\n return ({\n offerId: p.offerId,\n region,\n slug: p.slug,\n dealType,\n categoryType,\n room,\n mapBounds: raw.lx && raw.ly && raw.rx && raw.ry ? {\n lx: Number(raw.lx),\n ly: Number(raw.ly),\n rx: Number(raw.rx),\n ry: Number(raw.ry)\n } : undefined\n });\n }\n\n protected toQuery(p: IOfferType) {\n // params = OfferType(params);\n const offerId = p.offerId;\n const slug = p.slug ?? 'offer';\n\n try {\n return OfferSeoType({\n ...this.regionParams(p.region),\n slugAndId: `${slug}-${offerId}`,\n lx: p.mapBounds?.lx ? String(p.mapBounds.lx) : undefined,\n ly: p.mapBounds?.ly ? String(p.mapBounds.ly) : undefined,\n rx: p.mapBounds?.rx ? String(p.mapBounds.rx) : undefined,\n ry: p.mapBounds?.ry ? String(p.mapBounds.ry) : undefined\n });\n } catch (e) {\n // @ts-expect-error\n e.message += `, offer: ${offerId}`;\n throw e;\n }\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums/DealType';\n\ntype MatchParamsBase = {\n dealType: DealType;\n categoryType: RealtyObjectType;\n builtYearMin?: number | null;\n builtYearMax?: number | null;\n};\n\ntype MatchParams = MatchParamsBase & { seg?: string | null };\n\nexport class BuildEpochSeoMatcher {\n static $ = new BuildEpochSeoMatcher();\n protected map(): Record<string, readonly (MatchParamsBase)[]> {\n return {\n stalinka: [\n { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1933, builtYearMax: 1956 },\n ],\n khrushchevka: [\n { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1957, builtYearMax: 1969 },\n ],\n brezhnevka: [\n { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1970, builtYearMax: 1980 },\n ],\n };\n }\n\n protected mapCached = Object.entries(this.map());\n\n readonly chpuKeys = Object.keys(this.map());\n\n matchAll(p: MatchParams, _isFirstMatch = false) {\n const result = [] as { seg: string; params: MatchParamsBase }[];\n\n for (const [ seg, variants ] of this.mapCached) {\n if (p.seg && seg !== p.seg) continue;\n\n let isSegAlreadyPushed = false;\n\n for (const params of variants) {\n if (isSegAlreadyPushed) continue;\n if (p.categoryType !== params.categoryType) continue;\n if (p.dealType !== params.dealType) continue;\n if (p.builtYearMin && p.builtYearMin !== params.builtYearMin) continue;\n if (p.builtYearMax && p.builtYearMax !== params.builtYearMax) continue;\n if (p.builtYearMin === undefined || p.builtYearMax === undefined) continue;\n\n result.push({ seg, params });\n if (! isSegAlreadyPushed) isSegAlreadyPushed = true;\n if (_isFirstMatch) return result;\n }\n }\n\n return result;\n }\n\n match(p: MatchParams) {\n const result = this.matchAll(p, true);\n\n return result.length ? result[0] : undefined;\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\ntype MatchParamsBase = {\n dealType: DealType;\n categoryType: RealtyObjectType;\n priceMax?: number | null;\n priceMin?: number | null;\n};\n\ntype MatchParams = MatchParamsBase & { region: number; regionTranslit?: string | null; seg?: string | null };\n\nexport class PriceSeoMatcher {\n static $ = new PriceSeoMatcher();\n protected map(): Record<string, readonly (MatchParamsBase & { region: (number | RegExp)[] })[]> {\n const msk = [ RegionIdEnum.MSK, RegionIdEnum.MSK_AND_MSK_OBL, RegionIdEnum.MSK_OBL ];\n const spb = [ RegionIdEnum.SPB, RegionIdEnum.SPB_AND_LEN_OBL, RegionIdEnum.LEN_OBL ];\n const province = [] as number[];\n\n return {\n deshevye: [\n { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 8500000 },\n { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 5500000 },\n { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 3500000 },\n ],\n nedorogo: [\n { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 25500 },\n { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 25500 },\n { region: province, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 18000 },\n ],\n elitnye: [\n { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 35000000 },\n { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 25000000 },\n { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 10000000 },\n\n { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 150000 },\n { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 100000 },\n { region: province, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 80000 },\n ],\n dachu: [\n { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 6500000 },\n { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 6500000 },\n { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 5200000 },\n\n { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.HOUSE, priceMax: 100000 },\n { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.HOUSE, priceMax: 100000 },\n ],\n 'v-derevne': [\n {\n region: [ RegionIdEnum.MSK_OBL, RegionIdEnum.LEN_OBL ],\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.HOUSE,\n priceMax: 7500000\n },\n {\n region: [ /\\-oblast$/ ],\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.HOUSE,\n priceMax: 5500000\n },\n {\n region: [ RegionIdEnum.MSK_OBL, RegionIdEnum.LEN_OBL ],\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.LAND,\n priceMax: 7500000\n },\n {\n region: [ /\\-oblast$/ ],\n dealType: DealType.SELL,\n categoryType: RealtyObjectType.LAND,\n priceMax: 5500000\n },\n ],\n };\n }\n\n protected mapCached = Object.entries(this.map());\n\n readonly chpuKeys = Object.keys(this.map());\n\n matchAll(p: MatchParams, _isFirstMatch = false) {\n const result = [] as { seg: string; params: MatchParamsBase }[];\n\n for (const [ seg, variants ] of this.mapCached) {\n if (p.seg && seg !== p.seg) continue;\n\n let isSegAlreadyPushed = false;\n\n for (const params of variants) {\n if (isSegAlreadyPushed) continue;\n if (p.categoryType !== params.categoryType) continue;\n if (p.dealType !== params.dealType) continue;\n if (p.priceMax && p.priceMax !== params.priceMax) continue;\n if (p.priceMin && p.priceMin !== params.priceMin) continue;\n if (p.priceMax === undefined && p.priceMin === undefined) continue;\n\n const matchedRegion = params.region.find(\n reg => reg instanceof RegExp && p.regionTranslit ?\n p.regionTranslit.match(reg) :\n reg === p.region\n );\n\n if (! matchedRegion && params.region.length !== 0) continue;\n\n result.push({ seg, params });\n if (! isSegAlreadyPushed) isSegAlreadyPushed = true;\n if (_isFirstMatch) return result;\n }\n }\n\n return result;\n }\n\n match(p: MatchParams) {\n const result = this.matchAll(p, true);\n\n return result.length ? result[0] : undefined;\n }\n}\n","import { RegionIdEnum } from '../../enums';\n\nexport default [\n {\n fullName: 'Москва и Московская область',\n label: 'Москва и область',\n value: RegionIdEnum.MSK_AND_MSK_OBL\n },\n {\n fullName: 'Москва',\n label: 'Москва',\n value: RegionIdEnum.MSK\n },\n {\n fullName: 'Московская область',\n label: 'Московская область',\n value: RegionIdEnum.MSK_OBL\n },\n {\n fullName: 'Санкт-Петербург и Ленинградская область',\n label: 'Санкт-Петербург и область',\n value: RegionIdEnum.SPB_AND_LEN_OBL\n },\n {\n fullName: 'Санкт-Петербург',\n label: 'Санкт-Петербург',\n value: RegionIdEnum.SPB\n },\n {\n fullName: 'Ленинградская область',\n label: 'Ленинградская область',\n value: RegionIdEnum.LEN_OBL\n }\n];\n","export function getGtmLabel(value?: string) {\n if (! value) return {};\n\n return {\n 'data-gtm': value\n };\n}\n","/* eslint-disable */\n// @ts-ignore\nwindow.Sentry = window.Sentry || undefined;\n","export type ExtractId<T> = T extends { id: infer Id } ? Id : never;\n\nexport function isPresent<T>(t: T | undefined | null | void): t is T {\n return t !== undefined && t !== null;\n}\n\nexport function arrayToMap<Item extends { id: any }>(array: readonly Item[]) {\n const map = new Map<ExtractId<Item>, Item>();\n\n for (const item of array) map.set(item.id, item);\n return map;\n}\n\ninterface Flavoring<FlavorT> {\n _type?: FlavorT;\n }\nexport type Flavor<T, FlavorT> = T & Flavoring<FlavorT>\n\nexport type NonMethods<O extends {}> = {\n [P in keyof O]: O[P] extends (...args: any[]) => any ? never : O[P];\n};\n\nexport function titleSorter<T extends { title: string }>(a: T, b: T): number {\n if (a.title > b.title) return 1;\n if (a.title < b.title) return -1;\n return 0;\n}\n\nexport class CopyObject {\n copy(params: Partial<NonMethods<this>>): this {\n let changed = false;\n const next = Object.assign(new (this.constructor as any)(), this);\n\n for (const key in params) {\n if (params[key as keyof this] !== this[key as keyof this]) {\n changed = true;\n next[key] = params[key];\n }\n }\n\n return changed ? next : this;\n }\n}\n","import { useCallback } from 'react';\n\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n useCallbackEmailMutation$variables as useCallbackEmailMutationVariables,\n useCallbackEmailMutation$data as useCallbackEmailMutationResponse\n} from './__generated__/useCallbackEmailMutation.graphql';\n\nconst mutation = graphql`\n mutation useCallbackEmailMutation(\n $subject: String!\n $body: String!\n $emailRecipient: String\n ) {\n createEmailCallbackSimple(\n subject: $subject\n body: $body\n emailRecipient: $emailRecipient\n ) {\n emailMessageId\n }\n }\n`;\n\nexport const useCallbackEmail = () => {\n const gql = useGqlContext();\n\n return useCallback(\n (\n vars: useCallbackEmailMutationVariables,\n opts?: { signal?: AbortSignal; pathUniqSuffix?: String }\n ) => gql.client<\n useCallbackEmailMutationVariables,\n useCallbackEmailMutationResponse\n >(\n mutation,\n vars,\n opts\n ),\n [ gql ]\n );\n};\n","import {\n TipAddress, TipTypeEnum\n} from '@search/graphql-typings';\n\nimport { GeoId } from './GeoBase';\nimport { Address } from './Address';\n\nexport class AddressStore {\n protected items = new Map<GeoId, Address>();\n\n get(id: GeoId): Address | undefined {\n return this.items.get(id);\n }\n\n getGql(id: GeoId): TipAddress | undefined {\n const geo = this.get(id);\n\n if (! geo) return undefined;\n\n return {\n __typename: 'TipAddress',\n id: geo.id,\n title: geo.displayName ?? geo.mainName,\n translit: geo.translit,\n type: TipTypeEnum.Address\n };\n }\n\n add(item: Address): void {\n this.items.set(item.id, item);\n }\n\n remove(id: GeoId): void {\n this.items.delete(id);\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { TipTypeEnum } from '@search/graphql-typings';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { titleSorter, isPresent } from '../domainHelpers';\nimport { geoProtoDistrict } from './proto/district';\nimport { GeoObject2 } from './GeoObject2';\nimport { GeoId } from './GeoBase';\n\nexport interface District {\n readonly __typename?: undefined;\n readonly kind: GeoKind.DISTRICT;\n readonly id: GeoId;\n readonly parentId: GeoId;\n readonly title: string;\n readonly translit: string;\n readonly locativeName?: string;\n readonly titleShort?: string;\n readonly isIntracity?: boolean;\n readonly narrowRegionId?: number;\n}\n\nexport class DistrictStore {\n protected readonly map = new Map<GeoId, District>();\n protected readonly ids: GeoId[] = [];\n regionId: number | undefined;\n\n get items() {\n return Array.from(this.map.values());\n }\n\n get(id: GeoId): District | undefined {\n return this.map.get(id);\n }\n\n getGql(id: GeoId) {\n const geo = this.get(id);\n\n if (! geo) return undefined;\n\n return {\n __typename: 'TipDistrict',\n id: geo.id,\n translit: geo.translit,\n title: geo.title ?? geo.titleShort,\n type: TipTypeEnum.District\n };\n }\n\n has(id: GeoId): boolean {\n return this.map.has(id);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected _sorted: District[] | null = null;\n\n get sortedByTitle(): readonly District[] {\n if (! this._sorted) {\n this._sorted = this.ids\n .map(id => this.get(id))\n .filter(isPresent)\n .sort(titleSorter);\n }\n return this._sorted;\n }\n\n protected byRegionDistricts: DistrictStore | undefined = undefined;\n\n byRegion() {\n const regionId = this.regionId;\n\n if (regionId === RegionIdEnum.LEN_OBL || regionId === RegionIdEnum.MSK_OBL) {\n if (this.byRegionDistricts) {\n return this.byRegionDistricts;\n }\n const filtered = new DistrictStore();\n\n for (const id of this.ids) {\n const item = this.get(id);\n\n if (item?.parentId === regionId) {\n filtered.addDistrict(item);\n }\n }\n\n this.byRegionDistricts = filtered;\n\n return filtered;\n }\n\n return this;\n }\n\n addDistrict(district: District) {\n const id = district.id;\n\n this.ids.push(id);\n this.map.set(id, district);\n }\n\n isEmpty() {\n return this.ids.length === 0;\n }\n\n add(geo: GeoObject2) {\n if (geo.kind !== GeoKind.DISTRICT && geo.kind !== GeoKind.LOCALITY) return;\n\n const id = geo.id;\n\n if (this.map.has(id)) return;\n\n const district = geoProtoDistrict(geo);\n\n this.addDistrict(district);\n }\n}\n","import { cityIn } from 'lvovich';\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { District } from '../District';\nimport { GeoObject2 } from '../GeoObject2';\n\nexport function geoProtoDistrict(geo: GeoObject2) {\n if (geo.kind !== GeoKind.DISTRICT && geo.kind !== GeoKind.LOCALITY) {\n throw new Error(\n `Not an district id: ${geo.id}, kind: ${geo.kind}`\n );\n }\n\n const id: number = geo.id;\n const title = geo.displayName ?? geo.mainName ?? '';\n const titleShort: string | undefined = geo.shortDisplayName;\n let locativeName = geo.locativeDisplayName;\n\n if (! locativeName) {\n let cityInTitle: string | undefined;\n const word = 'городской округ';\n const locativeWord = 'городском округе';\n\n if (title.startsWith('посёлок')) {\n cityInTitle = 'посёлке ' + title.substring('посёлке'.length);\n } else if (title.startsWith(word)) {\n cityInTitle = locativeWord + ' ' + title.substring(word.length);\n } else if (title.endsWith(word)) {\n cityInTitle = cityIn(title.substring(0, title.length - word.length)) + ' ' + locativeWord;\n } else {\n cityInTitle = cityIn(title);\n if (title === 'посёлок Белоостров') cityInTitle = 'посёлке Белоостров';\n if (title === 'Лобня') cityInTitle = 'Лобне';\n }\n\n locativeName = `${textPrefixIn(title)} ${cityInTitle}`;\n }\n\n const district: District = {\n kind: geo.kind,\n id,\n title,\n titleShort,\n locativeName,\n narrowRegionId: geo?.narrowRegion?.id,\n isIntracity: geo?.isIntracity,\n parentId: geo.parentId ?? 0\n };\n\n return district;\n}\n\nfunction textPrefixIn(word: string) {\n if (word === 'Фрунзенский') return 'во';\n\n return 'в';\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { GeoId } from './GeoBase';\nimport { geoProtoRoute } from './proto/route';\nimport { GeoObject2 } from './GeoObject2';\n\nexport interface MetroRoute {\n readonly kind: GeoKind.ROUTE;\n readonly id: GeoId;\n readonly title: string;\n readonly shortDisplayName?: string;\n readonly color: string;\n}\n\nexport class RouteStore {\n protected items = new Map<GeoId, MetroRoute>();\n\n get(id: GeoId): MetroRoute | undefined {\n return this.items.get(id);\n }\n\n add(geo: GeoObject2) {\n if (geo.kind !== GeoKind.ROUTE) return;\n\n const id: GeoId = geo.id;\n\n if (this.items.has(id)) return;\n\n const route = geoProtoRoute(geo);\n\n this.items.set(id, route);\n }\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { GeoObject2 } from '../GeoObject2';\nimport { MetroRoute } from '../MetroRoute';\n\nexport function geoProtoRoute(geo: GeoObject2) {\n if (geo.kind !== GeoKind.ROUTE) {\n throw new Error(\n `Not an route id: ${geo.id}, kind: ${geo.kind}`\n );\n }\n\n const id = geo.id;\n\n const title = geo.mainName ?? geo.displayName;\n\n const body = geo.body;\n const color = body?.route?.colorHex ?? 'pink';\n\n const route: MetroRoute = {\n kind: GeoKind.ROUTE,\n id,\n title,\n shortDisplayName: geo.shortDisplayName,\n color\n };\n\n return route;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { TipMetroStation, TipTypeEnum } from '@search/graphql-typings';\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { titleSorter } from '../domainHelpers';\nimport { GeoId } from './GeoBase';\nimport { MetroRoute, RouteStore } from './MetroRoute';\nimport { geoProtoMetroStationRaw } from './proto/metroStaionRaw';\nimport { GeoObject2 } from './GeoObject2';\n\nexport interface MetroStationBase {\n readonly id: GeoId;\n readonly title: string;\n allRoutesColorsList: readonly string[];\n}\n\nexport interface MetroStation extends MetroStationBase {\n readonly __typename?: undefined;\n readonly id: GeoId;\n readonly kind: GeoKind.METRO;\n readonly title: string;\n readonly route: MetroRoute;\n interchangedStations: readonly MetroStation[];\n readonly coordinates?: {\n latitude: number;\n longitude: number;\n };\n}\n\nexport interface MetroAlphabetGroup {\n readonly letter?: string;\n readonly stations: MetroStation[];\n}\n\nexport interface MetroRouteGroup {\n id: string;\n route: MetroRoute;\n __typename?: undefined;\n kind: 'metro-route';\n readonly stations: MetroStation[];\n}\n\nexport interface MetroStationRaw extends MetroStationBase {\n readonly id: GeoId;\n readonly kind: GeoKind.METRO;\n readonly title: string;\n readonly routeId: GeoId;\n readonly interchangeStationsIds: readonly GeoId[];\n readonly coordinates?: {\n latitude: number;\n longitude: number;\n };\n}\n\nexport class MetroStore {\n protected items = new Map<GeoId, MetroStationRaw>();\n protected ids: GeoId[] = [];\n protected routes: RouteStore;\n\n constructor(routes: RouteStore) {\n this.routes = routes;\n }\n\n has(id: GeoId): boolean {\n return this.items.has(id);\n }\n\n get(id: GeoId): MetroStation | undefined {\n return this.entities.get(id);\n }\n\n getGql(id: GeoId): TipMetroStation | undefined {\n const geo = this.get(id);\n\n if (! geo) return undefined;\n\n return {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __typename: 'TipMetroStation',\n id: geo.id,\n allRoutesColors: geo.allRoutesColorsList as string[],\n title: geo.title,\n type: TipTypeEnum.Metro\n };\n }\n\n isEmpty() {\n return this.ids.length === 0;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected _entities: Map<GeoId, MetroStation> | null = null;\n\n protected get entities(): ReadonlyMap<GeoId, MetroStation> {\n if (this._entities) return this._entities;\n const entities: Map<GeoId, MetroStation> = this._entities = new Map();\n const items = this.sortedByTitle;\n\n for (const item of items) {\n if (item) {\n entities.set(item.id, item);\n }\n }\n\n return entities;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected _sorted: MetroStation[] | null = null;\n\n get sortedByTitle(): readonly MetroStation[] {\n if (this._sorted) return this._sorted;\n const sorted: MetroStation[] = this._sorted = [];\n\n for (const stationId of this.ids) {\n const station = createMetroStation(\n stationId,\n this.items,\n this.routes\n );\n\n if (station) {\n sorted.push(station);\n }\n }\n sorted.sort(titleSorter);\n\n return sorted;\n }\n\n findRouteByStations(stationIds: GeoId[]): {groups: MetroRouteGroup[]; stations: MetroStation[]} {\n const groups = this.groupedByRoute;\n const idSet = new Set(stationIds);\n const fullGroups: MetroRouteGroup[] = [];\n\n for (const group of groups) {\n let equalStations = 0;\n\n for (const station of group.stations) {\n if (idSet.has(station.id)) equalStations++;\n }\n if (equalStations === group.stations.length) {\n for (const station of group.stations) idSet.delete(station.id);\n fullGroups.push(group);\n }\n }\n const stations: MetroStation[] = [];\n\n for (const stationId of stationIds) {\n const station = this.get(stationId);\n\n if (idSet.has(stationId) && station) stations.push(station);\n }\n\n return { groups: fullGroups, stations };\n }\n\n get groupedByRoute(): readonly MetroRouteGroup[] {\n const stations = this.sortedByTitle;\n const stationsMap = new Map<GeoId, MetroRouteGroup>();\n\n for (const station of stations) {\n const route = station.route;\n const key = route.id;\n let stationGroup = stationsMap.get(key);\n\n if (! stationGroup) {\n stationGroup = {\n id: String(route.id),\n route,\n kind: 'metro-route',\n stations: []\n };\n stationsMap.set(key, stationGroup);\n }\n stationGroup.stations.push(station);\n }\n\n return Array.from(stationsMap.values()).sort(\n (a: MetroRouteGroup, b: MetroRouteGroup) => (a.route.title > b.route.title ? 1 : -1)\n );\n }\n\n get groupedByAlphabet(): readonly MetroAlphabetGroup[] {\n const stationsMap = new Map<string, MetroAlphabetGroup>();\n const distinctStations = this.noInterchanged;\n\n for (const station of distinctStations) {\n const letter = station.title.substring(0, 1);\n let stationGroup = stationsMap.get(letter);\n\n if (! stationGroup) {\n stationGroup = {\n letter,\n stations: []\n };\n stationsMap.set(letter, stationGroup);\n }\n stationGroup.stations.push(station);\n }\n\n const aggregate = Array.from(stationsMap.values());\n\n aggregate.sort((a, b) => {\n return a.letter!.charCodeAt(0) - b.letter!.charCodeAt(0);\n });\n\n aggregate.forEach(stationGroup => {\n stationGroup.stations.sort((a, b) => {\n // eslint-disable-next-line\n return a.title < b.title ? -1 : a.title > b.title ? 1 : 0;\n });\n });\n\n return aggregate;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected _noInterchanged: readonly MetroStation[] | null = null;\n /**\n * Если у станции есть пересадочная с таким же названием - вторая будет отброшена\n */\n get noInterchanged(): readonly MetroStation[] {\n if (this._noInterchanged) return this._noInterchanged;\n this._noInterchanged = metroStationNoIntercharged(this.sortedByTitle);\n\n return this._noInterchanged;\n }\n\n add(geo: GeoObject2) {\n if (geo.kind !== GeoKind.METRO) return;\n const id = geo.id;\n\n if (this.items.has(id)) return;\n const station = geoProtoMetroStationRaw(geo);\n\n this.ids.push(id);\n this.items.set(id, station);\n }\n}\n\nexport function metroStationNoIntercharged(stations: readonly MetroStation[]): readonly MetroStation[] {\n const processed = new Set<number>();\n const result: MetroStation[] = [];\n\n for (const station of stations) {\n if (processed.has(station.id)) continue;\n for (const interchanged of station.interchangedStations) {\n if (interchanged.title === station.title) {\n processed.add(interchanged.id);\n }\n }\n result.push(station);\n }\n\n return result;\n}\n\nfunction createMetroStation(\n stationId: GeoId,\n stationMap: Map<GeoId, MetroStationRaw>,\n routeMap: RouteStore,\n processedStations = new Map<GeoId, MetroStation>()\n): MetroStation | undefined {\n let station = processedStations.get(stationId);\n\n if (station) return station;\n\n const stationRaw = stationMap.get(stationId);\n\n if (! stationRaw) return; // throw new GeoBaseError(stationId, `, parent: ${JSON.stringify(parent)}`);\n const route = routeMap.get(stationRaw.routeId);\n\n if (! route) return;\n\n station = {\n id: stationRaw.id,\n kind: GeoKind.METRO,\n title: stationRaw.title,\n interchangedStations: [],\n allRoutesColorsList: [],\n route,\n coordinates: stationRaw.coordinates\n };\n processedStations.set(stationRaw.id, station);\n\n const interchangedStations: MetroStation[] = [];\n\n for (const interchangedStationId of stationRaw.interchangeStationsIds) {\n const interchangedStation = createMetroStation(\n interchangedStationId,\n stationMap,\n routeMap,\n processedStations\n );\n\n if (interchangedStation) {\n interchangedStations.push(interchangedStation);\n }\n }\n\n station.interchangedStations = interchangedStations;\n station.allRoutesColorsList = stationRaw.allRoutesColorsList || [];\n\n return station;\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { MetroStationRaw } from '../MetroStation';\nimport { GeoObject2 } from '../GeoObject2';\n\nexport function geoProtoMetroStationRaw(geo: GeoObject2) {\n if (geo.kind as unknown as GeoKind !== GeoKind.METRO) {\n throw new Error(\n `Not an metro station id: ${geo.id}, kind: ${geo.kind}`\n );\n }\n\n const id: number = geo.id;\n\n const routeId: number = geo.parentId ?? 0;\n const title =\n geo.displayName ?? geo?.mainName?.replace('метро ', '') ?? '';\n\n const body = geo.body;\n const metro = body?.metro;\n const interchangeStationsIds = metro?.interchangeStationsIdsList ?? [];\n const allRoutesColorsList = metro?.allRoutesColorsList ?? [];\n const coordinates = metro?.coordinates;\n\n const station: MetroStationRaw = {\n kind: GeoKind.METRO,\n id,\n title,\n routeId,\n interchangeStationsIds,\n allRoutesColorsList,\n coordinates\n };\n\n return station;\n}\n","/* eslint-disable complexity */\nimport { GeoKind } from '@search/filter-enums/enums';\nimport { isPresent } from '../domainHelpers';\nimport { GeoBaseStore } from './GeoBase';\n\nexport function geoBaseStoreFromGql(geo: Geo): GeoBaseStore {\n const store = new GeoBaseStore();\n\n for (const metro of geo?.metro ?? []) {\n if (! metro) continue;\n\n store.add({\n id: metro.id,\n kind: geoKindFromGqlKind(metro.kind),\n displayName: metro.title ?? '',\n shortDisplayName: metro.shortDisplayName ?? undefined,\n parentId: metro.route.id,\n body: {\n metro: {\n allRoutesColorsList: metro.lines ?? [],\n interchangeStationsIdsList: metro.interchangedStations?.filter(isPresent) ?? [],\n coordinates: metro.coordinates ?? undefined\n }\n }\n });\n }\n\n for (const district of geo?.districts ?? []) {\n if (! district) continue;\n\n store.add({\n id: district.id,\n kind: geoKindFromGqlKind(district.kind),\n isIntracity: district.isIntracity ?? false,\n parentId: district.parentId,\n narrowRegion: district.narrowRegion,\n displayName: district.displayName || district.title || '',\n mainName: district.mainName ?? undefined,\n shortDisplayName: district.shortDisplayName || district.displayName || undefined,\n locativeDisplayName: district.locative ?? undefined\n });\n }\n\n for (const line of geo?.lines ?? []) {\n if (! line) continue;\n store.add({\n id: line.id,\n kind: geoKindFromGqlKind(line.kind),\n displayName: line.title ?? '',\n body: {\n route: {\n colorHex: line.color ?? 'pink'\n }\n }\n });\n }\n\n return store;\n}\n\nfunction geoKindFromGqlKind(kind: KindEnum): GeoKind {\n return GeoKind[kind];\n}\n\ntype KindEnum = 'AIRPORT' | 'APARTMENT' | 'AREA' | 'COMPOSITE_OBJECT' | 'COUNTRY' | 'DISTRICT' | 'ENTRANCE'\n | 'HOUSE' | 'HYDRO' | 'LOCALITY' | 'METRO' | 'OTHER' | 'PROVINCE' | 'RAILWAY_STATION'\n | 'ROUTE' | 'STATION' | 'STREET' | 'STREET_ADDRESS' | 'VEGETATION';\n\ntype Geo = {\n readonly metro: Array<{\n readonly id: number;\n readonly title?: string | null | undefined;\n readonly kind: KindEnum;\n readonly lines: Array<string> | null | undefined;\n readonly mainName: string | null | undefined;\n readonly interchangedStations: Array<number | null | undefined> | null | undefined;\n readonly shortDisplayName: string | null | undefined;\n readonly locativeDisplayName: string | null | undefined;\n readonly route: {\n readonly id: number;\n };\n readonly coordinates: {\n readonly latitude: number;\n readonly longitude: number;\n } | null | undefined;\n } | null | undefined> | null | undefined;\n readonly lines: Array<{\n readonly id: number;\n readonly title: string | null;\n readonly kind: KindEnum;\n readonly color: string | null;\n } | null | undefined> | null | undefined;\n readonly districts: Array<{\n readonly kind: KindEnum;\n readonly parentId: number;\n readonly displayName: string | null;\n readonly mainName: string | null;\n readonly shortDisplayName: string | null;\n readonly locative: string | null;\n readonly title: string | null;\n readonly id: number;\n readonly isIntracity?: boolean | null;\n readonly narrowRegion?: {\n readonly id: number;\n };\n } | null | undefined > | null | undefined;\n} | null | undefined;\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\n\nimport { CopyObject, Flavor } from '../domainHelpers';\nimport { AddressStore } from './AddressStore';\nimport { District, DistrictStore } from './District';\nimport { GeoObject2 } from './GeoObject2';\nimport { RouteStore } from './MetroRoute';\nimport { MetroStation, MetroStore, MetroRouteGroup } from './MetroStation';\nimport { geoBaseStoreFromGql } from './geoBaseStoreFromGql';\nimport { Address } from './Address';\n\nexport class GeoBase extends CopyObject {\n loading: boolean = true;\n error?: Error = undefined;\n store = new GeoBaseStore();\n public regionId: GeoId | null;\n\n constructor(regionId: GeoId | null = 0) {\n super();\n this.regionId = regionId;\n }\n}\n\nexport type GeoId = Flavor<number, 'GeoId'>;\n\nexport type GeoFilteredItem = MetroStation | District | Address | MetroRouteGroup;\n\nexport class GeoBaseStore extends CopyObject {\n readonly districts = new DistrictStore();\n readonly routes = new RouteStore();\n readonly stations = new MetroStore(this.routes);\n readonly addresses = new AddressStore();\n\n static fromGql(geo: Parameters<typeof geoBaseStoreFromGql>[0]) {\n return geoBaseStoreFromGql(geo);\n }\n\n add(geo: GeoObject2) {\n this.districts.add(geo);\n this.stations.add(geo);\n this.routes.add(geo);\n\n const kind = geo.kind;\n\n if (\n kind === GeoKind.HOUSE ||\n kind === GeoKind.STREET ||\n kind === GeoKind.LOCALITY ||\n kind === GeoKind.AREA ||\n kind === GeoKind.PROVINCE ||\n kind === GeoKind.COUNTRY ||\n kind === GeoKind.HYDRO ||\n kind === GeoKind.VEGETATION ||\n kind === GeoKind.AIRPORT ||\n kind === GeoKind.OTHER ||\n kind === GeoKind.RAILWAY_STATION ||\n kind === GeoKind.STATION ||\n kind === GeoKind.ENTRANCE ||\n kind === GeoKind.COMPOSITE_OBJECT ||\n kind === GeoKind.STREET_ADDRESS ||\n kind === GeoKind.APARTMENT\n ) {\n // @ts-ignore\n this.addresses.add(geo);\n }\n }\n\n getById(id: GeoId): GeoFilteredItem | undefined {\n const { districts, stations, addresses } = this;\n const district = districts.get(id);\n\n if (district) return district;\n\n const station = stations.get(id);\n\n if (station) return station;\n\n const address = addresses.get(id);\n\n if (address) return address;\n\n return undefined;\n }\n\n getByIds(ids: readonly GeoId[]): GeoFilteredItem[] {\n const result: GeoFilteredItem[] = [];\n\n for (const id of ids) {\n const item = this.getById(id);\n\n if (item) result.push(item);\n }\n\n return result;\n }\n}\n","import React from 'react';\n\nimport { QueryDisplayValues } from '@search/vtbeco-frontend-core/view/common/hooks/useQueryDisplayValues';\nimport { DeveloperFilter, Filters, GeoFilter } from '@search/vtbeco-frontend-core/view/filters/models/Filter';\nimport { GeoBaseStore } from '@search/vtbeco-frontend-core/domain/geo/GeoBase';\nimport { isPresent } from '@search/vtbeco-frontend-core/domain/domainHelpers';\n\nimport { NewbuildingFilterCollection } from '../newbuilding/filters/NewbuildingFilterCollection';\nimport { ClassifiedFilterCollection } from '../offer/filters/ClassifiedFilterCollection';\n\nexport function useGeoTips(\n qv: QueryDisplayValues,\n filters: NewbuildingFilterCollection | ClassifiedFilterCollection,\n store: GeoBaseStore\n) {\n const geoFilter = filters.get<GeoFilter>(Filters.geo);\n const developerFilter = filters.get<DeveloperFilter>(Filters.developer);\n\n const { addressIds, districtIds, metroIds, newBuildingIds } = geoFilter ?? {};\n const developerId = developerFilter?.developerId;\n\n return React.useMemo(() => [\n ...addressIds.map(id => (qv.addresses && qv.addresses[id]) ?? store.addresses.getGql(id)),\n ...districtIds.map(id => (qv.districts && qv.districts[id]) ?? store.districts.getGql(id)),\n ...metroIds.map(id => (qv.metros && qv.metros[id]) ?? store.stations.getGql(id)),\n ...newBuildingIds.map(id => qv.newBuildings && qv.newBuildings[id]),\n developerId ? qv.developers && qv.developers[developerId] : null\n ].filter(isPresent), [\n addressIds,\n districtIds,\n metroIds,\n newBuildingIds,\n developerId,\n qv.addresses,\n qv.districts,\n qv.metros,\n qv.newBuildings,\n qv.developers,\n store.addresses,\n store.districts,\n store.stations\n ]);\n}\n","import { DataLayerObject } from './DataLayerObject';\n\ndeclare const window: Window & {\n dataLayer?: Object[];\n};\n\nexport function dataLayerPush(data: DataLayerObject) {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (! window.dataLayer) {\n window.dataLayer = [];\n }\n\n window.dataLayer.push(data);\n}\n","/* eslint-disable camelcase */\nimport React from 'react';\nimport { googleOptimizeCallbackEvent } from './googleOptimizeCallbackEvent';\nimport { dataLayerPush } from './dataLayerPush';\n\n/**\n * @see https://support.google.com/optimize/answer/9059383?hl=en\n */\ninterface GoogleOptimize {\n get<Variant>(experimentId: string): Variant | undefined;\n}\n\ndeclare const window: Window & {\n // eslint-disable-next-line camelcase\n google_optimize?: GoogleOptimize;\n};\n\nexport type GoogleOptimizeConfig = Record<string, string | undefined>;\n\nconst googleOptimizeConfigDefault = {} as GoogleOptimizeConfig;\n\nconst GoogleOptimizeContext = React.createContext(googleOptimizeConfigDefault);\n\nGoogleOptimizeContext.displayName = 'GoogleOptimizeContext';\n\nexport function GoogleOptimizeProvider({\n children,\n value = googleOptimizeConfigDefault\n}: {\n value?: GoogleOptimizeConfig;\n children?: React.ReactChild;\n}) {\n return (<GoogleOptimizeContext.Provider value={value}>\n {children}\n </GoogleOptimizeContext.Provider>);\n}\n\nlet activated = false;\n\nexport function useGoogleOptimize<Variant = string>(\n {\n experimentLabel,\n checkVariantTimeout = 1000\n }: {\n checkVariantTimeout?: number;\n experimentLabel: string;\n }\n) {\n const config = React.useContext(GoogleOptimizeContext);\n const experimentId = config[experimentLabel];\n\n if (! activated && experimentId) {\n dataLayerPush({ event: 'optimize.activate' });\n activated = true;\n }\n\n const win = typeof window === 'undefined' ? undefined : window;\n\n const getVariantId = React.useCallback((nextVariantId?: Variant | undefined) => {\n // for testing\n let overridedVariant = experimentId ?\n (win?.sessionStorage.getItem(experimentId) as unknown as Variant) ?? undefined :\n undefined;\n\n if (! overridedVariant && experimentId && win?.location.search) {\n overridedVariant = (new URLSearchParams(win.location.search)\n .get(`dbg_${experimentLabel}`)) as unknown as NonNullable<Variant>;\n }\n\n const debugApiVariant = experimentId ? win?.google_optimize?.get<Variant>(experimentId) : undefined;\n\n const realVariant = nextVariantId ?? debugApiVariant;\n\n if (overridedVariant !== undefined && overridedVariant !== null) {\n // eslint-disable-next-line no-console\n console.log(\n `Google optimize experiment \\`${experimentId}\\` variant \\`${\n realVariant ?? 'off'}\\` overrided by \\`${overridedVariant}\\``\n );\n }\n\n return overridedVariant ?? realVariant;\n }, [ experimentId, win ]);\n\n const variantIdRef = React.useRef(getVariantId());\n\n const [ variantId, setVariantId ] = React.useState(variantIdRef.current);\n\n const onUpdateVariant = React.useCallback((nextVariantIdRaw?: Variant | undefined) => {\n const nextVariantId = getVariantId(nextVariantIdRaw);\n\n if (nextVariantId === variantIdRef.current) return;\n variantIdRef.current = nextVariantId;\n setVariantId(nextVariantId);\n }, [ setVariantId, getVariantId ]);\n\n React.useEffect(() => {\n if (! experimentId) return;\n\n googleOptimizeCallbackEvent({\n experimentId,\n onUpdateVariant\n });\n\n let count = 0;\n\n // @see https://github.com/hudovisk/react-optimize/blob/master/src/Experiment.js\n const handler = variantIdRef.current !== undefined ? undefined : setInterval(() => {\n const googleOptimize = win?.google_optimize;\n\n if (count > 10) {\n clearInterval(handler);\n }\n count++;\n\n if (! googleOptimize) return;\n\n clearInterval(handler);\n onUpdateVariant();\n }, checkVariantTimeout) as unknown as number;\n\n return () => {\n clearInterval(handler);\n googleOptimizeCallbackEvent({\n experimentId,\n onUpdateVariant,\n remove: true\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ experimentId, onUpdateVariant, checkVariantTimeout, variantIdRef ]);\n\n return {\n variantId\n };\n}\n","import React from 'react';\nimport { IntersectionTriggerProps, IntersectionTrigger, useIntersectionTrigger } from '../image/useIntersectionTrigger';\n\nconst GtmOnVisibleContext = React.createContext({\n it: new IntersectionTrigger({ threshold: 1 })\n});\n\nfunction useGtmOnVisibleContext() {\n return React.useContext(GtmOnVisibleContext);\n}\n\nexport function useGtmOnVisible<El extends HTMLElement>({\n containerRef,\n onVisible\n}: {\n containerRef?: React.RefObject<El>;\n onVisible(el: El): void;\n}) {\n const { it } = useGtmOnVisibleContext();\n\n React.useEffect(() => {\n const el = containerRef?.current;\n\n if (! el) return;\n\n it.add(el, { onVisible });\n\n return () => it.remove(el);\n }, [ it, containerRef, onVisible ]);\n}\n\nexport type GtmOnVisibleProviderProps = IntersectionTriggerProps & { children?: React.ReactNode };\n\nexport function GtmOnVisibleProvider({ rootMargin, rootRef, threshold, children }: GtmOnVisibleProviderProps) {\n const { it: parent } = useGtmOnVisibleContext();\n const it = useIntersectionTrigger({ rootMargin, rootRef, threshold, parent });\n\n const value = React.useMemo(() => ({\n it\n }), [ it ]);\n\n return <GtmOnVisibleContext.Provider value={value}>{children}</GtmOnVisibleContext.Provider>;\n}\n\n","import React from 'react';\nimport { UseIntersectionTriggerProps, IntersectionTrigger,\n useIntersectionTrigger } from '../useIntersectionTrigger';\n\nexport type ImageLazyProps = React.ComponentProps<'img'> & {\n /**\n * url заглушки, во время загрузки основной картинки, работает только для не-нативной ленивой загрузки\n */\n mockSrc?: string;\n\n /**\n * Метод ленивой загрузки\n *\n * detect - автодетект, нативная ленивая загрузка, если браузер поддерживает.\n * Для SSR, на сервере надо задать в ImageLazyObserverProvider свойство isBrowserSupportsLazy, можно детектить из user agent.\n * Иначе на сервере тег картинки сгенерится как для эмуляции на IntersectionObserver.\n * После загрузки js в браузер, будет лишний перерендер дома.\n *\n * Если браузер не поддерживает, будет эмуляция на IntersectionObserver, которая срабатывает с задержкой.\n * До загрузки js, картинки не будут видны, заметно при history.back или forward + pushState.\n * Робот, не умеющий в js, увидит вместо src - mockSrc, хотя прочтет data-src.\n *\n * io - упреждающая ленивая загрузка на IntersectionObserver. Больше рассчитана для мобильной галереи.\n * При ssr будет заметна подгрузка, пока js не прогрузился\n *\n * native - нативный lazy, даже если браузер не поддерживает.\n * Можно делать первую картинку в снипете.\n * В сафари будет жадная загрузка. В хроме, нативный lazy подгрузит заранее.\n */\n loadingLazy?: 'native' | 'io' | 'detect';\n}\n\nexport type ImageLazyObserverProps = {\n children: React.ReactNode;\n\n /**\n * Заглушка по-умолчанию, которая будет показываться в случае не нативного lazy на IntersectionObserver.\n */\n defaultMockSrc?: string;\n\n /**\n * Поддерживает ли браузер lazy load для картнок.\n *\n * При SSR, тут надо по user agent детектить поддержку lazy,\n * иначе будет лишний repaint/reflow, после загрузки всех картинок на клиенте\n */\n isBrowserSupportsLazy?: boolean;\n} & UseIntersectionTriggerProps;\n\nconst imageLazyOptionsDefault = {\n defaultMockSrc: 'data:image/svg+xml;charset=utf8,%3Csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3C/svg%3E',\n /**\n * Работает только в клиентской части, на сервере надо через user agent устанавивать ImageLazyObserverProvider.isBrowserSupportsLazy.\n */\n isBrowserSupportsLazy: typeof HTMLImageElement !== 'undefined' && 'loading' in HTMLImageElement.prototype,\n it: new IntersectionTrigger({ rootMargin: '500px 10%' })\n};\n\nexport const ImageLazyObserverContext = React.createContext(imageLazyOptionsDefault);\n\nexport function useImageLazyObserver() {\n return React.useContext(ImageLazyObserverContext);\n}\n\nexport function ImageLazyObserverProvider({\n children,\n rootRef,\n threshold,\n defaultMockSrc = imageLazyOptionsDefault.defaultMockSrc,\n isBrowserSupportsLazy = imageLazyOptionsDefault.isBrowserSupportsLazy,\n rootMargin = '500px 10%'\n}: ImageLazyObserverProps) {\n const { it: parent } = useImageLazyObserver();\n const it = useIntersectionTrigger({ rootRef, threshold, rootMargin, parent });\n\n const value = React.useMemo(() => ({\n defaultMockSrc,\n isBrowserSupportsLazy,\n it\n }), [ it, isBrowserSupportsLazy, defaultMockSrc ]);\n\n return <ImageLazyObserverContext.Provider value={value}>{children}</ImageLazyObserverContext.Provider>;\n}\n\nexport type UseImageLazyProps<El extends HTMLImageElement> = Pick<ImageLazyProps, 'loadingLazy' | 'src' | 'mockSrc'>\n & {\n ref?: React.LegacyRef<El>;\n srcSet?: string;\n }\n\nexport function useImageLazy<El extends HTMLImageElement>(\n {\n loadingLazy,\n ref,\n src,\n srcSet,\n mockSrc\n }: UseImageLazyProps<El>\n) {\n const ll = useImageLazyObserver();\n\n const isNative = loadingLazy === 'native' || (loadingLazy === 'detect' && ll.isBrowserSupportsLazy);\n const loading = isNative ? 'lazy' : undefined;\n\n const isIO = loadingLazy === 'io' || (loadingLazy === 'detect' && ! ll.isBrowserSupportsLazy);\n const it = isIO ? ll.it : undefined;\n\n const mock = mockSrc ?? ll.defaultMockSrc;\n\n const realRef = React.useRef({ src: it ? mock : src, srcSet: it ? mock : srcSet });\n const [ , setCount ] = React.useState(0);\n const imgRef = React.useRef<El | null>(null);\n const extRef = React.useRef(ref);\n\n extRef.current = ref;\n\n React.useEffect(() => {\n const el = imgRef.current;\n\n if (! el) return;\n\n it?.add(el, {\n onVisible() {\n realRef.current = { src, srcSet };\n setCount(p => p + 1);\n }\n });\n\n const subRef = extRef.current;\n\n if (typeof subRef === 'function') subRef(el);\n\n if (subRef && typeof subRef === 'object') {\n (subRef as React.MutableRefObject<El>).current = el;\n }\n\n if (! it && (src !== realRef.current.src || srcSet !== realRef.current.srcSet)) {\n realRef.current = { src, srcSet };\n setCount(p => p + 1);\n }\n\n return () => it?.remove(el);\n }, [ it, src, srcSet ]);\n\n return {\n loading,\n imgRef,\n real: realRef.current\n } as const;\n}\n\n/**\n * Drop-in замена для стандартного img, с фолбэком ленивой загрузки на IntersectionObserver,\n * который, в свою очередь, с фолбэком на жадную загрузку.\n */\nexport const ImageLazy = React.forwardRef<Omit<HTMLImageElement, 'loading'>, ImageLazyProps>((\n {\n loadingLazy,\n mockSrc,\n src,\n srcSet,\n ...props\n },\n ref\n) => {\n const { imgRef, real, loading } = useImageLazy({\n loadingLazy,\n ref,\n src,\n srcSet,\n mockSrc\n });\n\n return (\n <img\n {...props}\n ref={imgRef}\n crossOrigin='anonymous'\n loading={loading}\n src={real.src}\n srcSet={real.srcSet}\n />\n );\n});\n","import './ImageLazySeo.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { useImageLazy, ImageLazyProps } from './ImageLazy';\nimport { useImageLazySrcSet } from './ImageLazySrcSet';\n\nconst cn = classname.bind(null, 'ImageLazySeo');\n\nexport const ImageLazySeo = React.forwardRef<Omit<HTMLImageElement, 'loading'>, ImageLazyProps & {\n imgClassName?: string;\n noLocalItemScope?: boolean;\n metaName?: string;\n itemProp?: string;\n itemScope?: boolean;\n originPath?: string;\n srcWidth?: number;\n srcHeight?: number;\n dataSet?: Record<string, string | number | boolean>;\n}>((\n {\n dataSet,\n noLocalItemScope,\n children,\n itemProp,\n itemScope,\n width,\n height,\n srcWidth = typeof width === 'number' ? width : undefined,\n srcHeight = typeof height === 'number' ? height : undefined,\n originPath,\n metaName,\n loadingLazy,\n src,\n srcSet,\n mockSrc,\n className,\n imgClassName,\n ...imgProps\n },\n ref\n) => {\n const name = metaName ?? imgProps.title;\n\n // eslint-disable-next-line guard-for-in\n for (const key in dataSet) {\n const newKey = 'data-' + key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n (imgProps as unknown as typeof dataSet)[newKey] = dataSet[key];\n }\n\n const getSrcSet = useImageLazySrcSet();\n\n const calc = srcWidth && srcHeight && originPath ?\n getSrcSet({ width: srcWidth, height: srcHeight, originPath }) :\n undefined;\n\n const { imgRef, real, loading } = useImageLazy({\n loadingLazy,\n ref,\n src: src ?? calc?.src,\n srcSet: calc?.srcSet,\n mockSrc\n });\n\n return (\n <picture\n itemProp={itemProp}\n itemScope={itemScope}\n itemType={itemScope || itemProp ? 'http://schema.org/ImageObject' : undefined}\n className={cn(null, undefined, className)}\n >\n {calc?.srcSet && <source srcSet={real.srcSet} />}\n <img\n {...imgProps}\n className={cn('img', undefined, imgClassName)}\n itemProp='contentUrl'\n crossOrigin='anonymous'\n src={real.src}\n loading={loading}\n ref={imgRef}\n />\n {name && itemProp && (<meta itemProp='name' content={name} />)}\n {children}\n </picture>\n );\n});\n","/* eslint-disable no-undef */\n/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport React from 'react';\n\ntype Image = { width: number; height: number; originPath: string };\n\nconst defaultData = {\n src: undefined as undefined | string,\n srcSet: undefined as undefined | string\n};\n\nconst defaultProvider = (img: Image) => defaultData;\n\nconst ImageLazySrcSetContext = React.createContext(defaultProvider);\n\nexport function useClImageLazySrcSetUrl({ baseUrl = 'https://img.m2.ru' } = {}) {\n return React.useCallback(\n (scale: number, img: Image) => `${baseUrl}/i/s${img.width * scale}x${img.height * scale}${img.originPath}`,\n [ baseUrl ]\n );\n}\n\nconst isHiDpi = typeof window === 'undefined' ?\n undefined :\n new URLSearchParams(window.location.search).get('dbg_hidpi') === '1';\n\nexport function ImageLazySrcSetProvide({\n scales = [ 1, 2 ],\n children,\n getUrl\n}: {\n scales?: readonly number[];\n getUrl(scale: number, img: Image): string;\n children?: React.ReactNode;\n}) {\n if (isHiDpi) scales = [ 1, 2 ];\n\n const getSrcSet = React.useCallback((img: Image) => {\n const data = scales.map(scale => {\n const url = getUrl(scale, img);\n\n return scale === 1 ? url : `${url} ${scale}x`;\n });\n const src = data.length > 0 ? data[0] : undefined;\n const srcSet = data.join(', ');\n\n return { src, srcSet };\n }, [ scales.join('.'), getUrl ]);\n\n return <ImageLazySrcSetContext.Provider value={getSrcSet} children={children} />;\n}\n\nexport function useImageLazySrcSet() {\n return React.useContext(ImageLazySrcSetContext);\n}\n","import React from 'react';\n\nfunction imageSliderActiveItemRestoreItem<Key extends React.Key>(key: Key, el: HTMLElement) {\n // Не работает в сафари.\n el.scrollIntoView();\n}\n\nexport function useImageSliderActiveItem<\n ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>({\n containerRef,\n // eslint-disable-next-line react-hooks/rules-of-hooks\n itemRefs = React.useRef(new Map<Key, ItemEl>()),\n isVertical = false,\n onActiveItem,\n restoreItemKey,\n restoreItem = imageSliderActiveItemRestoreItem\n}: {\n restoreItem?: (key: Key, el: ItemEl) => void;\n restoreItemKey?: Key;\n onActiveItem?: (key: Key, el: ItemEl) => void;\n isVertical?: boolean;\n containerRef: React.RefObject<ContainerEl>;\n itemRefs?: React.RefObject<Map<Key, ItemEl>>;\n}) {\n const savedRef = React.useRef<Key>();\n\n const onScroll = React.useCallback((e: React.UIEvent) => {\n if (! onActiveItem) return;\n\n const parentRect = containerRef.current?.getBoundingClientRect();\n\n if (! parentRect) return;\n\n const parentFirst = isVertical ? parentRect.top : parentRect.left;\n const parentLast = isVertical ? parentRect.bottom : parentRect.right;\n const parentCenter = Math.round(parentFirst + (parentLast - parentFirst) / 2);\n\n let targetKey: Key | undefined;\n let targetChild: ItemEl | undefined;\n\n itemRefs.current?.forEach((child, key) => {\n const childRect = child?.getBoundingClientRect();\n\n if (! childRect) return;\n\n const childFirst = isVertical ? childRect.top : childRect.left;\n const childLast = isVertical ? childRect.bottom : childRect.right;\n\n if (childFirst < parentCenter && childLast > parentCenter) {\n targetKey = key;\n targetChild = child;\n return;\n }\n });\n\n if (! targetKey || ! targetChild) return;\n if (savedRef.current === targetKey) return;\n savedRef.current = targetKey;\n\n // console.log('onActiveItem:save', {targetKey, targetChild });\n e.preventDefault();\n onActiveItem(targetKey, targetChild);\n }, [ containerRef, itemRefs, isVertical ]);\n\n React.useEffect(() => {\n itemRefs.current?.forEach((child, key) => {\n if (key !== restoreItemKey) return;\n // console.log('onActiveItem:restore', {key, child});\n restoreItem(key, child);\n });\n }, [ itemRefs, restoreItem, restoreItemKey ]);\n\n return {\n onScroll\n };\n}\n","import React from 'react';\n\nexport type ImageSliderAnimateProps = {\n /**\n * Айтем или весь контейнер, если был задан containerCrossSwipeEnabled\n */\n el: HTMLElement;\n\n /**\n * True, если вертикальное размещение айтемов в свайпе (ландшафтная ориентация экрана)\n */\n isVertical: boolean;\n\n /**\n * Если isVertical true - смещение по x, иначе - по y\n */\n touchShift: number;\n}\n\n/**\n * Анимация кросс-свайпа.\n * Возвращает true, если считает, что на onTouchEnd надо выполнить экшен onCrossSwipeFwd или onCrossSwipeBack\n */\nexport type ImageSliderAnimate = (props: ImageSliderAnimateProps) => boolean;\n\nexport type ImageSliderBaseProps<Key extends React.Key> = {\n /**\n * True, если вертикальное размещение айтемов в свайпе (ландшафтная ориентация экрана)\n */\n isVertical?: boolean;\n\n /**\n * Действие на прямой (слева направо, сверху вниз) свайп, перпендикулярный скролл-свайпу\n * Если не заданно, прямой кросс-свайп не будет анимироваться.\n *\n * Если isVertical true - выполнится в конце свайпа вправо\n * Если isVertical false - выполнится в конце свайпа вниз\n */\n onCrossSwipeFwd?: (key: Key, e: React.TouchEvent<HTMLElement>) => void;\n\n /**\n * Действие на обратный (справа налево, снизу вверх) свайп, перпендикулярный скролл-свайпу\n * Если не заданно, обратный кросс-свайп не будет анимироваться.\n *\n * Если isVertical true - выполнится в конце свайпа влево\n * Если isVertical false - выполнится в конце свайпа вверх\n */\n onCrossSwipeBack?: (key: Key, e: React.TouchEvent<HTMLElement>) => void;\n\n /**\n * Анимация кросс-свайпа.\n * Возвращает true, если считает, что на onTouchEnd надо выполнить экшен onCrossSwipeFwd или onCrossSwipeBack\n */\n crossSwipeAnimate?: ImageSliderAnimate;\n}\n\n/**\n * Упрощает построение свайпов, где основной свайп скроллит, а перпендикулярный занят под альтернативные действия.\n */\nexport function useImageSliderCross<\n ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>({\n onCrossSwipeFwd,\n onCrossSwipeBack,\n containerRef,\n isVertical = false,\n itemRefs,\n crossSwipeAnimate = imageSliderCrossSwipeAnimateDefault\n}: ImageSliderBaseProps<Key> & {\n itemRefs: React.RefObject<Map<Key, ItemEl>>;\n containerRef?: React.RefObject<ContainerEl>;\n}) {\n const touchPosStartRef = React.useRef({ x: 0, y: 0 });\n const touchShiftEndRef = React.useRef(0);\n\n const getItemElement = React.useCallback((key: Key) => {\n return containerRef?.current ?? itemRefs.current?.get(key);\n }, [ itemRefs, containerRef ]);\n\n const onTouchStart = React.useCallback((e: React.TouchEvent<ItemEl>) => {\n const event = e.touches.length ? e.touches[0] : undefined;\n\n if (! event) return;\n\n touchShiftEndRef.current = 0;\n touchPosStartRef.current = { x: event.clientX, y: event.clientY };\n }, [ ]);\n\n const onTouchEnd = React.useCallback((key: Key, e: React.TouchEvent<ItemEl>) => {\n const touchShift = touchShiftEndRef.current;\n\n if (touchShift < 0 && onCrossSwipeBack) {\n return onCrossSwipeBack(key, e);\n }\n if (touchShift > 0 && onCrossSwipeFwd) {\n return onCrossSwipeFwd(key, e);\n }\n\n const el = getItemElement(key);\n\n if (! el) return;\n\n crossSwipeAnimate({\n el,\n isVertical,\n touchShift\n });\n }, [ getItemElement, onCrossSwipeFwd, onCrossSwipeBack, crossSwipeAnimate, isVertical ]);\n\n const onTouchMove = React.useCallback((key: Key, e: React.TouchEvent<ItemEl> & React.ChangeEvent<ItemEl>) => {\n const el = getItemElement(key);\n\n if (! el) return;\n\n const event = e.touches.length > 0 ? e.touches[0] : undefined;\n\n if (! event) return;\n\n const shift = {\n x: Math.floor(event.clientX - touchPosStartRef.current.x),\n y: Math.floor(event.clientY - touchPosStartRef.current.y)\n };\n\n // Если начали скролл-свайпить, то кросс-свайп не должен анимироваться\n if (! isVertical && Math.abs(shift.x) > 10) return;\n if (isVertical && Math.abs(shift.y) > 10) return;\n\n let touchShift = isVertical ? shift.x : shift.y;\n\n // Если не задали экшен на обратный кросс-свайп, то не анимируем его\n if (touchShift > 0 && onCrossSwipeBack) touchShift = 0;\n // Если не задали экшен на прямой кросс-свайп, то не анимируем его\n if (touchShift < 0 && onCrossSwipeFwd) touchShift = 0;\n\n const isActionTriggered = crossSwipeAnimate({\n el,\n isVertical,\n touchShift\n });\n\n touchShiftEndRef.current = isActionTriggered ? touchShift : 0;\n }, [ getItemElement, isVertical, crossSwipeAnimate, onCrossSwipeBack, onCrossSwipeFwd ]);\n\n return {\n onTouchStart,\n onTouchEnd,\n onTouchMove\n };\n}\n\nfunction imageSliderCrossSwipeAnimateDefault(\n {\n el,\n isVertical,\n touchShift\n }: ImageSliderAnimateProps\n) {\n const shiftAbs = Math.abs(touchShift);\n\n if (shiftAbs < 20) touchShift = 0;\n\n const x = ! isVertical ? 0 : touchShift;\n const y = isVertical ? 0 : touchShift;\n\n const dims = el.getBoundingClientRect();\n const length = isVertical ? dims.right - dims.left : dims.bottom - dims.top;\n const opacity = Math.min(1, Math.max(0, 1 - 0.7 * (shiftAbs / length)));\n\n el.style.transform = `translate(${x}px, ${y}px)`;\n el.style.opacity = `${opacity.toFixed(3)}`;\n\n return shiftAbs > 30;\n}\n","import './ImageSlider.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nimport { useImageSliderActiveItem } from './useImageSliderActiveItem';\nimport { ImageSliderBaseProps, useImageSliderCross } from './useImageSliderCross';\nimport { useImageSliderItems } from './useImageSliderItems';\n\nconst cn = classname.bind(null, 'ImageSlider');\n\nexport function ImageSlider<Key extends React.Key>(\n {\n crossSwipeAnimate,\n className,\n itemClassName,\n items,\n containerCrossSwipeEnabled = false,\n children,\n onCrossSwipeFwd,\n onCrossSwipeBack,\n isVertical = false,\n restoreItemKey,\n onActiveItem,\n noOverflow = false\n }: {\n className?: string;\n itemClassName?: string;\n items: readonly React.ReactElement<{ key: Key }>[];\n\n /**\n * True, если кросс-свайп должен анимировать весь контейнер, а не только конкретный айтем\n */\n containerCrossSwipeEnabled?: boolean;\n children?: React.ReactNode;\n restoreItemKey?: Key;\n onActiveItem?: (key: Key, el: HTMLElement) => void;\n noOverflow?: boolean;\n } & ImageSliderBaseProps<Key>\n) {\n const { containerRef, itemRefs, setItem } = useImageSliderItems<HTMLDivElement, HTMLDivElement, Key>();\n\n const { onScroll } = useImageSliderActiveItem({\n containerRef,\n itemRefs,\n isVertical,\n onActiveItem,\n restoreItemKey\n });\n\n const { onTouchStart, onTouchMove, onTouchEnd } = useImageSliderCross({\n containerRef: containerCrossSwipeEnabled ? containerRef : undefined,\n itemRefs,\n onCrossSwipeFwd,\n onCrossSwipeBack,\n isVertical,\n crossSwipeAnimate\n });\n\n return (\n <div\n ref={containerRef}\n onScroll={onScroll}\n className={cn(null, {\n vertical: isVertical,\n overflow: ! noOverflow\n }, className)}\n >\n {items.map((item, index) => {\n const key = (item.key ?? index) as unknown as Key;\n\n return (<div\n key={`${key}-item`}\n onTouchStart={onTouchStart}\n ref={setItem.bind(null, key)}\n onTouchEnd={onTouchEnd.bind(null, key)}\n onTouchMove={onTouchMove.bind(null, key)}\n className={cn('slide', { vertical: isVertical }, itemClassName)}\n >\n {item}\n </div>);\n })}\n {children}\n </div>\n );\n}\n\n","import React from 'react';\n\nexport function useImageSliderItems<\n ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>() {\n const itemRefs = React.useRef(new Map<Key, ItemEl>());\n const containerRef = React.useRef<ContainerEl>(null);\n\n const setItem = React.useCallback((key: Key, ref?: ItemEl | null) => {\n if (ref) itemRefs.current?.set(key, ref);\n }, [ itemRefs ]);\n\n return {\n containerRef,\n itemRefs,\n setItem\n };\n}\n","import React from 'react';\n\nconst deferQueue: (() => void)[] = [];\n\nlet deferTick: Promise<void> | undefined;\n\nfunction deferQueueRun() {\n let cb: (() => void) | undefined;\n\n // eslint-disable-next-line no-cond-assign\n while (cb = deferQueue.pop()) {\n cb();\n }\n deferTick = undefined;\n}\n\nexport function deferRun(cb: () => void) {\n deferQueue.push(cb);\n if (! deferTick) {\n deferTick = Promise.resolve().then(deferQueueRun);\n }\n}\n\nexport type IntersectionTriggerItemOptions<El extends HTMLElement> = {\n /**\n * Сработает только для не-нативной загрузки, когда картинка попадает в область видимости\n */\n onVisible(target: El): void;\n\n /**\n * Сработает только для не-нативной загрузки, когда картинка выходит из области видимости\n */\n onInvisible?(target: El): void;\n};\n\nexport type IntersectionTriggerProps = {\n /**\n * Видимая область, относительно которой будет учитываться rootMargin и наблюдатся пересечения.\n * IO вызывает onVisible на элементе при соответствующих условиях, даже если root-элемент невидим.\n *\n * undefined - root element body\n * false - IntersectionTrigger не будет добавлять элементы в реальный IO, а будет только запоминать.\n * Когда root сменится в методе update на HTMLElement, то все запомненные элементы добавятся в IO.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n */\n root?: HTMLElement | false;\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n */\n rootMargin?: string;\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n */\n threshold?: number;\n}\n\nexport class IntersectionTrigger {\n constructor(protected props: IntersectionTriggerProps = {}) {\n this.props = props;\n }\n\n protected ioCache: IntersectionObserver | undefined = undefined;\n\n protected get isNative() {\n return typeof IntersectionObserver !== 'undefined';\n }\n\n protected get io() {\n if (this.ioCache) return this.ioCache;\n if (! this.isNative) return undefined;\n\n /**\n * В реальный IO не добавляем, а только в this.elementOptions.\n * Когда через this.update подъедет HTMLElement в root, добавим все элементы из elementOptions в IO\n */\n if (this.props.root === false) return undefined;\n\n this.ioCache = new IntersectionObserver(this.observerCallback.bind(this), {\n threshold: this.props.threshold,\n rootMargin: this.props.rootMargin,\n root: this.props.root\n });\n\n return this.ioCache;\n }\n\n update(props: IntersectionTriggerProps) {\n this.props = props;\n this.ioCache?.disconnect();\n this.ioCache = undefined;\n\n if (this.elementOptions.size === 0) return;\n\n // Картинки будут складываться в elementOptions,\n // когда появится HTMLElement в root, эффект дернет update и элементы добавятся в реальный IO.\n for (const [ el, opts ] of this.elementOptions) {\n this.add(el, opts);\n }\n }\n\n protected elementOptions = new Map<HTMLElement, IntersectionTriggerItemOptions<HTMLElement>>();\n\n protected observerCallback<El extends HTMLElement>(\n entries: IntersectionObserverEntry[],\n observer: IntersectionObserver\n ) {\n for (const entry of entries) {\n const img = entry.target as El;\n const opts = this.elementOptions.get(img);\n\n if (! entry.isIntersecting) {\n opts?.onInvisible?.(img);\n continue;\n }\n\n opts?.onVisible(img);\n\n if (! opts?.onInvisible) observer.unobserve(img);\n }\n }\n\n disconnect() {\n this.ioCache?.disconnect();\n this.elementOptions.clear();\n this.ioCache = undefined;\n }\n\n add<El extends HTMLElement>(el: El, opts: IntersectionTriggerItemOptions<El>) {\n this.elementOptions.set(el, opts);\n const io = this.io;\n\n if (! this.isNative) {\n // Невозможен lazy loading без поддержки в браузере IntersectionObserver.\n deferRun(() => opts.onVisible?.(el));\n return;\n }\n\n io?.observe(el);\n }\n\n remove(el: HTMLElement) {\n this.io?.unobserve(el);\n this.elementOptions.delete(el);\n }\n}\n\nexport type UseIntersectionTriggerProps = Omit<IntersectionTriggerProps, 'root' | 'isSlave'> & {\n /**\n * Родительский IntersectionTrigger\n */\n parent?: IntersectionTrigger;\n\n /**\n * Если rootRef передан, то через родительский IntersectionTrigger, будет мониториться наличие и видимость rootRef.current.\n * При видимом rootRef.current все элементы перенесутся в реальный IO.\n */\n rootRef?: React.RefObject<HTMLElement>;\n};\n\nexport function useIntersectionTrigger(\n {\n rootRef,\n parent,\n rootMargin,\n threshold\n }: UseIntersectionTriggerProps\n) {\n /**\n * см. IntersectionTriggerProps.root в случае false\n */\n const [ visibleRoot, setVisibleRoot ] = React.useState<HTMLElement | false | undefined>(\n rootRef ? false : rootRef\n );\n\n React.useEffect(() => {\n const root = rootRef?.current;\n\n if (! root || ! parent) return;\n\n parent.add(root, { onVisible: setVisibleRoot });\n\n return () => parent.remove(root);\n }, [ parent, rootRef ]);\n\n const itRef = React.useRef(new IntersectionTrigger());\n\n React.useEffect(() => {\n itRef.current.update({\n rootMargin,\n threshold,\n root: visibleRoot\n });\n }, [ visibleRoot, rootMargin, threshold ]);\n\n React.useEffect(() => {\n const it = itRef.current;\n\n return () => it.disconnect();\n }, [ ]);\n\n return itRef.current;\n}\n","export enum NewBuildingAnalytics {\n // Показать телефон на выдаче новостроек\n NewBuildingShowPhone = 'nb-snippet-phone',\n NewBuildingReplacePhone = 'ct-number-replace',\n NewBuildingReplacePhoneTry = 'ct-number-replace-try',\n NewBuildingReplacePhoneFail = 'ct-number-replace-fail',\n\n // Добавить новостройку в избранное\n NewBuildingAddToFavorites = 'new_building_add_to_favorites',\n // Добавить оффер в избранное\n OfferAddToFavorites = 'flat_add_to_favorites',\n\n // Загрузка выдачи\n NewBuildingSerpLoad = 'nb-serp-load',\n\n // Баннер про инвестиции\n InvestmentPromoClick = 'nb_investment_banner_click',\n\n // Отзыв о сайте\n CustomerFeedbackClick = 'nb_feedback_click'\n}\n","import React, { AllHTMLAttributes, useMemo } from 'react';\n\nimport cn from '@search/classname/src';\n\nimport './styles.css';\n\nexport type Level =\n 'promo-h1' |\n 'promo-h1-mobile' |\n\n 'promo-h2' |\n 'promo-h2-mobile' |\n\n 'promo-h3' |\n 'promo-h3-mobile' |\n\n 'promo-h4' |\n 'promo-h4-mobile' |\n\n 'promo-h5' |\n\n 'promo-subheader' |\n 'promo-subheader-alone' |\n 'promo-subheader-mobile' |\n\n 'promo-primary' |\n 'promo-primary-alone' |\n 'promo-primary-mobile' |\n\n 'h1' |\n 'h2' |\n 'h3' |\n 'h4' |\n\n 'primary-alone' |\n 'primary' |\n\n 'secondary-alone' |\n 'secondary' |\n\n 'small-alone' |\n 'small' |\n\n 'tiny-alone' |\n 'tiny';\n\ntype UIKitColor = 'black-50' | 'black-75' | 'black-100' | 'black-200' | 'black-250' | 'black-300' | 'black-350' |\n 'black-400' | 'black-450' | 'black-500' | 'black-50-alpha' | 'black-100-alpha' | 'black-200-alpha' |\n 'black-300-alpha' | 'black-400-alpha' | 'black-500-alpha' | 'white-0' | 'white-500' | 'white-100-alpha' |\n 'white-200-alpha' | 'white-300-alpha' | 'white-400-alpha' | 'white-500-alpha' | 'blue-50' | 'blue-100' |\n 'blue-200' | 'blue-300' | 'blue-400' | 'blue-500' | 'blue-600' | 'blue-700' | 'orange-300' | 'orange-500' |\n 'orange-600' | 'orange-700' | 'purple-300' | 'purple-500' | 'purple-600' | 'purple-700' | 'turquoise-300' |\n 'turquoise-500' | 'turquoise-600' | 'turquoise-700' | 'yellow-300' | 'yellow-500' | 'yellow-600' | 'yellow-700' |\n 'green-300' | 'green-500' | 'green-600' | 'green-700' | 'red-300' | 'red-500' | 'red-600' | 'red-700' | 'primary' |\n 'secondary' | 'minor' | 'link' | 'link-minor' | 'disabled' | 'disabled-transparent' |\n 'disabled-transparent-alt-bg' | 'primary-alt-bg' | 'secondary-alt-bg' | 'link-alt-bg' | 'error';\n\nexport type Color = UIKitColor;\n\nexport const cnCustomTypography = cn.bind(null, 'CustomTypography');\n\nexport interface ICustomTypographyProps extends AllHTMLAttributes<HTMLElement | HTMLLinkElement> {\n /**\n * Тип текста\n * @default 'primary'\n */\n level?: Level;\n\n /**\n * Конкретный тэг HTML\n **/\n tag?: React.ElementType;\n\n /**\n * Цвет текста\n * @default --c-text-primary (задаётся глобально, находится в vtblife/uikit-2/dist/css/global.css)\n **/\n color?: Color;\n\n /**\n * Жирный ли текст\n **/\n bold?: boolean;\n\n /**\n * перечеркнутый ли текст\n **/\n lineThrough?: boolean;\n\n /**\n * Запрещено ли переносить текст\n * @default 'false'\n **/\n noWrap?: boolean;\n\n /**\n * Выравнивание текста\n **/\n align?: 'left' | 'center' | 'right' | 'justify';\n}\n\nconst CustomTypography: React.FC<ICustomTypographyProps> = React.forwardRef<HTMLElement, ICustomTypographyProps>((\n props,\n ref\n) => {\n const {\n level = 'primary',\n tag,\n color,\n bold,\n lineThrough = false,\n noWrap = false,\n align,\n className: classNameProp,\n ...rest\n } = props;\n\n const Component = tag ||\n [ 'h1', 'h2', 'h3', 'h4' ].find(t => level.includes(t)) ||\n 'div';\n\n const className = useMemo(() => cnCustomTypography(null, {\n level,\n color,\n bold,\n lineThrough,\n noWrap,\n align\n }, classNameProp), [\n level,\n color,\n bold,\n lineThrough,\n noWrap,\n align,\n classNameProp\n ]);\n\n return (\n <Component\n {...rest}\n ref={ref}\n className={className}\n />\n );\n});\n\nexport default CustomTypography;\n","import React from 'react';\n\ntype SVGProps = {\n color: string;\n opacity?: number;\n};\n\nconst icons = {\n FOOT: ({ color, opacity }: SVGProps) => (\n <svg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'>\n {/* eslint-disable-next-line max-len */}\n <path d='M5.739 11.118l1.166 1.867-.9 2.449a.878.878 0 01-1.116.516.87.87 0 01-.516-1.116l1.366-3.716zM3.14 6.82l.966-1.416c.267-.383.65-.683 1.083-.85 1.766-.683 2-.666 2.166-.666l1.25.083c.35.017.616.117 1.932 1.783a.86.86 0 00.483.3l1.3.283a.75.75 0 01.583.9.759.759 0 01-.9.583l-1.3-.283c-.533-.117-1-.417-1.349-.834a1.77 1.77 0 00-.15-.183l-1.2 3.499 2.9 4.648c.25.417.133.95-.284 1.2a.943.943 0 01-.466.133c-.3 0-.583-.15-.733-.416L5.822 9.802A2.509 2.509 0 015.54 7.82l.583-2c-.117.05-.25.1-.4.15a.963.963 0 00-.383.3l-.966 1.416a.754.754 0 01-.617.334c-.15 0-.3-.05-.433-.134-.333-.25-.433-.716-.183-1.066zM8.06 3.49A1.75 1.75 0 118.44.01a1.75 1.75 0 01-.38 3.48z' fill={color} fillOpacity={opacity} />\n </svg>\n ),\n PUBLIC_TRANSPORT: ({ color, opacity }: SVGProps) => (\n <svg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'>\n {/* eslint-disable-next-line max-len */}\n <path fillRule='evenodd' clipRule='evenodd' d='M14.43 9.237l.01.241.059 1.835a2.343 2.343 0 01-.499 1.52V14.5a.5.5 0 01-.5.5H12a.5.5 0 01-.5-.5v-.768h-7v.768a.5.5 0 01-.5.5H2.5a.5.5 0 01-.5-.5v-1.666a2.343 2.343 0 01-.499-1.52l.06-1.834.008-.244.28-7.135A1.28 1.28 0 013.118 1h9.766c.637 0 1.177.47 1.268 1.101l.28 7.136zM2.633 10.91a1.095 1.095 0 101.093-1.096c-.604 0-1.093.49-1.093 1.096zm8.549 0a1.095 1.095 0 102.188 0 1.095 1.095 0 10-2.188 0zM3.245 8.615c3.022.503 6.206.463 9.494-.017a.787.787 0 00.672-.802c-.04-1.356-.112-4.218-.112-4.218a.499.499 0 00-.488-.432c-1.363-.264-8.134-.244-9.621 0a.499.499 0 00-.489.432s-.073 2.888-.113 4.238a.785.785 0 00.657.8zM7 1.5a.5.5 0 000 1h2a.5.5 0 000-1H7z' fill={color} fillOpacity={opacity} />\n </svg>\n )\n};\n\nexport type IconTransportProps = {\n transportType: 'FOOT' | 'PUBLIC_TRANSPORT';\n} & SVGProps;\n\nconst IconTransport: React.FunctionComponent<IconTransportProps> = ({\n transportType,\n color,\n opacity = 1\n}) => {\n const Icon = icons[transportType];\n\n return (\n <Icon\n color={color}\n opacity={opacity}\n />\n );\n};\n\nexport default IconTransport;\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport type { DeveloperPromoEventResult } from '../../../developer-promo/analytics';\nimport { useGtmOnVisible } from '../../../../google/useGtmOnVisible';\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'ImageBanner');\n\ninterface IImageBannerProps {\n targetLink: string;\n image: string;\n view: 'square' | 'horizontal';\n gtm?: string;\n gtmClickData?: { event: string } | DeveloperPromoEventResult;\n gtmAdditionalClickData?: { event: string };\n gtmShowData?: { event: string } | DeveloperPromoEventResult;\n className?: string;\n loading?: 'lazy' | 'eager';\n}\n\nconst ImageBanner: React.FC<IImageBannerProps> = ({\n targetLink,\n image,\n view,\n gtm,\n gtmClickData,\n gtmShowData,\n gtmAdditionalClickData,\n className,\n loading\n}) => {\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n const containerRef = React.useRef<HTMLAnchorElement>(null);\n\n const handleClick = React.useCallback(() => {\n gtmClickData && dataLayerPush(gtmClickData);\n gtmAdditionalClickData && dataLayerPush(gtmAdditionalClickData);\n }, [ gtmClickData, gtmAdditionalClickData, dataLayerPush ]);\n const onVisible = React.useCallback(() => {\n gtmShowData && dataLayerPush(gtmShowData);\n }, [ gtmShowData, dataLayerPush ]);\n\n useGtmOnVisible({ containerRef, onVisible });\n\n return (\n <a\n ref={containerRef}\n href={targetLink}\n target='_blank'\n className={cn(null, { view }, className)}\n data-gtm={gtm}\n onClick={handleClick}\n >\n <img\n src={image}\n className={cn('image')}\n crossOrigin='anonymous'\n alt=''\n loading={loading}\n />\n </a>\n );\n};\n\nexport default ImageBanner;\n\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cnList = classname.bind(null, 'List');\n\ninterface IList {\n /**\n * Вид списка\n */\n layout?: 'horizontal' | 'vertical';\n\n /**\n * Разделитель между элементами в режиме horizontal\n */\n separator?: string | React.ReactNode;\n\n children: Array<React.ReactNode>;\n\n className?: string;\n}\n\nexport const List: React.FunctionComponent<IList> = ({\n children,\n className,\n separator,\n layout = 'horizontal'\n}) => {\n const content = React.Children.toArray(children).reduce((ret: Array<React.ReactNode>, item, index) => {\n if (index > 0 && separator) {\n ret.push(\n <span\n key={`separator_${index}`}\n className={cnList('separator')}\n >\n {separator}\n </span>\n );\n }\n\n ret.push(item);\n\n return ret;\n }, []);\n\n return (\n <ul className={cnList(null, { layout }, className)}>\n {content}\n </ul>\n );\n};\n\ninterface IListItem {\n title?: string;\n className?: string;\n}\n\nexport const ListItem: React.FunctionComponent<IListItem> = ({ children, className, title = '' }) => {\n return (\n <li\n title={title}\n className={cnList('item', undefined, className)}\n >\n {children}\n </li>\n );\n};\n","import React from 'react';\n\nimport { FixedSizeBanner } from '@vtblife/media-kit/dist/banners/fixed-size-banner/fixed-size-banner';\n\nimport { DeveloperPromoEventResult } from '../../../../newbuilding/developer-promo/analytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\n\ninterface IMediaKitFixedSizeBannerProps{\n gtmClickData?: { event: string } | DeveloperPromoEventResult;\n gtmShowData?: { event: string } | DeveloperPromoEventResult;\n dataGtm?: string;\n}\n\nconst MediaKitFixedSizeBanner: React.FunctionComponent<IMediaKitFixedSizeBannerProps> = ({\n gtmClickData,\n gtmShowData,\n dataGtm\n}) => {\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n return (\n <FixedSizeBanner\n placementId='nb-page-side'\n format='300x300'\n dataGtm={dataGtm}\n onClick={gtmClickData ? () => (dataLayerPush(gtmClickData)) : undefined}\n onShow={gtmShowData ? () => (dataLayerPush(gtmShowData)) : undefined}\n defaultProps={{\n desktopImageUrl: 'https://cdn.m2.ru/assets/file-upload-server/39b07be20aedfd9d9e1413e9226788b6.jpeg',\n format: '300x300',\n urls: [ 'https://m2.ru/ipoteka/' ]\n }}\n />\n );\n};\n\nexport default React.memo(MediaKitFixedSizeBanner);\n","import React, { FunctionComponent } from 'react';\nimport { Typography, Link } from '@vtblife/uikit';\n\nimport type { RouteMetro } from '@search/graphql-typings';\n\nimport classname from '@search/classname/src';\n\nimport IconTransport from '../IconTransport';\nimport type { IconTransportProps } from '../IconTransport';\n\nimport './styles.css';\n\nexport interface IMetroRouteProps {\n metro: RouteMetro;\n view?: 'desktop' | 'mobile';\n onDarkBackground?: boolean;\n className?: string;\n withoutTransport?: boolean;\n searchUrl?: string;\n}\n\nconst cn = classname.bind(null, 'MetroRoute');\n\nconst MetroRoute: FunctionComponent<IMetroRouteProps> = ({\n view = 'desktop',\n metro,\n onDarkBackground = false,\n className,\n withoutTransport,\n searchUrl\n}) => {\n const isMobile = view === 'mobile';\n const level = isMobile ? 'secondary-alone' : undefined;\n const {\n station,\n timeMinutes,\n transportType\n } = metro;\n\n const { name, lines } = station || {};\n const hasSearchUrl = Boolean(searchUrl);\n\n return (\n <div className={cn(null, undefined, className)}>\n <div>\n {\n lines?.map(color => (\n <div\n key={color}\n className={cn('line')}\n style={{ backgroundColor: color }}\n />\n ))\n }\n </div>\n {\n hasSearchUrl ? (\n <div>\n <Link\n href={searchUrl}\n text={false}\n target='blank'\n >\n <Typography\n tag='span'\n variant={level}\n color={onDarkBackground ? 'white-500' : 'primary'}\n className={cn('name', { isUrl: true })}\n >\n {name}\n </Typography>\n </Link>\n </div>\n ) : (\n <Typography\n variant={level}\n color={onDarkBackground ? 'white-500' : 'primary'}\n >\n {name}\n </Typography>\n )\n }\n {\n withoutTransport ? null : (\n <Typography\n variant={level}\n // eslint-disable-next-line no-nested-ternary\n color={onDarkBackground ? 'white-500' : 'secondary'}\n >\n <IconTransport\n transportType={transportType as IconTransportProps['transportType']}\n // eslint-disable-next-line no-nested-ternary\n color={onDarkBackground ? '#fff' : '#a4a1b5'}\n />\n {`${timeMinutes} мин.`}\n </Typography>\n )\n }\n </div>\n );\n};\n\nexport default MetroRoute;\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport isEqual from 'lodash/isEqual';\n\nimport { Button, LinkButton } from '@vtblife/uikit';\nimport { LinkButtonProps } from '@vtblife/uikit/dist/components/link/types';\n\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport { NewBuildingWhitelabelEnum } from '@search/graphql-typings';\nimport { useManualGql, graphql } from '@search/gql-client/src/useGql';\n\nimport { DATA_GTM } from '../../../libs/constants';\nimport { NewBuildingAnalytics } from '../../../analytics/NewBuildingAnalytics';\nimport { useCalltouchReplacement } from '../../../hooks/useCalltouchReplacement';\nimport { dataLayerPush } from '../../../../google/dataLayerPush';\n\nimport type {\n SnippetPhoneQuery$data as SnippetPhoneQueryResponse,\n SnippetPhoneQuery$variables as SnippetPhoneQueryVariables\n} from './__generated__/SnippetPhoneQuery.graphql';\n\ntype PhoneParamsType = {\n newBuildingId: number;\n developerId: number;\n phoneNum: number;\n whitelabel?: NewBuildingWhitelabelEnum;\n}\n\ninterface IPhoneProps {\n phoneParams: PhoneParamsType;\n isMobile?: boolean;\n render?(props: {\n href?: string;\n handleClick: Function;\n phone: string;\n loading: boolean;\n }): React.ReactElement;\n onPhoneEventPush?: () => void;\n onMap?: boolean;\n calltouchId?: string;\n fullWidth?: LinkButtonProps['fullWidth'];\n variant?: LinkButtonProps['variant'];\n size?: LinkButtonProps['size'];\n gtm?: LinkButtonProps['gtm'];\n}\n\ntype ButtonDataType = {\n href?: string;\n text: string;\n loading: boolean;\n};\n\nconst DEFAULT_BUTTON_TEXT = 'Показать телефон';\n\nconst SNIPPET_PHONE_QUERY = graphql`\n query SnippetPhoneQuery(\n $developerId: Int!,\n $newBuildingId: Int!,\n $phoneNum: Int!,\n $whitelabel: NewBuildingWhitelabelEnum\n ) {\n newBuildingPhone(\n phoneNum: $phoneNum\n newBuildingId: $newBuildingId\n developerId: $developerId\n whiteLabel: $whitelabel\n ) {\n formattedNumber\n isReplaceable\n }\n }\n`;\n\nconst SnippetPhone = ({\n onPhoneEventPush,\n phoneParams,\n render,\n onMap,\n isMobile,\n calltouchId,\n ...buttonProps\n}: IPhoneProps) => {\n const [ phoneFromGql, setPhoneFromGql ] = useState<{\n formattedNumber: string;\n isReplaceable: boolean;\n }>({\n formattedNumber: '',\n isReplaceable: false\n });\n const [ originalPhone, setOriginalPhone ] = useState<string>('');\n const [ buttonData, setButtonData ] = useState<ButtonDataType>({\n href: undefined,\n text: DEFAULT_BUTTON_TEXT,\n loading: false\n });\n\n const phoneParamsRef = useRef<PhoneParamsType>();\n\n useEffect(() => {\n if (! isEqual(phoneParamsRef.current, phoneParams)) {\n phoneParamsRef.current = phoneParams;\n }\n }, [ phoneParams ]);\n\n const { load } = useManualGql<SnippetPhoneQueryVariables, SnippetPhoneQueryResponse>(SNIPPET_PHONE_QUERY);\n\n const makeCall = useCallback((phoneURL?: string) => {\n const href = phoneURL || buttonData.href;\n\n href && window.open(href, '_self');\n }, [ buttonData.href ]);\n\n const handleClick = useCallback(() => {\n if (! phoneFromGql.formattedNumber) {\n setButtonData(prevState => ({\n ...prevState,\n loading: true\n }));\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n load(phoneParams).then(data => {\n if (data?.newBuildingPhone) {\n setPhoneFromGql(data?.newBuildingPhone);\n }\n });\n\n onPhoneEventPush && onPhoneEventPush();\n\n return;\n }\n\n isMobile && makeCall();\n }, [ onPhoneEventPush, phoneFromGql.formattedNumber, isMobile, makeCall, load, phoneParams ]);\n\n useEffect(() => {\n if (phoneFromGql.formattedNumber) {\n let original = phoneFromGql.formattedNumber.replace(/\\s/g, '');\n\n original = original.substring(original.length - 10);\n\n setOriginalPhone(original);\n }\n }, [ calltouchId, phoneFromGql.formattedNumber ]);\n\n const { calltouchPhone, hasTriedReplace, replaceError } = useCalltouchReplacement({\n originalPhone,\n ctId: calltouchId\n });\n\n useEffect(() => {\n if ((hasTriedReplace || ! calltouchId) && originalPhone && buttonData.text === DEFAULT_BUTTON_TEXT) {\n const phone = calltouchPhone || originalPhone;\n const href = `tel:+7${phone}`;\n\n setButtonData(prevState => ({\n ...prevState,\n href,\n text: formatPhone(`8${phone}`, { skipSymbols: true, separateLast: true }),\n loading: false\n }));\n\n isMobile && makeCall(href);\n }\n }, [\n isMobile, calltouchId, calltouchPhone, originalPhone, buttonData.text, hasTriedReplace, makeCall\n ]);\n\n useEffect(() => {\n if (calltouchPhone) {\n dataLayerPush({\n event: NewBuildingAnalytics.NewBuildingReplacePhone,\n 'phone-origin': originalPhone,\n 'phone-replace': calltouchPhone\n });\n }\n }, [ calltouchPhone, originalPhone ]);\n\n useEffect(() => {\n if (replaceError !== 'NONE') {\n dataLayerPush({\n event: NewBuildingAnalytics.NewBuildingReplacePhoneFail,\n 'phone-origin': originalPhone\n });\n }\n }, [ replaceError, originalPhone ]);\n\n useEffect(() => {\n if (hasTriedReplace) {\n dataLayerPush({\n event: NewBuildingAnalytics.NewBuildingReplacePhoneTry,\n replaceable: phoneFromGql.isReplaceable,\n replaced: Boolean(calltouchPhone),\n 'replace-error': replaceError,\n 'phone-origin': originalPhone,\n ...(calltouchPhone ? {\n 'phone-replace': calltouchPhone\n } : {})\n });\n }\n }, [ hasTriedReplace, calltouchPhone, phoneFromGql.isReplaceable, originalPhone ]);\n\n if (render) {\n return render({\n handleClick,\n href: buttonData.href,\n phone: buttonData.text,\n loading: buttonData.loading\n });\n }\n\n const commonButtonProps = {\n size: buttonProps.size ?? 's',\n onClick: handleClick,\n href: buttonData.href,\n gtm: onPhoneEventPush || phoneFromGql.formattedNumber ? undefined : (buttonProps.gtm ?? DATA_GTM.SNIPPET_PHONE),\n fullWidth: buttonProps.fullWidth,\n variant: buttonProps.variant ?? 'primary',\n loading: buttonData.loading\n };\n\n return isMobile ? (\n <Button\n {...commonButtonProps}\n variant={buttonProps.variant ?? 'primary'}\n >\n Позвонить\n </Button>\n ) : (\n <LinkButton\n {...commonButtonProps}\n href={buttonData.href}\n >\n {buttonData.text}\n </LinkButton>\n );\n};\n\nexport default SnippetPhone;\n","import React from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'FilterCollapser');\n\nexport function FilterCollapser({\n activeCount,\n collapsed,\n reset: resetRaw,\n toggle\n}: {\n toggle: () => void;\n reset: () => void;\n activeCount: number;\n collapsed: boolean;\n}) {\n const reset = React.useCallback((e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n resetRaw();\n }, [ resetRaw ]);\n\n return (\n <div\n onClick={toggle}\n className={cn()}\n data-test='filter-toggle'\n >\n <div className={cn('inner')}>\n <Typography variant='primary'>Фильтры</Typography>\n {\n activeCount ? (\n <>\n <div className={cn('counter')}>{activeCount}</div>\n <Typography\n tag='span'\n variant='primary'\n onClick={reset}\n className={cn('reset')}\n data-test='filter-reset'\n >\n Сбросить\n </Typography>\n </>\n ) : null\n }\n </div>\n <div className={cn('toggle')}>\n <Icon\n name={collapsed ? 'chevron-down' : 'chevron-up'}\n size={Size.Small}\n />\n </div>\n </div>\n );\n}\n\nexport function useFilterCollapser({\n reset,\n initCollapsed = false,\n clearSelected\n}: {\n clearSelected: () => void;\n initCollapsed?: boolean;\n reset?: () => void;\n}) {\n const [ collapsed, setCollapsed ] = React.useState<boolean>(initCollapsed);\n\n const toggleCollapsed = React.useCallback(() => {\n setCollapsed(prevState => ! prevState);\n clearSelected();\n }, [ setCollapsed, clearSelected ]);\n\n const handleReset = React.useCallback(() => {\n setCollapsed(false);\n clearSelected();\n reset && reset();\n }, [ reset, setCollapsed, clearSelected ]);\n\n const close = React.useCallback(\n () => setCollapsed(true),\n [ setCollapsed ]\n );\n\n return {\n reset: handleReset,\n collapsed,\n close,\n toggleCollapsed\n };\n}\n","import React, { useState } from 'react';\n\nexport interface ISnippetContext {\n state: ISnippetProviderContext;\n toggleMap: () => void;\n openMap: () => void;\n closeMap: () => void;\n setState: React.Dispatch<React.SetStateAction<ISnippetProviderContext>>;\n}\n\nexport interface ISnippetProviderContext {\n isOpenMap: boolean;\n}\n\nexport const SnippetContext = React.createContext<ISnippetContext | undefined>(undefined);\n\nexport const SnippetProviderContext: React.FunctionComponent<{}> = props => {\n const [ state, setState ] = useState<ISnippetProviderContext>({ isOpenMap: false });\n const toggleMap = () => {\n setState(prevState => ({ ...prevState, isOpenMap: ! prevState.isOpenMap }));\n };\n const openMap = () => {\n setState(prevState => prevState.isOpenMap ? prevState : { ...prevState, isOpenMap: true });\n };\n const closeMap = () => {\n setState(prevState => ! prevState.isOpenMap ? prevState : { ...prevState, isOpenMap: false });\n };\n\n return (\n <SnippetContext.Provider value={{ state, toggleMap, openMap, setState, closeMap }}>\n {props.children}\n </SnippetContext.Provider>\n );\n};\n","/* eslint-disable camelcase */\nimport { DeveloperWithPromoName } from './types';\n\nconst DeveloperToRegionMap = {\n samolet: 'ipoteka',\n mortgage: 'ipoteka_region'\n} as const;\n\ntype DeveloperWithPromoNameOrMoprtgage = DeveloperWithPromoName | 'mortgage';\ntype SpecProjectCityKeys = typeof DeveloperToRegionMap[keyof typeof DeveloperToRegionMap]\ntype DeveloperPromoEvent = {\n event: 'nb_evt_banner';\n theme: `${SpecProjectCityKeys}_special_project`;\n section: 'banner_right' | 'banner_left' | 'promo_block' | 'spec_snippet' | 'slider' | 'JK_list' | 'phone' | 'JK' | 'developer' | 'logo';\n action: 'click' | 'view' | 'open';\n pageType: 'card' | 'serp' | 'landing' | 'placeholder' | 'main';\n};\n\nexport type DeveloperPromoEventResult = Omit<DeveloperPromoEvent, 'pageType'> & { page_type: DeveloperPromoEvent['pageType'] }\n\nexport const getDeveloperBannerGtmData = (\n developerWithPromoName: DeveloperWithPromoNameOrMoprtgage | undefined | string,\n data: Pick<DeveloperPromoEvent, 'section' | 'action' | 'pageType'>\n): DeveloperPromoEventResult | undefined => {\n const { pageType: page_type, ...rest } = data;\n const commonFields = { ...rest, page_type, event: 'nb_evt_banner' as const };\n\n switch (developerWithPromoName) {\n case 'samolet':\n if (page_type === 'card') {\n return {\n theme: `${DeveloperToRegionMap[developerWithPromoName]}_special_project`,\n ...commonFields\n };\n }\n break;\n\n default: {\n const keySpecProject = DeveloperToRegionMap[developerWithPromoName as unknown as DeveloperWithPromoNameOrMoprtgage];\n\n if (! keySpecProject) return;\n return {\n theme: `${keySpecProject}_special_project`,\n ...commonFields\n };\n }\n }\n};\n","import { IDeserializer } from '../../../view/filters/services/codecs/FilterDeserializer';\nimport {\n Filters,\n IFilter,\n RoomFilter,\n RegionFilter,\n PriceFilter,\n TransportLimitFilter,\n GeoFilter,\n CommissioningFilter,\n FinishingTypeFilter,\n AreaFilter,\n LivingAreaFilter,\n KitchenAreaFilter,\n FloorFilter,\n CellHeightFilter,\n BathroomFilter,\n BalconyFilter,\n ParkingFilter,\n WallsTypeFilter,\n ApartmentFilter,\n PositionFilter,\n DeveloperFilter,\n FloorsTotalFilter,\n BuildingClassFilter,\n SafetyFilter,\n AccreditationFilter,\n NewBuildingDealFilter,\n PaymentTypeFilter,\n CommissioningListFilter,\n BuildingsFilter,\n FinishingFlatFilter,\n ClosedSalesFilter,\n ShowHighlightedFilter,\n MapBoundsFilter,\n SelectedNewBuildingFilter,\n FlatsSpecialEventsFilter,\n OtherSpecialEventsFilter,\n MiscSpecialEventsFilter,\n NotOnlyM2ProFilter,\n} from '../../../view/filters/models/Filter';\n\nimport {\n Area,\n FloorConstraints,\n Rooms,\n TransportType,\n TimeLimit,\n CeilingHeight,\n BalconyOptions,\n ParkingType,\n WallsType,\n IsApartments,\n Position,\n Safety,\n BuildingClass,\n Accreditation,\n NewBuildingDeal,\n PaymentType,\n Bathroom,\n FlatsSpecialEvents,\n OtherSpecialEvents,\n MiscSpecialEvents\n} from './converters';\n\nconst ensureArray = (value: any): any[] => value ? [].concat(value) : [];\nconst ensureNumericArray = (value: any): number[] => ensureArray(value).map(Number);\n\nconst deserializers: Record<Filters, IDeserializer> = {\n [Filters.commissioning]: {\n keys: [ 'commissioning' ],\n handler: ({ commissioning }) => new CommissioningFilter(commissioning)\n },\n [Filters.finishingType]: {\n keys: [ 'hasFinishing', 'finishingType' ],\n handler: ({ hasFinishing, finishingType }) => new FinishingTypeFilter({\n hasFinishing,\n finishingType\n })\n },\n [Filters.region]: {\n keys: [ 'region' ],\n handler: ({ region }) => new RegionFilter(region && parseInt(region, 10))\n },\n [Filters.rooms]: {\n keys: [ 'rooms' ],\n handler: ({ rooms }) => new RoomFilter(\n ensureArray(rooms).map(value => Rooms.enumValue[value as keyof typeof Rooms.enumValue])\n )\n },\n [Filters.price]: {\n keys: [ 'priceMin', 'priceMax', 'priceType' ],\n handler: ({ priceMin, priceMax, priceType }) => new PriceFilter(\n Area.enumValue[priceType as keyof typeof Area.enumValue],\n {\n from: priceMin || null,\n to: priceMax || null\n }\n )\n },\n [Filters.transportLimit]: {\n keys: [ 'transportType', 'maxMinutes' ],\n handler: ({ transportType, maxMinutes }) => new TransportLimitFilter(\n TimeLimit.enumValue[maxMinutes],\n TransportType.enumValue[transportType]\n )\n },\n [Filters.geo]: {\n keys: [ 'metroId', 'districtId', 'addressId', 'newBuildingId' ],\n handler: ({ metroId, districtId, addressId, newBuildingId }) => {\n const parsedMetroIds = ensureNumericArray(metroId);\n const parsedDistrictIds = ensureNumericArray(districtId);\n const parsedAddressIds = ensureNumericArray(addressId);\n const parsedNewBuildingIds = ensureNumericArray(newBuildingId);\n\n return new GeoFilter(\n new Set([ ...parsedMetroIds, ...parsedDistrictIds, ...parsedAddressIds ]),\n parsedMetroIds,\n parsedDistrictIds,\n parsedAddressIds,\n parsedNewBuildingIds\n );\n }\n },\n [Filters.totalArea]: {\n keys: [ 'totalAreaRangeMin', 'totalAreaRangeMax' ],\n handler: ({ totalAreaRangeMin, totalAreaRangeMax }) => new AreaFilter({\n from: totalAreaRangeMin || null,\n to: totalAreaRangeMax || null\n })\n },\n [Filters.livingArea]: {\n keys: [ 'livingAreaRangeMin', 'livingAreaRangeMax' ],\n handler: ({ livingAreaRangeMin, livingAreaRangeMax }) => new LivingAreaFilter({\n from: livingAreaRangeMin || null,\n to: livingAreaRangeMax || null\n })\n },\n [Filters.kitchenArea]: {\n keys: [ 'kitchenAreaRangeMin' ],\n handler: ({ kitchenAreaRangeMin }) => new KitchenAreaFilter({\n from: kitchenAreaRangeMin || null,\n to: null\n })\n },\n [Filters.floor]: {\n keys: [ 'floorMin', 'floorMax', 'floorFirst', 'floorLast' ],\n handler: ({ floorMin, floorMax, floorFirst, floorLast }) => new FloorFilter(\n {\n from: floorMin || null,\n to: floorMax || null\n },\n FloorConstraints.enumValue[floorFirst] || null,\n FloorConstraints.enumValue[floorLast] || null\n )\n },\n [Filters.cellHeight]: {\n keys: [ 'ceilingHeight' ],\n handler: ({ ceilingHeight }) => new CellHeightFilter(\n CeilingHeight.enumValue[ceilingHeight as keyof typeof CeilingHeight.enumValue]\n )\n },\n [Filters.bathroom]: {\n keys: [ 'bathroom' ],\n handler: ({ bathroom }) => {\n if (! bathroom) {\n return new BathroomFilter();\n }\n\n return new BathroomFilter(\n [].concat(bathroom)\n .map((value: string) => Bathroom.enumValue[value])\n .filter(Boolean)\n );\n }\n },\n [Filters.balcony]: {\n keys: [ 'balcony' ],\n handler: ({ balcony }) => new BalconyFilter(balcony ? BalconyOptions.enumValue.HAS_ANY : undefined)\n },\n [Filters.parkings]: {\n keys: [ 'parking' ],\n handler: ({ parking }) => new ParkingFilter(\n ensureArray(parking)\n .map(item => ParkingType.enumValue[item as keyof typeof ParkingType.enumValue])\n )\n },\n [Filters.walls]: {\n keys: [ 'wallsType' ],\n handler: ({ wallsType }) => new WallsTypeFilter(\n ensureArray(wallsType)\n .map(item => WallsType.enumValue[item as keyof typeof WallsType.enumValue])\n )\n },\n [Filters.apartments]: {\n keys: [ 'apartments' ],\n handler: ({ apartments }) => new ApartmentFilter(\n IsApartments.enumValue[apartments as keyof typeof IsApartments.enumValue]\n )\n },\n [Filters.position]: {\n keys: [ 'standalone' ],\n handler: ({ standalone }) => new PositionFilter(\n [ standalone && Position.enumValue.standalone ]\n .filter(Boolean)\n )\n },\n [Filters.safety]: {\n keys: [ 'concierge', 'closedArea', 'guardedArea' ],\n handler: ({ concierge, closedArea, guardedArea }) => new SafetyFilter(\n [\n concierge && Safety.enumValue.concierge,\n closedArea && Safety.enumValue.closedArea,\n guardedArea && Safety.enumValue.guardedArea\n ]\n .filter(Boolean)\n )\n },\n [Filters.developer]: {\n keys: [ 'developerId' ],\n handler: ({ developerId }) => new DeveloperFilter(developerId && Number(developerId))\n },\n [Filters.floorsTotal]: {\n keys: [ 'floorsTotalMin', 'floorsTotalMax' ],\n handler: ({ floorsTotalMin, floorsTotalMax }) => new FloorsTotalFilter({\n from: floorsTotalMin || null,\n to: floorsTotalMax || null\n })\n },\n [Filters.buildingClass]: {\n keys: [ 'buildingClass' ],\n handler: ({ buildingClass }) => new BuildingClassFilter(\n ensureArray(buildingClass)\n .map(item => BuildingClass.enumValue[item as keyof typeof BuildingClass.enumValue])\n )\n },\n [Filters.accreditation]: {\n keys: [ 'accreditedByVTB' ],\n handler: ({ accreditedByVTB }) => new AccreditationFilter(\n [ accreditedByVTB && Accreditation.enumValue.accreditedByVTB ]\n .filter(Boolean)\n )\n },\n [Filters.newBuildingDeal]: {\n keys: [ 'law214', 'escrow' ],\n handler: ({ law214, escrow }) => new NewBuildingDealFilter(\n [\n law214 && NewBuildingDeal.enumValue.law214,\n escrow && NewBuildingDeal.enumValue.escrow\n ]\n .filter(Boolean)\n )\n },\n [Filters.paymentType]: {\n keys: [ 'armyMortgage', 'installment', 'motherCapital' ],\n handler: ({ armyMortgage, installment, motherCapital }) => new PaymentTypeFilter(\n [\n armyMortgage && PaymentType.enumValue.armyMortgage,\n installment && PaymentType.enumValue.installment,\n motherCapital && PaymentType.enumValue.motherCapital\n ]\n .filter(Boolean)\n )\n },\n [Filters.commissioningList]: {\n keys: [ 'commissioningDate' ],\n handler: ({ commissioningDate }) => new CommissioningListFilter(ensureArray(commissioningDate))\n },\n [Filters.buildings]: {\n keys: [ 'buildingId' ],\n handler: ({ buildingId }) => new BuildingsFilter(ensureNumericArray(buildingId))\n },\n [Filters.finishingFlat]: {\n keys: [ 'finishingFlat' ],\n handler: ({ finishingFlat }) => new FinishingFlatFilter({ finishingType: finishingFlat })\n },\n [Filters.closedSales]: {\n keys: [ 'closedSales' ],\n handler: ({ closedSales }) => new ClosedSalesFilter(closedSales)\n },\n [Filters.showHighlighted]: {\n keys: [ 'showHighlighted' ],\n handler: ({ showHighlighted }) => new ShowHighlightedFilter(showHighlighted)\n },\n [Filters.mapBounds]: {\n keys: [ 'mapBounds' ],\n handler: ({ mapBounds }) => {\n return new MapBoundsFilter(mapBounds?.bounds, mapBounds?.polygon);\n }\n },\n [Filters.selectedNewBuilding]: {\n keys: [ 'selectedNewBuildingId' ],\n handler: ({ selectedNewBuildingId }) => new SelectedNewBuildingFilter(\n selectedNewBuildingId && Number(selectedNewBuildingId)\n )\n },\n [Filters.flatsSpecialEvents]: {\n keys: [ 'flatsSpecialEvents' ],\n handler: ({ flatsSpecialEvents }) => new FlatsSpecialEventsFilter(\n ensureArray(flatsSpecialEvents)\n .map(item => FlatsSpecialEvents.enumValue[item as keyof typeof FlatsSpecialEvents.enumValue])\n )\n },\n [Filters.otherSpecialEvents]: {\n keys: [ 'otherSpecialEvents' ],\n handler: ({ otherSpecialEvents }) => new OtherSpecialEventsFilter(\n ensureArray(otherSpecialEvents)\n .map(item => OtherSpecialEvents.enumValue[item as keyof typeof OtherSpecialEvents.enumValue])\n )\n },\n [Filters.miscSpecialEvents]: {\n keys: [ 'miscSpecialEvents' ],\n handler: ({ miscSpecialEvents }) => new MiscSpecialEventsFilter(\n ensureArray(miscSpecialEvents)\n .map(item => MiscSpecialEvents.enumValue[item as keyof typeof MiscSpecialEvents.enumValue])\n )\n },\n [Filters.notOnlyM2Pro]: {\n keys: [ 'notOnlyM2Pro' ],\n handler: ({ notOnlyM2Pro }) => new NotOnlyM2ProFilter(notOnlyM2Pro)\n }\n};\n\nclass NewbuildingFilterDeserializer {\n deserialize(parsedQuery: any): Map<Filters, IFilter> {\n const result: Map<Filters, IFilter> = new Map<Filters, IFilter>();\n\n (Object.keys(deserializers) as Filters[]).forEach((filterName: Filters) => {\n const keys = deserializers[filterName].keys;\n\n const hasFilter = keys.some(key => {\n // @ts-ignore\n return parsedQuery[key] !== undefined || parsedQuery[key] !== null;\n });\n\n const data = {};\n\n for (const key of keys) {\n // @ts-ignore\n const parsedObject = parsedQuery[key];\n\n if (parsedObject) {\n // @ts-ignore\n data[key] = parsedObject;\n }\n }\n\n if (hasFilter) {\n result.set(filterName, deserializers[filterName].handler(data));\n }\n });\n\n return result;\n }\n}\n\nexport const newbuildingFilterDeserializer = new NewbuildingFilterDeserializer();\n","import { FilterCollection } from '../../../view/filters/models/FilterCollection';\n\nexport class NewbuildingFilterCollection extends FilterCollection {\n rebuild() {\n return new NewbuildingFilterCollection(this._filters);\n }\n}\n","import { IFilter, Filters } from '../../../view/filters/models/Filter';\nimport { NewbuildingFilterCollection } from './NewbuildingFilterCollection';\n\nclass NewbuildingFilterFactory {\n create(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>()\n ): NewbuildingFilterCollection {\n return new NewbuildingFilterCollection(\n new Map<Filters, IFilter>(filters.entries())\n );\n }\n}\n\nexport const newbuildingFilterFactory = new NewbuildingFilterFactory();\n","import {\n Filters,\n IFilter,\n AreaFilter,\n LivingAreaFilter,\n KitchenAreaFilter,\n FloorFilter,\n CellHeightFilter,\n BathroomFilter,\n BalconyFilter,\n GeoFilter,\n TransportLimitFilter,\n SafetyFilter,\n ParkingFilter,\n WallsTypeFilter,\n ApartmentFilter,\n PositionFilter,\n DeveloperFilter,\n FloorsTotalFilter,\n BuildingClassFilter,\n AccreditationFilter,\n NewBuildingDealFilter,\n PaymentTypeFilter,\n ClosedSalesFilter,\n ShowHighlightedFilter,\n BuildingsFilter,\n SelectedNewBuildingFilter,\n CommissioningListFilter,\n RoomFilter,\n PriceFilter,\n FinishingFlatFilter,\n FlatsSpecialEventsFilter,\n OtherSpecialEventsFilter,\n MiscSpecialEventsFilter,\n NotOnlyM2ProFilter\n} from '../../../view/filters/models/Filter';\n\nimport { NewbuildingFilterCollection } from './NewbuildingFilterCollection';\nimport { newbuildingFilterDeserializer } from './NewbuildingFilterDeserializer';\nimport { newbuildingFilterFactory } from './NewbuildingFilterFactory';\n\nexport function getInitialFilters(params?: Object) {\n let initialFilters;\n\n if (params) {\n initialFilters = newbuildingFilterDeserializer.deserialize(params);\n }\n\n return newbuildingFilterFactory.create(initialFilters);\n}\n\nexport function getInitialAdditionalFilters(prev: NewbuildingFilterCollection, resetGeo = true) {\n return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n ...prev.getFilters(),\n [ Filters.totalArea, new AreaFilter() ],\n [ Filters.livingArea, new LivingAreaFilter() ],\n [ Filters.kitchenArea, new KitchenAreaFilter() ],\n [ Filters.floor, new FloorFilter() ],\n [ Filters.cellHeight, new CellHeightFilter() ],\n [ Filters.bathroom, new BathroomFilter() ],\n [ Filters.balcony, new BalconyFilter() ],\n [ Filters.developer, new DeveloperFilter() ],\n [ Filters.floorsTotal, new FloorsTotalFilter() ],\n [ Filters.buildingClass, new BuildingClassFilter() ],\n [ Filters.parkings, new ParkingFilter() ],\n [ Filters.walls, new WallsTypeFilter() ],\n [ Filters.apartments, new ApartmentFilter() ],\n [ Filters.position, new PositionFilter() ],\n [ Filters.safety, new SafetyFilter() ],\n [ Filters.accreditation, new AccreditationFilter() ],\n [ Filters.newBuildingDeal, new NewBuildingDealFilter() ],\n [ Filters.paymentType, new PaymentTypeFilter() ],\n [ Filters.transportLimit, new TransportLimitFilter() ],\n [ Filters.closedSales, new ClosedSalesFilter() ],\n [ Filters.selectedNewBuilding, new SelectedNewBuildingFilter() ],\n [ Filters.showHighlighted, new ShowHighlightedFilter() ],\n [ Filters.flatsSpecialEvents, new FlatsSpecialEventsFilter() ],\n [ Filters.otherSpecialEvents, new OtherSpecialEventsFilter() ],\n [ Filters.miscSpecialEvents, new MiscSpecialEventsFilter() ],\n [ Filters.notOnlyM2Pro, new NotOnlyM2ProFilter() ],\n [ Filters.geo, resetGeo ? new GeoFilter() : prev.get(Filters.geo) ]\n ]));\n}\n\nexport function getInitialOfferBuildingsFilters(prev: NewbuildingFilterCollection) {\n return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n ...prev.getFilters(),\n [ Filters.buildings, new BuildingsFilter() ]\n ]));\n}\n\nexport function getInitialOfferFilters(prev: NewbuildingFilterCollection) {\n return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n ...prev.getFilters(),\n [ Filters.commissioningList, new CommissioningListFilter() ],\n [ Filters.rooms, new RoomFilter() ],\n [ Filters.price, new PriceFilter() ],\n [ Filters.totalArea, new AreaFilter() ],\n [ Filters.livingArea, new LivingAreaFilter() ],\n [ Filters.kitchenArea, new KitchenAreaFilter() ],\n [ Filters.floor, new FloorFilter() ],\n [ Filters.finishingFlat, new FinishingFlatFilter() ]\n ]));\n}\n","import {\n Filters,\n IFilter,\n CommissioningFilter,\n FinishingTypeFilter,\n RegionFilter,\n RoomFilter,\n PriceFilter,\n TransportLimitFilter,\n GeoFilter,\n AreaFilter,\n LivingAreaFilter,\n KitchenAreaFilter,\n FloorFilter,\n CellHeightFilter,\n BathroomFilter,\n BalconyFilter,\n ParkingFilter,\n WallsTypeFilter,\n ApartmentFilter,\n PositionFilter,\n SafetyFilter,\n DeveloperFilter,\n FloorsTotalFilter,\n BuildingClassFilter,\n AccreditationFilter,\n NewBuildingDealFilter,\n PaymentTypeFilter,\n CommissioningListFilter,\n BuildingsFilter,\n FinishingFlatFilter,\n ClosedSalesFilter,\n ShowHighlightedFilter,\n MapBoundsFilter,\n SelectedNewBuildingFilter,\n FlatsSpecialEventsFilter,\n OtherSpecialEventsFilter,\n MiscSpecialEventsFilter,\n NotOnlyM2ProFilter\n} from '../../../view/filters/models/Filter';\n\nimport {\n Area,\n FloorConstraints,\n Rooms,\n TransportType,\n TimeLimit,\n CeilingHeight,\n Bathroom,\n BalconyOptions,\n ParkingType,\n WallsType,\n IsApartments,\n Position,\n Safety,\n BuildingClass,\n Accreditation,\n NewBuildingDeal,\n PaymentType,\n FlatsSpecialEvents,\n OtherSpecialEvents,\n MiscSpecialEvents\n} from './converters';\n\nconst serializers: Record<Filters, Function> = {\n [Filters.commissioning]: (filter: CommissioningFilter) => filter.commissioning,\n [Filters.finishingType]: (filter: FinishingTypeFilter) => ({\n hasFinishing: filter.value.hasFinishing,\n finishingType: filter.value.finishingType\n }),\n [Filters.region]: (filter: RegionFilter) => ({\n region: filter.region\n }),\n [Filters.rooms]: (filter: RoomFilter) => filter.rooms.map(val => Rooms.stringValue[val]),\n [Filters.price]: (filter: PriceFilter) => ({\n priceMin: filter.value.from,\n priceMax: filter.value.to,\n priceType: Area.stringValue[filter.priceType]\n }),\n [Filters.transportLimit]: (filter: TransportLimitFilter) => {\n return {\n transportType: TransportType.stringValue[filter.transportType],\n maxMinutes: TimeLimit.stringValue[filter.timeLimit]\n };\n },\n [Filters.geo]: (filter: GeoFilter) => ({\n metroId: filter.metroIds,\n districtId: filter.districtIds,\n addressId: filter.addressIds,\n newBuildingId: filter.newBuildingIds\n }),\n [Filters.totalArea]: (filter: AreaFilter) => ({\n totalAreaRangeMin: filter.value.from,\n totalAreaRangeMax: filter.value.to\n }),\n [Filters.livingArea]: (filter: LivingAreaFilter) => ({\n livingAreaRangeMin: filter.value.from,\n livingAreaRangeMax: filter.value.to\n }),\n [Filters.kitchenArea]: (filter: KitchenAreaFilter) => ({\n kitchenAreaRangeMin: filter.value.from\n }),\n [Filters.floor]: (filter: FloorFilter) => ({\n floorMin: filter.range.from,\n floorMax: filter.range.to,\n floorFirst: FloorConstraints.stringValue[filter.first],\n floorLast: FloorConstraints.stringValue[filter.last]\n }),\n [Filters.cellHeight]: (filter: CellHeightFilter) => ({\n ceilingHeight: CeilingHeight.stringValue[filter.value]\n }),\n [Filters.bathroom]: (filter: BathroomFilter) => filter.value\n .map(value => Bathroom.stringValue[value])\n .filter(Boolean),\n [Filters.balcony]: (filter: BalconyFilter) => BalconyOptions.stringValue[filter.hasBalcony] ? 'YES' : undefined,\n [Filters.parkings]: (filter: ParkingFilter) => ({\n parking: filter.parkings.map(val => ParkingType.stringValue[val])\n }),\n [Filters.walls]: (filter: WallsTypeFilter) => ({\n wallsType: filter.walls.map(val => WallsType.stringValue[val])\n }),\n [Filters.apartments]: (filter: ApartmentFilter) => IsApartments.stringValue[filter.isApartment],\n [Filters.position]: (filter: PositionFilter) => (filter.position.reduce((params, val) => ({\n ...params,\n [Position.stringValue[val]]: 'YES'\n }), {})),\n [Filters.safety]: (filter: SafetyFilter) => (filter.safety.reduce((params, val) => ({\n ...params,\n [Safety.stringValue[val]]: 'YES'\n }), {})),\n [Filters.developer]: (filter: DeveloperFilter) => ({\n developerId: filter.developerId\n }),\n [Filters.floorsTotal]: (filter: FloorsTotalFilter) => ({\n floorsTotalMin: filter.range.from,\n floorsTotalMax: filter.range.to\n }),\n [Filters.buildingClass]: (filter: BuildingClassFilter) => ({\n buildingClass: filter.buildingClass.map(val => BuildingClass.stringValue[val])\n }),\n [Filters.accreditation]: (filter: AccreditationFilter) => (filter.accreditation.reduce((params, val) => ({\n ...params,\n [Accreditation.stringValue[val]]: 'YES'\n }), {})),\n [Filters.newBuildingDeal]: (filter: NewBuildingDealFilter) => (filter.deal.reduce((params, val) => ({\n ...params,\n [NewBuildingDeal.stringValue[val]]: 'YES'\n }), {})),\n [Filters.paymentType]: (filter: PaymentTypeFilter) => (filter.type.reduce((params, val) => ({\n ...params,\n [PaymentType.stringValue[val]]: 'YES'\n }), {})),\n [Filters.commissioningList]: (filter: CommissioningListFilter) => ({\n commissioningDate: filter.commissioningList\n }),\n [Filters.buildings]: (filter: BuildingsFilter) => ({\n buildingId: filter.buildings\n }),\n [Filters.finishingFlat]: (filter: FinishingFlatFilter) => filter.value.finishingType,\n [Filters.closedSales]: (filter: ClosedSalesFilter) => filter.includingClosedSales,\n [Filters.showHighlighted]: (filter: ShowHighlightedFilter) => filter.shouldShowHighlighted,\n [Filters.mapBounds]: (filter: MapBoundsFilter) => ({\n mapBounds: {\n bounds: filter.bounds,\n polygon: filter.polygon\n }\n }),\n [Filters.selectedNewBuilding]: (filter: SelectedNewBuildingFilter) => ({\n selectedNewBuildingId: filter.selectedNewBuildingId\n }),\n [Filters.flatsSpecialEvents]: (filter: FlatsSpecialEventsFilter) => ({\n flatsSpecialEvents: filter.value.map(val => FlatsSpecialEvents.stringValue[val])\n }),\n [Filters.otherSpecialEvents]: (filter: OtherSpecialEventsFilter) => ({\n otherSpecialEvents: filter.value.map(val => OtherSpecialEvents.stringValue[val])\n }),\n [Filters.miscSpecialEvents]: (filter: MiscSpecialEventsFilter) => ({\n miscSpecialEvents: filter.value.map(val => MiscSpecialEvents.stringValue[val])\n }),\n [Filters.notOnlyM2Pro]: (filter: NotOnlyM2ProFilter) => filter.notOnlyM2Pro\n};\n\nconst addValue: any = (\n values: Record<string, any>,\n key: string,\n value: any,\n destructObjects: boolean = true\n) => {\n if (\n value === null ||\n typeof value === 'undefined' ||\n value === 'UNKNOWN'\n ) {\n return values;\n }\n\n if (Array.isArray(value)) {\n const filteredValue = value.filter(Boolean);\n\n if (filteredValue.length === 0) {\n return values;\n }\n\n return {\n ...values,\n [key]: filteredValue\n };\n }\n\n if (destructObjects && typeof value === 'object') {\n return Object.keys(value)\n .reduce(\n (subValues, subKey) => addValue(subValues, subKey, value[subKey], false),\n values\n );\n }\n\n return {\n ...values,\n [key]: value\n };\n};\n\nclass NewbuildingFilterSerializer {\n serialize(\n filters: Map<Filters, IFilter>\n ) {\n return Object.keys(serializers)\n .reduce((values, filterName) => {\n const filter = filters.get(filterName as Filters);\n\n return filter ? addValue(\n values,\n filterName,\n serializers[filterName as Filters](filter)\n ) : values;\n }, {});\n }\n}\n\nexport const newbuildingFilterSerializer = new NewbuildingFilterSerializer();\n","import {\n Rooms as RoomsEnum,\n AreaUnit as AreaUnitEnum,\n FloorConstraints as FloorConstraintsEnum,\n TimeLimit as TimeLimitEnum,\n TransportType as TransportTypeEnum,\n CeilingHeight as CeilingHeightEnum,\n Bathroom as BathroomEnum,\n BalconyOptions as BalconyOptionsEnum,\n ParkingType as ParkingTypeEnum,\n WallsType as WallsTypeEnum,\n IsApartmentsOptions as IsApartmentsEnum,\n Position as PositionEnum,\n BuildingClass as BuildingClassEnum,\n Safety as SafetyEnum,\n Accreditation as AccreditationEnum,\n NewBuildingDeal as NewBuildingDealEnum,\n PaymentType as PaymentTypeEnum,\n FlatsSpecialEvent as FlatsSpecialEventEnum, FlatsSpecialEventString,\n OtherSpecialEvent as OtherSpecialEventEnum, OtherSpecialEventString,\n MiscSpecialEvent as MiscSpecialEventEnum, MiscSpecialEventString\n} from '@search/filter-enums/enums';\n\nexport const Area = {\n stringValue: {\n [AreaUnitEnum.METER]: 'METER'\n },\n enumValue: {\n METER: AreaUnitEnum.METER\n }\n};\n\nexport const FloorConstraints = {\n stringValue: {\n [FloorConstraintsEnum.ONLY]: 'ONLY',\n [FloorConstraintsEnum.EXCLUDE]: 'EXCLUDE'\n },\n enumValue: {\n ONLY: FloorConstraintsEnum.ONLY,\n EXCLUDE: FloorConstraintsEnum.EXCLUDE\n }\n};\n\nexport const Rooms = {\n stringValue: {\n [RoomsEnum.STUDIO]: 'STUDIO',\n [RoomsEnum.ROOM_1]: 'ROOM_1',\n [RoomsEnum.ROOM_2]: 'ROOM_2',\n [RoomsEnum.ROOM_3]: 'ROOM_3',\n [RoomsEnum.ROOM_4]: 'ROOM_4',\n [RoomsEnum.ROOM_5_AND_MORE]: 'ROOM_5_AND_MORE',\n [RoomsEnum.OPEN_PLAN]: 'OPEN_PLAN'\n },\n enumValue: {\n STUDIO: RoomsEnum.STUDIO,\n ROOM_1: RoomsEnum.ROOM_1,\n ROOM_2: RoomsEnum.ROOM_2,\n ROOM_3: RoomsEnum.ROOM_3,\n ROOM_4: RoomsEnum.ROOM_4,\n ROOM_5_AND_MORE: RoomsEnum.ROOM_5_AND_MORE,\n OPEN_PLAN: RoomsEnum.OPEN_PLAN\n }\n};\n\nexport const TransportType = {\n stringValue: {\n [TransportTypeEnum.FOOT]: 'FOOT',\n [TransportTypeEnum.PUBLIC_TRANSPORT]: 'PUBLIC_TRANSPORT'\n },\n enumValue: {\n FOOT: TransportTypeEnum.FOOT,\n PUBLIC_TRANSPORT: TransportTypeEnum.PUBLIC_TRANSPORT\n }\n};\n\nexport const TimeLimit = {\n stringValue: {\n [TimeLimitEnum.MAX_5_MINUTES]: 'MAX_5_MINUTES',\n [TimeLimitEnum.MAX_10_MINUTES]: 'MAX_10_MINUTES',\n [TimeLimitEnum.MAX_15_MINUTES]: 'MAX_15_MINUTES',\n [TimeLimitEnum.MAX_20_MINUTES]: 'MAX_20_MINUTES',\n [TimeLimitEnum.MAX_25_MINUTES]: 'MAX_25_MINUTES',\n [TimeLimitEnum.MAX_30_MINUTES]: 'MAX_30_MINUTES',\n [TimeLimitEnum.MAX_40_MINUTES]: 'MAX_40_MINUTES',\n [TimeLimitEnum.MAX_50_MINUTES]: 'MAX_50_MINUTES',\n [TimeLimitEnum.MAX_60_MINUTES]: 'MAX_60_MINUTES'\n },\n enumValue: {\n MAX_5_MINUTES: TimeLimitEnum.MAX_5_MINUTES,\n MAX_10_MINUTES: TimeLimitEnum.MAX_10_MINUTES,\n MAX_15_MINUTES: TimeLimitEnum.MAX_15_MINUTES,\n MAX_20_MINUTES: TimeLimitEnum.MAX_20_MINUTES,\n MAX_25_MINUTES: TimeLimitEnum.MAX_25_MINUTES,\n MAX_30_MINUTES: TimeLimitEnum.MAX_30_MINUTES,\n MAX_40_MINUTES: TimeLimitEnum.MAX_40_MINUTES,\n MAX_50_MINUTES: TimeLimitEnum.MAX_50_MINUTES,\n MAX_60_MINUTES: TimeLimitEnum.MAX_60_MINUTES\n }\n};\n\nexport const CeilingHeight = {\n stringValue: {\n [CeilingHeightEnum.FROM_2_5]: 'FROM_2_5',\n [CeilingHeightEnum.FROM_2_7]: 'FROM_2_7',\n [CeilingHeightEnum.FROM_3]: 'FROM_3',\n [CeilingHeightEnum.FROM_4]: 'FROM_4'\n },\n enumValue: {\n FROM_2_5: CeilingHeightEnum.FROM_2_5,\n FROM_2_7: CeilingHeightEnum.FROM_2_7,\n FROM_3: CeilingHeightEnum.FROM_3,\n FROM_4: CeilingHeightEnum.FROM_4\n }\n};\n\nexport const Bathroom = {\n stringValue: {\n [BathroomEnum.COMBINED]: 'COMBINED',\n [BathroomEnum.PARTED]: 'PARTED'\n },\n enumValue: {\n COMBINED: BathroomEnum.COMBINED,\n PARTED: BathroomEnum.PARTED\n }\n};\n\nexport const BalconyOptions = {\n stringValue: {\n [BalconyOptionsEnum.HAS_ANY]: 'HAS_ANY'\n },\n enumValue: {\n HAS_ANY: BalconyOptionsEnum.HAS_ANY\n }\n};\n\nexport const ParkingType = {\n stringValue: {\n [ParkingTypeEnum.CLOSED]: 'CLOSED',\n [ParkingTypeEnum.UNDERGROUND]: 'UNDERGROUND',\n [ParkingTypeEnum.OPEN]: 'OPEN'\n },\n enumValue: {\n CLOSED: ParkingTypeEnum.CLOSED,\n UNDERGROUND: ParkingTypeEnum.UNDERGROUND,\n OPEN: ParkingTypeEnum.OPEN\n }\n};\n\nexport const WallsType = {\n stringValue: {\n [WallsTypeEnum.MONOLITH]: 'MONOLITH',\n [WallsTypeEnum.BRICK_MONOLITH]: 'BRICK_MONOLITH',\n [WallsTypeEnum.BRICK]: 'BRICK',\n [WallsTypeEnum.PANEL]: 'PANEL',\n [WallsTypeEnum.BLOCK]: 'BLOCK'\n },\n enumValue: {\n MONOLITH: WallsTypeEnum.MONOLITH,\n BRICK_MONOLITH: WallsTypeEnum.BRICK_MONOLITH,\n BRICK: WallsTypeEnum.BRICK,\n PANEL: WallsTypeEnum.PANEL,\n BLOCK: WallsTypeEnum.BLOCK\n }\n};\n\nexport const IsApartments = {\n stringValue: {\n [IsApartmentsEnum.NO_APARTMENTS]: 'NO_APARTMENTS',\n [IsApartmentsEnum.APARTMENTS_ONLY]: 'APARTMENTS_ONLY'\n },\n enumValue: {\n NO_APARTMENTS: IsApartmentsEnum.NO_APARTMENTS,\n APARTMENTS_ONLY: IsApartmentsEnum.APARTMENTS_ONLY\n }\n};\n\nexport const Position = {\n stringValue: {\n [PositionEnum.STANDALONE]: 'standalone'\n },\n enumValue: {\n standalone: PositionEnum.STANDALONE\n }\n};\n\nexport const Safety = {\n stringValue: {\n [SafetyEnum.CONCIERGE]: 'concierge',\n [SafetyEnum.CLOSED_AREA]: 'closedArea',\n [SafetyEnum.GUARDED_AREA]: 'guardedArea'\n },\n enumValue: {\n concierge: SafetyEnum.CONCIERGE,\n closedArea: SafetyEnum.CLOSED_AREA,\n guardedArea: SafetyEnum.GUARDED_AREA\n }\n};\n\nexport const BuildingClass = {\n stringValue: {\n [BuildingClassEnum.ECONOMY]: 'ECONOMY',\n [BuildingClassEnum.COMFORT]: 'COMFORT',\n [BuildingClassEnum.COMFORT_PLUS]: 'COMFORT_PLUS',\n [BuildingClassEnum.BUSINESS]: 'BUSINESS',\n [BuildingClassEnum.ELITE]: 'ELITE'\n },\n enumValue: {\n ECONOMY: BuildingClassEnum.ECONOMY,\n COMFORT: BuildingClassEnum.COMFORT,\n COMFORT_PLUS: BuildingClassEnum.COMFORT_PLUS,\n BUSINESS: BuildingClassEnum.BUSINESS,\n ELITE: BuildingClassEnum.ELITE\n }\n};\n\nexport const NewBuildingDeal = {\n stringValue: {\n [NewBuildingDealEnum.LAW_214]: 'law214',\n [NewBuildingDealEnum.ESCROW]: 'escrow'\n },\n enumValue: {\n law214: NewBuildingDealEnum.LAW_214,\n escrow: NewBuildingDealEnum.ESCROW\n }\n};\n\nexport const Accreditation = {\n stringValue: {\n [AccreditationEnum.ACCREDITED_BY_VTB]: 'accreditedByVTB'\n },\n enumValue: {\n accreditedByVTB: AccreditationEnum.ACCREDITED_BY_VTB\n }\n};\n\nexport const PaymentType = {\n stringValue: {\n [PaymentTypeEnum.ARMY_MORTGAGE]: 'armyMortgage',\n [PaymentTypeEnum.INSTALLMENT]: 'installment',\n [PaymentTypeEnum.MOTHER_CAPITAL]: 'motherCapital'\n },\n enumValue: {\n armyMortgage: PaymentTypeEnum.ARMY_MORTGAGE,\n installment: PaymentTypeEnum.INSTALLMENT,\n motherCapital: PaymentTypeEnum.MOTHER_CAPITAL\n }\n};\n\nexport const FlatsSpecialEvents = {\n stringValue: {\n [FlatsSpecialEventEnum.FLAT_DISCOUNT]: FlatsSpecialEventString.FLAT_DISCOUNT,\n [FlatsSpecialEventEnum.FLAT_INSTALLMENT_PLAN]: FlatsSpecialEventString.FLAT_INSTALLMENT_PLAN,\n [FlatsSpecialEventEnum.FLAT_SALES_START]: FlatsSpecialEventString.FLAT_SALES_START\n },\n enumValue: {\n [FlatsSpecialEventString.FLAT_DISCOUNT]: FlatsSpecialEventEnum.FLAT_DISCOUNT,\n [FlatsSpecialEventString.FLAT_INSTALLMENT_PLAN]: FlatsSpecialEventEnum.FLAT_INSTALLMENT_PLAN,\n [FlatsSpecialEventString.FLAT_SALES_START]: FlatsSpecialEventEnum.FLAT_SALES_START\n }\n};\n\nexport const OtherSpecialEvents = {\n stringValue: {\n [OtherSpecialEventEnum.OTHER_DISCOUNT]: OtherSpecialEventString.OTHER_DISCOUNT,\n [OtherSpecialEventEnum.OTHER_INSTALLMENT_PLAN]: OtherSpecialEventString.OTHER_INSTALLMENT_PLAN,\n [OtherSpecialEventEnum.OTHER_SALES_START]: OtherSpecialEventString.OTHER_SALES_START\n },\n enumValue: {\n [OtherSpecialEventString.OTHER_DISCOUNT]: OtherSpecialEventEnum.OTHER_DISCOUNT,\n [OtherSpecialEventString.OTHER_INSTALLMENT_PLAN]: OtherSpecialEventEnum.OTHER_INSTALLMENT_PLAN,\n [OtherSpecialEventString.OTHER_SALES_START]: OtherSpecialEventEnum.OTHER_SALES_START\n }\n};\n\nexport const MiscSpecialEvents = {\n stringValue: {\n [MiscSpecialEventEnum.GIFT]: MiscSpecialEventString.GIFT,\n [MiscSpecialEventEnum.PROMO]: MiscSpecialEventString.PROMO\n },\n enumValue: {\n [MiscSpecialEventString.GIFT]: MiscSpecialEventEnum.GIFT,\n [MiscSpecialEventString.PROMO]: MiscSpecialEventEnum.PROMO\n }\n};\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { useCallback, useEffect, useState, useRef } from 'react';\nimport {\n addCallTouchScript, CalltouchType,\n DynamicReplacementErrorType,\n DynamicReplacementErrorEnum,\n CalltouchSubpoolType,\n} from '@search/classified-common/src/scripts/useCalltouch';\nimport { formatPhone } from '@search/helpers/src/formatPhone';\ndeclare const window: Window & {\n ct?: CalltouchType;\n};\n\ninterface IUseCalltouchReplacement {\n originalPhone: string;\n ctId?: string;\n}\n\nconst convertDynamicReplacementError = (v: DynamicReplacementErrorEnum) => {\n switch (v) {\n case DynamicReplacementErrorEnum.CALLTRACKING_BY_CLICK_IS_OFF:\n return 'CALLTOUCH:CALLTRACKING_BY_CLICK_IS_OFF';\n case DynamicReplacementErrorEnum.REPLACEMENT_CONDITIONS_NOT_COMPLETED:\n return 'CALLTOUCH:REPLACEMENT_CONDITIONS_NOT_COMPLETED';\n case DynamicReplacementErrorEnum.SUBPOOLNAME_NOT_FOUND:\n return 'CALLTOUCH:SUBPOOLNAME_NOT_FOUND';\n case DynamicReplacementErrorEnum.SERVER_ERROR:\n return 'CALLTOUCH:SERVER';\n case DynamicReplacementErrorEnum.SCRIPT:\n return 'SCRIPT';\n case DynamicReplacementErrorEnum.TIMEOUT:\n return 'TIMEOUT';\n case DynamicReplacementErrorEnum.UNKNOWN_ERROR:\n return 'CALLTOUCH:UNKNOWN';\n default:\n return 'UNKNOWN';\n }\n};\n\nexport type ReplaceError = 'NONE' | ReturnType<typeof convertDynamicReplacementError>;\n\ninterface IReplacementData {\n calltouchPhone: string;\n hasTriedReplace: boolean;\n replaceError: ReplaceError;\n}\n\nexport function useCalltouchReplacement({\n originalPhone,\n ctId\n}: IUseCalltouchReplacement): IReplacementData {\n const [ replacementData, setReplacementData ] = useState<IReplacementData>({\n calltouchPhone: '',\n hasTriedReplace: false,\n replaceError: 'NONE'\n });\n const [ longRequestTimeout, setLongRequestTimeout ] = useState<ReturnType<typeof setTimeout> | null>(null);\n const replacementDataRef = useRef(replacementData);\n\n replacementDataRef.current = replacementData;\n\n if (! ctId) {\n return replacementData;\n }\n\n const setFailedReplacementData = useCallback((replaceError: ReplaceError) => setReplacementData(prevState => ({\n ...prevState,\n hasTriedReplace: true,\n replaceError\n })), []);\n\n const launchDynamicReplacement = useCallback((modId: string, subpoolName: string) => {\n try {\n setLongRequestTimeout(setTimeout(() => {\n if (! replacementDataRef.current.hasTriedReplace) {\n setFailedReplacementData('TIMEOUT');\n }\n }, 2000));\n\n if (! window.ct) {\n setFailedReplacementData('SCRIPT');\n\n return;\n }\n\n window.ct('goal', 'phone_click');\n\n window.ct(modId, 'dynamic_replacement', {\n callback(success: boolean, result: CalltouchSubpoolType[] | DynamicReplacementErrorType) {\n const calltouchPhone = success ? (result as CalltouchSubpoolType[])[0].phoneNumber.slice(1) : '';\n const errorType = success ? undefined : (result as DynamicReplacementErrorType).type;\n\n setReplacementData(prevState => prevState.hasTriedReplace ? prevState : ({\n ...prevState,\n calltouchPhone,\n hasTriedReplace: true,\n replaceError: errorType ? convertDynamicReplacementError(errorType) : 'NONE'\n }));\n },\n subPoolNames: [ subpoolName ]\n });\n } catch (e) {\n setFailedReplacementData('UNKNOWN');\n }\n }, []);\n\n useEffect(() => {\n if (ctId && originalPhone && ! replacementData.calltouchPhone) {\n launchDynamicReplacement(ctId, originalPhone);\n }\n }, [ ctId, originalPhone, replacementData.calltouchPhone ]);\n\n useEffect(() => {\n if (replacementData.hasTriedReplace && longRequestTimeout !== null) {\n clearTimeout(longRequestTimeout);\n setLongRequestTimeout(null);\n }\n }, [ replacementData.hasTriedReplace, longRequestTimeout ]);\n\n return replacementData;\n}\n\nexport class CalltouchError extends Error {\n protected cause: unknown;\n\n constructor(\n readonly props: {\n code: ReplaceError;\n callTouchId?: string;\n phone?: string;\n },\n p?: {\n cause?: unknown;\n }\n ) {\n // @ts-ignore\n super(`calltouchReplacementFetch error: ${JSON.stringify(props)}`, p);\n this.props = props;\n this.cause = p?.cause;\n }\n\n get callTouchId() { return this.props.callTouchId; }\n get code() { return this.props.code; }\n get phone() { return this.props.phone; }\n\n toJSON() { return this.props; }\n}\n\nexport async function calltouchReplacementFetch({\n callTouchId,\n originalPhone: phone\n}: {\n callTouchId: string;\n originalPhone: string;\n}) {\n const originalPhone = phone.replace('+7', '').replace(/ /g, '');\n\n const ct = await addCallTouchScript(callTouchId);\n\n return new Promise<string | undefined>((resolve, reject) => {\n const timer = setTimeout(() => reject(\n new CalltouchError({ code: 'TIMEOUT', callTouchId, phone: originalPhone })\n ), 2000);\n\n ct('goal', 'phone_click');\n\n ct(callTouchId, 'dynamic_replacement', {\n callback(success: boolean, result: CalltouchSubpoolType[] | DynamicReplacementErrorType) {\n clearTimeout(timer);\n if (success) {\n const newPhone = Array.isArray(result) ? result[0]?.phoneNumber : undefined;\n\n return resolve(newPhone ? formatPhone(newPhone, { skipSymbols: true }) : undefined);\n }\n\n const errorType = Array.isArray(result) || ! result.type ?\n 'UNKNOWN' :\n convertDynamicReplacementError(result.type);\n\n reject(new CalltouchError({ code: errorType, callTouchId, phone: originalPhone }, { cause: result }));\n },\n subPoolNames: [ originalPhone ]\n });\n });\n}\n","import { NewBuildingSortEnum, NewBuildingOffersSortEnum } from '@search/graphql-typings';\n\nimport { DeveloperWithPromoName } from '../developer-promo/types';\n\nexport const VTB_IPOTEKA_LINK = 'https://www.vtb.ru/personal/ipoteka/novostrojki/';\n\nexport const STATIC_URL = 'https://static.m2.ru';\n\nconst NO_PHOTO_SRC_2X = 'https://cdn.m2.ru/assets/file-upload-server/11ae2be505b8e791517e93536a53b29a.png';\n\nexport const NO_PHOTO_SRC = 'https://cdn.m2.ru/assets/file-upload-server/a2753e1d796eb360ead3bff35e8a3f9e.png';\nexport const NO_PHOTO_SRC_SET = `${NO_PHOTO_SRC} 1x, ${NO_PHOTO_SRC_2X} 2x`;\n\nexport const CURRENT_YEAR = new Date().getFullYear();\n\nexport enum M2ProEnum {\n All = 'ALL',\n M2Pro = 'M2PRO'\n}\n\nexport const M2PRO_OPTIONS = {\n [M2ProEnum.All]: {\n value: M2ProEnum.All,\n label: 'Все ЖК',\n buttonLabel: 'Все ЖК'\n },\n [M2ProEnum.M2Pro]: {\n value: M2ProEnum.M2Pro,\n label: 'M2Pro Новостройки',\n buttonLabel: 'M2Pro Новостройки'\n }\n};\n\nexport const SORT_OPTIONS = [\n {\n value: NewBuildingSortEnum.RelevanceDesc,\n label: 'По умолчанию'\n },\n {\n value: NewBuildingSortEnum.PriceAsc,\n label: 'Сначала дешевые'\n },\n {\n value: NewBuildingSortEnum.PriceDesc,\n label: 'Сначала дорогие'\n },\n {\n value: NewBuildingSortEnum.DateOfCommissioningAsc,\n label: 'Сдаются раньше'\n },\n {\n value: NewBuildingSortEnum.DateOfCommissioningDesc,\n label: 'Сдаются позже'\n },\n {\n value: NewBuildingSortEnum.TimeToMetroAsc,\n label: 'Сначала ближе к метро'\n },\n {\n value: NewBuildingSortEnum.SqmPriceAsc,\n label: 'Сначала дешевле за м²'\n },\n {\n value: NewBuildingSortEnum.SqmPriceDesc,\n label: 'Сначала дороже за м²'\n },\n {\n value: NewBuildingSortEnum.TotalAreaAsc,\n label: 'Сначала с меньшей площадью'\n },\n {\n value: NewBuildingSortEnum.TotalAreaDesc,\n label: 'Сначала с большей площадью'\n }\n];\n\nexport const OFFERS_SORT_OPTIONS = [ {\n value: NewBuildingOffersSortEnum.PriceAsc,\n label: 'Сначала дешёвые'\n}, {\n value: NewBuildingOffersSortEnum.PriceDesc,\n label: 'Сначала дорогие'\n}, /* {\n value: NewBuildingOffersSortEnum.CreateDateAsc,\n label: 'Сначала новые'\n}, {\n value: NewBuildingOffersSortEnum.CreateDateDesc,\n label: 'Сначала старые'\n}, {\n value: NewBuildingOffersSortEnum.TimeToMetroAsc,\n label: 'Сначала ближе к метро'\n}, */ {\n value: NewBuildingOffersSortEnum.PriceSqMeterAsc,\n label: 'Сначала дешевле за м²'\n}, {\n value: NewBuildingOffersSortEnum.PriceSqMeterDesc,\n label: 'Сначала дороже за м²'\n}, {\n value: NewBuildingOffersSortEnum.TotalAreaAsc,\n label: 'Сначала с меньшей площадью'\n}, {\n value: NewBuildingOffersSortEnum.TotalAreaDesc,\n label: 'Сначала с большей площадью'\n} ];\n\nexport enum DATA_GTM {\n SNIPPET_PHONE = 'snippet-phone',\n SNIPPET_MAP = 'snippet-map',\n SNIPPET_ACCREDITED = 'snippet-accredited',\n SNIPPET_FLATS = 'snippet-flats',\n\n MORTGAGE_BANNER_SEND = 'ipoteka_from_serp_promo_send',\n MORTGAGE_ON_SNIPPET = 'ipoteka_from_serp_snippet',\n MORTGAGE_BROKER_SEND = 'ipoteka_from_card_application',\n MORTGAGE_BROKER_SHOW_MORE = 'ipoteka_from_card_all',\n MORTGAGE_BROKER_BANK_OFFER = 'ipoteka_from_card_bank',\n MORTGAGE_RIGHT_BLOCK = 'ipoteka_from_card_developer',\n MORTGAGE_OFFER = 'ipoteka_from_card_offer',\n\n MORTGAGE_SEND_CLICK = 'new_building_card_sale_view_ipoteka_banks',\n MORTGAGE_SHOW_MORE_CLICK = 'new_building_card_sale_view_ipoteka_call_back',\n MORTGAGE_STARTER_MODAL_SEND_ID = 'new_building_card_sale_ipoteka_banks',\n\n MORTGAGE_RIGHT_BLOCK_STARTER_MODAL_SHOW_ID = 'new_building_card_right_block_sale_view_ipoteka_banks',\n MORTGAGE_RIGHT_BLOCK_STARTER_MODAL_SEND_ID = 'new_building_card_right_block_sale_ipoteka_banks',\n\n MORTGAGE_OFFER_STARTER_MODAL_SHOW_ID = 'new_building_card_offer_sale_view_ipoteka_banks',\n MORTGAGE_OFFER_STARTER_MODAL_SEND_ID = 'new_building_card_offer_sale_ipoteka_banks',\n\n MORTGAGE_SNIPPET_STARTER_MODAL_SHOW_ID = 'new_building_snippet_sale_view_ipoteka_banks',\n MORTGAGE_SNIPPET_STARTER_MODAL_SEND_ID = 'new_building_snippet_sale_ipoteka_banks',\n\n PROMO_BANNER = 'promo-banner',\n PROMO_SNIPPET = 'promo-snippet',\n PROMO_SNIPPET_PHONE = 'promo-snippet-phone',\n\n CARD_PHONE_1 = 'card-phone-1',\n CARD_PHONE_2 = 'card-phone-2',\n CARD_PHONE_3 = 'card-phone-3',\n CARD_PHONE_4 = 'card-phone-4',\n CARD_PHONE_5 = 'card-phone-5',\n CARD_PHONE_OFFER_MODAL = 'popup-flat-phone',\n CARD_PHONE_GALLERY = 'card-phone-gallery',\n\n CARD_SQUARE_BANNER = 'square-banner',\n CARD_SQUARE_BANNER_PHONE = 'square-banner-phone',\n CARD_BANNER = 'card-banner',\n\n CARD_CALL_BACK = 'call-request',\n CARD_CALL_BACK_SPECIAL_EVENT = 'call-request4',\n CARD_CALL_BACK_BUILDING = 'call-request5',\n CARD_CALL_BACK_OFFER = 'popup-flat-call-request',\n CARD_CALL_BACK_SEND = 'call-request-send',\n CARD_CALL_BACK_SEND_SPECIAL_EVENT = 'call-request-send4',\n CARD_CALL_BACK_SEND_BUILDING = 'call-request-send5',\n CARD_CALL_BACK_SEND_OFFER = 'popup-flat-call-request-send',\n\n OFFER_CALL_BACK = 'popup-flat-call-request',\n OFFER_CALL_BACK_SEND = 'popup-flat-call-request-send',\n\n POPUP_CALL_BACK = 'аb-call-me',\n POPUP_CALL_BACK_SEND = 'аb-send-call-me',\n POPUP_PHONE = 'аb-show-phone',\n\n FOOTER_PHONE = 'phone-footer-opg'\n}\n\nexport const developerLandingDataGTM = (\n developerWithPromoName: DeveloperWithPromoName,\n event: 'slide-show' | 'slide-click' | 'snippet-show' | 'snippet-click'\n) => `${developerWithPromoName}-landing-${event}`;\n","import type { YMapBounds } from '@search/ymap/src/bounds';\nimport type { GeoObject, RegionSection } from '@search/graphql-typings';\nimport { GroupedOptions } from '@vtblife/uikit/legacy';\nimport { legacySlugToNew } from '@search/router/src/legacySlug';\nimport { GeoBase, SlugMapper } from '@search/geo/src/SlugMapper';\n\nexport type { RegionSection } from '@search/graphql-typings';\n\nexport interface IRegion extends GeoObject {\n isParent?: boolean;\n bounds: YMapBounds;\n}\n\ntype RootRegionOption = {\n isParent?: IRegion['isParent'];\n fullName: string;\n label: string;\n value: string;\n};\n\nfunction isRegionSection(item: RegionSection | GeoObject): item is RegionSection {\n return (item as RegionSection).rootRegion !== undefined;\n}\n\nfunction isGeoObject(item: RegionSection | GeoObject): item is GeoObject {\n return (item as GeoObject).id !== undefined;\n}\n\nfunction buildRegionMap(ret: Record<number, GeoObject>, region: RegionSection | GeoObject) {\n if (isRegionSection(region) && region.rootRegion) {\n ret[region.rootRegion.id] = region.rootRegion;\n }\n\n if (isRegionSection(region) && region.regions) {\n region.regions\n .forEach(item => item && buildRegionMap(ret, item));\n }\n\n if (isGeoObject(region)) {\n ret[region.id] = region;\n }\n\n return ret;\n}\n\nfunction buildFlatRegion(ret: Array<IRegion | GeoObject>, region: RegionSection | GeoObject) {\n if (isRegionSection(region) && region.rootRegion) {\n ret.push({ ...region.rootRegion, isParent: true });\n }\n\n if (isRegionSection(region) && region.regions) {\n ret.push(...region.regions.filter((item): item is GeoObject => item !== null));\n }\n\n return ret;\n}\n\nexport type IRootRegions = {\n getById(id: number): undefined | { translit?: string | null; narrowRegion?: { id: number } };\n getByTranslitName(slug: string): undefined | { id: number };\n addGeoSlug?(geo: GeoBase, regionId: number): void;\n getGeoFromSlug?(slug: string, regionId: number): GeoBase | undefined;\n getSlugFromGeo?(regionId: number): string | null | undefined;\n getGeoSlug?(regionId: number): GeoBase | undefined;\n};\n\nexport class RootRegions implements IRootRegions {\n private regions: RegionSection[];\n private regionsIdMap: Record<number, any>;\n private regionsFlat: any[];\n private slugs: SlugMapper;\n\n constructor(regions: RegionSection[]) {\n this.regions = regions;\n this.regionsFlat = regions.reduce(buildFlatRegion, []);\n this.regionsIdMap = regions.reduce(buildRegionMap, {} as Record<number, IRegion>);\n this.slugs = new SlugMapper();\n }\n\n regionsEnumeration(): Set<number> {\n return new Set<number>(Object.keys(this.regionsIdMap).map(Number));\n }\n\n getById(id: number) {\n return this.regionsIdMap[Number(id)];\n }\n\n getByTranslitName(translit: string) {\n const newSlug = legacySlugToNew(translit) ?? translit;\n\n return this.regionsFlat.find(item => item.translit === translit || item.translit === newSlug);\n }\n\n getFlatList() {\n return this.regionsFlat;\n }\n\n getRegions() {\n return this.regions;\n }\n\n getRegionsLikeOptions() {\n return this.getRegions()\n .reduce((ret, { rootRegion, regions }) => {\n const options = [];\n\n if (rootRegion) {\n options.push({\n isParent: true,\n fullName: rootRegion.mainName,\n label: rootRegion.displayName,\n value: String(rootRegion.id)\n } as RootRegionOption);\n }\n\n ret.push({\n label: '',\n options: options\n .concat(\n // @ts-ignore\n (regions || [])\n .filter((item): item is GeoObject => item !== null)\n .map(item => ({\n isParent: false,\n fullName: item.mainName ?? '',\n label: String(item.displayName),\n value: String(item.id)\n }))\n )\n });\n\n return ret;\n }, [] as GroupedOptions<RootRegionOption>[]);\n }\n\n addGeoSlug(geo: GeoBase, regionId: number) {\n return this.slugs.add(geo, regionId);\n }\n\n getGeoFromSlug(slug: string, regionId: number) {\n return this.slugs.id(slug, regionId);\n }\n\n getSlugFromGeo(regionId: number) {\n return this.slugs.slug(regionId)?.translit;\n }\n\n getGeoSlug(regionId: number) {\n return this.slugs.slug(regionId);\n }\n}\n","export enum ClassifiedAnalytics {\n // Затрекать показ сниппета\n SearchSaleViewOffer = 'classified_serp_sale_view_offer',\n SearchSaleViewPaidOffer = 'classified_serp_sale_view_paid_offer',\n SearchSaleViewHighlightOffer = 'classified_serp_sale_view_highlight_offer',\n SearchRentViewOffer = 'classified_serp_rent_view_offer',\n SearchRentViewPaidOffer = 'classified_serp_rent_view_paid_offer',\n SearchRentViewHighlightOffer = 'classified_serp_rent_view_highlight_offer',\n\n // Показать телефон на серпе вторичка\n SearchSaleShowTel = 'classified_serp_sale_show_tel',\n SearchSalePaidShowTel = 'classified_serp_sale_paid_show_tel',\n SearchRentShowTel = 'classified_serp_rent_show_tel',\n\n // Показать телефон на серпе новостройки\n SearchSaleNewShowTel = 'classified_serp_newsale_show_tel',\n SearchSaleFromDevShowTel = 'classified_serp_newsale_dev_show_tel',\n SearchSaleFromDevPaidShowTel = 'classified_newsale_paid_show_tel',\n SearchRentNewShowTel = 'classified_serp_newrent_show_tel',\n\n // Показать телефон на серпе: оффер c VAS - Highlight\n SearchSaleHighlightShowTel = 'classified_serp_sale_highlight_show_tel',\n\n // Баннеры\n CardSaleIpotekaBannerSend = 'classified_card_sale_ipoteka_banner_promo',\n CardSaleIpotekaBannerShow = 'classified_card_sale_view_ipoteka_banner_promo',\n SearchSaleIpotekaBannerSend = 'classified_serp_sale_ipoteka_banner_promo',\n SearchSaleIpotekaBannerShow = 'classified_serp_sale_view_ipoteka_banner_promo',\n SearchBanner = 'classified_serp_nb_promo_banner',\n\n // Промо-баннеры на карточке оффера\n PromoBannerCardTop = 'classified_card_sp_banner_top',\n PromoBannerCardBottom = 'classified_card_sp_banner_bottom',\n\n // Показать телефоны в оффере, вторичка, верх\n SearchCardSaleShowTelTop = 'classified_card_sale_show_tel_top',\n SearchCardSalePaidShowTelTop = 'classified_card_sale_paid_show_tel_top',\n SearchCardRentShowTelTop = 'classified_card_rent_show_tel_top',\n\n // Показать телефоны в оффере, вторичка, низ\n SearchCardSaleShowTelBottom = 'classified_card_sale_show_tel_bottom',\n SearchCardSalePaidShowTelBottom = 'classified_card_sale_paid_show_tel_bottom',\n SearchCardRentShowTelBottom = 'classified_card_rent_show_tel_bottom',\n\n // Показать телефоны в оффере, новостройки, верх\n SearchCardSaleNewShowTelTop = 'classified_new_card_sale_show_tel_top',\n SearchCardSaleFromDevShowTelTop = 'classified_new_card_sale_dev_show_tel_top',\n SearchCardRentNewShowTelTop = 'classified_new_card_rent_show_tel_top',\n\n // Показать телефоны в оффере, новостройки, низ\n SearchCardSaleNewShowTelBottom = 'classified_new_card_sale_show_tel_bottom',\n SearchCardSaleFromDevShowTelBottom = 'classified_new_card_sale_dev_show_tel_bottom',\n SearchCardRentNewShowTelBottom = 'classified_new_card_rent_show_tel_bottom',\n\n // Показать телефоны в оффере, новостройки, без разницы\n SearchCardSaleFromDevPaidShowTel = 'classified_newsale_paid_show_tel',\n\n // Добавить в избранное квартиру, продажа\n SearchCardSaleFlatAddFavorites = 'classified_serp_sale_flat_add_favorites',\n\n // Открыть из серпа оффер c VAS - Highlight\n SaleOpenHighlightOffer = 'classified_sale_open_highlight_offer',\n\n // Открыть оффер квартиры, новостройка\n SaleFlatOpenNewOffer = 'classified_sale_flat_open_new_offer',\n SaleFlatOpenNewDevOffer = 'classified_sale_flat_open_new_dev_offer',\n RentFlatOpenNewOffer = 'classified_rent_flat_open_new_offer',\n\n // Открыть оффер квартиры, вторичка\n SaleFlatOpenSecondOffer = 'classified_sale_flat_open_second_offer',\n RentFlatOpenSecondOffer = 'classified_rent_flat_open_second_offer',\n\n // Открыть васовый оффер, вторичка\n SaleOpenPaidOffer = 'classified_sale_open_paid_offer',\n\n // Открыть не васовый оффер, вторичка\n SaleOpenSecondOffer = 'classified_sale_open_second_offer',\n\n // @deprecated use SearchSaleIpotekaBanner via dataLayer\n IpotekaFromOffer = 'ipoteka_from_offer',\n}\n\nexport enum AnalyticsFromTags {\n SpecProjectCardCL = 'from=SpecProjectcardCL'\n}\n","/* eslint-disable camelcase */\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport React from 'react';\n\nimport { dataLayerPush } from '../../google/dataLayerPush';\nimport type { OfferType } from '../search/page/OfferQuery';\nimport { RankingEnum, OfferQuery$data } from '../search/page/OfferQuery/__generated__/OfferQuery.graphql';\nimport { OfferSnippetModel } from '../search/page/SearchOffersQuery';\n\nconst contextDefault: TOfferGtm2 & {\n ownerId: undefined | number;\n offerId: undefined | string;\n} = {\n ownerId: undefined,\n offerId: undefined\n};\n\ntype Offer = Pick<\n NonNullable<Extract<OfferQuery$data['offer'], {__typename: 'ProfOfferSnippet'}>['related']>[number] |\n OfferType |\n OfferSnippetModel,\n 'dealType' | 'status' | 'seller' | 'realtyObject' | 'newBuildingCard' | 'location' | 'id'\n>;\n\ntype OfferRealtyType = NonNullable<Offer['realtyObject']>['__typename'];\n\nfunction getRealtyType(realtyType?: OfferRealtyType) {\n switch (realtyType) {\n case 'ProfOfferRoom': return 'room';\n case 'ProfOfferHouse': return 'house';\n case 'ProfOfferLand': return 'land';\n case 'ProfOfferFlat':\n case '%other':\n default: return 'flat';\n }\n}\n\nexport const ClassifiedOfferGtmContext = React.createContext(contextDefault);\n\nexport function useClassifiedOfferDataLayerPush() {\n const ctx = React.useContext(ClassifiedOfferGtmContext);\n\n return React.useCallback(\n <O extends {event: string}>(p: O) => dataLayerPush(\n ctx === contextDefault || ! ctx.offerId ? p : {\n ...ctx,\n ...p\n }\n ),\n [ ctx ]\n );\n}\n\ntype Page = 'serp' | 'card' | 'favorites' | 'map' | 'similar' | 'buildingRelated' | 'other' | 'hidden-offers';\ntype TOfferGtm2 = {\n section: 'sell' | 'rent';\n type: 'second' | 'new_owner' | 'new_dev';\n vas: boolean;\n offerId: string;\n partnerVas: string | 'unknown';\n nbPaid: Lowercase<RankingEnum>;\n vasType: 'highlight' | 'top' | 'highlight_top' | 'unknown';\n pageType: Page; // old\n page_type: Page; // new api\n region: number;\n ownerId: number | undefined;\n realtyObjectType: 'flat' | 'house' | 'land' | 'room';\n}\n\n// может пора сделать его первым?\nexport const createOfferGtm2Context = ({ place, offer }: {\n place: TOfferGtm2['pageType'];\n offer: Offer;\n}) => {\n const gtmData: TOfferGtm2 = {\n section: 'sell',\n type: 'second',\n vas: offer.status?.hasAnyPriority ?? false,\n offerId: offer.id,\n partnerVas: 'unknown',\n nbPaid: (offer.newBuildingCard?.ranking ?? 'UNKNOWN').toLocaleLowerCase() as Lowercase<RankingEnum>,\n vasType: 'unknown',\n pageType: place,\n page_type: place,\n region: offer.location.narrowRegion?.id ?? RegionIdEnum.MSK,\n ownerId: offer.seller.ownerId ?? undefined,\n realtyObjectType: getRealtyType(offer.realtyObject?.__typename)\n };\n\n if (offer.dealType?.__typename === 'ProfOfferDealRent') {\n gtmData.section = 'rent';\n }\n\n if (offer.realtyObject?.__typename === 'ProfOfferFlat' &&\n offer.realtyObject.building?.isNewbuilding\n ) {\n gtmData.type = 'new_owner';\n\n if (offer.seller.sellerType === 'DEVELOPER') {\n gtmData.type = 'new_dev';\n }\n }\n\n if (offer.status?.hasAnyPriority && offer.seller.organizationName) {\n gtmData.partnerVas = offer.seller.organizationName;\n }\n\n if (offer.status?.hasHighlight) {\n gtmData.vasType = 'highlight';\n }\n if (offer.status?.hasTop) {\n gtmData.vasType = 'top';\n }\n if (offer.status?.hasHighlight && offer.status?.hasTop) {\n gtmData.vasType = 'highlight_top';\n }\n\n return gtmData;\n};\n","import { backofficeRegionRepository } from '@search/backoffice-const/src/constants';\n\nexport function offerRegionToMortgage(regionId?: number | null): number {\n const boRegion = regionId ? backofficeRegionRepository.byGeoId(regionId) : undefined;\n\n return boRegion ? Number(boRegion.value) : 3;\n}\n","import './Container.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'OfferYMapDesktopSwitchContainer');\n\nexport function OfferYMapDesktopSwitchContainer({\n className,\n children,\n dark\n}: {\n dark?: boolean;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn('container', { dark }, className)}>{children}</div>\n );\n}\n","\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'OfferYMapDesktopSwitchContainer');\n\nexport function OfferYMapDesktopSwitchLink({\n className,\n dark,\n children,\n active,\n icon = null,\n href,\n dataTest,\n onClick: onClickRaw\n}: {\n dataTest?: string;\n dark: boolean;\n onClick?: () => void;\n href: string;\n icon?: React.ReactElement | null;\n active: boolean;\n children?: React.ReactNode;\n className?: string;\n}) {\n const onClick = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n e.stopPropagation();\n e.preventDefault();\n if (onClickRaw) {\n onClickRaw();\n }\n }, [ onClickRaw ]);\n\n return (\n <a\n data-test={dataTest}\n className={cn('link', { active, dark }, className)}\n onClick={onClick}\n href={href}\n >\n {icon ? <div className={cn('icon', { active })}>{icon}</div> : null}\n {children}\n </a>\n );\n}\n","import React from 'react';\n\nimport { IconList, IconYMap } from '@search/ymap/src/Icon';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\nimport { OfferYMapDesktopSwitchContainer } from './Container';\nimport { OfferYMapDesktopSwitchLink } from './Link';\n\ntype OfferYMapDesktopLinkId = 'map' | 'list';\n\nexport function OfferYMapDesktopSwitch({\n active,\n className,\n onClick,\n listUrl,\n mapUrl,\n dataTest = 'ymap-switch',\n dark = false\n}: {\n dataTest?: string;\n className?: string;\n listUrl: string;\n mapUrl: string;\n dark?: boolean;\n onClick: (id: OfferYMapDesktopLinkId) => void;\n active: OfferYMapDesktopLinkId;\n}) {\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n return (\n <OfferYMapDesktopSwitchContainer dark={dark} className={className}>\n <OfferYMapDesktopSwitchLink\n dark={dark}\n dataTest={`${dataTest}-list`}\n href={listUrl}\n active={active === 'list'}\n onClick={() => {\n onClick('list');\n dataLayerPush({ event: 'classified_map_click_to_serp' });\n }}\n icon={<IconList />}\n >\n Список\n </OfferYMapDesktopSwitchLink>\n <OfferYMapDesktopSwitchLink\n dark={dark}\n dataTest={`${dataTest}-map`}\n href={mapUrl}\n active={active === 'map'}\n onClick={() => {\n onClick('map');\n dataLayerPush({ event: 'classified_serp_click_to_map' });\n }}\n icon={<IconYMap />}\n >\n На карте\n </OfferYMapDesktopSwitchLink>\n </OfferYMapDesktopSwitchContainer>\n );\n}\n","import './Desktop.css';\n\nimport React, { useState, useRef } from 'react';\nimport { Button } from '@vtblife/uikit';\nimport { Checkbox } from '@vtblife/uikit/legacy';\n\nimport {\n YMapControlGeoLocation,\n YMapControlGroup,\n YMapControlRuler,\n YMapControlTraffic,\n YMapControlZoom\n} from '@search/ymap/src/Control';\nimport { YMapMargin, YMapBounds } from '@search/ymap/src/bounds';\nimport { YMapLayer } from '@search/ymap/src/Layer';\nimport { YMapPane } from '@search/ymap/src/Pane';\nimport { YMapVector } from '@search/ymap/src/Vector';\nimport { YMapDrawAreaPane } from '@search/ymap/src/DrawArea/Pane';\nimport classname from '@search/classname/src';\n\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { OfferYMapDesktopSwitch } from './Switch/Switch';\n\nconst cn = classname.bind(null, 'OfferYMapDesktop');\n\ninterface OfferYMapDesktopProps {\n tileUrl?: string | undefined;\n bounds?: YMapBounds;\n handleClickList?: () => void;\n setBounds: (bounds: YMapBounds) => void;\n children?: React.ReactNode | null;\n listUrl?: string;\n mapUrl?: string;\n setPolygon: (coordinates: YMapVector[]) => void;\n selectedArea?: readonly YMapVector[];\n tipsVisible?: boolean;\n tipsExpanded?: boolean;\n displaySwitcher?: boolean;\n displayArea?: boolean;\n isDrawAreaVisible?: boolean;\n toggleDrawArea?: () => void;\n controlAlign?: 'right' | 'left';\n altLayout?: boolean;\n hasSidebar?: boolean;\n saveSearch?: () => void;\n showInfrastructure?: boolean;\n setShowInfrastructure?: (isShowInfrastructure: boolean) => void;\n renderCustomerFeedback?: React.ReactNode;\n renderMortgageButton?: React.ReactNode;\n}\n\nexport const OfferYMapDesktop = errorCatcherWrap(function OfferYMapDesktop({\n bounds,\n tileUrl,\n tipsVisible = false,\n tipsExpanded = false,\n listUrl,\n mapUrl,\n handleClickList,\n setBounds,\n setPolygon,\n children,\n selectedArea,\n displaySwitcher = true,\n displayArea = true,\n isDrawAreaVisible = false,\n controlAlign = 'right',\n toggleDrawArea = () => {},\n altLayout = false,\n hasSidebar,\n saveSearch,\n showInfrastructure,\n setShowInfrastructure,\n renderCustomerFeedback,\n renderMortgageButton\n}: OfferYMapDesktopProps) {\n let margin: YMapVector | YMapMargin = { x: 75, y: 10 };\n // Во время движения по карте пин скрываем\n const [ moving, setMoving ] = useState(false);\n // Пока карту не трогали - пин скрыт\n const trigger = useRef(false);\n\n const onMouseUp = () => {\n setMoving(false);\n };\n const onMouseDown = () => {\n setMoving(true);\n trigger.current = true;\n };\n\n if (hasSidebar) {\n margin = {\n topLeft: {\n x: isDrawAreaVisible ? 385 : 120,\n y: 10\n },\n\n bottomRight: {\n x: 75,\n y: 10\n }\n };\n }\n\n return (<YMapPane\n bounds={bounds}\n margin={margin}\n setBounds={setBounds}\n isScrollZoomEnabled\n onMouseUp={onMouseUp}\n onMouseDown={onMouseDown}\n >\n <YMapControlGroup hAlign={controlAlign} vAlign='middle' layout='vertical'>\n <YMapControlZoom />\n <YMapControlGeoLocation />\n <YMapControlTraffic />\n <YMapControlRuler />\n </YMapControlGroup>\n\n {tileUrl && <YMapLayer tileUrl={tileUrl} />}\n\n {/*{saveSearch && <div className={cn('save-search', { alt: altLayout })}>*/}\n {/* <Button*/}\n {/* variant='primary-alt-bg'*/}\n {/* icon='magnifier-heart'*/}\n {/* dataTest='save-search-map'*/}\n {/* onClick={saveSearch}*/}\n {/* shadow*/}\n {/* >*/}\n {/* Сохранить поиск*/}\n {/* </Button>*/}\n {/*</div>}*/}\n\n {\n (displayArea || setShowInfrastructure) && <div className={cn('toggle', {\n tipsVisible,\n tipsExpanded,\n alt: altLayout,\n hasSave: saveSearch !== undefined\n })}>\n {\n setShowInfrastructure && <Checkbox\n checked={showInfrastructure}\n onChange={setShowInfrastructure}\n className={cn('infrastructure')}\n >\n Инфраструктура\n </Checkbox>\n }\n\n {\n displayArea && <Button\n variant={isDrawAreaVisible ? 'danger' : 'primary-alt-bg'}\n onClick={toggleDrawArea}\n shadow\n icon='finger-draw'\n >{isDrawAreaVisible ? 'Удалить область' : 'Нарисовать область'}</Button>\n }\n\n {isDrawAreaVisible ? <YMapDrawAreaPane handleDrawEnd={setPolygon} selectedArea={selectedArea} /> : null}\n </div>\n }\n\n {children}\n\n {\n displaySwitcher && mapUrl && listUrl && handleClickList && <OfferYMapDesktopSwitch\n className={cn(altLayout ? 'switch-alt' : 'switch')}\n listUrl={listUrl}\n mapUrl={mapUrl}\n active='map'\n onClick={(id: string) => id === 'list' ? handleClickList() : undefined}\n dark\n />\n }\n\n {renderMortgageButton && trigger.current && ! moving && (\n <div className={cn('mortgageButton')}>\n {renderMortgageButton}\n </div>\n )}\n\n {renderCustomerFeedback && (\n <div className={cn('rateUs')}>\n {renderCustomerFeedback}\n </div>\n )}\n </YMapPane>);\n});\n","import React, { useCallback, useEffect } from 'react';\n\nimport { useYMapPane } from '@search/ymap/src/Pane';\n\nimport './Mobile.css';\n\nexport function YMapClickPane({\n resetSelected\n}: {\n resetSelected?: () => void;\n}) {\n const { map } = useYMapPane();\n\n const onClick = useCallback(() => {\n resetSelected && resetSelected();\n }, [ resetSelected ]);\n\n useEffect(() => {\n map.events.add('click', onClick);\n\n return () => {\n map.events.remove('click', onClick);\n };\n }, [ map, onClick ]);\n\n return null;\n}\n","/* global window */\n\nconst win = typeof window === 'undefined' ? undefined : window;\n\nexport class SeoSearchUtm {\n protected static storage = win?.localStorage;\n\n static init() {\n if (! this.storage) return;\n\n const params = new URLSearchParams(window.location.search);\n const utmParams = [] as ({ key: string; value: string })[];\n let hasValues = false;\n\n params.forEach((value, key) => {\n if (! key.startsWith('utm_')) return;\n if (value) hasValues = true;\n\n utmParams.push({ key, value });\n });\n\n if (! hasValues) return;\n\n this.storage?.setItem(\n this.key,\n JSON.stringify(utmParams)\n );\n }\n\n protected static key = 'seoSearchUtm';\n\n static get() {\n try {\n const data = this.storage?.getItem(this.key);\n\n return data ?\n (JSON.parse(data) as ({ key: string; value: string })[]) :\n undefined;\n } catch (e) {\n e.message = 'SeoSearchUtm.get ' + e.message;\n throw e;\n }\n }\n}\n","\nexport enum LandStatus {\n IZHS = 'IZHS',\n SNTDNP = 'SNTDNP',\n LPH = 'LPH'\n}\n\nexport enum HouseType {\n STANDALONE = 'STANDALONE',\n PART_OF_HOUSE = 'PART_OF_HOUSE',\n DUPLEX = 'DUPLEX',\n TOWNHOUSE = 'TOWNHOUSE'\n}\n\nexport enum RegionEnum {\n MSK = 'MSK',\n MSK_AND_MSK_OBL = 'MSK_AND_MSK_OBL',\n SPB = 'SPB',\n SPB_AND_LEN_OBL = 'SPB_AND_LEN_OBL',\n LEN_OBL = 'LEN_OBL',\n MSK_OBL = 'MSK_OBL',\n}\n\nexport enum RegionIdEnum {\n MSK = 3,\n MSK_AND_MSK_OBL = 9513,\n MSK_OBL = 108,\n SPB = 444,\n SPB_AND_LEN_OBL = 9514,\n LEN_OBL = 886\n}\n\nexport enum DealType {\n SELL = 'SELL',\n RENT = 'RENT'\n}\n\nexport enum CategoryType {\n HOUSE = 'HOUSE',\n ROOM = 'ROOM',\n FLAT = 'FLAT',\n LAND = 'LAND'\n}\n\nexport enum RoomsEnum {\n STUDIO = 'STUDIO',\n ROOM_1 = 'ROOM_1',\n ROOM_2 = 'ROOM_2',\n ROOM_3 = 'ROOM_3',\n ROOM_4 = 'ROOM_4',\n ROOM_5_AND_MORE = 'ROOM_5_AND_MORE',\n OPEN_PLAN = 'OPEN_PLAN'\n}\n\nexport enum NewBuilding {\n NEW = 'NEW',\n SECOND = 'SECOND'\n}\n\nexport enum CeilingHeightEnum {\n FROM_2_5 = 'FROM_2_5',\n FROM_2_7 = 'FROM_2_7',\n FROM_3 = 'FROM_3',\n FROM_4 = 'FROM_4'\n}\n\nexport enum Bathroom {\n UNKNOWN = 'UNKNOWN',\n COMBINED = 'COMBINED',\n PARTED = 'PARTED',\n SEVERAL = 'SEVERAL',\n}\n\nexport enum Renovation {\n EURO = 'EURO',\n COSMETIC = 'COSMETIC',\n DESIGNED = 'DESIGNED',\n NEED = 'NEED',\n NONE = 'NONE'\n}\n\nexport enum PriceUnitEnum {\n ALL = 'ALL',\n METER = 'METER',\n ARE = 'ARE'\n}\n\nexport enum NewBuildingTypeEnum {\n RESIDENTIAL_COMPLEX = 'RESIDENTIAL_COMPLEX',\n RESIDENTIAL_AREA = 'RESIDENTIAL_AREA',\n APART_COMPLEX = 'APART_COMPLEX',\n APART_HOTEL = 'APART_HOTEL',\n QUARTER = 'QUARTER',\n LOFT = 'LOFT',\n MULTI_FUNCTIONAL_COMPLEX = 'MULTI_FUNCTIONAL_COMPLEX',\n RESIDENCE = 'RESIDENCE',\n MICRO_DISTRICT = 'MICRO_DISTRICT',\n HOUSE = 'HOUSE',\n CLUB_HOUSE = 'CLUB_HOUSE'\n}\n\nexport enum SortEnum {\n DATE = 'date',\n DATE_DESC = 'date_desc',\n PRICE = 'price',\n PRICE_DESC = 'price_desc'\n}\n\nexport enum NewBuildingSortingEnum {\n UNKNOWN = 'UNKNOWN',\n RELEVANCE = 'RELEVANCE',\n PRICE = 'PRICE',\n DATE_OF_COMMISSIONING = 'DATE_OF_COMMISSIONING',\n}\n\nexport enum BuildingStatusEnum {\n IN_PROGRESS = 'IN_PROGRESS',\n COMMISSIONED = 'COMMISSIONED',\n FROZEN = 'FROZEN',\n\n}\n\nexport enum QuarterEnum {\n FIRST = 'FIRST',\n SECOND = 'SECOND',\n THIRD = 'THIRD',\n FOURTH = 'FOURTH'\n}\n\nexport enum NewBuildingClassEnum {\n ECONOMY = 'ECONOMY',\n COMFORT = 'COMFORT',\n COMFORT_PLUS = 'COMFORT_PLUS',\n BUSINESS = 'BUSINESS',\n ELITE = 'ELITE'\n}\n\n// Материал стен дома;\nexport enum WallsTypeEnum {\n MONOLITH = 'MONOLITH',\n BRICK = 'BRICK',\n BRICK_MONOLITH = 'BRICK_MONOLITH',\n PANEL = 'PANEL',\n BLOCK = 'BLOCK',\n // WOOD = 'WOOD',\n}\n\nexport enum GeoKindEnum {\n UNKNOWN,\n HOUSE,\n STREET,\n METRO,\n DISTRICT,\n LOCALITY,\n AREA,\n PROVINCE,\n COUNTRY,\n HYDRO,\n VEGETATION,\n AIRPORT,\n OTHER,\n RAILWAY_STATION,\n ROUTE,\n STATION,\n COMPOSITE_OBJECT,\n STREET_ADDRESS,\n APARTMENT\n}\n\nexport enum ImageAttributesTypeEnum {\n UNKNOWN = 'UNKNOWN',\n LAYOUT = 'LAYOUT',\n}\n","/* eslint-disable */\nexport const styleId = 'layout-components-modals-style';\nexport const userAuthorizationStateStyleId = 'user-authorization-state-style';\n\n// shouldn't have closures, inlined to html via .toString()\nexport function initCookieModalHack() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n run();\n } catch (err) {\n console.error(err);\n }\n\n function run() {\n // 1. constants\n const cookieName = 'cookies_accepted';\n const cookiesRejectedLSKey = 'cookies_rejected';\n const styleId = 'layout-components-modals-style';\n const userAuthorizationStateStyleId = 'user-authorization-state-style';\n\n // 2. variables\n const style = document.querySelector(`#${styleId}`);\n const userAuthorizationStateStyle = document.querySelector(`#${userAuthorizationStateStyleId}`);\n // @ts-ignore\n const user = window.__INITIAL_STATE__?.userStore?.user;\n let styleTextNode: Text;\n let userAuthorizationStateStyleTextNode: Text;\n\n // 3. global variables\n // sync with projects/root/src/common-modules/layout-components/constants/domains.ts\n // @ts-ignore\n window.__shouldUseChatStub = [ 'rb.m2', 'm2.region.vtb.ru' ].includes(document.location.hostname);\n // @ts-ignore\n window.__isCookieModalVisible =\n !(document.cookie ? document.cookie.split('; ') : []).find(\n (cookie) => decodeURIComponent(cookie.split('=')[0]) === cookieName,\n ) && !window?.localStorage?.getItem(cookiesRejectedLSKey);\n // @ts-ignore\n window.__isUserAuthorized = Boolean(user && user.isAuthenticated);\n\n // 4. callbacks\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n // @ts-ignore\n window.__hideCookiesModal = hideCookiesModal;\n\n // 5. main logic\n // @ts-ignore\n if (window.__isCookieModalVisible) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n updateCss();\n } else {\n // includes updateCss() inside\n // @ts-ignore\n window.__hideCookiesModal();\n }\n\n updateUserInfoCss();\n\n // 6. functions\n function updateCss() {\n let css = '';\n\n // @ts-ignore\n if (window.__isCookieModalVisible) {\n // node_modules/@vtblife/uikit/dist/css/mixins/ds-breakpoint.css\n css += `\n .chatWidget, .chatWidgetButton, .chatListButton {\n bottom: 152px !important;\n }\n\n @media screen and (max-width: 767px) {\n .chatWidget, .chatWidgetButton, .chatListButton {\n bottom: 120px !important;\n }\n }\\n`;\n } else {\n css += `\n .cookie-consent-wrapper {\n display: none !important;\n }\\n`;\n }\n\n // @ts-ignore\n if (! window.__shouldUseChatStub) {\n css += `\n .chatWidgetButton {\n display: none !important;\n }\\n`;\n }\n\n if (! styleTextNode) {\n styleTextNode = document.createTextNode(css);\n style?.appendChild(styleTextNode);\n } else {\n styleTextNode.textContent = css;\n }\n }\n\n function hideCookiesModal() {\n // @ts-ignore\n window.__isCookieModalVisible = false;\n updateCss();\n }\n\n function updateUserInfoCss() {\n let css = '';\n\n // @ts-ignore\n if (window.__isUserAuthorized) {\n css += `\n .initialAuthorizedUser {\n display: block !important;\n }\\n`;\n } else {\n css += `\n .initialUnauthorizedUser {\n display: block !important;\n }\\n`;\n }\n\n if (! userAuthorizationStateStyleTextNode) {\n userAuthorizationStateStyleTextNode = document.createTextNode(css);\n userAuthorizationStateStyle?.appendChild(userAuthorizationStateStyleTextNode);\n } else {\n userAuthorizationStateStyleTextNode.textContent = css;\n }\n }\n }\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nconst cn = classname.bind(null, 'DefaultBadge');\n\ninterface IDefaultBadgeProps extends IBadgeProps {\n variant: 'transparent' | 'gray' | 'blue';\n}\n\nexport const DefaultBadge = ({\n variant,\n children,\n ...props\n}: IDefaultBadgeProps) => (\n <Badge\n size='xs'\n className={cn(null, { variant })}\n textClassName={cn('text', { variant })}\n {...props}\n >\n {children}\n </Badge>\n);\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GalleryBadge');\n\nexport const GalleryBadge = ({\n children,\n ...props\n}: IBadgeProps) => (\n <Badge\n size='m'\n level='primary-alone'\n className={cn()}\n bold\n {...props}\n >\n {children}\n </Badge>\n);\n","import React, { FunctionComponent } from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge as DSBadge } from '@vtblife/uikit';\nimport { BadgeColor, BadgeProps } from '@vtblife/uikit/dist/components/badge/types';\n\nimport { Badge, IBadgeProps } from '../index';\n\nimport './styles.css';\n\ntype NewBuildingClass = 'BUSINESS' | 'COMFORT' | 'COMFORT_PLUS' | 'ECONOMY' | 'ELITE' | 'UNKNOWN'\n\nconst NEW_BUILDING_CLASS_COLORS: Record<NewBuildingClass, BadgeColor> = {\n BUSINESS: 'purple',\n COMFORT: 'turquoise',\n COMFORT_PLUS: 'green',\n ECONOMY: 'orange',\n ELITE: 'black',\n UNKNOWN: 'black'\n};\n\nexport interface NewBuildingClassBadgeProps extends IBadgeProps {\n className?: string;\n newBuildingClass: NewBuildingClass;\n}\n\nconst cn = classname.bind(null, 'NewBuildingClassBadge');\n\nexport const NewBuildingClassBadge: FunctionComponent<NewBuildingClassBadgeProps> = ({\n size,\n children,\n className,\n newBuildingClass,\n ...rest\n}) => {\n return (\n <Badge\n {...rest}\n className={cn(null, { class: newBuildingClass }, className)}\n textClassName={cn('text', { class: newBuildingClass })}\n noBottomMargin\n >\n {children}\n </Badge>\n );\n};\n\nexport const NewBuildingClassDSBadge: FunctionComponent<Omit<BadgeProps, 'color'> & {\n newBuildingClass: NewBuildingClass;\n}> = ({\n newBuildingClass,\n children,\n ...rest\n}) => (\n <DSBadge\n {...rest}\n color={NEW_BUILDING_CLASS_COLORS[newBuildingClass]}\n >\n {children}\n </DSBadge>\n);\n","import React from 'react';\n\nimport Icon, { IIconProps } from '../Icon';\n\nimport './styles.css';\n\ninterface IIconPercent extends IIconProps {\n type?: 'percent';\n}\n\nexport default ({\n type = 'percent',\n ...props\n}: IIconPercent): React.ReactElement => React.cloneElement(<Icon />, {\n type,\n ...props\n});\n","import React from 'react';\n\nimport IconPercent from '@search/vtbeco-ui/src/components/controls/IconPercent';\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'PreferentialMortgageBadge');\n\ninterface IPreferentialMortgageBadge extends IBadgeProps {\n variant: 'default' | 'vtb';\n}\n\nexport const PreferentialMortgageBadge = ({\n size,\n variant,\n ...props\n}: IPreferentialMortgageBadge) => {\n return (\n <Badge\n size={size}\n className={cn(null, { variant })}\n textClassName={cn('text')}\n before={<IconPercent />}\n {...props}\n >\n Ипотека 6,5%\n </Badge>\n );\n};\n","import React, { HTMLAttributes, ReactNode, Ref } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport type { TypographyColor, TypographyVariant } from '@vtblife/uikit/dist/components/typography/types';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport type BadgeIndent = 'xxs' | 'xs' | 's' | 'm' | 'l';\n\nexport interface IBadgeProps extends HTMLAttributes<HTMLDivElement> {\n size?: 'xs' | 'm';\n color?: TypographyColor;\n level?: TypographyVariant;\n bold?: boolean;\n backgroundColor?: string;\n before?: ReactNode;\n rightIndent?: BadgeIndent | null;\n noBottomMargin?: boolean;\n textClassName?: string;\n anchorRef?: Ref<HTMLDivElement | null>;\n}\n\nconst cn = classname.bind(null, 'Badge');\n\nexport const Badge = ({\n className,\n size = 'xs',\n level = 'small-alone',\n color = 'white-500',\n backgroundColor,\n before,\n children,\n rightIndent = 'xxs',\n noBottomMargin = false,\n textClassName,\n anchorRef,\n bold = false,\n ...props\n}: IBadgeProps) => {\n return (\n <div\n {...props}\n ref={anchorRef}\n className={cn(null, {\n size,\n rightIndent: rightIndent === null ? undefined : rightIndent,\n noBottomMargin\n }, className)}\n style={{ backgroundColor }}\n >\n {before && (\n <div className={cn('before')}>\n {before}\n </div>\n )}\n <Typography\n color={color}\n className={textClassName}\n variant={level}\n bold={bold}\n >\n {children}\n </Typography>\n </div>\n );\n};\n","import React, { HTMLAttributes } from 'react';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport interface IBadgeBoxProps extends HTMLAttributes<HTMLDivElement> {\n position?: 'top-left' | 'top-right' | 'top-right-same' | 'bottom-left' | 'bottom-right' | 'built-in';\n view?: 'desktop' | 'mobile';\n}\n\nconst cn = classname.bind(null, 'BadgeBox');\n\nexport const BadgeBox = ({\n position,\n view = 'desktop',\n className,\n children,\n ...props\n}: IBadgeBoxProps) => (\n <div\n {...props}\n className={cn(null, { position, view }, className)}\n >\n {children}\n </div>\n);\n","import './style.css';\n\nimport React from 'react';\n\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport classname from '@search/classname/src';\n\nimport Image from '../Image';\nimport type { MinimalBanksMortgageOffersQueryResponseOffer } from '../MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\n\nimport iconMortgageFamily from './iconMortgageFamily.url.svg';\nimport iconMortgagePreferential from './iconMortgagePreferential.url.svg';\n\nconst cn = classname.bind(null, 'MortgageOfferIcon');\n\nexport function MortgageOfferIcon({ name, size = 's', pseudoCount, offer }: {\n name?: string;\n size?: 's' | 'm';\n} & ({\n pseudoCount: number;\n offer?: undefined;\n} | {\n offer: MinimalBanksMortgageOffersQueryResponseOffer;\n pseudoCount?: undefined;\n})) {\n const staticPath = useStaticPathConfig();\n const mul = size === 's' ? 1 : 1.5;\n const width = Math.floor((offer?.type ? 56 : 24) * mul);\n const height = Math.floor(24 * mul);\n\n if (pseudoCount) {\n return (\n <div className={cn('pseudo')} style={{ width, height }}>+{pseudoCount}</div>\n );\n }\n\n let imgUrl = offer?.icon?.origin ?? '';\n\n if (offer?.type === 'FAMILY') imgUrl = `${staticPath}${iconMortgageFamily}`;\n\n if (offer?.type === 'PREFERENTIAL') imgUrl = `${staticPath}${iconMortgagePreferential}`;\n\n if (offer?.type === 'IT_MORTGAGE') imgUrl = `${staticPath}${iconMortgagePreferential}`;\n\n return (\n <Image\n width={width}\n height={height}\n loading='lazy'\n alt={name ?? offer?.name ?? ''}\n url={imgUrl}\n />\n );\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { Select } from '@vtblife/uikit';\n\nimport type { useWorkingHours } from './useWorkingHours';\n\nconst cn = classname.bind(null, 'WorkingHours');\n\nexport function WorkingHours({\n mobile,\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues,\n size = 'l'\n}: {\n mobile?: boolean;\n size?: 's' | 'm' | 'l';\n} & Omit<ReturnType<typeof useWorkingHours>, 'rawWorkingHoursRange'>) {\n return (\n <div className={cn('flex')}>\n <Select\n onChange={setStartHoursRange}\n native={mobile}\n >\n <Select.Button\n size={size}\n label='Не ранее'\n >\n {workingHoursRange.start}\n </Select.Button>\n <Select.Content height={172}>\n {\n startHourValues.map(({ value, label, disabled }) => (\n <Select.Option\n key={value}\n disabled={disabled}\n value={value}\n selected={workingHoursRange.start === label}\n >\n {label}\n </Select.Option>\n ))\n }\n </Select.Content>\n </Select>\n <Select\n onChange={setEndHoursRange}\n native={mobile}\n >\n <Select.Button\n label='Не позднее'\n size={size}\n >\n {workingHoursRange.end}\n </Select.Button>\n <Select.Content height={172}>\n {\n endHourValues.map(({ value, label, disabled }) => (\n <Select.Option\n key={value}\n disabled={disabled}\n value={value}\n\n selected={workingHoursRange.end === label}\n >\n {label}\n </Select.Option>\n ))\n }\n </Select.Content>\n </Select>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n useCallbackRequestMutation$data as useCallbackRequestMutationResponse,\n useCallbackRequestMutation$variables as useCallbackRequestMutationVariables\n} from './__generated__/useCallbackRequestMutation.graphql';\n\nconst mutation = graphql`\n mutation useCallbackRequestEmailMutation(\n $phone: String!\n $newBuildingName: String\n $address: String!\n $developerName: String\n $hours: String!\n $extra: String\n $subjectExtra: String\n $emailSender: EmailSenderEnum!\n $offerLink: String\n $isCallbackRequestCreated: Boolean\n $isNewBuilding: Boolean\n $newBuildingRanking: String\n $regionId: Int\n ) {\n createEmailCallback(\n phone: $phone\n newBuildingName: $newBuildingName\n address: $address\n developerName: $developerName\n hours: $hours\n extra: $extra\n subjectExtra: $subjectExtra\n emailSender: $emailSender\n link: $offerLink\n isCallbackRequestCreated: $isCallbackRequestCreated\n isNewBuilding: $isNewBuilding\n newBuildingRanking: $newBuildingRanking\n regionId: $regionId\n ) {\n emailMessageId\n }\n }\n`;\n\nexport const useCallbackRequest = () => {\n const gql = useGqlContext();\n\n return useCallback(\n (vars: useCallbackRequestMutationVariables, opts?: { signal?: AbortSignal }) => {\n const phone = formatPhone(vars.phone);\n\n return gql.client<\n useCallbackRequestMutationVariables,\n useCallbackRequestMutationResponse\n >(\n mutation,\n {\n ...vars,\n phone\n },\n {\n pathUniqSuffix: `/callback/${phone}/`,\n ...opts\n }\n );\n },\n [ gql ]\n );\n};\n","type FieldType = {\n name: string; // Название поля (длина от 1 до 15)\n value: string; // Значение поля (длина от 1 до 15)\n}\n\nexport type CreateRequestSuccessResponse = {\n callbackRequestId: number; // Идентификатор заявки на обратный звонок\n}\n\nexport type ErrorResponse = {\n type: CalltouchCallbackError; // Тип ошибки\n message: string; // Текст ошибки\n details: object; // Детали ошибки\n}\n\nexport enum CalltouchCallbackError {\n UNKNOWN_ERROR = 'unknown_error',\n SERVER_ERROR = 'server_error',\n REQUEST_THROTTLE_TIMEOUT= 'request_throttle_timeout',\n REQUEST_THROTTLE_COUNT = 'request_throttle_count',\n VALIDATION_ERROR = 'validation_error',\n REQUEST_PHONE_BLACKLISTED = 'request_phone_blacklisted',\n REQUEST_WIDGET_NOT_FOUND = 'request_widget_not_found'\n}\n\ndeclare const window: Window & {\n ctw?: {\n // Создание заявки на обратный звонок от Calltouch\n createRequest: (\n routeKey: string, // Идентификатор формы (длина от 1 до 255)\n phone: string, // Номер телефона с кодом страны и города, без плюса (11 символов)\n fields: FieldType[], // Дополнительные поля (не более 5), используются для синтеза речи\n requestCallback: (success: boolean, responseData: CreateRequestSuccessResponse | ErrorResponse) => void, // функция обратного вызова для обработки результата запроса\n scheduleTime: string | null, // Время в формате Y-m-d H:i:s (например, 2018-02-12 22:33:00), на которое нужно запланировать звонок; если null, то звонок будет выполнен сразу\n tags: string[], // Пользовательские теги (не более 10),\n unitId: number, // Идентификатор отдела\n ) => void;\n };\n};\n\ntype Hours = {\n start?: number;\n end?: number;\n}\n\ninterface ISendCalltouchCallbackRequest {\n phone: string;\n unitId: number;\n routeKey?: string;\n fields?: FieldType[];\n hours?: Hours | null;\n tags?: string[];\n}\n\nconst ROUTE_KEY = 'm2_cb';\n\nconst getScheduleTime = (hours: Hours | null) => {\n if (! hours || ! hours.start || ! hours.end) {\n return null;\n }\n\n const resultDate = new Date();\n\n resultDate.setHours(hours.start);\n\n resultDate.setMinutes(0);\n resultDate.setSeconds(0);\n\n const untilDate = new Date();\n\n untilDate.setHours(hours.end);\n untilDate.setMinutes(0);\n untilDate.setSeconds(0);\n\n const currentDate = new Date();\n\n // Если текущее время позднее, чем время \"до\" — переносим на завтра\n if (currentDate > untilDate) {\n resultDate.setDate(resultDate.getDate() + 1);\n }\n\n const [ date, time ] = resultDate\n .toLocaleString('ru-RU', { timeZone: 'Europe/Moscow' })\n .split(', ');\n\n return `${date.split('.').reverse().join('-')} ${time}`;\n};\n\nexport const sendCalltouchCallbackRequest = ({\n routeKey = ROUTE_KEY,\n phone,\n fields = [],\n hours = null,\n tags = [],\n unitId\n}: ISendCalltouchCallbackRequest): Promise<CreateRequestSuccessResponse> => {\n const scheduleTime = getScheduleTime(hours);\n\n return new Promise((res, rej) => {\n const requestCallback = makeRequestCallback(res, rej);\n\n window.ctw?.createRequest?.(\n routeKey,\n phone,\n fields,\n requestCallback,\n scheduleTime,\n tags,\n unitId\n );\n });\n};\n\nconst makeRequestCallback = (\n resolve: (value: CreateRequestSuccessResponse) => void,\n reject: (reason?: ErrorResponse) => void\n) => (\n success: boolean,\n responseData: CreateRequestSuccessResponse | ErrorResponse\n) => {\n if (success) {\n return resolve(responseData as CreateRequestSuccessResponse);\n }\n\n const error = responseData as ErrorResponse;\n\n // eslint-disable-next-line no-console\n console.error('sendCalltouchCallbackRequest error', error);\n\n return reject(error);\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { PhoneInput, Size } from '@vtblife/uikit/legacy';\nimport { ModalProps } from '@vtblife/uikit/dist/components/modal/types';\n\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport classname from '@search/classname/src';\nimport { useToggleValue } from '@search/hooks/src/useToggleValue';\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useApplicationContext } from '@search/hooks/src/providers/ApplicationProvider/ApplicationProvider';\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport { useInitialPhone } from '../../hooks/useInitialPhone';\nimport { useWorkingHours } from '../WorkingHours/useWorkingHours';\nimport { WorkingHours } from '../WorkingHours/WorkingHours';\nimport { normalizeCallbackUrl } from '../MinimalBanksMortgage/mortgage2/mortgage2ContactsFormSend';\nimport type { useCallbackRequestEmailMutation$variables as useCallbackRequestEmailMutationVariables } from './__generated__/useCallbackRequestEmailMutation.graphql';\nimport { useCallbackRequest } from './useCallbackRequest';\nimport {\n ErrorResponse,\n sendCalltouchCallbackRequest,\n CalltouchCallbackError\n} from './sendCalltouchCallbackRequest';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CallbackModal');\n\nconst PHONE_NUMBER_LENGTH = 11;\nconst START_HOUR_WORKING_DAY_SALES = 9;\nconst END_HOUR_WORKING_DAY_SALES = 21;\nconst DEFAULT_REQUEST_ERROR_MESSAGE = 'Что-то пошло не так, попробуйте позже.';\nconst HOST_M2_IPOTEKA = 'https://m2.ru/ipoteka';\n\nexport type CallbackDataType = Pick<\n ICallbackModalProps,\n 'newBuildingName' | 'address' | 'developerName' | 'extra' | 'subjectExtra' | 'emailSender' | 'callbackUnitId'\n>;\n\ninterface ICallbackModalProps extends\n Omit<ModalProps, 'opened' | 'children'>,\n Omit<useCallbackRequestEmailMutationVariables, 'phone' | 'hours'>\n{\n isOpened?: boolean;\n startHour?: number;\n endHour?: number;\n gtmSendClick?: string;\n onSendEventPush?: () => void;\n gtmShowModal?: string;\n btnWrapperClass?: string;\n onClose?(): void;\n renderTrigger?: (openModalCallback: () => void) => React.ReactNode;\n callbackUnitId?: number; // Идентификатор отдела в Коллтаче (зависит от региона)\n enableInnerText360?: boolean;\n hasNoText?: boolean;\n withoutIconOnButton?: boolean;\n buttonSize?: 's' | 'm' | 'l';\n onDarkBackground?: boolean;\n}\n\nconst INIT_REQUEST_DATA = {\n status: STATUS.INIT,\n errorMessage: ''\n};\n\nexport const CallbackModal: React.FC<ICallbackModalProps> = ({\n size = 's',\n mobile = false,\n startHour = START_HOUR_WORKING_DAY_SALES,\n endHour = END_HOUR_WORKING_DAY_SALES,\n newBuildingName,\n address,\n developerName,\n offerLink,\n extra,\n subjectExtra,\n emailSender,\n gtmSendClick,\n onSendEventPush,\n gtmShowModal,\n renderTrigger,\n btnWrapperClass,\n callbackUnitId,\n newBuildingRanking,\n regionId,\n isNewBuilding,\n onClose,\n enableInnerText360,\n hasNoText,\n withoutIconOnButton,\n buttonSize,\n onDarkBackground = false\n}) => {\n const {\n rawWorkingHoursRange,\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues\n } = useWorkingHours({ startHour, endHour });\n\n const initialPhone = useInitialPhone();\n const [ phoneNumber, setPhoneNumber ] = useState(initialPhone);\n\n const [ requestData, setRequestData ] = useState(INIT_REQUEST_DATA);\n\n const {\n handleToggleTogVal: handleToggleModal,\n isToggleValue: isOpenModal\n } = useToggleValue(Boolean(onClose));\n\n useEffect(() => {\n if (isOpenModal) {\n setPhoneNumber(initialPhone);\n\n setRequestData(INIT_REQUEST_DATA);\n }\n }, [ initialPhone, isOpenModal ]);\n\n const isFirstShowModal = useRef(true);\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const sendGtmFirstShowModal = useCallback(() => {\n if (isFirstShowModal.current) {\n gtmShowModal && dataLayerPush({ event: gtmShowModal });\n isFirstShowModal.current = false;\n }\n }, [ isFirstShowModal, gtmShowModal, dataLayerPush ]);\n\n const sendCallBackRequest = useCallbackRequest();\n\n const sendRequest = useCallback(async () => {\n const makeSendCallBackRequest = async (isCallbackRequestCreated?: boolean) => {\n const { data } = await sendCallBackRequest({\n extra,\n address,\n regionId,\n offerLink: normalizeCallbackUrl(offerLink),\n emailSender,\n subjectExtra,\n developerName,\n isNewBuilding,\n newBuildingName,\n newBuildingRanking,\n isCallbackRequestCreated,\n phone: phoneNumber,\n hours: `c ${workingHoursRange.start} до ${workingHoursRange.end}`\n });\n\n const errorMessage = data?.createEmailCallback.emailMessageId ? '' : DEFAULT_REQUEST_ERROR_MESSAGE;\n\n setRequestData({\n status: errorMessage ? STATUS.ERROR : STATUS.RESOLVE,\n errorMessage\n });\n };\n\n gtmSendClick && dataLayerPush({ event: gtmSendClick });\n onSendEventPush?.();\n dataLayerPush({ event: 'up_evt_call_back' });\n\n setRequestData(state => ({\n ...state,\n status: STATUS.PENDING\n }));\n\n let isCallbackRequestCreated = false;\n let isLimitExceeded = false;\n\n if (callbackUnitId) {\n try {\n const { callbackRequestId } = await sendCalltouchCallbackRequest({\n phone: phoneNumber,\n unitId: callbackUnitId,\n hours: rawWorkingHoursRange,\n fields: [ {\n name: 'Название объекта',\n value: newBuildingName ?? ''\n } ]\n });\n\n isCallbackRequestCreated = Boolean(callbackRequestId);\n } catch (e) {\n const errorType = (e as ErrorResponse).type;\n\n if (errorType === CalltouchCallbackError.REQUEST_THROTTLE_TIMEOUT || errorType === CalltouchCallbackError.REQUEST_THROTTLE_COUNT) {\n isLimitExceeded = true;\n setRequestData({\n status: STATUS.ERROR,\n errorMessage: DEFAULT_REQUEST_ERROR_MESSAGE\n });\n }\n }\n }\n\n if (! isLimitExceeded) {\n makeSendCallBackRequest(isCallbackRequestCreated).catch(() => {\n setRequestData({\n status: STATUS.ERROR,\n errorMessage: DEFAULT_REQUEST_ERROR_MESSAGE\n });\n });\n }\n }, [\n dataLayerPush,\n emailSender,\n phoneNumber,\n newBuildingName,\n address,\n developerName,\n offerLink,\n extra,\n subjectExtra,\n workingHoursRange,\n sendCallBackRequest,\n gtmSendClick,\n rawWorkingHoursRange,\n callbackUnitId,\n regionId,\n isNewBuilding,\n newBuildingRanking,\n onSendEventPush\n ]);\n\n const isResolvedData = requestData.status === STATUS.RESOLVE;\n\n const applicationContext = useApplicationContext();\n const isClassifiedApp = applicationContext === ApplicationIdEnum.ClassifiedDesktop || applicationContext === ApplicationIdEnum.ClassifiedTouch;\n\n const handleClick = useCallback(() => {\n if (isClassifiedApp) {\n window.location.href = HOST_M2_IPOTEKA;\n } else { // if (newBuildingName)\n sendGtmFirstShowModal();\n handleToggleModal();\n }\n }, [ sendGtmFirstShowModal, handleToggleModal ]);\n\n const buttons = renderTrigger ? renderTrigger(handleClick) : (\n <div className={cn('buttonWrapper', {\n enableInnerText360: enableInnerText360 && ! hasNoText\n }, btnWrapperClass)}>\n <Button\n icon={withoutIconOnButton || ! newBuildingName ? undefined : 'phone-incoming'}\n fullWidth={! hasNoText}\n variant={onDarkBackground ? 'secondary-alt-bg' : 'secondary'}\n onClick={handleClick}\n dataTest='callback-button-cta'\n size={buttonSize ?? 's'}\n >\n {hasNoText ? null : isClassifiedApp ? (\n <>\n <span className={cn('inner-text-360')}>Купить в ипотеку</span>\n <span className={cn('inner-text')}>Купить в ипотеку</span>\n </>\n ) : (\n <>\n <span className={cn('inner-text-360')}>Перезвоните</span>\n <span className={cn('inner-text')}>Перезвоните мне</span>\n </>\n )}\n </Button>\n </div>\n );\n\n return (<>\n {onClose ? null : buttons}\n <Modal\n zIndex={mobile ? 1050 : undefined} // --l-modal\n opened={isOpenModal}\n size={size}\n mobile={mobile}\n swipeToClose={! mobile}\n onClose={onClose ?? handleToggleModal}\n data-scroll-lock-ignore\n >\n {mobile && (\n <Modal.Header>\n Обратный звонок\n </Modal.Header>\n )}\n <Modal.Content scrollable>\n {\n mobile ? (\n isResolvedData && (\n <Typography\n bold\n variant='h3'\n className={cn('title', { mobile })}\n >\n Принято\n </Typography>\n )\n ) : (\n <Typography\n bold\n variant='h3'\n className={cn('title', { mobile })}\n >\n {isResolvedData ? 'Принято' : 'Обратный звонок'}\n </Typography>\n )\n }\n <Typography variant='primary' className={cn('mainMessage', { mobile })}>\n {\n isResolvedData ?\n 'Мы перезвоним вам в указанное время.' :\n // eslint-disable-next-line max-len\n 'Оставьте свой номер телефона, и мы обязательно перезвоним в указанное время (МСК).'\n }\n </Typography>\n {\n isResolvedData ? (\n <Typography\n bold\n variant='primary'\n className={cn('result')}\n >\n {`${\n formatPhone(phoneNumber, { skipParenthesis: true, separateLast: true })\n } c ${\n workingHoursRange.start\n } до ${\n workingHoursRange.end\n } (МСК)`}\n </Typography>\n ) : (\n <>\n <div className={cn('form', { mobile })}>\n <PhoneInput\n fullWidth\n value={phoneNumber}\n onChange={setPhoneNumber}\n hasClear\n inputMode='numeric'\n label='Номер телефона'\n size={Size.Large}\n className={cn('phone')}\n />\n <WorkingHours\n mobile={mobile}\n workingHoursRange={workingHoursRange}\n setStartHoursRange={setStartHoursRange}\n setEndHoursRange={setEndHoursRange}\n startHourValues={startHourValues}\n endHourValues={endHourValues}\n />\n </div>\n {\n requestData.status === STATUS.ERROR && (\n <Typography\n color='red-500'\n variant='primary'\n className={cn('errorMessage', { mobile })}\n >\n {requestData.errorMessage}\n </Typography>\n )\n }\n <Button\n fullWidth\n onClick={sendRequest}\n disabled={\n phoneNumber.length < PHONE_NUMBER_LENGTH ||\n requestData.status === STATUS.PENDING\n }\n >\n Отправить\n </Button>\n </>\n )\n }\n </Modal.Content>\n </Modal>\n </>);\n};\n","import './CoreSvgSpriteIcon.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'CoreSvgSpriteIcon');\n\ninterface IProps<T extends string> extends React.SVGProps<SVGSVGElement> {\n name: T;\n height?: number;\n width?: number;\n color?: string;\n className?: string;\n viewBoxWidth?: number;\n viewBoxHeight?: number;\n}\n\nexport const CoreSvgSpriteIcon = <T extends string>({\n name,\n width = 24,\n height = 24,\n viewBoxWidth = width,\n viewBoxHeight = height,\n color,\n className,\n ...otherProps\n}: IProps<T>) => {\n return (\n <svg\n height={height}\n width={width}\n className={cn(null, undefined, className)}\n color={color}\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n {...otherProps}\n >\n <use href={`#${name}`} />\n </svg>\n );\n};\n","import React, { Ref } from 'react';\n\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../../../../../common/components/CustomerFeedback/components/OpenButton';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonBlue');\n\nexport const OpenButtonBlue = React.forwardRef(({\n handleCloseOpenBtn,\n handleOpen\n}: Pick<ICustomerFeedbackOpenButton, 'handleCloseOpenBtn' | 'handleOpen'>, ref: Ref<HTMLDivElement>) => (\n <div\n ref={ref}\n className={cn()}\n >\n <Button\n size='s'\n rounded='left'\n onClick={handleOpen}\n dataTest='customer-feedback-open-btn'\n >\n Отзыв о сайте\n </Button>\n <Button\n size='s'\n icon='times'\n rounded='right'\n onClick={handleCloseOpenBtn}\n dataTest='customer-feedback-close-btn'\n />\n </div>\n));\n","import React, { useCallback, useEffect, useState } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { Button, Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../../../../../common/components/CustomerFeedback/components/OpenButton';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonBlueBanner');\n\nexport const OpenButtonBlueBanner = ({\n handleCloseOpenBtn,\n handleOpen,\n}: Pick<ICustomerFeedbackOpenButton, 'handleCloseOpenBtn' | 'handleOpen'>) => {\n const [ isVisible, setVisible ] = useState<boolean>(false);\n const [ hasTimerWorked, setTimerWorked ] = useState<boolean>(false);\n\n const footerElement = document.getElementById('footer');\n const viewportHeight = window.innerHeight;\n\n const handleScroll = useCallback(() => {\n if (! hasTimerWorked) {\n return;\n }\n\n const footerTop = footerElement?.getBoundingClientRect()?.top ?? 0;\n\n setVisible(footerTop > viewportHeight);\n }, [ hasTimerWorked ]);\n\n useEffect(() => {\n const throttledHandleScroll = throttle(handleScroll, 100);\n\n window.addEventListener('scroll', throttledHandleScroll);\n\n return () => window.removeEventListener('scroll', throttledHandleScroll);\n }, [ handleScroll ]);\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setVisible(true);\n setTimerWorked(true);\n }, 30000);\n\n return () => clearTimeout(timeoutId);\n }, []);\n\n return (\n <div className={cn(null, { isVisible })}>\n <div className={cn('left')}>\n <div\n className={cn('close')}\n onClick={handleCloseOpenBtn}\n data-test='customer-feedback-close-btn'\n >\n <Icon\n size='s'\n name='times'\n />\n </div>\n <Typography\n variant='secondary'\n color='primary-alt-bg'\n bold\n >\n Отзыв о сайте\n </Typography>\n </div>\n <Button\n size='xs'\n onClick={handleOpen}\n variant='secondary-alt-bg'\n dataTest='customer-feedback-open-btn'\n >\n Оценить\n </Button>\n </div>\n );\n};\n","import React, { Ref } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../index';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonDefault');\n\nexport const OpenButtonDefault = React.forwardRef(({\n isMobile,\n isSticky,\n handleCloseOpenBtn,\n handleOpen\n}: Pick<ICustomerFeedbackOpenButton, 'isSticky' | 'handleCloseOpenBtn' | 'handleOpen'> & { isMobile: boolean }, ref: Ref<HTMLButtonElement>) => (\n <button ref={ref} className={cn(null, { isMobile, isSticky })} onClick={handleOpen}>\n <span className={cn('left-section', { isMobile })}>\n <Icon name='m2-star' color='#FAC32D' size='m' />\n <Typography\n color='blue-500'\n variant='primary'\n bold={isMobile}\n >\n Оцените нас...\n </Typography>\n </span>\n <span className={cn('close', { isMobile })} onClick={handleCloseOpenBtn}>\n <Icon name='times' color='#B6B9C9' size='s' />\n </span>\n </button>\n));\n","import React, { Ref, useCallback, useEffect, useMemo, useRef } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { OpenButtonBlue } from '../../../../../desktop/components/CustomerFeedback/OpenButton/Blue';\nimport { OpenButtonBlueBanner } from '../../../../../mobile/components/CustomerFeedback/OpenButton/BlueBanner';\n\nimport { OpenButtonDefault } from './Default';\n\nconst BOTTOM_GAP = 16;\nconst SCROLL_HEIGHT = 20; // Примерная высота горизонтального скрола\n\nexport interface ICustomerFeedbackOpenButton {\n handleOpen: () => void;\n handleCloseOpenBtn: (e?: React.MouseEvent<Element, MouseEvent>) => void;\n applicationId: ApplicationIdEnum;\n isSticky?: boolean;\n}\n\nexport const CustomerFeedbackOpenButton = ({\n handleOpen,\n handleCloseOpenBtn,\n isSticky = false,\n applicationId\n}: ICustomerFeedbackOpenButton) => {\n const ref = useRef<HTMLButtonElement | HTMLDivElement>(null);\n\n const isMobile = useMemo(() => [\n ApplicationIdEnum.NewBuildingsTouch,\n ApplicationIdEnum.ClassifiedTouch\n ].includes(applicationId), [ applicationId ]);\n\n const handleScroll = useCallback(() => {\n if (ref.current) {\n const rect = ref.current.getBoundingClientRect();\n\n // если стики кнопка достигла своего местоположения в разметке – скрыть\n // сравниваем со SCROLL_HEIGHT, потому что если появится горизонтальный скролл,\n // rect.bottom будет меньше и логика сломается\n if (window.innerHeight - rect.bottom - BOTTOM_GAP > SCROLL_HEIGHT) {\n ref.current.style.visibility = 'hidden';\n } else {\n ref.current.style.visibility = 'visible';\n }\n }\n }, [ ref ]);\n\n useEffect(() => {\n if (! isMobile) {\n const throttleHandleScroll = throttle(handleScroll, 100) as EventListener;\n\n window.addEventListener('scroll', throttleHandleScroll);\n\n return () => {\n window.removeEventListener('scroll', throttleHandleScroll);\n };\n }\n\n return;\n }, [ isMobile, handleScroll ]);\n\n switch (applicationId) {\n case ApplicationIdEnum.NewBuildingsDesktop:\n return (\n <OpenButtonBlue\n handleOpen={handleOpen}\n handleCloseOpenBtn={handleCloseOpenBtn}\n ref={ref as Ref<HTMLDivElement>}\n />\n );\n\n case ApplicationIdEnum.NewBuildingsTouch:\n return (\n <OpenButtonBlueBanner\n handleOpen={handleOpen}\n handleCloseOpenBtn={handleCloseOpenBtn}\n />\n );\n\n case ApplicationIdEnum.ClassifiedDesktop:\n case ApplicationIdEnum.ClassifiedTouch:\n default:\n return (\n <OpenButtonDefault\n handleOpen={handleOpen}\n handleCloseOpenBtn={handleCloseOpenBtn}\n isMobile={isMobile}\n isSticky={isSticky}\n ref={ref as Ref<HTMLButtonElement>}\n />\n );\n }\n};\n","import { graphql } from '@search/gql-client/src';\n\nconst customerFeedbackMutation = graphql`\n mutation CustomerFeedbackMutation(\n $rating: Int!,\n $message: String!,\n $applicationId: ApplicationIdEnum!,\n $complexityOptions: [String!],\n $contact: String,\n $usability: CustomerFeedbackAnswer,\n $infoFullness: CustomerFeedbackAnswer,\n $extraFeatures: String,\n $searchSuccess: String\n ) {\n sendCustomerFeedback(\n rating: $rating,\n message: $message,\n applicationId: $applicationId,\n complexityOptions: $complexityOptions,\n contact: $contact,\n usability: $usability,\n infoFullness: $infoFullness,\n extraFeatures: $extraFeatures,\n searchSuccess: $searchSuccess\n ) {\n status\n }\n }\n`;\n\nexport default customerFeedbackMutation;\n","import { useCallback } from 'react';\n\nimport { useGqlContext } from '@search/gql-client/src';\n\nimport type {\n CustomerFeedbackMutation$variables as CustomerFeedbackMutationVariables,\n CustomerFeedbackMutation$data as CustomerFeedbackMutationResponse\n} from './__generated__/CustomerFeedbackMutation.graphql';\nimport customerFeedbackMutation from './CustomerFeedbackMutation';\n\nconst useSendCustomerFeedback = () => {\n const gql = useGqlContext();\n\n return useCallback(\n (vars: CustomerFeedbackMutationVariables) => gql.client<\n CustomerFeedbackMutationVariables,\n CustomerFeedbackMutationResponse\n >(customerFeedbackMutation, vars),\n [ gql ]\n );\n};\n\nexport default useSendCustomerFeedback;\n","import type { ExtraFeature, FeedbackOption, InfoFullnessDetail, UsabilityDetail } from './dict';\n\nexport interface IFeedbackFormState {\n usability: {\n value?: FeedbackOption;\n details: Array<UsabilityDetail>;\n customText: string;\n };\n infoFullness: {\n value?: FeedbackOption;\n details: Array<InfoFullnessDetail>;\n customText: string;\n };\n extraFeatures: Array<ExtraFeature>;\n searchSuccess?: FeedbackOption;\n comment: string;\n contact: string;\n}\n\nexport const initialFormState: IFeedbackFormState = {\n usability: {\n value: undefined,\n details: [],\n customText: ''\n },\n infoFullness: {\n value: undefined,\n details: [],\n customText: ''\n },\n extraFeatures: [],\n searchSuccess: undefined,\n comment: '',\n contact: ''\n};\n\nexport enum ACTIONS {\n USABILITY_UPDATE,\n USABILITY_DETAILS_UPDATE,\n USABILITY_DETAILS_RESET,\n USABILITY_CUSTOM_TEXT_UPDATE,\n INFO_FULLNESS_UPDATE,\n INFO_FULLNESS_DETAILS_UPDATE,\n INFO_FULLNESS_DETAILS_RESET,\n INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n EXTRA_FEATURES_UPDATE,\n EXTRA_FEATURES_RESET,\n SEARCH_SUCCESS_UPDATE,\n COMMENT_UPDATE,\n CONTACT_UPDATE,\n SET_INITIAL_FORM_DATA,\n}\n\nexport type Action =\n | { type: ACTIONS.USABILITY_UPDATE; payload: FeedbackOption }\n | { type: ACTIONS.USABILITY_DETAILS_UPDATE; payload: { value: UsabilityDetail; isCheck: boolean }}\n | { type: ACTIONS.USABILITY_DETAILS_RESET }\n | { type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE; payload: string}\n | { type: ACTIONS.INFO_FULLNESS_UPDATE; payload: FeedbackOption }\n | { type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE; payload: { value: InfoFullnessDetail; isCheck: boolean }}\n | { type: ACTIONS.INFO_FULLNESS_DETAILS_RESET }\n | { type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE; payload: string }\n | { type: ACTIONS.EXTRA_FEATURES_UPDATE; payload: { value: ExtraFeature; isCheck: boolean } }\n | { type: ACTIONS.EXTRA_FEATURES_RESET }\n | { type: ACTIONS.SEARCH_SUCCESS_UPDATE; payload: FeedbackOption }\n | { type: ACTIONS.COMMENT_UPDATE; payload: string }\n | { type: ACTIONS.CONTACT_UPDATE; payload: string }\n | { type: ACTIONS.SET_INITIAL_FORM_DATA }\n\nexport function reducer(state: IFeedbackFormState, action: Action): IFeedbackFormState {\n switch (action.type) {\n case ACTIONS.USABILITY_UPDATE:\n return {\n ...state,\n usability: {\n ...initialFormState.usability,\n value: action.payload\n }\n };\n\n case ACTIONS.USABILITY_DETAILS_UPDATE:\n return {\n ...state,\n usability: {\n ...state.usability,\n details: action.payload.isCheck ?\n [ ...state.usability.details, action.payload.value ] :\n state.usability.details.filter(item => item !== action.payload.value)\n }\n };\n\n case ACTIONS.USABILITY_DETAILS_RESET:\n return {\n ...state,\n usability: {\n ...state.usability,\n details: initialFormState.usability.details\n }\n };\n\n case ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE:\n return {\n ...state,\n usability: {\n ...state.usability,\n customText: action.payload\n }\n };\n\n case ACTIONS.INFO_FULLNESS_UPDATE:\n return {\n ...state,\n infoFullness: {\n ...initialFormState.infoFullness,\n value: action.payload\n }\n };\n\n case ACTIONS.INFO_FULLNESS_DETAILS_UPDATE:\n return {\n ...state,\n infoFullness: {\n ...state.infoFullness,\n details: action.payload.isCheck ?\n [ ...state.infoFullness.details, action.payload.value ] :\n state.infoFullness.details.filter(item => item !== action.payload.value)\n }\n };\n\n case ACTIONS.INFO_FULLNESS_DETAILS_RESET:\n return {\n ...state,\n infoFullness: {\n ...state.infoFullness,\n details: initialFormState.infoFullness.details\n }\n };\n\n case ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE:\n return {\n ...state,\n infoFullness: {\n ...state.infoFullness,\n customText: action.payload\n }\n };\n\n case ACTIONS.EXTRA_FEATURES_UPDATE:\n return {\n ...state,\n extraFeatures: action.payload.isCheck ?\n [ ...state.extraFeatures, action.payload.value ] :\n state.extraFeatures.filter(item => item !== action.payload.value)\n };\n\n case ACTIONS.EXTRA_FEATURES_RESET:\n return {\n ...state,\n extraFeatures: initialFormState.extraFeatures\n };\n\n case ACTIONS.SEARCH_SUCCESS_UPDATE:\n return {\n ...state,\n searchSuccess: action.payload\n };\n\n case ACTIONS.COMMENT_UPDATE:\n return {\n ...state,\n comment: action.payload\n };\n\n case ACTIONS.CONTACT_UPDATE:\n return {\n ...state,\n contact: action.payload\n };\n\n case ACTIONS.SET_INITIAL_FORM_DATA:\n return initialFormState;\n\n default:\n return state;\n }\n}\n","export const QUESTION = {\n usability: 'Вам было удобно пользоваться поиском недвижимости?',\n infoFullness: 'Информация о жилых комплексах была полной?',\n extraFeatures: 'Что могло бы помочь вам в выборе квартиры?',\n searchSuccess: 'Вы нашли подходящие варианты квартир?',\n comment: 'Расскажите подробнее о своём опыте',\n contact: 'Если вы оставите контактные данные, мы поможем решить возникшие проблемы',\n};\n\nexport enum FeedbackOption {\n YES = 'YES',\n NO = 'NO'\n}\n\nexport const USABILITY_OPTIONS: Record<FeedbackOption, string> = {\n [FeedbackOption.YES]: 'Да, всё хорошо',\n [FeedbackOption.NO]: 'Нет, возникли сложности',\n};\n\nexport const INFO_FULLNESS_OPTIONS: Record<FeedbackOption, string> = {\n [FeedbackOption.YES]: 'Да, данных достаточно',\n [FeedbackOption.NO]: 'Хотелось бы увидеть больше',\n};\n\nexport const SEARCH_SUCCESS_OPTIONS: Record<FeedbackOption, string> = {\n [FeedbackOption.YES]: 'Да, всё получилось',\n [FeedbackOption.NO]: 'Пока в поиске',\n};\n\nexport enum UsabilityDetail {\n LACK_FILTER = 'LACK_FILTER',\n DIFFICULTLY = 'DIFFICULTLY',\n FEW_OFFERS = 'FEW_OFFERS',\n INACCURATE_SEARCH = 'INACCURATE_SEARCH',\n SLOW_LOADING = 'SLOW_LOADING',\n OTHER = 'OTHER'\n}\n\nexport enum InfoFullnessDetail {\n STREET_PANORAMA = 'STREET_PANORAMA',\n AREA_GENERAL_PLAN = 'AREA_GENERAL_PLAN',\n PARKING_SCHEME = 'PARKING_SCHEME',\n MORE_PHOTO = 'MORE_PHOTO',\n PROJECT_BOOKLETS = 'PROJECT_BOOKLETS',\n OTHER = 'OTHER'\n}\n\nexport enum ExtraFeature {\n WINDOW_VIEW = 'WINDOW_VIEW',\n FLOOR_PLAN = 'FLOOR_PLAN',\n FINISHING_TYPE = 'FINISHING_TYPE',\n REPAIR_COST = 'REPAIR_COST',\n VIRTUAL_TOURS = 'VIRTUAL_TOURS',\n FURNITURE_PLAN = 'FURNITURE_PLAN'\n}\n\nexport const USABILITY_DETAILS_OPTIONS: Record<UsabilityDetail, string> = {\n [UsabilityDetail.LACK_FILTER]: 'Нет нужных фильтров',\n [UsabilityDetail.DIFFICULTLY]: 'Сложно разобраться',\n [UsabilityDetail.FEW_OFFERS]: 'Мало предложений',\n [UsabilityDetail.INACCURATE_SEARCH]: 'Неточные результаты поиска',\n [UsabilityDetail.SLOW_LOADING]: 'Медленная загрузка',\n [UsabilityDetail.OTHER]: 'Другое'\n};\n\nexport const INFO_FULLNESS_DETAILS_OPTIONS: Record<InfoFullnessDetail, string> = {\n [InfoFullnessDetail.STREET_PANORAMA]: 'Панораму улицы',\n [InfoFullnessDetail.AREA_GENERAL_PLAN]: 'Генплан района',\n [InfoFullnessDetail.PARKING_SCHEME]: 'Схему паркинга',\n [InfoFullnessDetail.MORE_PHOTO]: 'Больше фотографий и видео',\n [InfoFullnessDetail.PROJECT_BOOKLETS]: 'Буклеты о проектах',\n [InfoFullnessDetail.OTHER]: 'Другое'\n};\n\nexport const EXTRA_FEATURES_OPTIONS: Record<ExtraFeature, string> = {\n [ExtraFeature.WINDOW_VIEW]: 'Вид из окна',\n [ExtraFeature.FLOOR_PLAN]: 'Поэтажный план',\n [ExtraFeature.FINISHING_TYPE]: 'Варианты отделки',\n [ExtraFeature.REPAIR_COST]: 'Стоимость ремонта',\n [ExtraFeature.VIRTUAL_TOURS]: 'Виртуальные туры',\n [ExtraFeature.FURNITURE_PLAN]: 'План с мебелью'\n};\n\nexport const ERROR_MESSAGE = 'Что-то пошло не так, попробуйте позже.';\n","import type { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport type { CustomerFeedbackMutation$variables } from '../../../__generated__/CustomerFeedbackMutation.graphql';\n\nimport {\n EXTRA_FEATURES_OPTIONS,\n FeedbackOption,\n INFO_FULLNESS_DETAILS_OPTIONS,\n INFO_FULLNESS_OPTIONS,\n InfoFullnessDetail,\n SEARCH_SUCCESS_OPTIONS,\n USABILITY_DETAILS_OPTIONS,\n USABILITY_OPTIONS,\n UsabilityDetail\n} from './dict';\nimport type { IFeedbackFormState } from './state';\n\nexport const buildCustomerFeedbackVars = (\n params: IFeedbackFormState,\n applicationId: ApplicationIdEnum\n): CustomerFeedbackMutation$variables => {\n const usabilityText = ! params.usability.value ? '' : (\n params.usability.value === FeedbackOption.YES ? USABILITY_OPTIONS[FeedbackOption.YES] : `${\n USABILITY_OPTIONS[FeedbackOption.NO]\n }${\n params.usability.details.length ? `: ${\n params.usability.details\n .filter(item => item !== UsabilityDetail.OTHER)\n .map(item => USABILITY_DETAILS_OPTIONS[item])\n .join(', ')\n }` : ''\n }${\n params.usability.details.includes(UsabilityDetail.OTHER) ? `${\n params.usability.details.length > 1 ? ', ' : ''\n }${\n USABILITY_DETAILS_OPTIONS[UsabilityDetail.OTHER]\n }${\n params.usability.customText ? `: ${params.usability.customText}` : ''\n }` : ''\n }`\n );\n\n const infoFullnessText = ! params.infoFullness.value ? '' : (\n params.infoFullness.value === FeedbackOption.YES ? INFO_FULLNESS_OPTIONS[FeedbackOption.YES] : `${\n INFO_FULLNESS_OPTIONS[FeedbackOption.NO]\n }${\n params.infoFullness.details.length ? `: ${\n params.infoFullness.details\n .filter(item => item !== InfoFullnessDetail.OTHER)\n .map(item => INFO_FULLNESS_DETAILS_OPTIONS[item])\n .join(', ')\n }` : ''\n }${\n params.infoFullness.details.includes(InfoFullnessDetail.OTHER) ? `${\n params.infoFullness.details.length > 1 ? ', ' : ''\n }${\n INFO_FULLNESS_DETAILS_OPTIONS[InfoFullnessDetail.OTHER]\n }${\n params.infoFullness.customText ? `: ${params.infoFullness.customText}` : ''\n }` : ''\n }`\n );\n\n const extraFeatures = params.extraFeatures\n .map(item => EXTRA_FEATURES_OPTIONS[item])\n .join(', ');\n\n const searchSuccess = params.searchSuccess ? SEARCH_SUCCESS_OPTIONS[params.searchSuccess] : '';\n\n return {\n rating: 0,\n applicationId,\n usability: {\n value: params.usability.value && params.usability.value === FeedbackOption.YES,\n text: usabilityText\n },\n infoFullness: {\n value: params.infoFullness.value && params.infoFullness.value === FeedbackOption.YES,\n text: infoFullnessText\n },\n extraFeatures,\n searchSuccess,\n message: params.comment,\n contact: params.contact\n };\n};\n","import React, { useCallback, useEffect, useReducer, useState } from 'react';\n\nimport { Checkbox, Modal, Input, Button, Typography } from '@vtblife/uikit';\nimport { Textarea } from '@vtblife/uikit/legacy';\n\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport classname from '@search/classname/src';\n\nimport useSendCustomerFeedback from '../../../../../common/components/CustomerFeedback/useSendCustomerFeedback';\nimport type { CustomerFeedbackModalType } from '../../../../../common/components/CustomerFeedback/components/Modal';\nimport { Action, ACTIONS, IFeedbackFormState, initialFormState, reducer } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/state';\nimport {\n ERROR_MESSAGE,\n EXTRA_FEATURES_OPTIONS,\n ExtraFeature,\n FeedbackOption,\n INFO_FULLNESS_DETAILS_OPTIONS,\n INFO_FULLNESS_OPTIONS,\n InfoFullnessDetail,\n QUESTION,\n SEARCH_SUCCESS_OPTIONS,\n USABILITY_DETAILS_OPTIONS,\n USABILITY_OPTIONS,\n UsabilityDetail\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/dict';\nimport { buildCustomerFeedbackVars } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars';\nimport FeedbackSuccessIcon from '../../../../../common/components/CustomerFeedback/components/Modal/successImage.url.svg';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackModalNewBuildingsDesktop');\n\ntype ICustomerFeedbackModalNewBuildings = Pick<\n CustomerFeedbackModalType,\n 'modalIsOpen' | 'handleCloseModal' | 'handleFinishedFeedback' | 'applicationId' | 'disableFeedbackReappearance'\n>\n\nexport const CustomerFeedbackModalNewBuildings = ({\n modalIsOpen,\n handleCloseModal: handleCloseModalExternal,\n handleFinishedFeedback,\n disableFeedbackReappearance,\n applicationId = ApplicationIdEnum.NewBuildingsDesktop,\n}: ICustomerFeedbackModalNewBuildings) => {\n const [ state, dispatch ] = useReducer(reducer, initialFormState);\n const [ requestStatus, setRequestStatus ] = useState<STATUS>(STATUS.INIT);\n\n const handleCloseModal = useCallback(() => {\n dispatch({ type: ACTIONS.SET_INITIAL_FORM_DATA });\n setRequestStatus(STATUS.INIT);\n\n if (requestStatus === STATUS.RESOLVE) {\n handleFinishedFeedback();\n disableFeedbackReappearance();\n\n return;\n }\n\n handleCloseModalExternal();\n }, [ requestStatus, handleFinishedFeedback, handleCloseModalExternal, disableFeedbackReappearance ]);\n\n const sendCustomerFeedback = useSendCustomerFeedback();\n\n const handleSendCustomerFeedback = useCallback(() => {\n const vars = buildCustomerFeedbackVars(state, applicationId);\n\n setRequestStatus(STATUS.PENDING);\n\n sendCustomerFeedback(vars)\n .then(() => {\n setRequestStatus(STATUS.RESOLVE);\n })\n .catch(() => {\n setRequestStatus(STATUS.ERROR);\n });\n }, [ state, applicationId ]);\n\n useEffect(() => {\n if (requestStatus === STATUS.ERROR) {\n // eslint-disable-next-line no-alert\n window.alert(ERROR_MESSAGE);\n }\n }, [ requestStatus ]);\n\n return (\n <Modal\n overflow={false}\n swipeToClose={false}\n opened={modalIsOpen}\n onClose={handleCloseModal}\n >\n {\n requestStatus === STATUS.RESOLVE ? (\n <SuccessModalContent handleCloseModal={handleCloseModal} />\n ) : (\n <>\n <Modal.Title>Оцените удобство сервиса m2.ru</Modal.Title>\n <PrimaryModalContent\n state={state}\n dispatch={dispatch}\n isLoading={requestStatus === STATUS.PENDING}\n handleSendCustomerFeedback={handleSendCustomerFeedback}\n />\n </>\n )\n }\n </Modal>\n );\n};\n\nconst PrimaryModalContent = ({\n state,\n dispatch,\n isLoading,\n handleSendCustomerFeedback\n}: {\n state: IFeedbackFormState;\n dispatch: React.Dispatch<Action>;\n handleSendCustomerFeedback: () => void;\n isLoading?: boolean;\n}) => {\n return (\n <div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.usability}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(USABILITY_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.usability.value === key}\n onChange={() => dispatch({\n type: ACTIONS.USABILITY_UPDATE,\n payload: key as FeedbackOption\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n {\n state.usability.value === FeedbackOption.NO && (\n <div className={cn('details')}>\n {Object.entries(USABILITY_DETAILS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n variant='filter'\n value={state.usability.details.includes(key as UsabilityDetail)}\n onChange={isCheck => dispatch({\n type: ACTIONS.USABILITY_DETAILS_UPDATE,\n payload: { isCheck, value: key as UsabilityDetail }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n )\n }\n {\n state.usability.details.includes(UsabilityDetail.OTHER) && (\n <div className={cn('other')}>\n <Input\n value={state.usability.customText}\n placeholder='Ваш вариант'\n onChange={value => dispatch({\n type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE,\n payload: value\n })}\n />\n </div>\n )\n }\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.infoFullness}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(INFO_FULLNESS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.infoFullness.value === key}\n onChange={() => dispatch({\n type: ACTIONS.INFO_FULLNESS_UPDATE,\n payload: key as FeedbackOption\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n {\n state.infoFullness.value === FeedbackOption.NO && (\n <div className={cn('details')}>\n {Object.entries(INFO_FULLNESS_DETAILS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n variant='filter'\n value={state.infoFullness.details.includes(key as InfoFullnessDetail)}\n onChange={isCheck => dispatch({\n type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE,\n payload: { isCheck, value: key as InfoFullnessDetail }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n )\n }\n {\n state.infoFullness.details.includes(InfoFullnessDetail.OTHER) && (\n <div className={cn('other')}>\n <Input\n value={state.infoFullness.customText}\n placeholder='Ваш вариант'\n onChange={value => dispatch({\n type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n payload: value\n })}\n />\n </div>\n )\n }\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.extraFeatures}\n </Typography>\n <div className={cn('details')}>\n {Object.entries(EXTRA_FEATURES_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n variant='filter'\n value={state.extraFeatures.includes(key as ExtraFeature)}\n onChange={isCheck => dispatch({\n type: ACTIONS.EXTRA_FEATURES_UPDATE,\n payload: { isCheck, value: key as ExtraFeature }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.searchSuccess}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(SEARCH_SUCCESS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.searchSuccess === key}\n onChange={() => dispatch({\n type: ACTIONS.SEARCH_SUCCESS_UPDATE,\n payload: key as FeedbackOption\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.comment}\n </Typography>\n <div className={cn('comment')}>\n <Textarea\n rows={3}\n fullWidth\n value={state.comment}\n placeholder='Если у вас есть предложения по улучшению сервиса, или возникла проблема — расскажите нам'\n onChange={value => dispatch({\n type: ACTIONS.COMMENT_UPDATE,\n payload: value\n })}\n />\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.contact}\n </Typography>\n <div className={cn('contacts')}>\n <Input\n size='m'\n value={state.contact}\n placeholder='Телефон или email'\n onChange={value => dispatch({\n type: ACTIONS.CONTACT_UPDATE,\n payload: value\n })}\n />\n </div>\n <Modal.StickyActions>\n <Button\n fullWidth\n loading={isLoading}\n disabled={isLoading}\n onClick={handleSendCustomerFeedback}\n >\n Отправить отзыв\n </Button>\n </Modal.StickyActions>\n </div>\n );\n};\n\nconst SuccessModalContent = ({ handleCloseModal }: { handleCloseModal: () => void }) => {\n const staticPath = useStaticPathConfig();\n\n return (\n <div className={cn('success')}>\n <img\n crossOrigin='anonymous'\n alt='Спасибо за оценку!'\n width={208}\n height={156}\n src={`${staticPath}${FeedbackSuccessIcon}`}\n />\n <Typography\n bold\n variant='h3'\n className={cn('success-feedback-sent')}\n >\n Отзыв отправлен!\n </Typography>\n <Typography\n variant='primary'\n className={cn('success-thanks-text')}\n >\n Спасибо, что помогаете нам становиться лучше\n </Typography>\n <Modal.Actions>\n <Button\n fullWidth\n size='l'\n variant='secondary'\n onClick={handleCloseModal}\n >\n Закрыть\n </Button>\n </Modal.Actions>\n </div>\n );\n};\n","export default \"34a62ecb2f45490ad2feaf6c8999f70a.svg\";","import React, { useCallback, useEffect, useReducer, useState, useMemo } from 'react';\n\nimport { Checkbox, Modal, Select, Input, Button, Typography } from '@vtblife/uikit';\nimport { Textarea } from '@vtblife/uikit/legacy';\n\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport classname from '@search/classname/src';\n\nimport type { CustomerFeedbackModalType } from '../../../../../common/components/CustomerFeedback/components/Modal';\nimport useSendCustomerFeedback from '../../../../../common/components/CustomerFeedback/useSendCustomerFeedback';\nimport {\n Action,\n ACTIONS,\n IFeedbackFormState,\n initialFormState,\n reducer\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/state';\nimport {\n ERROR_MESSAGE,\n EXTRA_FEATURES_OPTIONS,\n ExtraFeature,\n FeedbackOption,\n INFO_FULLNESS_DETAILS_OPTIONS,\n INFO_FULLNESS_OPTIONS,\n InfoFullnessDetail,\n QUESTION,\n SEARCH_SUCCESS_OPTIONS,\n USABILITY_DETAILS_OPTIONS,\n USABILITY_OPTIONS,\n UsabilityDetail\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/dict';\nimport { buildCustomerFeedbackVars } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackModalNewBuildingsMobile');\n\ntype ICustomerFeedbackModalNewBuildings = Pick<\n CustomerFeedbackModalType,\n 'modalIsOpen' | 'handleCloseModal' | 'handleFinishedFeedback' | 'applicationId' | 'disableFeedbackReappearance'\n>\n\nexport const CustomerFeedbackModalNewBuildings = ({\n modalIsOpen,\n handleCloseModal: handleCloseModalExternal,\n handleFinishedFeedback,\n disableFeedbackReappearance,\n applicationId = ApplicationIdEnum.NewBuildingsTouch,\n}: ICustomerFeedbackModalNewBuildings) => {\n const [ state, dispatch ] = useReducer(reducer, initialFormState);\n const [ requestStatus, setRequestStatus ] = useState<STATUS>(STATUS.INIT);\n\n const [ isUsabilityDetailsModalOpen, setUsabilityDetailsModalOpen ] = useState<boolean>(false);\n const [ isInfoFullnessModalOpen, setInfoFullnessModalOpen ] = useState<boolean>(false);\n const [ isExtraFeaturesModalOpen, setExtraFeaturesModalOpen ] = useState<boolean>(false);\n\n const handleCloseModal = useCallback(() => {\n dispatch({ type: ACTIONS.SET_INITIAL_FORM_DATA });\n setRequestStatus(STATUS.INIT);\n\n if (requestStatus === STATUS.RESOLVE) {\n handleFinishedFeedback();\n disableFeedbackReappearance();\n\n return;\n }\n\n handleCloseModalExternal();\n }, [ requestStatus, handleFinishedFeedback, handleCloseModalExternal, disableFeedbackReappearance ]);\n\n const handleOpenUsabilityDetailsModal = useCallback(() => setUsabilityDetailsModalOpen(true), []);\n const handleCloseUsabilityDetailsModal = useCallback(() => setUsabilityDetailsModalOpen(false), []);\n\n const handleOpenInfoFullnessModal = useCallback(() => setInfoFullnessModalOpen(true), []);\n const handleCloseInfoFullnessModal = useCallback(() => setInfoFullnessModalOpen(false), []);\n\n const handleOpenExtraFeaturesModal = useCallback(() => setExtraFeaturesModalOpen(true), []);\n const handleCloseExtraFeaturesModal = useCallback(() => setExtraFeaturesModalOpen(false), []);\n\n const sendCustomerFeedback = useSendCustomerFeedback();\n\n const handleSendCustomerFeedback = useCallback(() => {\n const vars = buildCustomerFeedbackVars(state, applicationId);\n\n setRequestStatus(STATUS.PENDING);\n\n sendCustomerFeedback(vars)\n .then(() => {\n setRequestStatus(STATUS.RESOLVE);\n })\n .catch(() => {\n setRequestStatus(STATUS.ERROR);\n });\n }, [ state, applicationId ]);\n\n useEffect(() => {\n if (requestStatus === STATUS.ERROR) {\n // eslint-disable-next-line no-alert\n window.alert(ERROR_MESSAGE);\n }\n }, [ requestStatus ]);\n\n return (\n <>\n <Modal\n overflow={false}\n swipeToClose={false}\n opened={modalIsOpen}\n onClose={handleCloseModal}\n mobile\n >\n <Modal.Header>Оцените удобство сервиса</Modal.Header>\n {\n requestStatus === STATUS.RESOLVE ? (\n <SuccessModalContent handleCloseModal={handleCloseModal} />\n ) : (\n <PrimaryModalContent\n state={state}\n dispatch={dispatch}\n isLoading={requestStatus === STATUS.PENDING}\n handleOpenUsabilityDetailsModal={handleOpenUsabilityDetailsModal}\n handleOpenInfoFullnessModal={handleOpenInfoFullnessModal}\n handleOpenExtraFeaturesModal={handleOpenExtraFeaturesModal}\n handleSendCustomerFeedback={handleSendCustomerFeedback}\n />\n )\n }\n </Modal>\n <UsabilityDetailsModal\n state={state}\n dispatch={dispatch}\n isOpen={isUsabilityDetailsModalOpen}\n handleClose={handleCloseUsabilityDetailsModal}\n />\n <InfoFullnessModal\n state={state}\n dispatch={dispatch}\n isOpen={isInfoFullnessModalOpen}\n handleClose={handleCloseInfoFullnessModal}\n />\n <ExtraFeaturesModal\n state={state}\n dispatch={dispatch}\n isOpen={isExtraFeaturesModalOpen}\n handleClose={handleCloseExtraFeaturesModal}\n />\n </>\n );\n};\n\nconst PrimaryModalContent = ({\n state,\n dispatch,\n isLoading,\n handleOpenUsabilityDetailsModal,\n handleOpenInfoFullnessModal,\n handleOpenExtraFeaturesModal,\n handleSendCustomerFeedback\n}: {\n state: IFeedbackFormState;\n dispatch: React.Dispatch<Action>;\n handleSendCustomerFeedback: () => void;\n handleOpenUsabilityDetailsModal: () => void;\n handleOpenInfoFullnessModal: () => void;\n handleOpenExtraFeaturesModal: () => void;\n isLoading?: boolean;\n}) => {\n const extraFeaturesSelectedText = useMemo(() => Object.entries(EXTRA_FEATURES_OPTIONS)\n .filter(([ key ]) => state.extraFeatures.includes(key as ExtraFeature))\n .map(([ , value ]) => value)\n .join(', '), [ state.extraFeatures ]);\n\n return (\n <Modal.Content scrollable>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.usability}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(USABILITY_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.usability.value === key}\n onChange={() => {\n dispatch({\n type: ACTIONS.USABILITY_UPDATE,\n payload: key as FeedbackOption\n });\n\n key === FeedbackOption.NO && handleOpenUsabilityDetailsModal();\n }}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.infoFullness}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(INFO_FULLNESS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.infoFullness.value === key}\n onChange={() => {\n dispatch({\n type: ACTIONS.INFO_FULLNESS_UPDATE,\n payload: key as FeedbackOption\n });\n\n key === FeedbackOption.NO && handleOpenInfoFullnessModal();\n }}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.extraFeatures}\n </Typography>\n <div className={cn('details')}>\n <Select mode='multiple'>\n <Select.Button onClick={handleOpenExtraFeaturesModal}>\n {extraFeaturesSelectedText || 'Выберите варианты ответа'}\n </Select.Button>\n </Select>\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.searchSuccess}\n </Typography>\n <div className={cn('basic')}>\n {Object.entries(SEARCH_SUCCESS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('basicOption')}\n >\n <Checkbox\n radio\n value={state.searchSuccess === key}\n onChange={() => dispatch({\n type: ACTIONS.SEARCH_SUCCESS_UPDATE,\n payload: key as FeedbackOption\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.comment}\n </Typography>\n <div className={cn('comment')}>\n <Textarea\n rows={3}\n fullWidth\n value={state.comment}\n placeholder='Если у вас есть предложения по улучшению сервиса, или возникла проблема — расскажите нам'\n onChange={value => dispatch({\n type: ACTIONS.COMMENT_UPDATE,\n payload: value\n })}\n />\n </div>\n <Typography\n bold\n variant='primary-alone'\n className={cn('question')}\n >\n {QUESTION.contact}\n </Typography>\n <div className={cn('contacts')}>\n <Input\n size='m'\n value={state.contact}\n placeholder='Телефон или email'\n onChange={value => dispatch({\n type: ACTIONS.CONTACT_UPDATE,\n payload: value\n })}\n />\n </div>\n <Modal.StickyActions>\n <Button\n fullWidth\n loading={isLoading}\n disabled={isLoading}\n onClick={handleSendCustomerFeedback}\n >\n Отправить отзыв\n </Button>\n </Modal.StickyActions>\n </Modal.Content>\n );\n};\n\nconst SuccessModalContent = ({ handleCloseModal }: { handleCloseModal: () => void }) => {\n return (\n <div className={cn('success')}>\n <Typography\n bold\n variant='h3'\n className={cn('success-feedback-sent')}\n >\n Отзыв отправлен!\n </Typography>\n <Typography\n variant='primary'\n className={cn('success-thanks-text')}\n >\n Спасибо, что помогаете нам становиться лучше\n </Typography>\n <div className={cn('button')}>\n <Button\n fullWidth\n variant='secondary'\n onClick={handleCloseModal}\n >\n Закрыть\n </Button>\n </div>\n </div>\n );\n};\n\nconst UsabilityDetailsModal = ({\n state,\n dispatch,\n isOpen,\n handleClose\n}: {\n state: IFeedbackFormState;\n dispatch: React.Dispatch<Action>;\n isOpen: boolean;\n handleClose: () => void;\n}) => (\n <Modal\n overflow={false}\n swipeToClose={false}\n opened={isOpen}\n onClose={() => {\n dispatch({ type: ACTIONS.USABILITY_DETAILS_RESET });\n handleClose();\n }}\n mobile\n >\n <Modal.Header>Удобство поиска</Modal.Header>\n <div className={cn('content')}>\n <div className={cn('details')}>\n {Object.entries(USABILITY_DETAILS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n value={state.usability.details.includes(key as UsabilityDetail)}\n onChange={isCheck => dispatch({\n type: ACTIONS.USABILITY_DETAILS_UPDATE,\n payload: { isCheck, value: key as UsabilityDetail }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n {\n state.usability.details.includes(UsabilityDetail.OTHER) && (\n <div className={cn('other')}>\n <Input\n value={state.usability.customText}\n placeholder='Ваш вариант'\n onChange={value => dispatch({\n type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE,\n payload: value\n })}\n />\n </div>\n )\n }\n </div>\n <div className={cn('button')}>\n <Button\n fullWidth\n onClick={handleClose}\n >\n Подтвердить\n </Button>\n </div>\n </Modal>\n);\n\nconst InfoFullnessModal = ({\n state,\n dispatch,\n isOpen,\n handleClose\n}: {\n state: IFeedbackFormState;\n dispatch: React.Dispatch<Action>;\n isOpen: boolean;\n handleClose: () => void;\n}) => (\n <Modal\n overflow={false}\n swipeToClose={false}\n opened={isOpen}\n onClose={() => {\n dispatch({ type: ACTIONS.INFO_FULLNESS_DETAILS_RESET });\n handleClose();\n }}\n mobile\n >\n <Modal.Header>Информация о ЖК</Modal.Header>\n <div className={cn('content')}>\n <Typography\n color='secondary'\n variant='secondary-alone'\n >\n Хотелось бы увидеть:\n </Typography>\n <div className={cn('details')}>\n {Object.entries(INFO_FULLNESS_DETAILS_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n value={state.infoFullness.details.includes(key as InfoFullnessDetail)}\n onChange={isCheck => dispatch({\n type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE,\n payload: { isCheck, value: key as InfoFullnessDetail }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n {\n state.infoFullness.details.includes(InfoFullnessDetail.OTHER) && (\n <div className={cn('other')}>\n <Input\n value={state.infoFullness.customText}\n placeholder='Ваш вариант'\n onChange={value => dispatch({\n type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n payload: value\n })}\n />\n </div>\n )\n }\n </div>\n <div className={cn('button')}>\n <Button\n fullWidth\n onClick={handleClose}\n >\n Подтвердить\n </Button>\n </div>\n </Modal>\n);\n\nconst ExtraFeaturesModal = ({\n state,\n dispatch,\n isOpen,\n handleClose\n}: {\n state: IFeedbackFormState;\n dispatch: React.Dispatch<Action>;\n isOpen: boolean;\n handleClose: () => void;\n}) => (\n <Modal\n overflow={false}\n swipeToClose={false}\n opened={isOpen}\n onClose={() => {\n dispatch({ type: ACTIONS.EXTRA_FEATURES_RESET });\n handleClose();\n }}\n mobile\n >\n <Modal.Header>Информация о квартирах</Modal.Header>\n <div className={cn('content')}>\n <Typography\n color='secondary'\n variant='secondary-alone'\n >\n Хотелось бы увидеть:\n </Typography>\n <div className={cn('details')}>\n {Object.entries(EXTRA_FEATURES_OPTIONS).map(([ key, value ]) => (\n <div\n key={key}\n className={cn('detailsOption')}\n >\n <Checkbox\n value={state.extraFeatures.includes(key as ExtraFeature)}\n onChange={isCheck => dispatch({\n type: ACTIONS.EXTRA_FEATURES_UPDATE,\n payload: { isCheck, value: key as ExtraFeature }\n })}\n >\n {value}\n </Checkbox>\n </div>\n ))}\n </div>\n </div>\n <div className={cn('button')}>\n <Button\n fullWidth\n onClick={handleClose}\n >\n Подтвердить\n </Button>\n </div>\n </Modal>\n);\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useCookies } from 'react-cookie';\nimport { Modal } from '@vtblife/uikit';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport classname from '@search/classname/src';\n\nimport './CustomerFeedbackAnketologModal.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackAnketologModal');\n\ntype Survey = {\n link: string;\n}\n\nfunction buildSurveyLink({\n userIdQuery,\n yMetricaId\n}: {\n userIdQuery: string;\n yMetricaId: string;\n}) {\n return `https://anketolog.ru/s/640716/GWwkMkKd?${userIdQuery}${yMetricaId}`;\n}\n\nexport const CustomerFeedbackAnketologModal = ({\n modalIsOpen,\n handleCloseModal,\n disableFeedbackReappearance,\n}: {\n modalIsOpen: boolean;\n handleCloseModal: () => void;\n disableFeedbackReappearance: () => void;\n}) => {\n const { auth } = useM2AuthContext();\n const userIdQuery = auth.user?.userId ? `ap_user_id=${auth.user.userId}&` : '';\n const [ cookies ] = useCookies([ '_ym_uid' ]);\n // eslint-disable-next-line dot-notation\n const yMetricaId = cookies['_ym_uid'] ? `ap_yMetrica=${cookies['_ym_uid']}&` : '';\n\n const [ survey, setSurvey ] = useState<Survey>({\n link: buildSurveyLink({ userIdQuery, yMetricaId })\n });\n\n const handleClose = useCallback(() => {\n disableFeedbackReappearance();\n handleCloseModal();\n }, [ disableFeedbackReappearance, handleCloseModal ]);\n\n useEffect(() => {\n setSurvey(survey => ({\n ...survey,\n // https://help.anketolog.ru/p/dopolnitelnye-parametry - как передавать пользовательские данные в опрос\n link: buildSurveyLink({ userIdQuery, yMetricaId }),\n }));\n }, [ userIdQuery, yMetricaId ]);\n\n return (\n <Modal opened={modalIsOpen} size='l' onClose={handleClose} dataTest='feedback-survey'>\n <iframe className={cn('iframe')} name='survey' src={survey.link} data-scroll-lock-ignore />\n </Modal>\n );\n};\n","import React from 'react';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { CustomerFeedbackModalNewBuildings as CustomerFeedbackModalNewBuildingsDesktop } from '../../../../../desktop/components/CustomerFeedback/Modal/NewBuildings';\nimport { CustomerFeedbackModalNewBuildings as CustomerFeedbackModalNewBuildingsMobile } from '../../../../../mobile/components/CustomerFeedback/Modal/NewBuildings';\nimport { useCustomerFeedbackExternalState } from '../../useCustomerFeedbackExternalState';\n\nimport { CustomerFeedbackAnketologModal } from '../CustomerFeedbackAnketologModal/CustomerFeedbackAnketologModal';\n\nexport type CustomerFeedbackModalType = Omit<ReturnType<typeof useCustomerFeedbackExternalState>, 'openBtnIsVisible' | 'handleOpenModal' | 'handleCloseOpenBtn'> & {\n applicationId?: ApplicationIdEnum;\n}\n\nexport const CustomerFeedbackModal = ({\n modalIsOpen,\n handleCloseModal,\n disableFeedbackReappearance,\n handleFinishedFeedback,\n applicationId\n}: CustomerFeedbackModalType) => {\n switch (applicationId) {\n case ApplicationIdEnum.NewBuildingsDesktop:\n return (\n <CustomerFeedbackModalNewBuildingsDesktop\n modalIsOpen={modalIsOpen}\n handleCloseModal={handleCloseModal}\n applicationId={applicationId}\n handleFinishedFeedback={handleFinishedFeedback}\n disableFeedbackReappearance={disableFeedbackReappearance}\n />\n );\n\n case ApplicationIdEnum.NewBuildingsTouch:\n return (\n <CustomerFeedbackModalNewBuildingsMobile\n modalIsOpen={modalIsOpen}\n handleCloseModal={handleCloseModal}\n applicationId={applicationId}\n handleFinishedFeedback={handleFinishedFeedback}\n disableFeedbackReappearance={disableFeedbackReappearance}\n />\n );\n\n case ApplicationIdEnum.ClassifiedTouch:\n case ApplicationIdEnum.ClassifiedDesktop:\n default: {\n return (<CustomerFeedbackAnketologModal\n modalIsOpen={modalIsOpen}\n handleCloseModal={handleCloseModal}\n disableFeedbackReappearance={disableFeedbackReappearance}\n />);\n }\n }\n};\n","/* global window */\nimport React from 'react';\n\ntype KeyCodes = 'Escape';\ntype KeyHandlers = Record<KeyCodes, ((...args: any[]) => void) | undefined>;\n\nfunction useKeyHandler(handlers: KeyHandlers) {\n return React.useCallback((event: KeyboardEvent) => {\n const handler = handlers[event.key as KeyCodes];\n\n handler?.();\n }, Object.keys(handlers).map(key => handlers[key as unknown as KeyCodes]));\n}\n\nexport function useKeyUp(onKeyUp: (event: KeyboardEvent) => void) {\n React.useEffect(() => {\n window.addEventListener('keyup', onKeyUp);\n\n return () => {\n window.removeEventListener('keyup', onKeyUp);\n };\n }, [ onKeyUp ]);\n}\n\nexport function useKeyCancel(onCancel?: () => void) {\n const handler = useKeyHandler({ Escape: onCancel });\n\n useKeyUp(handler);\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { dataLayerPush } from '../../../../domain/google/dataLayerPush';\nimport { useKeyCancel } from '../../hooks/useKey';\n\nconst CL_LOCAL_STORAGE_KEY = 'cl_customer_feedback_interaction';\nconst NB_LOCAL_STORAGE_KEY = 'nb_customer_feedback_interaction';\n\nconst LOCAL_STORAGE_KEY_MAP: Record<ApplicationIdEnum, string> = {\n [ApplicationIdEnum.ClassifiedDesktop]: CL_LOCAL_STORAGE_KEY,\n [ApplicationIdEnum.ClassifiedTouch]: CL_LOCAL_STORAGE_KEY,\n [ApplicationIdEnum.NewBuildingsDesktop]: NB_LOCAL_STORAGE_KEY,\n [ApplicationIdEnum.NewBuildingsTouch]: NB_LOCAL_STORAGE_KEY,\n};\n\nexport const useCustomerFeedbackExternalState = ({\n applicationId,\n modalOpenEvent\n}: {\n applicationId: ApplicationIdEnum;\n modalOpenEvent?: string;\n}) => {\n const [ modalIsOpen, setModalIsOpen ] = useState(false);\n const [ openBtnIsVisible, setOpenBtnIsVisible ] = useState(false);\n\n const handleOpenModal = useCallback(() => {\n setModalIsOpen(true);\n modalOpenEvent && dataLayerPush({ event: modalOpenEvent });\n }, [ modalOpenEvent ]);\n\n const handleCloseModal = useCallback(() => {\n setModalIsOpen(false);\n setOpenBtnIsVisible(true);\n }, []);\n\n const handleFinishedFeedback = useCallback(() => {\n setModalIsOpen(false);\n setOpenBtnIsVisible(false);\n }, []);\n\n const disableFeedbackReappearance = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n const currentDate = new Date();\n\n e?.stopPropagation();\n window.localStorage.setItem(LOCAL_STORAGE_KEY_MAP[applicationId], currentDate.toString());\n }, [ applicationId ]);\n\n const handleCloseOpenBtn = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n e?.stopPropagation();\n setOpenBtnIsVisible(false);\n disableFeedbackReappearance();\n }, []);\n\n useKeyCancel(handleCloseModal);\n\n useEffect(() => {\n const lastOpening = window.localStorage.getItem(LOCAL_STORAGE_KEY_MAP[applicationId]);\n\n if (! lastOpening) {\n setOpenBtnIsVisible(true);\n return;\n }\n\n const currentDate = new Date();\n const dateToShowBtn = new Date(lastOpening);\n\n dateToShowBtn.setDate(dateToShowBtn.getDate() + 45);\n\n setOpenBtnIsVisible(currentDate > dateToShowBtn);\n }, [ applicationId ]);\n\n return {\n openBtnIsVisible,\n modalIsOpen,\n handleOpenModal,\n handleCloseModal,\n handleFinishedFeedback,\n handleCloseOpenBtn,\n disableFeedbackReappearance\n };\n};\n","import React from 'react';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { CustomerFeedbackOpenButton } from './components/OpenButton';\nimport { CustomerFeedbackModal } from './components/Modal';\nimport { useCustomerFeedbackExternalState } from './useCustomerFeedbackExternalState';\n\nexport interface ICustomerFeedback {\n applicationId: ApplicationIdEnum;\n isSticky?: boolean;\n modalOpenEvent?: string;\n}\n\nexport const CustomerFeedback = ({\n applicationId,\n isSticky = false,\n modalOpenEvent\n}: ICustomerFeedback) => {\n const {\n openBtnIsVisible,\n modalIsOpen,\n handleOpenModal,\n handleCloseModal,\n handleCloseOpenBtn,\n handleFinishedFeedback,\n disableFeedbackReappearance\n } = useCustomerFeedbackExternalState({\n applicationId,\n modalOpenEvent\n });\n\n if (! openBtnIsVisible) {\n return null;\n }\n\n return (\n <>\n <CustomerFeedbackOpenButton\n applicationId={applicationId}\n isSticky={isSticky}\n handleOpen={handleOpenModal}\n handleCloseOpenBtn={handleCloseOpenBtn}\n />\n <CustomerFeedbackModal\n applicationId={applicationId}\n modalIsOpen={modalIsOpen}\n handleCloseModal={handleCloseModal}\n disableFeedbackReappearance={disableFeedbackReappearance}\n handleFinishedFeedback={handleFinishedFeedback}\n />\n </>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Button } from '@vtblife/uikit';\n\ninterface IProps {\n onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n selectedDistricts?: Set<number>;\n}\n\nconst SPB_CENTER_DISTRICTS = [ 466, 448, 446, 476 ];\n\nexport const SPBCenterDistricts: React.FC<IProps> = ({ onChange, selectedDistricts = new Set() }) => {\n const selected = SPB_CENTER_DISTRICTS.every(id => selectedDistricts.has(id)) &&\n selectedDistricts.size === SPB_CENTER_DISTRICTS.length;\n\n const selectSPBCenterDistricts = useCallback(() => {\n onChange({\n diff: {\n selected: SPB_CENTER_DISTRICTS,\n deselected: Array.from(selectedDistricts).filter(id => ! SPB_CENTER_DISTRICTS.includes(id))\n }\n });\n }, [ onChange ]);\n\n return (\n <Button\n variant='secondary'\n size='s'\n fullWidth\n selected={selected}\n onClick={selectSPBCenterDistricts}\n >\n Центр\n </Button>\n );\n};\n","import './styles.css';\n\nimport React, { useCallback, useMemo } from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'NewMoscowDistrict');\n\ninterface IProps {\n onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n selectedDistricts?: Set<number>;\n}\n\nconst NEW_MOSCOW_DISTRICT = 141530;\nconst EXCEPT_NEW_MOSCOW_DISTRICTS = [ 381, 103, 81, 182, 218, 15, 60, 164, 37, 7 ];\n\nexport const NewMoscowDistricts: React.FC<IProps> = ({ onChange, selectedDistricts = new Set() }) => {\n const isNewMoscowSelected = useMemo(() => {\n return selectedDistricts.size === 1 && selectedDistricts.has(NEW_MOSCOW_DISTRICT);\n }, [ selectedDistricts ]);\n\n const isExceptNewMoscowSelected = useMemo(() => {\n const intersectExpectNewMoscowDistricts = new Set([ ...selectedDistricts, ...EXCEPT_NEW_MOSCOW_DISTRICTS ]);\n\n return selectedDistricts.size !== 0 &&\n intersectExpectNewMoscowDistricts.size === EXCEPT_NEW_MOSCOW_DISTRICTS.length &&\n intersectExpectNewMoscowDistricts.size === selectedDistricts.size;\n }, [ selectedDistricts ]);\n\n const selectNewMoscowDistricts = useCallback(() => {\n const deselected = [ ...selectedDistricts ].filter(value => value !== NEW_MOSCOW_DISTRICT);\n\n onChange({\n diff: {\n selected: [ NEW_MOSCOW_DISTRICT ],\n deselected\n }\n });\n }, [ onChange, selectedDistricts ]);\n\n const selectExceptNewMoscowDistricts = useCallback(() => {\n const deselected = [ ...selectedDistricts ].filter(value => ! EXCEPT_NEW_MOSCOW_DISTRICTS.includes(value));\n\n onChange({\n diff: {\n selected: EXCEPT_NEW_MOSCOW_DISTRICTS,\n deselected\n }\n });\n }, [ onChange, selectedDistricts ]);\n\n return (<>\n <div className={cn('new-moscow-button')}>\n <Button\n variant='secondary'\n size='s'\n fullWidth\n selected={isNewMoscowSelected}\n onClick={selectNewMoscowDistricts}\n >\n Новая Москва\n </Button>\n </div>\n <Button\n variant='secondary'\n size='s'\n fullWidth\n selected={isExceptNewMoscowSelected}\n onClick={selectExceptNewMoscowDistricts}\n >\n Без Новой Москвы\n </Button>\n </>);\n};\n","import React from 'react';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { SPBCenterDistricts } from './components/SPBCenterDistricts';\nimport { NewMoscowDistricts } from './components/NewMoscowDistrict';\n\ninterface IProps {\n regionId: RegionIdEnum;\n onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n selectedDistricts?: Set<number>;\n className?: string;\n}\n\nexport const DistrictControl: React.FC<IProps> = ({ regionId, onChange, className, selectedDistricts }) => {\n let districtsSelectButton;\n\n switch (regionId) {\n case RegionIdEnum.SPB:\n districtsSelectButton = (\n <SPBCenterDistricts\n onChange={onChange}\n selectedDistricts={selectedDistricts}\n />\n );\n\n break;\n case RegionIdEnum.MSK:\n districtsSelectButton = (\n <NewMoscowDistricts\n onChange={onChange}\n selectedDistricts={selectedDistricts}\n />\n );\n\n break;\n\n default: {\n districtsSelectButton = null;\n }\n }\n\n return (\n <div className={className}>\n {districtsSelectButton}\n </div>\n );\n};\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport React from 'react';\n\nimport { Modal, Size } from '@vtblife/uikit/legacy';\nimport { UseAuthClosedError, UseAuthError } from '@search/auth/src/useAuth';\n\nexport type BasicError = {\n __typename: 'AuthUserIdError';\n message?: string | null;\n} | {\n __typename: 'InternalError';\n message?: string | null;\n} | {\n __typename: '%other';\n} | {\n __typename?: string;\n};\n\nconst BasicErrorContext = React.createContext({\n setError(error?: BasicError | string | undefined | null) {}\n});\n\nexport function useBasicError() {\n return React.useContext(BasicErrorContext);\n}\n\nexport function BasicErrorProvider(props: {\n isMobile?: boolean;\n children?: React.ReactNode;\n}) {\n const [ error, setError ] = React.useState<BasicError | string | undefined | null>();\n const closeModal = React.useCallback(() => {\n setError(undefined);\n }, [ setError ]);\n\n let modal: React.ReactNode | null = null;\n\n if (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n if (! UseAuthClosedError.is(error) && ! UseAuthError.is(error)) {\n modal = (<Modal\n title='Упс...'\n isOpen\n size={Size.Small}\n closeOnOverlayClick\n onClose={closeModal}\n dataTest='any-error-modal'\n >\n Что-то пошло не так\n </Modal>);\n }\n }\n\n const value = React.useMemo(() => ({ setError }), [ setError ]);\n\n return (<BasicErrorContext.Provider value={value}>\n {modal}\n {props.children}\n </BasicErrorContext.Provider>);\n}\n\n","import React from 'react';\nimport { Modal, Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\nimport { useLkLinks } from '@search/classified-common/src/SaveSearch/useLkLinks';\nimport './styles.css';\n\ninterface IProps {\n isOpenLimitModal: boolean;\n onClose: () => void;\n isNewBuilding?: boolean;\n}\n\nconst cn = classname.bind(null, 'FavoriteLimitModal');\n\nconst FavoriteLimitModal = (props: IProps) => {\n const { favoritesUrl } = useLkLinks();\n\n return (\n <Modal\n title='Упс...'\n isOpen={props.isOpenLimitModal}\n size={Size.Small}\n closeOnOverlayClick\n onClose={props.onClose}\n dataTest='favorites-limit-modal'\n className={cn()}\n >\n <p>{\n `В вашем избранном много вариантов.\\u00A0Выберите самые лучшие из них и удалите лишние, чтобы добавить${\n props.isNewBuilding ? ' этот ЖК' : ' это объявление'\n }.`\n }</p>\n <a\n href={favoritesUrl}\n target='_blank'\n className={cn('favorites-link')}\n >\n Перейти в избранное\n </a>\n </Modal>\n );\n};\n\nexport default FavoriteLimitModal;\n","import React from 'react';\n\nimport { EditFavoriteNewBuildingsResponse } from '@search/graphql-typings';\n\nimport { FavoritesMutation$data as FavoritesMutationResponse } from './__generated__/FavoritesMutation.graphql';\nimport { BasicError, useBasicError } from './BasicError';\nimport FavoriteLimitModal from './FavoriteLimitModal';\n\nexport type FavoritesError = BasicError | FavoritesMutationResponse['editFavoritePersonal2']['firstError'];\ntype NewBuildingFavoritesError = BasicError | EditFavoriteNewBuildingsResponse['firstError'];\n\nconst FavoriteModalsContext = React.createContext({\n setError(error: FavoritesError | NewBuildingFavoritesError | undefined | null) {}\n});\n\nexport function useFavoritesModal() {\n return React.useContext(FavoriteModalsContext);\n}\n\nexport function FavoritesModalProvider({\n children,\n isMobile = false\n}: {\n isMobile?: boolean;\n children?: React.ReactNode;\n}) {\n const { setError: setParentError } = useBasicError();\n const [ error, setChildError ] = React.useState<FavoritesError | NewBuildingFavoritesError | undefined | null>();\n\n const setError = React.useCallback((err: FavoritesError | NewBuildingFavoritesError | undefined | null) => {\n if (! err) {\n setChildError(undefined);\n setParentError(undefined);\n\n return;\n }\n\n const code = typeof err === 'object' && err ?\n (err.__typename ?? err.cause?.__typename ?? err.message) :\n undefined;\n\n switch (code) {\n case 'FavoritesErrorLimitExceeded':\n case 'FavoriteNewBuildingsLimitExceededError':\n return setChildError(err);\n\n default:\n return setParentError(err);\n }\n }, [ setParentError ]);\n\n const closeModal = React.useCallback(() => {\n setError(undefined);\n }, [ setError ]);\n\n let modal: React.ReactNode | null = null;\n const code = typeof error === 'object' && error ?\n (error.__typename ?? error.cause?.__typename ?? error.message) :\n undefined;\n\n switch (code) {\n case 'FavoritesErrorLimitExceeded': {\n modal = (\n <FavoriteLimitModal\n onClose={closeModal}\n isOpenLimitModal\n />\n );\n\n break;\n }\n\n case 'FavoriteNewBuildingsLimitExceededError': {\n modal = (\n <FavoriteLimitModal\n onClose={closeModal}\n isOpenLimitModal\n isNewBuilding\n />\n );\n\n break;\n }\n\n default:\n modal = null;\n }\n\n const value = React.useMemo(() => ({ setError }), [ setError ]);\n\n return (\n <FavoriteModalsContext.Provider value={value}>\n {modal}\n {children}\n </FavoriteModalsContext.Provider>\n );\n}\n","/* global document */\nimport React from 'react';\nimport { Tooltip, Button, useTooltip } from '@vtblife/uikit';\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\n\nexport const downloadOfferPdf = (offerId: string) => {\n let form = document.getElementById('print-form') as HTMLFormElement | undefined;\n\n if (! form) {\n form = document.createElement('form');\n document.body.appendChild(form);\n form.id = 'print-form';\n form.method = 'POST';\n form.target = '_blank';\n }\n\n form.action = `/search/print/offer-${offerId}/`;\n form.submit();\n\n form.remove();\n // window.open(`/search/print/offer-${p.offerId}/`);\n};\n\nexport function SharePrintButton(p: {\n isButtonText?: boolean;\n gtmPrint?: string;\n offerId: string;\n}) {\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n const showPrintDialog = React.useCallback(() => {\n p.gtmPrint && dataLayerPush({ event: p.gtmPrint });\n\n downloadOfferPdf(p.offerId);\n }, [ p.gtmPrint, p.offerId, dataLayerPush ]);\n\n const tt = useTooltip();\n\n return (<div ref={tt.registerControl}>\n <Button\n size='s'\n fullWidth\n icon='printer'\n variant='secondary'\n dataTest='card-button-print'\n onClick={showPrintDialog}\n >{p.isButtonText ? 'Распечатать' : ''}</Button>\n <Tooltip\n direction='up'\n to={tt.to}\n >\n Распечатать\n </Tooltip>\n </div>);\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n TipAddress,\n TipDeveloper,\n TipNewBuilding,\n TipBuilding,\n TipMetroStation\n} from '@search/graphql-typings';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { graphql, useGql } from '@search/gql-client/src';\n\nimport type {\n useQueryDisplayValuesQuery$data as useQueryDisplayValuesQueryResponse,\n useQueryDisplayValuesQuery$variables as useQueryDisplayValuesQueryVariables\n} from './__generated__/useQueryDisplayValuesQuery.graphql';\n\nexport type QueryDisplayValueKey = 'developers' | 'newBuildings' | 'buildings' | 'addresses' | 'metros' | 'districts';\n// eslint-disable-next-line max-len\nexport type QueryDisplayValue = TipAddress | TipDeveloper | TipNewBuilding | TipBuilding | TipMetroStation;\nexport type QueryDisplayValues = Partial<Record<QueryDisplayValueKey, Record<number, QueryDisplayValue>>>;\nexport type AddQueryDisplayValue = (type: QueryDisplayValueKey, data: QueryDisplayValue & { kind?: string; region?: number }) => void;\n\nexport type ExtendedTip = QueryDisplayValue | {\n __typename: 'TipRouteMetro';\n id: string;\n transportType: {\n value: TransportType;\n };\n timeLimit: {\n formatted: string;\n };\n};\n\nconst query = graphql`\n query useQueryDisplayValuesQuery(\n $newBuildingIds: [Int!]\n $addressIds: [Int!]\n $geoSlugs: [String!]\n $regionId: Int\n $districtIds: [Int!]\n $metroIds: [Int!]\n ) {\n searchOffersTips(\n newBuildingIds: $newBuildingIds\n addressIds: $addressIds\n geoSlugs: $geoSlugs\n regionId: $regionId\n districtIds: $districtIds\n metroIds: $metroIds\n ) {\n newBuildings {\n id\n title\n type\n }\n addresses {\n id\n title\n translit\n type\n locative\n }\n metros {\n id\n title\n type\n }\n districts {\n id\n title\n type\n translit\n locative\n }\n }\n }\n`;\n\ninterface UseQueryDisplayValuesProps {\n newBuildingIds?: readonly number[];\n addressIds?: readonly number[];\n metroIds?: readonly number[];\n districtIds?: readonly number[];\n}\n\ninterface UseQueryDisplayValuesOptions {\n clientSide: boolean;\n suspense: true | undefined;\n}\n\nexport type UseQueryDisplayValuesReturnType = Readonly<[\n QueryDisplayValues,\n (key: QueryDisplayValueKey, value: QueryDisplayValue) => void\n]>;\n\nconst buildState = (data = {}) => {\n return Object.entries(data ?? {})\n .reduce<QueryDisplayValues>((acc, tip) => {\n const [ key, value ] = tip as [ QueryDisplayValueKey, QueryDisplayValue[] ];\n\n if (value) {\n acc[key] = value.reduce<Record<number, QueryDisplayValue>>((ret, item) => {\n if (item) {\n ret[item.id] = item;\n }\n\n return ret;\n }, {});\n }\n\n return acc;\n }, {} as QueryDisplayValues);\n};\n\nconst defaultOptions = { suspense: undefined, clientSide: false };\n\nexport const useQueryDisplayValues = (\n params: UseQueryDisplayValuesProps = {},\n opts: UseQueryDisplayValuesOptions = defaultOptions\n): UseQueryDisplayValuesReturnType => {\n const queryParams = useMemo(() => params, [ JSON.stringify(params) ]);\n\n const { data } = useGql<\n useQueryDisplayValuesQueryVariables,\n useQueryDisplayValuesQueryResponse\n >(query, queryParams, { suspense: opts.suspense });\n\n const initialState = useMemo(() => buildState(data?.searchOffersTips ?? undefined), [ data?.searchOffersTips ]);\n\n const [\n queryDisplayValues,\n setQueryDisplayValues\n ] = useState<QueryDisplayValues>(initialState);\n\n useEffect(() => {\n if (opts.clientSide) {\n setQueryDisplayValues(buildState(Object.assign({}, data?.searchOffersTips)));\n }\n }, [ data?.searchOffersTips, setQueryDisplayValues, opts.clientSide ]);\n\n const addDisplayValue = useCallback((key: QueryDisplayValueKey, value: QueryDisplayValue) => setQueryDisplayValues(\n prev => {\n const prevValues = prev[key];\n const { id } = value;\n\n if (prevValues && prevValues[id]) {\n return prev;\n }\n\n const next = { ...prev };\n\n if (! prevValues) {\n next[key] = {};\n }\n\n next[key]![id] = value;\n\n return next;\n }\n ), []);\n\n return [\n queryDisplayValues,\n addDisplayValue\n ] as const;\n};\n","import { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RegionIdEnum, regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport { HouseCategory } from '@search/filter-enums/enums';\nimport { MortgagePurpose } from '@search/graphql-typings';\nimport {\n CategoryTypeFilter,\n DealTypeFilter,\n Filters,\n HouseCategoryFilter,\n MapBoundsFilter,\n NewBuildingFilter,\n PriceFilter,\n RegionFilter,\n SellerOrganizationNameFilter\n} from '../../../view/filters/models/Filter';\n\n/**\n * ClassifiedFilterCollection business logic for filters in classified\n *\n * Contains methods for:\n * 1. retrieve typed filters like - getDealTypeFilter\n * 2. get current data about filter state - isRoomFilterActive\n * 3. ui info about view control state - isRoomFilterShown\n *\n * Before add new method check that there's no already defined method\n */\nexport class ClassifiedFilterCollection extends FilterCollection {\n rebuild() {\n return new ClassifiedFilterCollection(this._filters);\n }\n\n getDealTypeFilter(): DealTypeFilter {\n return this.get(Filters.dealType);\n }\n\n getCategoryTypeFilter(): CategoryTypeFilter {\n return this.get(Filters.categoryType);\n }\n\n getPriceFilter(): PriceFilter {\n return this.get(Filters.price);\n }\n\n getRegionFilter(): RegionFilter {\n return this.get(Filters.region);\n }\n\n getNewBuildingFilter(): NewBuildingFilter {\n return this.get(Filters.newBuilding);\n }\n\n getMapBoundsFilter(): MapBoundsFilter {\n return this.get(Filters.mapBounds);\n }\n\n getMortgagePurpose(): MortgagePurpose {\n if (this.isActiveFilterHouseAllowedMortgage()) {\n return MortgagePurpose.Secondary;\n } else if (this.isNewBuilding()) {\n return MortgagePurpose.Primary;\n }\n return MortgagePurpose.Secondary;\n }\n\n getSellerOrganizationName(): SellerOrganizationNameFilter {\n return this.get(Filters.sellerOrganizationName);\n }\n\n isActiveFilterHouseAllowedMortgage(): boolean {\n return (this.get(Filters.houseCategory) as HouseCategoryFilter)?.categories\n .every(category => category !== HouseCategory.DUPLEX && category !== HouseCategory.PART_OF_HOUSE) ?? false;\n }\n\n isNewBuilding() {\n return this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) ?? false;\n }\n\n isOnlySecond() {\n return (this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.SECOND) &&\n this.getNewBuildingFilter()?.newBuilding.length === 1) ?? false;\n }\n\n isOnlyNewBuildings() {\n return (this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) &&\n this.getNewBuildingFilter()?.newBuilding.length === 1) ?? false;\n }\n\n isFlatFilterActive(): boolean {\n return this.getCategoryTypeFilter().categoryType === RealtyObjectType.FLAT;\n }\n\n isLandFilterActive(): boolean {\n return this.getCategoryTypeFilter().categoryType === RealtyObjectType.LAND;\n }\n\n isHouseFilterActive(): boolean {\n return this.getCategoryTypeFilter().categoryType === RealtyObjectType.HOUSE;\n }\n\n isRoomFilterActive(): boolean {\n return this.getCategoryTypeFilter().categoryType === RealtyObjectType.ROOM;\n }\n\n isRentFilterActive(): boolean {\n return this.getDealTypeFilter().dealType === DealType.RENT;\n }\n\n isSellFilterActive(): boolean {\n return this.getDealTypeFilter().dealType === DealType.SELL;\n }\n\n isPricePerAllSquare() {\n return this.getPriceFilter().priceType === AreaUnit.UNKNOWN;\n }\n\n isPricePerMeterSquare() {\n return this.getPriceFilter().priceType === AreaUnit.METER;\n }\n\n isMortgagePayment() {\n return this.isSellFilterActive() && this.getPriceFilter().priceType === AreaUnit.MORTGAGE_PAYMENT;\n }\n\n isRegionMsk(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.MSK;\n }\n\n isRegionMskMo(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL;\n }\n\n isRegionMo(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.MSK_OBL;\n }\n\n isRegionMskOrMo(): boolean {\n return this.isRegionMo() || this.isRegionMsk() || this.isRegionMskMo();\n }\n\n isRegionSpb(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.SPB;\n }\n\n isRegionSpbLO(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.SPB_AND_LEN_OBL;\n }\n\n isRegionLo(): boolean {\n return this.getRegionFilter().region === RegionIdEnum.LEN_OBL;\n }\n\n isRegionSpbOrLo(): boolean {\n return this.isRegionLo() || this.isRegionSpb() || this.isRegionSpbLO();\n }\n\n isNewBuildingShown(): boolean {\n return this.isSellFilterActive() && this.isFlatFilterActive();\n }\n\n isBankPledgeOptionActive(): boolean {\n return this.isSellFilterActive() && this.isFlatFilterActive();\n }\n\n isSellFlatFilterActive(): boolean {\n return this.isSellFilterActive() && this.isFlatFilterActive();\n }\n\n isFlatOrRoomFilterActive(): boolean {\n return this.isFlatFilterActive() || this.isRoomFilterActive();\n }\n\n isFloorTotalFilterShownNotHouse(): boolean {\n return (! this.isLandFilterActive()) && (! this.isHouseFilterActive());\n }\n\n isLandOrHouseFilterActive(): boolean {\n return this.isLandFilterActive() || this.isHouseFilterActive();\n }\n\n isSellRoomFilterActive(): boolean {\n return this.isSellFilterActive() && this.isRoomFilterActive();\n }\n\n isSellFlatOrRoomFilterActive(): boolean {\n return this.isSellFilterActive() && this.isFlatOrRoomFilterActive();\n }\n\n isWindowsDirectionFilterShownInRent(): boolean {\n return this.isFlatOrRoomFilterActive() && this.isRentFilterActive();\n }\n\n isRentFlatOrRoomFilterActive(): boolean {\n return this.isRentFilterActive() && this.isFlatOrRoomFilterActive();\n }\n\n hasMetroInRegion() {\n return regionsWithMetroEnumeration.has(this.getRegionFilter().region);\n }\n\n isRenovationProgramFilterActive(): boolean {\n return (this.getRegionFilter().region === RegionIdEnum.MSK ||\n this.getRegionFilter().region === RegionIdEnum.MSK_OBL ||\n this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL) &&\n this.isSellFilterActive() && this.isFlatOrRoomFilterActive() &&\n ! ((this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) &&\n this.getNewBuildingFilter()?.newBuilding.length === 1));\n }\n\n isNearbySchoolFilterActive(): boolean {\n return (this.getRegionFilter().region === RegionIdEnum.MSK ||\n this.getRegionFilter().region === RegionIdEnum.MSK_OBL ||\n this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL) &&\n this.isFlatOrRoomFilterActive();\n }\n\n isOnlineViewFilterActive(): boolean {\n return this.isFlatOrRoomFilterActive() || this.isHouseFilterActive() || this.isLandFilterActive();\n }\n}\n","import { FilterCollectionMetadata } from '../types/FilterCollectionMetadata';\nimport {\n ApartmentFilter,\n AreaFilter,\n AuthorFilter,\n BalconyFilter,\n BankPledgeOptionsFilter,\n BathroomFilter,\n CategoryTypeFilter,\n CellHeightFilter,\n DealTypeFilter,\n Filters,\n FloorFilter,\n FloorsTotalFilter,\n FurnitureFilter,\n GeoFilter,\n HeatingFilter,\n HouseAreaFilter,\n HouseCategoryFilter,\n IFilter,\n InfrastructureFilter,\n KitchenAreaFilter,\n LandAreaFilter,\n LandStatusFilter,\n LayoutImageOptionsFilter,\n LivingAreaFilter,\n LivingFacilityFilter,\n LivingTenantOptionFilter,\n MapBoundsFilter,\n NearbySchoolFilter,\n NewBuildingDataFilter,\n NewBuildingFilter,\n ParkingFilter,\n PhotoOptionsFilter,\n PriceFilter,\n RegionFilter,\n RenovationFilter,\n RenovationProgramFilter,\n RentConditionsFilter,\n RentPrepaymentFilter,\n RoomFilter,\n RoomsInOfferFilter,\n SellerOrganizationNameFilter,\n SellTypeFilter,\n SeoMortgageAllowedFilter,\n SupplyOptionsFilter,\n TransportLimitFilter,\n WallsTypeFilter,\n WindowsDirectionFilter,\n YearBuildingFilter,\n BuildEpochFilter,\n OnlineViewFilter,\n MortgagePaymentFilter,\n FinishingFilter,\n ClCommisioninFilter,\n CommissioningFilter\n} from '../../../../view/filters/models/Filter';\n\ntype FilterCreator = () => IFilter;\n\nexport const filterCreator: Record<Filters, FilterCreator> = {\n [Filters.dealType]: () => new DealTypeFilter(),\n [Filters.categoryType]: () => new CategoryTypeFilter(),\n [Filters.rooms]: () => new RoomFilter(),\n [Filters.livingArea]: () => new LivingAreaFilter(),\n [Filters.price]: () => new PriceFilter(),\n [Filters.mortgagePayment]: () => new MortgagePaymentFilter(),\n [Filters.totalArea]: () => new AreaFilter(),\n [Filters.kitchenArea]: () => new KitchenAreaFilter(),\n [Filters.builtYear]: () => new YearBuildingFilter(),\n [Filters.floor]: () => new FloorFilter(),\n [Filters.cellHeight]: () => new CellHeightFilter(),\n [Filters.renovation]: () => new RenovationFilter(),\n [Filters.bathroom]: () => new BathroomFilter(),\n [Filters.region]: () => new RegionFilter(),\n [Filters.transportLimit]: () => new TransportLimitFilter(),\n [Filters.newBuilding]: () => new NewBuildingFilter(),\n [Filters.geo]: () => new GeoFilter(),\n [Filters.newBuildingData]: () => new NewBuildingDataFilter(),\n [Filters.walls]: () => new WallsTypeFilter(),\n [Filters.parkings]: () => new ParkingFilter(),\n [Filters.author]: () => new AuthorFilter(),\n [Filters.sellType]: () => new SellTypeFilter(),\n [Filters.infrastructure]: () => new InfrastructureFilter(),\n [Filters.balcony]: () => new BalconyFilter(),\n [Filters.photoOptions]: () => new PhotoOptionsFilter(),\n [Filters.layoutImageOptions]: () => new LayoutImageOptionsFilter(),\n [Filters.apartments]: () => new ApartmentFilter(),\n [Filters.livingFacility]: () => new LivingFacilityFilter(),\n [Filters.furniture]: () => new FurnitureFilter(),\n [Filters.livingTenantOptions]: () => new LivingTenantOptionFilter(),\n [Filters.rentPrepayment]: () => new RentPrepaymentFilter(),\n [Filters.rentConditions]: () => new RentConditionsFilter(),\n [Filters.roomsInOffer]: () => new RoomsInOfferFilter(),\n [Filters.floorsTotal]: () => new FloorsTotalFilter(),\n [Filters.landStatus]: () => new LandStatusFilter(),\n [Filters.landArea]: () => new LandAreaFilter(),\n [Filters.supplyOptions]: () => new SupplyOptionsFilter(),\n [Filters.houseCategory]: () => new HouseCategoryFilter(),\n [Filters.houseArea]: () => new HouseAreaFilter(),\n [Filters.bathroomLocation]: () => new BathroomFilter(),\n [Filters.heating]: () => new HeatingFilter(),\n [Filters.mapBounds]: () => new MapBoundsFilter(),\n [Filters.bankPledgeOptions]: () => new BankPledgeOptionsFilter(),\n [Filters.seoMortgageAllowed]: () => new SeoMortgageAllowedFilter(),\n [Filters.windowsDirection]: () => new WindowsDirectionFilter(),\n [Filters.nearbyOptions]: () => new NearbySchoolFilter(),\n [Filters.renovationProgram]: () => new RenovationProgramFilter(),\n [Filters.sellerOrganizationName]: () => new SellerOrganizationNameFilter(),\n [Filters.buildEpoch]: () => new BuildEpochFilter(),\n [Filters.onlineView]: () => new OnlineViewFilter(),\n [Filters.finishingType]: () => new FinishingFilter(),\n [Filters.commissioning]: () => new CommissioningFilter()\n};\n\nexport const supportedClassifiedFilters = [\n Filters.dealType,\n Filters.categoryType,\n Filters.rooms,\n Filters.livingArea,\n Filters.price,\n Filters.mortgagePayment,\n Filters.totalArea,\n Filters.kitchenArea,\n Filters.builtYear,\n Filters.floor,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.region,\n Filters.transportLimit,\n Filters.newBuilding,\n Filters.geo,\n Filters.newBuildingData,\n Filters.walls,\n Filters.parkings,\n Filters.author,\n Filters.sellType,\n Filters.infrastructure,\n Filters.balcony,\n Filters.photoOptions,\n Filters.layoutImageOptions,\n Filters.apartments,\n Filters.livingFacility,\n Filters.furniture,\n Filters.livingTenantOptions,\n Filters.rentPrepayment,\n Filters.rentConditions,\n Filters.roomsInOffer,\n Filters.landArea,\n Filters.landStatus,\n Filters.supplyOptions,\n Filters.houseCategory,\n Filters.houseArea,\n Filters.bathroomLocation,\n Filters.heating,\n Filters.floorsTotal,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.seoMortgageAllowed,\n Filters.windowsDirection,\n Filters.nearbyOptions,\n Filters.renovationProgram,\n Filters.sellerOrganizationName,\n Filters.buildEpoch,\n Filters.onlineView,\n Filters.finishingType,\n Filters.commissioning\n];\n\nexport const sellFlatMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.rooms,\n Filters.livingArea,\n Filters.price,\n Filters.mortgagePayment,\n Filters.totalArea,\n Filters.kitchenArea,\n Filters.builtYear,\n Filters.floor,\n Filters.floorsTotal,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.region,\n Filters.transportLimit,\n Filters.newBuilding,\n Filters.geo,\n Filters.newBuildingData,\n Filters.walls,\n Filters.parkings,\n Filters.author,\n Filters.sellType,\n Filters.infrastructure,\n Filters.balcony,\n Filters.photoOptions,\n Filters.layoutImageOptions,\n Filters.apartments,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.seoMortgageAllowed,\n Filters.windowsDirection,\n Filters.nearbyOptions,\n Filters.renovationProgram,\n Filters.sellerOrganizationName,\n Filters.buildEpoch,\n Filters.onlineView,\n Filters.furniture,\n Filters.finishingType,\n Filters.commissioning\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const rentFlatMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.rooms,\n Filters.livingArea,\n Filters.price,\n Filters.totalArea,\n Filters.kitchenArea,\n Filters.builtYear,\n Filters.floor,\n Filters.floorsTotal,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.newBuildingData,\n Filters.livingFacility,\n Filters.furniture,\n Filters.livingTenantOptions,\n Filters.rentPrepayment,\n Filters.rentConditions,\n Filters.walls,\n Filters.parkings,\n Filters.author,\n Filters.sellType,\n Filters.infrastructure,\n Filters.balcony,\n Filters.photoOptions,\n Filters.layoutImageOptions,\n Filters.apartments,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.windowsDirection,\n Filters.nearbyOptions,\n Filters.sellerOrganizationName,\n Filters.onlineView,\n Filters.buildEpoch\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const sellLandMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.landStatus,\n Filters.price,\n Filters.mortgagePayment,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.author,\n Filters.sellType,\n Filters.photoOptions,\n Filters.landArea,\n Filters.supplyOptions,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.sellerOrganizationName,\n Filters.onlineView\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const sellHouseMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.price,\n Filters.mortgagePayment,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.floorsTotal,\n Filters.author,\n Filters.sellType,\n Filters.photoOptions,\n Filters.houseCategory,\n Filters.houseArea,\n Filters.landArea,\n Filters.floorsTotal,\n Filters.builtYear,\n Filters.rooms,\n Filters.bathroomLocation,\n Filters.supplyOptions,\n Filters.landStatus,\n Filters.heating,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.sellerOrganizationName,\n Filters.onlineView,\n Filters.furniture\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const sellRoomMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.rooms,\n Filters.livingArea,\n Filters.price,\n Filters.mortgagePayment,\n Filters.totalArea,\n Filters.kitchenArea,\n Filters.builtYear,\n Filters.floor,\n Filters.floorsTotal,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.newBuildingData,\n Filters.walls,\n Filters.parkings,\n Filters.author,\n Filters.sellType,\n Filters.infrastructure,\n Filters.balcony,\n Filters.photoOptions,\n Filters.layoutImageOptions,\n Filters.apartments,\n Filters.roomsInOffer,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.windowsDirection,\n Filters.nearbyOptions,\n Filters.renovationProgram,\n Filters.sellerOrganizationName,\n Filters.buildEpoch,\n Filters.onlineView\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const rentRoomMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.rooms,\n Filters.livingArea,\n Filters.price,\n Filters.totalArea,\n Filters.kitchenArea,\n Filters.builtYear,\n Filters.floor,\n Filters.floorsTotal,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.newBuildingData,\n Filters.livingFacility,\n Filters.furniture,\n Filters.livingTenantOptions,\n Filters.rentPrepayment,\n Filters.rentConditions,\n Filters.walls,\n Filters.parkings,\n Filters.author,\n Filters.sellType,\n Filters.infrastructure,\n Filters.balcony,\n Filters.photoOptions,\n // FIXME does we need apartments?\n Filters.apartments,\n Filters.roomsInOffer,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.windowsDirection,\n Filters.nearbyOptions,\n Filters.sellerOrganizationName,\n Filters.onlineView,\n Filters.buildEpoch\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n\nexport const rentHouseMetadata: FilterCollectionMetadata = {\n filterIds: [\n Filters.dealType,\n Filters.categoryType,\n Filters.price,\n Filters.region,\n Filters.transportLimit,\n Filters.geo,\n Filters.livingFacility,\n Filters.furniture,\n Filters.livingTenantOptions,\n Filters.rentPrepayment,\n Filters.rentConditions,\n Filters.author,\n Filters.photoOptions,\n Filters.houseCategory,\n Filters.houseArea,\n Filters.landArea,\n Filters.floorsTotal,\n Filters.floorsTotal,\n Filters.builtYear,\n Filters.rooms,\n Filters.bathroomLocation,\n Filters.supplyOptions,\n Filters.landStatus,\n Filters.heating,\n Filters.mapBounds,\n Filters.bankPledgeOptions,\n Filters.sellerOrganizationName,\n Filters.onlineView,\n Filters.furniture\n ],\n persistIds: new Set([\n Filters.dealType,\n Filters.categoryType,\n Filters.region,\n Filters.mapBounds\n ])\n};\n","/* eslint-disable complexity */\nimport {\n DealType,\n RealtyObjectType\n} from '@search/filter-enums/enums';\nimport {\n IFilter,\n Filters,\n DealTypeFilter,\n CategoryTypeFilter\n} from '../../../view/filters/models/Filter';\nimport { ClassifiedFilterCollection } from './ClassifiedFilterCollection';\nimport { filterCreator, sellFlatMetadata, sellRoomMetadata, rentFlatMetadata, rentRoomMetadata, sellLandMetadata, sellHouseMetadata, rentHouseMetadata } from './metadata/ClassifiedFilterMetadata';\nimport { FilterCollectionMetadata } from './types/FilterCollectionMetadata';\n\n/**\n * ClassifiedFilterFactory\n * Contains methods for create and update ClassifiedFilterCollection.\n * Do not instance ClassifiedFilterCollection directly\n */\nclass ClassifiedFilterFactory {\n createOrUpdateFilters(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n filter?: IFilter\n ): ClassifiedFilterCollection {\n const { filterIds, persistIds } = this.getRelevantFilterMetadata(filters, filter);\n const isChangeSegment = (filter) ? filter.id === Filters.dealType || filter.id === Filters.categoryType : false;\n\n const filterList = filterIds.map(id => {\n let newFilter: IFilter;\n\n if (isChangeSegment) {\n if (filter && filter.id === id) {\n newFilter = filter;\n } else {\n const gettingFilter = filters.get(id);\n\n newFilter = persistIds.has(id) && gettingFilter ?\n gettingFilter :\n filterCreator[id]();\n }\n } else {\n newFilter = filters.get(id) || filterCreator[id]();\n }\n\n return [ id, newFilter ] as const;\n });\n\n const filterMap = new Map<Filters, IFilter>(filterList);\n\n if (isChangeSegment) {\n const dealTypeFilter = filterMap.get(Filters.dealType) as DealTypeFilter;\n const realtyTypeFilter = filterMap.get(Filters.categoryType) as CategoryTypeFilter;\n\n if (\n realtyTypeFilter?.categoryType === RealtyObjectType.LAND &&\n dealTypeFilter?.dealType === DealType.RENT\n ) {\n filterMap.set(Filters.categoryType, new CategoryTypeFilter(RealtyObjectType.FLAT));\n filterMap.set(Filters.dealType, new DealTypeFilter(DealType.RENT));\n }\n }\n\n return this.create(filterMap);\n }\n\n create(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>()\n ): ClassifiedFilterCollection {\n return new ClassifiedFilterCollection(filters);\n }\n\n getRelevantFilterMetadata(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n filter?: IFilter\n ): FilterCollectionMetadata {\n const realtyType = ((filter && filter.id === Filters.categoryType) ?\n filter :\n filters.get(Filters.categoryType)) as CategoryTypeFilter;\n\n const dealTypeFilter = ((filter && filter.id === Filters.dealType) ?\n filter :\n filters.get(Filters.dealType)) as DealTypeFilter;\n\n if (\n realtyType?.categoryType === RealtyObjectType.LAND &&\n dealTypeFilter?.dealType === DealType.RENT\n ) {\n return rentFlatMetadata;\n }\n\n if (dealTypeFilter?.dealType === DealType.SELL) {\n if (realtyType?.categoryType === RealtyObjectType.FLAT) {\n return sellFlatMetadata;\n } else if (realtyType?.categoryType === RealtyObjectType.ROOM) {\n return sellRoomMetadata;\n } else if (realtyType?.categoryType === RealtyObjectType.LAND) {\n return sellLandMetadata;\n } else if (realtyType?.categoryType === RealtyObjectType.HOUSE) {\n return sellHouseMetadata;\n }\n\n return sellFlatMetadata;\n } else if (dealTypeFilter?.dealType === DealType.RENT) {\n if (realtyType?.categoryType === RealtyObjectType.FLAT) {\n return rentFlatMetadata;\n } else if (realtyType?.categoryType === RealtyObjectType.ROOM) {\n return rentRoomMetadata;\n } else if (realtyType?.categoryType === RealtyObjectType.HOUSE) {\n return rentHouseMetadata;\n }\n\n return rentFlatMetadata;\n }\n\n return sellFlatMetadata;\n }\n\n getAdditionalFilterIds(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n exceptIds: Filters[] = []\n ): Filters[] {\n const additionalFilterIds = [ ...filters.keys() ].filter(id => {\n const categoryFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n const isFlat = categoryFilter.categoryType === RealtyObjectType.FLAT;\n\n return (\n Filters.dealType !== id &&\n Filters.categoryType !== id &&\n Filters.newBuilding !== id &&\n ! (isFlat && Filters.rooms === id) &&\n Filters.price !== id &&\n Filters.region !== id &&\n ! exceptIds.includes(id)\n );\n });\n\n return additionalFilterIds;\n }\n\n clearAdditionalFilters(\n filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n exceptIds: Filters[] = []\n ): Map<Filters, IFilter> {\n const additionalFilterIds = this.getAdditionalFilterIds(filters, exceptIds);\n\n additionalFilterIds.forEach(id => {\n filters.set(id, filters.get(id)!.create());\n });\n\n return filters;\n }\n}\n\nexport const classifiedFilterFactory = new ClassifiedFilterFactory();\n","import { arrayStrToNum } from '@search/router/src';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { FinishingTypeEnum, WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\nimport {\n AreaUnit,\n BalconyOptions,\n BankPledgeOptions,\n Bathroom,\n BathroomLocationOptions,\n CeilingHeight,\n CommissionType,\n DealType,\n DepositType,\n ElectricityOptions,\n FloorConstraints,\n FurnitureOption,\n GasOptions,\n HeatingOptions,\n HouseCategory,\n InfrastructureOptions,\n IsApartmentsOptions,\n LandStatus,\n LayoutImageOptions,\n LiftOptions,\n LivingFacilitiesOption,\n LivingTenantOption,\n NearbyOptions,\n ParkingType,\n PhotoOptions,\n PrepaymentType,\n RealtyObjectType, RenovationProgram,\n SewerageOptions,\n TimeLimit,\n TransportType,\n WallsType,\n WaterOptions,\n OnlineView,\n BuildEpoch,\n FinishingTypeOption,\n Commissioning,\n Quarter\n} from '@search/filter-enums/enums';\nimport {\n ApartmentFilter,\n AreaFilter,\n AuthorFilter,\n BalconyFilter,\n BankPledgeOptionsFilter,\n BathroomFilter,\n BathroomLocationFilter,\n CategoryTypeFilter,\n CellHeightFilter,\n DealTypeFilter,\n Filters,\n FloorFilter,\n FloorsTotalFilter,\n FurnitureFilter,\n GeoFilter,\n HeatingFilter,\n HouseAreaFilter,\n HouseCategoryFilter,\n IFilter,\n InfrastructureFilter,\n KitchenAreaFilter,\n LandAreaFilter,\n LandStatusFilter,\n LayoutImageOptionsFilter,\n LivingAreaFilter,\n LivingFacilityFilter,\n LivingTenantOptionFilter,\n MapBoundsFilter,\n NearbySchoolFilter,\n NewBuildingDataFilter,\n NewBuildingFilter,\n ParkingFilter,\n PhotoOptionsFilter,\n PriceFilter,\n MortgagePaymentFilter,\n RegionFilter,\n RenovationFilter, RenovationProgramFilter,\n RentConditionsFilter,\n RentPrepaymentFilter,\n RoomFilter,\n RoomsInOfferFilter,\n SellTypeFilter,\n SeoMortgageAllowedFilter,\n SupplyOptionsFilter,\n TransportLimitFilter,\n WallsTypeFilter,\n WindowsDirectionFilter,\n YearBuildingFilter,\n SellerOrganizationNameFilter,\n BuildEpochFilter,\n OnlineViewFilter,\n FinishingFilter,\n ClCommisioninFilter,\n CommissioningFilter\n} from '../../models/Filter';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nexport interface IDeserializer {\n keys: string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handler: (...args: any) => IFilter;\n}\n\nexport const filterDeserializers: Record<Filters, IDeserializer> = {\n [Filters.heating]: {\n keys: [ 'heating' ],\n handler: ({ heating }) => {\n if (heating) {\n return new HeatingFilter(\n heating.map((item: string) => HeatingOptions[item])\n );\n }\n\n return new HeatingFilter();\n }\n },\n [Filters.bathroomLocation]: {\n keys: [ 'bathroomLocation' ],\n handler: ({ bathroomLocation }) => {\n if (bathroomLocation) {\n return new BathroomLocationFilter(\n bathroomLocation.map((item: string) => BathroomLocationOptions[item])\n );\n }\n\n return new BathroomLocationFilter();\n }\n },\n [Filters.houseArea]: {\n keys: [ 'houseAreaMin', 'houseAreaMax' ],\n handler: ({ houseAreaMin, houseAreaMax }) => {\n return new HouseAreaFilter({\n from: houseAreaMin || null,\n to: houseAreaMax || null\n });\n }\n },\n [Filters.houseCategory]: {\n keys: [ 'houseCategory' ],\n handler: ({ houseCategory }) => {\n if (houseCategory) {\n return new HouseCategoryFilter(\n houseCategory.map((item: string) => HouseCategory[item])\n );\n }\n\n return new HouseCategoryFilter();\n }\n },\n [Filters.landStatus]: {\n keys: [ 'landStatus' ],\n handler: ({ landStatus }) => {\n if (landStatus) {\n return new LandStatusFilter(\n landStatus.map((item: string) => LandStatus[item])\n );\n }\n return new LandStatusFilter();\n }\n },\n [Filters.landArea]: {\n keys: [ 'landAreaMin', 'landAreaMax' ],\n handler: ({ landAreaMin, landAreaMax }) => {\n return new LandAreaFilter({\n from: landAreaMin || null,\n to: landAreaMax || null\n });\n }\n\n },\n [Filters.dealType]: {\n keys: [ 'dealType' ],\n handler: ({ dealType }) => {\n return new DealTypeFilter(dealType || DealType.SELL);\n }\n },\n [Filters.categoryType]: {\n keys: [ 'categoryType' ],\n handler: ({ categoryType }) => {\n return new CategoryTypeFilter(categoryType || RealtyObjectType.FLAT);\n }\n },\n [Filters.newBuilding]: {\n keys: [ 'newBuilding' ],\n handler: ({ newBuilding }) => {\n if (! newBuilding) {\n return new NewBuildingFilter();\n }\n\n return new NewBuildingFilter(Array.isArray(newBuilding) ? newBuilding : [ newBuilding ]);\n }\n },\n [Filters.totalArea]: {\n keys: [ 'totalAreaMin', 'totalAreaMax' ],\n handler: ({ totalAreaMin, totalAreaMax }) => {\n return new AreaFilter({\n from: totalAreaMin || null,\n to: totalAreaMax || null\n });\n }\n },\n [Filters.rooms]: {\n keys: [ 'rooms' ],\n handler: ({ rooms }) => {\n if (! rooms) {\n return new RoomFilter();\n }\n return new RoomFilter(Array.isArray(rooms) ? rooms : [ rooms ]);\n }\n },\n [Filters.roomsInOffer]: {\n keys: [ 'roomsInOffer' ],\n handler: ({ roomsInOffer }) => {\n if (! roomsInOffer) {\n return new RoomsInOfferFilter();\n }\n\n return new RoomsInOfferFilter(Array.isArray(roomsInOffer) ? roomsInOffer : [ roomsInOffer ]);\n }\n },\n [Filters.region]: {\n keys: [ 'region' ],\n handler: ({ region }) => {\n return new RegionFilter(region || RegionIdEnum.MSK);\n }\n },\n [Filters.price]: {\n keys: [ 'priceMin', 'priceMax', 'priceUnit' ],\n handler: ({ priceMin, priceMax, priceUnit }) => {\n let priceType: AreaUnit;\n\n if (priceUnit === 'ALL') priceType = AreaUnit.UNKNOWN;\n else priceType = AreaUnit[priceUnit];\n\n return new PriceFilter(priceType, {\n from: priceMin || null,\n to: priceMax || null\n });\n }\n },\n [Filters.mortgagePayment]: {\n keys: [ 'mortgagePayment' ],\n handler: ({ mortgagePayment }) => new MortgagePaymentFilter(mortgagePayment)\n },\n [Filters.sellerOrganizationName]: {\n keys: [ 'sellerOrganizationName' ],\n handler: ({ sellerOrganizationName }) => {\n return new SellerOrganizationNameFilter(sellerOrganizationName);\n }\n },\n [Filters.livingArea]: {\n keys: [ 'livingAreaMin', 'livingAreaMax' ],\n handler: ({ livingAreaMin, livingAreaMax }) => {\n return new LivingAreaFilter({\n from: livingAreaMin || null,\n to: livingAreaMax || null\n });\n }\n },\n [Filters.kitchenArea]: {\n keys: [ 'kitchenAreaMin', 'kitchenAreaMax' ],\n handler: ({ kitchenAreaMin, kitchenAreaMax }) => {\n return new KitchenAreaFilter({\n from: kitchenAreaMin || null,\n to: kitchenAreaMax || null\n });\n }\n },\n [Filters.builtYear]: {\n keys: [ 'builtYearMin', 'builtYearMax' ],\n handler: ({ builtYearMin, builtYearMax }) => {\n return new YearBuildingFilter({\n from: builtYearMin || null,\n to: builtYearMax || null\n });\n }\n },\n [Filters.floorsTotal]: {\n keys: [ 'floorsTotalMin', 'floorsTotalMax' ],\n handler: ({ floorsTotalMin, floorsTotalMax }) => {\n return new FloorsTotalFilter({\n from: floorsTotalMin || null,\n to: floorsTotalMax || null\n });\n }\n },\n [Filters.supplyOptions]: {\n keys: [\n 'gas',\n 'water',\n 'electricity',\n 'sewerage'\n ],\n handler: ({\n gas,\n water,\n electricity,\n sewerage\n }) => {\n return new SupplyOptionsFilter(\n gas?.map(item => GasOptions[item]),\n water?.map(item => WaterOptions[item]),\n electricity?.map(item => ElectricityOptions[item]),\n sewerage?.map(item => SewerageOptions[item])\n );\n }\n },\n [Filters.floor]: {\n keys: [ 'floorMin', 'floorMax', 'last', 'first' ],\n handler: ({ floorMin, floorMax, last, first }) => {\n const lastValue = last === 'ONLY' ?\n FloorConstraints.ONLY : last === 'EXCLUDE' ? FloorConstraints.EXCLUDE : undefined;\n const firstValue = first === 'ONLY' ?\n FloorConstraints.ONLY : first === 'EXCLUDE' ? FloorConstraints.EXCLUDE : undefined;\n\n return new FloorFilter(\n {\n from: floorMin || null,\n to: floorMax || null\n },\n firstValue,\n lastValue\n );\n }\n },\n [Filters.cellHeight]: {\n keys: [ 'cellHeight' ],\n handler: ({ cellHeight }) => {\n return new CellHeightFilter(CeilingHeight[cellHeight] as unknown as CeilingHeight);\n }\n },\n [Filters.renovation]: {\n keys: [ 'renovation' ],\n handler: ({ renovation }) => {\n if (! renovation) {\n return new RenovationFilter();\n }\n return new RenovationFilter(renovation);\n }\n },\n [Filters.bathroom]: {\n keys: [ 'bathroom' ],\n handler: ({ bathroom }) => {\n if (! bathroom) {\n return new BathroomFilter();\n }\n\n if (typeof bathroom === 'string') {\n bathroom = [ bathroom ];\n }\n\n const result = bathroom.map((value: string) => {\n switch (value) {\n case 'COMBINED':\n return Bathroom.COMBINED;\n case 'PARTED':\n return Bathroom.PARTED;\n case 'SEVERAL':\n return Bathroom.SEVERAL;\n default:\n return null;\n }\n });\n\n return new BathroomFilter(result);\n }\n },\n [Filters.transportLimit]: {\n keys: [ 'transport', 'transportTimeLimit' ],\n handler: ({ transport, transportTimeLimit }) => {\n return new TransportLimitFilter(\n TimeLimit[transportTimeLimit],\n TransportType[transport]\n );\n }\n },\n [Filters.geo]: {\n keys: [ 'metroIds', 'districtIds', 'addresses', 'newBuildingIds' ],\n handler: ({ metroIds, districtIds, addresses, newBuildingIds }) => {\n const parsedMetroIds = arrayStrToNum(metroIds);\n const parsedDistrictIds = arrayStrToNum(districtIds);\n const parsedAddressIds = arrayStrToNum(addresses);\n const parsedNewBuildingIds = arrayStrToNum(newBuildingIds);\n\n return new GeoFilter(\n new Set([ ...parsedMetroIds, ...parsedDistrictIds, ...parsedAddressIds ]),\n parsedMetroIds,\n parsedDistrictIds,\n parsedAddressIds,\n parsedNewBuildingIds\n );\n }\n },\n [Filters.newBuildingData]: {\n keys: [ 'newBuildingType', 'newBuildingName', 'newBuildingIds' ],\n handler: ({\n newBuildingType: type,\n newBuildingName: name,\n newBuildingIds: ids\n }) => type && name && ids.length === 1 ?\n new NewBuildingDataFilter({\n id: ids[0],\n type,\n name\n }) :\n new NewBuildingDataFilter()\n },\n [Filters.livingFacility]: {\n keys: [ 'livingFacility' ],\n handler: ({ livingFacility }) => {\n if (! livingFacility) {\n return new LivingFacilityFilter();\n }\n\n return new LivingFacilityFilter(\n livingFacility.map((item: keyof typeof LivingFacilitiesOption) => {\n return LivingFacilitiesOption[item];\n })\n );\n }\n },\n [Filters.furniture]: {\n keys: [ 'furniture' ],\n handler: ({ furniture }) => {\n if (! furniture) {\n return new FurnitureFilter();\n }\n\n return new FurnitureFilter(\n furniture.map((item: keyof typeof FurnitureOption) => {\n return FurnitureOption[item];\n })\n );\n }\n },\n [Filters.finishingType]: {\n keys: [ 'finishingType' ],\n handler: ({ finishingType }) => {\n if (! finishingType) {\n return new FinishingFilter();\n }\n\n return new FinishingFilter(\n finishingType.map((item: keyof typeof FinishingTypeOption) => {\n return FinishingTypeOption[item];\n })\n );\n }\n },\n [Filters.livingTenantOptions]: {\n keys: [ 'livingTenantOptions' ],\n handler: ({ livingTenantOptions }) => {\n if (! livingTenantOptions) {\n return new LivingTenantOptionFilter();\n }\n\n return new LivingTenantOptionFilter(\n livingTenantOptions.map((item: keyof typeof LivingTenantOption) => {\n return LivingTenantOption[item];\n })\n );\n }\n },\n [Filters.rentConditions]: {\n keys: [\n 'utilitiesIncluded',\n 'commisionType',\n 'depositType'\n ],\n handler: ({\n utilitiesIncluded,\n depositType,\n commisionType\n }) => {\n return new RentConditionsFilter(\n utilitiesIncluded,\n DepositType[depositType],\n CommissionType[commisionType]\n );\n }\n },\n [Filters.rentPrepayment]: {\n keys: [ 'rentPrepayment' ],\n handler: ({\n rentPrepayment\n }: {\n rentPrepayment?: keyof typeof PrepaymentType;\n }) => {\n if (! rentPrepayment) {\n return new RentPrepaymentFilter();\n }\n\n return new RentPrepaymentFilter(\n PrepaymentType[rentPrepayment]\n );\n }\n },\n [Filters.walls]: {\n keys: [ 'walls' ],\n handler: ({\n walls\n }) => {\n if (! walls) {\n return new WallsTypeFilter();\n }\n\n return new WallsTypeFilter(\n walls.map((item: keyof typeof WallsType) => {\n return WallsType[item];\n })\n );\n }\n },\n [Filters.parkings]: {\n keys: [ 'parkings' ],\n handler: ({\n parkings\n }) => {\n if (! parkings) {\n return new ParkingFilter();\n }\n\n return new ParkingFilter(\n parkings.map((item: keyof typeof ParkingType) => {\n return ParkingType[item];\n })\n );\n }\n },\n [Filters.author]: {\n keys: [ 'author' ],\n handler: ({\n author\n }) => {\n return new AuthorFilter(author);\n }\n },\n [Filters.sellType]: {\n keys: [ 'sellType' ],\n handler: ({\n sellType\n }) => {\n return new SellTypeFilter(sellType);\n }\n },\n [Filters.balcony]: {\n keys: [ 'balcony' ],\n handler: ({\n balcony\n }: {\n balcony?: keyof typeof BalconyOptions;\n }) => {\n if (! balcony) {\n return new BalconyFilter();\n }\n\n return new BalconyFilter(\n BalconyOptions[balcony]\n );\n }\n },\n [Filters.photoOptions]: {\n keys: [ 'photoOptions' ],\n handler: ({\n photoOptions\n }: {\n photoOptions?: keyof typeof PhotoOptions;\n }) => {\n if (! photoOptions) {\n return new PhotoOptionsFilter();\n }\n\n return new PhotoOptionsFilter(\n PhotoOptions[photoOptions]\n );\n }\n },\n [Filters.layoutImageOptions]: {\n keys: [ 'layoutImageOptions' ],\n handler: ({\n layoutImageOptions = []\n }) => {\n return new LayoutImageOptionsFilter(\n layoutImageOptions.map((item: number) => {\n return LayoutImageOptions[item];\n })\n );\n }\n },\n [Filters.bankPledgeOptions]: {\n keys: [ 'bankPledgeOptions' ],\n handler: ({\n bankPledgeOptions\n }: {\n bankPledgeOptions?: keyof typeof BankPledgeOptions;\n }) => {\n if (! bankPledgeOptions) {\n return new BankPledgeOptionsFilter();\n }\n\n return new BankPledgeOptionsFilter(\n BankPledgeOptions[bankPledgeOptions]\n );\n }\n },\n [Filters.nearbyOptions]: {\n keys: [ 'nearbyOptions' ],\n handler: ({\n nearbyOptions\n }: {\n nearbyOptions?: keyof typeof NearbyOptions;\n }) => {\n if (! nearbyOptions) {\n return new NearbySchoolFilter();\n }\n\n return new NearbySchoolFilter(\n NearbyOptions[nearbyOptions]\n );\n }\n },\n [Filters.renovationProgram]: {\n keys: [ 'renovationProgram' ],\n handler: ({\n renovationProgram\n }: {\n renovationProgram?: keyof typeof RenovationProgram;\n }) => {\n if (! renovationProgram) {\n return new RenovationProgramFilter();\n }\n\n return new RenovationProgramFilter(\n RenovationProgram[renovationProgram]\n );\n }\n },\n [Filters.seoMortgageAllowed]: {\n keys: [ 'seoMortgageAllowed' ],\n handler: ({\n seoMortgageAllowed\n }: {\n seoMortgageAllowed?: boolean;\n }) => {\n return new SeoMortgageAllowedFilter(seoMortgageAllowed);\n }\n },\n [Filters.apartments]: {\n keys: [ 'apartments' ],\n handler: ({\n apartments\n }: {\n apartments?: keyof typeof IsApartmentsOptions;\n }) => {\n if (! apartments) {\n return new ApartmentFilter();\n }\n\n return new ApartmentFilter(\n IsApartmentsOptions[apartments]\n );\n }\n },\n [Filters.infrastructure]: {\n keys: [ 'infrastructure', 'hasLift' ],\n handler: ({\n infrastructure = [],\n hasLift\n }: {\n infrastructure: (keyof typeof InfrastructureOptions)[];\n hasLift: keyof typeof LiftOptions;\n }) => {\n return new InfrastructureFilter(\n infrastructure.map(item => InfrastructureOptions[item]),\n LiftOptions[hasLift]\n );\n }\n },\n [Filters.mapBounds]: {\n keys: [ 'mapBounds' ],\n handler: ({ mapBounds }) => {\n return new MapBoundsFilter(mapBounds?.bounds, mapBounds?.polygon, mapBounds?.geohash);\n }\n },\n [Filters.windowsDirection]: {\n keys: [ 'windowsDirection' ],\n handler: ({ windowsDirection }) => {\n if (! windowsDirection) {\n return new WindowsDirectionFilter();\n }\n\n const result = windowsDirection.map((value: string) => {\n switch (value) {\n case 'BOTH':\n return WindowsDirectionSearchOffersEnum.Both;\n case 'FRONT':\n return WindowsDirectionSearchOffersEnum.Front;\n case 'REAR':\n return WindowsDirectionSearchOffersEnum.Rear;\n default:\n return null;\n }\n });\n\n return new WindowsDirectionFilter(result);\n }\n },\n [Filters.buildEpoch]: {\n keys: [ 'buildEpoch' ],\n handler: ({ buildEpoch }) => {\n if (! buildEpoch) return new BuildEpochFilter();\n\n return new BuildEpochFilter(\n buildEpoch.map((item: keyof typeof BuildEpoch) => {\n return BuildEpoch[item];\n })\n );\n }\n },\n [Filters.onlineView]: {\n keys: [ 'onlineView' ],\n handler: ({ onlineView }: { onlineView: keyof typeof OnlineView}) => {\n if (! onlineView) return new OnlineViewFilter();\n\n return new OnlineViewFilter(OnlineView[onlineView]);\n }\n },\n [Filters.commissioning]: {\n keys: [ 'commissioning' ],\n handler: ({ commissioning }) => new CommissioningFilter(commissioning)\n }\n};\n","/* eslint-disable max-len */\n/* eslint-disable no-nested-ternary */\nimport {\n LiftOptions,\n InfrastructureOptions,\n IsApartmentsOptions,\n PhotoOptions,\n BalconyOptions,\n ParkingType,\n WallsType,\n PrepaymentType,\n CommissionType,\n DepositType,\n LivingTenantOption,\n FurnitureOption,\n LivingFacilitiesOption,\n AreaUnit,\n FloorConstraints,\n CeilingHeight,\n Bathroom,\n TransportType,\n TimeLimit,\n GasOptions,\n WaterOptions,\n ElectricityOptions,\n SewerageOptions,\n LandStatus,\n HouseCategory,\n BathroomLocationOptions,\n HeatingOptions,\n BankPledgeOptions,\n LayoutImageOptions,\n NearbyOptions,\n RenovationProgram,\n OnlineView,\n BuildEpoch,\n FinishingTypeOption\n} from '@search/filter-enums/enums';\nimport { WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\nimport {\n Filters,\n DealTypeFilter,\n CategoryTypeFilter,\n AreaFilter,\n RoomFilter,\n PriceFilter,\n MortgagePaymentFilter,\n LivingAreaFilter,\n KitchenAreaFilter,\n YearBuildingFilter,\n FloorFilter,\n CellHeightFilter,\n RenovationFilter,\n BathroomFilter,\n NewBuildingFilter,\n RegionFilter,\n GeoFilter,\n NewBuildingDataFilter,\n FloorsTotalFilter,\n LivingFacilityFilter,\n FurnitureFilter,\n LivingTenantOptionFilter,\n RentConditionsFilter,\n RentPrepaymentFilter,\n WallsTypeFilter,\n ParkingFilter,\n BalconyFilter,\n PhotoOptionsFilter,\n ApartmentFilter,\n InfrastructureFilter,\n AuthorFilter,\n SellTypeFilter,\n TransportLimitFilter,\n RoomsInOfferFilter,\n LandAreaFilter,\n LandStatusFilter,\n SupplyOptionsFilter,\n HouseCategoryFilter,\n HouseAreaFilter,\n HeatingFilter,\n BathroomLocationFilter,\n MapBoundsFilter,\n BankPledgeOptionsFilter,\n LayoutImageOptionsFilter,\n WindowsDirectionFilter,\n SeoMortgageAllowedFilter,\n RenovationProgramFilter,\n NearbySchoolFilter,\n SellerOrganizationNameFilter,\n BuildEpochFilter,\n OnlineViewFilter,\n FinishingFilter,\n ClCommisioninFilter,\n CommissioningFilter\n} from '../../models/Filter';\n\nexport const filterSerializers: Record<Filters, Function> = {\n [Filters.heating]: (filter: HeatingFilter) => {\n return filter?.heating?.map(item => HeatingOptions[item]);\n },\n [Filters.bathroomLocation]: (filter: BathroomLocationFilter) => {\n return filter?.locations?.map(item => BathroomLocationOptions[item]);\n },\n [Filters.houseArea]: (filter: HouseAreaFilter) => {\n if (! filter) {\n return null;\n }\n const value = filter.value;\n\n return {\n houseAreaMin: value.from,\n houseAreaMax: value.to\n };\n },\n [Filters.houseCategory]: (filter: HouseCategoryFilter) => {\n return filter?.categories?.map(item => HouseCategory[item]);\n },\n [Filters.landStatus]: (filter: LandStatusFilter) => {\n if (! filter) {\n return null;\n }\n\n return filter.landStatuses.map(item => LandStatus[item]);\n },\n\n [Filters.supplyOptions]: (filter: SupplyOptionsFilter) => {\n if (! filter) {\n return null;\n }\n return {\n gas: filter.gas.map(item => GasOptions[item]),\n water: filter.water.map(item => WaterOptions[item]),\n electricity: filter.electricity.map(item => ElectricityOptions[item]),\n sewerage: filter.sewerage.map(item => SewerageOptions[item])\n };\n },\n [Filters.landArea]: (filter: LandAreaFilter) => {\n if (! filter) {\n return null;\n }\n const value = filter.value;\n\n return {\n landAreaMin: value.from,\n landAreaMax: value.to\n };\n },\n [Filters.dealType]: (filter: DealTypeFilter) => {\n return filter && filter.dealType;\n },\n [Filters.transportLimit]: (filter: TransportLimitFilter) => {\n if (filter) {\n return {\n transport: TransportType[filter.transportType!],\n transportTimeLimit: TimeLimit[filter.timeLimit!]\n };\n }\n\n return null;\n },\n [Filters.categoryType]: (filter: CategoryTypeFilter) => {\n return filter.categoryType;\n },\n [Filters.totalArea]: (filter: AreaFilter) => {\n if (! filter) {\n return null;\n }\n const value = filter.value;\n\n return {\n totalAreaMin: value.from,\n totalAreaMax: value.to\n };\n },\n [Filters.rooms]: (filter: RoomFilter) => {\n return filter && filter.rooms.map(room => {\n return room;\n });\n },\n [Filters.roomsInOffer]: (filter: RoomsInOfferFilter) => {\n if (! filter) {\n return [];\n }\n return filter.roomsInOffer.map(room => {\n return room;\n });\n },\n [Filters.region]: (filter: RegionFilter) => {\n return filter.region;\n },\n [Filters.price]: (filter: PriceFilter) => {\n const { from, to } = filter.value;\n let priceUnit: string;\n\n switch (filter.priceType) {\n case AreaUnit.UNKNOWN:\n priceUnit = 'ALL';\n break;\n case AreaUnit.ARE:\n priceUnit = 'ARE';\n break;\n case AreaUnit.HECTARE:\n priceUnit = 'HECTARE';\n break;\n case AreaUnit.METER:\n priceUnit = 'METER';\n break;\n case AreaUnit.MORTGAGE_PAYMENT:\n priceUnit = 'MORTGAGE_PAYMENT';\n break;\n default:\n priceUnit = 'UNKNOWN';\n }\n\n return {\n priceMin: from,\n priceMax: to,\n priceUnit\n };\n },\n [Filters.mortgagePayment]: (filter: MortgagePaymentFilter) => filter?.payment,\n [Filters.livingArea]: (filter: LivingAreaFilter) => {\n if (! filter) {\n return null;\n }\n const { from, to } = filter.value;\n\n return {\n livingAreaMin: from,\n livingAreaMax: to\n };\n },\n [Filters.kitchenArea]: (filter: KitchenAreaFilter) => {\n if (! filter) {\n return null;\n }\n const { from, to } = filter.value;\n\n return {\n kitchenAreaMin: from,\n kitchenAreaMax: to\n };\n },\n [Filters.builtYear]: (filter: YearBuildingFilter) => {\n if (! filter) {\n return null;\n }\n const { from, to } = filter.value;\n\n return {\n builtYearMin: from,\n builtYearMax: to\n };\n },\n [Filters.floor]: (filter: FloorFilter) => {\n if (! filter) {\n return null;\n }\n\n const { from, to } = filter.range;\n const last = filter.last === FloorConstraints.ONLY ? 'ONLY' :\n filter.last === FloorConstraints.EXCLUDE ? 'EXCLUDE' : null;\n const first = filter.first === FloorConstraints.ONLY ? 'ONLY' :\n filter.first === FloorConstraints.EXCLUDE ? 'EXCLUDE' : null;\n\n return {\n floorMin: from,\n floorMax: to,\n last,\n first\n };\n },\n [Filters.floorsTotal]: (filter: FloorsTotalFilter) => {\n if (! filter) {\n return null;\n }\n const { from, to } = filter.range;\n\n return {\n floorsTotalMin: from,\n floorsTotalMax: to\n };\n },\n [Filters.cellHeight]: (filter: CellHeightFilter) => {\n if (! filter) {\n return null;\n }\n\n switch (filter.value) {\n case CeilingHeight.FROM_2_5:\n return 'FROM_2_5';\n case CeilingHeight.FROM_2_7:\n return 'FROM_2_7';\n case CeilingHeight.FROM_3:\n return 'FROM_3';\n\n case CeilingHeight.FROM_4:\n return 'FROM_4';\n default: return null;\n }\n },\n [Filters.renovation]: (filter: RenovationFilter) => {\n return filter && filter.value;\n },\n [Filters.newBuilding]: (filter: NewBuildingFilter) => {\n if (! filter) {\n return null;\n }\n return filter.newBuilding;\n },\n [Filters.bathroom]: (filter: BathroomFilter) => {\n return filter && filter.value.map(value => {\n switch (value) {\n case Bathroom.COMBINED:\n return 'COMBINED';\n case Bathroom.PARTED:\n return 'PARTED';\n case Bathroom.SEVERAL:\n return 'SEVERAL';\n default:\n return null;\n }\n });\n },\n [Filters.geo]: (filter: GeoFilter) => ({\n metroIds: filter.metroIds.slice(),\n districtIds: filter.districtIds.slice(),\n addresses: filter.addressIds.slice(),\n newBuildingIds: filter.newBuildingIds.slice()\n }),\n [Filters.newBuildingData]: (filter: NewBuildingDataFilter) => ({\n newBuildingType: filter?.newBuilding?.type,\n newBuildingName: filter?.newBuilding?.name\n }),\n [Filters.livingFacility]: (filter: LivingFacilityFilter) => {\n if (! filter) {\n return [];\n }\n return filter.facilities.map(facility => {\n return LivingFacilitiesOption[facility];\n });\n },\n [Filters.furniture]: (filter: FurnitureFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.furnitures.map(furniture => {\n return FurnitureOption[furniture];\n });\n },\n [Filters.finishingType]: (filter: FinishingFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.finishingType.map(type => {\n return FinishingTypeOption[type];\n });\n },\n [Filters.livingTenantOptions]: (filter: LivingTenantOptionFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.livingTenantOptions.map(option => {\n return LivingTenantOption[option];\n });\n },\n [Filters.rentConditions]: (filter: RentConditionsFilter) => {\n if (! filter) {\n return;\n }\n\n return {\n utilitiesIncluded: filter.utilitiesIncluded || undefined,\n commisionType: filter.commisionType === CommissionType.UNKNOWN ? undefined : CommissionType[filter.commisionType],\n depositType: filter.depositType === DepositType.UNKNOWN ? undefined : DepositType[filter.depositType]\n };\n },\n [Filters.rentPrepayment]: (filter: RentPrepaymentFilter) => {\n if (! filter) {\n return;\n }\n\n return PrepaymentType[filter.prePaymentType];\n },\n [Filters.walls]: (filter: WallsTypeFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.walls.map(wall => {\n return WallsType[wall];\n });\n },\n [Filters.parkings]: (filter: ParkingFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.parkings.map(parking => {\n return ParkingType[parking];\n });\n },\n [Filters.author]: (filter: AuthorFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.author;\n },\n [Filters.sellType]: (filter: SellTypeFilter) => {\n if (! filter) {\n return [];\n }\n\n return filter.sellType;\n },\n [Filters.balcony]: (filter: BalconyFilter) => {\n if (! filter) {\n return;\n }\n\n return BalconyOptions[filter.hasBalcony];\n },\n [Filters.photoOptions]: (filter: PhotoOptionsFilter) => {\n if (! filter) {\n return;\n }\n\n return PhotoOptions[filter.photoOption];\n },\n [Filters.renovationProgram]: (filter: RenovationProgramFilter) => {\n if (! filter) return;\n\n return RenovationProgram[filter.willRenovation];\n },\n [Filters.nearbyOptions]: (filter: NearbySchoolFilter) => {\n if (! filter) return;\n\n return NearbyOptions[filter.hasNearbySchool];\n },\n [Filters.layoutImageOptions]: (filter: LayoutImageOptionsFilter) => {\n if (! filter) {\n return;\n }\n\n return filter.layoutImageOption.map(option => {\n return LayoutImageOptions[option];\n });\n },\n [Filters.seoMortgageAllowed]: (filter: SeoMortgageAllowedFilter) => {\n if (! filter) {\n return;\n }\n\n return filter.isAllowed;\n },\n [Filters.bankPledgeOptions]: (filter: BankPledgeOptionsFilter) => {\n if (! filter) {\n return;\n }\n\n return BankPledgeOptions[filter.bankPledgeOption];\n },\n [Filters.apartments]: (filter: ApartmentFilter) => {\n if (! filter) {\n return;\n }\n\n if (filter.isApartment === IsApartmentsOptions.UNKNOWN) {\n return;\n }\n\n return IsApartmentsOptions[filter.isApartment];\n },\n [Filters.infrastructure]: (filter: InfrastructureFilter) => {\n if (! filter) {\n return;\n }\n\n return {\n hasLift: LiftOptions[filter.hasLift] || undefined,\n infrastructure: filter.infrastructure.map(infra => {\n return InfrastructureOptions[infra];\n })\n };\n },\n [Filters.windowsDirection]: (filter: WindowsDirectionFilter) => {\n return filter && filter.value.map(value => {\n switch (value) {\n case WindowsDirectionSearchOffersEnum.Both:\n return 'BOTH';\n case WindowsDirectionSearchOffersEnum.Front:\n return 'FRONT';\n case WindowsDirectionSearchOffersEnum.Rear:\n return 'REAR';\n default:\n return null;\n }\n });\n },\n [Filters.sellerOrganizationName]: (filter: SellerOrganizationNameFilter) => {\n if (! filter) return null;\n\n return filter.sellerOrganizationName;\n },\n [Filters.mapBounds]: (filter: MapBoundsFilter) => {\n if (! filter) {\n return;\n }\n\n return {\n mapBounds: {\n bounds: filter.bounds,\n polygon: filter.polygon,\n geohash: filter.geohash\n }\n };\n },\n [Filters.buildEpoch]: (filter: BuildEpochFilter) => {\n if (! filter) return [];\n\n return filter.buildEpoch.map(epoch => {\n return BuildEpoch[epoch];\n });\n },\n [Filters.onlineView]: (filter: OnlineViewFilter) => {\n if (! filter) return;\n\n return OnlineView[filter.onlineView];\n },\n [Filters.commissioning]: (filter: CommissioningFilter) => {\n if (! filter) return;\n\n return filter.commissioning;\n }\n};\n","import { YMapBounds } from '@search/ymap/src/bounds';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nexport const offerYMapPresetBounds: Record<number, YMapBounds> = {\n [RegionIdEnum.SPB]: {\n min: { x: 29.812084, y: 59.808254 },\n max: { x: 30.828319, y: 60.059460 }\n },\n [RegionIdEnum.SPB_AND_LEN_OBL]: {\n min: { x: 29.812084, y: 59.808254 },\n max: { x: 30.828319, y: 60.059460 }\n },\n [RegionIdEnum.LEN_OBL]: {\n min: { x: 29.812084, y: 59.808254 },\n max: { x: 30.828319, y: 60.059460 }\n },\n [RegionIdEnum.MSK]: {\n min: { x: 37.488248, y: 55.585993 },\n max: { x: 37.74574, y: 55.875427 }\n },\n [RegionIdEnum.MSK_AND_MSK_OBL]: {\n min: { x: 35.710134, y: 55.124008 },\n max: { x: 39.341116, y: 56.287049 }\n },\n [RegionIdEnum.MSK_OBL]: {\n min: { x: 35.710134, y: 55.124008 },\n max: { x: 39.341116, y: 56.287049 }\n }\n};\n","/* eslint-disable max-len */\n/* eslint-disable curly, complexity */\nimport upperFirst from 'lodash/upperFirst';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { PriceSeoMatcher } from '@search/offer-search-routes/src/searchRoute/PriceSeoMatcher';\nimport { BuildEpochSeoMatcher } from '@search/offer-search-routes/src/searchRoute/BuildEpochSeoMatcher';\nimport { AuthorTypeOptionsWithRealtor, RealtyObjectType, Renovation, Rooms } from '@search/filter-enums/enums';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { seoSearchCommon, seoSearchCommonJoin, SeoSearchCommonProps } from './seoSearchCommon';\n\nexport function seoSearchFlatRoom({ params, geos, offersCount, offersSummary, region }: SeoSearchCommonProps) {\n const segment = params.segments;\n const {\n conciergeText,\n hasLiftText,\n balconyText,\n\n dealTypeText,\n geoText,\n regionText,\n additionalRegionText,\n offersCountText,\n nearMetroText,\n priceMaxText,\n parkingText,\n rentPaymentText,\n seoMortgage,\n generateFaqTexts,\n isNonCapitalRegion\n } = seoSearchCommon({ params, geos, offersCount, offersSummary, region });\n\n let roomCount = 0;\n const roomType = params.categoryType === RealtyObjectType.ROOM ? undefined : params?.segments?.rooms?.[0];\n\n if (roomType === Rooms.ROOM_1) roomCount = 1;\n if (roomType === Rooms.ROOM_2) roomCount = 2;\n if (roomType === Rooms.ROOM_3) roomCount = 3;\n if (roomType === Rooms.ROOM_4) roomCount = 4;\n\n const roomsText = getFlatRoomCategoryText(params, roomCount, roomType);\n const roomsFullText = getFlatCategoryFullText(params, roomCount);\n\n const noClientCommision = params?.commisionType === 'NO_CLIENT_COMMISSION' ? 'без комиссии' : '';\n let petsAllowed = {\n accusative: '',\n plural: ''\n };\n const withoutDeposit = params?.depositType === 'NO_DEPOSIT' ? 'без залога' : '';\n\n if (params?.livingTenantOptions && params?.livingTenantOptions.includes('PETS_ALLOWED')) {\n petsAllowed = {\n accusative: ', в которой можно жить с животными',\n plural: ', в которых можно жить с животными'\n };\n }\n\n if (params?.livingTenantOptions && params?.livingTenantOptions.includes('CHILDREN_ALLOWED')) {\n petsAllowed = {\n accusative: ', в которой можно жить с детьми',\n plural: ', в которых можно жить с детьми'\n };\n }\n\n if (! params?.livingTenantOptions || params?.livingTenantOptions?.length > 1) {\n petsAllowed = {\n accusative: '',\n plural: ''\n };\n }\n\n let newBuildingText = {\n accusative: '',\n plural: '',\n prepositional: ''\n };\n\n const nb = segment?.newBuilding?.[0];\n\n if (nb === NewBuilding.NEW) newBuildingText = {\n accusative: 'в\\u00A0новостройке',\n plural: 'новостроек',\n prepositional: 'в\\u00A0новостройках'\n };\n\n if (nb === NewBuilding.SECOND) newBuildingText = {\n accusative: 'на\\u00A0вторичке',\n plural: 'вторичек',\n prepositional: 'на\\u00A0вторичном рынке жилья'\n };\n\n let renovationText = '';\n const renovation = segment?.renovation?.[0];\n\n if (renovation === Renovation.COSMETIC) renovationText = 'с\\u00A0косметическим ремонтом';\n if (renovation === Renovation.DESIGNED) renovationText = 'с\\u00A0дизайнерским ремонтом';\n if (renovation === Renovation.EURO) renovationText = 'с\\u00A0евроремонтом';\n if (renovation === Renovation.NEED) renovationText = 'с\\u00A0ремонтом';\n if (renovation === Renovation.NONE) renovationText = 'без\\u00A0ремонта';\n\n let securityText = '';\n\n if (segment?.infrastructure?.includes('CLOSED_AREA')) securityText = 'с охраняемой территорией';\n\n let renovationProgramText = '';\n\n if (segment?.renovationProgram === 'HAS_ANY') renovationProgramText = 'под реновацию';\n\n let pledgeText = '';\n\n if (segment?.bankPledgeOptions === 'IN_PLEDGE') pledgeText = 'в\\u00A0залоге';\n\n const authorText = segment?.author?.includes(AuthorTypeOptionsWithRealtor.OWNER) ? 'от\\u00A0собственника' : '';\n let bathroomText = '';\n let furnitureText = '';\n\n if (segment?.bathroom?.includes('PARTED')) bathroomText = 'с\\u00A0раздельным санузлом';\n if (segment?.bathroom?.includes('COMBINED')) bathroomText = 'с\\u00A0совмещенным санузлом';\n\n if (segment?.furniture?.includes('NO')) furnitureText = 'без мебели';\n if (segment?.furniture?.includes('ALL')) furnitureText = 'с\\u00A0мебелью';\n if (segment?.furniture?.includes('ALL') &&\n params?.dealType === DealType.SELL &&\n params?.categoryType === RealtyObjectType.FLAT) furnitureText = 'с\\u00A0ремонтом и\\u00A0мебелью';\n\n let priceLevelText = {\n accusative: '',\n plural: '',\n nominative: '',\n genitive: ''\n };\n let priceClassText = {\n accusative: '',\n plural: ''\n };\n\n const priceSeo = PriceSeoMatcher.$.match({\n categoryType: params.categoryType ?? RealtyObjectType.FLAT,\n dealType: params.dealType as DealType ?? DealType.SELL,\n priceMax: segment?.priceMax,\n priceMin: segment?.priceMin,\n region: params.region,\n regionTranslit: region?.translit\n });\n\n if (priceSeo?.seg === 'deshevye') {\n priceClassText = {\n accusative: ' дешёвую',\n plural: ' дешёвых'\n };\n priceLevelText = {\n accusative: 'недорогую',\n plural: 'недорогих',\n nominative: 'недорогая',\n genitive: 'недорогой'\n };\n }\n\n if (priceSeo?.seg === 'elitnye') {\n priceClassText = {\n accusative: ' элитную',\n plural: ' элитных'\n };\n priceLevelText = {\n accusative: 'элитную',\n plural: 'дорогих',\n nominative: 'элитная',\n genitive: 'элитной'\n };\n }\n\n const etazhText = seoSearchCommonJoin(\n segment?.floorMax === 1 ? 'на\\u00A0первом этаже' : '',\n segment?.floorMax && segment?.floorMin && segment?.floorMax === segment?.floorMin && FLOOR_NAME_MAP.has(segment.floorMax) && FLOOR_NAME_MAP.has(segment.floorMin) ?\n `на\\u00A0${FLOOR_NAME_MAP.get(segment.floorMin)} этаже` : '',\n segment?.last === 'ONLY' ? 'на\\u00A0последнем этаже' : '',\n );\n\n let buildEpochText: string;\n\n const buildEpochSeo = BuildEpochSeoMatcher.$.match({\n categoryType: params.categoryType ?? RealtyObjectType.FLAT,\n dealType: params.dealType as DealType ?? DealType.SELL,\n builtYearMin: segment?.builtYearMin,\n builtYearMax: segment?.builtYearMax\n });\n\n switch (buildEpochSeo?.seg) {\n case 'stalinka':\n buildEpochText = 'в сталинке';\n\n break;\n case 'khrushchevka':\n buildEpochText = 'в хрущевке';\n\n break;\n case 'brezhnevka':\n buildEpochText = 'в брежневке';\n\n break;\n default:\n buildEpochText = '';\n }\n\n const branch = geos.find(item => item.id === params.metroBranch);\n const isCircle = branch?.id === 169286 || branch?.id === 169288 || branch?.id === 305;\n const branchText = branch ? `${isCircle ? 'около' : 'на'} ${BRANCH_NAME_MAP.get(branch?.id)}${isCircle ? '' : ' ветке метро'}` : '';\n const fullBranchName = isCircle ? `около ${CIRCLE_FULL_MAP.get(branch?.id)}` : branch?.locative ?? '';\n\n const prefixCommon = seoSearchCommonJoin(\n newBuildingText.accusative,\n pledgeText,\n seoMortgage,\n authorText,\n renovationText,\n renovationProgramText,\n bathroomText,\n furnitureText,\n buildEpochText,\n conciergeText,\n hasLiftText,\n balconyText,\n parkingText,\n priceSeo?.seg ? '' : priceMaxText,\n rentPaymentText,\n securityText,\n segment?.cellHeight === 'FROM_3' ? 'с\\u00A0высокими потолками' : '',\n etazhText,\n segment?.kitchenAreaMin === 15 ? 'с\\u00A0большой кухней' : '',\n segment?.nearbyOptions === 'GOOD_SCHOOL' ? 'рядом со\\u00A0школой' : '',\n nearMetroText,\n geoText,\n branchText\n );\n\n const priceLast = priceSeo?.seg === 'nedorogo' ? ' недорого' : '';\n const premiumText = priceSeo?.seg === 'elitnye' ? 'премиум' : '';\n\n const allCommon = `${seoSearchCommonJoin(\n prefixCommon,\n noClientCommision,\n withoutDeposit,\n regionText,\n )}${petsAllowed.accusative} ${priceLast}`;\n\n let pageTitle = seoSearchCommonJoin(\n upperFirst(dealTypeText.verb),\n priceClassText.accusative,\n roomsText.alternativeAccusative,\n allCommon\n );\n\n const descriptionTitle = seoSearchCommonJoin(\n upperFirst(dealTypeText.verb),\n priceClassText.accusative,\n roomsText.accusative,\n allCommon\n ).replace(/городском округе/gi, 'районе');\n\n let metaTitle = `${descriptionTitle}\\u00A0— ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n premiumText,\n roomsText.alternativePlural,\n newBuildingText.prepositional,\n furnitureText,\n renovationText,\n petsAllowed.plural,\n buildEpochText,\n fullBranchName,\n premiumText ? '' : 'недорого',\n )}: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n const isMalogabaritnaya = params?.segments?.totalAreaMax === 29 && roomCount < 2;\n let metaDescription = `🏢 ${pageTitle}${additionalRegionText} на\\u00A0m2.ru. ➜ В\\u00A0каталоге недвижимости ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n priceLevelText.plural,\n isMalogabaritnaya ? 'квартир гостиничного типа' : roomsText.plural,\n newBuildingText.prepositional,\n etazhText,\n pledgeText,\n authorText,\n renovationText,\n furnitureText,\n petsAllowed.plural,\n buildEpochText,\n fullBranchName,\n regionText\n )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n\n if (params.categoryType === RealtyObjectType.ROOM && params.dealType === DealType.SELL && isNonCapitalRegion) {\n pageTitle = seoSearchCommonJoin(\n upperFirst(dealTypeText.noun),\n priceClassText.plural,\n roomsText.alternativePlural,\n allCommon\n );\n\n metaTitle = `${descriptionTitle} ${premiumText ? '' : 'недорого'}, объявления о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n premiumText,\n roomsText.alternativePlural,\n newBuildingText.prepositional,\n furnitureText,\n renovationText,\n petsAllowed.plural,\n buildEpochText,\n fullBranchName,\n )} в квартире, планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n const description = seoSearchCommonJoin(\n upperFirst(dealTypeText.proposal),\n priceClassText.accusative,\n roomsText.alternativeAccusative,\n allCommon\n );\n\n metaDescription = `${description}${additionalRegionText} в квартирах на вторичном рынке и в новостройках по доступной цене. В\\u00A0каталоге недвижимости ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n priceLevelText.plural,\n isMalogabaritnaya ? 'квартир гостиничного типа' : roomsText.plural,\n newBuildingText.prepositional,\n etazhText,\n pledgeText,\n authorText,\n renovationText,\n furnitureText,\n petsAllowed.plural,\n buildEpochText,\n fullBranchName,\n regionText\n )} с описанием объектов, планировок, фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n }\n\n if (isMalogabaritnaya) {\n const additionalTitle = seoSearchCommonJoin(\n upperFirst(dealTypeText.verb),\n priceClassText.accusative,\n 'малосемейку или гостинку (КГТ)',\n allCommon\n ).replace(/городском округе/gi, 'районе');\n\n metaTitle = `${additionalTitle}\\u00A0— ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n premiumText,\n roomsText.plural,\n newBuildingText.prepositional,\n renovationText,\n furnitureText,\n buildEpochText,\n premiumText ? '' : 'недорого',\n )}: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n }\n\n const relativeTitle = seoSearchCommonJoin(\n upperFirst(dealTypeText.verb),\n 'похожую',\n roomsText.accusative,\n allCommon\n );\n\n // Костыль для административных округов Москвы\n if (region?.id === RegionIdEnum.MSK) {\n if (/в Центральном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Центральном административном округе/gi, 'в центре').replace(/недорого: планировки/gi, 'в ЦАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Центральном административном округе/gi, 'в центре (ЦАО)');\n } else\n if (/в Восточном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Восточном административном округе/gi, 'на востоке').replace(/недорого: планировки/gi, 'в ВАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Восточном административном округе/gi, 'на востоке (ВАО)');\n } else\n if (/в Северо-Восточном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Северо-Восточном административном округе/gi, 'на северо-востоке').replace(/недорого: планировки/gi, 'в СВАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Северо-Восточном административном округе/gi, 'на северо-востоке (СВАО)');\n } else\n if (/в Юго-Восточном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Юго-Восточном административном округе/gi, 'на юго-востоке').replace(/недорого: планировки/gi, 'в ЮВАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Юго-Восточном административном округе/gi, 'на юго-востоке (ЮВАО)');\n } else\n if (/в Западном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Западном административном округе/gi, 'на западе').replace(/недорого: планировки/gi, 'в ЗАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Западном административном округе/gi, 'на западе (ЗАО)');\n } else\n if (/в Северо-Западном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Северо-Западном административном округе/gi, 'на северо-западе').replace(/недорого: планировки/gi, 'в СЗАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Северо-Западном административном округе/gi, 'на северо-западе (СЗАО)');\n } else\n if (/в Юго-Западном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Юго-Западном административном округе/gi, 'на юго-западе').replace(/недорого: планировки/gi, 'в ЮЗАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Юго-Западном административном округе/gi, 'на юго-западе (ЮЗАО)');\n } else\n if (/в Южном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Южном административном округе/gi, 'на юге').replace(/недорого: планировки/gi, 'в ЮАО недорого: планировки');\n metaDescription = metaDescription.replace(/в Южном административном округе/gi, 'на юге (ЮАО)');\n }\n if (/Северном административном округе/.test(geoText)) {\n metaTitle = metaTitle.replace(/в Северном административном округе/gi, 'на севере').replace(/недорого: планировки/gi, 'в САО недорого: планировки');\n metaDescription = metaDescription.replace(/в Северном административном округе/gi, 'на севере (САО)');\n }\n }\n\n return {\n metaTitle,\n metaDescription,\n pageTitle,\n relativeTitle,\n faqTexts: generateFaqTexts({\n prefixSegmentText: priceLevelText,\n segmentText: roomsText,\n commonPostfixText: allCommon,\n segmentFullText: roomsFullText\n })\n };\n}\n\nconst getFlatRoomCategoryText = (params: SeoSearchCommonProps['params'], roomCount: number, roomType?: Rooms) => {\n // eslint-disable-next-line prefer-const\n let { roomsText, small } = getCommonFlatRoomCategoryText(params, roomCount);\n\n if (params.categoryType === RealtyObjectType.ROOM) roomsText = {\n accusative: 'комнату',\n plural: 'комнат',\n genitive: 'комнаты',\n nominative: 'комната',\n alternativeAccusative: 'комнату',\n alternativePlural: 'комнат',\n };\n\n if (params?.segments?.apartments === 'APARTMENTS_ONLY') roomsText = {\n accusative: 'квартиру-апартаменты',\n plural: 'квартир-апартаментов',\n genitive: 'квартиры-апартамента',\n nominative: 'квартира-апартамент',\n alternativeAccusative: 'квартиру-апартаменты',\n alternativePlural: 'квартир-апартаментов',\n };\n\n if (roomCount > 0 && params.segments?.kitchenAreaMin !== 17) roomsText = {\n accusative: `${roomCount}-комнатную ${roomsText.accusative}`,\n plural: `${roomCount}-комнатных ${roomsText.plural}`,\n genitive: `${roomCount}-комнатной ${roomsText.genitive}`,\n nominative: `${roomCount}-комнатная ${roomsText.nominative}`,\n alternativeAccusative: `${ROOM_TRANSLIT[roomCount]}комнатную ${roomsText.accusative}`,\n alternativePlural: `${ROOM_TRANSLIT[roomCount]}комнатных ${roomsText.plural}`\n };\n if (roomType === Rooms.ROOM_5_AND_MORE) return {\n accusative: `многокомнатную ${roomsText.accusative}`,\n plural: `многокомнатных ${roomsText.plural}`,\n genitive: `многокомнатной ${roomsText.genitive}`,\n nominative: `многокомнатная ${roomsText.nominative}`,\n alternativeAccusative: `многокомнатную ${roomsText.accusative}`,\n alternativePlural: `многокомнатных ${roomsText.plural}`\n };\n if (roomType === Rooms.STUDIO && params?.segments?.apartments === 'APARTMENTS_ONLY') return {\n accusative: 'апартаменты-студию',\n plural: 'апартаментов-студий',\n genitive: 'апартамента-студии',\n nominative: 'апартамент-студия',\n alternativeAccusative: 'апартаменты-студию',\n alternativePlural: 'апартаментов-студий'\n };\n if (roomType === Rooms.STUDIO && params?.segments?.apartments !== 'APARTMENTS_ONLY') return {\n accusative: `${small.accusative}студию`,\n plural: `${small.plural}студий`,\n genitive: `${small.genitive}студий`,\n nominative: `${small.nominative}студия`,\n alternativeAccusative: `${small.accusative}студию`,\n alternativePlural: `${small.plural}студий`,\n };\n if (roomType === Rooms.OPEN_PLAN) return {\n accusative: `${roomsText.accusative} со\\u00A0свободной планировкой`,\n plural: `${roomsText.plural} со\\u00A0свободной планировкой`,\n genitive: `${roomsText.genitive} со\\u00A0свободной планировкой`,\n nominative: `${roomsText.nominative} со\\u00A0свободной планировкой`,\n alternativeAccusative: `${roomsText.accusative} со\\u00A0свободной планировкой`,\n alternativePlural: `${roomsText.plural} со\\u00A0свободной планировкой`,\n };\n\n return roomsText;\n};\n\n/**\n * Метод для предоставления полнотекстового варианта комнатности квартир\n * отдаёт НЕ \"1-комнатная\", а \"однокомнатная\" только для 1-4 комнтных.\n * https://jira.m2.ru/browse/RS-7098\n*/\n\nfunction getFlatCategoryFullText(params: SeoSearchCommonProps['params'], roomCount: number) {\n const { roomsText } = getCommonFlatRoomCategoryText(params, roomCount);\n\n const roomCountText = ROOM_TRANSLIT[roomCount];\n\n if (roomCount > 0 && params.segments?.kitchenAreaMin !== 17) return {\n accusative: `${roomCountText}комнатную ${roomsText.accusative}`,\n plural: `${roomCountText}комнатных ${roomsText.plural}`,\n genitive: `${roomCountText}комнатной ${roomsText.genitive}`,\n nominative: `${roomCountText}комнатная ${roomsText.nominative}`\n };\n}\n\nfunction getCommonFlatRoomCategoryText(params: SeoSearchCommonProps['params'], roomCount: number) {\n const small = { accusative: '', plural: '', genitive: '', nominative: '' };\n\n if (params?.segments?.totalAreaMax === 29 && roomCount < 2) {\n small.accusative = 'малогабаритную\\u00A0';\n small.plural = 'малогабаритных\\u00A0';\n small.genitive = 'малогабаритной\\u00A0';\n small.nominative = 'малогабаритная\\u00A0';\n }\n\n let flatText = { accusative: 'квартиру', plural: 'квартир', genitive: 'квартиры', nominative: 'квартира' };\n\n if (params.segments?.kitchenAreaMin === 17) {\n if (roomCount === 1) flatText = { accusative: 'еврооднушку', plural: 'еврооднушек', genitive: 'еврооднушки', nominative: 'еврооднушка' };\n if (roomCount === 2) flatText = { accusative: 'евродвушку', plural: 'евродвушек', genitive: 'евродвушки', nominative: 'евродвушка' };\n if (roomCount === 3) flatText = { accusative: 'евротрешку', plural: 'евротрешек', genitive: 'евротрешки', nominative: 'евротрешка' };\n }\n\n return {\n small,\n roomsText: {\n accusative: `${small.accusative}${flatText.accusative}`,\n plural: `${small.plural}${flatText.plural}`,\n genitive: `${small.genitive}${flatText.genitive}`,\n nominative: `${small.nominative}${flatText.nominative}`,\n alternativeAccusative: `${small.accusative}${flatText.accusative}`,\n alternativePlural: `${small.plural}${flatText.plural}`,\n }\n };\n}\n\nconst FLOOR_NAME_MAP = new Map([\n [ 2, 'втором' ],\n [ 3, 'третьем' ],\n [ 4, 'четвёртом' ],\n [ 5, 'пятом' ],\n [ 6, 'шестом' ],\n [ 7, 'седьмом' ],\n [ 8, 'восьмом' ],\n [ 9, 'девятом' ],\n [ 10, 'десятом' ],\n [ 11, 'одиннадцатом' ],\n [ 12, 'двенадцатом' ],\n [ 13, 'тринадцатом' ],\n [ 14, 'четырнадцатом' ],\n [ 15, 'пятнадцатом' ],\n [ 16, 'шестнадцатом' ],\n [ 17, 'семнадцатом' ],\n [ 18, 'восемнадцатом' ],\n [ 19, 'девятнадцатом' ],\n [ 20, 'двадцатом' ],\n]);\n\nconst ROOM_TRANSLIT: Record<number, string> = {\n 1: 'одно',\n 2: 'двух',\n 3: 'трёх',\n 4: 'четырёх'\n};\n\nconst BRANCH_NAME_MAP = new Map([\n [ 58, 'зеленой' ],\n [ 4, 'красной' ],\n [ 264, 'серой' ],\n [ 158, 'оранжевой' ],\n [ 101, 'синей' ],\n [ 155, 'фиолетовой' ],\n [ 271, 'салатовой' ],\n [ 234, 'желтой' ],\n [ 305, 'МЦК' ],\n [ 169286, 'МЦД-1' ],\n [ 169288, 'МЦД-2' ]\n]);\n\nconst CIRCLE_FULL_MAP = new Map([\n [ 305, 'Московского центрального кольца' ],\n [ 169286, 'Белорусско-Савёловского диаметра' ],\n [ 169288, 'Курско-Рижского диаметра' ]\n]);\n","/* eslint-disable complexity */\nimport upperFirst from 'lodash/upperFirst';\nimport { AuthorTypeOptions } from '@search/filter-enums/enums';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { seoSearchCommon, seoSearchCommonJoin, SeoSearchCommonProps } from './seoSearchCommon';\n\nexport function seoSearchLand({ params, geos, offersCount, offersSummary, region }: SeoSearchCommonProps) {\n const segment = params.segments;\n const {\n dealTypeText,\n offersCountText,\n geoText,\n regionText,\n nearMetroText,\n priceMaxText,\n generateFaqTexts,\n minPriceText,\n isNonCapitalRegion,\n priceSeo\n } = seoSearchCommon({ params, geos, offersCount, offersSummary, region });\n\n const landText = {\n accusative: 'участок',\n plural: 'земельных участков',\n genitive: 'участков земли',\n nominative: 'земельный участок',\n shortGenitive: 'участков'\n };\n\n const areText = segment?.landAreaMax && segment?.landAreaMin && segment?.landAreaMax === segment?.landAreaMin &&\n areSeoChpuSet.has(segment.landAreaMax) && areSeoChpuSet.has(segment.landAreaMin) ?\n `${segment.landAreaMax}\\u00A0${declensionByNumber(segment.landAreaMax, [ 'сотка', 'сотки', 'соток' ])}` :\n '';\n\n let landStatusText = '';\n const ls = new Set(segment?.landStatus ?? []);\n\n if (ls.has('IZHS')) landStatusText = 'ИЖС';\n if (ls.has('DNP')) landStatusText = 'СНТ, ДНП';\n if (ls.has('AGRICULTURAL')) landStatusText = 'ЛПХ';\n if (ls.has('IZHS') && ls.has('DNP') && ls.has('SNT')) landStatusText = 'для\\u00A0ПМЖ';\n\n let authorText = '';\n const authorFirst = segment?.author?.[0];\n\n // @ts-ignore\n if (authorFirst === AuthorTypeOptions.AGENCY) authorText = 'от\\u00A0агентства';\n // @ts-ignore\n if (authorFirst === AuthorTypeOptions.OWNER) authorText = 'от\\u00A0собственника';\n\n let communicationsText = '';\n\n if (segment?.gas?.[0] && segment?.water?.[0]) {\n communicationsText = 'с\\u00A0газом и\\u00A0водой';\n } else {\n if (segment?.water?.[0]) communicationsText = 'с\\u00A0водой';\n if (segment?.gas?.[0]) communicationsText = 'с\\u00A0газом';\n }\n if (segment?.water?.[0]) communicationsText = 'с\\u00A0водой';\n if (segment?.electricity?.[0]) communicationsText = 'с\\u00A0электричеством';\n if (segment?.heating?.[0]) communicationsText = 'с\\u00A0отоплением';\n if (segment?.sewerage?.[0]) communicationsText = 'с\\u00A0канализацией';\n if (segment?.communications) communicationsText = 'с\\u00A0коммуникациями';\n\n const villageText = priceSeo?.seg === 'v-derevne' ? 'в\\u00A0 деревне' : undefined;\n\n const prefixCommon = seoSearchCommonJoin(\n landStatusText,\n areText,\n authorText,\n communicationsText,\n villageText,\n villageText ? undefined : priceMaxText,\n nearMetroText,\n geoText\n );\n const allCommon = `${prefixCommon}${regionText ? ' ' : ''}${regionText}`;\n\n let pageTitle = seoSearchCommonJoin(upperFirst(dealTypeText.verb), landText.nominative, allCommon);\n\n let metaTitle = `${pageTitle}\\u00A0— ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n landText.plural,\n landStatusText,\n areText\n )} недорого: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n let metaDescription = `🏡 ${pageTitle} по доступной цене. ➜ В\\u00A0каталоге недвижимости ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n landText.genitive,\n landStatusText,\n areText,\n regionText\n )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n\n if (isNonCapitalRegion) {\n pageTitle = seoSearchCommonJoin(upperFirst(dealTypeText.noun), landText.plural, allCommon);\n\n const title = seoSearchCommonJoin(upperFirst(dealTypeText.verb), landText.nominative, allCommon);\n\n metaTitle = `${title}, ${seoSearchCommonJoin(\n dealTypeText.noun,\n landText.plural,\n landStatusText,\n areText\n )} недорого. Найдено ${offersCountText} о\\u00A0${dealTypeText.prepositional} ${landText.shortGenitive} ${allCommon}\n `;\n const description = seoSearchCommonJoin(upperFirst(dealTypeText.proposal), landText.nominative, allCommon);\n\n metaDescription = `${description} по доступной цене. ➜ ${seoSearchCommonJoin(\n pageTitle,\n minPriceText\n )} с описанием объектов, планировок и фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n }\n\n if (ls.has('IZHS')) {\n metaTitle = metaTitle.replace(/земельных участков ИЖС/gi, 'земельных участков под строительство дома');\n // eslint-disable-next-line max-len\n metaDescription = `🏡 ${pageTitle.replace(/ИЖС/gi, 'под строительство дома')} по доступной цене. ➜ В\\u00A0каталоге недвижимости ${\n offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n seoSearchCommonJoin(\n landText.genitive,\n landStatusText,\n areText,\n regionText\n )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n }\n\n const relativeTitle = seoSearchCommonJoin(upperFirst(dealTypeText.verb), 'похожий', landText.accusative, allCommon);\n\n return {\n metaTitle,\n metaDescription,\n pageTitle,\n relativeTitle,\n faqTexts: generateFaqTexts({ segmentText: landText, commonPostfixText: allCommon })\n };\n}\n\nconst areSeoChpuSet = new Set([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 20, 25, 30, 40, 50, 100 ]);\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersCountQuery = graphql`query SearchOffersCountQuery(\n $filters: ProfessionalSearchInput\n) {\n searchOffersSummary(filters: $filters) {\n count\n }\n}\n`;\n","import React from 'react';\nimport { UseAuthError } from '@search/auth/src/useAuth';\nimport { BaseError } from '@search/error/src/BaseError';\n\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport {\n FavoritesMutation$data as FavoritesMutationResponse, FavoritesMutation$variables as FavoritesMutationVariables\n} from './__generated__/FavoritesMutation.graphql';\n\nconst favoritesMutation = graphql`\n mutation FavoritesMutation($offerId: ID!, $isFavorite: Boolean!, $noteText: String) {\n editFavoritePersonal2(isFavorite: $isFavorite, noteText: $noteText, offerId: $offerId) {\n firstError {\n __typename\n ... on BaseError {\n message\n }\n ... on AuthUserIdError {\n message\n }\n ... on FavoritesErrorLimitExceeded {\n count\n }\n ... on FavoritesErrorNoteTextSizeExceeded {\n count\n }\n ... on FavoritesErrorNoteEmpty {\n message\n }\n }\n }\n }\n`;\n\nconst stateMap = new Map<string, boolean>();\n\nexport function useFavoritesMutationSafe() {\n const { authScheduler } = useM2AuthContext();\n const favoritesMutationCb = useFavoritesMutation();\n\n const favoritesMutationSafe = React.useMemo(\n () => {\n const register = authScheduler.register('favoritesMutation', favoritesMutationCb);\n\n return {\n ...register,\n argsById(id: string) {\n return register.args().find(arg => arg.offerId === id);\n }\n };\n },\n [ favoritesMutationCb ]\n );\n\n return favoritesMutationSafe;\n}\n\nexport function useFavoritesMutation() {\n const gql = useGqlContext();\n\n return React.useCallback(async (props: FavoritesMutationVariables) => {\n const data = await gql.execute<FavoritesMutationVariables, FavoritesMutationResponse>(\n favoritesMutation,\n {\n ...props\n }\n );\n\n const fe = data.data?.editFavoritePersonal2.firstError;\n\n if (fe?.__typename === 'AuthUserIdError') throw new UseAuthError('AuthUserIdError', { cause: fe });\n\n if (fe?.__typename === 'FavoritesErrorLimitExceeded') {\n throw new BaseError('FavoritesErrorLimitExceeded', { cause: fe });\n }\n\n if (fe?.__typename === 'FavoritesErrorNoteTextSizeExceeded') {\n throw new BaseError('FavoritesErrorNoteTextSizeExceeded', { cause: fe });\n }\n if (fe?.__typename === 'FavoritesErrorNoteEmpty') throw new BaseError('FavoritesErrorNoteEmpty', { cause: fe });\n\n return data;\n }, [ gql ]);\n}\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersQuery = graphql`\n fragment SearchOffersQueryNBInfoItemFields on InfoItem {\n weight\n label\n snippetLabel\n value\n snippetValue\n }\n\n query SearchOffersQuery(\n $regionId: Int!,\n $paging: PagingInput!,\n $sort: [SortInput!],\n $skipGeo: Boolean!,\n $skipNb: Boolean!,\n $nbId: Int!,\n $geos: [GeoSlugInput!]!,\n $filters: ProfessionalSearchInput,\n $realtyObject: RealtyObjectEnum!,\n $pathName: String,\n $touch: Boolean!,\n $skipSeoCloudBack: Boolean!,\n $limit: Int!,\n $onlyUnique: Boolean!,\n $skipLastSearch: Boolean!\n ) {\n mortgageBannerMinutesVariant: randomNumber(from: 0, to: 2) {\n value\n }\n mortgageBannerTextVariant: randomNumber(from: 0, to: 1) {\n value\n }\n userDetails {\n userId\n phone\n hasOfferWithoutVas\n }\n geo(regionId: $regionId) @skip(if: $skipGeo) {\n metro {\n id\n title\n kind\n lines\n mainName\n interchangedStations\n lines\n shortDisplayName\n locativeDisplayName\n route {\n id\n }\n }\n\n lines {\n id\n title\n kind\n shortDisplayName\n color\n }\n\n districts {\n kind\n parentId\n displayName\n mainName\n translit\n shortDisplayName\n locative\n title\n id\n isIntracity,\n narrowRegion {\n id\n }\n }\n }\n geo2(geos: $geos) {\n items {\n __typename\n ... on BaseLoaderItemError {\n itemId\n }\n ... on GeoObject {\n kind\n parentId\n displayName\n mainName\n translit\n shortDisplayName\n locative\n title\n id\n isIntracity\n locality {\n id\n title\n locative\n }\n narrowRegion {\n id\n }\n }\n }\n }\n searchOffersSummary(filters: $filters) {\n formattedRealty(realtyObject: $realtyObject)\n count\n priceRange {\n from\n to\n }\n formattedPriceRange\n formattedPriceFrom\n formattedPricePerUnitRange\n formattedAreaRange\n formattedAveragePrice\n ratingValue\n bestRating\n reviewCount\n avgPricePerUnit\n }\n\n searchOffersSeo(filters: $filters, pathName: $pathName) {\n h1\n metaTitle\n metaDescription\n autotext\n }\n\n newBuilding(\n id: $nbId\n ) @skip(if: $skipNb) {\n id\n gallery {\n main {\n large\n originPath\n }\n }\n hasPreferentialMortgage\n buildingClass {\n label\n value\n fullLabel\n }\n title {\n nominative\n }\n buildingStatus {\n title\n isFrozen\n }\n routes(type: [ METRO ]) {\n ...on RouteMetro {\n station {\n id\n name\n lines\n }\n timeMinutes\n transportType\n }\n }\n address\n snippetDescription\n developerCards {\n developer {\n id\n title\n icon {\n origin\n }\n translitTitle\n }\n }\n coordinates\n routeParams {\n region\n regionId\n subRegion\n type\n name\n id\n }\n offersSeo {\n h1\n }\n info {\n commissioningDate {\n ...SearchOffersQueryNBInfoItemFields\n }\n buildingClass {\n ...SearchOffersQueryNBInfoItemFields\n }\n totalCount {\n ...SearchOffersQueryNBInfoItemFields\n }\n apartments {\n ...SearchOffersQueryNBInfoItemFields\n }\n }\n isFavorite\n ranking\n priceMin\n }\n\n searchOffers(paging: $paging, sort: $sort, filters: $filters) {\n paging {\n total\n pageNumber\n pageSize\n hasNext\n }\n\n seoTags {\n watchAlso @skip(if: $skipSeoCloudBack) {\n title\n url\n }\n recommended {\n title\n url\n count\n }\n }\n\n items {\n id\n description\n noteText\n isFavorite\n isHidden\n isFavoriteVisible\n isMortgageAllowed\n onlineView\n fromCian\n mortgagePurpose\n hasSubscription\n text {\n titleSnippet\n titleCard\n slug\n }\n stats {\n isViewed\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n currency\n rubPrice\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedFull\n }\n }\n }\n hasBankPledge\n sellType\n bargainAllowed {\n formatted\n }\n mortgageAllowed\n }\n ... on ProfOfferDealRent {\n commission {\n formatted\n }\n bargainAllowed {\n formatted\n }\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedFull\n }\n }\n }\n period\n utilities {\n formatted\n }\n livingTenantRequirements {\n childrenAllowed {\n formatted\n }\n petsAllowed {\n formatted\n }\n }\n hasPrepayment {\n formatted\n }\n hasDeposit {\n formatted\n }\n }\n }\n gallery {\n baseUrl\n mainImage {\n originPath\n preview1\n preview2\n attributesType\n }\n images {\n originPath\n preview1\n preview2\n medium\n small\n large\n attributesType\n }\n }\n status {\n isDeleted\n createdActualizeFormatted\n createdAt {\n formattedAutoDate\n }\n actualizedAt {\n formattedAutoDate\n }\n visibility\n cluster {\n id\n tailSize\n }\n hasAnyPriority\n hasTop\n hasHighlight\n vas {\n valueCase\n }\n }\n infrastructure {\n parking {\n type\n }\n }\n realtyObject {\n __typename\n ... on ProfOfferFlat {\n flatType\n totalArea {\n formatted\n value\n unit\n }\n kitchenArea {\n value\n unit\n }\n livingArea {\n formatted\n }\n roomsCount\n roomType\n floor\n livingFacilities {\n hasAirConditioner\n hasDishwasher\n hasFridge\n hasFurniture\n hasInternet\n hasInternet\n hasKitchenFurniture\n hasTv\n hasWashingMachine\n }\n characteristics {\n hasBalcony\n ceilingHeightM\n bathroomType\n renovationType\n }\n building {\n buildingId\n newBuildingId\n isNewbuilding\n floorsTotal\n wallsType\n newBuildingBasicInfo {\n title\n slug @skip(if: $touch)\n }\n newBuildingStatus {\n builtYear\n formattedInProgress\n }\n }\n }\n ... on ProfOfferRoom {\n roomCount\n livingArea {\n formatted\n value\n unit\n }\n enclosingFlat {\n flatType\n totalArea {\n formatted\n value\n unit\n }\n kitchenArea {\n value\n unit\n }\n livingArea {\n formatted\n }\n roomsCount\n roomType\n floor\n livingFacilities {\n hasAirConditioner\n hasDishwasher\n hasFridge\n hasFurniture\n hasInternet\n hasInternet\n hasKitchenFurniture\n hasTv\n hasWashingMachine\n }\n characteristics {\n hasBalcony\n ceilingHeightM\n bathroomType\n renovationType\n }\n building {\n buildingId\n isNewbuilding\n floorsTotal\n wallsType\n newBuildingStatus {\n builtYear\n }\n }\n }\n }\n ... on ProfOfferHouse {\n category2 {\n formatted\n value\n }\n totalArea {\n value\n unit\n formatted\n }\n livingFacilities {\n hasAirConditioner\n hasDishwasher\n hasFridge\n hasFurniture\n hasInternet\n hasInternet\n hasKitchenFurniture\n hasTv\n hasWashingMachine\n }\n floorsTotal\n builtYear\n hasBathroom\n bathroomLocationType\n hasHeating\n heatingType\n land {\n area {\n formatted\n }\n supply {\n hasGas\n hasWater\n hasElectricity\n hasSewerage\n }\n status\n }\n roomsCount\n }\n ... on ProfOfferLand {\n area {\n value\n unit\n formatted\n }\n supply {\n hasGas\n hasWater\n hasElectricity\n hasSewerage\n }\n status\n }\n }\n badges {\n isRgrMember\n }\n location {\n formattedAddressLong\n cityCenterInfo {\n metersToCentralSquare\n locatedInCenter\n }\n formattedAddressShort\n clickableAddress {\n id\n translit\n name\n kind\n }\n clickableAddressShort {\n id\n translit\n name\n kind\n }\n narrowRegion {\n id\n name\n }\n wideDistrict {\n id\n translit\n name\n }\n narrowDistrict {\n id\n translit\n name\n }\n locality {\n id\n translit\n name\n }\n street {\n id\n translit\n name\n }\n house {\n id\n translit\n name\n }\n coordinates {\n latitude\n longitude\n }\n routesList {\n ... on RouteMetro {\n timeMinutes\n transportType\n station {\n id\n name\n allRoutesColorsList\n }\n }\n }\n isMskMO\n isSPbLO\n }\n seller {\n ownerId\n name\n organizationName\n sellerType\n logo {\n preview2\n origin\n }\n placementUserId\n isZhekaLogo\n mainPhone {\n countryCode\n number\n hiddenSuffixLength\n formattedNumber\n }\n phoneList {\n countryCode\n number\n hiddenSuffixLength\n formattedNumber\n }\n }\n isNewBuildingPaid\n newBuildingCard {\n ranking\n title {\n nominative\n genitive\n }\n developerCards {\n developer {\n isSamolet\n title\n url\n }\n }\n buildings {\n id\n address\n }\n }\n }\n similarNb {\n id\n description\n text {\n titleSnippet\n slug\n }\n gallery {\n mainImage {\n originPath\n preview1\n small\n attributesType\n }\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n rubPrice\n formatted\n currency\n areaUnit\n }\n }\n }\n location {\n formattedAddressLong\n formattedAddressShort\n routesList {\n ... on RouteMetro {\n timeMinutes\n transportType\n station {\n id\n name\n allRoutesColorsList\n }\n }\n }\n isMskMO\n isSPbLO\n }\n realtyObject {\n __typename\n ... on ProfOfferFlat {\n building {\n buildingId\n newBuildingBasicInfo {\n title\n }\n newBuildingStatus {\n formattedInProgress\n isKeysComingSoonBadge\n isDoneBadge\n }\n }\n }\n }\n }\n emptyResultTitle\n }\n getLastSearches(limit: $limit, onlyUnique: $onlyUnique) @skip(if: $skipLastSearch) {\n lastSearches {\n searchText\n searchUrl\n }\n }\n}\n`;\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable no-nested-ternary */\nimport React from 'react';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { RentPeriod } from '@search/filter-enums/enums/RentPeriod';\nimport { SellerType } from '@search/filter-enums/enums/SellerType';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { SearchRoute, useRouter, OfferRoute as OfferRouteType, SearchMapRoute, IOfferType } from '@search/offer-search-routes/src';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { useGql2Loader, Gql2CacheInfoCallback, gql2CreateCachedFetcher } from '@search/gql-client/src/useGql2';\nimport type { GqlClientOptions, GqlClient } from '@search/gql-client/src/GqlClient';\nimport { regionFromLocation } from '@search/geo/src/regionFromLocation';\nimport { useClGeoRootRegion } from '@search/geo/src/clGeoRootRegion/useClGeoRootRegion';\nimport { useOfferSessionVisited } from '@search/common-core/src/useSessionStorage';\nimport type { PriceHistoryPart } from '../../../../../view/common/components/Price/PriceHistory/PriceHistoryPart';\nimport { MetroStationBase } from '../../../../geo/MetroStation';\nimport { ClassifiedAnalytics } from '../../../analytics/ClassifiedAnalytics';\nimport type { OfferType } from '../OfferQuery';\nimport {\n AreaUnitEnum,\n SearchOffersQuery$data as SearchOffersQueryResponse,\n SearchOffersQuery$variables as SearchOffersQueryVariables,\n TransportTypeEnum,\n CurrencyEnum\n} from './__generated__/SearchOffersQuery.graphql';\nimport { SearchOffersQuery } from './SearchOffersQuery';\nimport { areaUnitCompat } from './helpers/areaCompat';\n\nconst cacheInfo: Gql2CacheInfoCallback<\n 'skipGeo' | 'skipNb',\n SearchOffersQueryVariables,\n SearchOffersQueryResponse\n> = v => ({\n skipGeo: {\n responseKey: 'geo',\n cacheKey: String(\n v.regionId === RegionIdEnum.MSK_OBL ?\n RegionIdEnum.MSK_AND_MSK_OBL :\n (\n v.regionId === RegionIdEnum.LEN_OBL ?\n RegionIdEnum.SPB_AND_LEN_OBL :\n v.regionId\n )\n ) + 'id-' + String(v.geos?.join('.') ?? '')\n },\n skipNb: {\n responseKey: 'newBuilding',\n cacheKey: v.filters?.newBuildingIds?.length ? v.filters.newBuildingIds.join('.') : undefined\n }\n});\n\nconst cachePrefix = 'SearchOffers';\n\nfunction createSearchOffersFetcher({ gql, isMobile = false }: {\n gql: GqlClient;\n isMobile?: boolean;\n}) {\n return (vars: Omit<SearchOffersQueryVariables, 'geos'> & {\n geos?: readonly (number | string)[];\n }, opts?: GqlClientOptions) => {\n return gql.client<\n SearchOffersQueryVariables,\n SearchOffersQueryResponse\n >(SearchOffersQuery, {\n ...vars,\n geos: vars.geos?.map(rec => typeof rec === 'number' ?\n { smart: String(rec), regionId: undefined } :\n { smart: rec, regionId: vars.filters?.regionId }\n ) ?? [],\n touch: isMobile\n }, opts);\n };\n}\n\nfunction useSearchOffersFetcher(isMobile?: boolean) {\n const gql = useGqlContext();\n\n return React.useCallback(createSearchOffersFetcher({ gql, isMobile }), [ gql ]);\n}\n\nexport function useSearchOffersLoader(isMobile?: boolean) {\n const loader = useGql2Loader(useSearchOffersFetcher(isMobile), { cacheInfo, cachePrefix });\n const rootRegions = useClGeoRootRegion();\n\n return React.useCallback((props: Parameters<typeof loader>[0]) => {\n const res = loader(props);\n const data = res.data;\n const regionId = props.filters?.regionId ?? 3;\n\n data?.geo?.districts.forEach(geo => rootRegions.slugs.add(geo, regionId));\n // data?.geo2?.items.forEach(geo => rootRegions.slugs.add(geo, regionId));\n // data?.searchOffers.geoArgs?.forEach(geo => rootRegions.slugs.add(geo, regionId));\n data?.searchOffers.items.forEach(item => item.location && rootRegions.slugs.addLocation(item.location));\n\n return res;\n }, [ rootRegions, loader ]);\n}\n\nexport type SearchOffersLoader = ReturnType<typeof useSearchOffersLoader>;\n\nexport type SearchOffers = SearchOffersQueryResponse['searchOffers'];\nexport type OfferSnippetModel = SearchOffers['items'][number];\nexport type LastSearches = NonNullable<SearchOffersQueryResponse['getLastSearches']>['lastSearches'];\nexport type OfferSimilarNb = NonNullable<NonNullable<SearchOffersQueryResponse['searchOffers']['similarNb']>[number]>;\n\nexport function useOfferVisited(model: { id?: string; stats?: { isViewed?: boolean | null } | null }) {\n const visitedValue = useOfferSessionVisited();\n\n const isVisited = model?.id ? (model.stats?.isViewed || visitedValue(model.id)) : undefined;\n\n const enableIsVisited = React.useCallback(() => {\n if (model?.id) visitedValue(model.id, true);\n }, [ model?.id, visitedValue ]);\n\n return { isVisited, enableIsVisited };\n}\n\nexport function useOfferCompat(model: OfferSnippetModel) {\n const addresses = useHandyAddressCompat({ ...model, clickableAddress: model.location.clickableAddressShort });\n const realtyObject = model.realtyObject;\n const dealType = model.dealType;\n\n const seller = sellerCompat(model.seller);\n\n const isSellFlat = realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell';\n const isNewBuilding = (isSellFlat && realtyObject.building?.isNewbuilding) ?? false;\n const isNewBuildingDeveloperFlat = isNewBuilding && model.seller.sellerType === 'DEVELOPER';\n const hasAnyPriority = model.status?.hasAnyPriority ?? false;\n const isPledge = (dealType?.__typename === 'ProfOfferDealSell' && dealType.hasBankPledge) ?? false;\n const isPit = model.seller.sellerType === 'PIT';\n const onlineView = model.onlineView ?? false;\n const description = model.description;\n const regionId = regionFromLocation(model.location) ?? RegionIdEnum.MSK;\n const price = priceCompat(dealType);\n const coordinates = model.location.coordinates;\n const pictures = model?.gallery?.images.map((photo, index) => ({\n id: `${index}`,\n originPath: photo.originPath,\n // src: photo.preview1 ?? photo.preview2,\n // src2x: photo.small ?? photo.medium,\n // large: photo.large,\n description: model.text?.titleCard ?? '',\n attributesType: photo.attributesType\n })) ?? [];\n\n const offerRoutes = useOfferRouteListCompat(model);\n const metersToCentralSquare = model.location.cityCenterInfo?.metersToCentralSquare;\n const locatedInCenter = model.location.cityCenterInfo?.locatedInCenter ?? false;\n const metersToCenter = metersToCentralSquare && metersToCentralSquare <= 30000 ?\n String(Math.round(metersToCentralSquare / 100) / 10).replace('.', ',') :\n undefined;\n\n return {\n formattedAddress: model.location.formattedAddressLong,\n formattedAddressShort: model.location.formattedAddressShort,\n offerSnippetClickGtmId: getOfferSnippetClickGtmId(model),\n offerPhoneClickGtmId: getOfferPhoneClickGtmId(model),\n addresses,\n realtyObject,\n dealType,\n seller,\n isNewBuilding,\n isNewBuildingDeveloperFlat,\n hasAnyPriority,\n isPledge,\n description,\n regionId,\n price,\n coordinates,\n pictures,\n offerRoutes,\n metersToCenter,\n locatedInCenter,\n isPit,\n onlineView,\n isSellFlat\n };\n}\n\n// eslint-disable-next-line no-undef\nconst history = typeof window === 'undefined' ? undefined : window.history;\n\nexport function useOfferCardLink(\n model?: {\n id: string;\n text?: null | {\n slug?: string;\n };\n location: {\n narrowRegion?: {\n id: number;\n } | null;\n };\n } | null\n) {\n const id = model?.id;\n const router = useRouter();\n const route = router.route(OfferRouteType);\n\n const routeParams: IOfferType | undefined = React.useMemo(() => model ? {\n offerId: model.id,\n slug: model.text?.slug,\n region: model.location.narrowRegion?.id ?? RegionIdEnum.MSK\n } : undefined, [ id ]);\n\n const gql = useGqlContext();\n\n const offerUrl = React.useMemo(\n () => {\n try {\n return routeParams ? route.url(routeParams) : undefined;\n } catch (e) {\n e.message += ` offerId: ${id}`;\n throw e;\n }\n },\n [ routeParams, route, id ]\n );\n\n const gotoOffer = React.useCallback(<V>() => {\n route.push(routeParams);\n }, [ routeParams, route, gql, id ]);\n\n const gotoBackRaw = React.useCallback(() => {\n history?.back();\n }, [ ]);\n const gotoBack = (history?.length ?? 0) > 1 ? gotoBackRaw : undefined;\n\n return {\n offerUrl,\n gotoBack,\n gotoOffer\n };\n}\n\ntype ClickableAddress = {\n id: number;\n name: string;\n kind: string;\n}\n\nconst getKindParam = (address: ClickableAddress, regionId?: number) => {\n if (\n address.id === regionId ||\n address.id === RegionIdEnum.SPB ||\n address.id === RegionIdEnum.SPB_AND_LEN_OBL ||\n address.id === RegionIdEnum.LEN_OBL ||\n address.id === RegionIdEnum.MSK ||\n address.id === RegionIdEnum.MSK_AND_MSK_OBL ||\n address.id === RegionIdEnum.MSK_OBL\n ) {\n return { region: address.id };\n }\n\n switch (address.kind) {\n case 'PROVINCE':\n return { region: address.id };\n\n case 'DISTRICT':\n return { districtIds: [ address.id ] };\n\n case 'LOCALITY':\n case 'STREET':\n case 'HOUSE':\n return { addresses: [ address.id ] };\n\n default: return undefined;\n }\n};\n\nexport const useHandyAddressCompat = ({\n dealType,\n realtyObject,\n location,\n clickableAddress,\n id\n}: {\n id: string;\n dealType: Parameters<typeof dealTypeFilterCompat>[0];\n realtyObject?: Parameters<typeof realtyObjectFilterCompat>[0];\n clickableAddress?: readonly (\n NonNullable<OfferSnippetModel['location']['clickableAddress']>[number] & { isInRoute?: boolean }\n )[] | null;\n location: Parameters<typeof regionFromLocation>[0];\n}) => {\n const router = useRouter();\n const searchRoute = router.route(SearchRoute);\n const params = router.paramsSafe(SearchRoute) ?? router.paramsSafe(SearchMapRoute);\n\n return React.useMemo(() => {\n if (! clickableAddress) return [];\n\n const region = regionFromLocation(location) ?? RegionIdEnum.MSK;\n const baseRouteParams = {\n region,\n dealType: dealTypeFilterCompat(dealType),\n categoryType: realtyObjectFilterCompat(realtyObject)\n };\n\n const geoIds = params ? new Set([\n ...params.districtIds,\n ...params.metroIds,\n ...params.addresses,\n params.region\n ]) : null;\n\n const addresses = clickableAddress.map(item => {\n try {\n let isAddressInRoute = item.isInRoute || (geoIds && geoIds.has(item.id));\n\n // if (item.kind === 'PROVINCE' && ! geoIds?.size) isAddressInRoute = true;\n // if (item.id === region && ! geoIds?.size) isAddressInRoute = true;\n\n const params2 = getKindParam(item, region);\n\n const href = searchRoute.url({\n ...baseRouteParams,\n ...params2\n });\n\n if (router.location.href.startsWith(href)) isAddressInRoute = true;\n\n return {\n content: item.name,\n href: isAddressInRoute ? undefined : href,\n isNofollowLink: item.kind === 'HOUSE'\n };\n } catch (e) {\n e.message += ` offerId: ${id}`;\n throw e;\n }\n });\n\n return addresses;\n }, [ id, params ]);\n};\n\nexport function dealTypeFilterCompat(\n dealType: Pick<NonNullable<OfferSnippetModel['dealType']>, '__typename'> | null | undefined\n): DealType {\n switch (dealType?.__typename) {\n case 'ProfOfferDealRent': return DealType.RENT;\n default: return DealType.SELL;\n }\n}\n\nexport function dealTypeCompat(dealType: OfferSnippetModel['dealType']): DealType {\n switch (dealType?.__typename) {\n case 'ProfOfferDealRent': return DealType.RENT;\n default: return DealType.SELL;\n }\n}\n\nexport function dealTypePeriodCompat(dealType: OfferSnippetModel['dealType']): RentPeriod | undefined {\n if (dealType?.__typename !== 'ProfOfferDealRent') return undefined;\n\n switch (dealType.period) {\n case 'DAY': return RentPeriod.DAY;\n case 'MONTH': return RentPeriod.MONTH;\n case 'YEAR': return RentPeriod.YEAR;\n default: return undefined;\n }\n}\n\nexport function realtyObjectFilterCompat(\n realtyObject: Pick<NonNullable<OfferSnippetModel['realtyObject']>, '__typename'> | undefined | null\n): RealtyObjectType {\n switch (realtyObject?.__typename) {\n case 'ProfOfferFlat': return RealtyObjectType.FLAT;\n case 'ProfOfferRoom': return RealtyObjectType.ROOM;\n case 'ProfOfferHouse': return RealtyObjectType.HOUSE;\n case 'ProfOfferLand': return RealtyObjectType.LAND;\n default: return RealtyObjectType.FLAT;\n }\n}\n\nexport function priceCompat(dealType?: OfferSnippetModel['dealType']) {\n if (dealType?.__typename !== 'ProfOfferDealSell' && dealType?.__typename !== 'ProfOfferDealRent') return;\n\n if (! dealType.price) return;\n\n return price2Compat(dealType.price);\n}\n\nexport function price2Compat(\n price: {\n value: number;\n history?: (readonly PriceHistoryPart[]) | null;\n rubPrice?: number | null;\n currency: CurrencyEnum;\n areaUnit: AreaUnitEnum | null;\n formatted?: string;\n formattedWithCurrency?: string; // for Rent\n },\n divider = 100\n) {\n const currency = price.currency === 'UNKNOWN' || ! price.currency ?\n Currency.RUB :\n Currency[price.currency];\n\n return {\n value: Math.ceil(price.value / divider),\n rubPrice: price.rubPrice ? Math.ceil(price.rubPrice / divider) : undefined,\n history: price.history,\n currency,\n formatted: price.formatted ?? price.formattedWithCurrency,\n areaUnit: areaUnitCompat(price.areaUnit)\n };\n}\n\nexport interface OfferRoute {\n metro: MetroStationBase;\n url?: string;\n transportType: TransportType;\n timeMinutes: number;\n}\n\nfunction transportTypeCompat(transport?: TransportTypeEnum | null): TransportType {\n switch (transport) {\n case 'PUBLIC_TRANSPORT': return TransportType.PUBLIC_TRANSPORT;\n case 'FOOT': return TransportType.FOOT;\n default: return TransportType.UNKNOWN;\n }\n}\n\nexport function useOfferRouteListCompat(\n offer: {\n id: string;\n dealType: OfferSnippetModel['dealType'];\n realtyObject: OfferSnippetModel['realtyObject'];\n location: {\n routesList: OfferSnippetModel['location']['routesList'];\n narrowRegion: OfferSnippetModel['location']['narrowRegion'];\n };\n }\n): OfferRoute[] {\n const router = useRouter();\n\n return React.useMemo(() => {\n const routes = offer.location.routesList;\n const result: OfferRoute[] = [];\n const searchRoute = router.route(SearchRoute);\n\n for (const route of routes ?? []) {\n if (! route.timeMinutes || ! route.station) continue;\n\n const metro: MetroStationBase = {\n id: route.station.id,\n allRoutesColorsList: route.station.allRoutesColorsList ?? [],\n title: route.station.name\n };\n\n const url = searchRoute.prevParams?.metroIds.includes(metro.id) ? undefined : searchRoute.url({\n dealType: dealTypeFilterCompat(offer.dealType),\n categoryType: realtyObjectFilterCompat(offer.realtyObject),\n region: regionFromLocation(offer.location) ?? RegionIdEnum.MSK,\n metroIds: [ metro.id ],\n seoMortgageAllowed: false\n });\n\n result.push({\n url,\n timeMinutes: route.timeMinutes,\n transportType: transportTypeCompat(route.transportType),\n metro\n });\n }\n\n return result;\n }, [ offer.id, router ]);\n}\n\nexport function sellerCompat(seller: OfferSnippetModel['seller'] | OfferType['seller']) {\n return {\n icon: seller.isZhekaLogo ? seller.logo?.origin : undefined,\n name: seller.name ?? '',\n organizationName: seller.organizationName ?? '',\n sellerType: SellerType[seller.sellerType]\n };\n}\n\nexport function getOfferSnippetClickGtmId(\n {\n seller, realtyObject, dealType, status\n }: Pick<OfferSnippetModel, 'seller' | 'realtyObject' | 'dealType' | 'status'>\n): ClassifiedAnalytics | undefined {\n if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n if (seller?.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SaleFlatOpenNewDevOffer;\n }\n\n if (realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SaleFlatOpenNewOffer;\n }\n\n if (status?.hasHighlight) {\n return ClassifiedAnalytics.SaleOpenHighlightOffer;\n }\n\n if (status?.hasAnyPriority) {\n return ClassifiedAnalytics.SaleOpenPaidOffer;\n }\n\n return ClassifiedAnalytics.SaleFlatOpenSecondOffer;\n }\n\n if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealRent') {\n if (realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.RentFlatOpenNewOffer;\n }\n\n return ClassifiedAnalytics.RentFlatOpenSecondOffer;\n }\n\n if (status?.hasHighlight && dealType?.__typename === 'ProfOfferDealSell') {\n return ClassifiedAnalytics.SaleOpenHighlightOffer;\n }\n\n if (status?.hasAnyPriority && dealType?.__typename === 'ProfOfferDealSell') {\n return ClassifiedAnalytics.SaleOpenPaidOffer;\n }\n\n if (! status?.hasAnyPriority && dealType?.__typename === 'ProfOfferDealSell') {\n return ClassifiedAnalytics.SaleOpenSecondOffer;\n }\n\n return undefined;\n}\n\nexport function getOfferSimilarGtmIds(\n {\n seller, realtyObject, dealType, status, isMortgageAllowed\n }: Pick<OfferSnippetModel, 'seller' | 'realtyObject' | 'dealType' | 'status' | 'isMortgageAllowed'>\n): { mortgage: string; phoneShown: string; click: string } {\n const analytics = {\n mortgage: '',\n phoneShown: '',\n click: ''\n };\n\n if (isMortgageAllowed) {\n analytics.mortgage = 'classified_card_similar_sale_view_ipoteka_link';\n }\n\n // Вторичка\n analytics.click = 'classified_card_similar_click_open_second_offer';\n analytics.phoneShown = 'classified_card_similar_sale_show_tel';\n\n // Вторичка VAS\n if (status?.hasAnyPriority) {\n analytics.click = 'classified_card_similar_click_open_second_vas_offer';\n analytics.phoneShown = 'classified_card_similar_sale_vas_show_tel';\n }\n\n if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n if (realtyObject.building?.isNewbuilding) {\n analytics.click = 'classified_card_similar_click_open_new_offer';\n analytics.phoneShown = 'classified_card_similar_new_show_tel';\n }\n\n if (seller?.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n analytics.click = 'classified_card_similar_click_open_new_dev_offer';\n analytics.phoneShown = 'classified_card_similar_new_dev_show_tel';\n }\n }\n\n if (dealType?.__typename === 'ProfOfferDealRent') {\n analytics.click = 'classified_card_similar_click_rent_open_second_offer';\n analytics.phoneShown = 'classified_card_similar_rent_show_tel';\n }\n\n return analytics;\n}\n\nfunction getOfferPhoneClickGtmId(\n { seller, realtyObject, dealType, status, isNewBuildingPaid }: OfferSnippetModel\n) {\n if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n if (isNewBuildingPaid && seller.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SearchSaleFromDevPaidShowTel;\n }\n if (seller.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SearchSaleFromDevShowTel;\n }\n\n if (realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SearchSaleNewShowTel;\n }\n\n if (status?.hasHighlight) {\n return ClassifiedAnalytics.SearchSaleHighlightShowTel;\n }\n\n if (status?.hasAnyPriority) {\n return ClassifiedAnalytics.SearchSalePaidShowTel;\n }\n\n return ClassifiedAnalytics.SearchSaleShowTel;\n }\n\n if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealRent') {\n if (realtyObject.building?.isNewbuilding) {\n return ClassifiedAnalytics.SearchRentNewShowTel;\n }\n\n return ClassifiedAnalytics.SearchRentShowTel;\n }\n\n if (dealType?.__typename === 'ProfOfferDealSell') {\n if (status?.hasHighlight) {\n return ClassifiedAnalytics.SearchSaleHighlightShowTel;\n }\n\n if (status?.hasAnyPriority) {\n return ClassifiedAnalytics.SearchSalePaidShowTel;\n }\n\n return ClassifiedAnalytics.SearchSaleShowTel;\n }\n\n if (dealType?.__typename === 'ProfOfferDealRent') {\n return ClassifiedAnalytics.SearchRentShowTel;\n }\n\n return undefined;\n}\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersMapQuery = graphql`query SearchOffersMapQuery(\n $regionId: Int!,\n $nbId: Int!,\n $skipGeo: Boolean!,\n $skipNb: Boolean!,\n $geoIds: [Int!],\n $filters: ProfessionalSearchInput,\n $taglessOnly: Boolean!,\n) {\n newBuilding(\n id: $nbId\n ) @skip(if: $skipNb) {\n offersSeo {\n h1\n }\n }\n geo(regionId: $regionId, geoIds: $geoIds) @skip(if: $skipGeo) {\n metro {\n id\n title\n kind\n lines\n mainName\n interchangedStations\n lines\n shortDisplayName\n locativeDisplayName\n route {\n id\n }\n }\n\n lines {\n id\n title\n kind\n color\n }\n\n districts {\n kind\n parentId\n displayName\n mainName\n shortDisplayName\n locative\n title\n id\n isIntracity\n narrowRegion {\n id\n }\n }\n }\n searchOffersCount(filters: $filters) {\n count\n }\n searchOffersMap(filters: $filters, taglessOnly: $taglessOnly) {\n tileUrl @skip(if: $taglessOnly)\n points {\n __typename\n ... on TaglessOfferPoint {\n geoHash\n coordinates {\n latitude\n longitude\n }\n }\n ... on MultiOfferPointFlat {\n id\n addressId\n geoHash\n count\n coordinates {\n latitude\n longitude\n }\n minPriceRub\n minPrice {\n value\n currency\n areaUnit\n }\n minArea {\n unit\n value\n }\n maxArea {\n unit\n value\n }\n isNewBuilding\n hasHighlight\n }\n ... on MultiOfferPointRoom {\n id\n addressId\n geoHash\n count\n coordinates {\n latitude\n longitude\n }\n minPriceRub\n minPrice {\n value\n currency\n areaUnit\n }\n minArea {\n unit\n value\n }\n maxArea {\n unit\n value\n }\n isNewBuilding\n hasHighlight\n }\n ... on MultiOfferPointHouse {\n id\n addressId\n geoHash\n count\n coordinates {\n latitude\n longitude\n }\n minPriceRub\n minPrice {\n value\n currency\n areaUnit\n }\n minArea {\n unit\n value\n }\n maxArea {\n unit\n value\n }\n isNewBuilding\n hasHighlight\n }\n ... on MultiOfferPointLand {\n id\n addressId\n geoHash\n count\n coordinates {\n latitude\n longitude\n }\n minPriceRub\n minPrice {\n value\n currency\n areaUnit\n }\n minArea {\n unit\n value\n }\n maxArea {\n unit\n value\n }\n isNewBuilding\n hasHighlight\n }\n ... on SingleOfferPointFlat {\n offer {\n id\n isFavorite\n stats {\n isViewed\n }\n location {\n narrowRegion {\n id\n }\n coordinates {\n latitude\n longitude\n }\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n ... on ProfOfferDealRent {\n utilities {\n has\n }\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n }\n gallery {\n baseUrl\n mainImage {\n originPath\n medium\n preview1\n }\n images {\n originPath\n medium\n preview1\n }\n }\n realtyObject {\n __typename\n ... on ProfOfferFlat {\n roomType\n building {\n isNewbuilding\n floorsTotal\n }\n characteristics {\n floor\n }\n totalArea {\n value\n unit\n }\n }\n }\n status {\n hasHighlight\n }\n }\n }\n\n ... on SingleOfferPointRoom {\n offer {\n id\n isFavorite\n stats {\n isViewed\n }\n location {\n narrowRegion {\n id\n }\n coordinates {\n latitude\n longitude\n }\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n ... on ProfOfferDealRent {\n utilities {\n has\n }\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n }\n gallery {\n baseUrl\n mainImage {\n originPath\n preview1\n }\n images {\n originPath\n preview1\n }\n }\n realtyObject {\n __typename\n ... on ProfOfferRoom {\n livingArea {\n value\n unit\n }\n enclosingFlat {\n floor\n building {\n isNewbuilding\n floorsTotal\n }\n }\n }\n }\n status {\n hasHighlight\n }\n }\n }\n\n ... on SingleOfferPointHouse {\n offer {\n id\n isFavorite\n stats {\n isViewed\n }\n location {\n narrowRegion {\n id\n }\n coordinates {\n latitude\n longitude\n }\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n ... on ProfOfferDealRent {\n utilities {\n has\n }\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n }\n gallery {\n baseUrl\n mainImage {\n originPath\n preview1\n }\n images {\n originPath\n preview1\n }\n }\n realtyObject {\n __typename\n ... on ProfOfferHouse {\n totalArea {\n value\n unit\n }\n land {\n area {\n value\n unit\n }\n }\n }\n }\n status {\n hasHighlight\n }\n }\n }\n\n ... on SingleOfferPointLand {\n offer {\n id\n isFavorite\n stats {\n isViewed\n }\n location {\n narrowRegion {\n id\n }\n coordinates {\n latitude\n longitude\n }\n }\n dealType {\n __typename\n ... on ProfOfferDealSell {\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n ... on ProfOfferDealRent {\n utilities {\n has\n }\n price {\n value\n rubPrice\n currency\n areaUnit\n history {\n valueRub\n diff {\n rub\n }\n date2 {\n iso\n formattedAutoDate\n }\n }\n }\n }\n }\n gallery {\n baseUrl\n mainImage {\n originPath\n preview1\n }\n images {\n originPath\n preview1\n }\n }\n realtyObject {\n __typename\n ... on ProfOfferLand {\n area {\n value\n unit\n }\n }\n }\n status {\n hasHighlight\n }\n }\n }\n }\n }\n}\n`;\n","/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable no-shadow */\nimport React, { useMemo, useState } from 'react';\n\nimport { YMapVector } from '@search/common-core/ymap/Vector';\nimport { SearchMapRoute, SearchRoute } from '@search/offer-search-routes/src';\n\nimport { YMapBounds, yMapBoundsFromVectors, yMapBoundsRound } from '@search/ymap/src/bounds';\nimport { yMapVectorFromLatLon } from '@search/ymap/src/Vector';\nimport { YMapPlacemarkPriority } from '@search/ymap/src/Placemark';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { useGeoRootRegion } from '@search/geo/src/GeoRootRegionProvider';\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport { useQueryDisplayValues } from '../../../../view/common/hooks/useQueryDisplayValues';\nimport { Filters, GeoFilter, MapBoundsFilter, RegionFilter, IFilter } from '../../../../view/filters/models/Filter';\nimport { GeoBaseStore } from '../../../geo/GeoBase';\nimport { useGeoTips } from '../../../geo/useGeoTips';\nimport { classifiedFilterFactory } from '../../filters/ClassifiedFilterFactory';\nimport { ClassifiedFilterCollection } from '../../filters/ClassifiedFilterCollection';\nimport { offerFilterGqlFromRoute } from '../../search/page/offerFilterGqlFromRoute';\nimport { offerSearchPageFilterToRoute } from '../../search/page/offerSearchPageFilterToRoute';\nimport {\n offerSearchPageGetInitialFilters\n} from '../../search/page/offerSearchPageGetInitialFilters';\nimport { offerYMapPresetBounds } from '../presetBounds';\nimport { seoSearch } from '../../../seo/seoSearch';\nimport { OfferYMapUnionPlacemarkItem, offerYMapUnionPlacemarkIsMulti } from '../union/UnionPlacemarkItem';\nimport { useOfferYMapUnionItemUrlBuilder } from '../union/useItemUrlBuilder';\nimport { useSearchOffersCountFetcher } from '../../search/page/SearchOffersCount/useSearchOffersCountFetcher';\nimport { useFavoritesMutationSafe } from '../../../../view/common/components/FavoritesButton/FavoritesMutation';\nimport { OfferYMapApiPlacemarkResponseItem } from '../api/placemarkResponse';\nimport { useSearchOffersMapLoader, pointCompat } from './SearchOffersMapQuery/useSearchOffersMapQuery';\n\nexport const favoritedIds = new Set<string>();\n\nexport function useOfferYMapPageState2(searchRoute: SearchRoute | SearchMapRoute, isMobile = false) {\n const searchParams = searchRoute.params();\n const [ filters, updateState ] = React.useState(offerSearchPageGetInitialFilters(searchParams));\n\n React.useEffect(() => {\n updateState(offerSearchPageGetInitialFilters(searchParams));\n loadingRef.current = false;\n }, [ searchParams ]);\n\n const searchOffersMapLoad = useSearchOffersMapLoader();\n\n const nbId = searchParams.newBuildingIds[0] ?? 0;\n\n const geoIds = [ ...searchParams.districtIds ];\n\n const { auth } = useM2AuthContext();\n const isMyOffers = auth.isAuthenticated && auth.isRealtorEmployeeEmpowered;\n const userId = isMyOffers ? auth.user?.userId : null;\n\n // Лучше, конечно, ориентироваться на зум, но тогда при изначальной отрисовке нам нужно его знать и идти в API уже с его учётом.\n // Чтобы не таскать/протаскивать везде с собой зум, решил подхачить вот так\n const showClusters = useMemo(() => {\n let show = false;\n\n if (searchParams.mapBounds?.bounds) {\n show = (searchParams.mapBounds.bounds.max.x - searchParams.mapBounds.bounds.min.x) > 0.14 ||\n (searchParams.mapBounds.bounds.max.y - searchParams.mapBounds.bounds.min.y) > 0.1;\n } else {\n return true;\n }\n return show;\n }, [ searchParams.mapBounds?.bounds ]);\n const response = searchOffersMapLoad({\n regionId: searchParams.region,\n nbId,\n geoIds: geoIds.length > 0 ? geoIds : null,\n filters: offerFilterGqlFromRoute({\n ...searchParams,\n selectedOffers: undefined,\n mapBounds: {\n ...searchParams.mapBounds,\n geohash: undefined\n },\n userId\n }),\n taglessOnly: showClusters\n });\n const dataRef = React.useRef(response.data);\n\n if (! response.loading) dataRef.current = response.data;\n\n const data = dataRef.current;\n\n const geoStore = React.useMemo(() => GeoBaseStore.fromGql(data?.geo), [ data?.geo ]);\n\n geoStore.districts.regionId = searchParams.region;\n\n const points = data?.searchOffersMap.points;\n\n const pointBounds = React.useMemo(() => yMapBoundsFromVectors([\n ...points?.map(offer => yMapVectorFromLatLon(pointCompat(offer).coordinates)) ?? [],\n ...searchParams.mapBounds?.polygon ?? []\n ]), [ points ]);\n\n const loadingRef = React.useRef(false);\n\n const handleSubmit = React.useCallback(() => {\n if (response.loading) return;\n response.clearCache(true);\n }, [ response.clearCache, response.loading ]);\n\n const updateFilters = React.useCallback((next: typeof filters) => {\n const prev = searchRoute.params();\n\n const newParams = next ? offerSearchPageFilterToRoute(next) : prev;\n\n searchRoute.push(newParams, { delay: 1000 });\n loadingRef.current = true;\n updateState(next);\n }, [ updateState, searchRoute ]);\n\n const handleReset = React.useCallback(() => {\n const initFilters = filters.reset();\n const nextFilters = classifiedFilterFactory.createOrUpdateFilters(initFilters)\n .update(new MapBoundsFilter()) as ClassifiedFilterCollection;\n\n updateFilters(nextFilters);\n }, [ updateFilters, filters ]);\n\n const updateFilter = React.useCallback((filter: MapBoundsFilter) => {\n if (loadingRef?.current) return;\n const newFilters = filters.update(filter) as ClassifiedFilterCollection;\n\n updateFilters(newFilters);\n\n const oldParams = searchRoute?.params();\n\n if (! oldParams || ! searchRoute) return;\n\n searchRoute.replace({\n ...oldParams,\n mapBounds: {\n bounds: filter.bounds,\n polygon: filter.polygon,\n geohash: filter.geohash\n }\n });\n }, [ filters, searchRoute, updateFilters ]);\n\n const {\n isDrawAreaVisible,\n toggleDrawArea,\n closeDrawArea,\n polygon,\n setPolygon,\n setBounds\n } = useOfferYMapDrawArea({\n filters,\n updateFilter\n });\n\n const handleResetInSegment = React.useCallback(() => {\n filters.remove(filters.get(Filters.price));\n filters.remove(filters.get(Filters.rooms));\n filters.remove(filters.get(Filters.newBuilding));\n const newFilters = classifiedFilterFactory.clearAdditionalFilters(filters.getFilters());\n const nextFilters = classifiedFilterFactory.createOrUpdateFilters(newFilters)\n .update(new MapBoundsFilter()) as ClassifiedFilterCollection;\n\n updateFilters(nextFilters);\n closeDrawArea();\n }, [ updateFilters, closeDrawArea, filters ]);\n\n const geoFilter = filters.get(Filters.geo) as GeoFilter;\n\n const geos = geoStore.getByIds(Array.from(geoFilter.geoIds))\n ?.filter(item => searchParams.segments?.districtIds.includes(item.id) ||\n searchParams.segments?.addresses.includes(item.id) ||\n searchParams.segments?.metroIds.includes(item.id)\n );\n\n const [ queryDisplayValues, addQueryDisplayValue ] = useQueryDisplayValues({\n newBuildingIds: geoFilter.newBuildingIds,\n addressIds: geoFilter.addressIds\n });\n\n const regionFilter = filters.get(Filters.region) as RegionFilter;\n const boundsFilter = filters.get(Filters.mapBounds) as MapBoundsFilter;\n const rootRegions = useGeoRootRegion();\n const rootRegion = rootRegions.byId(searchParams.region);\n const bounds = boundsFilter.bounds ?? pointBounds ??\n rootRegion?.bounds ?? offerYMapPresetBounds[regionFilter.region];\n const boundsRef = React.useRef(bounds);\n\n boundsRef.current = bounds;\n\n // forced active item even if in points not received\n const [ forcedActivePlacemark, setForcedActivePlacemark ] = useState<OfferYMapUnionPlacemarkItem>();\n const setSelected = React.useCallback((item: OfferYMapUnionPlacemarkItem, e: MouseEvent, element?: HTMLElement) => {\n e.preventDefault();\n e.stopPropagation();\n\n setForcedActivePlacemark(item);\n\n const geohash = offerYMapUnionPlacemarkIsMulti(item) ? item.geohash : undefined;\n const selectedOffer = ! offerYMapUnionPlacemarkIsMulti(item) ? item.id : undefined;\n const selectedOffers = selectedOffer ? [ selectedOffer ] : undefined;\n\n const prev = searchRoute.params();\n const bounds = boundsRef.current;\n const delta = bounds ? {\n x: (bounds.max.x - bounds.min.x) / 2,\n y: (bounds.max.y - bounds.min.y) / 2\n } : undefined;\n const center = item.coordinates;\n\n let nextBounds = prev.mapBounds?.bounds;\n const rect = element?.getBoundingClientRect();\n\n if (delta && rect && ! isMobile && rect.left < 360) {\n nextBounds = yMapBoundsRound({\n min: {\n x: center.longitude - delta.x,\n y: center.latitude - delta.y\n },\n max: {\n x: center.longitude + delta.x,\n y: center.latitude + delta.y\n }\n });\n }\n\n if (delta && rect && isMobile && rect.bottom > 310) {\n const centerY = center.latitude - (delta.y / 4);\n\n nextBounds = yMapBoundsRound({\n min: {\n x: center.longitude - delta.x,\n y: centerY - delta.y\n },\n max: {\n x: center.longitude + delta.x,\n y: centerY + delta.y\n }\n });\n }\n\n searchRoute.push({\n ...prev,\n selectedOffers,\n mapBounds: {\n ...prev.mapBounds,\n bounds: nextBounds,\n geohash\n }\n });\n }, [ searchRoute, boundsRef, isMobile ]);\n\n const clearSelected = React.useCallback(() => {\n const prev = searchRoute.params();\n\n setForcedActivePlacemark(undefined);\n searchRoute.push({\n ...prev,\n selectedOffers: undefined,\n mapBounds: {\n ...prev.mapBounds,\n geohash: undefined\n }\n });\n }, [ searchRoute ]);\n\n const hasSelected = Boolean(searchParams.mapBounds?.geohash || searchParams.selectedOffers?.length);\n\n const selectedSet = React.useMemo(() => new Set([\n ...(searchParams.mapBounds?.geohash ? [ searchParams.mapBounds.geohash ] : []),\n ...searchParams.selectedOffers ?? []\n ]), [ searchParams.mapBounds?.geohash, searchParams.selectedOffers ]);\n\n const getItemUrl = useOfferYMapUnionItemUrlBuilder();\n\n const favoritesMutationSafe = useFavoritesMutationSafe();\n\n const isFavorite = React.useCallback((item: OfferYMapApiPlacemarkResponseItem) => {\n const orig = favoritesMutationSafe.argsById(item.id)?.isFavorite;\n\n return orig ?? (favoritedIds.has(item.id) ? true : item.isFavorite);\n }, [ favoritesMutationSafe ]);\n const [ isFavoriteForce, setIsFavoriteForce ] = React.useState([]);\n const forceFavoriteUpdate = React.useCallback(() => {\n setIsFavoriteForce([]);\n }, []);\n const selected = hasSelected ? {\n geoHash: searchParams.mapBounds?.geohash,\n selectedOffers: searchParams.selectedOffers,\n forceFavoriteUpdate\n } : undefined;\n\n const responseItems = React.useMemo(() => {\n const idsSet = new Set<string>();\n const changedPoints = points?.map(raw => {\n const item = pointCompat(raw);\n\n if (item.kind === 'tagless') {\n return item;\n }\n const isMultiPlacemark = offerYMapUnionPlacemarkIsMulti(item);\n const isActive = isMultiPlacemark ?\n selectedSet.has(item.geohash) :\n selectedSet.has(item.id);\n\n idsSet.add(isMultiPlacemark ? item.geohash : item.id);\n\n const next: OfferYMapUnionPlacemarkItem = {\n ...item,\n isActive,\n isFavorite: isMultiPlacemark ? false : isFavorite(item),\n url: getItemUrl(item),\n zIndexes: item.isHighlighted ? YMapPlacemarkPriority.Middle : undefined,\n onClick: (e: MouseEvent, element?: HTMLElement) => setSelected(item, e, element)\n };\n\n return next;\n }) ?? [];\n\n if (\n forcedActivePlacemark &&\n ! idsSet.has(String(offerYMapUnionPlacemarkIsMulti(forcedActivePlacemark) ?\n forcedActivePlacemark.geohash :\n forcedActivePlacemark.id\n ))\n ) {\n return [\n ...changedPoints,\n { ...forcedActivePlacemark, isActive: true }\n ];\n }\n return changedPoints;\n }, [ points, getItemUrl, setSelected, selectedSet, isFavorite, isFavoriteForce ]);\n const clusterPoints = useMemo(() => {\n if (! showClusters) return [];\n return responseItems.map(item => {\n return [\n item.coordinates.latitude,\n item.coordinates.longitude\n ] as [ number, number ];\n });\n }, [ showClusters, responseItems ]);\n const collection = useMemo(() => showClusters ? [] : responseItems, [ responseItems, showClusters ]);\n\n const tips = useGeoTips(queryDisplayValues, filters, geoStore);\n\n const offersCount = data?.searchOffersCount?.count ?? 0;\n\n const isMskMOSPbLO = useMemo(() => [\n RegionIdEnum.MSK,\n RegionIdEnum.MSK_OBL,\n RegionIdEnum.MSK_AND_MSK_OBL,\n RegionIdEnum.SPB,\n RegionIdEnum.LEN_OBL,\n RegionIdEnum.SPB_AND_LEN_OBL\n ].includes(searchParams.region), [ searchParams.region ]);\n const isSellFlat = useMemo(() => filters.isSellFilterActive() && filters.isFlatFilterActive(), [ filters ]);\n const showPromoRieltors = isMskMOSPbLO && ! filters.isNewBuilding() && isSellFlat;\n\n const { pageTitle: headerTitle } = seoSearch({\n params: searchParams,\n geos,\n offersCount,\n region: rootRegion\n });\n\n return {\n showClusters,\n toggleDrawArea,\n closeDrawArea,\n isDrawAreaVisible,\n count: offersCount,\n collection,\n clusterPoints,\n loading: response.loading,\n geoStore,\n filters,\n selected,\n clearSelected,\n tileUrl: data?.searchOffersMap.tileUrl,\n bounds,\n setBounds,\n handleSubmit,\n polygon,\n setPolygon,\n handleResetInSegment,\n handleReset,\n updateFilters,\n addQueryDisplayValue,\n queryDisplayValues,\n tips,\n headerTitle: data?.newBuilding?.offersSeo.h1 ?? headerTitle,\n showPromoRieltors\n };\n}\n\nexport function useOfferYMapDrawArea({\n filters,\n updateFilter: updateFilterRaw,\n submit,\n countInitial\n}: {\n countInitial?: number;\n submit?(): void;\n filters: ClassifiedFilterCollection;\n updateFilter(filter: IFilter): void;\n}) {\n const boundsFilterInitial = filters.get(Filters.mapBounds) as MapBoundsFilter;\n const regionFilter = filters.get(Filters.region) as RegionFilter;\n const regionId = regionFilter.region;\n\n const [ boundsFilterRaw, setBoundsFilterInt ] = React.useState(boundsFilterInitial);\n const boundsFilter = submit ? boundsFilterRaw : boundsFilterInitial;\n\n const countFetch = useSearchOffersCountFetcher();\n const [ count, setCount ] = React.useState(countInitial ?? 0);\n\n React.useEffect(() => {\n if (! submit) return;\n\n const newFilters = new ClassifiedFilterCollection(new Map(filters._filters));\n\n newFilters.update(boundsFilter);\n\n countFetch({ filters: newFilters }).then(data => {\n setCount(data.data?.searchOffersSummary?.count ?? 0);\n });\n }, [ boundsFilter, filters, countFetch, submit ]);\n\n const updateFilter = React.useCallback((filter: MapBoundsFilter) => {\n if (submit) {\n setBoundsFilterInt(filter);\n return;\n }\n\n updateFilterRaw(filter);\n }, [ updateFilterRaw, submit ]);\n\n const setBounds = React.useCallback((newBounds: YMapBounds) => {\n updateFilter(\n new MapBoundsFilter(newBounds, boundsFilter.polygon, filters.getMapBoundsFilter().geohash)\n );\n }, [ boundsFilter, updateFilter, filters.getMapBoundsFilter().geohash ]);\n\n const setPolygon = React.useCallback((newPolygon: YMapVector[]) => {\n const prevBounds = boundsFilter.bounds;\n const newBounds = newPolygon.length === 0 ? prevBounds : yMapBoundsFromVectors(newPolygon);\n\n updateFilter(new MapBoundsFilter(newBounds, newPolygon));\n }, [ boundsFilter, updateFilter ]);\n\n const [\n isDrawAreaVisible,\n setIsDrawAreaVisible\n ] = React.useState(Boolean(boundsFilter.polygon.length));\n\n const closeDrawArea = React.useCallback(() => {\n setIsDrawAreaVisible(false);\n }, [ setIsDrawAreaVisible ]);\n\n const toggleDrawArea = React.useCallback(() => {\n setIsDrawAreaVisible(prev => ! prev);\n\n if (isDrawAreaVisible) setPolygon([]);\n }, [ setPolygon, isDrawAreaVisible ]);\n\n const rootRegions = useGeoRootRegion();\n const rootRegion = regionId ? rootRegions.byId(regionId) : undefined;\n\n const bounds = boundsFilter.bounds ?? rootRegion?.bounds ?? undefined;\n const polygon = boundsFilter.polygon;\n\n const onSubmit = React.useCallback(() => {\n if (submit) {\n updateFilterRaw(new MapBoundsFilter(undefined, boundsFilter.polygon));\n submit();\n }\n }, [ submit, boundsFilter ]);\n\n const countStr = count > 0 ? `Показать ${formatNumber(count)}` : 'Нет объявлений';\n\n return {\n onSubmit,\n count,\n countStr,\n bounds,\n setBounds,\n polygon,\n setPolygon,\n isDrawAreaVisible,\n closeDrawArea,\n toggleDrawArea\n };\n}\n","import React from 'react';\n\nimport { BaseError } from '@search/error/src/BaseError';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { HiddenMutation$variables, HiddenMutation$data } from './__generated__/HiddenMutation.graphql';\n\nconst hiddenMutation = graphql`\n mutation HiddenMutation($offerId: ID!, $isHidden: Boolean!) {\n editHiddenPersonal(offerId: $offerId, isHidden: $isHidden) {\n firstError {\n __typename\n ... on BaseError{\n message\n }\n ... on HiddenErrorInvalidOfferId {\n message\n }\n ... on HiddenErrorLimitExceeded {\n message\n }\n ... on HiddenErrorUnknown {\n message\n }\n ... on InternalError {\n message\n }\n }\n }\n }\n`;\n\nexport function useHiddenMutation() {\n const gql = useGqlContext();\n\n return React.useCallback(async (props: HiddenMutation$variables) => {\n const data = await gql.execute<HiddenMutation$variables, HiddenMutation$data>(\n hiddenMutation,\n {\n ...props\n }\n );\n\n const firstError = data.data?.editHiddenPersonal.firstError;\n\n if (firstError?.__typename === 'HiddenErrorLimitExceeded') {\n throw new BaseError('HiddenErrorLimitExceeded', { cause: firstError });\n }\n\n if (firstError?.__typename === 'HiddenErrorInvalidOfferId') {\n throw new BaseError('HiddenErrorInvalidOfferId', { cause: firstError });\n }\n\n return data;\n }, [ gql ]);\n}\n\nexport function useHiddenMutationSafe() {\n const { authScheduler } = useM2AuthContext();\n const hiddenMutationCb = useHiddenMutation();\n\n const hiddenMutationSafe = React.useMemo(() => {\n const register = authScheduler.register('hiddenMutation', hiddenMutationCb);\n\n return {\n ...register,\n argsById(id: string) {\n return register.args().find(arg => arg.offerId === id);\n }\n };\n }, [ hiddenMutationCb ]);\n\n return hiddenMutationSafe;\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport React from 'react';\nimport { downloadOfferPdf } from '@search/vtbeco-frontend-core/domain/share/SharePrintButton';\nimport { isProfessional } from '@search/auth/src/helpers/isProfessional';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { favoritedIds } from '../../../../domain/offer/ymap/page/useOfferYMapPageState2';\nimport { useFavoritesModal } from './FavoritesModal';\nimport { useFavoritesMutationSafe } from './FavoritesMutation';\nimport { useHiddenMutationSafe } from './HiddenMutation';\n\ntype Setters<State> = {\n [K in keyof State]: (args: State[K]) => void\n}\n\nfunction useRefState<State extends Object>(initialState: State, deps?: unknown[]) {\n const [ , setCount ] = React.useState(0);\n const refresh = React.useCallback(() => setCount(p => p + 1), []);\n\n return React.useMemo(() => {\n const get = { ...initialState };\n const set = {} as Setters<State>;\n const setAll = (newState: State) => Object.assign(get, newState);\n\n Object.keys(get).forEach((key: any) => {\n set[key as keyof State] = (v: State[keyof State]) => {\n get[key as keyof State] = v;\n refresh();\n };\n });\n\n return { set, get, setAll };\n }, deps ?? []);\n}\n\nexport function useFavoritesButtonState({\n isFavorite: isFavoriteInitial,\n noteTextInitial,\n id: offerId,\n eventAddId,\n organizationName,\n forceFavoriteUpdate\n} : {\n forceFavoriteUpdate?(): void;\n noteTextInitial?: string | null;\n isFavorite: boolean;\n id: string;\n eventAddId?: string | null;\n organizationName?: string | null;\n}) {\n const { auth } = useM2AuthContext();\n const isProf = isProfessional(auth.user?.currentRoleType);\n\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const favoritesMutationSafe = useFavoritesMutationSafe();\n\n const { setError } = useFavoritesModal();\n\n const [ isSaving, setIsSaving ] = React.useState(false);\n\n const pendingArgs = favoritesMutationSafe.argsById(offerId);\n\n const favorite = useRefState({\n isFavorite: pendingArgs?.isFavorite ?? isFavoriteInitial,\n // Если null - запендили удаление текста, если undefined, значит ничего не запендено, показываем noteInitial\n noteText: pendingArgs?.noteText === null ? '' : (pendingArgs?.noteText ?? noteTextInitial ?? ''),\n }, [ offerId ]);\n\n React.useEffect(() => {\n const favoriteState = favorite.get.isFavorite;\n const favoriteString = favoriteState.toString();\n\n if (sessionStorage?.getItem(`favorite-${offerId}`) !== favoriteString) {\n sessionStorage?.setItem(`favorite-${offerId}`, `${favoriteString}`);\n }\n }, []);\n\n const depsObj = {\n offerId,\n favoritesMutationSafe: favoritesMutationSafe.run,\n setError,\n eventAddId,\n organizationName\n };\n const depsRef = React.useRef(depsObj);\n\n depsRef.current = depsObj;\n\n const updateFavorite = React.useCallback(async (next: Partial<typeof favorite.get>) => {\n const deps = depsRef.current;\n\n if (deps.eventAddId && next.isFavorite) {\n dataLayerPush({\n event: deps.eventAddId,\n offerId: deps.offerId,\n organizationName: deps.organizationName\n });\n }\n\n const noteText = next.isFavorite === false ? '' : (next.noteText ?? favorite.get.noteText);\n\n const req = { id: deps.offerId, ...favorite.get, ...next, offerId: deps.offerId, noteText };\n\n try {\n setIsSaving(true);\n const res = await deps.favoritesMutationSafe(req);\n const error = res?.data?.editFavoritePersonal2.firstError;\n\n if (error) throw error;\n deps.setError(undefined);\n favorite.setAll(req);\n if (req.isFavorite) favoritedIds.add(req.id);\n else favoritedIds.delete(req.id);\n forceFavoriteUpdate?.();\n } catch (e) {\n deps.setError(e);\n sessionStorage?.setItem(`favorite-${offerId}`, 'false');\n } finally {\n setIsSaving(false);\n }\n }, [ favorite, forceFavoriteUpdate ]);\n\n const favoriteToggle = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n e.stopPropagation();\n const isFavorite = ! favorite.get.isFavorite;\n\n sessionStorage?.setItem(`favorite-${offerId}`, `${isFavorite}`);\n\n updateFavorite({ isFavorite });\n }, [ updateFavorite ]);\n\n const [ isNoteEditing, setNoteEditing ] = React.useState(false);\n const noteEditOpen = React.useCallback(() => setNoteEditing(true), [ ]);\n const noteEditClose = React.useCallback(() => setNoteEditing(false), [ ]);\n const handleDownloadPdf = React.useCallback(() => {\n downloadOfferPdf(offerId);\n }, [ ]);\n\n const noteSave = React.useCallback((\n { note }: { note?: string }\n ) => {\n dataLayerPush({ event: 'classified_save_note_click' });\n updateFavorite({ isFavorite: true, noteText: note }).finally(noteEditClose);\n }, [ updateFavorite ]);\n\n const noteDelete = React.useCallback(() => {\n updateFavorite({ noteText: '' }).finally(noteEditClose);\n }, [ updateFavorite ]);\n\n React.useEffect(() => {\n if (sessionStorage?.getItem(`favorite-${offerId}`) === 'true') favorite?.set.isFavorite(true);\n if (sessionStorage?.getItem(`favorite-${offerId}`) === 'false') favorite?.set.isFavorite(false);\n }, [ typeof window !== 'undefined' ? sessionStorage?.getItem(`favorite-${offerId}`) : undefined ]);\n\n return {\n isProfessional: isProf,\n isFavorite: favorite.get.isFavorite,\n isSaving,\n setIsFavorite: favorite.set.isFavorite,\n favoriteToggle,\n\n noteText: favorite.get.noteText,\n isNoteEditing,\n updateFavorite,\n noteSave,\n noteDelete,\n noteEditOpen,\n noteEditClose,\n handleDownloadPdf,\n };\n}\n\nexport type UseFavoritesButtonStateType = ReturnType<typeof useFavoritesButtonState>;\n\nexport function useHiddenButtonState({\n isHidden: isHiddenInitial,\n id: offerId\n} : {\n isHidden: boolean;\n id: string;\n}) {\n const hiddenMutationSafe = useHiddenMutationSafe();\n\n const [ isSaving, setIsSaving ] = React.useState(false);\n\n const pendingArgs = hiddenMutationSafe.argsById(offerId);\n\n const hidden = useRefState({\n isHidden: pendingArgs?.isHidden ?? isHiddenInitial,\n }, [ offerId ]);\n\n const depsObj = {\n offerId,\n hiddenMutationSafe: hiddenMutationSafe.run,\n };\n\n const depsRef = React.useRef(depsObj);\n\n depsRef.current = depsObj;\n\n const updateHidden = React.useCallback(async (next: Partial<typeof hidden.get>) => {\n const deps = depsRef.current;\n\n const req = { id: deps.offerId, ...hidden.get, ...next, offerId: deps.offerId };\n\n try {\n setIsSaving(true);\n const res = await deps.hiddenMutationSafe(req);\n const error = res?.data?.editHiddenPersonal.firstError;\n\n if (error) throw error;\n hidden.setAll(req);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(e);\n } finally {\n setIsSaving(false);\n }\n }, [ hidden ]);\n\n const hiddenToggle = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n e.stopPropagation();\n const isHidden = ! hidden.get.isHidden;\n\n updateHidden({ isHidden });\n }, [ updateHidden ]);\n\n return {\n isHidden: hidden.get.isHidden,\n hiddenToggle,\n isSaving\n };\n}\n","import React from 'react';\nimport {\n Footer as LayoutComponentFooter\n} from '@vtblife/layout-components';\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { MenuItemComponentProps } from '@vtblife/layout-components/dist/types/menu-item.interface';\nimport {\n FooterLink,\n FooterMiddleCol,\n FooterPhoneType,\n} from '@vtblife/layout-components/dist/types/footer.interface';\nimport { FooterLink as FooterLinkConfig } from '@vtblife/layout-config/dist/types';\n\nimport { graphql, useGql } from '@search/gql-client/src';\nimport type { FooterQuery$data as FooterQueryResponse, FooterQuery$variables as FooterQueryVariables } from './__generated__/FooterQuery.graphql';\n\nconst query = graphql`\n query FooterQuery($regionId: Int) {\n footer(regionId: $regionId) {\n downloadAppQrCode\n socialLinks {\n name\n icon\n href\n }\n top {\n to\n name\n href\n cdn\n }\n middleLinks {\n title\n links {\n to\n href\n cdn\n name\n }\n }\n }\n }\n`;\n\nconst FooterMenuItemComponent: React.FC<MenuItemComponentProps> = props => {\n const { url = '/', path, ...rest } = props;\n\n return <a key={url} href={url === 'undefined' ? path : url} {...rest} />;\n};\n\nconst Footer: React.FC<{\n buildLink?: (url: string) => string;\n phone?: FooterPhoneType;\n regionId?: number;\n}> = ({ regionId, ...props }) => {\n const { data } = useGql<FooterQueryVariables, FooterQueryResponse>(query, { regionId });\n\n const { top, middleLinks: rawMiddleLinks, downloadAppQrCode, socialLinks = [] } = data?.footer || {};\n\n const buildLink = (link: FooterLinkConfig) => {\n const url = (link.to || link.href) as string;\n const absoluteUrl = props.buildLink ? props.buildLink(url) : url;\n\n return {\n ...link,\n href: link.cdn ? url : absoluteUrl\n };\n };\n\n const topLinks: Array<Array<FooterLink>> = (top || [])\n .map(links => (links || [])\n .map(link => buildLink(link as FooterLinkConfig))\n );\n\n const middleLinks: Array<FooterMiddleCol> = (rawMiddleLinks || [])\n .map(column => ({\n title: column!.title,\n links: (column!.links || []).map(link => buildLink(link as FooterLinkConfig))\n }));\n\n return (\n <LayoutComponentFooter\n top={topLinks}\n middle={middleLinks}\n menuItemComponent={FooterMenuItemComponent}\n phone={props.phone}\n socialLinks={socialLinks}\n downloadAppQrCode={downloadAppQrCode}\n />\n );\n};\n\nexport default errorCatcherWrap(Footer);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React from 'react';\n\nimport { Modifier } from '@popperjs/core';\nimport arrowModifier from '@popperjs/core/lib/modifiers/arrow';\nimport hideModifier from '@popperjs/core/lib/modifiers/hide';\nimport offsetModifier from '@popperjs/core/lib/modifiers/offset';\nimport preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow';\nimport { defaultModifiers, popperGenerator } from '@popperjs/core/lib/popper-lite';\n\nimport { getElementSize, getWindowSize } from './getWindowSize';\nimport { useDomOnClickOutside } from './useDomOnClickOutside';\n\ntype TooltipDirection = 'up' | 'right' | 'down' | 'left';\n\ntype PopperDirection = 'top' | 'right' | 'bottom' | 'left';\n\nconst directions: TooltipDirection[] = [ 'up', 'right', 'down', 'left' ];\n\nconst padding = 8;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype PopperModifier = Partial<Modifier<any, any>>;\n\nconst directionAlias: Record<TooltipDirection, PopperDirection> = {\n up: 'top',\n down: 'bottom',\n left: 'left',\n right: 'right',\n};\n\nconst createPopper = popperGenerator({\n defaultModifiers: [ ...defaultModifiers, preventOverflow, offsetModifier, arrowModifier, hideModifier ],\n});\n\nconst arrow = {\n name: 'arrow',\n options: {\n padding: 2,\n },\n};\n\nconst offset = {\n name: 'offset',\n options: {\n offset: [ 0, padding ],\n },\n};\n\nconst overflow = ($container: HTMLElement) => ({\n name: 'preventOverflow',\n options: {\n boundary: $container,\n },\n});\n\nconst adaptiveDirection = ($container: HTMLElement | null, direction: TooltipDirection): PopperModifier => ({\n name: 'direction',\n enabled: true,\n phase: 'beforeRead',\n fn({ state }) {\n state.placement = fit({\n $container,\n $control: state.elements.reference as HTMLElement,\n $tooltip: state.elements.popper,\n direction,\n });\n },\n});\n\n// const silent = [offset, { name: 'eventListeners', enabled: false }, { name: 'computeStyles', enabled: false }];\n\nfunction fit({ $container, $control, $tooltip, direction }: {\n $container: HTMLElement | null;\n $control: HTMLElement;\n $tooltip: HTMLElement;\n direction: TooltipDirection;\n}) {\n const box = $container ? getElementSize($container) : getWindowSize();\n const origin = getElementSize(document.body);\n const control = getElementSize($control);\n const tooltip = getElementSize($tooltip);\n\n const cleft = control.left - origin.left;\n const cright = control.right - origin.left;\n const ctop = control.top - origin.top;\n const cbottom = control.bottom - origin.top;\n const xmin = box.left - origin.left;\n const xmax = box.right - origin.left;\n const ymin = box.top - origin.top;\n const ymax = box.bottom - origin.top;\n\n const controlWithin = ctop - ymin >= 0 && ymax - cbottom >= 0;\n\n const possibleDirections: Record<string, boolean> = {\n left: controlWithin && cleft - padding - tooltip.width >= xmin,\n right: controlWithin && cright + padding + tooltip.width <= xmax,\n up: ctop - padding - tooltip.height >= ymin,\n down: cbottom + padding + tooltip.height <= ymax,\n };\n\n const realDirection =\n [\n ...directions.slice(directions.indexOf(direction)),\n ...directions.slice(0, directions.indexOf(direction)),\n ].find(dir => possibleDirections[dir]) || direction;\n\n return directionAlias[realDirection];\n}\n\nconst defaultContainer = { current: null };\n\nexport type UsePopperProps = {\n container?: React.RefObject<HTMLElement>;\n direction?: TooltipDirection;\n triggerElement: HTMLElement | null | undefined;\n hide(): void;\n}\n\nexport function usePopper({\n container = defaultContainer,\n direction = 'up',\n triggerElement,\n hide\n}: UsePopperProps) {\n const popperRefs = React.useMemo(() => ({ current: [ null as HTMLElement | null ] }), [ ]);\n const onClickOutside = React.useCallback((e: MouseEvent | TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n hide();\n }, [ hide ]);\n\n useDomOnClickOutside(popperRefs, onClickOutside);\n\n const containerElement = container.current;\n\n const popper = React.useMemo(() => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n let popper: ReturnType<typeof createPopper> | undefined;\n\n return {\n init(tooltipElement?: HTMLElement | null) {\n if (! triggerElement) return;\n\n if (! tooltipElement) {\n popper?.destroy();\n return;\n }\n\n popperRefs.current[0] = tooltipElement;\n popperRefs.current[1] = triggerElement;\n popper?.destroy();\n popper = createPopper(triggerElement, tooltipElement, {\n placement: directionAlias[direction],\n modifiers: [\n arrow,\n offset,\n overflow(containerElement ?? document.body),\n adaptiveDirection(containerElement, direction),\n ],\n });\n },\n destroy() {\n popper?.destroy();\n popperRefs.current.length = 0;\n popper = undefined;\n }\n };\n }, [ triggerElement, containerElement, direction ]);\n\n React.useEffect(() => {\n return () => popper.destroy();\n }, [ popper ]);\n\n return popper.init;\n}\n","import React, { useEffect } from 'react';\n\nexport function useDomOnClickOutside<El extends Element>(\n refs: React.RefObject<readonly (El | undefined | null)[]>,\n handler: (e: MouseEvent | TouchEvent) => void,\n isEnabled = true,\n) {\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as El;\n\n if (refs.current?.some(item => ! item || item.contains(target))) {\n return;\n }\n\n handler(event);\n };\n\n if (isEnabled) {\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n } else {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n }\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ refs, handler, isEnabled ]);\n}\n","import React, { PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\nimport { usePopper } from '../Price/popper/usePopper';\n\nexport function SuggestPopup({\n hide,\n triggerElement,\n children\n}: PropsWithChildren<Parameters<typeof usePopper>[0]>) {\n const popupElement = usePopper({ direction: 'down', triggerElement, hide });\n\n return createPortal(\n <div\n // zIndex from modals uikit -1\n style={{ width: triggerElement?.offsetWidth, zIndex: 1000 }}\n ref={popupElement}\n >\n {children}\n </div>,\n document.body\n );\n}\n","/* eslint-disable complexity */\nimport React, { useState, useCallback, ReactNode, Fragment } from 'react';\nimport groupBy from 'lodash/groupBy';\n\nimport { Typography } from '@vtblife/uikit';\n\nimport { RootRegionsApplicationEnum, SuggestTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport classname from '@search/classname/src';\nimport { IUseControlReturnedHandlers } from '@search/hooks/src/useControl';\n\nimport { Size } from '@search/vtbeco-ui/src/types';\nimport { Highlight } from '@search/vtbeco-ui/src/components/controls/Highlight/Highlight';\nimport Suggest, { IInitialSuggestState, ISuggestion, ISuggestProps } from '@search/vtbeco-ui/src/components/controls/Suggest';\n\nimport { mskOblMetroStation, mskMetroStation } from '@search/offer-search-routes/src/mappers/regions/msk/mskMetroMapper';\nimport { mskOblDistrict, mskDistrict } from '@search/offer-search-routes/src/mappers/regions/msk/mskDistrictMapper';\nimport { mskOblCity, mskCity } from '@search/offer-search-routes/src/mappers/regions/msk/mskCityMapper';\nimport { mskOblRayon, mskRayon } from '@search/offer-search-routes/src/mappers/regions/msk/mskRayonMapper';\n\nimport { lenOblMetroStation, spbMetroStation } from '@search/offer-search-routes/src/mappers/regions/spb/spbMetroMapper';\nimport { lenOblDistrict, spbDistrict } from '@search/offer-search-routes/src/mappers/regions/spb/spbDistrictMapper';\nimport { lenOblCity, spbCity } from '@search/offer-search-routes/src/mappers/regions/spb/spbCityMapper';\n\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport { RegionIdEnum } from '../../../../enums';\nimport useDebouncedCallback from '../../../../view/common/hooks/useDebouncedCallback';\nimport { ArrayElement } from '../../../../types';\n\nimport { SuggestPopup } from './SuggestPopup';\nimport { MetroMark } from './MetroMark';\nimport './GeoSuggest.css';\nimport type {\n GeoSuggestQuery$data as GeoSuggestQueryResponse,\n GeoSuggestQuery$variables as GeoSuggestQueryVariables\n} from './__generated__/GeoSuggestQuery.graphql';\n\ntype ExtractSuggestItem<A> = A extends { __typename: '%other' } ? never : A;\n\nexport type SuggestionType = ExtractSuggestItem<\n NonNullable<\n ArrayElement<\n NonNullable<GeoSuggestQueryResponse['suggest']>\n >\n >\n>;\nexport type SuggestionTypenameType = Exclude<SuggestionType['__typename'], '%other'>;\ntype SuggestionsByGroupType = Record<Partial<SuggestionTypenameType>, Array<SuggestionType>>;\n\nexport interface GeoSuggestProps {\n regionId: number;\n rootRegionsApp: RootRegionsApplicationEnum;\n onGeoChange: (ids: SuggestionType) => void;\n renderInput?: (\n props: {\n borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n inputSize?: Size;\n placeholder?: string;\n disabled?: boolean;\n borderOut?: boolean;\n },\n state: IInitialSuggestState<ISuggestion>,\n handlers: IUseControlReturnedHandlers & {\n handleInputChange: (text: string) => void;\n handleInputKeyDown: (e: React.KeyboardEvent) => void;\n }\n ) => ReactNode;\n onInputToggleFocus?: (disabled: boolean) => void;\n autoFocus?: boolean;\n listBorderOut?: boolean;\n clear?: boolean;\n borderOut?: boolean;\n showNewBuildingsGroup?: boolean;\n startWithNewBuildings?: boolean;\n placeholder: string;\n placeholderWithNewBuildings?: string;\n limit?: number;\n suggestTypes?: SuggestTypeEnum[];\n spySuggest?: UseToggleChainResult;\n selected?: Set<number>;\n}\n\nconst cn = classname.bind(null, 'GeoSuggest');\n\nconst TYPE_MAP: Record<SuggestionTypenameType, string> = {\n SuggestItemMetro: 'Метро',\n SuggestItemAddress: 'Адрес',\n SuggestItemDistrict: 'Районы',\n SuggestItemNewBuilding: 'Новостройки',\n SuggestItemDeveloper: 'Застройщики'\n};\n\nconst QUERY = graphql`\n query GeoSuggestQuery(\n $text: String!\n $rootRegionsApp: RootRegionsApplicationEnum\n $suggestTypes: [SuggestTypeEnum!]\n $userRegionId: Int\n $limit: Int\n ) {\n suggest(\n text: $text\n rootRegionsApp: $rootRegionsApp\n suggestTypes: $suggestTypes\n userRegionId: $userRegionId\n limit: $limit\n ) {\n __typename\n\n ... on SuggestItemNewBuilding {\n label\n data {\n id\n scope\n regionId\n }\n newBuilding {\n id\n type\n name\n title {\n nominative\n }\n }\n }\n\n ...on SuggestItemDeveloper {\n label\n data {\n id\n scope\n }\n developer {\n id\n title\n }\n }\n\n ... on SuggestItemDistrict {\n label\n data {\n id\n scope\n regionId\n }\n district {\n id\n translit\n parentId\n mainName\n displayName\n displayNameWithContext\n kind\n locative\n }\n }\n\n ... on SuggestItemMetro {\n label\n data {\n id\n scope\n regionId\n }\n metroStation {\n id\n allRoutesColorsList\n interchangedStations\n lines\n }\n }\n\n ... on SuggestItemAddress {\n label\n data {\n id\n scope\n regionId\n }\n address {\n id\n translit\n kind\n parentId\n mainName\n displayName\n displayNameWithContext\n locative\n }\n }\n }\n }\n`;\n\ninterface GeoSuggestState {\n suggestionsByGroup: SuggestionsByGroupType;\n suggestions: SuggestionType[];\n}\n\nconst renderSuggestItem = (item: SuggestionType, label: string) => {\n const scope = item?.data?.scope ? (\n <Typography\n variant='small-alone'\n color='secondary'\n >\n {item.data.scope}\n </Typography>\n ) : null;\n\n switch (item.__typename) {\n case SuggestItemTypeEnum.Metro: {\n return (\n <Fragment>\n <div className={cn('list-item-suggest', { type: 'metro' })}>\n {\n item?.metroStation?.lines ? <MetroMark colors={item.metroStation.lines} /> : null\n }\n <Typography variant='primary'>\n <Highlight text={item.label || ''} highlight={label} />\n </Typography>\n </div>\n {scope}\n </Fragment>\n );\n }\n\n default:\n return (\n <Typography variant='primary'>\n <Highlight text={item?.label || ''} highlight={label} />\n {scope}\n </Typography>\n );\n }\n};\n\nconst mskGeoIds = new Set(Object.values({\n ...mskMetroStation,\n ...mskRayon,\n ...mskDistrict,\n ...mskCity\n}));\n\nconst mskOblGeoIds = new Set(Object.values({\n ...mskOblMetroStation,\n ...mskOblRayon,\n ...mskOblDistrict,\n ...mskOblCity\n}));\n\nconst spbGeoIds = new Set(Object.values({\n ...spbMetroStation,\n ...spbDistrict,\n ...spbCity\n}));\n\nconst lenOblGeoIds = new Set<number>(Object.values({\n ...lenOblMetroStation,\n ...lenOblDistrict,\n ...lenOblCity\n}));\n\nexport const correctAndBroadenRegionId = (\n id: number,\n type: SuggestItemTypeEnum,\n currentRegionId: number\n): number => {\n if (type !== SuggestItemTypeEnum.District && type !== SuggestItemTypeEnum.Metro) {\n return currentRegionId;\n }\n\n if (currentRegionId === RegionIdEnum.MSK && mskOblGeoIds.has(id)) {\n return RegionIdEnum.MSK_AND_MSK_OBL;\n }\n\n if (currentRegionId === RegionIdEnum.MSK_OBL && mskGeoIds.has(id)) {\n return RegionIdEnum.MSK_AND_MSK_OBL;\n }\n\n if (currentRegionId === RegionIdEnum.SPB && lenOblGeoIds.has(id)) {\n return RegionIdEnum.SPB_AND_LEN_OBL;\n }\n\n if (currentRegionId === RegionIdEnum.LEN_OBL && spbGeoIds.has(id)) {\n return RegionIdEnum.SPB_AND_LEN_OBL;\n }\n\n return currentRegionId;\n};\n\nexport const correctSuggestion = (\n suggestion: SuggestionType,\n regionId: number\n): [\n SuggestionType,\n number\n] => {\n const id = suggestion?.data?.id;\n\n let newSuggestion = suggestion;\n\n if (suggestion?.__typename === SuggestItemTypeEnum.Address && Object.values({\n ...mskRayon,\n ...mskDistrict,\n ...mskCity,\n ...mskOblRayon,\n ...mskOblDistrict,\n ...mskOblCity,\n ...spbDistrict,\n ...spbCity,\n ...lenOblDistrict,\n ...lenOblCity\n }).includes(id)) {\n newSuggestion = {\n ...suggestion,\n __typename: SuggestItemTypeEnum.District,\n district: suggestion.address,\n address: undefined\n };\n }\n\n return [\n newSuggestion,\n correctAndBroadenRegionId(id, newSuggestion?.__typename, regionId)\n ];\n};\n\nexport const GeoSuggest: React.FC<GeoSuggestProps> = ({\n regionId,\n rootRegionsApp = RootRegionsApplicationEnum.Unknown,\n onGeoChange,\n renderInput,\n onInputToggleFocus,\n autoFocus = false,\n clear = false,\n borderOut = true,\n listBorderOut = false,\n showNewBuildingsGroup,\n startWithNewBuildings = false,\n placeholder,\n placeholderWithNewBuildings,\n limit,\n suggestTypes,\n spySuggest,\n selected\n}) => {\n const gql = useGqlContext();\n const [ suggestions, setSuggestions ] = useState<GeoSuggestState>({\n suggestionsByGroup: {\n SuggestItemMetro: [],\n SuggestItemAddress: [],\n SuggestItemDistrict: [],\n SuggestItemNewBuilding: [],\n SuggestItemDeveloper: []\n },\n suggestions: []\n });\n\n const [ debouncedSuggest ] = useDebouncedCallback((text: string) => {\n if (! text) return;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n gql.execute<GeoSuggestQueryVariables, GeoSuggestQueryResponse>(QUERY, {\n text,\n rootRegionsApp,\n userRegionId: regionId,\n limit,\n suggestTypes\n })\n .then(data => {\n let items = data?.data?.suggest\n ?.filter(item => item && item.__typename !== '%other' && ! selected?.has(item.data.id)) ?? [];\n\n // Пока умеем искать только один ЖК\n if (! showNewBuildingsGroup) {\n items = items.filter(item => item && item.__typename !== SuggestItemTypeEnum.NewBuilding);\n }\n\n let suggestionsByGroup = groupBy(items, '__typename') as SuggestionsByGroupType;\n\n // Делаем правильный порядок\n suggestionsByGroup = {\n SuggestItemMetro: suggestionsByGroup.SuggestItemMetro ?? [],\n SuggestItemAddress: suggestionsByGroup.SuggestItemAddress ?? [],\n SuggestItemDistrict: suggestionsByGroup.SuggestItemDistrict ?? [],\n SuggestItemNewBuilding: suggestionsByGroup.SuggestItemNewBuilding ?? [],\n SuggestItemDeveloper: suggestionsByGroup.SuggestItemDeveloper ?? []\n };\n\n if (startWithNewBuildings) {\n const { SuggestItemNewBuilding, SuggestItemDeveloper } = suggestionsByGroup;\n\n suggestionsByGroup = {\n // @ts-ignore\n SuggestItemNewBuilding,\n // @ts-ignore\n SuggestItemDeveloper,\n ...suggestionsByGroup\n };\n }\n\n setSuggestions({\n suggestionsByGroup,\n suggestions: Object\n .values(suggestionsByGroup)\n .reduce<SuggestionType[]>((ret, groupedItems) =>\n ret.concat(groupedItems as []), [])\n });\n });\n }, 300);\n\n const fetchSuggestions = (text: string) => {\n debouncedSuggest(text);\n };\n\n const setSuggestion = useCallback((suggestion: SuggestionType) => {\n const [ newSuggestion, newRegionId ] = correctSuggestion(suggestion, regionId);\n\n onGeoChange(newRegionId && regionId !== newRegionId ? {\n ...newSuggestion,\n data: {\n ...newSuggestion.data,\n regionId: newRegionId\n }\n } : newSuggestion);\n }, [ onGeoChange, regionId ]);\n\n const renderList = useCallback<NonNullable<ISuggestProps<SuggestionType>['renderList']>>(\n (props, { focusedIndex, label = '' }, handlers) => {\n let realIndex = 0;\n\n return (\n <div className={cn('list-container', { borderOut: listBorderOut })}>\n <div\n data-test='filter-geo-suggest'\n className={cn('list', { borderOut: listBorderOut })}>\n {\n Object\n .entries(suggestions.suggestionsByGroup)\n .filter(([ , items ]) => Array.isArray(items) && items.length)\n .map((ent, index, { length }) => {\n // eslint-disable-next-line max-len\n const [ group, items ] = ent as [ SuggestionTypenameType, SuggestionType[] ];\n\n return (\n <div\n key={group}\n data-test={`filter-geo-suggest-${group}`}\n className={cn('list-group', { borderOut: listBorderOut })}\n >\n <Typography\n variant='small-alone'\n className={cn('list-group-header', { borderOut: listBorderOut })}\n >\n {TYPE_MAP[group] || ''}\n </Typography>\n {\n items.map(item => {\n const currentIndex = realIndex++;\n\n const onMouseDown = onInputToggleFocus ? (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onInputToggleFocus) {\n onInputToggleFocus(false);\n }\n handlers.handleItemMouseDown(e, currentIndex);\n } : (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => handlers.handleItemMouseDown(e, currentIndex);\n\n return (\n <div\n data-test='filter-geo-suggest-item'\n id={`filter-geo-suggest-item-${item?.data?.id ?? currentIndex}`}\n key={`${label}-${currentIndex}`}\n className={cn('list-item', {\n borderOut: listBorderOut,\n highlight: currentIndex === focusedIndex\n })}\n onMouseEnter={e =>\n handlers.handleItemMouseEnter(e, currentIndex)\n }\n onMouseDown={onMouseDown}\n >\n {item && renderSuggestItem(item, label)}\n </div>\n );\n })\n }\n {index < length - 1 && (\n <div className={cn('group-divider', {\n borderOut: listBorderOut\n })} />\n )}\n </div>\n );\n })\n }\n </div>\n </div>\n );\n },\n [ listBorderOut, onInputToggleFocus, suggestions.suggestionsByGroup ]\n );\n\n return (\n <div className={cn()}>\n <Suggest\n <SuggestionType>\n width='max'\n size='xxl'\n inputSize='s'\n clear={clear}\n borderOut={borderOut}\n autoFocus={autoFocus}\n suggestions={suggestions.suggestions}\n onClick={spySuggest?.show}\n renderList={\n (props, suggestionState, handlers) => spySuggest ? (\n <SuggestPopup hide={spySuggest?.hide} triggerElement={spySuggest?.triggerElement}>\n {renderList(props, suggestionState, handlers)}\n </SuggestPopup>\n ) :\n renderList(props, suggestionState, handlers)\n }\n renderInput={renderInput}\n onInputToggleFocus={onInputToggleFocus}\n renderEmptyList={\n ({ emptyText }) => spySuggest ? (\n <SuggestPopup hide={spySuggest?.hide} triggerElement={spySuggest?.triggerElement}>\n <div className={cn('empty', { borderOut: listBorderOut })}>\n {emptyText}\n </div>\n </SuggestPopup>\n ) : (\n <div className={cn('empty', { borderOut: listBorderOut })}>\n {emptyText}\n </div>\n )\n }\n onSelect={setSuggestion}\n clearOnSelect\n placeholder={\n showNewBuildingsGroup && placeholderWithNewBuildings ?\n placeholderWithNewBuildings :\n placeholder\n }\n fetchSuggestions={fetchSuggestions} />\n </div>\n );\n};\n","import classname from '@search/classname/src';\nimport React from 'react';\nimport './MetroMark.css';\n\nconst cnMetroMark = classname.bind(null, 'MetroMark');\n\nexport const MetroMark: React.FunctionComponent<{\n className?: string;\n colors: readonly string[];\n}> = ({ colors, className }) => {\n return (\n <span className={cnMetroMark(null, {}, className)}>\n {\n colors.slice(0).reverse().map(color => (\n <span\n key={color}\n style={{ backgroundColor: color }}\n className={cnMetroMark('line', { type: 'mark' })}\n />\n ))\n }\n </span>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport { Header as LayoutComponentHeader } from '@vtblife/layout-components';\n\nimport { graphql } from '@search/gql-client/src/useGql';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { useRouter } from '@search/offer-search-routes/src';\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport classname from '@search/classname/src';\nimport { NewBuildingCardRoute } from '@search/nb-routes/src/NewBuildingCardRoute';\nimport { NewBuildingConstructionRoute } from '@search/nb-routes/src/NewBuildingConstructionRoute';\nimport { NewBuildingSearchRoute } from '@search/nb-routes/src/NewBuildingSearchRoute';\nimport { DeveloperSearchRoute } from '@search/nb-routes/src/DeveloperSearchRoute';\nimport { DeveloperLandingRoute } from '@search/nb-routes/src/DeveloperLandingRoute';\nimport { DeveloperRoute } from '@search/nb-routes/src/DeveloperRoute';\nimport { NewBuildingSearchMapRoute } from '@search/nb-routes/src/NewBuildingSearchMapRoute';\nimport { Shared } from '@search/whitelabel-search-www/types/shared';\n\nimport { dataLayerPush } from '../../../../domain/google/dataLayerPush';\nimport { getDeveloperPromoName } from '../../../../domain/newbuilding/developer-promo/helpers';\nimport { getDeveloperBannerGtmData } from '../../../../domain/newbuilding/developer-promo/analytics';\nimport { DeveloperWithPromoName } from '../../../../domain/newbuilding/developer-promo/types';\n\nimport type { HeaderQuery$variables as HeaderQueryVariables, HeaderQuery$data as HeaderQueryResponse } from './__generated__/HeaderQuery.graphql';\nimport './styles.css';\n\nconst POSSIBLE_ACTIVE_PARTNERS_SET = new Set([\n 'samolet'\n]);\n\nconst cn = classname.bind(null, 'Header');\n\nconst headerQuery = graphql`\n query HeaderQuery($regionId: Int) {\n header(regionId: $regionId) {\n items {\n id\n displayName\n path\n icon\n dropdownMenu {\n id\n displayName\n url\n icon\n dropdownMenu {\n id\n displayName\n url\n }\n }\n }\n partners {\n samolet {\n id\n logo\n logoWhite\n url\n }\n }\n personalButtons {\n favorites {\n professionalUrl,\n url\n }\n offerPlacement {\n professionalUrl,\n authorizedUrl,\n url\n }\n savedSearch {\n professionalUrl,\n url\n }\n }\n loginPaths {\n default {\n id\n url\n }\n client {\n id\n url\n }\n partner {\n id\n url\n }\n professional {\n id\n url\n }\n }\n }\n sidebar(regionId: $regionId) {\n items {\n id\n displayName\n path\n url\n icon\n showInDesktopProfileMenu\n dropdownMenu {\n id\n displayName\n path\n url\n icon\n showInDesktopProfileMenu\n }\n }\n footerItems {\n id\n displayName\n path\n url\n icon\n showInDesktopProfileMenu\n }\n }\n }\n`;\n\nexport function useHeaderFetcher() {\n const gql = useGqlContext();\n\n return React.useCallback(\n (vars: HeaderQueryVariables, opts?: { signal?: AbortSignal }) => gql.client<\n HeaderQueryVariables,\n HeaderQueryResponse\n >(headerQuery, vars, opts)\n , [ gql ]\n );\n}\n\nexport function useHeaderLoader() {\n return useGql2Loader(useHeaderFetcher(), { cachePrefix: 'Header', authTrack: true });\n}\n\nconst Header: React.FC<{\n buildLink?: (url: string) => string;\n regionId?: number;\n developerPromoRegionId?: number;\n isFullWidth?: boolean;\n isBordered?: boolean;\n}> = ({\n buildLink,\n regionId,\n developerPromoRegionId,\n isFullWidth = true,\n isBordered\n}) => {\n const { auth } = useM2AuthContext();\n const headerLoader = useHeaderLoader();\n const { data: dataRaw } = headerLoader({ regionId });\n const dataRef = React.useRef(dataRaw);\n\n if (dataRaw) dataRef.current = dataRaw;\n const data = dataRef.current;\n\n // @ts-ignore\n const router: Shared.RouterType = useRouter();\n const developerWithPromoNameByRegion = useMemo<DeveloperWithPromoName | undefined>(() => {\n const resultPartner = getDeveloperPromoName(developerPromoRegionId);\n\n // @ts-expect-error\n return POSSIBLE_ACTIVE_PARTNERS_SET.has(resultPartner) ? resultPartner : undefined;\n }, [ developerPromoRegionId ]);\n const partners = useMemo(() => {\n return Object.fromEntries(Object.entries(data?.header.partners ?? {}).filter(([ key, value ]) => POSSIBLE_ACTIVE_PARTNERS_SET.has(key) && value));\n }, [ data?.header.partners ]);\n\n const pageType = useMemo(() => {\n const { route } = router.resolve([\n NewBuildingSearchRoute,\n NewBuildingSearchMapRoute,\n DeveloperSearchRoute,\n NewBuildingCardRoute,\n NewBuildingConstructionRoute,\n DeveloperLandingRoute,\n DeveloperRoute\n ]);\n\n switch (route.displayName) {\n case 'NewBuildingCardRoute':\n case 'NewBuildingConstructionRoute':\n return 'card';\n case 'DeveloperLandingRoute':\n return 'landing';\n case 'NewBuildingSearchRoute':\n case 'NewBuildingSearchMapRoute':\n case 'DeveloperSearchRoute':\n case 'DeveloperRoute':\n return 'serp';\n default:\n return;\n }\n }, [ router ]);\n\n const onPartnerClick = useCallback((partnerName: string) => {\n const dataObj = pageType && getDeveloperBannerGtmData(partnerName, {\n action: 'click',\n section: 'logo',\n pageType\n });\n\n dataObj && dataLayerPush(dataObj);\n }, [ pageType ]);\n\n const currentRole = auth.user?.currentRoleType;\n\n const getUrl = (url?: string | null) => buildLink && url?.startsWith('/') ? buildLink(url) : url;\n\n const items = data?.header?.items?.map(item => ({\n ...item,\n\n path: getUrl(item?.path),\n\n dropdownMenu: item.dropdownMenu?.map(dropDownItem => ({\n ...dropDownItem,\n url: getUrl(dropDownItem?.url),\n id: dropDownItem.id + (dropDownItem.url ?? '0'),\n dropdownMenu: dropDownItem.dropdownMenu?.map(subDropdownItem => ({\n ...subDropdownItem,\n url: getUrl(subDropdownItem?.url),\n id: subDropdownItem.id + (subDropdownItem.url ?? '0')\n }))\n }))\n })) ?? [];\n\n return (\n <div className={cn()}>\n <LayoutComponentHeader\n isColored\n isBordered={isBordered}\n isFullWidth={isFullWidth}\n cdnUrl='https://cdn.m2.ru'\n loginPaths={data?.header.loginPaths}\n items={items}\n partners={partners}\n pathname={router.location.pathname}\n activePartner={developerWithPromoNameByRegion}\n authorizedItems={data?.sidebar}\n roleType={currentRole}\n logoutPath={`/logout?retpath=${encodeURIComponent(router.currentUrl)}`}\n onPartnerClick={onPartnerClick}\n personalButtons={data?.header?.personalButtons}\n />\n </div>\n );\n};\n\nexport default errorCatcherWrap(Header);\n","import { isMskWide } from '@search/helpers/src/isRegion';\n\nimport { DeveloperWithPromoName } from './types';\n\nexport const getDeveloperPromoName = (regionId?: number): DeveloperWithPromoName | undefined => {\n if (regionId) {\n if (isMskWide(regionId)) {\n return 'samolet';\n }\n }\n\n return;\n};\n","/* eslint-disable max-len */\nimport { ScriptTagAttributes } from '../Scripts';\n\nconst today = new Date();\nconst currentMonthStart = new Date(Date.UTC(today.getFullYear(), today.getMonth(), 1));\nconst nextMonthEnd = new Date(Date.UTC(today.getFullYear(), today.getMonth() + 2, 0));\n\nexport function seoLdEventScript({\n url = '',\n actionName = '',\n actionNamePrefix = '🔔 ',\n imageUrl = undefined as string | undefined,\n description = '',\n startDate = currentMonthStart,\n endDate = nextMonthEnd,\n location = {\n mainName: '',\n latitude: undefined as number | undefined,\n longitude: undefined as number | undefined,\n region: ''\n },\n organizer = {\n name: 'M2',\n url: 'https://m2.ru'\n }\n} = {}): ScriptTagAttributes {\n const obj = {\n '@context': 'http://schema.org',\n '@type': 'SaleEvent',\n name: `${actionNamePrefix}${actionName}`,\n description,\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString(),\n url,\n location: ! location ? undefined : {\n '@type': 'Place',\n '@context': 'http://schema.org',\n name: location.mainName,\n address: {\n '@type': 'PostalAddress',\n '@context': 'http://schema.org',\n streetAddress: location.region,\n addressLocality: location.region,\n addressRegion: location.region\n },\n geo: ! location.latitude ? undefined : {\n '@type': 'GeoCoordinates',\n '@context': 'http://schema.org',\n latitude: location.latitude,\n longitude: location.longitude\n }\n },\n image: imageUrl,\n performer: { name: location.mainName, type: 'Thing' },\n organizer: {\n name: organizer.name,\n type: 'Thing',\n url: organizer.url\n }\n };\n\n return {\n content: JSON.stringify(obj),\n type: 'application/ld+json'\n };\n}\n\n","import React, { RefObject, useEffect, useRef } from 'react';\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\ntype ImageTag = React.DetailedHTMLFactory<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>;\ntype DivTag = React.DetailedHTMLFactory<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n/**\n * Параметры для картинки.\n */\nexport interface IImage {\n url?: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n placeholder?: boolean | string;\n type?: 'cover' | 'contain' | 'crop' | 'videoCover';\n className?: string;\n loading?: 'lazy' | 'eager';\n ref?: RefObject<ImageTag | DivTag>;\n onLoad?: () => void;\n onLoadVerticalImage?: (value: boolean) => void;\n onError?: () => void;\n itemProp?: string;\n style?: React.CSSProperties;\n}\n\nconst cn = classname.bind(null, 'Image');\n\nconst Image: React.FunctionComponent<IImage> = React.forwardRef((props, ref) => {\n const refImg = useRef<HTMLImageElement>();\n\n let Tag = ('img' as any) as ImageTag | DivTag;\n const attrs: React.ImgHTMLAttributes<HTMLImageElement> = {\n src: '',\n alt: '',\n title: '',\n crossOrigin: 'anonymous'\n };\n const style: React.CSSProperties = { ...props.style };\n\n if (props.url) {\n attrs.src = props.url;\n }\n\n if (props.alt) attrs.alt = props.alt;\n if (props.title) attrs.title = props.title;\n if (props.width) attrs.width = props.width;\n if (props.height) attrs.height = props.height;\n if (props.itemProp) attrs.itemProp = props.itemProp;\n if (props.loading) attrs.loading = props.loading;\n\n if (typeof props.placeholder === 'string') {\n style.backgroundColor = props.placeholder;\n }\n\n if (props.type) {\n if (props.type !== 'videoCover') {\n Tag = ('div' as any) as DivTag;\n\n if (props.url) style.backgroundImage = 'url(' + props.url + ')';\n if (props.width) style.width = props.width + 'px';\n if (props.height) style.height = props.height + 'px';\n }\n\n attrs.crossOrigin = undefined;\n }\n\n useEffect(() => {\n if (refImg.current) {\n refImg.current.onload = null;\n refImg.current.onerror = null;\n }\n\n refImg.current = null;\n\n if (props.onLoad) {\n refImg.current = document.createElement('img');\n\n refImg.current.onload = () => {\n if (props?.onLoadVerticalImage) {\n const isVertical = ((refImg.current?.width ?? 1) / (refImg.current?.height ?? 1)) <= 1;\n\n props?.onLoadVerticalImage(isVertical);\n }\n props.onLoad();\n\n refImg.current.onload = null;\n };\n\n refImg.current.onerror = () => {\n props.onError && props.onError();\n\n refImg.current.onerror = null;\n };\n\n if (props.url) {\n refImg.current.src = props.url;\n }\n }\n }, [ props.url, props.onLoad, props.onError, props.onLoadVerticalImage ]);\n\n return (\n <Tag\n {...attrs}\n ref={ref}\n style={style}\n className={cn(null, {\n placeholder: props.placeholder,\n type: props.type\n }, props.className)}\n />\n );\n});\n\nexport default Image;\n","import './styles.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { useTooltip } from '@vtblife/uikit';\n\nconst cn = classname.bind(null, 'MinimalBanksMortgageEconomy');\n\n// eslint-disable-next-line max-len\nconst defaultTitle = 'В\\u00A0связи с\\u00A0возможностью выбора наиболее выгодного предложения среди представленных банков';\n\nexport function MinimalBanksMortgageEconomy({\n value,\n title = defaultTitle,\n underline = false,\n dotted,\n}: {\n underline?: boolean;\n dotted?: boolean;\n title?: string;\n value: string;\n}) {\n const { to, registerControl } = useTooltip();\n\n return (\n <span className={cn('percent')}>\n {value}\n </span>\n );\n}\n","/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/dictionaries/src/form.ts\n */\nexport const PROPERTY_COST_DEFAULT = 4000000;\nexport const PROPERTY_COST_MIN = 500000;\nexport const PROPERTY_COST_MAX = 200000000;\nexport const PROPERTY_COST_STEP = 100000;\n\nexport const OWN_AMOUNT_DEFAULT = 1500000;\nexport const OWN_AMOUNT_MIN_FACTOR = 0.1;\nexport const OWN_AMOUNT_MAX_FACTOR = 0.9;\nexport const OWN_AMOUNT_STEP = 5000;\n\nexport const REMAINING_AMOUNT_DEFAULT = 1500000;\nexport const REMAINING_AMOUNT_MIN_FACTOR = 0.1;\nexport const REMAINING_AMOUNT_MAX_FACTOR = 0.9;\nexport const REMAINING_AMOUNT_STEP = 5000;\n\nexport const ADDITIONAL_AMOUNT_DEFAULT = 0;\nexport const ADDITIONAL_AMOUNT_MIN = 0;\n\nexport const TERM_DEFAULT = 20;\nexport const TERM_MIN = 1;\nexport const TERM_MAX = 30;\n\n/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/utils/src/calculate-factored-range.ts\n */\nexport const calculateFactoredRange = (\n relativeValue: number,\n minFactor = OWN_AMOUNT_MIN_FACTOR,\n maxFactor = OWN_AMOUNT_MAX_FACTOR,\n minRelativeValue = PROPERTY_COST_MIN,\n maxRelativeValue = PROPERTY_COST_MAX\n): [number, number] => {\n const correctRelativeValue = getRangedValue(relativeValue, minRelativeValue, maxRelativeValue);\n\n return [ Math.round(correctRelativeValue * minFactor), Math.round(correctRelativeValue * maxFactor) ];\n};\n\n/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/utils/src/get-ranged-value.ts\n */\nexport const getRangedValue = (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max);\n","import { MortgagePurpose } from '@search/graphql-typings';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport {\n calculateFactoredRange, getRangedValue, OWN_AMOUNT_STEP, PROPERTY_COST_MAX, PROPERTY_COST_MIN,\n PROPERTY_COST_STEP, TERM_MAX, TERM_MIN\n} from './constants';\n\nexport interface UseBankMortgageFormProps {\n /* Срок займа */\n term: number;\n\n isPreferentialNbCondition?: boolean;\n\n /* Стоимость недвижимости */\n propertyCost: number;\n\n /* Сумма собственных средств */\n ownAmount: number;\n\n /* Тип ипотеки (Вторичка, Новостройка, Рефинансирование) */\n purpose: typeof MortgagePurpose[keyof typeof MortgagePurpose];\n\n /* id Региона (отличается от id в классифайде) */\n regionId: number;\n\n onChange: (data: Omit<UseBankMortgageFormProps, 'onChange'>) => void;\n\n ownAmountFromPropertyCost?: boolean;\n}\n\nexport const calculateOwnAmount = (value: number, factor: number = 0.2) => calculateFactoredRange(value, factor)[0];\n\nexport const useBankMortgageForm = ({\n onChange,\n ownAmountFromPropertyCost = true,\n ...initialState\n}: UseBankMortgageFormProps) => {\n const [ formState, setFormState ] = useState(initialState);\n\n /**\n * @see https://gitlab.cloud.vtblife.ru/vtblife/frontend/mortgage/-/blob/7a482a47/src/client/components/realty-form/form-component.tsx\n */\n const calculatedFormValues = useMemo(() => {\n const [ ownAmountMin, ownAmountMax ] = calculateFactoredRange(formState.propertyCost);\n const percent = getRangedValue(Math.round((formState.ownAmount / formState.propertyCost) * 100), 0, 100);\n\n return {\n propertyCost: {\n min: PROPERTY_COST_MIN,\n max: PROPERTY_COST_MAX,\n step: PROPERTY_COST_STEP\n },\n ownAmount: {\n min: ownAmountMin,\n max: ownAmountMax,\n step: OWN_AMOUNT_STEP,\n percent: `${percent ? `${percent}%` : ''}`,\n labelFrom: `от ${formatNumber(ownAmountMin)} ₽`,\n labelTo: `до ${formatNumber(ownAmountMax)} ₽`\n },\n term: {\n min: TERM_MIN,\n max: TERM_MAX\n }\n };\n }, [ formState.ownAmount, formState.propertyCost ]);\n\n const handleFieldChange = useCallback((\n name: keyof typeof formState,\n value: number | string\n ) => {\n setFormState(prevState => {\n let newState = prevState;\n\n let ownAmount = prevState.ownAmount;\n\n //@ts-ignore\n value = value ? Number(value) : (Number(calculatedFormValues[name].min) ?? 0);\n //@ts-ignore\n if (Number.isNaN(value)) value = (Number(calculatedFormValues[name].min) ?? 0);\n\n if (name === 'propertyCost' && ownAmountFromPropertyCost) {\n const [ ownAmountMin, ownAmountMax ] = calculateFactoredRange(value);\n\n ownAmount = getRangedValue(prevState.ownAmount, ownAmountMin, ownAmountMax);\n }\n\n if (\n prevState[name] !== value ||\n ownAmount !== prevState.ownAmount\n ) {\n newState = {\n ...newState,\n ownAmount,\n [name]: value\n };\n }\n\n if (onChange && newState !== prevState) onChange(newState);\n\n return newState;\n });\n }, [ onChange ]);\n\n return {\n formState,\n formErrors: {\n propertyCost: formState.propertyCost < calculatedFormValues.propertyCost.min ||\n formState.propertyCost > calculatedFormValues.propertyCost.max,\n ownAmount: formState.ownAmount < calculatedFormValues.ownAmount.min ||\n formState.ownAmount > calculatedFormValues.ownAmount.max\n },\n handleFieldChange,\n calculatedFormValues\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { graphql } from '@search/gql-client/src/useGql';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\n\nimport useDebouncedCallback from '../../../hooks/useDebouncedCallback';\nimport { UseBankMortgageFormProps } from '../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { useMinimalBanksMortgageEconomy } from '../useMinimalBanksMortageState';\nimport { mortgage2BestOfferFromOffers } from '../mortgage2/useMortgage2BestOffer';\n\nimport type {\n MinimalBanksMortgageOffersQuery$data as MinimalBanksMortgageOffersQueryResponseGql,\n MinimalBanksMortgageOffersQuery$variables as MinimalBanksMortgageOffersQueryVariablesGql\n} from './__generated__/MinimalBanksMortgageOffersQuery.graphql';\n\nexport type MinimalBanksMortgageOffersQueryResponse = MinimalBanksMortgageOffersQueryResponseGql;\nexport type MinimalBanksMortgageOffersQueryVariables = MinimalBanksMortgageOffersQueryVariablesGql;\n\nexport type MinimalBanksMortgageOffersQueryResponseOffer = MinimalBanksMortgageOffersQueryResponse['minimalBanksMortgageOffers'][number];\n\nconst MinimalBanksMortgageOffersQuery = graphql`\n query MinimalBanksMortgageOffersQuery(\n $term: Int!\n $isPreferential: Boolean\n $propertyCost: Float!\n $ownAmount: Float!\n $regionId: Int!\n $purpose: MortgagePurpose!\n ) {\n minimalBanksMortgageOffers(\n term: $term\n isPreferential: $isPreferential\n propertyCost: $propertyCost\n ownAmount: $ownAmount\n regionId: $regionId\n purpose: $purpose\n ) {\n name\n type\n bankId\n minimalPercent\n minimalPercentFormatted\n minimalPayment\n minimalPaymentFormatted\n icon {\n origin\n }\n }\n }\n`;\n\nexport function useMinimalBanksMortgageOffersFetcher() {\n const gql = useGqlContext();\n\n return useCallback(\n (vars: MinimalBanksMortgageOffersQueryVariables, opts?: { signal?: AbortSignal }) => gql.client<\n MinimalBanksMortgageOffersQueryVariables,\n MinimalBanksMortgageOffersQueryResponse\n >(MinimalBanksMortgageOffersQuery, vars, opts)\n .then(response => {\n return response;\n }),\n [ gql ]\n );\n}\n\nexport type MinimalBanksMortgageOffer = MinimalBanksMortgageOffersQueryResponse['minimalBanksMortgageOffers'][number];\n\ntype MinimalBanksMortgageOfferDiscount = {\n disabled?: boolean;\n minimalPercentDiscount: number;\n minimalPercentDiscountFormatted: string;\n minimalPaymentDiscount: number;\n minimalPaymentDiscountFormatted: string;\n};\n\nexport type MinimalBanksMortgageOfferWithDiscount = MinimalBanksMortgageOffer &\n Partial<MinimalBanksMortgageOfferDiscount>;\n\nexport function useMinimalBanksMortgageOffersLoader() {\n return useGql2Loader(\n useMinimalBanksMortgageOffersFetcher(),\n { cachePrefix: 'minimalBanksMortgageOffers' }\n );\n}\n\nexport function useMinimalBanksMortgageOffersSliced({\n term,\n from,\n propertyCost,\n ownAmount,\n regionId,\n purpose,\n isPreferentialNbCondition,\n defaultVisibleOffers = 3\n}: Omit<UseBankMortgageFormProps, 'onChange'> & { from?: string; defaultVisibleOffers?: number }) {\n const [ formData, setFormDataRaw ] = useState({\n term,\n purpose,\n regionId,\n ownAmount: Math.round(ownAmount),\n propertyCost: Math.round(propertyCost)\n });\n\n const isFormChangedRef = useRef(false);\n\n const wrapperSetFormDataRaw = useCallback((args: Parameters<typeof setFormDataRaw>[0]) => {\n isFormChangedRef.current = true;\n setFormDataRaw(args);\n });\n\n const [ setFormData ] = useDebouncedCallback(wrapperSetFormDataRaw, 500);\n\n const [ fakeLoadingRaw, setFakeLoading ] = useState(false);\n const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n\n const { data, loading, errors: error } = formData.propertyCost > 0 && formData.ownAmount > 0 ?\n minimalBanksMortgageOffersLoad({\n ...formData,\n isPreferential: isPreferentialNbCondition,\n propertyCost: Math.round(formData.propertyCost)\n }) :\n { data: undefined, loading: false, errors: [] };\n\n const offersFull = data?.minimalBanksMortgageOffers ?? [];\n const offers = offersFull.slice(0, defaultVisibleOffers);\n const bestMortgageOffer = mortgage2BestOfferFromOffers(offersFull);\n\n const fakeLoading = fakeLoadingRaw || loading;\n\n useEffect(() => {\n if (loading) setFakeLoading(true);\n const handle = setTimeout(() => setFakeLoading(false), 1000);\n\n return () => {\n clearTimeout(handle);\n };\n }, [ loading ]);\n\n const isEmpty = offers.length === 0 && ! fakeLoading;\n\n let totalCost: number | undefined = formData.propertyCost - formData.ownAmount;\n\n if (totalCost <= 0) totalCost = undefined;\n\n const totalCostFormatted = totalCost ? formatPrice({\n value: totalCost * 100,\n displayCurrency: true,\n noFractional: true,\n currency: Currency.RUB\n }) : undefined;\n\n let offersOrMocks: readonly (typeof offers[number] | undefined)[] = offers;\n\n if (fakeLoading) {\n const fakeOffers: undefined[] = [];\n\n for (let i = 0; i < defaultVisibleOffers; i++) {\n fakeOffers.push(undefined);\n }\n offersOrMocks = fakeOffers;\n }\n\n return {\n ...useMinimalBanksMortgageEconomy({ ...formData, from }),\n setFormData,\n setFormDataRaw: wrapperSetFormDataRaw,\n formData,\n offersOrMocks,\n offersFull,\n bestMortgageOffer,\n totalCost,\n totalCostFormatted,\n isEmpty,\n error,\n loading: fakeLoading,\n isFormChanged: isFormChangedRef.current\n };\n}\n\nexport type UseMinimalBanksMortgageOffersSlicedResult = ReturnType<typeof useMinimalBanksMortgageOffersSliced>;\n","import React from 'react';\n\nexport const Source = {\n UNKNOWN_SOURCE: 0,\n WEB_LK: 1,\n MOBILE_APP: 2,\n BANKI_RU: 3,\n COMFORT_SEARCH_M2: 4,\n SRAVNI_RU: 5,\n WEB_LANDING: 6,\n NOVOSTROIKY: 7,\n // zbs is not defined\n ZBS: 8\n};\n\nexport type SourceValue = typeof Source[keyof typeof Source];\n\nconst MortgageAppSourceContext = React.createContext<SourceValue>(Source.UNKNOWN_SOURCE);\n\nexport function useMortgageAppSource() {\n return React.useContext(MortgageAppSourceContext);\n}\n\nexport const MortgageAppSourceProvider: React.FC<{ source: SourceValue }> = ({ children, source }) => {\n return <MortgageAppSourceContext.Provider value={source}>{children}</MortgageAppSourceContext.Provider>;\n};\n","import './MortgageGovernmentDisclaimer.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageGovernmentDisclaimer');\n\nexport function MortgageGovernmentDisclaimer({\n onClick,\n isAccent = false,\n isLongDescr,\n descriptionText,\n mainText,\n isImportant,\n splitOnRows\n}: {\n isAccent?: boolean;\n isMobile?: boolean;\n isLongDescr?: boolean;\n onClick?(e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void;\n descriptionText?: React.ReactNode;\n mainText?: string;\n isImportant?: boolean;\n splitOnRows?: boolean;\n}) {\n return (<div className={cn(null, { isImportant, splitOnRows })}>\n {isLongDescr && (<div className={cn('icon-wrap')}><Icon name='exclamation-circle' size='s' /></div>)}\n <span className={cn('text', { isImportant, splitOnRows })}>{mainText ?? 'Одобрят ли вам ипотеку с\\u00A0господдержкой?'}</span>\n <button\n className={cn('button', { accent: isAccent })}\n onClick={e => {\n e.preventDefault();\n onClick?.(e);\n }}\n data-test='disclamer-click'\n >{descriptionText ?? (isLongDescr ? 'Узнать условия кредитования' : 'Условия кредитования')}</button>\n </div>);\n}\n","import './MortgageGovernmentDisclaimer.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\n\nconst cn = classname.bind(null, 'MortgageGovernmentDisclaimer');\n\nexport function MortgageGovernmentDisclaimerModal({\n isMobile,\n onSuccess,\n onClose,\n additionalPrograms,\n withoutAccent,\n btnText = 'Подать заявку на ипотеку'\n}: {\n isMobile?: boolean;\n onSuccess?(e: React.MouseEvent<Element, MouseEvent>): void;\n onClose?(): void;\n additionalPrograms?: {title: string; desc: string; inner?: string}[];\n withoutAccent?: boolean;\n btnText?: string;\n}) {\n const title = 'Одобрят ли вам ипотеку с\\u00A0господдержкой?';\n\n return (<Modal\n onClose={onClose}\n closable\n mobile={isMobile}\n swipeToClose={! isMobile}\n opened\n size='m'\n >\n {isMobile ? <Modal.Header>{title}</Modal.Header> : <Modal.Title>{title}</Modal.Title>}\n\n <Modal.Content scrollable={isMobile}>\n <div className={cn('block-main')}>\n <div className={cn('block')}>\n <Typography variant='h3'>Семейная ипотека до 6%</Typography>\n <div>\n Подходит семьям с детьми, которые родились, были усыновлены или удочерены не ранее 2018 года,\n и семьям в которых есть ребёнок с инвалидностью. <span className={cn('inner', { withoutAccent })}>\n Первоначальный взнос от 15%, максимальный срок кредита – 30 лет,\n а размер кредита до 12 млн ₽ (в регионах до 6 млн ₽).\n </span>\n </div>\n </div>\n\n <div className={cn('block')}>\n <Typography variant='h3'>Льготная ипотека до 12%</Typography>\n <div>\n Подходит для всех категорий граждан РФ, приобретающих жилье в новостройках от застройщика. <span className={cn('inner', { withoutAccent })}>\n Первоначальный взнос от 15%, максимальный срок кредита — 30 лет, размер кредита до 12 млн ₽ (в регионах до 6 млн ₽).\n </span>\n </div>\n </div>\n\n <div className={cn('block')}>\n <Typography variant='h3'>ИТ ипотека от 5%</Typography>\n <div>\n Подходит официально оформленных сотрудников IT-компаний, аккредитованных Минцифры РФ с зарплатой от 150 тыс. ₽ до вычета налогов. <span className={cn('inner', { withoutAccent })}>\n Первоначальный взнос от 15%, максимальный срок кредита — 30 лет, размер кредита до 18 млн ₽ (в регионах до 6 млн ₽).\n </span>\n </div>\n </div>\n\n {additionalPrograms?.map(({ inner, desc, title }) => (\n <div className={cn('block')} key={title}>\n <Typography variant='h3'>{title}</Typography>\n <div>\n {desc} {inner ? <span className={cn('inner', { withoutAccent })}>{inner}</span> : null}\n </div>\n </div>\n ))}\n <Modal.Actions>\n <Button\n variant='accent'\n onClick={e => {\n e.preventDefault();\n onSuccess?.(e);\n }}\n dataTest='mortgage-send'\n >{btnText}</Button>\n </Modal.Actions>\n </div>\n </Modal.Content>\n </Modal>);\n}\n","/**\n * Ипотечный брокер принимает только числовые значения в get параметрах.\n */\n\nexport enum MortgagePurposeEnum {\n PRIMARY = 1,\n SECONDARY = 2,\n REFINANCE = 3,\n PHP = 4,\n FAMILY = 5,\n UNKNOWN = 0\n}\n","import { formatLocaleNumber } from '@search/helpers/src/formatNumber';\n\nexport const defaultBanksTotal = 22;\nexport const defaultMortgageRateNb = 4.5;\nexport const defaultMortgageRateSecond = 13;\n\nexport const defaultMortgageRateNbFormatted = formatLocaleNumber(defaultMortgageRateNb);\nexport const defaultMortgageRateSecondFormatted = formatLocaleNumber(defaultMortgageRateSecond);\n","import { declensionByNumber } from '@search/helpers/src/declensionByNumber';\n\nexport const declensionOffers = (offersCount: number) =>\n declensionByNumber(offersCount, [ 'предложение', 'предложения', 'предложений' ]);\n\nexport const declensionYear = (year: number) => declensionByNumber(year, [ 'год', 'года', 'лет' ]);\n\nexport const declensionСonsiderBankNominative = (banksTotal: number) =>\n declensionByNumber(banksTotal, [ 'рассмотрит', 'рассмотрят', 'рассмотрят' ]);\n\nexport const declensionHour = (hours: number) => declensionByNumber(hours, [ 'час', 'часа', 'часов' ]);\n\nexport const declensionMinute = (minutes: number) => declensionByNumber(minutes, [ 'минута', 'минуты', 'минут' ]);\n\nexport const declensionBankNominative = (banksTotal: number) =>\n declensionByNumber(banksTotal, [ 'банк', 'банка', 'банков' ]);\n\nexport const declensionBankGenitive = (banksTotal: number) =>\n declensionByNumber(banksTotal, [ 'банка', 'банков', 'банков' ]);\n","import './MortgageField.css';\n\nimport React from 'react';\n\nimport type { TypographyProps } from '@vtblife/uikit/dist/components/typography/types';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageField');\n\nexport function MortgageField({\n title,\n children,\n gap = 'xs',\n titleProps = {\n variant: 'h3'\n },\n descriptionProps = {\n color: 'secondary',\n variant: 'primary-alone'\n },\n className\n}: {\n gap?: 'xs' | 's' | 'm' | 'l';\n titleProps?: {\n accent?: boolean;\n variant?: TypographyProps['variant'];\n resetFont?: boolean;\n };\n descriptionProps?: {\n accent?: boolean;\n variant?: TypographyProps['variant'];\n color?: TypographyProps['color'];\n };\n title: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (<div className={cn('field', { gap }, className)}>\n {title && <Typography\n variant={titleProps?.variant}\n color={titleProps?.accent ? 'orange-500' : undefined}\n className={cn('title', { resetFont: titleProps.resetFont })}\n children={title} />}\n {children && <Typography\n variant={descriptionProps.variant}\n color={descriptionProps.accent ? 'orange-500' : (descriptionProps.color ?? 'secondary')}\n children={children} />}\n </div>);\n}\n","import { SourceValue, useMortgageAppSource } from './MortgageAppSourceContext';\nimport { MortgagePurposeEnum } from './MortgagePurposeEnum';\nimport { MinimalBanksMortgageOffersQueryVariables } from './MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\n\ntype MinimalBanksMortgageUrlCreateProps = Partial<MinimalBanksMortgageOffersQueryVariables> & {\n isAuthenticated?: boolean;\n from?: string;\n email?: string;\n mobilePhone?: string;\n fio?: string;\n source?: SourceValue;\n};\n\nexport function minimalBanksMortgageUrlCreate({\n isAuthenticated,\n source: initialSource,\n ...props\n}: MinimalBanksMortgageUrlCreateProps) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const source = initialSource ?? useMortgageAppSource();\n const baseUrl = isAuthenticated ? '/ipoteka/demand' : '/ipoteka';\n const keys = Object.keys(props) as (keyof typeof props)[];\n const query = keys.filter(key => props[key] !== '').map(key => `${key}=${normalize(key, props[key])}`);\n\n source && query.push(`source=${source}`);\n const hash = isAuthenticated ? '' : '#mortgage-calculator';\n\n return {\n baseUrl,\n fullUrl: `${baseUrl}?${query.join('&')}${hash}`\n };\n}\n\nfunction normalize(\n key: keyof MinimalBanksMortgageUrlCreateProps,\n value: MinimalBanksMortgageUrlCreateProps[keyof MinimalBanksMortgageUrlCreateProps]\n) {\n switch (key) {\n case 'fio': return encodeURIComponent(value as string);\n case 'purpose': return String(MortgagePurposeEnum[value as MortgagePurposeEnum]);\n default: return String(value);\n }\n}\n","import './Mortgage2Field.css';\n\nimport React from 'react';\n\nimport { formatLocaleNumber } from '@search/helpers/src/formatNumber';\nimport classname from '@search/classname/src';\nimport { Select, Input, PhoneInput } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { useMortgage2UserForm } from '../useMortgage2User';\nimport { useMortgage2Request } from '../useMortgage2Request';\n\nconst cn = classname.bind(null, 'Mortgage2Field');\n\nexport function Mortgage2FieldControls({ children }: {\n children?: React.ReactNode;\n}) {\n return (<div className={cn('controls')}>\n {children}\n </div>);\n}\n\nexport function Mortgage2FieldDescription({ children, accent }: {\n children?: React.ReactNode;\n accent?: boolean;\n}) {\n return (<div className={cn('description', { accent })}>\n {children}\n </div>);\n}\n\nexport function Mortgage2FieldTitle({\n children,\n size,\n accent\n}: {\n children?: React.ReactNode;\n accent?: boolean;\n size: Size;\n}) {\n return <div className={cn('title', { size, accent })}>{children}</div>;\n}\n\nexport function Mortgage2Field({\n title,\n children,\n space,\n titleSize,\n titleAccent,\n descriptionAccent,\n className\n}: {\n space: Size;\n descriptionAccent?: boolean;\n titleSize: Size;\n titleAccent?: boolean;\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (<div className={cn('field', { space }, className)}>\n {title && <Mortgage2FieldTitle size={titleSize} accent={titleAccent} children={title} />}\n {children && <Mortgage2FieldDescription accent={descriptionAccent} children={children} />}\n </div>);\n}\n\nexport function Mortgage2FieldPercent({\n minimalPercentOld,\n minimalPercent,\n isAccent,\n isFrom\n}: {\n isFrom?: boolean;\n isAccent?: boolean;\n description?: string;\n minimalPercent?: number;\n minimalPercentOld?: number;\n}) {\n return (<span className={cn('economy', { accent: isAccent })}>\n {isFrom ? 'от ' : ''}<span>\n {minimalPercent ? `${formatLocaleNumber(minimalPercent)} %` : ' '}\n </span>\n {minimalPercentOld && minimalPercentOld !== minimalPercent ? (\n <span className={cn('economy', { prev: true })}>\n {formatLocaleNumber(minimalPercentOld)} %\n </span>\n ) : null}\n </span>);\n}\n\nexport function MortgageContactFields({\n isMobile,\n domain,\n showCallbackHours,\n sendQueryOnEnter\n} : {\n isMobile?: boolean;\n showCallbackHours?: boolean;\n domain:ReturnType<typeof useMortgage2Request> | ReturnType<typeof useMortgage2UserForm>;\n sendQueryOnEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}) {\n return (\n <div className={cn('fields')}>\n <Input\n dataTest='mortgage-set-name'\n label='Как вас зовут'\n placeholder='Имя'\n size={Size.Medium}\n onBlur={domain.setNameTouched}\n onKeyPress={sendQueryOnEnter}\n error={domain.nameInputValid === false}\n onChange={domain.setName}\n value={domain.name}\n disabled={domain.isFormSyncing}\n />\n <PhoneInput\n dataTest='mortgage-set-phone'\n label='Телефон'\n size={Size.Medium}\n inputMode='numeric'\n onBlur={domain.setPhoneTouched}\n onKeyPress={sendQueryOnEnter}\n error={domain.phoneInputValid === false}\n onChange={domain.setPhone}\n value={domain.phone || undefined}\n disabled={domain.isFormSyncing}\n />\n {showCallbackHours ? (\n <>\n <Select\n onChange={domain.setStartHoursRange}\n native={isMobile}\n >\n <Select.Button\n size='m'\n label='Не ранее'\n >\n {domain.workingHoursRange.start}\n </Select.Button>\n <Select.Content height={172}>\n {\n domain.startHourValues.map(({ value, label, disabled }) => (\n <Select.Option\n key={value}\n disabled={disabled}\n value={value}\n selected={domain.workingHoursRange.start === label}\n >\n {label}\n </Select.Option>\n ))\n }\n </Select.Content>\n </Select>\n <Select\n onChange={domain.setEndHoursRange}\n native={isMobile}\n >\n <Select.Button\n label='Не позднее'\n size='m'\n >\n {domain.workingHoursRange.end}\n </Select.Button>\n <Select.Content height={172}>\n {\n domain.endHourValues.map(({ value, label, disabled }) => (\n <Select.Option\n key={value}\n disabled={disabled}\n value={value}\n selected={domain.workingHoursRange.end === label}\n >\n {label}\n </Select.Option>\n ))\n }\n </Select.Content>\n </Select>\n </>\n ) : null}\n </div>\n );\n}\n","import './Mortgage2IconWrap.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { Size } from '@vtblife/uikit/legacy';\n\nconst cn = classname.bind(null, 'Mortgage2IconWrap');\n\nexport function Mortgage2IconWrap({ children, size, alt, accent, isLandscapeOrientation }: {\n children?: React.ReactNode;\n size?: Size;\n alt?: boolean;\n accent?: boolean;\n isLandscapeOrientation?: boolean;\n}) {\n return (<div className={cn(undefined, { alt, size, accent, isLandscapeOrientation })}>\n {children}\n </div>);\n}\n","import React from 'react';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\nimport type { LocationPlacementIBType } from '@search/graphql-gateway/server/enums/LocationPlacementIBType';\nimport { ApplicationIdEnum, RealtyObjectEnum } from '@search/graphql-typings';\n\nimport type {\n mortgage2ContactsFormSendMutation$variables as mortgage2ContactsFormSendMutationVariables,\n mortgage2ContactsFormSendMutation$data as mortgage2ContactsFormSendMutationResponse\n} from './__generated__/mortgage2ContactsFormSendMutation.graphql';\nimport type { Mortgage2RealtyType } from './mortgageTypes';\n\nconst mortgage2ContactsFormSendMutation = graphql`\n mutation mortgage2ContactsFormSendMutation(\n $phone: String!,\n $name: String!,\n $link: String,\n $locationPlacement: String,\n $applicationId: ApplicationIdEnum!,\n $regionId: Int,\n $subject: String!,\n $message: String,\n $utm: RecordInput,\n $realtyType: RealtyObjectEnum,\n $discounts: [DiscountCalcEnum!],\n $startCallbackHour: String,\n $endCallbackHour: String,\n $withGA: Boolean,\n $withoutBackofficeEmail: Boolean,\n ) {\n classifiedSendMortgageContactsForm(\n utm: $utm,\n phone: $phone,\n name: $name,\n link: $link,\n locationPlacement: $locationPlacement,\n applicationId: $applicationId,\n regionId: $regionId,\n subject: $subject,\n message: $message,\n realtyType: $realtyType,\n discounts: $discounts,\n startCallbackHour: $startCallbackHour,\n endCallbackHour: $endCallbackHour,\n withGA: $withGA,\n withoutBackofficeEmail: $withoutBackofficeEmail\n ) {\n emailMessageId\n }\n }\n`;\n\n// eslint-disable-next-line max-len\nexport type Mortgage2ContactsFormSendProps =\n Omit<\n mortgage2ContactsFormSendMutationVariables,\n 'phone' | 'subject' | 'name' | 'link' | 'locationPlacement' | 'realtyType' | 'applicationId'\n > & {\n offerUrl?: string;\n locationPlacement: LocationPlacementIBType;\n realtyType: Mortgage2RealtyType;\n applicationId: ApplicationIdEnum;\n // eslint-disable-next-line camelcase\n gtmSendData?: { event: string; page_type: string; place?: string; action?: string };\n // eslint-disable-next-line camelcase\n gtmShowData?: { event: string; page_type: string; place?: string; action?: string };\n};\n\ntype UseMortgage2ContactsFormSendProps = Omit<mortgage2ContactsFormSendMutationVariables, 'locationPlacement'> & {\n locationPlacement: LocationPlacementIBType;\n startCallbackHour?: string;\n endCallbackHour?: string;\n};\n\nexport function useMortgage2ContactsFormSend() {\n const gql = useGqlContext();\n\n return React.useCallback((vars: UseMortgage2ContactsFormSendProps, opts?: { signal?: AbortSignal }) => {\n return gql.client<mortgage2ContactsFormSendMutationVariables, mortgage2ContactsFormSendMutationResponse>(\n mortgage2ContactsFormSendMutation,\n vars,\n {\n pathUniqSuffix: `/callback-mortgage/${vars.phone}/`,\n ...opts\n }\n ).then();\n }, [ gql ]);\n}\n\nexport function getSubjectAppName(appId?: ApplicationIdEnum | null) {\n switch (appId) {\n case ApplicationIdEnum.ClassifiedDesktop:\n case ApplicationIdEnum.ClassifiedTouch:\n return 'Уютного поиска';\n case ApplicationIdEnum.NewBuildingsDesktop:\n case ApplicationIdEnum.NewBuildingsTouch:\n return 'Новостроек';\n default:\n return 'СПб команды';\n }\n}\n\nexport function getRealtyObjectTypeGql(realtyType?: Mortgage2RealtyType | null) {\n switch (realtyType) {\n case 'ProfOfferRoom': return RealtyObjectEnum.Room;\n case 'ProfOfferHouse': return RealtyObjectEnum.House;\n case 'ProfOfferLand': return RealtyObjectEnum.Land;\n case 'ProfOfferFlat':\n default:\n return RealtyObjectEnum.Flat;\n }\n}\n\nexport function normalizeCallbackUrl(offerUrl?: string | null) {\n let link;\n\n if (offerUrl) {\n link = offerUrl.includes('http') ? offerUrl : `${location.origin}${offerUrl}`;\n } else {\n link = location.href;\n }\n\n return link;\n}\n","import { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { CurrencyEnum, MortgagePurpose } from '@search/graphql-typings';\nimport { offerRegionToMortgage } from '../../../../../domain/offer/regionToBackoffice';\nimport { calculateOwnAmount } from '../MinimalBanksMortgageFields/useBankMortgageForm';\n\nfunction getTotalPrice({\n regionId\n}: {\n regionId?: number;\n}) {\n const isMsk = regionId && [\n RegionIdEnum.MSK,\n RegionIdEnum.MSK_OBL,\n RegionIdEnum.MSK_AND_MSK_OBL\n ].includes(regionId);\n\n return {\n value: (isMsk ? 12.5 : 5.2) * 10e7,\n currency: CurrencyEnum.Rub\n };\n}\n\nexport function mortgage2ParamsFromClasified(props: {\n purpose: MortgagePurpose;\n term?: number;\n regionId?: number;\n mortgageRegionId?: number;\n propertyCost?: number;\n ownAmount?: number;\n estimatePrice?: {\n // В копейках, центах и т.д.\n value: number;\n currency: CurrencyEnum;\n };\n}) {\n const estimatedPriceByRegion = getTotalPrice({ regionId: props.regionId });\n const propertyCost = props.propertyCost ?? Math.min(\n (props.estimatePrice?.value ?? estimatedPriceByRegion.value) / 100,\n 50e6\n );\n const ownAmount = props.ownAmount ?? calculateOwnAmount(propertyCost, 0.2);\n\n return {\n purpose: props.purpose,\n regionId: props.regionId ? offerRegionToMortgage(props.regionId) : props.mortgageRegionId!,\n term: props.term ?? 20,\n propertyCost,\n ownAmount,\n currency: estimatedPriceByRegion.currency\n };\n}\n","/* eslint-disable react/jsx-handler-names */\nimport './Mortgage2StarterModal.css';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Modal, Button } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { MortgageOfferType } from '@search/graphql-typings/src';\nimport { declensionBankGenitive, declensionBankNominative } from '../../declensions';\nimport {\n MinimalBanksMortgageOffer, MinimalBanksMortgageOfferWithDiscount\n} from '../../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport {\n Mortgage2Field, MortgageContactFields, Mortgage2FieldControls, Mortgage2FieldPercent\n} from '../field/Mortgage2Field';\nimport { mortgage2ParamsFromClasified } from '../mortgage2ParamsFromClasified';\nimport { mortgage2BestOfferFromOffers } from '../useMortgage2BestOffer';\nimport { useMortgage2Request } from '../useMortgage2Request';\nimport { Mortgage2StarterProps } from '../useMortgage2User';\nimport type { Mortgage2ContactsFormSendProps } from '../mortgage2ContactsFormSend';\nimport { Mortgage2SuccessContent } from '../success/Mortgage2SuccessContent';\nimport { VTB_ID } from '../../mortgage3/useChangeDiscount';\nimport { MortgageGovernmentDisclaimer } from '../../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { MortgageOfferIcon } from '../../../BanksMortgageOffers/MortgageOfferIcon';\nimport { defaultBanksTotal } from '../../contants';\nimport { getGovernmentMortgage, useGovernmentMortgageType } from '../../useGovernmentMortgage';\nimport { dataLayerPush } from '../../../../../../domain/google/dataLayerPush';\n\nconst cn = classname.bind(null, 'Mortgage2StarterModal');\nconst COUNT_ICONS_BANK_SHOWING = 2;\n\ntype FieldsModal = 'rate' | 'payment' | 'cost' | 'ownAmount' | 'term' | 'all';\n// eslint-disable-next-line complexity\nexport function Mortgage2StarterModal({\n mode = 'default',\n isDefaultSelectedOffer,\n showMoreBankIcons,\n governmentMortgage: initialGovernmentMortgage,\n fields = [ 'all' ],\n isNewVibe,\n alwaysFromWord,\n ...props\n}: Mortgage2StarterProps\n & Pick<Parameters<typeof useMortgage2Request>[0], 'realtyType'>\n & { governmentMortgage?: useGovernmentMortgageType }\n & {\n isPreferentialNbCondition?: boolean;\n isMobile?: boolean;\n onClose?(e?: React.MouseEvent | React.KeyboardEvent): void;\n term?: number;\n propertyCost: number;\n ownAmount: number;\n mortgageOffers?: { minimalPercentDiscount?: number} & readonly MinimalBanksMortgageOffer[] | null;\n selectedMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n withoutAuth?: boolean;\n shouldVTBDiscountLogic?: boolean;\n showCallbackHours?: boolean;\n mode?: 'default' | 'min-data';\n isDefaultSelectedOffer?: boolean;\n showMoreBankIcons?: boolean;\n fields?: FieldsModal[];\n isNewVibe?: boolean;\n alwaysFromWord?: boolean;\n withoutShowContainer?: boolean;\n }\n & Mortgage2ContactsFormSendProps\n) {\n const { selectedMortgageOffer } = props;\n\n const params = mortgage2ParamsFromClasified(props);\n const banksTotal = selectedMortgageOffer ? defaultBanksTotal - 1 : defaultBanksTotal;\n const bestMortgageOffer = selectedMortgageOffer ?? mortgage2BestOfferFromOffers(props.mortgageOffers);\n const isPreferentialOffer = bestMortgageOffer?.type === MortgageOfferType.Preferential || bestMortgageOffer?.type === MortgageOfferType.Family;\n\n const userInfoLoad = useUserDetailsLoader();\n const userInfo = userInfoLoad({});\n\n const governmentMortgage = useMemo(() => {\n return initialGovernmentMortgage ?? getGovernmentMortgage({\n regionId: props.regionId,\n propertyCost: props.propertyCost,\n ownAmount: props.ownAmount,\n isPreferentialNbCondition: props.isPreferentialNbCondition,\n });\n }, [ initialGovernmentMortgage, props.regionId, props.propertyCost, props.ownAmount, props.isPreferentialNbCondition ]);\n const domain = useMortgage2Request({\n ...props,\n ...governmentMortgage,\n userDetails: userInfo.data?.userProfile.person,\n banksTotal,\n selectedMortgageOffer,\n bestMortgageOffer,\n propertyCost: params.propertyCost,\n ownAmount: params.ownAmount\n });\n\n const isFirstOpen = useRef(true);\n\n useEffect(() => {\n if (props.withoutShowContainer && isFirstOpen.current) {\n props.gtmShowId && dataLayerPush({ event: props.gtmShowId });\n props.gtmShowData && dataLayerPush(props.gtmShowData);\n isFirstOpen.current = false;\n }\n }, [ props.gtmShowId, props.withoutShowContainer, props.gtmShowData ]);\n\n const [ isModalOpened, setIsModalOpened ] = React.useState(false);\n const banksIcons = props.mortgageOffers?.filter(item => item.bankId !== bestMortgageOffer?.bankId).slice(0, COUNT_ICONS_BANK_SHOWING);\n\n const isTitlePercentAccent = useMemo(() => {\n if (domain.minimalPercent === domain.minimalPercentOld) return false;\n if (props.shouldVTBDiscountLogic) return bestMortgageOffer?.bankId === VTB_ID;\n return ! selectedMortgageOffer;\n }, [ domain.minimalPercent, domain.minimalPercentOld, props.shouldVTBDiscountLogic, bestMortgageOffer?.bankId, selectedMortgageOffer ]);\n\n const fromWord = useMemo(() => ({\n default: alwaysFromWord ? 'от\\u00A0' : '',\n payment: selectedMortgageOffer && ! isPreferentialOffer && ! alwaysFromWord ? '' : 'от\\u00A0',\n percent: alwaysFromWord || ! selectedMortgageOffer || isDefaultSelectedOffer || isPreferentialOffer,\n }), [ alwaysFromWord, selectedMortgageOffer, isDefaultSelectedOffer, isPreferentialOffer ]);\n\n const renderFieldNodes = useMemo(() => {\n const result: React.ReactNode[] = [];\n\n if (fields.includes('rate') || fields.includes('all')) {\n result.push(<Mortgage2Field\n key='rate'\n space={Size.Small}\n titleSize={Size.Small}\n titleAccent={isTitlePercentAccent}\n title={<Mortgage2FieldPercent\n isFrom={fromWord.percent}\n isAccent={isPreferentialOffer || isTitlePercentAccent}\n minimalPercent={domain.minimalPercent}\n minimalPercentOld={domain.minimalPercentOld}\n />}\n children={isPreferentialOffer ? 'ипотека с\\u00A0господдержкой' : 'ставка банка'}\n />);\n }\n if (fields.includes('payment') || fields.includes('all')) {\n result.push(<Mortgage2Field\n key='payment'\n space={Size.Small}\n titleSize={Size.Small}\n titleAccent={isTitlePercentAccent}\n title={<>{fromWord.payment}{\n bestMortgageOffer?.minimalPaymentDiscountFormatted ?? bestMortgageOffer?.minimalPaymentFormatted\n }</>}\n children='ежемесячный платёж'\n />);\n }\n if (fields.includes('cost') || fields.includes('all')) {\n result.push(<Mortgage2Field\n key='cost'\n space={Size.Small}\n titleSize={Size.Small}\n title={<>{fromWord.default}{domain.propertyCostFormatted}</>}\n children={`стоимость ${domain.realtyTypeFormattedLocative}`}\n />);\n }\n if (fields.includes('ownAmount') || fields.includes('all')) {\n result.push(<Mortgage2Field\n key='ownAmount'\n space={Size.Small}\n titleSize={Size.Small}\n title={<>{fromWord.default}{domain.ownAmountFormatted}</>}\n children='первоначальный взнос'\n />);\n }\n if ((fields.includes('term') || fields.includes('all')) && ! props.isMobile) {\n result.push(<Mortgage2Field\n key='term'\n space={Size.Small}\n titleSize={Size.Small}\n title={<>{props.term} лет</>}\n children='срок кредита'\n />);\n }\n\n return result;\n }, [\n fields, domain, props.term, props.isMobile, isTitlePercentAccent, selectedMortgageOffer, isDefaultSelectedOffer, isPreferentialOffer,\n domain.minimalPercent, domain.minimalPercentOld, bestMortgageOffer, domain.propertyCostFormatted, domain.realtyTypeFormattedLocative,\n domain.ownAmountFormatted\n ]);\n\n const banksInfo = (\n <div className={cn('descr')}>\n <div className={cn('descr-text')}>\n {selectedMortgageOffer && (<>Подайте заявку в {selectedMortgageOffer.name\n } и еще <span>{banksTotal} {\n declensionBankNominative(banksTotal)}</span>.</>)}\n {! selectedMortgageOffer && (<>Получите одобрение по ипотеке в течение {domain.timeFromBanksFormatted\n } от <span>{banksTotal} {declensionBankGenitive(banksTotal)}.</span></>)}\n </div>\n {/* not important all conditions government mortgage */}\n {(governmentMortgage.isPreferentialNbCondition || isNewVibe) && (<>\n <div className={cn('icons')}>\n {bestMortgageOffer && (\n <MortgageOfferIcon offer={bestMortgageOffer} size='m' />\n )}\n {banksIcons && showMoreBankIcons && (<>\n {banksIcons.map(item => (\n <MortgageOfferIcon key={item.bankId} offer={item} size='m' />\n ))}\n <MortgageOfferIcon pseudoCount={banksTotal - COUNT_ICONS_BANK_SHOWING} size='m' />\n </>)}\n </div>\n </>)}\n </div>\n );\n\n const content = (<div className={cn('main')}>\n {props.isMobile ? (\n <div className={cn('banksInfo')}>\n {banksInfo}\n </div>\n ) : (\n <Mortgage2Field\n descriptionAccent\n space={Size.Medium}\n titleSize={Size.Small}\n title={domain.textVariant === 'bankCount' ? 'Ипотека — быстро и просто!' : 'Заявка на ипотеку'}\n children={banksInfo}\n />\n )}\n <div className={cn('fields')}>\n {renderFieldNodes}\n </div>\n <MortgageContactFields\n isMobile={props.isMobile}\n domain={domain}\n showCallbackHours={props.showCallbackHours}\n />\n {/* not important all conditions government mortgage */}\n {governmentMortgage.isPreferentialNbCondition && (<div\n className={cn('disclamer')}\n >\n <MortgageGovernmentDisclaimer\n isAccent\n isMobile={props.isMobile}\n onClick={() => setIsModalOpened(true)}\n />\n </div>)}\n <Mortgage2FieldControls>\n <Button\n fullWidth\n size={props.isMobile ? 'm' : 'l'}\n disabled={domain.isFormSyncing || userInfo.loading}\n dataTest='mortgage-send-query'\n variant='accent'\n onClick={domain.sendQuery}\n >\n Подать заявку\n </Button>\n {props.isMobile ? <> <br /><br /><br /></> : null}\n </Mortgage2FieldControls>\n </div>);\n\n if (isModalOpened) {\n return (<MortgageGovernmentDisclaimerModal\n isMobile={props.isMobile}\n onSuccess={() => setIsModalOpened(false)}\n onClose={() => setIsModalOpened(false)}\n />);\n }\n\n return (<Modal\n opened\n // @ts-expect-error\n onClose={props.onClose}\n mobile={props.isMobile}\n swipeToClose={! props.isMobile}\n >\n {props.withoutAuth && domain.isFormSended ? (\n <Mortgage2SuccessContent\n title='Заявка принята'\n isMobile={props.isMobile}\n />\n ) : (<>\n {props.isMobile && (<>\n <Modal.Header>\n {domain.textVariant === 'bankCount' ? 'Ипотека — быстро и просто!' : 'Заявка на ипотеку'}\n </Modal.Header>\n <Modal.Content scrollable>\n {content}\n </Modal.Content>\n </>)}\n {! props.isMobile && (<>{content}</>)}\n </>)}\n </Modal>);\n}\n","import './Mortgage2SuccessContent.css';\n\nimport React from 'react';\nimport { Modal, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Grid from '@vtblife/uikit-grid';\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport { Mortgage2Field } from '../field/Mortgage2Field';\nimport { Mortgage2IconWrap } from '../icon/Mortgage2IconWrap';\n\nimport Mortgage2IconSuccess from '../icon/Mortgage2IconSuccess.url.svg';\n\nconst cn = classname.bind(null, 'Mortgage2SuccessContent');\n\nexport function Mortgage2SuccessContent({\n isMobile,\n title = 'Скоро перезвоним',\n subtitle = 'Ожидайте, совсем скоро вам перезвонит консультант.',\n withoutGridWrapper\n}: {\n isMobile?: boolean;\n withoutGridWrapper?: boolean;\n title?: string;\n subtitle?: string;\n}) {\n const staticPath = useStaticPathConfig();\n\n const upperContent = (<>\n {isMobile ? (\n <>\n <Modal.Header>\n {title}\n </Modal.Header>\n <Typography variant='primary-alone' color='secondary' className={cn('subtitle')}>\n {subtitle}\n </Typography>\n </>\n ) : null}\n </>);\n\n const gridContent = (<>\n {isMobile ? null : (\n <Grid.Cell xs={12} m={12}>\n <Mortgage2Field\n titleSize={Size.Large}\n space={Size.Medium}\n descriptionAccent\n title={title}\n children={subtitle}\n />\n </Grid.Cell>\n )}\n <Grid.Cell m={12}>\n <Mortgage2IconWrap>\n <img\n crossOrigin='anonymous'\n width={265}\n height={185}\n src={`${staticPath}${Mortgage2IconSuccess}`}\n />\n </Mortgage2IconWrap>\n </Grid.Cell>\n </>);\n\n if (withoutGridWrapper) {\n return (<>\n {upperContent}\n {gridContent}\n </>);\n }\n\n return (\n <>\n {upperContent}\n <Grid cols={12}>\n {gridContent}\n </Grid>\n </>\n );\n}\n","import React from 'react';\n\nimport {\n MinimalBanksMortgageOfferWithDiscount, useMinimalBanksMortgageOffersLoader\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { mortgage2ParamsFromClasified } from './mortgage2ParamsFromClasified';\n\nexport function mortgage2BestOfferFromOffers(\n minimalBanksMortgageOffers?: readonly MinimalBanksMortgageOfferWithDiscount[] | null\n) {\n const bestMortgageOffer = minimalBanksMortgageOffers?.reduce((acc, item) => {\n const minimalPaymentItem = item.minimalPaymentDiscount ?? item.minimalPayment ?? 0;\n const minimalPaymentAcc = acc?.minimalPaymentDiscount ?? acc?.minimalPayment ?? 0;\n\n if (\n minimalPaymentItem && (\n ! minimalPaymentAcc ||\n minimalPaymentItem < minimalPaymentAcc\n )\n ) return item;\n\n return acc;\n }, undefined as MinimalBanksMortgageOfferWithDiscount | undefined);\n\n return bestMortgageOffer;\n}\n\nexport function useMortgage2BestOfferLoader() {\n const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n\n return React.useCallback((props: ReturnType<typeof mortgage2ParamsFromClasified>) => {\n const mortgageInfo = minimalBanksMortgageOffersLoad(props);\n\n const bestMortgageOffer = mortgage2BestOfferFromOffers(mortgageInfo?.data?.minimalBanksMortgageOffers);\n\n return {\n isLoading: mortgageInfo.loading,\n error: mortgageInfo.errors?.length ? mortgageInfo.errors[0] : undefined,\n selectedMortgageOffer: bestMortgageOffer,\n mortgageOffers: mortgageInfo.data?.minimalBanksMortgageOffers\n };\n }, [ minimalBanksMortgageOffersLoad ]);\n}\n","import React, { useCallback, useRef } from 'react';\n\nimport { MortgagePurpose } from '@search/graphql-typings';\nimport { formatPrice } from '@search/helpers/src/gql/formatPrice';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport { AuthInfo } from '@search/auth/src/AuthInfo';\nimport { UseAuthError } from '@search/auth/src/useAuth';\nimport { useUserDetailsFetcher } from '@search/auth/src/userDetails/userDetails';\nimport { userDetailsQuery$data } from '@search/auth/src/userDetails/__generated__/userDetailsQuery.graphql';\n\nimport { declensionBankGenitive } from '../declensions';\nimport { defaultBanksTotal } from '../contants';\nimport { useGtmOnVisible } from '../../../../../domain/google/useGtmOnVisible';\nimport { ClassifiedAnalytics } from '../../../../../domain/offer/analytics/ClassifiedAnalytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { minimalBanksMortgageUrlCreate } from '../minimalBanksMortgageUrl';\nimport { SeoSearchUtm } from '../../../../../domain/seo/SeoSearchUtm';\nimport { useAppTypeById } from '../../../hooks/useAppTypeById';\nimport type {\n MinimalBanksMortgageOfferWithDiscount\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { declensionHour, declensionMinute } from '../declensions';\nimport { useMortgageAppSource } from '../MortgageAppSourceContext';\nimport { mortgage2ParamsFromClasified } from './mortgage2ParamsFromClasified';\nimport { Mortgage2StarterProps, useMortgage2UserForm } from './useMortgage2User';\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from './mortgage2ContactsFormSend';\nimport type { Mortgage2RealtyType } from './mortgageTypes';\n\nconst openOrAuth = (authInfo?: AuthInfo) => {\n return new Promise((resolve, reject) => {\n if (authInfo?.isAuthenticated) {\n resolve(null);\n } else {\n reject();\n }\n });\n};\n\nfunction getOverPayment(p: {\n minimalPercent: number;\n totalMonth: number;\n amount: number;\n}) {\n const monthRate = p.minimalPercent / 12 / 100;\n const commonRate = (1 + monthRate) ** p.totalMonth;\n const monthPayment = p.amount * monthRate * commonRate / (commonRate - 1);\n const overPayment = monthPayment * p.totalMonth - p.amount;\n\n return overPayment;\n}\n\nconst textVariants = [ 'main', 'bankCount' ] as const;\nconst mortgageBannerTextVariantDefault = Math.round(Math.random() * (textVariants.length - 1));\n\nconst responseTimeVariants = [\n {\n value: 1,\n fieldText: 'на ответ от банков'\n },\n {\n value: 10,\n fieldText: 'на заполнение заявки'\n },\n {\n value: 180,\n fieldText: 'на одобрение от банков'\n }\n] as const;\n\nconst mortgageBannerMinutesVariantDefault = Math.round(Math.random() * (responseTimeVariants.length - 1));\n\nexport function windowOpen(url: string, { isMobile }: { isMobile?: boolean }) {\n url = url.startsWith('http') ? url : location.origin + url;\n\n if (isMobile) {\n location.assign(url);\n return;\n }\n\n let form = document.getElementById('window-open-form') as HTMLFormElement;\n\n if (! form) {\n form = document.createElement('form');\n document.body.appendChild(form);\n }\n\n const o = new URL(url);\n\n form.method = 'get';\n form.target = '_blank';\n form.action = o.origin + o.pathname;\n form.id = 'window-open-form';\n\n const inputs: string[] = [];\n\n o.searchParams.forEach((v, k) => {\n inputs.push(`<input type=\"hidden\" name=\"${k}\" value=${v} />`);\n });\n form.innerHTML = inputs.join('\\n');\n\n form.submit();\n}\n\nexport function useMortgage2Request({\n regionId,\n showPreferential,\n mortgageRegionId,\n selectedMortgageOffer,\n bestMortgageOffer,\n purpose,\n term,\n propertyCost,\n ownAmount,\n gtmSendId = ClassifiedAnalytics.SearchSaleIpotekaBannerSend,\n gtmShowId,\n gtmSendData,\n gtmShowData,\n mortgageBannerMinutesVariant = mortgageBannerMinutesVariantDefault,\n mortgageBannerTextVariant = mortgageBannerTextVariantDefault,\n banksTotal = defaultBanksTotal,\n isMobile = false,\n realtyType,\n userDetails,\n locationPlacement,\n offerUrl,\n applicationId,\n withoutAuth,\n withoutForm,\n discounts,\n shouldVTBDiscountLogic\n}: Mortgage2StarterProps & {\n showPreferential?: boolean;\n userDetails?: userDetailsQuery$data['userProfile']['person'];\n isMobile?: boolean;\n realtyType: Mortgage2RealtyType;\n banksTotal?: number;\n selectedMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n bestMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n propertyCost: number;\n ownAmount: number;\n withoutAuth?: boolean;\n withoutForm?: boolean;\n shouldVTBDiscountLogic?: boolean;\n} & Mortgage2ContactsFormSendProps) {\n const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n const {\n isFormSended,\n isFormSyncing,\n setFormAllTouched,\n setFormSended,\n setFormIsSending,\n setFormResetSendingsFields,\n\n name,\n isNameValid,\n isNameRequired,\n nameInputValid,\n setName,\n setNameTouched,\n\n phone,\n startHourValues,\n endHourValues,\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n isPhoneValid,\n phoneInputValid,\n setPhone,\n setPhoneTouched\n } = useMortgage2UserForm({ userDetails });\n\n let realtyTypeFormattedLocative = 'недвижимости';\n\n switch (realtyType) {\n case 'ProfOfferFlat':\n realtyTypeFormattedLocative = 'квартиры';\n break;\n case 'ProfOfferRoom':\n realtyTypeFormattedLocative = 'комнаты';\n break;\n case 'ProfOfferHouse':\n realtyTypeFormattedLocative = 'дома';\n break;\n case 'ProfOfferLand':\n realtyTypeFormattedLocative = 'участка';\n break;\n default:\n realtyTypeFormattedLocative = 'недвижимости';\n }\n\n const params = mortgage2ParamsFromClasified({\n purpose,\n regionId,\n mortgageRegionId,\n term,\n propertyCost,\n ownAmount\n });\n\n const propertyCostFormatted = formatPrice({\n value: params.propertyCost * 100,\n currency: params.currency,\n displayCurrency: true\n });\n\n const ownAmountFormatted = formatPrice({\n value: params.ownAmount * 100,\n currency: params.currency,\n displayCurrency: true\n });\n\n const minimalPercentDefault = purpose === MortgagePurpose.Primary ? 6.1 : 7.5;\n\n const offerForPercent = selectedMortgageOffer ?? bestMortgageOffer;\n const minimalPercentWithDiscount = offerForPercent?.minimalPercentDiscount ?? offerForPercent?.minimalPercent;\n const minimalPercent = minimalPercentWithDiscount ?? minimalPercentDefault;\n\n let minimalPercentOld = 0;\n\n if (shouldVTBDiscountLogic) {\n if (offerForPercent?.minimalPercentDiscount) minimalPercentOld = offerForPercent?.minimalPercent ?? 0;\n } else {\n minimalPercentOld = selectedMortgageOffer ? 0 : minimalPercent; // тут должна быть скидка от сервиса, когда появится\n }\n\n // Вернется скидка от сервиса - можно раскомментировать\n // const amount = params.propertyCost - params.ownAmount;\n // const totalMonth = params.term * 12;\n // const overPayment = getOverPayment({ amount, totalMonth, minimalPercent });\n // const overPaymentOld = getOverPayment({ amount, totalMonth, minimalPercent: minimalPercentOld });\n // const paymentDelta = Math.round(overPaymentOld - overPayment);\n // const paymentDeltaFormatted = formatPrice({\n // value: paymentDelta * 100,\n // currency: params.currency,\n // displayCurrency: true\n // });\n\n const { waitAuth } = useM2AuthContext();\n\n const userDetailsFetcher = useUserDetailsFetcher();\n const userFioPhone = useRef<ReturnType<typeof updateUserDetails> | null>();\n const updateUserDetails = useCallback((userInfo: userDetailsQuery$data) => {\n const userDetails = userInfo?.userProfile.person;\n const nameArr = [\n userDetails?.surname, userDetails?.name, userDetails?.patronymic\n ].filter(Boolean);\n\n userDetails?.primaryPhone?.number && setPhone(userDetails.primaryPhone.number);\n nameArr.length > 0 && setName(nameArr.join(' '));\n\n return {\n phone: userDetails?.primaryPhone?.number,\n name: nameArr.join(' ')\n };\n });\n\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n const { isClApp } = useAppTypeById(applicationId);\n const sourceMortgage = useMortgageAppSource();\n const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n e?.stopPropagation();\n e?.preventDefault();\n\n // RS-3869 remove - ! isMobile &&\n // withoutForm for force to auth form after click btn\n if (! withoutForm && (! isPhoneValid || (isNameRequired && ! isNameValid))) {\n setFormAllTouched();\n return;\n }\n\n setFormIsSending();\n // windowOpen(minimalBanksMortgageUrl, { isMobile });\n\n const utm = SeoSearchUtm.get();\n\n const resolveResultPromise = () => {\n setFormSended();\n gtmSendId && dataLayerPush({ event: gtmSendId });\n gtmSendData && dataLayerPush({\n ...gtmSendData,\n place: selectedMortgageOffer ? 'bank' : gtmSendData.place\n });\n if (isClApp &&\n (selectedMortgageOffer?.type === 'PREFERENTIAL' ||\n selectedMortgageOffer?.type === 'FAMILY')\n ) {\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n type: selectedMortgageOffer.type === 'PREFERENTIAL' ? 'gospr_benefit_req' : 'gospr_family_req'\n });\n } else if (isClApp) {\n dataLayerPush({ event: 'up_ib_send_form' });\n }\n\n const { fullUrl: minimalBanksMortgageUrl } = minimalBanksMortgageUrlCreate({\n isAuthenticated: true,\n ...params,\n mobilePhone: (userFioPhone.current?.phone ?? phone).substring(1),\n fio: userFioPhone.current?.name ?? name,\n source: sourceMortgage\n });\n\n ! withoutAuth && windowOpen(minimalBanksMortgageUrl, { isMobile });\n };\n const rejectedResultPromise = error => {\n // eslint-disable-next-line no-console\n console.error(error);\n setFormSended(error);\n };\n const optionalMortgage2ContactsFormSend = (userDataFromPromise?: { name?: string; phone?: string} | null) => {\n return mortgage2ContactsFormSend({\n realtyType: getRealtyObjectTypeGql(realtyType),\n name: userDataFromPromise?.name ?? name,\n utm: utm ? { list: utm } : undefined,\n phone: userDataFromPromise?.phone ?? phone,\n regionId: mortgageRegionId ?? regionId,\n applicationId,\n locationPlacement,\n link: normalizeCallbackUrl(offerUrl),\n subject: `Заявка на ипотеку с${showPreferential ? ' гос. поддержкой с' : ''} “${\n getSubjectAppName(applicationId)}”`,\n discounts,\n startCallbackHour: workingHoursRange.start,\n endCallbackHour: workingHoursRange.end,\n message: selectedMortgageOffer ? `Банк: ${selectedMortgageOffer.name}` : '',\n withGA: isClApp && ! withoutAuth,\n withoutBackofficeEmail: isClApp && ! withoutAuth\n });\n };\n\n const optionalWaitAuth = withoutAuth ? undefined :\n waitAuth(\n authInfo => openOrAuth(authInfo)\n .then(() => userDetailsFetcher())\n .catch(() => {\n throw new UseAuthError();\n }),\n { phone: phone.substring(1), continueAfterLogin: true }\n );\n\n if (optionalWaitAuth) {\n optionalWaitAuth\n ?.then((dataUserDetails) => {\n const preparedUserDetails = userFioPhone.current = dataUserDetails.data && updateUserDetails(dataUserDetails.data);\n\n return optionalMortgage2ContactsFormSend(preparedUserDetails);\n })\n .then(resolveResultPromise)\n .catch(rejectedResultPromise);\n } else {\n optionalMortgage2ContactsFormSend()\n .then(resolveResultPromise)\n .catch(rejectedResultPromise);\n }\n }, [\n withoutForm,\n showPreferential,\n isPhoneValid,\n isNameValid,\n isNameRequired,\n setFormIsSending,\n mortgage2ContactsFormSend,\n realtyType,\n name,\n phone,\n mortgageRegionId,\n regionId,\n applicationId,\n locationPlacement,\n offerUrl,\n discounts,\n workingHoursRange.start,\n workingHoursRange.end,\n selectedMortgageOffer,\n withoutAuth,\n waitAuth,\n setFormAllTouched,\n userDetailsFetcher,\n setFormSended,\n gtmSendId,\n dataLayerPush,\n sourceMortgage,\n isMobile\n ]);\n\n const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter') return;\n sendQuery(e);\n }, [ sendQuery ]);\n\n const textVariant = textVariants[mortgageBannerTextVariant] ?? textVariants[0];\n\n const minutes = responseTimeVariants[mortgageBannerMinutesVariant] ?? responseTimeVariants[0];\n const hours = Math.floor(minutes.value / 60);\n const responseTimeFormatted = hours >= 1 ?\n `${hours} ${declensionHour(hours)}` :\n `${minutes.value} ${declensionMinute(minutes.value)}`;\n const responseDescriptionFormatted = minutes.fieldText;\n\n const banksTotalFormattedGenitive = declensionBankGenitive(banksTotal >= 22 ? banksTotal : defaultBanksTotal);\n const timeFromBanksFormatted = 'минуты';\n\n const onVisible = React.useCallback(() => {\n gtmShowId && dataLayerPush({ event: gtmShowId });\n gtmShowData && dataLayerPush(gtmShowData);\n }, [ gtmShowId, dataLayerPush ]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n useGtmOnVisible({ containerRef, onVisible });\n\n return {\n containerRef,\n\n timeFromBanksFormatted,\n textVariant,\n banksTotal,\n banksTotalFormattedGenitive,\n ownAmountFormatted,\n propertyCostFormatted,\n responseTimeFormatted,\n responseDescriptionFormatted,\n minimalPercent,\n minimalPercentOld,\n\n realtyTypeFormattedLocative,\n\n setPhoneTouched,\n sendQueryOnEnter,\n phoneInputValid,\n setPhone,\n phone,\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues,\n\n setNameTouched,\n nameInputValid,\n setName,\n name,\n\n isFormSyncing,\n isFormSended,\n sendQuery,\n setFormResetSendingsFields\n };\n}\n","import { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useMemo } from 'react';\n\nexport function useAppTypeById(appId: ApplicationIdEnum) {\n return useMemo(() => {\n const isClApp = appId === ApplicationIdEnum.ClassifiedDesktop || appId === ApplicationIdEnum.ClassifiedTouch;\n const isNbApp = appId === ApplicationIdEnum.NewBuildingsTouch || appId === ApplicationIdEnum.NewBuildingsDesktop;\n const isZbsApp = appId === ApplicationIdEnum.ZbsSearch;\n\n return { isClApp, isNbApp, isZbsApp };\n }, [ appId ]);\n}\n","import React, { useEffect } from 'react';\n\nimport type { userDetailsQuery$data as userDetailsQueryResponse } from '@search/auth/src/userDetails/__generated__/userDetailsQuery.graphql';\nimport type { MortgagePurpose } from '@search/graphql-typings';\nimport { useWorkingHours } from '../../WorkingHours/useWorkingHours';\n\nexport type Mortgage2StarterProps = {\n gtmSendId?: string;\n gtmShowId?: string;\n // eslint-disable-next-line camelcase\n gtmSendData?: { event: string; page_type: string; place?: string; action?: string };\n // eslint-disable-next-line camelcase\n gtmShowData?: { event: string; page_type: string; place?: string; action?: string };\n term?: number;\n purpose: MortgagePurpose;\n mortgageBannerMinutesVariant?: number;\n mortgageBannerTextVariant?: number;\n regionId?: number;\n mortgageRegionId?: number;\n};\n\nexport function useMortgage2UserForm({\n isNameRequired = false,\n userDetails\n}: {\n userDetails?: userDetailsQueryResponse['userProfile']['person'];\n isNameRequired?: boolean;\n}) {\n const [ state, setFormState ] = React.useState({\n isFormSending: false,\n isFormSended: false,\n sendingError: undefined as Error | undefined,\n phone: userDetails?.primaryPhone?.number ?? '',\n isPhoneTouched: false,\n name: '',\n isNameTouched: false\n });\n\n const START_HOUR_WORKING_DAY_SALES = 9;\n const END_HOUR_WORKING_DAY_SALES = 21;\n\n const {\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues\n } = useWorkingHours({\n startHour: START_HOUR_WORKING_DAY_SALES,\n endHour: END_HOUR_WORKING_DAY_SALES\n });\n\n const setPhone = React.useCallback((phone: string) => setFormState(p => ({ ...p, phone })), [ ]);\n const setPhoneTouched = React.useCallback(() => setFormState(p => ({ ...p, isPhoneTouched: true })), [ ]);\n const setName = React.useCallback((name: string) => setFormState(p => ({ ...p, name })), [ ]);\n const setNameTouched = React.useCallback(() => setFormState(p => ({ ...p, isNameTouched: true })), [ ]);\n\n const setFormIsSending = React.useCallback((sendingError?: Error) => setFormState(p => ({\n ...p, sendingError, isFormSending: true\n })), [ ]);\n const setFormSended = React.useCallback((sendingError?: Error) => setFormState(p => ({\n ...p, sendingError, isFormSending: false, isFormSended: true\n })), [ ]);\n const setFormResetSendingsFields = React.useCallback(() => setFormState(p => ({\n ...p, isFormSending: false, isFormSended: false, sendingError: undefined\n })), [ ]);\n const setFormAllTouched = React.useCallback(() => {\n setFormState(p => ({ ...p, isPhoneTouched: true, isNameTouched: true, isFormSending: false }));\n }, [ ]);\n\n useEffect(() => {\n userDetails?.primaryPhone?.number && setPhone(userDetails?.primaryPhone?.number);\n\n const nameArr = [\n userDetails?.surname, userDetails?.name, userDetails?.patronymic\n ].filter(Boolean);\n\n nameArr.length > 0 && setName(nameArr.join(' '));\n }, [ userDetails, setPhone, setName ]);\n\n const isNameValid = isNameRequired ? state.name.length > 1 : undefined;\n const nameInputValid = state.isNameTouched ? isNameValid : undefined;\n\n const isPhoneValid = state.phone.length > 10;\n const phoneInputValid = state.isPhoneTouched ? isPhoneValid : undefined;\n\n const result = {\n ...state,\n isFormSyncing: state.isFormSending,\n setFormSended,\n setFormIsSending,\n setFormAllTouched,\n setFormResetSendingsFields,\n\n name: state.name,\n isNameValid,\n isNameRequired,\n nameInputValid,\n setName,\n setNameTouched,\n\n phone: state.phone,\n isPhoneValid,\n phoneInputValid,\n setPhone,\n setPhoneTouched,\n workingHoursRange,\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues\n };\n\n return result as Omit<typeof result, 'isFormSending'>;\n}\n\n","import './Mortgage2ConsultModal.css';\n\nimport React from 'react';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport { ApplicationIdEnum } from '@search/graphql-typings/src';\n\nimport {\n Mortgage2Field,\n MortgageContactFields,\n Mortgage2FieldControls\n} from '../field/Mortgage2Field';\nimport { Mortgage2IconWrap } from '../icon/Mortgage2IconWrap';\nimport { useMortgage2UserForm } from '../useMortgage2User';\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from '../mortgage2ContactsFormSend';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport Mortgage2IconSuccess from '../icon/Mortgage2IconSuccess.url.svg';\n\nconst cn = classname.bind(null, 'Mortgage2ConsultModal');\n\nexport function Mortgage2ConsultModal({\n isMobile,\n onClose,\n sendGtmId = 'classified_card_sale_ipoteka_call_back',\n regionId,\n offerUrl,\n locationPlacement,\n applicationId,\n realtyType,\n discounts,\n showCallbackHours,\n gtmSendData\n}: {\n isMobile?: boolean;\n showCallbackHours?: boolean;\n onClose?(e: React.MouseEvent | React.KeyboardEvent): void;\n sendGtmId?: string;\n} & Mortgage2ContactsFormSendProps) {\n const staticPath = useStaticPathConfig();\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n const userDetailsLoad = useUserDetailsLoader();\n const userInfo = userDetailsLoad({});\n\n const domain = useMortgage2UserForm({\n isNameRequired: true,\n userDetails: userInfo.data?.userProfile.person\n });\n const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n e?.stopPropagation();\n e?.preventDefault();\n\n if (! domain.isPhoneValid || ! domain.isNameValid) {\n domain.setFormAllTouched();\n return;\n }\n\n domain.setFormIsSending();\n\n mortgage2ContactsFormSend({\n realtyType: getRealtyObjectTypeGql(realtyType),\n regionId,\n applicationId,\n locationPlacement,\n link: normalizeCallbackUrl(offerUrl),\n name: domain.name,\n phone: domain.phone,\n startCallbackHour: domain.workingHoursRange.start,\n endCallbackHour: domain.workingHoursRange.end,\n subject: `Консультация по ипотеке с “${getSubjectAppName(applicationId)}”`,\n discounts\n })\n .then(() => {\n dataLayerPush({ event: sendGtmId });\n domain.setFormSended();\n gtmSendData && dataLayerPush({\n ...gtmSendData,\n place: 'consultation'\n });\n if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n dataLayerPush({ event: 'up_ib_send_form' });\n dataLayerPush({ event: 'classified_card_sale_ipoteka_call_back' });\n }\n }).catch(error => {\n domain.setFormSended(error);\n });\n }, [\n domain,\n mortgage2ContactsFormSend,\n realtyType,\n regionId,\n applicationId,\n locationPlacement,\n offerUrl,\n discounts,\n dataLayerPush,\n sendGtmId\n ]);\n\n const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter') return;\n sendQuery(e);\n }, [ sendQuery ]);\n\n let content: React.ReactNode | undefined;\n\n if (domain.isFormSended) {\n content = (<>\n {isMobile ? (\n <>\n <Modal.Header>\n Скоро перезвоним\n </Modal.Header>\n <Typography color='secondary' className={cn('subtitle')}>\n Ожидайте, совсем скоро вам перезвонит консультант.\n </Typography>\n </>\n ) : null}\n {isMobile ? null : (\n <Mortgage2Field\n titleSize={Size.Large}\n space={Size.Medium}\n descriptionAccent\n title='Скоро перезвоним'\n children='Ожидайте, совсем скоро вам перезвонит консультант.'\n />\n )}\n <Mortgage2IconWrap>\n <img\n crossOrigin='anonymous'\n alt='успешно оставили заявку, благодарный человек'\n width={265}\n height={185}\n src={`${staticPath}${Mortgage2IconSuccess}`}\n />\n </Mortgage2IconWrap>\n </>);\n } else {\n content = (<>\n {isMobile ? (\n <>\n <Modal.Header>\n Консультация по ипотеке\n </Modal.Header>\n <Typography color='secondary' className={cn('subtitle')}>\n Оставьте свой телефон, и консультант вам перезвонит.\n </Typography>\n </>\n ) : null}\n {isMobile ? null : (\n <Mortgage2Field\n titleSize={Size.Large}\n space={Size.Medium}\n descriptionAccent\n title='Консультация по ипотеке'\n children='Оставьте свой телефон, и консультант вам перезвонит.'\n />\n )}\n <MortgageContactFields\n isMobile={isMobile}\n domain={domain}\n showCallbackHours={showCallbackHours}\n sendQueryOnEnter={sendQueryOnEnter}\n />\n <Mortgage2FieldControls>\n <Button\n fullWidth\n size={isMobile ? 'm' : 'l'}\n disabled={domain.isFormSyncing}\n dataTest='mortgage-send-consult'\n onClick={sendQuery}\n >\n Перезвоните мне\n </Button>\n </Mortgage2FieldControls>\n </>);\n }\n\n return (<Modal\n opened\n onClose={onClose}\n mobile={isMobile}\n swipeToClose={! isMobile}\n >{content}</Modal>);\n}\n","import React from 'react';\nimport { Skeleton } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './style.css';\n\nconst cn = classname.bind(null, 'BanksMortgageOffers');\n\nexport const MortgageOfferSkeleton = () => {\n return (\n <div className={cn()}>\n <div className={cn('offer')}>\n <div className={cn('img-loader')}>\n <Skeleton />\n </div>\n </div>\n <div className={cn('offer-info')}>\n <span className={cn('percent-loader')}>\n <Skeleton />\n </span>\n <span className={cn('payment-loader')}>\n <Skeleton />\n </span>\n </div>\n </div>\n );\n};\n","/* eslint-disable complexity */\nimport './style.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { getGtmLabel } from '../../../../domain/GtmContext';\nimport {\n MinimalBanksMortgageOffersQueryResponseOffer,\n MinimalBanksMortgageOffer as MinimalBanksMortgageOfferType\n} from '../MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { MortgageOfferIcon } from './MortgageOfferIcon';\n\nconst cn = classname.bind(null, 'BanksMortgageOffers');\n\ninterface MinimalBanksMortgageOfferProps {\n offer: {\n description?: string;\n disabled?: boolean;\n minimalPercentDiscountFormatted?: string;\n minimalPaymentDiscountFormatted?: string;\n } & MinimalBanksMortgageOffersQueryResponseOffer;\n gtmCommonClick?: string;\n selectMortgageOffer?(offer: MinimalBanksMortgageOfferType, e: React.MouseEvent<HTMLButtonElement>): void;\n isAlternativeBg?: boolean;\n}\n\nexport const BankMortgageOffers = ({\n offer,\n gtmCommonClick,\n isAlternativeBg,\n selectMortgageOffer\n}: MinimalBanksMortgageOfferProps) => {\n const equalPercent = offer?.minimalPercentDiscountFormatted === offer?.minimalPercentFormatted;\n const disabled = offer?.disabled;\n\n let name = offer?.name ?? '';\n\n if (offer?.type === 'FAMILY') name = 'Семейная ипотека';\n if (offer?.type === 'PREFERENTIAL') name = 'Льготная ипотека';\n if (offer?.type === 'IT_MORTGAGE') name = 'IT-ипотека';\n\n const description = offer?.disabled ? offer.description : undefined;\n\n return (\n <button\n onClick={disabled || ! selectMortgageOffer ? undefined : selectMortgageOffer.bind(null, offer)}\n type={disabled ? 'button' : 'submit'}\n className={cn('button', { disabled })}\n data-test={`MinimalBanksMortgageOffer-${offer?.bankId ?? 'unk'}`}\n {...getGtmLabel(gtmCommonClick)}\n >\n <div className={cn('', { isAlternativeBg })}>\n <div className={cn('offer')}>\n <MortgageOfferIcon offer={offer} />\n <Typography color='primary' tag='span' variant='secondary-alone'>\n {name}\n </Typography>\n </div>\n {description && (<Typography color='secondary'>{description}</Typography>)}\n {description ? null : (<div className={cn('offer-info')}>\n <div className={cn('offer-percent')}>\n <Typography\n tag='span'\n color='primary'\n variant='promo-subheader'\n bold\n className={cn('percent', {\n typed: Boolean(offer?.type),\n discount: Boolean(offer?.minimalPercentDiscountFormatted) && ! equalPercent\n })}\n >\n {offer?.type && (<div className={cn('icon')}><Icon size='s' name='lightning-circle' /></div>)}\n {offer?.minimalPercentFormatted}\n </Typography>\n {! equalPercent && offer?.minimalPercentDiscountFormatted && <Typography variant='h3' color='orange-600'>\n {offer.minimalPercentDiscountFormatted}\n </Typography>}\n </div>\n <Typography color='primary' tag='span' className={cn('payment')}>\n {offer?.minimalPaymentDiscountFormatted ?? offer?.minimalPaymentFormatted}\n </Typography>\n </div>)}\n </div>\n </button>\n );\n};\n","import '../MortgageBuyOrDie.css';\n\nimport React, { RefObject, useCallback, useState } from 'react';\nimport { Typography, Badge, useDropdownHover, Dropdown, Tooltip, Modal, Button } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nconst DROPDOWN_OPENING_DELAY = 250;\n\nconst PriceHoverControl = () => {\n const { control } = useDropdownHover({ open: DROPDOWN_OPENING_DELAY });\n\n return (\n <span\n ref={control as RefObject<HTMLDivElement>}\n className={cnMrtgBuyOrDie('result-price-disclaimer-trigger')}\n >\n <Icon name='information-circle' size='m' color='rgb(172, 182, 195)' />\n </span>\n );\n};\n\nexport function MortgageBuyOrDieResultCard({\n isProfitable,\n type,\n price,\n time,\n isMobile,\n isOverLimit\n}: {\n type: 'mortgage' | 'acc';\n isProfitable: boolean;\n isMobile?: boolean;\n price: string;\n time: string;\n isOverLimit?: boolean;\n}) {\n const texts = (() => {\n if (type === 'mortgage') {\n return {\n mainText: 'Взять ипотеку и\\u00A0купить квартиру сейчас',\n resultText: 'потратите вместе с\\u00A0процентами и\\u00A0закроете ипотеку'\n };\n }\n return {\n mainText: 'Арендовать квартиру и\\u00A0копить на\\u00A0свою',\n resultText: `потратите на\\u00A0покупку квартиры, ${isOverLimit ? 'копить придётся' : 'накопите'}`\n };\n })();\n\n const [ isOpenDisclaimer, setIsOpenDisclaimer ] = useState(false);\n const openDislaimer = useCallback(() => setIsOpenDisclaimer(true));\n const closeDislaimer = useCallback(() => setIsOpenDisclaimer(true));\n\n return (<div className={cnMrtgBuyOrDie('result', { isProfitable })}>\n <Badge color={isProfitable ? 'success' : 'lightgray'} variant={isProfitable ? 'solid' : 'light'}>\n {isProfitable ? 'выгоднее' : 'дороже'}\n </Badge>\n <Typography bold variant='primary-alone'>{texts.mainText}</Typography>\n\n <Typography bold variant='h2' onClick={isMobile ? openDislaimer : undefined} className={cnMrtgBuyOrDie('result-price')}>\n {`${isOverLimit ? '>\\u00A0' : ''}${price}`}\n {type === 'acc' && ! isMobile && (\n <Dropdown>\n <PriceHoverControl />\n <Dropdown.Content positioning='end'>\n <div style={{ width: isMobile ? 280 : 320 }}>В среднем, недвижимость ежегодно дорожает на 5-7%</div>\n </Dropdown.Content>\n </Dropdown>\n )}\n {type === 'acc' && isMobile && (\n <span className={cnMrtgBuyOrDie('result-price-disclaimer-trigger')}>\n <Icon name='information-circle' size='m' color='hsla(251, 15%, 50%, 0.5)' />\n </span>\n )}\n </Typography>\n {isOpenDisclaimer && (\n <Modal\n opened\n closable\n onClose={closeDislaimer}\n swipeToClose\n >\n <Modal.Content>\n <div className={cnMrtgBuyOrDie('result-price-disclaimer')}>В среднем, недвижимость ежегодно дорожает на 5-7%</div>\n </Modal.Content>\n <Modal.Actions>\n <Button variant='secondary' onClick={closeDislaimer}>Свернуть</Button>\n </Modal.Actions>\n </Modal>\n )}\n <Typography variant='primary-alone'>\n {texts.resultText} \n <Typography tag='span' bold>{time}</Typography>\n </Typography>\n </div>);\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nexport function MortgageBuyOrDieReason({\n text,\n type\n}: {\n type: 'pos' | 'neg';\n text: string;\n}) {\n const icon = type === 'pos' ? 'check-circle' : 'information-circle';\n\n return (<div className={cnMrtgBuyOrDie('reason')}>\n <i className={cnMrtgBuyOrDie('reason-type-icon-bg', { type })}>\n <Icon name={icon} />\n </i>\n <Typography>{text}</Typography>\n </div>);\n}\n","import { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { getDeclensionMonths } from '@search/helpers/src/declension';\n\nimport { declensionYear } from '../../declensions';\n\n// Manager: Это по данным РБК недвижимость\nconst RISE_PRICE_RATE = 7 / 100;\n// https://www.cbr.ru/statistics/avgprocstav/ (ЦБ - 1,3%)\nconst DEPOSIT_RATE = 7.6 - 1.3;\nconst LIMIT_ACC_YEARS = 40;\n\nexport function calcMortgageRate(mortgagePercent: number) {\n return mortgagePercent / 100 / 12;\n}\n\nfunction calcFormula({\n futureCost = 0,\n percent = 10,\n invoice = 0,\n currentCost\n}: {\n percent: number;\n futureCost: number;\n invoice: number;\n currentCost: number;\n}) {\n const rate = calcMortgageRate(percent);\n\n // должно быть минус БС, но т.к. мы её не учитываем как 'инвестицию' (т.е. её отбив),\n // то используем только как то, к какой сумме должны прийти\n const numeratorNumeratora = (futureCost * rate + invoice);\n const denominatorNumeratora = (currentCost * rate + invoice);\n\n return Math.log(numeratorNumeratora / denominatorNumeratora) / Math.log(1 + rate);\n}\n\nexport const calcMonthPaymentMap = new Map<string, number>();\n\nexport function calcMonthPayment({\n years = 30,\n mortgagePercent,\n sumCredit\n}: {\n years?: number;\n mortgagePercent: number;\n sumCredit: number;\n}) {\n const stupidKey = `${sumCredit}${mortgagePercent}${years}`;\n\n if (! calcMonthPaymentMap.has(stupidKey)) {\n const mortgageRate = calcMortgageRate(mortgagePercent);\n const countMonths = 12 * years;\n\n calcMonthPaymentMap.set(stupidKey, (sumCredit * mortgageRate) / (1 - Math.pow(1 + mortgageRate, -countMonths)));\n }\n return calcMonthPaymentMap.get(stupidKey) as number;\n}\n\nfunction formatMonths(monthsFloat: number) {\n let timeYears = Math.trunc(monthsFloat / 12);\n let timeMonths = Math.ceil(12 * (monthsFloat / 12 - timeYears));\n\n if (timeMonths === 12) {\n timeMonths = 0;\n timeYears++;\n }\n\n return `за\\u00A0${\n timeYears ? `${timeYears}\\u00A0${declensionYear(timeYears)}` : ''\n }${timeYears && timeMonths ? ' ' : ''}${\n timeMonths ? getDeclensionMonths(timeMonths) : ''\n }`;\n}\n\nfunction calcAccPeriod({\n currentRateRise: initialRateRise,\n propertyCost,\n currentPropertyCost = propertyCost,\n propertyCostPeriod\n}: {\n currentRateRise: number;\n currentPropertyCost?: number;\n propertyCost: number;\n propertyCostPeriod: (propertyCost: number) => number;\n}): {\n periodPaymentsWithRise: number;\n riseInPrice: number;\n isOverLimit?: boolean;\n} {\n const isFirstYear = initialRateRise === 1;\n const currentRateRise = initialRateRise + RISE_PRICE_RATE;\n // в первый год подорожание не должно быть учитано\n const currentPropertyCostRise = isFirstYear ? propertyCost : currentPropertyCost * (1 + RISE_PRICE_RATE);\n const periodPaymentsWithRise = propertyCostPeriod(currentPropertyCostRise);\n\n // начисляем проценты подорожания и сравниваем, мы должны накопить больше, чем стоит квартира с учётом подорожания (1)\n // если без удорожания мы будем копить на квартиру 5 лет, значит нам нужно учесть 5 подорожаний минимум (в данном случае сравнение происходит на каждом этапе подорожания)\n // учли - пересчитываем сколько лет будем копить, и так пока не сойдётся условие (1)\n const countYearsWithRise = isFirstYear ? 1 : (currentRateRise - 1) / RISE_PRICE_RATE;\n const periodPaymentsWithRiseInYears = periodPaymentsWithRise / 12;\n\n // нам нужно понять, что более limitAccYears лет будем копить, поэтому проверяем, что сейчас\n // limitAccYears + 1 итерация, и что будет следующая тоже\n if (\n periodPaymentsWithRiseInYears > countYearsWithRise &&\n Math.trunc(countYearsWithRise + 1) === LIMIT_ACC_YEARS + 1\n ) {\n return {\n periodPaymentsWithRise,\n riseInPrice: currentPropertyCost,\n isOverLimit: true\n };\n }\n\n if (periodPaymentsWithRiseInYears > countYearsWithRise) {\n return calcAccPeriod({\n currentRateRise,\n currentPropertyCost: currentPropertyCostRise,\n propertyCost,\n propertyCostPeriod\n });\n }\n\n return {\n periodPaymentsWithRise,\n riseInPrice: currentPropertyCostRise\n };\n}\n\nexport function calculateBuyOrDie({\n propertyCost,\n initialPayment,\n mortgagePercent,\n comfortInvoice,\n rent\n}: {\n propertyCost: number; // стоимость квартиры\n mortgagePercent: number;\n initialPayment: number; // ownAmount\n comfortInvoice: number;\n rent: number;\n}) {\n const {\n periodPaymentsWithRise: calculatedDieMonths,\n riseInPrice: calculatedDieFinalCost,\n isOverLimit: isOverLimitAcc\n } = calcAccPeriod({\n currentRateRise: 1,\n propertyCost,\n propertyCostPeriod: (cost) => calcFormula({\n percent: DEPOSIT_RATE,\n invoice: comfortInvoice - rent,\n futureCost: cost,\n currentCost: initialPayment\n })\n });\n\n const calculatedBuyMonths = calcFormula({\n percent: mortgagePercent,\n invoice: -comfortInvoice,\n futureCost: 0,\n currentCost: propertyCost - initialPayment\n });\n\n const priceBuy = formatPrice({\n value: (initialPayment + calculatedBuyMonths * comfortInvoice) * 100,\n currency: Currency.RUB,\n noFractional: true,\n displayCurrency: true\n });\n const priceDie = formatPrice({\n value: calculatedDieFinalCost * 100,\n currency: Currency.RUB,\n noFractional: true,\n displayCurrency: true,\n inWords: calculatedDieFinalCost >= 1e7\n });\n\n const timeBuy = formatMonths(calculatedBuyMonths);\n const timeDie = isOverLimitAcc ? `более ${LIMIT_ACC_YEARS}\\u00A0лет` : formatMonths(calculatedDieMonths);\n const typeProfitable = isOverLimitAcc ? 'buy' : (initialPayment + calculatedBuyMonths * comfortInvoice) < calculatedDieFinalCost ? 'buy' : 'die';\n\n return {\n priceMortgage: priceBuy,\n priceAcc: priceDie,\n timeMortgage: timeBuy,\n timeAcc: timeDie,\n typeProfitable,\n isOverLimitAcc\n };\n}\n","import { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { FormType } from '../MortgageBuyOrDieModal';\nimport { calcMonthPayment } from './calculateBuyOrDie';\n\nconst REQUIRED_FIELD_TEXT = 'Обязательное поле';\n\nexport const validateFormFields = ({\n touched,\n formValues,\n mortgagePercent\n}: {\n touched: { rent: boolean; ownAmount: boolean; propertyCost: boolean; comfortInvoice: boolean };\n formValues: FormType;\n mortgagePercent?: number;\n}) => ({\n rent: validateRent({ touched: touched.rent, ...formValues }),\n comfortInvoice: validateComfortInvoice({ touched: touched.comfortInvoice, mortgagePercent, ...formValues }),\n ownAmount: validateOwnAmount({ touched: touched.ownAmount, ...formValues }),\n propertyCost: touched.propertyCost && formValues.propertyCost <= 0 ? REQUIRED_FIELD_TEXT : undefined,\n});\n\nfunction validateComfortInvoice(\n { touched, comfortInvoice = 0, mortgagePercent, propertyCost, ownAmount }:\n FormType & { touched: boolean; comfortInvoice?: number; mortgagePercent?: number }\n) {\n if (touched) {\n if (comfortInvoice <= 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n if (comfortInvoice < 5000) return { isError: true, text: 'Слишком низкий платёж, на\\u00A0покупку квартиры потребуется более 30\\u00A0лет' };\n\n if (mortgagePercent) {\n const mortgagePaymentWithCurrentInvoice = calcMonthPayment({ mortgagePercent, sumCredit: propertyCost - ownAmount });\n\n if (mortgagePaymentWithCurrentInvoice > comfortInvoice) {\n const textMortgagePaymentWithCurrentInvoice = formatPrice({\n value: (mortgagePaymentWithCurrentInvoice + 1) * 100,\n currency: Currency.RUB,\n noFractional: true,\n displayCurrency: true\n });\n\n return { isError: true, text: `C\\u00A0таким платежом вы\\u00A0не\\u00A0закроете ипотеку даже за\\u00A030\\u00A0лет. Минимальный платёж за\\u00A0эту квартиру\\u00A0— ${textMortgagePaymentWithCurrentInvoice}/мес.` };\n }\n }\n }\n return { isError: false, text: 'Cумма, которую вы\\u00A0смогли\\u00A0бы платить за\\u00A0ипотеку, если\\u00A0бы не\\u00A0снимали квартиру' };\n}\n\nfunction validateOwnAmount({ touched, ownAmount = 0, propertyCost = 0 }: { touched: boolean; ownAmount?: number; propertyCost?: number }) {\n if (touched) {\n if (ownAmount > propertyCost) return { isError: true, text: 'Первый взнос не\\u00A0больше стоимости квартиры' };\n if (ownAmount <= 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n if (ownAmount < (propertyCost / 100 * 15)) return { isError: true, text: 'Первый взнос не\\u00A0менее\\u00A015%' };\n }\n return { isError: false, text: 'Первый взнос не\\u00A0менее\\u00A015%' };\n}\n\nfunction validateRent({ touched, rent }: { touched: boolean; rent: number }) {\n if (touched) {\n if (rent < 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n }\n return { isError: false, text: 'Если вы\\u00A0не\\u00A0платите за\\u00A0аренду\\u00A0— оставьте поле пустым' };\n}\n","\nimport { isSpbWide } from '@search/helpers/src/isRegion';\n\nexport const regionsEnumerationDie = [\n { label: 'Москва и Московская область', value: 0 },\n { label: 'Санкт-Петербург и Ленинградская область', value: 1 },\n];\n\nexport function mapRegionToSelect(regionId?: number) {\n if (isSpbWide(regionId)) return regionsEnumerationDie[1].value;\n\n // msk & default\n return regionsEnumerationDie[0].value;\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nexport function MortgageBuyOrDieFormField({\n text,\n children\n}: React.PropsWithChildren<{\n text: string;\n}>): React.ReactElement {\n return (<div className={cnMrtgBuyOrDie('form-field')}>\n <Typography bold variant='primary-alone'>{text}</Typography>\n {children}\n </div>);\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Button, Select, useSelect, NumberInput, Modal } from '@vtblife/uikit';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\n\nimport { validateFormFields } from '../helpers/validate-helper';\nimport { cnMrtgBuyOrDie, FormType } from '../MortgageBuyOrDieModal';\nimport { regionsEnumerationDie } from '../helpers/mapRegionToSelect';\nimport { MortgageBuyOrDieFormField } from './MortgageBuyOrDieFormField';\n\nconst ROOM_OPTIONS: { label: string; value: Rooms }[] = [\n { label: '1', value: Rooms.ROOM_1 },\n { label: '2', value: Rooms.ROOM_2 },\n { label: '3', value: Rooms.ROOM_3 },\n { label: '4+', value: Rooms.ROOM_4 },\n { label: 'Студия', value: Rooms.STUDIO },\n];\n\nexport function MortgageBuyOrDieModalForm({\n onCalculate,\n isMobile,\n form,\n setForm,\n mortgagePercent\n}: {\n isMobile?: boolean;\n form: FormType;\n setForm: React.Dispatch<React.SetStateAction<FormType>>;\n onCalculate(): void;\n mortgagePercent: number;\n}) {\n const setOwnAmount = useCallback((newValue: number) => setForm((state) => ({ ...state, ownAmount: ! isNaN(newValue) ? newValue : 0 })), []);\n const setPropertyCost = useCallback((newValue: number) => setForm((state) => ({ ...state, propertyCost: ! isNaN(newValue) ? newValue : 0 })), []);\n const setRent = useCallback((newValue: number) => setForm((state) => ({ ...state, rent: ! isNaN(newValue) ? newValue : 0 })), []);\n const setComfortInvoice = useCallback((newValue: number) => setForm((state) => ({ ...state, comfortInvoice: ! isNaN(newValue) ? newValue : 0 })), []);\n const setRoomType = useCallback((roomType: FormType['roomType']) => () => {\n setForm((state) => {\n if (state.roomType === roomType) return { ...state, roomType: undefined };\n return ({ ...state, roomType });\n });\n }, []);\n const regionsSelect = useSelect(\n newValue => setForm((state) => ({ ...state, region: newValue })),\n {\n selected: form.region, // initial value\n texts: regionsEnumerationDie.map(option => ({ value: option.value, text: option.label }))\n }\n );\n\n const [ formTouched, setFormTouched ] = useState({\n rent: false,\n comfortInvoice: false,\n propertyCost: false,\n ownAmount: false,\n });\n\n const validateForm = useCallback((isFinalValidate?: boolean) => {\n return validateFormFields({\n touched: isFinalValidate ?\n { rent: true, comfortInvoice: true, propertyCost: true, ownAmount: true } : formTouched,\n formValues: form,\n mortgagePercent: isFinalValidate ? mortgagePercent : undefined\n });\n }, [ formTouched, form, mortgagePercent ]);\n const [ formValidMessages, setFormValidMessages ] = useState(validateForm);\n\n useEffect(() => setFormValidMessages(validateForm()), [ validateForm ]);\n\n const setRentTouched = useCallback(() => setFormTouched((state) => ({ ...state, rent: true })), []);\n const setPropertyCostTouched = useCallback(() => setFormTouched((state) => ({ ...state, propertyCost: true })), []);\n const setOwnAmountTouched = useCallback(() => setFormTouched((state) => ({ ...state, ownAmount: true })), []);\n const setComfortInvoiceTouched = useCallback(() => setFormTouched((state) => ({ ...state, comfortInvoice: true })), []);\n\n const handleValidToCalculate = useCallback(() => {\n const isFinalValidate = true;\n const isValidFormFields = validateForm(isFinalValidate);\n\n if (! isValidFormFields.rent.isError && ! isValidFormFields.comfortInvoice.isError &&\n ! isValidFormFields.propertyCost && ! isValidFormFields.ownAmount.isError\n ) {\n onCalculate();\n } else {\n setFormValidMessages(isValidFormFields);\n }\n }, [ onCalculate, validateForm ]);\n\n return (<>\n <form className={cnMrtgBuyOrDie('form')}>\n <MortgageBuyOrDieFormField text='Где вы собираетесь купить квартиру?'>\n <Select native={isMobile} mode='single' onChange={regionsSelect.handleChange}>\n <Select.Button size='l' dataTest='regions-trigger'>\n {regionsSelect.selectedText}\n </Select.Button>\n <Select.Content>\n {regionsEnumerationDie.map(option => (\n <Select.Option\n dataTest={`ceilHeight-${option.value}`}\n key={option.value}\n value={option.value}\n selected={regionsSelect.is(option.value)}\n >\n {option.label}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n </MortgageBuyOrDieFormField>\n <MortgageBuyOrDieFormField text='Сколько комнат:'>\n <div className={cnMrtgBuyOrDie('form-rooms')}>\n {ROOM_OPTIONS.map(({ value, label }) => (\n <Button\n variant='secondary'\n size='m'\n key={value}\n selected={form.roomType === value}\n onClick={setRoomType(value)}\n >\n {label}\n </Button>\n ))}\n </div>\n </MortgageBuyOrDieFormField>\n <div className={cnMrtgBuyOrDie('form-inputs')}>\n <MortgageBuyOrDieFormField text='Стоимость квартиры:'>\n <NumberInput\n dataTest='mortgage-die-set-propertyCost'\n size='l'\n inputMode='numeric'\n onChange={setPropertyCost}\n onBlur={setPropertyCostTouched}\n value={form.propertyCost}\n postfix='₽'\n hint={formValidMessages.propertyCost}\n error={Boolean(formValidMessages.propertyCost)}\n />\n </MortgageBuyOrDieFormField>\n <MortgageBuyOrDieFormField text='Уже накопили:'>\n <NumberInput\n dataTest='mortgage-die-set-amount'\n size='l'\n inputMode='numeric'\n postfix='₽'\n onChange={setOwnAmount}\n onBlur={setOwnAmountTouched}\n value={form.ownAmount}\n hint={formValidMessages.ownAmount.text}\n error={formValidMessages.ownAmount.isError}\n />\n </MortgageBuyOrDieFormField>\n <MortgageBuyOrDieFormField text='Арендная плата за съём жилья:'>\n <NumberInput\n dataTest='mortgage-die-set-rent'\n size='l'\n onChange={setRent}\n postfix='₽'\n value={form.rent}\n onBlur={setRentTouched}\n hint={formValidMessages.rent.text}\n error={formValidMessages.rent.isError}\n />\n </MortgageBuyOrDieFormField>\n <MortgageBuyOrDieFormField text='Комфортный платёж по ипотеке:'>\n <NumberInput\n dataTest='mortgage-die-set-invoice'\n size='l'\n onChange={setComfortInvoice}\n postfix='₽'\n value={form.comfortInvoice}\n onBlur={setComfortInvoiceTouched}\n hint={formValidMessages.comfortInvoice.text}\n error={formValidMessages.comfortInvoice.isError}\n />\n </MortgageBuyOrDieFormField>\n </div>\n </form>\n {! isMobile ? (\n <Modal.Actions>\n <Button\n fullWidth\n variant='accent'\n onClick={handleValidToCalculate}\n >Рассчитать</Button>\n </Modal.Actions>\n ) : null}\n {isMobile ? (\n <Modal.StickyActions>\n <Button\n fullWidth\n variant='accent'\n onClick={handleValidToCalculate}\n >Рассчитать</Button>\n </Modal.StickyActions>\n ) : null}\n </>);\n}\n","import './MortgageBuyOrDie.css';\n\nimport React, { useCallback, useState } from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { MortgageBuyOrDieResultCard } from './subcomponents/MortgageBuyOrDieResultCard';\nimport { MortgageBuyOrDieReason } from './subcomponents/MortgageBuyOrDieReason';\nimport { getLocalStorageLastValue } from './helpers/getLocalStorageLastValue';\nimport { calculateBuyOrDie } from './helpers/calculateBuyOrDie';\nimport { MortgageBuyOrDieModalForm } from './subcomponents/MortgageBuyOrDieForm';\nimport { mapRegionToSelect } from './helpers/mapRegionToSelect';\n\n// Немного другое название, потому что Андрей Африканов боится, что кто-то посмотрит наши классы\n// ужас какой\nexport const cnMrtgBuyOrDie = classname.bind(null, 'MortgageBuyOrAccModal');\n\nconst RENT_BUY_OR_ACC_KEY = 'rentBuyOrAcc';\nconst COMFORT_INVOICE_BUY_OR_ACC_KEY = 'comfortInvoiceBuyOrAcc';\n\nconst regionsEnumeration = [\n { label: 'Москва и Московская область', value: 0 },\n { label: 'Санкт-Петербург и Ленинградская область', value: 1 },\n];\n\nfunction convertRoomForAssign(roomType?: Rooms) {\n switch (roomType) {\n case Rooms.ROOM_5_AND_MORE:\n case Rooms.ROOM_4:\n case Rooms.OPEN_PLAN:\n return Rooms.ROOM_4;\n case undefined:\n case Rooms.UNKNOWN:\n return Rooms.ROOM_1;\n default:\n return roomType;\n }\n}\n\nconst typeProfitableTextReasons: Record<'buy' | 'die', [ string, string ]> = {\n buy: [\n 'Получить налоговый вычет до\\u00A0390\\u00A0000\\u00A0₽. Это поможет закрыть ипотеку досрочно, а\\u00A0значит заплатить банку меньше.',\n 'Рефинансировать ипотеку и\\u00A0снизить ставку. Другие банки готовы снизить процентную ставку, если вы\\u00A0переведете к\\u00A0ним ипотеку из\\u00A0своего банка.'\n ],\n die: [\n 'Недвижимость может резко вырасти в\\u00A0цене. Например, в\\u00A02021 квартиры подорожали на\\u00A022,6%, хотя ранее росли в\\u00A0цене на\\u00A05-7% ежегодно.',\n 'Инфляция может «съесть» накопления. По\\u00A0данным Росстата в\\u00A02022 инфляция составила 11,94%, а\\u00A0средняя ставка по\\u00A0вкладам в\\u00A03\\u00A0кв.\\u00A02022\\u00A0— 5,27%.'\n ],\n};\n\nexport type FormType = {\n ownAmount: number;\n propertyCost: number;\n rent: number;\n comfortInvoice: number;\n roomType?: Rooms;\n region: typeof regionsEnumeration[number]['value'];\n}\n\nexport function MortgageBuyOrDieModal({\n isMobile,\n onSuccess,\n onClose,\n propertyCost,\n regionId,\n roomType,\n mortgagePercent\n}: {\n isMobile?: boolean;\n onSuccess(e: React.MouseEvent<Element, MouseEvent>): void;\n onClose?(): void;\n roomType?: Rooms;\n regionId?: number;\n\n propertyCost: number;\n // ownAmount: number;\n mortgagePercent: number;\n}) {\n const [ modalView, setModalView ] = useState<'form' | 'calcResult'>('form');\n const [ typeProfitable, setTypeProfitable ] = useState<'buy' | 'die'>();\n const [ calculatedData, setCalculatedData ] = useState<Omit<ReturnType<typeof calculateBuyOrDie>, 'typeProfitable'>>();\n\n // we store it here to save state between modalView\n const [ form, setForm ] = useState<FormType>({\n propertyCost,\n ownAmount: Math.ceil(propertyCost / 100 * 15),\n rent: getLocalStorageLastValue(RENT_BUY_OR_ACC_KEY),\n comfortInvoice: getLocalStorageLastValue(COMFORT_INVOICE_BUY_OR_ACC_KEY),\n roomType: convertRoomForAssign(roomType),\n region: mapRegionToSelect(regionId)\n });\n\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const handleCalculate = useCallback(() => {\n // after all checking\n localStorage?.setItem(COMFORT_INVOICE_BUY_OR_ACC_KEY, String(form.comfortInvoice));\n localStorage?.setItem(RENT_BUY_OR_ACC_KEY, String(form.rent));\n const { typeProfitable: calculatedTypeProfitable, ...calculatedResult } = calculateBuyOrDie({\n ...form,\n mortgagePercent,\n initialPayment: form.ownAmount\n });\n\n setCalculatedData(calculatedResult);\n setModalView('calcResult');\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n page_type: 'card',\n type: 'buy_or_save_calc'\n });\n document.querySelector('[class*=\"content-module__scrollable\"]')?.scrollTo(0, 0);\n setTypeProfitable(localStorage?.getItem('buydie') as 'buy' | 'die' ?? calculatedTypeProfitable);\n }, [ form, mortgagePercent ]);\n const handleBackToForm = useCallback(() => {\n setModalView('form');\n setTypeProfitable(undefined);\n\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n page_type: 'card',\n type: 'buy_or_save_back'\n });\n });\n const handleSubmitMortgageReq = useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n page_type: 'card',\n type: 'buy_or_save_rate'\n });\n onSuccess(e);\n });\n\n const subtitle = modalView === 'form' ? 'Что будет выгоднее: копить или купить в\\u00A0ипотеку?' : 'Результаты расчёта';\n const actionText = 'Узнать свою ставку';\n const resultText = typeProfitable === 'buy' ? 'А\\u00A0ещё, купив квартиру в\\u00A0ипотеку вы\\u00A0сможете:' : 'Стоит учитывать риски, которые сложно спрогнозировать:';\n\n return (<Modal\n onClose={onClose}\n closable\n mobile={isMobile}\n swipeToClose={! isMobile}\n opened\n >\n {isMobile ? <Modal.Header>Калькулятор</Modal.Header> : <Modal.Title>{subtitle}</Modal.Title>}\n <Modal.Content scrollable={isMobile}>\n {isMobile ? <Typography className={cnMrtgBuyOrDie('subtitle')} variant='h3'>{subtitle}</Typography> : null}\n\n {modalView === 'form' && (<>\n <MortgageBuyOrDieModalForm\n isMobile={isMobile}\n form={form}\n mortgagePercent={mortgagePercent}\n onCalculate={handleCalculate}\n setForm={setForm}\n />\n </>)}\n\n {modalView === 'calcResult' && calculatedData && (<>\n <div className={cnMrtgBuyOrDie('results')}>\n <MortgageBuyOrDieResultCard\n type='mortgage'\n isMobile={isMobile}\n isProfitable={typeProfitable === 'buy'}\n price={calculatedData.priceMortgage}\n time={calculatedData.timeMortgage}\n />\n <MortgageBuyOrDieResultCard\n type='acc'\n isMobile={isMobile}\n isProfitable={typeProfitable === 'die'}\n price={calculatedData.priceAcc}\n time={calculatedData.timeAcc}\n isOverLimit={calculatedData.isOverLimitAcc}\n />\n </div>\n <div className={cnMrtgBuyOrDie('results-annotation')}>\n <Typography bold variant='primary-alone'>{resultText}</Typography>\n {typeProfitable && (<>\n <MortgageBuyOrDieReason\n type={typeProfitable === 'buy' ? 'pos' : 'neg'}\n text={typeProfitableTextReasons[typeProfitable][0]}\n />\n <MortgageBuyOrDieReason\n type={typeProfitable === 'buy' ? 'pos' : 'neg'}\n text={typeProfitableTextReasons[typeProfitable][1]}\n />\n </>)}\n </div>\n\n {/* force wrapper for correct ratio of buttons */}\n {! isMobile ? (<>\n <div className={cnMrtgBuyOrDie('actions')}>\n <Button\n icon='arrow-left'\n variant='secondary'\n onClick={handleBackToForm}\n />\n <Button\n fullWidth\n variant={'secondary'}\n onClick={handleSubmitMortgageReq}\n >{actionText}</Button>\n </div>\n <Typography\n className={cnMrtgBuyOrDie('disclaimer')}\n variant='secondary-alone'\n color='secondary'\n >\n Расчет ориентировочный и не является инвестиционной рекомендацией.\n </Typography>\n </>) : null}\n\n {isMobile ? (<>\n <Typography variant='secondary-alone' color='secondary'>Расчет ориентировочный и не является инвестиционной рекомендацией.</Typography>\n <Modal.StickyActions>\n <div className={cnMrtgBuyOrDie('actions', { isSticky: true })}>\n <Button\n icon='arrow-left'\n variant='secondary'\n onClick={handleBackToForm}\n />\n <Button\n fullWidth\n variant={'secondary'}\n onClick={handleSubmitMortgageReq}\n >{actionText}</Button>\n </div>\n </Modal.StickyActions>\n </>) : null}\n </>)}\n </Modal.Content>\n </Modal>);\n}\n","import './MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport Icon from '@vtblife/uikit-icons'; // TODO\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport Image from '../../Image';\n\nimport mortgageBuyOrDieImg from './mortgageBuyOrDieImg.url.svg';\n\nconst cn = classname.bind(null, 'MortgageBuyOrAccTrigger');\n\nexport function MortgageBuyOrDieTrigger({ onClick, className }: { onClick(): void; className?: string }) {\n const staticPath = useStaticPathConfig();\n\n return (<div className={cn('', undefined, className)} onClick={onClick}>\n <Image url={`${staticPath}${mortgageBuyOrDieImg}`} />\n <div className={cn('texts')}>\n <Typography bold variant='secondary-alone'>\n Что сейчас выгоднее: арендовать и копить или купить квартиру в ипотеку?\n {/* eslint-disable-next-line react/jsx-indent */}\n <Typography tag='span' bold color='link' className={cn('link-hover')}>\n  Рассчитать ➔\n {/* TODO ICON */}\n {/* <i\n // eslint-disable-next-line max-len\n style={{ lineHeight: 16, display: 'inline-flex', alignItems: 'center', verticalAlign: 'middle', marginLeft: 8 }}\n >\n <svg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'><path fillRule='evenodd' clipRule='evenodd' d='M11.13 7.25 7.88 4l1.06-1.06L14 8l-5.06 5.06L7.88 12l3.25-3.25h-9.2v-1.5h9.2Z' fill='#221F2E' /></svg>\n </i> */}\n </Typography>\n </Typography>\n <Typography variant='small' color='secondary'>Калькулятор рентабельности поможет сделать правильный выбор</Typography>\n </div>\n </div>);\n}\n","import './MortgageCalculatorFields.css';\n\nimport React, { FunctionComponent } from 'react';\nimport { SliderNumberInput, Typography } from '@vtblife/uikit';\nimport { SliderNumberInputField, SliderMoneyInputField, Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\n\nimport { useBankMortgageForm, UseBankMortgageFormProps } from '../../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { MortgagePurposeEnum } from '../../MortgagePurposeEnum';\nimport { declensionYear } from '../../declensions';\n\nconst cn = classname.bind(null, 'BanksMortgageCalculatorFields');\n\nconst formatYear = (value: string) => {\n return `${value} ${declensionYear(Number(value.replace(',', '.')))}`;\n};\n\nexport interface MinimalBanksMortgageFieldsProps extends UseBankMortgageFormProps {\n className?: string;\n}\n\n/**\n * Задаем несуществующий FORM_ID чтобы поля не отправлялись при submit\n */\nconst FORM_ID = 'FORM_ID';\n\nexport const BanksMortgageCalculatorFields: FunctionComponent<MinimalBanksMortgageFieldsProps & { isMobile?: boolean }> = React.memo(props => {\n const { className, isMobile, ...rest } = props;\n const {\n formState,\n handleFieldChange,\n calculatedFormValues: {\n ownAmount,\n propertyCost,\n term\n }\n } = useBankMortgageForm(rest);\n\n return (\n <div className={cn(undefined, undefined, className)}>\n <input hidden name='term' value={formState.term} readOnly />\n <input hidden name='purpose' value={MortgagePurposeEnum[formState.purpose]} readOnly />\n <input hidden name='regionId' value={formState.regionId} readOnly />\n <input hidden name='ownAmount' value={formState.ownAmount} readOnly />\n <input hidden name='propertyCost' value={formState.propertyCost} readOnly />\n <div className={cn('field', { grid: 'cost' })}>\n <SliderNumberInput\n currency='RUB'\n logarithmic\n size='l'\n inputMode='decimal'\n label='Стоимость недвижимости'\n max={propertyCost.max}\n min={propertyCost.min}\n step={propertyCost.step}\n name='propertyCost'\n onChange={handleFieldChange.bind(null, 'propertyCost')}\n value={formState.propertyCost}\n />\n </div>\n <div className={cn('field', { grid: 'ownAmount' })}>\n <SliderMoneyInputField\n contentAfter={isMobile ? undefined : <Typography variant='h4' color='black-400'>{ownAmount.percent}</Typography>}\n form={FORM_ID}\n inputMode='decimal'\n label='Первоначальный взнос'\n max={ownAmount.max}\n min={ownAmount.min}\n name='ownAmount'\n onChange={handleFieldChange.bind(null, 'ownAmount')}\n size={Size.Large}\n step={ownAmount.step}\n value={formState.ownAmount}\n hideNoteSpace\n />\n </div>\n <div className={cn('field', { grid: 'term' })}>\n <SliderNumberInputField\n form={FORM_ID}\n formatter={formatYear}\n inputMode='numeric'\n label='Срок кредита'\n max={term.max}\n min={term.min}\n name='term'\n onChange={handleFieldChange.bind(null, 'term')}\n size={Size.Large}\n value={formState.term ? formState.term : 1}\n hideNoteSpace\n />\n </div>\n </div>\n );\n});\n","import './ArrowButton.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'ArrowButton');\n\nexport type ArrowDirection = 'left' | 'right';\n\nexport function ArrowButton({\n onClick,\n size = 'm',\n dataTest,\n direction,\n variant,\n disabled,\n isDisabledToHide\n}: {\n size?: 'm' | 's';\n disabled?: boolean;\n variant?: 'alt';\n direction: ArrowDirection;\n onClick?(direction: ArrowDirection): void;\n dataTest?: string;\n isDisabledToHide?: boolean;\n}) {\n return (\n <button\n disabled={disabled}\n className={cn(null, { variant, size, disabled, isDisabledToHide })}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClick?.(direction);\n }}\n data-test={dataTest}\n >\n <Icon\n name={direction === 'right' ? 'chevron-right' : 'chevron-left'}\n size='m'\n />\n </button>\n );\n}\n","import React from 'react';\n\nimport { ArrowButton, ArrowDirection } from './ArrowButton';\n\nexport function ArrowButtonPair({\n onArrowClick,\n isLeftEdge,\n isRightEdge,\n variant,\n size,\n dataTestPrefix = 'desktop-mortgage-calculator-arrow',\n isDisabledToHide,\n}: {\n onArrowClick(type: ArrowDirection): void;\n isLeftEdge?: boolean;\n isRightEdge?: boolean;\n dataTestPrefix?: string;\n} & Pick<React.ComponentProps<typeof ArrowButton>, 'variant' | 'size' | 'isDisabledToHide'>) {\n return (\n <>\n <ArrowButton\n direction='left'\n size={size}\n variant={variant}\n disabled={isLeftEdge}\n onClick={onArrowClick}\n dataTest={`${dataTestPrefix}-left`}\n isDisabledToHide={isDisabledToHide}\n />\n <ArrowButton\n direction='right'\n size={size}\n variant={variant}\n disabled={isRightEdge}\n onClick={onArrowClick}\n dataTest={`${dataTestPrefix}-right`}\n isDisabledToHide={isDisabledToHide}\n />\n </>\n );\n}\n","import './ArrowButtonPop.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nimport { ArrowButtonPair } from './ArrowButtonPair';\n\nconst cn = classname.bind(null, 'ArrowButtonPop');\n\nexport function ArrowButtonPop(p: React.ComponentProps<typeof ArrowButtonPair>) {\n return (\n <div className={cn(null, { left: p.isLeftEdge, right: p.isRightEdge })}>\n <ArrowButtonPair {...p} />\n </div>\n );\n}\n","import React from 'react';\nimport type { ArrowDirection } from './ArrowButton';\n\nfunction findInvizibleNearestChilds(container: HTMLElement) {\n const cr = container.parentElement?.getBoundingClientRect();\n\n const childs = container.childNodes as unknown as readonly HTMLElement[];\n\n let left: HTMLElement | undefined;\n let right: HTMLElement | undefined;\n\n if (! cr) return { left, right };\n\n childs.forEach(child => {\n const r = child.getBoundingClientRect();\n\n if (r.x < cr.x) left = child;\n if (r.x + r.width > cr.x + cr.width && ! right) right = child;\n });\n\n return { left, right };\n}\n\nexport function useArrowButton() {\n const [ isLeftEdge, setIsLeftEdge ] = React.useState(true);\n const [ isRightEdge, setIsRightEdge ] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const onArrowClick = React.useCallback((arrowDirection: ArrowDirection) => {\n const container = containerRef.current;\n\n if (! container) return;\n\n const nearest = findInvizibleNearestChilds(container);\n\n const item = arrowDirection === 'left' ? nearest.left : nearest.right;\n\n item?.scrollIntoView({\n inline: arrowDirection === 'left' ? 'end' : 'start',\n behavior: 'smooth',\n block: 'nearest'\n });\n }, [ ]);\n\n const onContainerScroll = React.useCallback((event: React.UIEvent<HTMLDivElement> & { target?: HTMLDivElement }) => {\n const t = event.target;\n\n if (! t) return;\n\n setIsLeftEdge(t.scrollLeft === 0);\n // +1 потому скролл не доезжат до конца идеально, не хватало 0.175 что ли.\n setIsRightEdge((t.offsetWidth + t.scrollLeft) + 1 >= t.scrollWidth);\n }, []);\n\n const [ isScrollNeeded, setIsScrollNeeded ] = React.useState(false);\n\n React.useEffect(() => {\n const container = containerRef.current;\n\n if (! container) return;\n const nearest = findInvizibleNearestChilds(container);\n\n setIsScrollNeeded(Boolean(nearest.left || nearest.right));\n }, []);\n\n return {\n onArrowClick,\n onContainerScroll,\n isScrollNeeded,\n isLeftEdge,\n isRightEdge,\n containerRef\n };\n}\n","import './CardScroller.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'CardScroller');\n\nexport function CardScroller({\n controls,\n children,\n isLeftMask,\n isRightMask,\n isBottomMargin,\n containerRef,\n autoWidth,\n onContainerScroll,\n isLeftMargin\n}: {\n autoWidth?: boolean;\n onContainerScroll?(e: React.UIEvent<HTMLDivElement> & { target?: HTMLDivElement }): void;\n containerRef?: React.RefObject<HTMLDivElement>;\n isLeftMask?: boolean;\n isRightMask?: boolean;\n isBottomMargin?: boolean;\n isLeftMargin?: boolean;\n controls?: React.ReactNode;\n children: React.ReactNode;\n}) {\n return (\n <div\n className={cn(null, { left: isLeftMask, right: isRightMask, bottom: isBottomMargin, leftMargin: isLeftMargin })}\n >\n <div\n ref={containerRef}\n onScroll={onContainerScroll}\n className={cn('content', { autoWidth })}\n >\n {children}\n </div>\n {controls}\n </div>\n );\n}\n","import React from 'react';\n\nimport { ArrowButtonPop } from '../ArrowButton/ArrowButtonPop';\nimport { useArrowButton } from '../ArrowButton/useArrowButton';\nimport { CardScroller } from '../CardScroller/CardScroller';\n\nexport function BanksMortgageOffersScroller({\n children,\n isControls\n}: {\n isControls?: boolean;\n children: React.ReactNode;\n}) {\n const {\n onArrowClick,\n onContainerScroll,\n isLeftEdge,\n isRightEdge,\n containerRef\n } = useArrowButton();\n\n return (\n <CardScroller\n children={children}\n onContainerScroll={onContainerScroll}\n isLeftMask={! isLeftEdge}\n isRightMask={! isRightEdge}\n containerRef={containerRef}\n controls={\n isControls && (<ArrowButtonPop\n isDisabledToHide\n onArrowClick={onArrowClick}\n isLeftEdge={isLeftEdge}\n isRightEdge={isRightEdge}\n />)\n }\n />\n );\n}\n","import './MortgageDiscountConditions.css';\n\nimport React, { useMemo } from 'react';\nimport { Checkbox, Collapse, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { DiscountCalcEnum } from '@search/graphql-typings';\nimport { maxMortgageDiscountFormatted } from '../useChangeDiscount';\n\nconst cn = classname.bind(null, 'MortgageDiscountConditions');\n\nconst MortgageCondition = ({\n children,\n isMobile = false,\n disabled = false,\n value,\n onChangeDiscount,\n discountType\n}: {\n value: boolean;\n children: string;\n isMobile?: boolean;\n disabled?: boolean;\n discountType: DiscountCalcEnum;\n onChangeDiscount: (checked: boolean, discountType: DiscountCalcEnum) => void;\n}) => {\n const textStyleCheckbox = useMemo(() => {\n return isMobile ? 'small-alone' : 'secondary-alone';\n }, [ isMobile ]);\n\n return (\n <div className={cn('checkbox')}>\n <Checkbox disabled={disabled} value={value} onChange={checked => onChangeDiscount(checked, discountType)}>\n <Typography variant={textStyleCheckbox} color='black-500'>{children}</Typography>\n </Checkbox>\n <Typography variant={textStyleCheckbox}>-0,3%</Typography>\n </div>\n );\n};\n\nexport const MortgageDiscountConditions = (\n {\n discountTypes,\n isMobile,\n discount,\n onChangeDiscount,\n className\n }: {\n discountTypes: readonly DiscountCalcEnum[];\n isMobile?: boolean;\n discount: string;\n className?: string;\n onChangeDiscount: (value: boolean, discountType: DiscountCalcEnum) => void;\n }\n) => {\n return (\n <div className={cn(null, undefined, className)}>\n <Collapse size='s' variant='gray'>\n <Collapse.Item\n title={`Как сэкономить ${maxMortgageDiscountFormatted}% на\\u00A0ставке по\\u00A0ипотеке от\\u00A0ВТБ?`}\n >\n {\n <div className={cn('checkbox-group')}>\n <MortgageCondition\n discountType={DiscountCalcEnum.SbrElreg}\n isMobile={isMobile}\n value={discountTypes.includes(DiscountCalcEnum.SbrElreg)}\n onChangeDiscount={onChangeDiscount}\n >\n Использование сервиса безопасных расчетов и электронной регистрации\n </MortgageCondition>\n <MortgageCondition\n discountType={DiscountCalcEnum.SalaryProject}\n value={discountTypes.includes(DiscountCalcEnum.SalaryProject)}\n isMobile={isMobile}\n onChangeDiscount={onChangeDiscount}\n >\n Являюсь участником зарплатного проекта ВТБ или готов им стать\n </MortgageCondition>\n </div>\n }\n {Number(discount) > 0 ? (\n <div className={cn('final-value')}>\n <Typography variant='secondary-alone' bold>\n Скидка на ставку по ипотеке от банка ВТБ\n </Typography>\n <Typography variant='secondary-alone' bold>\n {`-${discount.replace('.', ',')}%`}\n </Typography>\n </div>\n ) : null}\n </Collapse.Item>\n </Collapse>\n </div>\n );\n};\n","import './NoOffersBanner.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport Image from '../../../Image';\nimport NoOffersImg from './NoOffersImg.url.svg';\n\nconst cn = classname.bind(null, 'NoOffersBanner');\n\nexport const NoOffersBanner = () => {\n const staticPath = useStaticPathConfig();\n\n return (\n <div className={cn()}>\n <Image url={`${staticPath}${NoOffersImg}`} />\n <div className={cn('description')}>\n <Typography variant='h4'>\n Предложений нет\n </Typography>\n <p className={cn('text')}>\n На таких условиях оформить ипотеку не получится.\n Попробуйте найти квартиру дешевле или увеличьте срок.\n </p>\n </div>\n </div>\n );\n};\n","import './styles.css';\n\nimport React, { FunctionComponent, useState, useCallback, useMemo, useRef } from 'react';\nimport {\n Typography,\n // Button,\n LinkButton\n} from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { parseAndFormatNumber } from '@search/helpers/src/formatNumber';\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { ApplicationIdEnum, MortgageOfferType } from '@search/graphql-typings/src';\n\nimport { MinimalBanksMortgageProps } from '../../../../desktop/components/MinimalBanksMortgage';\nimport {\n MinimalBanksMortgageOffer,\n useMinimalBanksMortgageOffersSliced\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { offerRegionToMortgage } from '../../../../../domain/offer/regionToBackoffice';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { Mortgage2StarterModal } from '../mortgage2/starter/Mortgage2StarterModal';\nimport { Mortgage2ConsultModal } from '../mortgage2/consult/Mortgage2ConsultModal';\nimport { getGtmLabel } from '../../../../../domain/GtmContext';\nimport { MortgageOfferSkeleton } from '../../BanksMortgageOffers/MortgageOfferSkeleton';\nimport { BankMortgageOffers } from '../../BanksMortgageOffers';\nimport { MortgageGovernmentDisclaimer } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { MortgageBuyOrDieModal } from '../mortgageBuyOrDie/MortgageBuyOrDieModal';\nimport { MortgageBuyOrDieTrigger } from '../mortgageBuyOrDie/MortgageBuyOrDieTrigger';\nimport { MortgageStupidModal } from '../stupid/MortgageStupidModal';\nimport { mortgage2ParamsFromClasified } from '../mortgage2/mortgage2ParamsFromClasified';\nimport { useMortgage2Request } from '../mortgage2/useMortgage2Request';\nimport { defaultBanksTotal } from '../contants';\nimport { useGovernmentMortgage } from '../useGovernmentMortgage';\nimport { BanksMortgageCalculatorFields } from './MortgageCalculatorFields/MortgageCalculatorFields';\nimport { BanksMortgageOffersScroller } from './MortgageOffersScroller/MortgageOffersScroller';\nimport { MortgageDiscountConditions } from './MortgageDiscountConditions/MortgageDiscountConditions';\nimport { maxMortgageDiscountFormatted, useChangeDiscount, VTB_ID } from './useChangeDiscount';\nimport { NoOffersBanner } from './NoOffersBanner/NoOffersBanner';\n\nconst cn = classname.bind(null, 'MortgageCalculator');\n\n// eslint-disable-next-line complexity\nexport const Mortgage3Calc : FunctionComponent<MinimalBanksMortgageProps> = React.memo(({\n term,\n isMobile,\n isPreferentialNbCondition,\n propertyCost,\n ownAmount,\n purpose,\n regionId,\n mortgageRegionId,\n areButtonsHidden,\n gtmStarterModalSendedId,\n gtmCommonClick,\n gtmSendClick,\n gtmShowMoreClick,\n gtmShowData,\n gtmSendData,\n applicationId,\n realtyType = 'ProfOfferFlat',\n withoutAuth,\n withoutForm,\n locationPlacement,\n buyOrDieMode,\n roomType,\n isNewBuilding = false,\n mortgageDemandLink,\n // eslint-disable-next-line react-hooks/rules-of-hooks\n mortgageOfferFormData = useMinimalBanksMortgageOffersSliced({\n term,\n propertyCost,\n ownAmount,\n purpose,\n isPreferentialNbCondition,\n regionId: regionId ? offerRegionToMortgage(regionId) : mortgageRegionId!,\n defaultVisibleOffers: 4\n }),\n minimalMortgagePaymentSendData,\n minimalMortgageRate\n}) => {\n const [ senderState, setSenderState ] = useState({\n selectedMortgageOffer: undefined as MinimalBanksMortgageOffer | undefined,\n isSendModalOpened: false,\n isConsultModalOpened: false\n });\n const isPreferentialSelectedOffer = senderState.selectedMortgageOffer?.type === MortgageOfferType.Preferential || senderState.selectedMortgageOffer?.type === MortgageOfferType.Family;\n const [ isStupidModalOpened, setIsStupidModalOpened ] = useState(false);\n const [ isCalcBuyOrDieModalOpened, setIsCalcBuyOrDieModalOpened ] = useState(false);\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const openBuyOrDieModal = useCallback(() => {\n setIsCalcBuyOrDieModalOpened(true);\n\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n page_type: 'card',\n type: 'buy_or_save_open'\n });\n }, [ dataLayerPush ]);\n const closeBuyOrDieModal = useCallback(() => setIsCalcBuyOrDieModalOpened(false));\n // чтобы обратили внимание на контекст вызова, если вызывать в другом - нужно сделать пропс про аналитику buy/die в модалке опциональным\n const openStupidModalByBuyOrDie = useCallback(() => setIsStupidModalOpened(true));\n const closeStupidModal = useCallback(() => setIsStupidModalOpened(false));\n\n const {\n isEmpty,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n loading,\n error,\n formData,\n setFormData,\n formUrl,\n offersFull,\n isFormChanged\n } = mortgageOfferFormData;\n\n const governmentMortgage = useGovernmentMortgage({\n ...formData,\n isPreferentialNbCondition,\n });\n const {\n offers,\n discount,\n onChangeDiscount,\n isShowAdditionalDiscounts,\n shouldVTBDiscountLogic,\n discountTypes,\n } = useChangeDiscount({\n ...formData,\n ...governmentMortgage,\n isPreferentialNbCondition,\n applicationId,\n offersFull\n });\n\n const minimalIncome = useMemo(() => {\n const firstNatureOfferMinimalPayment = offers.find(offer => ! offer?.disabled)?.minimalPayment;\n\n if (! firstNatureOfferMinimalPayment) return null;\n\n minimalMortgagePaymentSendData && minimalMortgagePaymentSendData(firstNatureOfferMinimalPayment);\n\n // Платеж не более 60% от дохода\n return parseAndFormatNumber(Math.round(firstNatureOfferMinimalPayment / 0.6));\n }, [ offers ]);\n\n const sendModalClose = useCallback(() => {\n setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: false });\n }, [ ]);\n\n const selectMortgageOffer = useCallback((\n selectedMortgageOffer: MinimalBanksMortgageOffer,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n e.preventDefault();\n if (areButtonsHidden) return;\n if (selectedMortgageOffer?.type === 'PREFERENTIAL' || selectedMortgageOffer?.type === 'FAMILY') {\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n type: selectedMortgageOffer?.type === 'PREFERENTIAL' ? 'gospr_benefit_click' : 'gospr_family_click'\n });\n }\n if (withoutAuth) {\n gtmShowData && dataLayerPush({\n ...gtmShowData,\n place: 'bank',\n });\n setSenderState({ selectedMortgageOffer, isSendModalOpened: true, isConsultModalOpened: false });\n } else {\n domain.sendQuery(e);\n }\n }, [ areButtonsHidden, dataLayerPush, withoutAuth, gtmShowData ]);\n\n const consultModalOpen = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n e?.preventDefault();\n if (gtmShowMoreClick || gtmCommonClick) {\n dataLayerPush({ event: gtmShowMoreClick || gtmCommonClick });\n }\n gtmShowData && dataLayerPush({\n ...gtmShowData,\n place: 'consultation'\n });\n setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: true });\n }, [ gtmShowMoreClick, gtmCommonClick, dataLayerPush, gtmShowData ]);\n\n const consultModalClose = useCallback(() => {\n setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: false });\n }, [ ]);\n\n const willNeedSendDiscountsVTB = (\n senderState.selectedMortgageOffer?.bankId === VTB_ID ||\n (! senderState.selectedMortgageOffer && offers?.[0]?.bankId === VTB_ID)\n );\n\n // временное решение/дублирование.\n // Нужно переделать всё это на контексты внутри оффера, например.\n const params = mortgage2ParamsFromClasified({\n regionId,\n mortgageRegionId,\n purpose: formData.purpose,\n term: formData.term,\n ownAmount: formData.ownAmount,\n propertyCost: formData.propertyCost,\n });\n const banksTotal = senderState.selectedMortgageOffer ? defaultBanksTotal - 1 : defaultBanksTotal;\n\n const bestMortgageOffer = senderState.selectedMortgageOffer ?? mortgageOfferFormData.bestMortgageOffer;\n const initialBestMortgageOffer = useRef(bestMortgageOffer);\n\n if (! initialBestMortgageOffer.current && bestMortgageOffer) {\n initialBestMortgageOffer.current = bestMortgageOffer;\n }\n\n const userInfoLoad = useUserDetailsLoader();\n const userInfo = userInfoLoad({});\n const domain = useMortgage2Request({\n regionId,\n mortgageRegionId,\n purpose: formData.purpose,\n term: formData.term,\n ownAmount: params.ownAmount,\n propertyCost: params.propertyCost,\n locationPlacement,\n realtyType,\n applicationId,\n withoutAuth,\n withoutForm,\n shouldVTBDiscountLogic,\n showPreferential: governmentMortgage.showPreferential,\n gtmSendId: gtmStarterModalSendedId,\n discounts: willNeedSendDiscountsVTB ? discountTypes : undefined,\n userDetails: userInfo.data?.userProfile.person,\n banksTotal,\n selectedMortgageOffer: senderState.selectedMortgageOffer,\n bestMortgageOffer,\n });\n\n const [ isMrtgDisclaimerModalOpened, setIsMrtgDisclaimerModalOpened ] = React.useState(false);\n const handleSubmitRequest = useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n e?.preventDefault();\n setIsMrtgDisclaimerModalOpened(false);\n if (withoutAuth) {\n setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: true, isConsultModalOpened: false });\n gtmShowData && dataLayerPush({\n ...gtmShowData,\n place: senderState.selectedMortgageOffer ? 'bank' : gtmShowData.place\n });\n } else {\n domain.sendQuery(e);\n }\n if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n dataLayerPush({\n event: 'classified_card_sale_ipoteka_calc_click'\n });\n }\n }, [ dataLayerPush, withoutAuth, gtmShowData, applicationId ]);\n\n if (error) return null;\n\n if (! isFormChanged && ! loading && offersFull.length === 0) {\n return null;\n }\n\n return (\n <>\n <form\n method='GET'\n target='_blank'\n action={formUrl}\n className={cn()}\n >\n <Typography variant='promo-h3'>\n {governmentMortgage.showPreferential ?\n <>Доступные ипотечные программы</> :\n <>Ипотека с экономией до {maxMortgageDiscountFormatted}% на ставке</>\n }\n </Typography>\n <BanksMortgageCalculatorFields\n className={cn('fields')}\n term={formData.term}\n purpose={formData.purpose}\n regionId={formData.regionId}\n ownAmount={formData.ownAmount}\n propertyCost={formData.propertyCost}\n onChange={setFormData}\n />\n {offers.length && minimalIncome ? <Typography bold>\n {`Доход заемщика не менее: ${minimalIncome} ₽/мес.`}\n </Typography> : <> </>}\n <div className={cn('scroller-wrap')}>\n <BanksMortgageOffersScroller isControls={offersFull.length > 4}>\n {loading ? (\n [ undefined, undefined, undefined, undefined, undefined ].map((item, index) => (\n <MortgageOfferSkeleton key={index} />\n ))\n ) : null}\n {isEmpty ? <NoOffersBanner /> : null}\n {offers.length && ! loading ? (\n offers.map((offer, index) => (\n <BankMortgageOffers\n offer={offer}\n key={String(offer?.type ?? 'unk') + '' + (offer?.bankId ?? String(index))}\n gtmCommonClick={gtmCommonClick}\n selectMortgageOffer={selectMortgageOffer}\n />\n ))\n ) : null}\n </BanksMortgageOffersScroller>\n </div>\n {governmentMortgage.showPreferential && (<div className={cn('conditions')}>\n {isMrtgDisclaimerModalOpened && (<MortgageGovernmentDisclaimerModal\n btnText={`${withoutAuth ? 'Подать' : 'Оформить'} заявку на ипотеку`}\n isMobile={isMobile}\n onSuccess={handleSubmitRequest}\n onClose={() => {\n setIsMrtgDisclaimerModalOpened(false);\n }}\n />)}\n <MortgageGovernmentDisclaimer\n isLongDescr\n isMobile={isMobile}\n onClick={() => {\n setIsMrtgDisclaimerModalOpened(true);\n }}\n />\n </div>)}\n {isShowAdditionalDiscounts && ! buyOrDieMode && (<MortgageDiscountConditions\n className={cn('conditions')}\n discount={discount.toFixed(1)}\n discountTypes={discountTypes}\n onChangeDiscount={onChangeDiscount}\n />)}\n {buyOrDieMode && bestMortgageOffer && (\n <MortgageBuyOrDieTrigger className={cn('buyOrAcc')} onClick={openBuyOrDieModal} />\n )}\n <div className={cn('buttons')}>\n <LinkButton\n variant='accent'\n type='submit'\n onClick={mortgageDemandLink ? undefined : handleSubmitRequest}\n href={mortgageDemandLink}\n {...getGtmLabel(gtmSendClick || gtmCommonClick)}\n disabled={loading || isEmpty}\n fullWidth\n width={buyOrDieMode ? 292 : undefined}\n dataTest='MinimalBanksMortgage-send'\n >\n {`${withoutAuth ? 'Подать' : 'Оформить'} заявку${buyOrDieMode ? ' на ипотеку' : ''}`}\n </LinkButton>\n {/*{! buyOrDieMode && (*/}\n {/* <Button*/}\n {/* dataTest='MinimalBanksMortgage-show-more'*/}\n {/* type='submit'*/}\n {/* onClick={consultModalOpen}*/}\n {/* variant='transparent'*/}\n {/* >*/}\n {/* Получить консультацию*/}\n {/* </Button>*/}\n {/*)}*/}\n </div>\n {senderState.isSendModalOpened ? <Mortgage2StarterModal\n governmentMortgage={governmentMortgage}\n withoutAuth={withoutAuth}\n locationPlacement={locationPlacement}\n gtmSendId={gtmStarterModalSendedId}\n fields={isPreferentialSelectedOffer ? [ 'rate', 'payment' ] : undefined}\n onClose={sendModalClose}\n selectedMortgageOffer={senderState.selectedMortgageOffer}\n mortgageOffers={offers}\n realtyType={realtyType}\n regionId={regionId}\n mortgageRegionId={mortgageRegionId}\n applicationId={applicationId}\n purpose={formData.purpose}\n term={formData.term}\n ownAmount={formData.ownAmount}\n propertyCost={formData.propertyCost}\n shouldVTBDiscountLogic={shouldVTBDiscountLogic}\n discounts={willNeedSendDiscountsVTB ? discountTypes : undefined}\n gtmShowData={gtmShowData}\n gtmSendData={gtmSendData}\n /> : null}\n {senderState.isConsultModalOpened ? <Mortgage2ConsultModal\n regionId={regionId}\n realtyType={realtyType}\n applicationId={applicationId}\n locationPlacement={locationPlacement}\n gtmSendData={gtmSendData}\n // always sending if VTB is present in offers (not possible to choose a bank)\n discounts={isShowAdditionalDiscounts ? discountTypes : undefined}\n onClose={consultModalClose}\n /> : null}\n {isCalcBuyOrDieModalOpened && initialBestMortgageOffer.current && (\n <MortgageBuyOrDieModal\n regionId={regionId}\n mortgagePercent={initialBestMortgageOffer.current.minimalPercent}\n roomType={roomType}\n propertyCost={propertyCost}\n onSuccess={openStupidModalByBuyOrDie}\n onClose={closeBuyOrDieModal}\n />\n )}\n {isStupidModalOpened && (\n <MortgageStupidModal\n onClose={closeStupidModal}\n applicationId={applicationId}\n gtmSendId={gtmStarterModalSendedId}\n regionId={regionId}\n locationPlacement={locationPlacement}\n isNewBuilding={isNewBuilding}\n propertyCost={propertyCost}\n realtyType={realtyType}\n isSendBuyDieAnalytics\n minimalMortgageRate={minimalMortgageRate}\n />\n )}\n </form>\n <Typography variant='secondary-alone' color='black-400' className={cn('mortgage-disclaimer')}>\n Расчёт условий не является публичной офертой. Финальные условия кредитования определяются при заключении договора\n </Typography>\n </>\n );\n});\n","import React, { useMemo } from 'react';\nimport { formatLocaleNumber, parseAndFormatNumber } from '@search/helpers/src/formatNumber';\nimport { DiscountCalcEnum, ApplicationIdEnum } from '@search/graphql-typings';\nimport { MinimalBanksMortgageOffer, MinimalBanksMortgageOfferWithDiscount } from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { useGovernmentMortgageType, governmentMinPercent } from '../useGovernmentMortgage';\n\nconst MAX_MORTGAGE_DISCOUNT = 0.3;\n\nexport const VTB_ID = '3';\nexport const maxMortgageDiscountFormatted = formatLocaleNumber(MAX_MORTGAGE_DISCOUNT);\n\nexport function useChangeDiscount({\n term,\n propertyCost,\n ownAmount,\n isMobile,\n offersFull,\n applicationId,\n showPreferential,\n withDiscount = showPreferential,\n isPreferentialNbCondition,\n isGovernmentDebtExceeds,\n isGovernmentPercentPoor,\n governmentMaxDebt\n}: {\n isMobile?: boolean;\n withDiscount?: boolean;\n term: number;\n propertyCost: number;\n ownAmount: number;\n offersFull: readonly MinimalBanksMortgageOfferWithDiscount[];\n applicationId: ApplicationIdEnum;\n isPreferentialNbCondition?: boolean;\n} & useGovernmentMortgageType) {\n // change, if default value options changed (!!!)\n const [ activeDiscountTypes, setActiveDiscountTypes ] = React.useState(\n new Set([ DiscountCalcEnum.SbrElreg ])\n );\n const debt = propertyCost - ownAmount;\n\n // block with controls - hidden\n // const prev = React.useRef({ term, debt });\n // React.useEffect(() => {\n // if (! showPreferential) return;\n // if (prev.current.term === term && prev.current.debt === debt) return;\n // prev.current = { term, debt };\n\n // // setActiveDiscountTypes(new Set()); // block with controls - hidden\n // }, [ showPreferential, term, debt ]);\n\n const discount = 0.0 +\n (activeDiscountTypes.has(DiscountCalcEnum.SbrElreg) ? 0.3 : 0) +\n (activeDiscountTypes.has(DiscountCalcEnum.SalaryProject) ? 0.3 : 0);\n\n const offers: Array<MortgageOfferDiscountifyType> = React.useMemo(\n () => {\n if (! offersFull.length) return [];\n\n const offers = offersFull\n // Убираем офферы госпрограмм\n .filter(offer => ! offer.type)\n .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }))\n .sort(mortgageOfferSort);\n\n if (! isPreferentialNbCondition) return offers;\n\n let familyOffer = offersFull\n .filter(offer => offer.type === 'FAMILY')\n .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }));\n let itOffer = offersFull\n .filter(offer => offer.type === 'IT_MORTGAGE')\n .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }));\n\n if (isGovernmentPercentPoor) {\n // @ts-ignore\n familyOffer = [ { ...emptyOffer(), type: 'FAMILY', description: `Первоначальный взнос не менее ${governmentMinPercent}%`, disabled: true } ];\n // @ts-ignore\n itOffer = [ { ...emptyOffer(), type: 'IT_MORTGAGE', description: `Первоначальный взнос не менее ${governmentMinPercent}%`, disabled: true } ];\n }\n\n if (isGovernmentDebtExceeds) {\n // @ts-ignore\n familyOffer = [ { ...emptyOffer(), type: 'FAMILY', description: `Сумма кредита превышает ${Math.floor(governmentMaxDebt / 1e6)} млн ₽`, disabled: true } ];\n // @ts-ignore\n itOffer = [ { ...emptyOffer(), type: 'IT_MORTGAGE', description: `Сумма кредита превышает ${Math.floor(governmentMaxDebt / 1e6)} млн ₽`, disabled: true } ];\n }\n\n return [\n familyOffer[0],\n itOffer[0],\n ...offers\n ].filter(Boolean);\n },\n [ offersFull, discount, debt, term, governmentMaxDebt, isMobile, isGovernmentDebtExceeds, isGovernmentPercentPoor ]\n );\n\n // views discount only VTB if it is selected/best offer\n const shouldVTBDiscountLogic = (\n applicationId === ApplicationIdEnum.ClassifiedDesktop ||\n applicationId === ApplicationIdEnum.ClassifiedTouch\n );\n\n // views VTB discount options block\n const isShowAdditionalDiscounts = useMemo(() => {\n return ! showPreferential && shouldVTBDiscountLogic && offersFull.some(offer => offer.bankId === VTB_ID);\n }, [ shouldVTBDiscountLogic, showPreferential, offersFull ]);\n\n const onChangeDiscount = React.useCallback((enabled: boolean, discountType: DiscountCalcEnum) => {\n setActiveDiscountTypes(() => {\n if (enabled) return new Set([ discountType ]);\n return new Set();\n });\n }, [ ]);\n\n return {\n offers,\n discount,\n onChangeDiscount,\n shouldVTBDiscountLogic,\n isShowAdditionalDiscounts,\n discountTypes: Array.from(activeDiscountTypes)\n };\n}\n\nfunction emptyOffer() {\n return {\n minimalPaymentDiscount: undefined,\n minimalPaymentDiscountFormatted: undefined,\n minimalPercentDiscount: undefined,\n minimalPercentDiscountFormatted: undefined,\n bankId: '',\n description: '',\n disabled: true,\n icon: null,\n minimalPayment: null,\n minimalPaymentFormatted: null,\n minimalPercent: null,\n minimalPercentFormatted: null,\n name: null,\n type: undefined as undefined | string,\n };\n}\n\nfunction calculatePayment({ percent, term, debt }: {\n percent: number;\n term: number;\n debt: number;\n}) {\n const monthPercent = percent / (100 * 12);\n const denominator = (1 - Math.pow(1 + monthPercent, (-1) * term * 12));\n\n return Math.floor((monthPercent * debt) / denominator);\n}\n\nexport type MortgageOfferDiscountifyType = MinimalBanksMortgageOfferWithDiscount & { description?: string };\n\nfunction mortgageOfferDiscountify({ offer, discount, debt, term }: {\n debt: number;\n term: number;\n offer: MinimalBanksMortgageOffer;\n discount: number;\n}): MortgageOfferDiscountifyType {\n // ВТБ присылает нам процент с учётом ВСЕХ скидок,\n // поэтому в зачеркнутой цене нам нужно показывать без них\n const minimalPercent = offer.bankId === VTB_ID && ! offer.type ?\n Number(((offer.minimalPercent ?? 10) + MAX_MORTGAGE_DISCOUNT).toFixed(2)) : undefined;\n\n // минимальный процент от банка, меняющийся в зависимости от выбранных скидок\n const discountPercent = minimalPercent === undefined ? undefined : minimalPercent - discount;\n\n const minimalPercentFormatted = minimalPercent === undefined ? undefined :\n `${formatLocaleNumber(minimalPercent, 1)}%`;\n\n const minimalPercentDiscount = discountPercent === undefined ? undefined : Number(discountPercent.toFixed(1));\n const minimalPercentDiscountFormatted = minimalPercentDiscount === undefined ?\n undefined :\n `${formatLocaleNumber(minimalPercentDiscount)}%`;\n\n const minimalPaymentDiscount = discountPercent === undefined ? undefined :\n calculatePayment({ percent: discountPercent, term, debt });\n\n const minimalPaymentDiscountFormatted = minimalPaymentDiscount === undefined ? undefined :\n `${parseAndFormatNumber(minimalPaymentDiscount)} ₽/мес.`;\n\n return {\n ...offer,\n disabled: false,\n description: '',\n minimalPercent: minimalPercent ?? offer.minimalPercent,\n minimalPercentFormatted: minimalPercentFormatted ?? offer.minimalPercentFormatted,\n minimalPercentDiscount,\n minimalPercentDiscountFormatted,\n minimalPaymentDiscount,\n minimalPaymentDiscountFormatted\n };\n}\n\nfunction mortgageOfferSort(\n a: MortgageOfferDiscountifyType,\n b: MortgageOfferDiscountifyType\n) {\n if (a.type && ! b.type) return -1;\n if (! a.type && b.type) return 1;\n\n if (a.minimalPercentDiscount) return a.minimalPercentDiscount - (b.minimalPercent ?? 1);\n if (b.minimalPercentDiscount) return (a.minimalPercent ?? 1) - b.minimalPercentDiscount;\n\n // family mortgage always first\n if (a.type === 'FAMILY' || b.type === 'FAMILY') return 1;\n\n return (a.minimalPercent ?? 1) - (b.minimalPercent ?? 1);\n}\n","export function getLocalStorageLastValue(key: string) {\n const lastValueStr = localStorage?.getItem(key);\n const lastValue = typeof lastValueStr === 'string' ? Number(lastValueStr) : undefined;\n\n return lastValue ?? 0;\n}\n","import './MortgageFieldsBuilder.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageFieldsBuilder');\n\nexport function MortgageFieldsBuilder({\n isMobile,\n gridFields,\n contactFields,\n actions,\n prefixNodes\n} : {\n isMobile?: boolean;\n gridFields?: React.ReactNode;\n contactFields?: React.ReactNode;\n actions?: React.ReactNode;\n prefixNodes?: React.ReactNode;\n}) {\n return (<>\n <div className={cn('grid-main', { isMobile })}>\n {prefixNodes}\n <div className={cn('grid-fields', { isMobile })}>\n {gridFields}\n </div>\n <div className={cn('grid-contacts')}>\n {contactFields}\n </div>\n <div className={cn('grid-actions')}>\n {actions}\n </div>\n </div>\n {isMobile ? <> <br /><br /><br /></> : null}\n </>);\n}\n","import './MortgageStupidModal.css';\n\nimport React, { useMemo } from 'react';\nimport { Modal, Input, PhoneInput, Button, Typography } from '@vtblife/uikit';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport { formatLocaleNumber } from '@search/helpers/src/formatNumber';\nimport { defaultMortgageRateNbFormatted, defaultMortgageRateSecondFormatted } from '../contants';\n\nimport { Mortgage2SuccessContent } from '../mortgage2/success/Mortgage2SuccessContent';\nimport { MortgageGovernmentDisclaimer } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { calculateOwnAmount } from '../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { MortgageFieldsBuilder } from '../domain/MortgageFieldsBuilder';\nimport { MortgageField } from '../domain/MortgageField';\nimport Image from '../../Image';\nimport { useGovernmentMortgage } from '../useGovernmentMortgage';\n\nimport bankLogos from './bankLogos.url.svg';\nimport { MortgageStupidProps, useStupidMortgage } from './useStupidMortgage';\n\nexport function MortgageStupidModal(props: MortgageStupidProps & {\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n propertyCost?: number;\n rate?: number;\n renderCustomFirstGrid?: React.ReactNode;\n}) {\n const {\n isMobile,\n onClose,\n isNewBuilding,\n propertyCost,\n rate,\n renderCustomFirstGrid,\n minimalMortgageRate\n } = props;\n\n const prices = useMemo(() => {\n if (! propertyCost) return;\n\n const propertyCostFormatted = formatPrice({\n value: propertyCost * 100,\n currency: Currency.RUB,\n displayCurrency: true\n });\n let ownAmount = calculateOwnAmount(propertyCost, isNewBuilding ? 0.15 : 0.1);\n\n if (rate) ownAmount = calculateOwnAmount(propertyCost, rate);\n\n const ownAmountFormatted = formatPrice({\n value: ownAmount * 100,\n currency: Currency.RUB,\n displayCurrency: true\n });\n\n return {\n propertyCostFormatted,\n ownAmountFormatted,\n ownAmount\n };\n }, [ propertyCost, isNewBuilding ]);\n\n const governmentMortgage = useGovernmentMortgage({\n propertyCost,\n ownAmount: prices?.ownAmount,\n regionId: props.regionId,\n isPreferentialNbCondition: isNewBuilding\n });\n const {\n sendQueryOnEnter,\n sendQuery,\n\n isFormSended,\n isFormSyncing,\n nameInputValid,\n name,\n setName,\n setNameTouched,\n phoneInputValid,\n setPhone,\n phone,\n setPhoneTouched,\n loading\n } = useStupidMortgage({\n ...props,\n ...governmentMortgage\n });\n // not important all conditions government mortgage\n const title = governmentMortgage.isPreferentialNbCondition ? 'Ипотека с\\u00A0господдержкой на\\u00A0М2' : 'Выгодная ипотека с\\u00A0М2';\n const subtitle = 'Заполните единую анкету, выберите подходящую программу и\\u00A0получите одобрение от\\u00A0лучших банков';\n\n const staticPath = useStaticPathConfig();\n\n const [ isModalGovernmentOpened, setIsModalGovernmentOpened ] = React.useState(false);\n\n if (isModalGovernmentOpened) {\n return (<MortgageGovernmentDisclaimerModal\n isMobile={isMobile}\n onSuccess={() => setIsModalGovernmentOpened(false)}\n onClose={() => setIsModalGovernmentOpened(false)}\n />);\n }\n\n return (<Modal\n opened\n onClose={onClose}\n mobile={isMobile}\n swipeToClose={! isMobile}\n >\n {isFormSended ? (\n <Mortgage2SuccessContent\n title='Заявка принята'\n isMobile={isMobile}\n />\n ) : (<>\n {isMobile ? (\n <Modal.Header>Заявка на ипотеку</Modal.Header>\n ) : (\n <Modal.Title>{title}</Modal.Title>\n )}\n <Modal.Content scrollable={isMobile}>\n <MortgageFieldsBuilder\n isMobile={isMobile}\n prefixNodes={<>\n {isMobile && (\n <Typography variant='h3'>{title}</Typography>\n )}\n {subtitle && (\n <Typography>{subtitle}</Typography>\n )}\n </>}\n gridFields={<>\n {renderCustomFirstGrid ?? (\n <MortgageField\n titleProps={{ accent: true, variant: 'h3' }}\n title={`от ${formatLocaleNumber(minimalMortgageRate) || (isNewBuilding ? defaultMortgageRateNbFormatted : defaultMortgageRateSecondFormatted)}%`}\n children={(\n // not important all conditions government mortgage\n governmentMortgage.isPreferentialNbCondition ?\n <MortgageGovernmentDisclaimer\n isAccent\n isImportant\n splitOnRows\n isMobile={isMobile}\n descriptionText={<><Typography tag='span' color='secondary'>по </Typography>льготным программам</>}\n mainText='минимальная ставка'\n onClick={() => setIsModalGovernmentOpened(true)}\n /> :\n <>ставка по ипотеке <br />на вторичку</>\n )}\n />\n )}\n <MortgageField\n titleProps={{ resetFont: true }}\n title={<Image\n height={52}\n loading='lazy'\n alt='логотипы банков'\n url={`${staticPath}${bankLogos}`}\n />}\n children='более 20 банков на выбор'\n />\n {prices ? (<>\n <MortgageField\n title={prices.propertyCostFormatted}\n children='стоимость квартиры'\n />\n <MortgageField\n title={prices.ownAmountFormatted}\n children='первоначальный взнос'\n />\n </>) : null}\n </>}\n contactFields={<>\n <Input\n dataTest='mortgage-set-name'\n label='Как вас зовут'\n placeholder='Имя'\n size='l'\n onBlur={setNameTouched}\n onKeyPress={sendQueryOnEnter}\n error={nameInputValid === false}\n onChange={setName}\n value={name}\n disabled={isFormSyncing}\n />\n <PhoneInput\n dataTest='mortgage-set-phone'\n label='Телефон'\n size='l'\n inputMode='numeric'\n onBlur={setPhoneTouched}\n onKeyPress={sendQueryOnEnter}\n error={phoneInputValid === false}\n onChange={setPhone}\n value={phone || undefined}\n disabled={isFormSyncing}\n />\n </>}\n actions={\n <Button\n fullWidth\n size={isMobile ? 'm' : 'l'}\n disabled={isFormSyncing || loading}\n dataTest='mortgage-send-query'\n variant='accent'\n onClick={sendQuery}\n >\n Подать заявку\n </Button>\n }\n />\n </Modal.Content>\n </>)}\n </Modal>);\n}\n","import './MortgageStupidBanner.css';\n\nimport React from 'react';\n\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { ApplicationIdEnum } from '@search/graphql-typings/src';\n\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from '../mortgage2/mortgage2ContactsFormSend';\nimport { useMortgage2UserForm } from '../mortgage2/useMortgage2User';\nimport { SeoSearchUtm } from '../../../../../domain/seo/SeoSearchUtm';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { useGtmOnVisible } from '../../../../../domain/google/useGtmOnVisible';\n\nexport type MortgageStupidProps = {\n gtmSendId?: string;\n gtmShowId?: string;\n regionId?: number;\n mortgageRegionId?: number;\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n isNewBuilding: boolean;\n showPreferential?: boolean;\n isPreferentialNbCondition?: boolean;\n isMobile?: boolean;\n applicationId?: ApplicationIdEnum;\n isSendBuyDieAnalytics?: boolean;\n minimalMortgageRate?: number | null;\n} & Mortgage2ContactsFormSendProps;\n\nexport const useStupidMortgage = ({\n gtmSendId,\n gtmShowId,\n regionId,\n mortgageRegionId,\n showPreferential,\n isMobile,\n applicationId,\n locationPlacement,\n realtyType,\n offerUrl,\n isSendBuyDieAnalytics,\n gtmSendData\n}: MortgageStupidProps) => {\n const userInfoLoad = useUserDetailsLoader();\n const userDetails = userInfoLoad({});\n\n const {\n isFormSended,\n isFormSyncing,\n setFormAllTouched,\n setFormSended,\n setFormIsSending,\n\n name,\n isNameValid,\n isNameRequired,\n nameInputValid,\n setName,\n setNameTouched,\n\n phone,\n isPhoneValid,\n phoneInputValid,\n setPhone,\n setPhoneTouched\n } = useMortgage2UserForm({ userDetails: userDetails.data?.userProfile.person });\n\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n e?.stopPropagation();\n e?.preventDefault();\n\n // RS-3869 remove - ! isMobile &&\n if (! isPhoneValid || (isNameRequired && ! isNameValid)) {\n setFormAllTouched();\n return;\n }\n\n setFormIsSending();\n\n const utm = SeoSearchUtm.get();\n\n mortgage2ContactsFormSend({\n realtyType: getRealtyObjectTypeGql(realtyType),\n name,\n utm: utm ? { list: utm } : undefined,\n phone,\n regionId: mortgageRegionId ?? regionId,\n applicationId,\n locationPlacement,\n link: normalizeCallbackUrl(offerUrl),\n subject: `Заявка на ипотеку с${showPreferential ? ' гос. поддержкой с' : ''} “${\n getSubjectAppName(applicationId)}”`,\n })\n .then(() => {\n setFormSended();\n gtmSendId && dataLayerPush({ event: gtmSendId });\n gtmSendData && dataLayerPush(gtmSendData);\n if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n dataLayerPush({ event: 'up_ib_send_form' });\n }\n if (isSendBuyDieAnalytics) {\n dataLayerPush({\n event: 'up_action',\n theme: 'ipoteka',\n page_type: 'card',\n type: 'buy_or_save_req'\n });\n }\n }).catch(error => {\n // eslint-disable-next-line no-console\n console.error(error);\n setFormSended(error);\n });\n }, [\n showPreferential,\n isPhoneValid,\n isNameValid,\n isNameRequired,\n setFormIsSending,\n realtyType,\n name,\n phone,\n mortgageRegionId,\n regionId,\n applicationId,\n locationPlacement,\n offerUrl,\n setFormAllTouched,\n setFormSended,\n gtmSendId,\n dataLayerPush,\n isMobile,\n isSendBuyDieAnalytics\n ]);\n const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter') {\n return;\n }\n\n sendQuery(e);\n }, [ sendQuery ]);\n\n const onVisible = React.useCallback(() => {\n if (! gtmShowId) return;\n dataLayerPush({ event: gtmShowId });\n }, [ gtmShowId, dataLayerPush ]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n useGtmOnVisible({ containerRef, onVisible });\n\n return {\n containerRef,\n sendQueryOnEnter,\n sendQuery,\n\n isFormSended,\n isFormSyncing,\n nameInputValid,\n setName,\n setNameTouched,\n phoneInputValid,\n setPhone,\n setPhoneTouched,\n name,\n phone,\n loading: userDetails.loading\n };\n};\n","import { useMemo } from 'react';\n\ntype UseGovernmentMortgage = {\n regionId?: number;\n propertyCost?: number;\n isPreferentialNbCondition?: boolean;\n ownAmount?: number;\n}\n\nexport const governmentMinPercent = 15;\nexport type useGovernmentMortgageType = ReturnType<typeof getGovernmentMortgage>;\n\nexport function getGovernmentMortgage({\n regionId,\n propertyCost,\n isPreferentialNbCondition,\n ownAmount,\n}: UseGovernmentMortgage) {\n let governmentMaxDebt = 6e6;\n\n // backoffice regionId: is msk, spb, msk obl, len obl\n if ((regionId && [ 3, 1, 4, 2 ].includes(regionId))) {\n governmentMaxDebt = 12e6;\n }\n\n if (! propertyCost || ! ownAmount) {\n return {\n isPreferentialNbCondition,\n governmentMaxDebt,\n isGovernmentDebtExceeds: true,\n isGovernmentPercentPoor: true,\n // when offer base - absent (example, banners in SERP), focus on isPreferentialNbCondition(isNewBuilding)\n showPreferential: isPreferentialNbCondition,\n };\n }\n\n const debt = propertyCost - ownAmount;\n const percent = propertyCost ? Math.floor(100 * ownAmount / propertyCost) : 0;\n const isGovernmentDebtExceeds = debt >= governmentMaxDebt;\n const isGovernmentPercentPoor = percent < governmentMinPercent;\n const showPreferential = Boolean(isPreferentialNbCondition && ! isGovernmentDebtExceeds && ! isGovernmentPercentPoor);\n\n return {\n showPreferential,\n isPreferentialNbCondition,\n isGovernmentDebtExceeds,\n isGovernmentPercentPoor,\n governmentMaxDebt\n };\n}\n\nexport function useGovernmentMortgage({\n regionId,\n propertyCost,\n isPreferentialNbCondition,\n ownAmount,\n}: UseGovernmentMortgage) {\n return useMemo(() => getGovernmentMortgage({\n regionId,\n propertyCost,\n isPreferentialNbCondition,\n ownAmount,\n }), [\n regionId,\n propertyCost,\n isPreferentialNbCondition,\n ownAmount\n ]);\n}\n","import { MortgagePurpose } from '@search/graphql-typings';\n\nimport { formatLocaleNumber, formatNumber } from '@search/helpers/src/formatNumber';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { calculateOwnAmount } from './MinimalBanksMortgageFields/useBankMortgageForm';\nimport {\n MinimalBanksMortgageOffersQueryVariables, useMinimalBanksMortgageOffersLoader\n} from './MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { minimalBanksMortgageUrlCreate } from './minimalBanksMortgageUrl';\nimport { mortgage2BestOfferFromOffers } from './mortgage2/useMortgage2BestOffer';\n\nexport type UseMinimalBanksMortgageStateParams = {\n mortgageRegionId: number;\n propertyCost: number;\n isNewBuilding: boolean;\n term?: number;\n percent?: number;\n}\n\nexport function minimalBanksMortgageParamsFromOffer({\n mortgageRegionId,\n propertyCost,\n isNewBuilding,\n term = 20,\n percent\n}: UseMinimalBanksMortgageStateParams): MinimalBanksMortgageOffersQueryVariables {\n const ownAmount = calculateOwnAmount(propertyCost, percent);\n const purpose = isNewBuilding ? MortgagePurpose.Primary : MortgagePurpose.Secondary;\n\n return {\n purpose,\n ownAmount,\n regionId: mortgageRegionId,\n term,\n propertyCost\n };\n}\n\nexport function getMinimalBanksMortgageEconomyPercent() {\n const economy = 0.3;\n\n const MAX_ECONOMY = 0.3;\n\n return {\n economy,\n MAX_ECONOMY,\n economyFormatted: `${formatLocaleNumber(economy)}%`,\n maxEconomyFormatted: `${formatLocaleNumber(MAX_ECONOMY)}%`\n };\n}\n\nexport function useMinimalBanksMortgageEconomy(variables: Partial<\n MinimalBanksMortgageOffersQueryVariables & { from?: string }\n>) {\n const { auth } = useM2AuthContext();\n const { baseUrl, fullUrl } =\n minimalBanksMortgageUrlCreate({ isAuthenticated: auth.isAuthenticated, ...variables });\n\n const { economyFormatted, economy } = getMinimalBanksMortgageEconomyPercent();\n\n return {\n formUrl: baseUrl,\n url: fullUrl,\n economy,\n economyFormatted\n };\n}\n\nexport function useMinimalBanksMortgageOverall(variables: MinimalBanksMortgageOffersQueryVariables) {\n const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n const data = minimalBanksMortgageOffersLoad(variables);\n const minimalBanksMortgageOffers = data.data?.minimalBanksMortgageOffers;\n const bestMortgageOffer = mortgage2BestOfferFromOffers(minimalBanksMortgageOffers);\n\n const allMinimalPayment = minimalBanksMortgageOffers?.reduce((min, offer) => {\n const value = offer?.minimalPayment ?? min;\n\n return min > value ? value : min;\n }, variables.propertyCost);\n\n return {\n ...useMinimalBanksMortgageEconomy(variables),\n bestMortgageOffer,\n allMinimalPayment,\n allMinimalPaymentFormatted: allMinimalPayment ?\n `${formatNumber(Math.round(allMinimalPayment))}\\u00A0₽/мес.` :\n undefined,\n isLoading: Boolean(data.loading),\n minimalBanksMortgageOffers\n };\n}\n","import React from 'react';\n\nexport const IconBus = ({\n color = '#B6B9C9'\n}: {\n color?: string;\n}) => (\n <svg width='16' height='16' viewBox='0 0 16 16' fill={color} xmlns='http://www.w3.org/2000/svg'>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M14.4305 9.23685C14.4338 9.31745 14.4366 9.39787 14.4393 9.47847L14.4988 11.3131C14.5167 11.8656 14.3374 12.4028 14 12.8335V14.5C14 14.7761 13.7761 15 13.5 15H12C11.7239 15 11.5 14.7761 11.5 14.5V13.7317H4.5V14.5C4.5 14.7761 4.27614 15 4 15H2.5C2.22386 15 2 14.7761 2 14.5V12.834C1.66271 12.4034 1.48334 11.8664 1.50122 11.314L1.56073 9.47999C1.56339 9.39863 1.56624 9.31726 1.56947 9.2359L1.84971 2.10128C1.93983 1.46932 2.47996 1 3.11686 1H12.8833C13.5202 1 14.0604 1.46932 14.1505 2.10128L14.4305 9.23685ZM2.63167 10.9097C2.63167 11.5152 3.12123 12.0061 3.72544 12.0061C4.32964 12.0061 4.81939 11.5152 4.81939 10.9097C4.81939 10.3041 4.32964 9.81364 3.72544 9.81364C3.12123 9.81364 2.63167 10.3041 2.63167 10.9097ZM11.1806 10.9097C11.1806 11.5152 11.6705 12.0061 12.2746 12.0061C12.8788 12.0061 13.3683 11.5152 13.3683 10.9097C13.3683 10.3041 12.8788 9.81364 12.2746 9.81364C11.6705 9.81364 11.1806 10.3041 11.1806 10.9097ZM3.24462 8.61528C6.26696 9.11814 9.45127 9.07774 12.7394 8.59775C13.1337 8.54021 13.4233 8.1955 13.4115 7.7963C13.3712 6.43979 13.2991 3.57755 13.2991 3.57755C13.2647 3.33175 13.0546 3.14634 12.8107 3.14634C11.4481 2.88167 4.67718 2.90225 3.18968 3.14634C2.94575 3.14634 2.73567 3.33175 2.70126 3.57774C2.70126 3.57774 2.62844 6.46599 2.58794 7.81593C2.57616 8.21018 2.8564 8.55069 3.24462 8.61528ZM7 1.5C6.72386 1.5 6.5 1.72386 6.5 2C6.5 2.27614 6.72386 2.5 7 2.5H9C9.27614 2.5 9.5 2.27614 9.5 2C9.5 1.72386 9.27614 1.5 9 1.5H7Z'\n />\n </svg>\n);\n","import React from 'react';\n\nexport const IconPedestrian = ({\n color = '#B6B9C9'\n}: {\n color?: string;\n}) => (\n <svg width='16' height='16' viewBox='0 0 16 16' fill={color} xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M5.76127 11.1185L6.93706 12.9845L6.03002 15.4335C5.89565 15.7834 5.55971 16 5.20697 16C5.10619 16 5.00541 15.9833 4.90463 15.95C4.45111 15.7834 4.21595 15.2836 4.38392 14.8338L5.76127 11.1185Z'\n />\n <path\n d='M3.14088 6.82011L4.1151 5.40397C4.38385 5.02078 4.77018 4.7209 5.20691 4.55429C6.98739 3.87121 7.22254 3.88787 7.39051 3.88787L8.65029 3.97118C9.00302 3.98784 9.27177 4.0878 10.5987 5.75384C10.7163 5.90379 10.8843 6.00375 11.0858 6.05373L12.396 6.33696C12.8159 6.42026 13.0679 6.82011 12.9839 7.23662C12.8999 7.65313 12.48 7.90304 12.0769 7.81973L10.7667 7.53651C10.2292 7.41988 9.75889 7.12 9.40615 6.70349C9.35576 6.63684 9.30537 6.5702 9.25498 6.52022L8.0456 10.0189L10.9683 14.6672C11.2202 15.0837 11.1026 15.6168 10.6827 15.8667C10.5315 15.95 10.3804 16 10.2124 16C9.91006 16 9.62451 15.8501 9.47334 15.5835L5.84519 9.80232C5.47566 9.21921 5.37488 8.48615 5.55964 7.81973L6.14754 5.82048C6.02996 5.87046 5.89558 5.92045 5.74441 5.97043C5.59324 6.03707 5.45886 6.13703 5.35808 6.27031L4.38385 7.68645C4.23268 7.90304 3.99752 8.01966 3.76237 8.01966C3.61119 8.01966 3.46002 7.96968 3.32564 7.88637C2.9897 7.63647 2.88892 7.16998 3.14088 6.82011Z'\n />\n <path\n d='M8.10214 3.48958C7.13352 3.38501 6.43377 2.5214 6.5392 1.56066C6.64462 0.599919 7.51531 -0.094146 8.48392 0.0104232C9.45254 0.114992 10.1523 0.978597 10.0469 1.93934C9.94144 2.90008 9.07076 3.59415 8.10214 3.48958Z'\n />\n </svg>\n);\n","export function getWindowSize() {\n return {\n top: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n left: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nexport function getElementSize($element: HTMLElement) {\n const { top, right, bottom, left } = $element.getBoundingClientRect();\n\n return {\n top,\n right,\n bottom,\n left,\n width: right - left,\n height: bottom - top,\n };\n}\n","import React, { ReactElement, RefObject } from 'react';\nimport QRCode from 'react-qr-code';\nimport { Dropdown, Button, ButtonProps, useDropdownHover } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport CustomTypography from '@search/vtbeco-frontend-core/domain/newbuilding/components/common/CustomTypography';\n\nimport './styles.css';\n\ntype QRPhoneButtonPropsType = ButtonProps & {\n qrCodeValue?: string;\n className?: string;\n qrFgColor?: string;\n renderButton?: ReactElement | null;\n href?: string;\n buttonVariant?: 'primary' | 'secondary';\n dropdownContainer?: RefObject<HTMLElement>;\n}\n\nconst cn = classname.bind(null, 'QRCodePhoneButton');\nconst DROPDOWN_OPENING_DELAY = 250;\n\nconst QRCodeTrigger: React.FC<{ qrCodeValue: string; qrFgColor?: string }> = ({ qrFgColor, qrCodeValue }) => {\n const { control } = useDropdownHover({ open: DROPDOWN_OPENING_DELAY });\n\n return (\n <div\n ref={control as RefObject<HTMLDivElement>}\n className={cn('trigger')}\n >\n <QRCode\n value={qrCodeValue}\n fgColor={qrFgColor}\n size={52}\n />\n </div>\n );\n};\n\nexport const QRCodePhoneButton: React.FunctionComponent<QRPhoneButtonPropsType> = ({\n qrCodeValue,\n className,\n qrFgColor = '#221F2E',\n children,\n href,\n renderButton,\n fullWidth = true,\n buttonVariant,\n dropdownContainer,\n ...buttonProps\n}) => {\n return (\n <div className={cn(null, undefined, className)}>\n {renderButton ?? (\n <a className={cn('link', { fullWidth })} href={href}>\n <Button\n variant={buttonVariant}\n fullWidth={fullWidth}\n {...buttonProps}\n >\n {children}\n </Button>\n </a>\n )}\n {\n qrCodeValue ? (\n <Dropdown>\n <QRCodeTrigger\n qrCodeValue={qrCodeValue}\n qrFgColor={qrFgColor}\n />\n <Dropdown.Content container={dropdownContainer}>\n <div className={cn('qrCodePopup')}>\n <CustomTypography\n level='secondary-alone'\n className={cn('qrCodePopupText')}\n >\n Наведите камеру телефона на код, чтобы быстро набрать номер\n </CustomTypography>\n <QRCode\n value={qrCodeValue}\n fgColor={qrFgColor}\n size={240}\n />\n </div>\n </Dropdown.Content>\n </Dropdown>\n ) : null\n }\n </div>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { Button } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\n\nimport { useSwiper } from '@search/vtbeco-frontend-core/view/common/hooks/useSwiper';\n\nimport './styles.css';\n\ntype Direction = 'left' | 'right';\n\nconst cn = classname.bind(null, 'Slider');\nconst SCREEN_XL = 1420;\n\nconst Slider = ({\n children,\n totalItems,\n onIndexChange,\n contentClassName,\n navClassName,\n isNavHidden = false,\n onSetMaxItems\n}: {\n children: React.ReactNode[];\n totalItems?: number;\n onIndexChange?: (pageNumber: number) => void;\n contentClassName?: string;\n navClassName?: string;\n isNavHidden?: boolean;\n onSetMaxItems?: (maxItems: number) => void;\n}) => {\n const [ index, setIndex ] = useState<number>(0);\n const [ maxItems, setMaxItems ] = useState<number>(3);\n\n const slidesTotal = useMemo(() => totalItems ?? children.length, [ children, totalItems ]);\n const maxIndex = useMemo(() => slidesTotal - maxItems, [ slidesTotal, maxItems ]);\n\n const handleSetMaxItems = useCallback((value: number) => {\n setMaxItems(value);\n onSetMaxItems?.(value);\n }, [ onSetMaxItems ]);\n\n const handleResize = useCallback(() => {\n const { clientWidth } = document.documentElement;\n\n if (clientWidth >= SCREEN_XL && maxItems !== 4) {\n handleSetMaxItems(4);\n } else if (clientWidth < SCREEN_XL && maxItems !== 3) {\n handleSetMaxItems(3);\n }\n\n if (index > maxIndex) {\n setIndex(maxIndex);\n }\n }, [ index, maxIndex, maxItems, handleSetMaxItems ]);\n\n useEffect(() => {\n const throttledHandleResize = throttle(handleResize, 200);\n\n throttledHandleResize();\n\n window.addEventListener('resize', throttledHandleResize);\n\n return () => {\n window.removeEventListener('resize', throttledHandleResize);\n };\n }, [ handleResize ]);\n\n const handleShift = useCallback((direction: Direction) => {\n const newIndex = Math.max(\n Math.min(\n index + (direction === 'left' ? -maxItems : maxItems),\n maxIndex\n ),\n 0\n );\n\n setIndex(newIndex);\n onIndexChange && onIndexChange(newIndex);\n }, [ index, maxIndex, maxItems, onIndexChange ]);\n\n const onSwipeLeft = useCallback(() => handleShift('right'), [ handleShift ]);\n const onSwipeRight = useCallback(() => handleShift('left'), [ handleShift ]);\n\n const {\n handleTouchEnd,\n handleTouchMove,\n handleTouchStart\n } = useSwiper({\n onSwipeLeft,\n onSwipeRight\n });\n\n return (\n <div className={cn()}>\n {\n slidesTotal > maxItems && ! isNavHidden ? (\n <div className={cn('nav', undefined, navClassName)}>\n {\n [\n 'left' as Direction,\n 'right' as Direction\n ].map(direction => (\n <div key={direction}>\n <Button\n size='s'\n variant='secondary'\n icon={`chevron-${direction}`}\n disabled={\n direction === 'left' && index === 0 ||\n direction === 'right' && index === maxIndex\n }\n onClick={() => handleShift(direction)}\n />\n </div>\n ))\n }\n </div>\n ) : null\n }\n <div\n className={cn('contentWrapper')}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onTouchStart={handleTouchStart}\n >\n <div\n className={cn('content', undefined, contentClassName)}\n style={{\n transform: `translateX(-${index * 100 / maxItems}%)`\n }}\n >\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Slider;\n","import React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Select, Dropdown, useMultipleSelect } from '@vtblife/uikit';\nimport { DropdownContentProps, DropdownControlProps } from '@vtblife/uikit/dist/components/dropdown/types';\n\ntype UikitSlimMultiSelectProps<T extends string | number> =\n Pick<DropdownContentProps, 'height' | 'adaptiveHeight' | 'adaptivePlacement' | 'dataTest' | 'placement'> &\n Pick<DropdownControlProps, 'size' | 'disabled'> &\n {\n onChange: (value: T[]) => void;\n options: { value: T; label: string; disabled?: boolean }[];\n value?: T[];\n placeholder: string;\n\n forcePlaceholder?: boolean;\n }\n\nexport const SlimMultiSelect = <T extends number | string>({\n value,\n onChange,\n options,\n placeholder,\n forcePlaceholder,\n\n disabled,\n size,\n\n height,\n adaptiveHeight,\n adaptivePlacement,\n placement = 'local',\n dataTest,\n}: UikitSlimMultiSelectProps<T>) => {\n const { is, handleChange, selectedText } = useMultipleSelect<T>(\n (v: T[]) => onChange(v),\n {\n texts: options.map(el => ({ ...el, text: el.label })),\n selected: value\n }\n );\n const title = (forcePlaceholder || ! selectedText.length) ? placeholder : capitalize(selectedText);\n\n return (<div>\n <Select\n onChange={handleChange}\n dataTest={dataTest}\n mode='multiple'\n >\n <Dropdown.Control\n disabled={disabled}\n arrow\n size={size}\n dataTest={dataTest && (dataTest + '-trigger')}\n >{title}</Dropdown.Control>\n <Select.Content\n height={height}\n adaptiveHeight={adaptiveHeight}\n adaptivePlacement={adaptivePlacement}\n placement={placement}\n >\n {options.map((item, key) => (\n <Select.Option\n value={item.value}\n key={key}\n selected={is(item.value)}\n disabled={item.disabled}\n >\n {item.label}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n </div>);\n};\n","import React from 'react';\nimport { Select, Dropdown, useSelect } from '@vtblife/uikit';\nimport { DropdownContentProps, DropdownControlProps } from '@vtblife/uikit/dist/components/dropdown/types';\n\ntype SlimSelectProps<T extends string | number> =\n Pick<DropdownContentProps, 'height' | 'adaptiveHeight' | 'adaptivePlacement' | 'dataTest' | 'placement'> &\n Pick<DropdownControlProps, 'size' | 'disabled'> &\n {\n onChange: (value: T) => void;\n options: { value: T; label: string; disabled?: boolean }[];\n value?: T;\n placeholder?: string;\n\n forcePlaceholder?: boolean;\n }\n\nexport const SlimSelect = <T extends number | string>({\n value,\n onChange,\n options,\n placeholder,\n forcePlaceholder,\n\n disabled,\n size,\n\n height,\n adaptiveHeight,\n adaptivePlacement,\n placement = 'local',\n dataTest,\n}: SlimSelectProps<T>) => {\n const { is, handleChange, selectedText } = useSelect<T>(\n (v: T) => onChange(v),\n {\n texts: options.map(el => ({ ...el, text: el.label })),\n selected: value\n }\n );\n const title = forcePlaceholder || ! selectedText.length ? placeholder : selectedText;\n\n return (<div>\n <Select\n onChange={handleChange}\n dataTest={dataTest}\n >\n <Dropdown.Control\n disabled={disabled}\n arrow\n size={size}\n dataTest={dataTest && (dataTest + '-trigger')}\n >{title}</Dropdown.Control>\n <Select.Content\n height={height}\n adaptiveHeight={adaptiveHeight}\n adaptivePlacement={adaptivePlacement}\n placement={placement}\n >\n {options.map((item, key) => (\n <Select.Option\n value={item.value}\n key={key}\n selected={is(item.value)}\n disabled={item.disabled}\n >\n {item.label}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n </div>);\n};\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { TypographyProps } from '@vtblife/uikit/dist/components/typography/types';\n\nimport classname from '@search/classname/src';\n\nimport { MetroStationBase } from '../../../../../domain/geo/MetroStation';\n\nimport './styles.css';\n\nconst cnSubwayStationMark = classname.bind(null, 'SubwayStationMark');\n\nexport const SubwayStationMark: React.FunctionComponent<{\n className?: string;\n colors: readonly string[];\n}> = ({ colors, className }) => {\n return (\n <span className={cnSubwayStationMark(null, {}, className)}>\n {\n colors.slice(0).reverse().map((color, index) => (\n <span\n key={index}\n style={{ backgroundColor: color }}\n className={cnSubwayStationMark('line', { type: 'mark' })}\n />\n ))\n }\n </span>\n );\n};\n\nconst cnSubwayStation = classname.bind(null, 'SubwayStation');\n\nexport const SubwayStation: React.FunctionComponent<{\n textVariant?: TypographyProps['variant'];\n textColor?: TypographyProps['color'];\n textBold?: TypographyProps['bold'];\n className?: string;\n station: MetroStationBase;\n url?: string;\n noClickable?: boolean;\n}> = React.memo(({ noClickable, station, className, textVariant, textColor, textBold, url, children }) => {\n return (\n <span className={cnSubwayStation(null, undefined, className)}>\n <SubwayStationMark\n colors={station.allRoutesColorsList}\n />\n <Typography\n tag='span'\n variant={textVariant}\n color='primary'\n className={cnSubwayStation('title')}\n bold={textBold}\n >\n {\n (url !== undefined) ? (\n <a\n href={url}\n onClick={e => {\n if (noClickable) e.preventDefault();\n }}\n data-noclick={noClickable ? '1' : undefined}\n data-test='subway-link'\n className={cnSubwayStation('link', { noClickable })}\n >\n { station.title }\n </a>\n ) : (<>{ station.title }</>)\n }\n </Typography>\n {children}\n </span>\n );\n});\n","import { ReactText, useCallback, useState } from 'react';\n\nexport interface IWorkingHour {\n value: number;\n label: string;\n disabled: boolean;\n}\n\nfunction format(hour?: ReactText) {\n if (hour === undefined) return;\n return `${hour.toString().padStart(2, '0')}:00`;\n}\n\nfunction getSelectValues(\n startHour: number,\n endHour: number,\n workingHoursRange: {\n start?: number;\n end?: number;\n },\n options?: {\n filterHours?: { start: string; end: string };\n withoutOffset?: boolean;\n }\n) {\n const startHourValues: IWorkingHour[] = [];\n const endHourValues: IWorkingHour[] = [];\n\n for (let hour = startHour; hour <= endHour; hour++) {\n const label = format(hour) ?? '';\n\n if (\n (options?.withoutOffset || hour !== endHour) &&\n label.includes(options?.filterHours?.start ?? '')\n ) {\n startHourValues.push({\n label,\n value: hour,\n disabled: workingHoursRange.end !== undefined && hour >= workingHoursRange.end\n });\n }\n if (\n (options?.withoutOffset || hour !== startHour) &&\n label.includes(options?.filterHours?.end ?? '')\n ) {\n endHourValues.push({\n label,\n value: hour,\n disabled: workingHoursRange.start !== undefined && hour <= workingHoursRange.start\n });\n }\n }\n\n return { startHourValues, endHourValues };\n}\n\ntype TUseWorkingHours = {\n startHour?: number;\n endHour?: number;\n withoutStartValues?: boolean;\n filterHours?: { start: string; end: string };\n withoutOffset?: boolean;\n}\n\nexport function useWorkingHours({\n startHour = 9,\n endHour = 21,\n withoutStartValues,\n filterHours,\n withoutOffset\n}: TUseWorkingHours = {}) {\n const [ workingHoursRange, setWorkingHouseRange ] = useState({\n start: withoutStartValues ? undefined : startHour,\n end: withoutStartValues ? undefined : endHour\n });\n const { startHourValues, endHourValues } = getSelectValues(\n startHour,\n endHour,\n workingHoursRange,\n {\n filterHours,\n withoutOffset\n }\n );\n\n const setStartHoursRange = useCallback((startValue: ReactText, checked: boolean, e?: any) => {\n e?.preventDefault();\n setWorkingHouseRange(state => ({ ...state, start: typeof startValue === 'number' ? startValue : undefined }));\n }, [ startHourValues ]);\n\n const setEndHoursRange = useCallback((endValue: ReactText, checked: boolean, e?: any) => {\n e?.preventDefault();\n setWorkingHouseRange(state => ({ ...state, end: typeof endValue === 'number' ? endValue : undefined }));\n }, [ endHourValues ]);\n\n return {\n rawWorkingHoursRange: {\n start: workingHoursRange.start,\n end: workingHoursRange.end\n },\n workingHoursRange: {\n start: format(workingHoursRange.start),\n end: format(workingHoursRange.end)\n },\n setStartHoursRange,\n setEndHoursRange,\n startHourValues,\n endHourValues\n };\n}\n","import React from 'react';\nimport {\n YMapControlClose,\n YMapControlGeoLocation,\n YMapControlGroup,\n YMapControlRuler,\n YMapControlTraffic,\n YMapControlZoom\n} from '@search/ymap/src/Control';\nimport { YMapPane } from '@search/ymap/src/Pane';\nimport { YMapPlacemarkPoint } from '@search/ymap/src/Placemark';\nimport { YMapBounds } from '@search/ymap/src/bounds';\n\nexport function VTBCoreYMapDesktop({\n onClose,\n center,\n children,\n noZoom,\n bounds,\n noPlacemark,\n zoom = 14,\n setBounds,\n isScrollZoomEnabled,\n useChangedMargin,\n height,\n width,\n small\n}: {\n bounds?: YMapBounds;\n zoom?: number;\n noZoom?: boolean;\n noPlacemark?: boolean;\n children?: React.ReactNode | React.ReactNode[];\n center?: readonly [number, number] | undefined;\n onClose?: () => void;\n setBounds?: (bounds: YMapBounds) => void;\n isScrollZoomEnabled?: boolean;\n useChangedMargin?: boolean;\n height?: number;\n width?: number;\n small?: boolean;\n}) {\n return (\n <YMapPane\n zoom={zoom}\n center={center}\n bounds={bounds}\n noZoom={noZoom}\n setBounds={setBounds}\n width={width}\n height={height}\n isScrollZoomEnabled={isScrollZoomEnabled}\n >\n {noPlacemark || (\n <YMapPlacemarkPoint point={center} />\n )}\n <YMapControlGroup\n hAlign='right'\n vAlign='middle'\n layout='vertical'\n size={useChangedMargin ? 'mChangedMargin' : 'm'}\n >\n <YMapControlZoom />\n {! small && (\n <>\n <YMapControlGeoLocation title='Моё местоположение' />\n <YMapControlTraffic title='Пробки' />\n <YMapControlRuler title='Линейка' />\n </>\n )}\n </YMapControlGroup>\n {small && (\n <YMapControlGroup\n hAlign='left'\n vAlign='top'\n layout='vertical'\n size={useChangedMargin ? 'mChangedMargin' : 'm'}\n >\n <YMapControlTraffic title='Пробки' />\n <YMapControlRuler title='Линейка' />\n <YMapControlGeoLocation title='Моё местоположение' />\n </YMapControlGroup>\n )}\n <YMapControlGroup\n hAlign='right'\n vAlign='top'\n layout='horizontal'\n >\n {\n onClose ? (\n <YMapControlClose onClose={onClose} />\n ) : null\n }\n </YMapControlGroup>\n {children}\n </YMapPane>\n );\n}\n","import React from 'react';\nimport { YMapApiProvider } from '@search/ymap/src/ApiProvider';\n\nconst VTBCoreDefaultStaticApiKey = '3e563b0a-500b-4069-8350-d27bd93ab22d';\n\nconst VTBCoreDefaultApiKey = '9d69994f-afe0-41ae-b5c2-f0997212d77e';\n\nexport function VTBCoreYMapProvider({\n children,\n apiKey = VTBCoreDefaultApiKey,\n staticApiKey = VTBCoreDefaultStaticApiKey\n}: {\n apiKey?: string;\n staticApiKey?: string;\n children: React.ReactChild;\n}) {\n const staticApiUrl = staticApiKey ? 'https://enterprise.static-maps.yandex.ru/1.x' : undefined;\n\n return (\n <YMapApiProvider apiKey={apiKey} staticApiKey={staticApiKey} staticApiUrl={staticApiUrl}>\n {children}\n </YMapApiProvider>\n );\n}\n","import { PoiKindEnum } from '@search/graphql-typings';\n\nexport type PoiImageName = 'SchoolPoiImg' | 'UniversityPoiImg' | 'KindergartenPoiImg' | 'HospitalPoiImg' |\n'PharmacyPoiImg' | 'ShopPoiImg' | 'FoodServicePoiImg' | 'SportCentrePoiImg' | '';\n\nexport const PoiKindToIconName: Record<PoiKindEnum, string> = {\n [PoiKindEnum.Unknown]: '',\n [PoiKindEnum.School]: 'SchoolPoi',\n [PoiKindEnum.University]: 'UniversityPoi',\n [PoiKindEnum.Kindergarten]: 'KindergartenPoi',\n [PoiKindEnum.Hospital]: 'HospitalPoi',\n [PoiKindEnum.Pharmacy]: 'PharmacyPoi',\n [PoiKindEnum.Shop]: 'ShopPoi',\n [PoiKindEnum.FoodService]: 'FoodServicePoi',\n [PoiKindEnum.SportCentre]: 'SportCentrePoi'\n};\n\nexport const PoiKindToImageName: Record<PoiKindEnum, PoiImageName> = {\n [PoiKindEnum.Unknown]: '',\n [PoiKindEnum.School]: 'SchoolPoiImg',\n [PoiKindEnum.University]: 'UniversityPoiImg',\n [PoiKindEnum.Kindergarten]: 'KindergartenPoiImg',\n [PoiKindEnum.Hospital]: 'HospitalPoiImg',\n [PoiKindEnum.Pharmacy]: 'PharmacyPoiImg',\n [PoiKindEnum.Shop]: 'ShopPoiImg',\n [PoiKindEnum.FoodService]: 'FoodServicePoiImg',\n [PoiKindEnum.SportCentre]: 'SportCentrePoiImg'\n};\n","import './styles.css';\n\nimport React, { FC, PropsWithChildren } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { NewBuildingPoi } from '@search/graphql-typings';\nimport { YMapPlacemarkPOI, YMapPlacemarkPriority } from '@search/ymap/src/Placemark';\n\nimport { CoreSvgSpriteIcon } from '../../CoreSvgSpriteIcon/CoreSvgSpriteIcon';\nimport { PoiKindToIconName, PoiKindToImageName, PoiImageName } from './dict/poi';\n\nconst cn = classname.bind(null, 'CorePoiHint');\n\nconst PoiHintWrapper = ({ children }: PropsWithChildren<{}>) => (\n <div className={cn()}>\n {children}\n </div>\n);\n\nexport const CorePoiHint: FC<\n Omit<NewBuildingPoi, 'latitude' | 'longitude'>\n> = ({\n name,\n kind,\n description,\n address,\n specialization,\n noctidial,\n category\n}) => {\n const iconName = PoiKindToImageName[kind];\n\n if (! iconName) {\n return null;\n }\n\n return (<>\n <div className={cn('icon')}>\n <CoreSvgSpriteIcon<PoiImageName>\n height={52}\n width={52}\n name={iconName}\n />\n </div>\n {\n name && (\n <Typography\n bold\n variant='secondary-alone'\n className={cn('name')}\n >\n {name}\n </Typography>\n )\n }\n {\n category && category !== name && (\n <Typography\n variant='small-alone'\n color='secondary'\n className={cn('category')}\n >\n {category}\n </Typography>\n )\n }\n {\n address || noctidial || specialization || description ? (\n <div className={cn('separator')} />\n ) : null\n }\n {\n address && (\n <Typography\n variant='small-alone'\n className={cn('address')}\n >\n {address}\n </Typography>\n )\n }\n {\n noctidial && (\n <Typography\n variant='small-alone'\n className={cn('noctidial')}\n >\n Круглосуточно\n </Typography>\n )\n }\n {\n specialization && (\n <Typography\n variant='small-alone'\n color='secondary'\n className={cn('specialization')}\n >\n {specialization}\n </Typography>\n )\n }\n {\n description && (\n <Typography\n variant='small-alone'\n color='secondary'\n className={cn('description')}\n >\n {description}\n </Typography>\n )\n }\n </>);\n};\n\nexport const YMapPOI: FC<NewBuildingPoi & {\n onClick?: () => void;\n isSelected?: boolean;\n layerPriority?: YMapPlacemarkPriority;\n}> = ({\n latitude,\n longitude,\n name,\n kind,\n description,\n address,\n specialization,\n noctidial,\n category,\n onClick,\n isSelected,\n layerPriority\n}) => {\n const iconName = PoiKindToIconName[kind];\n\n const hint = (\n <PoiHintWrapper>\n <CorePoiHint\n name={name}\n kind={kind}\n description={description}\n address={address}\n specialization={specialization}\n noctidial={noctidial}\n category={category}\n />\n </PoiHintWrapper>\n );\n\n return (\n iconName ? (\n <YMapPlacemarkPOI\n coordinates={{ y: latitude, x: longitude }}\n iconName={iconName}\n hintLayout={renderToStaticMarkup(hint)}\n onClick={onClick}\n isSelected={isSelected}\n layerPriority={layerPriority}\n />\n ) : null\n );\n};\n","import React from 'react';\n\nexport const IconClose: React.FC = ({ width, height }: { width?: number; height?: number }) => (\n <svg\n width={width ?? 32}\n height={height ?? 32}\n viewBox='0 0 18 18'\n >\n <path\n stroke='currentColor'\n strokeOpacity='0.92'\n strokeWidth='1.5'\n d='M1 1.00001L17 17M17 1L1 17'\n />\n </svg>\n);\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GalleryDesktopLoading');\n\nexport const LoadingSpinner = ({ show = true, staticLoader = false }) => {\n if (show) {\n return null;\n }\n\n return (\n <div className={cn(null, { staticLoader })}>\n {staticLoader ? '...' : null}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport classname from '@search/classname/src';\nimport { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';\n\nimport './styles.css';\n\nconst urlErrorImage = 'http://fabiusmaximus.com/wp-content/uploads/2012/12/20121230-no-error.png?w=300';\n\ninterface IPicture {\n alt: string;\n src: string;\n width: number;\n height: number;\n active: boolean;\n isLayout?: boolean;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopPicture');\n\nexport function PictureWrapper({\n width,\n height,\n children,\n loading,\n active,\n isAltView\n}: {\n isAltView?: boolean;\n active?: boolean;\n loading?: boolean;\n children?: React.ReactNode;\n width: number;\n height: number;\n}) {\n return (\n <div className={cn(null, { active: active && isAltView, alt: isAltView })} style={{ width, height }}>\n {loading && <div className={cn('spinner')}>\n <LoadingSpinner show={loading} staticLoader />\n </div>}\n <div className={cn('wrap')}>\n {children}\n {active && ! isAltView && <div style={{ width, height }} className={cn('active')} />}\n </div>\n </div>\n );\n}\n\nexport const Picture = ({\n alt,\n src,\n height,\n active,\n width,\n isLayout\n}: IPicture) => {\n const [ state, setState ] = useState({\n loading: true,\n error: false\n });\n\n const onLoad = () => {\n setTimeout(() => {\n setState({\n loading: false,\n error: false\n });\n }, 100);\n };\n\n const onError = () => {\n setState({\n loading: false,\n error: true\n });\n };\n\n return (\n <PictureWrapper\n width={width}\n height={height}\n loading={state.loading}\n active={active}\n >\n {state.error && (\n <img\n crossOrigin='anonymous'\n className={cn('image')}\n src={urlErrorImage}\n height={height}\n width={width}\n />\n )}\n\n {! state.error && (<>\n <img\n alt={alt}\n src={src}\n height={height}\n width={width}\n className={cn('image', { isLayout })}\n onLoad={onLoad}\n onError={onError}\n crossOrigin='anonymous'\n />\n </>)}\n\n </PictureWrapper>\n );\n};\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { DirectionArrow } from '../constants';\nimport './styles.css';\n\ninterface IArrow {\n direction: DirectionArrow;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopArrow');\n\nexport const Arrow = ({ direction }: IArrow) => {\n return (\n <div className={cn(null, { direction })} data-test={`galleryArrow-${direction}`}>\n <svg width='21' height='57' fill='none'>\n <path\n fill='currentColor'\n fillRule='evenodd'\n clipRule='evenodd'\n /* eslint-disable-next-line max-len */\n d='M2.09566 0.483599C0.153183 1.53577 -0.56855 3.96342 0.483625 5.9059L12.4517 28.0008L0.483625 50.0956C-0.56855 52.0381 0.153183 54.4658 2.09566 55.5179C4.03814 56.5701 6.46579 55.8484 7.51796 53.9059L20.518 29.9059C21.1617 28.7174 21.1617 27.2841 20.518 26.0956L7.51796 2.09563C6.46579 0.153156 4.03814 -0.568577 2.09566 0.483599Z'\n />\n </svg>\n </div>\n );\n};\n","/* eslint-disable no-nested-ternary, react-hooks/exhaustive-deps */\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';\nimport { SizeThumbnail, FigcaptionPosition, DirectionArrow, FigcaptionPositionColor } from '../constants';\nimport { Arrow } from '../Arrow/Arrow';\n\nimport './styles.css';\n\ninterface IHeroPicture {\n alt: string;\n src: string;\n size: SizeThumbnail;\n handleNext: () => void;\n handlePrev: () => void;\n renderArrow: boolean;\n countText?: string;\n figcaptionPosition: FigcaptionPosition;\n figcaptionPositionColor: FigcaptionPositionColor;\n offerTitle?: string;\n withCount?: boolean;\n urlErrorImage?: string;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopHeroPicture');\n\nexport function HeroPictureWrapper({\n renderArrow,\n handlePrev,\n handleNext,\n size,\n renderLoader,\n children,\n isAltView\n}: {\n size: SizeThumbnail;\n children?: React.ReactNode;\n renderArrow?: boolean;\n renderLoader?: boolean;\n handleNext: () => void;\n handlePrev: () => void;\n isAltView?: boolean;\n}) {\n return (<div className={cn(null, { size })}>\n <div className={cn('spinner')}>\n {renderLoader ? <LoadingSpinner show /> : null}\n </div>\n <div className={cn('wrap', { alt: isAltView })}>\n {children}\n {renderArrow && (\n <>\n <button className={cn('arrow', { left: true, alt: isAltView })} onClick={handlePrev}>\n <Arrow direction={DirectionArrow.LEFT} />\n </button>\n <button className={cn('arrow', { right: true, alt: isAltView })} onClick={handleNext}>\n <Arrow direction={DirectionArrow.RIGHT} />\n </button>\n </>\n )}\n </div>\n </div>);\n}\n\nexport const HeroPicture = ({\n alt,\n src,\n size,\n handleNext,\n handlePrev,\n renderArrow,\n countText,\n offerTitle,\n figcaptionPosition,\n figcaptionPositionColor,\n withCount,\n urlErrorImage\n}: IHeroPicture) => {\n const [ cache, setCache ] = useState<string[]>([]);\n const [ renderLoader, setRenderLoader ] = useState(false);\n const [ state, setState ] = useState<{\n hero?: string;\n loading: boolean;\n error: boolean;\n }>({\n hero: src,\n loading: true,\n error: false\n });\n\n const onLoad = () => setTimeout(() => {\n setState({\n hero: src,\n loading: false,\n error: false\n });\n }, 10);\n\n const onError = useCallback(() => {\n setState(prev => ({\n ...prev,\n loading: false,\n error: true\n }));\n }, []);\n\n useEffect(() => {\n setRenderLoader(false);\n\n if (cache.includes(src)) {\n setState(({\n hero: src,\n loading: true,\n error: false\n }));\n } else {\n setCache([ ...cache, src ]);\n setState(({\n hero: undefined,\n loading: true,\n error: false\n }));\n onLoad();\n }\n\n const id = setInterval(() => {\n setRenderLoader(true);\n }, 1000);\n\n return () => clearInterval(id);\n }, [ src, cache ]);\n\n return (<HeroPictureWrapper\n renderLoader={renderLoader}\n renderArrow={renderArrow}\n size={size}\n handleNext={handleNext}\n handlePrev={handlePrev}\n >\n {state.error && <img\n src={urlErrorImage}\n crossOrigin='anonymous'\n alt='При загрузке фото что-то пошло не так'\n className={cn('error')}\n />}\n\n {! state.error && <figure className={cn('figure')}>\n <img\n alt={alt}\n src={state.hero}\n onLoad={onLoad}\n onError={onError}\n crossOrigin='anonymous'\n className={cn('image')}\n />\n {(offerTitle || alt || withCount) ? (\n <figcaption className={cn('figcaption', { position: figcaptionPosition })}>\n {offerTitle ? (\n <Typography\n variant='primary'\n color={figcaptionPositionColor}\n className={cn('title')}\n >\n {offerTitle}\n </Typography>\n ) : null}\n {alt ? (\n <Typography\n variant='primary'\n color={figcaptionPositionColor}\n className={cn('alt', {\n align: offerTitle ? (withCount ? 'center' : 'right') : (withCount ? 'left' : 'center')\n })}\n >\n {alt}\n </Typography>\n ) : null}\n {withCount ? (\n <Typography\n variant='primary'\n color={figcaptionPositionColor}\n className={cn('total', { align: 'right' })}\n >\n {countText}\n </Typography>\n ) : null}\n </figcaption>\n ) : null}\n </figure>}\n </HeroPictureWrapper>);\n};\n","/* eslint-disable */\nimport React from 'react';\n\nexport function Mortgage2IconM2({ className } : { className?: string}) {\n return (\n <svg width='36' height='32' viewBox='0 0 36 32' fill='none' xmlns='http://www.w3.org/2000/svg' className={className}>\n <path d='M36 0H11v7H0v25h25v-7h11V0Zm-8.83 15.17v1.69h-7.04v-1.54s1.46-.74 2.4-1.26c1.24-.68 2.59-1.59 2.69-2.85.08-.97-.73-1.7-1.72-1.7-1.12 0-1.73.65-2.08 1.73l-1.54-.6c.47-1.3 1.53-2.73 3.61-2.73s3.56 1.52 3.56 3.29c0 2.22-2.44 3.3-3.87 3.94l-.04.02v.01h4.03ZM7.42 23.6v-8.42h2.63l2.46 6.04 2.45-6.04h2.65v8.42h-1.83v-6.32l-2.56 6.32h-1.38l-2.6-6.32v6.32H7.42Z' fill='currentColor' />\n </svg>\n );\n}\n","/* eslint-disable comma-dangle, react-hooks/exhaustive-deps, no-implicit-coercion */\nimport React, { useEffect, useState, useRef, useCallback } from 'react';\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\nimport {\n ARROW_UP,\n ARROW_RIGHT,\n ARROW_DOWN,\n ARROW_LEFT,\n} from '../../../../../constants/keycode';\nimport { Picture, PictureWrapper } from '../Picture/Picture';\nimport { HeroPicture, HeroPictureWrapper } from '../HeroPicture/HeroPicture';\nimport {\n SizeThumbnail,\n PADDED_PREVIEW,\n WIDTH_THUMBNAIL,\n HEIGHT_THUMBNAIL,\n OFFSET_THUMBNAIL,\n FigcaptionPosition,\n FigcaptionPositionColor\n} from '../constants';\nimport './styles.css';\nimport { Mortgage2IconM2 } from '../../../MinimalBanksMortgage/mortgage2/icon/Mortgage2IconM2';\n\nexport interface IGallery {\n srcImages: {\n preview: string[];\n origin: string[];\n attributesType?: ('LAYOUT' | 'UNKNOWN' | null | undefined)[];\n };\n initialIndexSrcImage: number;\n isOpenRepairForm?: boolean;\n size: SizeThumbnail;\n figcaptionPosition: FigcaptionPosition;\n figcaptionPositionColor: FigcaptionPositionColor;\n renderArrow?: boolean;\n offerTitle?: string;\n withCount?: boolean;\n urlErrorImage?: string;\n clickByCenter?: () => void;\n withDuplicateSearchButton?: boolean;\n starterBanner?: React.ReactNode;\n repairBanner?: React.ReactNode;\n hideThumbnails?: boolean;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktop');\n\nconst FIRST_IMAGE_INDEX = 0;\n\ntype ImgRec = ({\n t: 'img';\n origin: string;\n preview: string;\n alt: string;\n index: number;\n attributesType?: 'UNKNOWN' | 'LAYOUT' | null;\n} | {\n t: 'mortgage' | 'repair';\n}) & {\n id: string;\n next?: ImgRec;\n prev?: ImgRec;\n};\n\n// eslint-disable-next-line complexity\nfunction getImgRec(\n srcImages: IGallery['srcImages'],\n {\n isMortgage = false,\n isRepair = false,\n isOpenRepairForm = false,\n initialIndexSrcImage = 0\n }: {\n isMortgage?: boolean;\n isRepair?: boolean;\n isOpenRepairForm?: boolean;\n initialIndexSrcImage?: number;\n }\n) {\n const items: ImgRec[] = [];\n let firstItem: undefined | ImgRec;\n let lastItem: undefined | ImgRec;\n let initialItem: undefined | ImgRec;\n let prev: undefined | ImgRec;\n let mortgageRec: ImgRec | undefined;\n let repairRec: ImgRec | undefined;\n const indexPositionMortgageBanner = isRepair ? 7 : 5;\n const indexPositionRepairBanner = 3;\n\n for (let i = 0; i < srcImages.preview.length; i++) {\n if ((! isRepair || srcImages.preview.length > 5) && isMortgage && i === indexPositionMortgageBanner) {\n mortgageRec = { t: 'mortgage', prev, next: undefined, id: 'gallery-preview-mortgage' };\n\n if (prev) prev.next = mortgageRec;\n\n items.push(mortgageRec);\n prev = mortgageRec;\n }\n\n if (isRepair && i === indexPositionRepairBanner) {\n repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n\n if (prev) prev.next = repairRec;\n\n items.push(repairRec);\n prev = repairRec;\n }\n\n const imgRec: ImgRec = {\n t: 'img',\n index: i,\n id: `gallery-preview-img-${i}`,\n origin: srcImages.origin[i],\n preview: srcImages.preview[i],\n attributesType: srcImages.attributesType?.[i],\n alt: '',\n prev,\n next: undefined\n };\n\n if (prev) prev.next = imgRec;\n\n items.push(imgRec);\n prev = imgRec;\n\n if (i === 0) firstItem = imgRec;\n if (i === initialIndexSrcImage) {\n initialItem = imgRec;\n }\n if (isRepair && isOpenRepairForm && i === indexPositionRepairBanner) {\n initialItem = repairRec;\n }\n lastItem = imgRec;\n }\n\n if (isRepair && isOpenRepairForm && srcImages.preview.length < 4) {\n repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n initialItem = repairRec;\n if (prev) prev.next = repairRec;\n items.push(repairRec);\n }\n\n if (isMortgage && ! mortgageRec && (srcImages.preview.length > 5 || ! isRepair)) {\n mortgageRec = { t: 'mortgage', prev, next: undefined, id: 'gallery-preview-mortgage' };\n if (prev) prev.next = mortgageRec;\n items.push(mortgageRec);\n }\n if (isMortgage && ! isRepair && firstItem && ! firstItem.prev && srcImages.preview.length <= indexPositionMortgageBanner) {\n firstItem.prev = mortgageRec;\n }\n\n if (isRepair && ! repairRec) {\n repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n if (prev) prev.next = repairRec;\n items.push(repairRec);\n }\n\n return { items, totalImages: srcImages.preview.length, initialItem, firstItem, lastItem };\n}\n\nexport const Gallery: React.FC<IGallery> = ({\n size,\n starterBanner,\n repairBanner,\n srcImages,\n initialIndexSrcImage = FIRST_IMAGE_INDEX,\n isOpenRepairForm = false,\n figcaptionPosition = FigcaptionPosition.TOP,\n figcaptionPositionColor = FigcaptionPositionColor.WHITE,\n offerTitle,\n withCount,\n renderArrow = true,\n urlErrorImage,\n clickByCenter,\n withDuplicateSearchButton,\n hideThumbnails,\n}) => {\n const {\n items,\n totalImages,\n initialItem,\n firstItem,\n lastItem\n } = React.useMemo(\n () => getImgRec(srcImages, { isMortgage: Boolean(starterBanner), isRepair: Boolean(repairBanner), initialIndexSrcImage, isOpenRepairForm }),\n [\n starterBanner,\n repairBanner,\n initialIndexSrcImage,\n isOpenRepairForm,\n srcImages.preview.join(';')\n ]\n );\n\n const [ hero, setHeroRaw ] = useState(initialItem);\n\n const changeHero = React.useCallback((current?: ImgRec) => {\n if (! current) return;\n\n setHeroRaw(current);\n document.getElementById(current.id)?.focus();\n }, [ ]);\n\n const handlePrevClick = useCallback(() => {\n changeHero(hero?.prev ?? lastItem);\n }, [ lastItem, hero ]);\n\n const handleNextClick = useCallback(() => {\n changeHero(hero?.next ?? firstItem);\n }, [ firstItem, hero ]);\n\n const thumbnailsWrapRef = useRef<HTMLDivElement>(null);\n\n const upKey = useKeyPress(ARROW_UP);\n const rightKey = useKeyPress(ARROW_RIGHT);\n const downKey = useKeyPress(ARROW_DOWN);\n const leftKey = useKeyPress(ARROW_LEFT);\n\n useEffect(() => {\n if (hero) document.getElementById(hero.id)?.focus();\n }, []);\n\n useEffect(() => {\n upKey && handleNextClick();\n rightKey && handleNextClick();\n downKey && handlePrevClick();\n leftKey && handlePrevClick();\n }, [\n upKey,\n leftKey,\n rightKey,\n downKey\n ]);\n\n useEffect(() => {\n const wrapEl = thumbnailsWrapRef.current;\n const thumbEl = hero ? document.getElementById(hero.id) : undefined;\n\n if (! wrapEl || ! thumbEl) return;\n const thumbRect = thumbEl?.getBoundingClientRect() ?? { x: 0, y: 0 };\n const wrapRect = wrapEl?.getBoundingClientRect() ?? { width: 0, height: 0 };\n\n const thumbWidth = WIDTH_THUMBNAIL[size];\n const step = thumbWidth + OFFSET_THUMBNAIL;\n\n if (\n (thumbRect.x + thumbWidth * 1.5) > wrapRect.width\n ) {\n wrapEl.scrollLeft += step;\n }\n\n if (\n (thumbRect.x < 0) || (thumbRect.x < thumbWidth * 1.5)\n ) {\n wrapEl.scrollLeft -= step;\n }\n\n if (hero?.prev?.t === 'img') new Image().src = hero.prev.origin;\n if (hero?.next?.t === 'img') new Image().src = hero.next.origin;\n }, [ hero ]);\n\n return (\n <div className={cn(null, { size, withTopTitle: figcaptionPosition === FigcaptionPosition.TOP })}>\n {hero?.t === 'img' && <HeroPicture\n src={hero.origin}\n alt={hero.alt}\n size={size}\n handleNext={handleNextClick}\n handlePrev={handlePrevClick}\n countText={`${hero ? hero.index + 1 : 0} из ${totalImages}`}\n offerTitle={offerTitle}\n figcaptionPosition={figcaptionPosition}\n figcaptionPositionColor={figcaptionPositionColor}\n withCount={withCount}\n renderArrow={renderArrow}\n urlErrorImage={urlErrorImage}\n />}\n {hero?.t === 'repair' && repairBanner && <HeroPictureWrapper\n size={size}\n isAltView\n handleNext={handleNextClick}\n handlePrev={handlePrevClick}\n renderArrow={renderArrow}\n >\n {repairBanner}\n </HeroPictureWrapper>}\n\n {hero?.t === 'mortgage' && starterBanner && <HeroPictureWrapper\n size={size}\n isAltView\n handleNext={handleNextClick}\n handlePrev={handlePrevClick}\n renderArrow={renderArrow}\n >\n {starterBanner}\n </HeroPictureWrapper>}\n\n {withDuplicateSearchButton && hero?.t === 'img' && (\n <a\n href={`https://yandex.ru/images/search?rpt=imageview&url=${hero.origin}`}\n className={cn('duplicateButton')}\n target='_blank'\n >\n Дубль?\n </a>\n )}\n\n {hideThumbnails ? null : (<div\n style={{ paddingTop: PADDED_PREVIEW[size], }}\n className={cn('thumbnails')}\n data-test='galleryDesktop-thumbnails'\n ref={thumbnailsWrapRef}\n >\n {items.map(rec => (\n <button\n type='button'\n key={rec.id}\n className={cn('control')}\n id={rec.id}\n onClick={changeHero.bind(null, rec)}\n >\n {rec.t === 'img' && <Picture\n src={rec.preview}\n alt={rec.alt}\n isLayout={rec.attributesType === 'LAYOUT'}\n width={WIDTH_THUMBNAIL[size]}\n height={HEIGHT_THUMBNAIL[size]}\n active={rec === hero}\n />}\n {rec.t === 'repair' && (\n <PictureWrapper\n width={WIDTH_THUMBNAIL[size]}\n height={HEIGHT_THUMBNAIL[size]}\n active={rec === hero}\n isAltView\n >\n <Mortgage2IconM2 className={cn('m2Icon', { isActive: rec === hero })} />\n </PictureWrapper>\n )}\n {rec.t === 'mortgage' && (\n <PictureWrapper\n width={WIDTH_THUMBNAIL[size]}\n height={HEIGHT_THUMBNAIL[size]}\n active={rec === hero}\n isAltView\n >\n <Mortgage2IconM2 className={cn('m2Icon', { isActive: rec === hero })} />\n </PictureWrapper>\n )}\n </button>\n ))}\n </div>)}\n\n {clickByCenter && <div className={cn('place-click')} onClick={clickByCenter} />}\n </div>\n );\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\n\nimport { IconClose } from '../../../../../icons/IconClose';\nimport { ESCAPE } from '../../../../../constants/keycode';\nimport { Gallery, IGallery } from '../Gallery/Gallery';\nimport './styles.css';\n\ninterface IFSGallery extends IGallery {\n onClose: () => void;\n belowModal?: boolean;\n}\n\nconst cn = classname.bind(null, 'FSGallery');\nconst modalNode = typeof document === 'undefined' ? null : document.createElement('div');\n\nexport const FSGallery = ({\n onClose,\n belowModal,\n ...rest\n}: IFSGallery) => {\n const esc = useKeyPress(ESCAPE);\n\n useEffect(() => {\n esc && onClose();\n }, [ esc ]);\n\n useEffect(() => {\n if (! modalNode) return;\n const base = cn('overlay');\n\n modalNode.classList?.add(base);\n\n if (belowModal) modalNode.classList?.add(`${base}_belowModal`);\n document.body.appendChild(modalNode);\n const classes = cn(null, { open: true }).split(' ')[1];\n\n document.body.classList.add(classes);\n\n return () => {\n document.body.removeChild(modalNode);\n document.body.classList.remove('FSGallery_open');\n modalNode.classList?.remove(base);\n if (belowModal) modalNode.classList?.remove(`${base}_belowModal`);\n };\n }, [ belowModal ]);\n\n return ReactDOM.createPortal(\n <div className={cn('inner')}>\n <Gallery {...rest} />\n\n <div className={cn('icon-close')} onClick={onClose}\n data-test='gallery-icon-close'>\n <IconClose />\n </div>\n </div>,\n // @ts-ignore\n modalNode\n );\n};\n","export enum SizeThumbnail {\n M = 'm',\n L = 'l'\n}\n\nexport enum FigcaptionPosition {\n TOP = 'top',\n BOTTOM = 'bottom'\n}\n\nexport enum FigcaptionPositionColor {\n WHITE = 'white',\n BLACK = 'black'\n}\n\nexport enum DirectionArrow {\n LEFT = 'left',\n RIGHT = 'right'\n}\n\nexport const OFFSET_THUMBNAIL = 8;\n\nexport const HEIGHT_THUMBNAIL = {\n [SizeThumbnail.M]: 45,\n [SizeThumbnail.L]: 75\n};\n\nexport const WIDTH_THUMBNAIL = {\n [SizeThumbnail.M]: 60,\n [SizeThumbnail.L]: 100\n};\n\nexport const PADDED_PREVIEW = {\n [SizeThumbnail.M]: 8,\n [SizeThumbnail.L]: 16\n};\n","import './ButtonTwoState.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { Tooltip, Button, useTooltip, ButtonProps } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nconst cn = classname.bind(null, 'ButtonTwoState');\n\nexport function ButtonTwoState({\n tooltipText,\n tooltipAsText,\n children = tooltipAsText ? tooltipText : null,\n tooltipDirection = 'up',\n variant,\n isActive,\n onClick,\n size = 's',\n dataAttrs,\n dataTest,\n onlyIconStyle,\n paddingSize,\n noTooltip,\n ...props\n}: ButtonProps & {\n tooltipAsText?: boolean;\n isActive?: boolean;\n tooltipText?: string;\n tooltipDirection?: React.ComponentProps<typeof Tooltip>['direction'];\n onlyIconStyle?: boolean;\n noTooltip?: boolean;\n /**\n * Свойство для работы только в виде иконки. Паддинг вокруг иконки.\n * @param {string} m - 10px\n */\n paddingSize?: 'm';\n}) {\n const tooltip = useTooltip();\n // const colorBlack400 = 'hsl(251, 10%, 46%)';\n const colorBlack250 = 'hsl(251, 17%, 75%)';\n const colorRed600 = 'hsl(5, 90%, 48%)';\n\n let normalVariant = variant;\n let iconColor = undefined as ButtonProps['iconColor'];\n\n if (variant === 'transparent' || variant === 'transparent-alt-bg') {\n const normalColor = children ? undefined : colorBlack250;\n\n iconColor = isActive ? colorRed600 : normalColor;\n }\n if (isActive && (variant !== 'transparent' && variant !== 'transparent-alt-bg')) normalVariant = 'danger';\n\n const button = variant === 'transparent-alt-bg' ? (\n <button\n data-test={dataTest}\n className={cn(null, { isActive, isBlack: Boolean(children), onlyIconStyle, paddingSize })}\n ref={tooltip.registerControl as React.Ref<HTMLButtonElement>}\n onClick={e => {\n e.stopPropagation();\n onClick?.(e);\n }}\n >\n <Icon\n size='m'\n name={props.icon as Extract<React.ComponentProps<typeof Icon>, { size: 'm' }>['name']}\n />\n {children && (\n <span className={cn('text')}>\n {children}\n </span>\n )}\n </button>\n ) : (\n <div className={cn(null)}>\n <Button\n {...props}\n dataAttrs={dataAttrs}\n dataTest={dataTest}\n size={size}\n iconColor={iconColor}\n variant={normalVariant}\n ref={tooltip.registerControl as React.Ref<HTMLButtonElement>}\n onClick={e => {\n e.stopPropagation();\n onClick?.(e);\n }}\n >\n {children}\n </Button>\n </div>\n );\n\n return (<>\n {onClick ? button : null}\n {! noTooltip && tooltipText && ! tooltipAsText ? (\n <Tooltip\n placement='body'\n direction={tooltipDirection}\n to={tooltip.to}\n children={tooltipText}\n />\n ) : null}\n </>);\n}\n","/* global window */\nimport React from 'react';\nimport { Tooltip, useTooltip, ShareModal } from '@vtblife/uikit';\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\nimport { ButtonTwoState } from '../../view/common/components/FavoritesButton/ButtonTwoState';\nimport { useShareLinksNative } from './useShareLinks';\n\nexport function ShareButton({\n gtmShowModal = 'ClModalShareStart',\n gtmShare = 'ClModalShareChoise',\n title,\n isCircle,\n isMobile,\n children = 'Поделиться',\n textPlacement = 'none',\n preferNativeShare = true,\n onModalVisibilityChange,\n}: {\n isMobile?: boolean;\n gtmShowModal?: string;\n gtmShare?: string;\n title?: string;\n children?: React.ReactNode;\n isCircle?: boolean;\n textPlacement?: 'none' | 'button' | 'tooltip';\n preferNativeShare?: boolean;\n onModalVisibilityChange?(isVisible: boolean): void;\n}) {\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const [ isModal, setIsModal ] = React.useState(false);\n\n const { nativeShare } = useShareLinksNative({ title, gtmShare });\n\n React.useEffect(() => {\n onModalVisibilityChange?.(isModal);\n }, [ isModal ]);\n\n const showModal = React.useCallback(() => {\n if (nativeShare && preferNativeShare) {\n nativeShare();\n return;\n }\n\n if (gtmShowModal) dataLayerPush({ event: gtmShowModal });\n setIsModal(true);\n }, [ gtmShowModal, nativeShare, dataLayerPush, preferNativeShare ]);\n\n const closeModal = React.useCallback(() => {\n setIsModal(false);\n }, []);\n\n const tt = useTooltip();\n\n const currentUrl =\n typeof window === 'undefined' ? '' : window.location.href;\n\n const analyticsPush = React.useCallback(\n (id: string) => {\n if (! gtmShare) return;\n dataLayerPush({ event: gtmShare, soc_sources: id });\n },\n [ gtmShare, dataLayerPush ]\n );\n\n const variant = isMobile ? 'transparent-alt-bg' : 'secondary';\n\n const body = (\n <>\n <ShareModal\n url={currentUrl}\n opened={isModal}\n title={title}\n onClose={closeModal}\n onShare={analyticsPush}\n />\n <ButtonTwoState\n size='s'\n fullWidth\n variant={isCircle ? 'primary-alt-bg' : variant}\n shadow={isCircle}\n icon='share'\n dataTest='card-button-share'\n circle={isCircle}\n onClick={showModal}\n >\n {textPlacement === 'button' ? children : ''}\n </ButtonTwoState>\n {textPlacement === 'tooltip' ? (\n <Tooltip direction='up' to={tt.to}>\n {children}\n </Tooltip>\n ) : null}\n </>\n );\n\n return isMobile ? body : <div ref={tt.registerControl}>{body}</div>;\n}\n","/* global navigator, window */\nimport React from 'react';\n\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\n\nexport function useShareLinksNative(p: {\n title?: string;\n shareUrl?: string;\n gtmShare?: string;\n} = {}) {\n const currentUrl = p.shareUrl ?? (typeof window === 'undefined' ? '' : window.location.href);\n const isNativeShare = typeof navigator === 'undefined' ? undefined : navigator.share;\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n const analyticsPush = React.useCallback((id: string) => {\n const fullId = p.gtmShare;\n\n if (! fullId) return;\n dataLayerPush({ event: fullId });\n }, [ p.gtmShare, dataLayerPush ]);\n\n const nativeShare = React.useCallback(() => {\n if (! isNativeShare) return;\n\n analyticsPush('native');\n\n navigator.share({\n title: p.title,\n url: currentUrl\n });\n }, [ ]);\n\n return {\n nativeShare: isNativeShare ? nativeShare : undefined\n };\n}\n","import React from 'react';\n\nimport { ButtonTwoState } from './ButtonTwoState';\n\nexport function FavoritesButton(props: React.ComponentProps<typeof ButtonTwoState>) {\n return (<ButtonTwoState\n {...props}\n icon='heart'\n dataTest={props.isActive ? 'offer-favorite-yes' : 'offer-favorite-no'}\n tooltipText={props.isActive ? 'В\\u00A0избранном' : 'В\\u00A0избранное'}\n />);\n}\n","import React from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport './styles.css';\n\ninterface IProps {\n handleOpenPanorama?: (e: React.MouseEvent<Element, MouseEvent>) => void;\n handleOpenLayout?: (e: React.MouseEvent<Element, MouseEvent>) => void;\n}\n\nexport const GalleryButtons = ({ handleOpenPanorama, handleOpenLayout }: IProps) => (\n <div className='GalleryButtons'>\n {handleOpenPanorama && (\n <Button\n icon='panorama'\n variant='transparent'\n rounded='none'\n size='s'\n fullWidth\n onClick={handleOpenPanorama}\n >\n Панорама\n </Button>\n )}\n {handleOpenLayout && (<Button\n icon='blueprint'\n variant='transparent'\n rounded='none'\n size='s'\n fullWidth\n onClick={handleOpenLayout}\n >\n Планировка\n </Button>)}\n </div>\n);\n","/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable comma-dangle, no-shadow, react-hooks/exhaustive-deps */\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { Button } from '@vtblife/uikit';\nimport { Dots } from '@vtblife/uikit/legacy';\n\nimport { ImageLazySeo } from '@search/vtbeco-frontend-core/domain/image/lazy/ImageLazySeo';\nimport { ImageLazyObserverProvider } from '@search/vtbeco-frontend-core/domain/image/lazy/ImageLazy';\nimport { ShareButton } from '@search/vtbeco-frontend-core/domain/share/ShareButton';\nimport NavButtons, { ArrowDirection } from '@search/vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/NavButtons';\n\nimport { NO_PHOTO_SRC, NO_PHOTO_SRC_SET } from '../../../../../domain/newbuilding/libs/constants';\nimport { useGetCurrentIndexImages } from '../useGetCurrentIndexImages';\nimport { FavoritesButton } from '../../FavoritesButton/FavoritesButton';\n\nimport { GalleryButtons } from './GalleryButtons/GalleryButtons';\nimport './GalleryMobile2.css';\n\nconst cn = classname.bind(null, 'GalleryMobile2');\n\nexport type PictureType = {\n src?: string;\n originPath?: string;\n description?: string;\n}\n\ninterface IGalleryMobile2Props {\n pictures?: PictureType[];\n\n layoutImageSrc?: string;\n layoutImageIndex?: number;\n\n onClick?: (imgIndex: number) => void;\n handleOpenPanorama?: () => void;\n imageDataset?: Record<string, string>;\n gotoBack?: () => void;\n\n anchorHidingCircleButtons?: React.MutableRefObject<HTMLDivElement | null>;\n\n isFavoriteActive?: boolean;\n onFavoriteClick?(e: React.MouseEvent): void;\n renderFavorite?: React.ReactNode;\n\n noTooltip?: boolean;\n\n renderBadges?: React.ReactNode;\n renderSpecialEvents?: React.ReactNode;\n renderVases?: React.ReactNode;\n noSlider?: boolean;\n showShareButton?: boolean;\n onShareModalVisibilityChange?(isVisible: boolean): void;\n maxPicturesCount?: number;\n isNewBuilding?: boolean;\n isOfferCard?: boolean;\n hovered?: boolean;\n withDots?: boolean;\n withSpace?: boolean;\n withNavButtons?: boolean;\n relativeHeight?: boolean;\n hideActionsButtons?: boolean;\n isVisited?: boolean | null;\n /**\n * Для уменьшения LCP видимым на первом экране картинкам лучше НЕ задавать lazy.\n * Больше инфы тут https://web.dev/lcp-lazy-loading/\n */\n isFirstOffer?: boolean;\n}\n\n// eslint-disable-next-line complexity\nexport const GalleryMobile2: React.FC<IGalleryMobile2Props> = ({\n pictures = [],\n\n isVisited = false,\n layoutImageSrc,\n layoutImageIndex,\n\n onClick = () => { },\n imageDataset,\n\n renderBadges,\n renderSpecialEvents,\n renderVases,\n\n anchorHidingCircleButtons,\n\n isOfferCard,\n withDots = true,\n withSpace: withSpaceProp = false,\n noSlider: noSliderProps = false,\n isNewBuilding,\n maxPicturesCount,\n hovered,\n withNavButtons,\n relativeHeight,\n hideActionsButtons,\n isFirstOffer,\n\n // maybe drill through children\n isFavoriteActive,\n onFavoriteClick,\n renderFavorite: renderFavoriteProp,\n\n showShareButton,\n onShareModalVisibilityChange,\n handleOpenPanorama,\n gotoBack,\n noTooltip = false\n}) => {\n const { images, noSlider, restCountImages } = useMemo(() => {\n let images = pictures;\n let restCountImages = 0;\n let noSlider = noSliderProps;\n\n if (maxPicturesCount) {\n images = pictures.slice(0, maxPicturesCount);\n restCountImages = pictures.length - images.length;\n }\n\n if (images.length === 1) {\n noSlider = true;\n }\n if (noSlider) {\n images = images.slice(0, 1);\n }\n\n return {\n images,\n restCountImages,\n noSlider\n };\n }, [ pictures, noSliderProps ]);\n\n const { setChildRef, indexImage, galleryRef, setIndexImage } = useGetCurrentIndexImages(images.length);\n\n const layoutImageRef = React.useRef<HTMLSpanElement | null>(null);\n const setRefProps = (el: HTMLSpanElement | null, index: number, imageSrc: string) => {\n setChildRef(el, index);\n if (imageSrc === layoutImageSrc) {\n layoutImageRef.current = el;\n }\n };\n const handleOpenLayout = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n e.stopPropagation();\n layoutImageRef.current?.scrollIntoView(false);\n if (typeof layoutImageIndex === 'number' && layoutImageIndex >= 0) {\n setIndexImage(layoutImageIndex);\n }\n }, [ layoutImageRef ]);\n\n const circleButtonsRef = useRef<HTMLDivElement>(null);\n const circleRightButtonsRef = useRef<HTMLDivElement>(null);\n const circleButtonsWrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isOfferCard) {\n const viewportHeight = window.innerHeight;\n const observerCircleButtonsSticky = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (\n (! entry.isIntersecting && entry.intersectionRatio === 0) ||\n (entry.intersectionRatio < 1 && entry.intersectionRatio > 0.5)\n ) {\n circleButtonsRef.current?.classList.add('GalleryMobile2__circle-buttons_sticky');\n }\n if (entry.isIntersecting && entry.intersectionRatio === 1) {\n circleButtonsRef.current?.classList.remove('GalleryMobile2__circle-buttons_sticky');\n }\n });\n }, {\n rootMargin: '0px 5px',\n threshold: [ 0, 0.5, 1, 0.99 ]\n });\n\n const observerCircleButtonsShow = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (circleRightButtonsRef.current) {\n const isAnchorVisibleOrScrollThrough = entry.boundingClientRect.top <= viewportHeight;\n\n if (isAnchorVisibleOrScrollThrough) {\n circleRightButtonsRef.current.style.display = 'none';\n } else {\n circleRightButtonsRef.current.style.display = 'grid';\n }\n }\n });\n }, {\n rootMargin: '0px 5px',\n threshold: [ 0, 0.05, 0.5, 0.95, 1 ]\n });\n\n circleButtonsWrapperRef.current && observerCircleButtonsSticky.observe(circleButtonsWrapperRef.current);\n anchorHidingCircleButtons?.current && observerCircleButtonsShow.observe(anchorHidingCircleButtons.current);\n\n return () => {\n observerCircleButtonsShow.disconnect();\n observerCircleButtonsSticky.disconnect();\n };\n }\n }, [ ]);\n\n const galleryWidth = galleryRef.current?.clientWidth ?? 0;\n const handleClickArrow = useCallback((arrowDirection: ArrowDirection) => {\n if (arrowDirection === 'left') {\n galleryRef.current?.scrollTo({ left: (galleryRef.current?.scrollLeft ?? 0) - galleryWidth });\n setIndexImage(state => state - 1);\n } else {\n galleryRef.current?.scrollTo({ left: (galleryRef.current?.scrollLeft ?? 0) + galleryWidth });\n setIndexImage(state => state + 1);\n }\n }, [ galleryWidth ]);\n\n const lastImageIndex = images.length - 1;\n const withSpace = withDots && images.length > 1 || withSpaceProp;\n const showNavButtons = withNavButtons && images.length > 1;\n const showActionButtons = ! hideActionsButtons && isOfferCard && (layoutImageSrc || handleOpenPanorama);\n\n const renderFavoriteInner = onFavoriteClick ? (<FavoritesButton\n isActive={isFavoriteActive}\n onClick={onFavoriteClick}\n variant='primary-alt-bg'\n noTooltip={noTooltip}\n circle\n block\n shadow\n />) : undefined;\n\n const renderFavorite = renderFavoriteInner ?? renderFavoriteProp;\n const mainSrc = images?.[0]?.src ?? images?.[0]?.originPath;\n\n return (\n <div className={cn()}>\n <link itemProp='image' href={mainSrc} />\n <div\n className={cn('galleryWrapper', {\n relativeHeight,\n withSpace,\n visited: isVisited,\n withActionButtons: showActionButtons\n })}\n >\n {showNavButtons && (\n <NavButtons\n isActive={hovered}\n isLastImage={indexImage === lastImageIndex}\n isFirstImage={indexImage === 0}\n handleClickArrow={handleClickArrow}\n />\n )}\n\n <div\n ref={galleryRef}\n className={cn('gallery', { noSlider, withNavButtons, relativeHeight })}\n >\n <ImageLazyObserverProvider\n rootRef={galleryRef}\n rootMargin='0px 50% 0px 0px'\n >\n {images.length === 0 && <NoPhoto isNewBuilding={isNewBuilding} />}\n {images.map(({ src, originPath, description }, index) => {\n const id = src ?? originPath ?? '';\n\n return src || originPath ? (\n <ImageLazySeo\n dataSet={imageDataset}\n onClick={() => onClick(index)}\n src={src}\n originPath={originPath}\n srcWidth={280}\n srcHeight={210}\n key={id}\n data-index={index}\n className={cn('imageWrapper', {\n noSlider, isLayout: id === layoutImageSrc, withSpace })}\n imgClassName={cn('image', {\n noSlider, isLayout: id === layoutImageSrc, withSpace })}\n ref={ref => setRefProps(ref, index, id)}\n // Для первой картинки принудительно нативный lazy, в сафари будет всегда загружаться, в хроме - нативно лениво.\n // eslint-disable-next-line no-nested-ternary\n loadingLazy={isFirstOffer && index === 0 ?\n 'eager' :\n index === 0 ? 'native' : 'io'}\n alt={description}\n title={description}\n >\n {lastImageIndex === index && restCountImages > 0 && (\n <div\n className={cn('last-image-preview')}\n data-test='snippet-gallery-last-photo'\n >\n Ещё {restCountImages} фото</div>\n )}\n </ImageLazySeo>\n ) : (\n <NoPhoto isNewBuilding={isNewBuilding} key={index} />\n );\n })}\n </ImageLazyObserverProvider>\n </div>\n\n <div className={cn('badges')}>\n {renderBadges}\n </div>\n\n <div className={cn('special-events')}>\n {renderSpecialEvents}\n </div>\n\n <div className={cn('priorities')}>\n {renderVases}\n </div>\n </div>\n\n {withSpace && (\n <div className={cn('space', { borderBottom: showActionButtons })}>\n {images.length > 1 ? (\n <Dots\n size='s'\n length={images.length}\n carousel={7}\n selected={indexImage}\n />\n ) : null}\n </div>\n )}\n\n {showActionButtons && (\n <GalleryButtons\n handleOpenLayout={layoutImageSrc ? handleOpenLayout : undefined}\n handleOpenPanorama={handleOpenPanorama}\n />\n )}\n\n {\n (gotoBack || showShareButton || renderFavorite) ? (\n <div className={cn('circle-buttons-wrapper')} ref={circleButtonsWrapperRef}>\n <div className={cn('circle-buttons')} ref={circleButtonsRef}>\n {gotoBack && (\n <Button\n circle\n variant='primary-alt-bg'\n size='s'\n icon='chevron-left'\n dataTest='offer-back'\n shadow\n onClick={gotoBack}\n />\n )}\n\n <div\n ref={circleRightButtonsRef}\n className={cn('circle-buttons-group', {\n showBothButtons: showShareButton && Boolean(renderFavorite) })}\n >\n {showShareButton && <ShareButton isCircle onModalVisibilityChange={onShareModalVisibilityChange} />}\n {renderFavorite}\n </div>\n </div>\n </div>\n ) : null\n }\n </div>\n );\n};\n\nconst NoPhoto = ({ isNewBuilding }: { isNewBuilding?: boolean }) => {\n return (<>\n {isNewBuilding && (\n <picture itemType='http://schema.org/ImageObject'>\n <source\n srcSet={NO_PHOTO_SRC_SET}\n />\n <img\n className={cn('empty-nb')}\n crossOrigin='anonymous'\n alt='нет фотографии ЖК, заглушка'\n src={NO_PHOTO_SRC}\n loading='lazy'\n />\n </picture>\n )}\n {! isNewBuilding && (\n <span className={cn('empty')}>\n <Icon name='camera-crossed' size='xl' />\n </span>\n )}\n </>);\n};\n","import throttle from 'lodash/throttle';\nimport { useRef, useEffect, useState, useCallback } from 'react';\n\nexport const useGetCurrentIndexImages = (length: number) => {\n const [ indexImage, setIndex ] = useState(0);\n\n const galleryRef = useRef<HTMLDivElement>(null);\n const galleryImageRefs = useRef<(Element | null)[]>(Array(length).map(() => null));\n\n const setChildRef = (ref: Element | null, index: number) => {\n if (ref) galleryImageRefs.current[index] = ref;\n };\n\n // eslint-disable-next-line no-undef\n const setCurrentIndex = useCallback((e: globalThis.Event) => {\n e.stopPropagation();\n e.preventDefault();\n\n const childs = galleryImageRefs.current;\n const rectParent = galleryRef.current?.getBoundingClientRect();\n\n if (! rectParent || ! childs) return;\n\n childs.forEach((child, index) => {\n if (! child) return;\n\n const childRectRight = child?.getBoundingClientRect().right;\n\n const relativeChildPosRightSide = Number((childRectRight - rectParent.right).toFixed(0));\n\n if (relativeChildPosRightSide >= -5 && relativeChildPosRightSide <= 5) {\n setIndex(index);\n }\n });\n });\n\n useEffect(() => {\n const parent = galleryRef.current;\n\n if (! galleryImageRefs.current || ! parent) return;\n\n const throttleHandleScroll = throttle(setCurrentIndex, 100) as EventListener;\n\n parent.addEventListener('scroll', throttleHandleScroll);\n\n return () => parent.removeEventListener('scroll', throttleHandleScroll);\n }, [ galleryImageRefs ]);\n\n return { setChildRef, galleryImageRefs, galleryRef, indexImage, setIndexImage: setIndex };\n};\n","import { useRef, useCallback, useEffect, MutableRefObject } from 'react';\n\ntype Timeout = ReturnType<typeof setTimeout>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function useDebouncedCallback<T extends(...args: any[]) => any>(\n callback: T,\n delay: number\n): [T, () => void] {\n const maxWaitArgs: { current: any[] } = useRef([]);\n\n const functionTimeoutHandler: MutableRefObject<Timeout|null> = useRef(null);\n const isComponentUnmounted: { current: boolean } = useRef(false);\n\n const debouncedFunction = useRef(callback);\n\n debouncedFunction.current = callback;\n\n const cancelDebouncedCallback: () => void = useCallback(() => {\n clearTimeout(functionTimeoutHandler.current!);\n maxWaitArgs.current = [];\n functionTimeoutHandler.current = null;\n }, []);\n\n useEffect(\n () => () => {\n // для вызова callPending вне hook'а\n isComponentUnmounted.current = true;\n },\n []\n );\n\n const debouncedCallback = useCallback(\n // @ts-ignore\n (...args) => {\n maxWaitArgs.current = args;\n clearTimeout(functionTimeoutHandler.current!);\n\n functionTimeoutHandler.current = setTimeout(() => {\n cancelDebouncedCallback();\n\n if (! isComponentUnmounted.current) {\n debouncedFunction.current(...args);\n }\n }, delay);\n },\n [ delay, cancelDebouncedCallback, functionTimeoutHandler ]\n );\n\n // Вызов debouncedFunction в ручную, например при unmount не дожидаясь таймера\n const callPending = useCallback(() => {\n if (! functionTimeoutHandler.current) {\n return;\n }\n\n debouncedFunction.current.apply(null, maxWaitArgs.current);\n cancelDebouncedCallback();\n }, [ functionTimeoutHandler, debouncedFunction, cancelDebouncedCallback ]);\n\n return [ debouncedCallback as T, callPending ];\n}\n","/* eslint-env browser, node */\nimport React from 'react';\nimport { Idle, NotIdle } from 'idlejs';\n\nconst sessionStorage = typeof window === 'undefined' ? undefined : window.sessionStorage;\n\nconst modalsSelector = 'div[class^=Modal], div[class^=modal-module__container], div[class^=auth], div[class^=base-modal], .CustomerFeedbackDesktop, .FSGallery, body[class*=ymaps]';\n\ninterface IUseIdleParams {\n rememberKey?: string;\n idleOnTabChange?: boolean;\n idleTimeout?: number;\n}\n\nexport const useIdle = (params: IUseIdleParams = {}) => {\n const [ isIdle, setIsIdle ] = React.useState(false);\n const idle = React.useMemo(() => new Idle(), []);\n const windowIdle = React.useMemo(() => new NotIdle(), []);\n const { idleOnTabChange = false, idleTimeout = 10, rememberKey } = params;\n\n const isWatcherEnabled = React.useMemo(() => {\n return rememberKey !== undefined ? sessionStorage?.getItem(rememberKey) === null : true;\n }, [ ]);\n\n const enableIdle = React.useCallback(() => {\n const activeModals = document.querySelectorAll(modalsSelector);\n\n if (! document.hasFocus()) return setIsIdle(false);\n\n if (activeModals.length >= 1) return setIsIdle(false);\n\n setIsIdle(true);\n }, []);\n\n const disableIdle = React.useCallback(() => {\n if (rememberKey !== undefined) {\n sessionStorage?.setItem(rememberKey, rememberKey);\n }\n idle.stop();\n windowIdle.stop();\n setIsIdle(false);\n }, []);\n\n const resetIdle = React.useCallback(() => {\n setIsIdle(false);\n }, []);\n\n React.useEffect(() => {\n if (isWatcherEnabled) {\n idle\n .whenNotInteractive()\n .within(idleTimeout, 1000)\n .do(enableIdle)\n .start();\n } else {\n idle.stop();\n }\n\n if (isWatcherEnabled && idleOnTabChange) {\n windowIdle\n .when([ {\n events: [ 'blur' ],\n target: window\n\n } ])\n .within(1, 1000)\n .do(enableIdle)\n .start();\n } else {\n windowIdle.stop();\n }\n\n return () => {\n idle.stop();\n windowIdle.stop();\n };\n }, [ isWatcherEnabled, idleOnTabChange ]);\n\n return {\n isIdle,\n disableIdle,\n resetIdle\n };\n};\n","import React from 'react';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n useInitialPhoneQuery$data as useInitialPhoneQueryResponse,\n useInitialPhoneQuery$variables as useInitialPhoneQueryVariables\n} from './__generated__/useInitialPhoneQuery.graphql';\n\nconst query = graphql`\n query useInitialPhoneQuery {\n userDetails {\n phone\n }\n }\n`;\n\nfunction useUseInfoFetcher() {\n const gql = useGqlContext();\n\n return React.useCallback(\n (vars: useInitialPhoneQueryVariables = {}, opts?: { signal?: AbortSignal }) => gql.client<\n useInitialPhoneQueryVariables,\n useInitialPhoneQueryResponse\n >(query, vars, opts)\n .then(response => {\n return response;\n }),\n [ gql ]\n );\n}\n\nexport function useInitialPhone() {\n const load = useGql2Loader(useUseInfoFetcher(), { cachePrefix: 'UserDetailsPhone' });\n const data = load({});\n\n return data?.data?.userDetails?.phone ?? '';\n}\n","import { TouchEvent, MouseEvent, useCallback, useState } from 'react';\n\ntype SwipeStateType = {\n touchStart: number;\n touchEnd: number;\n isSwipe: boolean;\n};\n\nconst MIN_SWIPE_DIST = 60;\n\nexport const useSwiper = ({\n onSwipeLeft,\n onSwipeRight\n}: {\n onSwipeLeft: (e?: MouseEvent) => void;\n onSwipeRight: (e?: MouseEvent) => void;\n}): {\n handleTouchStart?: (e: TouchEvent) => void;\n handleTouchMove?: (e: TouchEvent) => void;\n handleTouchEnd?: () => void;\n} => {\n const [ state, setState ] = useState<SwipeStateType>({\n touchStart: 0,\n touchEnd: 0,\n isSwipe: false\n });\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n const { clientX } = e.targetTouches[0];\n\n setState(prevState => ({\n ...prevState,\n touchStart: clientX\n }));\n }, []);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n const { clientX } = e.targetTouches[0];\n\n setState(prevState => ({\n ...prevState,\n isSwipe: true,\n touchEnd: clientX\n }));\n }, []);\n\n const handleTouchEnd = useCallback(() => {\n if (! state.isSwipe) {\n return;\n }\n\n const dist = state.touchStart - state.touchEnd;\n\n if (dist > MIN_SWIPE_DIST) {\n onSwipeLeft();\n }\n\n if (dist < -MIN_SWIPE_DIST) {\n onSwipeRight();\n }\n\n setState(prevState => ({\n ...prevState,\n isSwipe: false\n }));\n }, [ state, onSwipeLeft, onSwipeRight ]);\n\n return {\n handleTouchStart,\n handleTouchMove,\n handleTouchEnd\n };\n};\n","/* global window, document */\nimport { useEffect } from 'react';\n\n/**\n * Passing --vh custom property to root\n */\nexport const useVHProperty = () => {\n useEffect(() => {\n const setVHProperty = () => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n };\n\n setVHProperty();\n\n window.addEventListener('resize', setVHProperty);\n\n return () => {\n window.removeEventListener('resize', setVHProperty);\n };\n }, []);\n};\n","import { OfferRoute } from '@search/offer-search-routes/src/offerRoute';\nimport { Router } from '@search/router/src/Router';\nimport { RouterContext } from '@search/offer-search-routes/src/RouterProvider';\nimport { DealType, NewBuilding, RealtyObjectType, Rooms } from '@search/filter-enums/enums';\n\nexport interface IOfferRouteParams {\n offerId: string;\n dealType: DealType;\n categoryType: RealtyObjectType;\n newBuilding: NewBuilding;\n room?: Rooms;\n region?: number;\n}\n\nexport const makeOfferUrl = (\n router: Router<RouterContext>,\n routeParams: IOfferRouteParams\n): string | null => {\n const { region } = routeParams;\n\n if (region) {\n return new OfferRoute({\n context: {\n ...router.context,\n rootRegions: undefined\n // @todo Надо грузить clasified root regions\n // и передавать его, только если в нем есть регион с id из routeParams.region\n // иначе - передавать в rootRegions undefined, но в таком случае будет редирект на урл с регионом\n },\n location: router.location\n }).url(routeParams);\n }\n\n return null;\n};\n","export const ESCAPE = 'Escape';\nexport const ENTER = 'Enter';\nexport const ARROW_UP = 'ArrowUp';\nexport const ARROW_RIGHT = 'ArrowRight';\nexport const ARROW_DOWN = 'ArrowDown';\nexport const ARROW_LEFT = 'ArrowLeft';\n","import './styles.css';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport classname from '@search/classname/src';\nimport { Typography } from '@vtblife/uikit';\n\nimport { ApplicationIdEnum, MortgagePurpose } from '@search/graphql-typings';\nimport {\n getMinimalBanksMortgageEconomyPercent,\n minimalBanksMortgageParamsFromOffer,\n useMinimalBanksMortgageOverall,\n UseMinimalBanksMortgageStateParams\n} from '../../../common/components/MinimalBanksMortgage/useMinimalBanksMortageState';\nimport { Mortgage2StarterModal } from '../../../common/components/MinimalBanksMortgage/mortgage2/starter/Mortgage2StarterModal';\n\nconst cn = classname.bind(null, 'MinimalBanksMortgageSnippetDesktop');\n\nexport function MinimalBanksMortgageSnippetDesktop(\n {\n className,\n gtm,\n ...stateParams\n }: {\n className?: string;\n gtm?: string;\n ownAmount: number;\n url: string;\n } & UseMinimalBanksMortgageStateParams\n) {\n const { economyFormatted } = getMinimalBanksMortgageEconomyPercent();\n\n const [ isModalOpen, toggleModal ] = useState<boolean>(false);\n const openModal = useCallback(() => toggleModal(true), []);\n const closeModal = useCallback(() => toggleModal(false), []);\n\n return (\n <div className={cn(undefined, undefined, className)}>\n <Typography\n bold\n onClick={openModal}\n variant='primary-alone'\n className={cn('link')}\n >\n Рассчитать ипотеку\n </Typography>\n <Typography\n variant='secondary-alone'\n className={cn('promo')}\n >\n Сэкономьте до {economyFormatted} на ставке вместе с «Метром квадратным»\n </Typography>\n {\n isModalOpen ? (\n <MortgageModal\n {...stateParams}\n onClose={closeModal}\n />\n ) : null\n }\n </div>\n );\n}\n\nexport function MortgageModal({\n url: snippetURL,\n onClose,\n ...stateParams\n}: {\n ownAmount: number;\n url?: string;\n onClose: () => void;\n} & UseMinimalBanksMortgageStateParams) {\n const mortgageParams = minimalBanksMortgageParamsFromOffer(stateParams);\n const {\n minimalBanksMortgageOffers,\n url: calculatorUrl\n } = useMinimalBanksMortgageOverall(mortgageParams);\n\n useEffect(() => {\n if (minimalBanksMortgageOffers?.length === 0) {\n window.open(calculatorUrl, '_blank');\n onClose();\n }\n }, [ calculatorUrl, minimalBanksMortgageOffers, onClose ]);\n\n return minimalBanksMortgageOffers?.length ? (\n <Mortgage2StarterModal\n withoutAuth\n isNewVibe\n alwaysFromWord\n purpose={MortgagePurpose.Primary}\n locationPlacement='сниппет'\n offerUrl={snippetURL}\n gtmSendData={{\n event: 'nb_ib_form',\n action: 'send',\n page_type: 'serp',\n }}\n gtmShowData={{\n event: 'nb_ib_form',\n action: 'open',\n page_type: 'serp',\n }}\n withoutShowContainer\n applicationId={ApplicationIdEnum.NewBuildingsDesktop}\n onClose={onClose}\n realtyType='ProfOfferFlat'\n mortgageRegionId={stateParams.mortgageRegionId}\n propertyCost={stateParams.propertyCost}\n ownAmount={stateParams.ownAmount}\n term={stateParams.term}\n isPreferentialNbCondition\n showMoreBankIcons\n isDefaultSelectedOffer\n mortgageOffers={minimalBanksMortgageOffers}\n />\n ) : null;\n}\n","import React from 'react';\n\nimport { Link, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { NativeDate, NewBuildingNews } from '@search/graphql-typings';\nimport { ImageLazySeo } from '../../../../domain/image/lazy/ImageLazySeo';\nimport { NO_PHOTO_SRC, NO_PHOTO_SRC_SET } from '../../../../domain/newbuilding/libs/constants';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'NewsTinyCard');\n\n// eslint-disable-next-line max-len\nexport type NewsTinyItem = Readonly<Omit<NewBuildingNews, 'id' | 'slug' | 'date' | 'subCategories' | 'tags' | 'viewsCount' | 'readTime'>> & { date: Pick<NativeDate, 'formattedShort'> };\n\nexport const NewsTinyCard = ({\n news,\n isMobile\n}: {\n news: NewsTinyItem;\n isMobile?: boolean;\n}) => (\n <article className={cn(null, { mobile: isMobile })}>\n <Link\n href={news.link}\n text={false}\n target='blank'\n >\n <div className={cn('imageWrapper')}>\n <ImageLazySeo\n loadingLazy='native'\n src={news.images[0] ?? NO_PHOTO_SRC}\n srcSet={news.images[0] ? undefined : NO_PHOTO_SRC_SET}\n className={cn('image')}\n alt={news.title}\n />\n </div>\n <Typography\n variant='secondary-alone'\n color='secondary'\n className={cn('info')}\n >\n {news.date.formattedShort}\n {news.categories[0]?.label ? <>\n <span className={cn('info-separator')}>•</span>\n {news.categories[0]?.label}\n </> : null}\n </Typography>\n\n <Typography\n tag='h4'\n title={news.title}\n className={cn('title')}\n bold\n >\n {news.title}\n </Typography>\n </Link>\n </article>\n);\n\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { NewsTinyItem, NewsTinyCard } from '../../../common/components/NewsTinyCard';\nimport Slider from '../../../common/components/Slider';\n\nimport './styles.css';\n\ninterface INewBuildingNews {\n heading: React.ReactNode;\n news: NewsTinyItem[];\n onClickNewsItem?: () => void;\n}\n\nconst cn = classname.bind(null, 'NewBuildingNews');\n\nexport const NewBuildingNews: React.FC<INewBuildingNews> = ({ heading, news, onClickNewsItem }) => (\n <div className={cn()}>\n {heading}\n <div className={cn('content')}>\n <Slider contentClassName={cn('sliderContent')}>\n {news.map(item => (\n <div\n className={cn('item')}\n key={item.link}\n onClick={onClickNewsItem}\n >\n <NewsTinyCard\n news={item}\n />\n </div>\n ))}\n </Slider>\n </div>\n </div>\n);\n\n","import classname from '@search/classname/src';\n\nimport { graphql } from '@search/gql-client/src';\n\nexport type {\n NewBuildingPromoBannerQuery,\n NewBuildingPromoBannerQuery$variables as NewBuildingPromoBannerQueryVariables,\n NewBuildingPromoBannerQuery$data as NewBuildingPromoBannerQueryResponse\n} from './__generated__/NewBuildingPromoBannerQuery.graphql';\n\nexport const cn = classname.bind(null, 'NewBuildingPromoBanner');\n\nexport const query = graphql`\n query NewBuildingPromoBannerQuery($id: Int!) {\n newBuilding(id: $id) {\n gallery {\n main {\n medium\n large\n }\n images(limit: 1) {\n medium\n }\n }\n title {\n nominative\n }\n priceMin(promo: true)\n routeParams {\n id\n name\n type\n region\n regionId\n subRegion\n }\n routes(type: [ METRO ]) {\n ...on RouteMetro {\n station {\n name\n }\n }\n }\n }\n }\n`;\n\nexport interface IProps {\n view: 'offer' | 'nb';\n id: number;\n disclaimerList: ReadonlyArray<string>;\n developerName: string;\n developerLogo?: string;\n dataGTM?: {\n click?: string;\n phoneClick?: string;\n };\n}\n","import React, { FunctionComponent } from 'react';\n\nimport { Button, Link, Typography } from '@vtblife/uikit';\nimport { List, ListItem } from '@search/vtbeco-frontend-core/domain/newbuilding/components/common/List';\n\nimport Paper from '@search/vtbeco-ui/src/components/Paper';\n\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport { useGql } from '@search/gql-client/src';\nimport { useGtmOnVisible } from '../../../../domain/google/useGtmOnVisible';\nimport type { DeveloperPromoEventResult } from '../../../../domain/newbuilding/developer-promo/analytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport { getNewBuildingLink } from '../../../selectors/get_new_building_link';\nimport {\n cn, query, IProps,\n NewBuildingPromoBannerQueryVariables, NewBuildingPromoBannerQueryResponse\n} from '../../../common/components/NewBuildingPromoBanner';\nimport Image from '../../../common/components/Image';\n\nimport './styles.css';\n\nconst NewBuildingPromoBanner: FunctionComponent<IProps & {\n gtmClickData?: { event: string } | DeveloperPromoEventResult;\n gtmShowData?: { event: string } | DeveloperPromoEventResult;\n erid: string;\n}> = ({\n view,\n id,\n developerName,\n disclaimerList,\n developerLogo,\n dataGTM = {},\n gtmClickData,\n gtmShowData,\n erid\n}) => {\n const res = useGql<NewBuildingPromoBannerQueryVariables, NewBuildingPromoBannerQueryResponse>(query, { id });\n const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const onVisible = React.useCallback(() => {\n gtmShowData && dataLayerPush(gtmShowData);\n }, [ gtmShowData, dataLayerPush ]);\n\n useGtmOnVisible({ containerRef, onVisible });\n\n const newBuilding = res.data?.newBuilding;\n\n const mainImg = newBuilding?.gallery?.main?.medium;\n const firstImg = newBuilding?.gallery?.images?.[0]?.medium;\n\n const { priceMin, routes } = { ...newBuilding };\n\n const metroName = routes && routes[0]?.station?.name;\n\n const formattedPriceMin = priceMin ? `${formatRange(priceMin, null, {\n billionsAsString: true\n })} ₽` : null;\n\n const formattedMetroName = (metroName && metroName.length > 0) ? `метро «${metroName}»` : null;\n\n const listItems = [ formattedPriceMin, formattedMetroName ].filter(Boolean);\n\n const link = newBuilding ? getNewBuildingLink({\n id: newBuilding.routeParams.id,\n type: newBuilding.routeParams.type,\n name: newBuilding.routeParams.name,\n regionId: newBuilding.routeParams.regionId,\n region: newBuilding.routeParams.region,\n subRegion: newBuilding.routeParams.subRegion\n }) : '';\n\n return (\n <Paper\n role='button'\n dataTest='new-building-promo-banner-click'\n className={cn(null, { view })}\n onClick={() => gtmClickData && dataLayerPush(gtmClickData)}\n ref={containerRef}\n >\n <div className={cn('badgeWrapper')}>\n <Typography\n variant='small-alone'\n color='secondary'\n >\n Реклама\n </Typography>\n </div>\n <div className={cn('gallery')}>\n {mainImg && (<div\n className={cn('image')}\n style={{ background: `url(${mainImg}` }}\n />)}\n {firstImg && (<div\n key={firstImg}\n className={cn('image')}\n style={{ background: `url(${firstImg}` }}\n />)}\n </div>\n <div className={cn('main')}>\n <Typography\n variant='h3'\n color={res.loading ? 'minor' : undefined}\n >\n {newBuilding?.title.nominative ?? '___'}\n </Typography>\n { listItems.length ? (\n <List\n className={cn('info')}\n separator={\n <Typography\n tag='span'\n color='blue'\n bold\n >\n •\n </Typography>\n }\n >\n {listItems.map((item, index) => (\n <ListItem key={index}>\n <Typography\n color='blue'\n tag='span'\n bold\n >\n {item}\n </Typography>\n </ListItem>\n ))}\n </List>\n ) : null }\n <div className={cn('extra')}>\n <div className={cn('button')}>\n <Button\n variant='secondary'\n fullWidth\n size='s'\n >\n Смотреть квартиры\n </Button>\n </div>\n <div className={cn('disclaimer')}>\n {\n disclaimerList.map((disclaimer, idx) => (\n <Typography\n key={idx}\n variant='tiny-alone'\n color='minor'\n >\n <div dangerouslySetInnerHTML={{\n __html: disclaimer\n }} />\n </Typography>\n ))\n }\n </div>\n </div>\n </div>\n <Image\n className={cn('developerLogo', {\n [developerName]: true\n })}\n url={developerLogo}\n />\n <Link\n dataTest='new-building-promo-banner-link-click'\n href={! newBuilding ? '#' : `${link}?erid=${erid}`}\n gtm={dataGTM.click}\n target='blank'\n />\n </Paper>\n );\n};\n\nexport default NewBuildingPromoBanner;\n","import { regionMapper } from '@search/offer-search-routes/src/mappers/regions';\nimport { SusaninRoute } from '@search/router/src';\n\nexport const getNewBuildingLink = (props: {\n id: number;\n type: string;\n name: string;\n regionId: number;\n region: number | string;\n subRegion?: string | null;\n relativeUrl?: boolean;\n} | {\n id?: undefined;\n slug?: string;\n subRegion?: string | null;\n regionId: number;\n region: number | string;\n relativeUrl?: boolean;\n}) => {\n const parts: string[] = [];\n\n if (props.subRegion) parts.push(props.subRegion);\n if (props.id !== undefined) parts.push(`${props.type}-${props.name}-${props.id}`);\n else {\n if (props.slug) parts.push(props.slug);\n }\n\n const route = new SusaninRoute({\n context: {\n preferRelativeUrl: props?.relativeUrl,\n onlyRelativeUrl: props?.relativeUrl\n }\n });\n const regionId = typeof props.region === 'number' ? props.region : props.regionId;\n const rec = route.regionParams(regionId);\n let regionSlug = typeof props.region === 'string' ? props.region : regionMapper.typesMap[\n props.region as keyof typeof regionMapper.Type\n ] ?? rec.region;\n\n if (route.isDomainOnlySlug(regionId)) regionSlug = '';\n\n return `${rec.origin ?? ''}/${regionSlug ? `${regionSlug}/` : ''\n }novostroyki/${parts.length ? `${parts.join('/')}/` : ''}`;\n};\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'NavButtons');\n\nexport type ArrowDirection = 'left' | 'right';\n\ninterface IPropsButtonArrow {\n direction: ArrowDirection;\n}\n\nconst Arrow = ({\n direction\n}: IPropsButtonArrow) => (\n <div className={cn('arrow', { direction })}>\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n // eslint-disable-next-line max-len\n d='M14.6026 19.2746C15.0013 19.6568 15.6477 19.6568 16.0464 19.2746L16.2648 19.0652C16.6636 18.6831 16.6636 18.0635 16.2648 17.6813L10.3377 12L16.2648 6.31874C16.6635 5.93657 16.6635 5.31695 16.2648 4.93479L16.0464 4.72541C15.6477 4.34324 15.0012 4.34324 14.6025 4.72541L7.96303 11.0895C7.95981 11.0925 7.9566 11.0955 7.95341 11.0986L7.73497 11.308C7.57531 11.461 7.47958 11.6521 7.44779 11.8508C7.40014 12.1483 7.49586 12.4629 7.73494 12.6921L7.95339 12.9014C7.95712 12.905 7.96088 12.9086 7.96466 12.9121L14.6026 19.2746Z'\n fill='white'\n />\n </svg>\n </div>\n);\n\ninterface IPropsNavButtons {\n handleClickArrow: (type: ArrowDirection) => void;\n isLastImage: boolean;\n isFirstImage: boolean;\n isActive?: boolean;\n isClSnippet?: boolean;\n}\n\nconst NavButtons = ({ handleClickArrow, isLastImage, isFirstImage, isActive, isClSnippet }: IPropsNavButtons) => {\n const handleClickArrowByType = (arrowType: ArrowDirection) => (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n handleClickArrow(arrowType);\n };\n\n return (\n <div className={cn(undefined, { active: isActive })}>\n {! isFirstImage && (\n <button\n className={cn('left-btn', { clSnippet: isClSnippet })}\n onClick={handleClickArrowByType('left')}\n data-test='desktop-snippet-gallery-arrow-left'\n >\n <Arrow direction='left' />\n </button>\n )}\n {! isLastImage && (\n <button\n className={cn('right-btn', { clSnippet: isClSnippet })}\n onClick={handleClickArrowByType('right')}\n data-test='desktop-snippet-gallery-arrow-right'\n >\n <Arrow direction='right' />\n </button>\n )}\n </div>\n );\n};\n\nexport default NavButtons;\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { ImageLazySeo } from '../../../../../../../domain/image/lazy/ImageLazySeo';\nimport { ImageAttributesTypeEnum } from '../../../../../../../enums';\nimport './styles.css';\n\nimport { IImage } from '../index';\n\nconst cn = classname.bind(null, 'GalleryPreview');\n\ninterface IProps extends IImage {\n originPath?: string;\n /**\n * @deprecated baseUrl + originPath\n */\n src?: string;\n /**\n * @deprecated baseUrl + originPath\n */\n src2x?: string;\n size: 'full' | 'average' | 'minimum' | 'small' | 'least' | 'contain';\n isFrozen?: boolean;\n isLast?: boolean;\n isFirst?: boolean;\n attributesType?: keyof typeof ImageAttributesTypeEnum | null;\n restCount: number;\n itemScope?: boolean;\n imageDataset?: Record<string, string>;\n /**\n * @default 280\n */\n resizeImageWidth?: number;\n /**\n * @default 210\n */\n resizeImageHeight?: number;\n}\n\nfunction GalleryPreview({\n originPath,\n src2x,\n description,\n size,\n isFrozen,\n attributesType,\n isFirst,\n isLast,\n restCount,\n itemScope,\n imageDataset,\n resizeImageWidth = 560,\n resizeImageHeight = 420\n}: IProps) {\n return (<>\n <ImageLazySeo\n itemScope={itemScope}\n dataSet={imageDataset}\n loadingLazy={isFirst ? 'native' : 'io'}\n className={cn('image', {\n size,\n frozen: isFrozen,\n layout: attributesType === ImageAttributesTypeEnum.LAYOUT\n })}\n originPath={originPath}\n srcWidth={resizeImageWidth}\n srcHeight={resizeImageHeight}\n src={src2x}\n alt={description}\n title={description}\n />\n {isLast && restCount > 0 && (\n <div\n className={cn('last-image')}\n data-test='snippet-gallery-last-photo'\n >\n Ещё {restCount} фото\n </div>\n )}\n </>);\n}\n\nexport default GalleryPreview;\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\nimport { ImageLazySeo } from '../../../../../../../domain/image/lazy/ImageLazySeo';\nimport { IThumbnail } from '../index';\n\nconst cn = classname.bind(null, 'ThumbnailSnippet');\n\ninterface IProps extends IThumbnail {\n src?: string;\n baseUrl?: string;\n originPath?: string;\n handleSetActiveImageIndex?: () => void;\n isLast?: boolean;\n restCount: number;\n isFrozen?: boolean;\n withLazyLoad?: boolean;\n}\n\nconst ThumbnailSnippet: React.FC<IProps> = ({\n src,\n originPath,\n handleSetActiveImageIndex = () => { },\n isLast = false,\n restCount,\n isFrozen,\n withLazyLoad,\n description\n}) => (\n <div\n className={cn()}\n onMouseEnter={handleSetActiveImageIndex}\n >\n <ImageLazySeo\n // В хроме будет нативный lazy, который нормально предзагружается\n // В сафари - будет фолбэк до жадной загрузки\n // withLazyLoad - true только у первого снипета\n itemProp='thumbnail'\n loadingLazy={withLazyLoad ? 'native' : undefined}\n className={cn('item', { frozen: isFrozen })}\n src={src}\n srcWidth={90}\n srcHeight={60}\n originPath={originPath}\n alt={description}\n title={description}\n />\n {isLast && (restCount > 0) && (\n <div className={cn('last')}>\n +{restCount}\n </div>\n )}\n </div>\n);\n\nexport default ThumbnailSnippet;\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { ImageAttributesTypeEnum } from '../../../../../../enums';\nimport GalleryPreview from './GalleryPreview';\nimport ThumbnailSnippet from './ThumbnailSnippet';\nimport NavButtons, { ArrowDirection } from './NavButtons';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GallerySnippet');\n\nexport interface IImage {\n id: string | number;\n originPath?: string;\n src?: string;\n src2x?: string;\n description: string;\n attributesType?: keyof typeof ImageAttributesTypeEnum | null;\n}\n\nexport interface IThumbnail extends IImage {\n preview?: string;\n preview2x?: string;\n}\n\nexport interface IGallerySnippet {\n className?: string;\n pictures: IImage[];\n onClick?: () => void;\n onActiveImageChange?: (index: number) => void;\n isFrozen?: boolean;\n isVisited?: boolean;\n withLazyLoad?: boolean;\n counterEnabled?: boolean;\n maxPicturesCount?: number;\n isActive?: boolean;\n isClSnippet?: boolean;\n miniImagesEnabled?: boolean;\n relativeSize?: boolean;\n imageDataset?: Record<string, string>;\n previewSize?: 'full' | 'average' | 'below-average' | 'minimum' | 'small' |'least';\n}\n\nconst GallerySnippet: React.FC<IGallerySnippet> = React.memo(({\n className,\n children,\n pictures,\n onClick,\n onActiveImageChange,\n isFrozen,\n isVisited,\n withLazyLoad,\n counterEnabled = false,\n maxPicturesCount = 4,\n isActive = false,\n miniImagesEnabled = true,\n relativeSize = false,\n imageDataset,\n previewSize,\n isClSnippet\n}) => {\n const mainRef = useRef<HTMLDivElement | null>(null);\n const [ activeImageIndex, setActiveImageIndex ] = useState(0);\n const hasThumbs = pictures.length > 1;\n const visiblePictures = pictures.slice(0, maxPicturesCount);\n const lastImageIndex = visiblePictures.length - 1;\n const restPicturesCount = pictures.length - visiblePictures.length;\n\n const handleClickArrow = (arrowDirection: ArrowDirection) => {\n if (arrowDirection === 'left') {\n // Если эта первая фотография и мы нажимаем влево – показываем последнее фото\n const newActiveImageIndex = activeImageIndex === 0 ? lastImageIndex : activeImageIndex - 1;\n\n setActiveImageIndex(newActiveImageIndex);\n } else {\n // Если эта последняя фотография и мы нажимаем вправо – показываем первое фото\n const newActiveImageIndex = activeImageIndex === lastImageIndex ? 0 : activeImageIndex + 1;\n\n setActiveImageIndex(newActiveImageIndex);\n }\n };\n\n const handleSetActiveImageIndex = useCallback((index: number) => () => setActiveImageIndex(index), []);\n const resetActiveImageIndex = useCallback(() => setActiveImageIndex(0), []);\n\n useEffect(() => {\n onActiveImageChange && onActiveImageChange(activeImageIndex);\n }, [ activeImageIndex, onActiveImageChange ]);\n\n if (! visiblePictures.length) {\n return (\n <div className={cn('empty', { relativeSize })}>\n <Icon\n name='camera-crossed'\n size='xl'\n />\n </div>\n );\n }\n\n const activeImage = visiblePictures[activeImageIndex] || null;\n const isLastImage = activeImageIndex === lastImageIndex;\n const size = previewSize ?? (hasThumbs ? 'minimum' : 'average');\n\n return (\n <div\n ref={mainRef}\n className={cn(null, { visited: isVisited }, className)}\n onClick={onClick}\n onMouseLeave={resetActiveImageIndex}\n >\n <div className={cn('preview', { isActive })}>\n {hasThumbs && (\n <NavButtons\n isActive={isActive}\n isLastImage={isLastImage}\n isFirstImage={activeImageIndex === 0}\n handleClickArrow={handleClickArrow}\n isClSnippet={isClSnippet}\n />\n )}\n {counterEnabled && pictures.length > 0 ? (\n <div className={cn('counter')}>\n {activeImageIndex + 1} / {pictures.length}\n </div>\n ) : null}\n <GalleryPreview\n {...activeImage}\n itemScope\n isLast={isLastImage}\n isFirst={activeImageIndex === 0}\n restCount={restPicturesCount}\n size={size}\n isFrozen={isFrozen}\n imageDataset={imageDataset}\n />\n </div>\n\n {miniImagesEnabled && visiblePictures.length > 1 && (\n <div className={cn('list')}>\n {visiblePictures.map(\n (thumbnail, index) => (\n <ThumbnailSnippet\n {...thumbnail}\n withLazyLoad={withLazyLoad}\n key={`${thumbnail.id}-${index}`}\n isLast={index === maxPicturesCount - 1}\n restCount={restPicturesCount}\n handleSetActiveImageIndex={handleSetActiveImageIndex(index)}\n isFrozen={isFrozen}\n />\n )\n )}\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nexport default GallerySnippet;\n","import React, { useCallback, ReactNode } from 'react';\nimport Grid from '@vtblife/uikit-grid';\n\nimport { SizeEnum, ModeEnum, Maybe } from '@search/vtbeco-ui/src/types';\n\nimport { ICheckboxProps } from '@search/vtbeco-ui/src/components/controls/Checkbox';\nimport { ICheckboxGroupProps } from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\n\nexport interface ICheckboxGroupModificationProps {\n withoutGrid?: boolean;\n classNameGroup?: string;\n}\n\nexport const CheckboxGroup2: React.FunctionComponent<\n ICheckboxGroupProps & { colRestriction?: number; isFilter?: boolean } & ICheckboxGroupModificationProps\n> = ({\n name,\n value,\n children,\n disabled,\n onChange,\n mode = ModeEnum.CHECK,\n size = SizeEnum.S,\n colRestriction,\n withoutGrid,\n classNameGroup,\n isFilter = false\n}) => {\n const handleChildCheck = useCallback((\n checked: boolean,\n childProps: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>}\n ) => {\n let newValue: string | null | string[] = [];\n const childValue: string = childProps.value as string;\n\n switch (true) {\n case (checked && ModeEnum.CHECK === mode):\n // @ts-ignore\n newValue = [].concat(value).filter(a => a === 0 || Boolean(a)).concat(childValue);\n break;\n case (checked && ModeEnum.RADIO_CHECK === mode):\n case (checked && ModeEnum.RADIO === mode):\n newValue = childValue;\n break;\n case (! checked && ModeEnum.RADIO === mode):\n newValue = value;\n break;\n case (! checked && ModeEnum.RADIO_CHECK === mode):\n newValue = null;\n break;\n case (! checked && ModeEnum.CHECK === mode):\n // @ts-ignore\n newValue = [].concat(value).filter(item => item !== childValue);\n break;\n default:\n newValue = [];\n }\n\n onChange(newValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ onChange, disabled, value ]);\n\n const handleChildCheckFilter = useCallback((childValue?: string) => (checked: boolean) => {\n if (! childValue) {\n return;\n }\n\n let newValue: string | null | string[] = [];\n\n switch (true) {\n case (checked && ModeEnum.CHECK === mode):\n const filteredValue = [ ...value ].filter(a => a !== childValue);\n\n newValue = [ ...filteredValue, childValue ];\n break;\n case (checked && ModeEnum.RADIO_CHECK === mode):\n case (checked && ModeEnum.RADIO === mode):\n newValue = [ childValue ];\n break;\n case (! checked && ModeEnum.RADIO === mode):\n newValue = value;\n break;\n case (! checked && ModeEnum.RADIO_CHECK === mode):\n case (! checked && ModeEnum.CHECK === mode):\n newValue = [ ...value ].filter(a => a !== childValue);\n break;\n default:\n newValue = [];\n }\n\n onChange(newValue);\n }, [ onChange, disabled, value ]);\n\n const renderChildren = (<>\n {\n // @ts-ignore\n React.Children.map(children, (child: React.ReactElement<ICheckboxProps>): ReactNode => {\n const checkedValue = isFilter ? child.props.name : child.props.value as string;\n\n // eslint-disable-next-line\n const checked = value && checkedValue !== undefined ? value.includes(checkedValue) : false;\n\n const elemProps = isFilter ? {\n ...child.props,\n value: checked,\n disabled: disabled ?? child.props.disabled,\n onChange: handleChildCheckFilter(child.props.name),\n radio: mode === ModeEnum.RADIO\n } : {\n ...child.props,\n name: `${name ?? ''}-${String(child.props.value ?? '')}`,\n checked,\n disabled: disabled ?? child.props.disabled,\n size: size ?? child.props.size,\n onCheck: handleChildCheck\n };\n const elem = (\n React.cloneElement(child, elemProps as ICheckboxProps)\n );\n\n return (\n withoutGrid ? <>{elem}</> : <Grid.Cell>{elem}</Grid.Cell>\n );\n })\n }\n </>);\n\n if (! children?.length) {\n return null;\n }\n\n return (\n withoutGrid ? (\n <div className={classNameGroup}>\n {renderChildren}\n </div>\n ) : (\n <Grid\n cols={colRestriction ?? children?.length}\n variables={{\n '--row-gap-xs': '20px',\n '--row-gap-s': '20px',\n '--row-gap-m': '20px',\n '--row-gap-l': '20px',\n '--row-gap-xl': '20px',\n '--column-gap-xs': '20px',\n '--column-gap-s': '20px',\n '--column-gap-m': '20px',\n '--column-gap-l': '20px',\n '--column-gap-xl': '20px'\n }}\n >\n {renderChildren}\n </Grid>\n )\n );\n};\n","import React from 'react';\nimport { forwardRef, ReactNode, memo, ReactChild, MouseEventHandler } from 'react';\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport type FilterSelectButtonBorderSide = 'square' | 'rounded_square' | 'square_rounded';\nexport type FilterSelectSize = 'm' | 'l' | 'xl';\n\ninterface FilterSelectButtonProps {\n dataTest?: string;\n children: ReactChild | undefined;\n icon?: ReactNode;\n focused?: boolean;\n className?: string;\n size?: FilterSelectSize;\n side?: FilterSelectButtonBorderSide;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n style?: object;\n}\n\nconst cnFilterSelectButton = classname.bind(null, 'FilterSelectButton');\n\nexport const FilterSelectButton = memo(\n forwardRef<HTMLButtonElement, FilterSelectButtonProps>(({\n focused,\n side,\n icon,\n size,\n className,\n dataTest,\n ...props\n }, ref) => {\n return (\n <button\n {...props}\n ref={ref}\n className={cnFilterSelectButton(null, {\n side,\n size,\n focused\n }, className)}\n data-test={dataTest}\n >\n <span className={cnFilterSelectButton('text')}>\n {props.children}\n </span>\n {icon}\n </button>\n );\n })\n);\n","import React, { useCallback } from 'react';\nimport { NumberInput, Group } from '@vtblife/uikit';\n\nimport { IRange, RangeValue } from '../../../types/IRange';\n\nexport enum NumberFormats {\n /**\n * С разделителями (пробелы)\n */\n Default = 'DEFAULT',\n /**\n * Без разделителей\n */\n OrdinalNumber = 'ORDINAL_NUMBER',\n}\n\nexport interface IRangeInputProps {\n size?: 's' | 'm' | 'l';\n valueFrom: number|null;\n valueTo: number|null;\n type?: 'text' | 'number';\n unit?: string;\n fromPostfix?: string;\n className?: string;\n onChange: (range: IRange<RangeValue>) => void;\n fromLabel?: string;\n toLabel?: string;\n focusFrom?: (e: React.SyntheticEvent) => void;\n focusTo?: (e: React.SyntheticEvent) => void;\n format?: NumberFormats;\n nameFrom?: string;\n nameTo?: string;\n max?: number;\n disabled?: boolean;\n}\n\nexport const RangeInput: React.FC<IRangeInputProps> = ({\n size = 'm',\n valueFrom,\n valueTo,\n unit,\n fromPostfix,\n fromLabel = 'от',\n toLabel = 'до',\n focusFrom = () => {},\n focusTo = () => {},\n onChange,\n format = NumberFormats.Default,\n nameFrom = 'from',\n nameTo = 'to',\n max = 1_000_000_000_000,\n disabled = false\n}) => {\n const formatOnChange = useCallback((value: string | null | number) => {\n const v = Number((value ?? 0).toString().replace(/\\s/g, ''));\n\n return (v !== 0 && ! isNaN(v)) ? v : null;\n }, [ ]);\n\n const handleChangeRangeFrom = useCallback(\n (value: null | number) => {\n onChange({\n from: formatOnChange(value),\n to: formatOnChange(valueTo)\n });\n },\n [ valueTo, onChange, formatOnChange ]\n );\n\n const handleChangeRangeTo = useCallback(\n (value: null | number) => {\n onChange({\n from: formatOnChange(valueFrom),\n to: formatOnChange(value)\n });\n },\n [ valueFrom, onChange, formatOnChange ]\n );\n\n return (\n <Group size={size}>\n <NumberInput\n size={size}\n type='text'\n separator={format === NumberFormats.Default}\n name={nameFrom}\n placeholder={fromLabel}\n postfix={fromPostfix}\n onFocus={focusFrom}\n inputMode='numeric'\n value={valueFrom ?? undefined}\n onChange={handleChangeRangeFrom}\n max={max}\n disabled={disabled}\n />\n <NumberInput\n size={size}\n name={nameTo}\n type='text'\n separator={format === NumberFormats.Default}\n placeholder={toLabel}\n postfix={unit}\n onFocus={focusTo}\n inputMode='numeric'\n value={valueTo ?? undefined}\n onChange={handleChangeRangeTo}\n max={max}\n disabled={disabled}\n />\n </Group>\n );\n};\n","import React, { useCallback } from 'react';\nimport { IRangeInputProps, RangeInput } from '../NewRangeInput/RangeInput';\nimport { INumberRange } from '../../../types/IRange';\n\ninterface INumberInputRangeProps extends Omit<IRangeInputProps, 'value' | 'onChange' | 'valueFrom' | 'valueTo'> {\n value?: INumberRange;\n onChange: (value: INumberRange) => void;\n disabled?: boolean;\n}\n\nexport const NumberInputRange: React.FC<INumberInputRangeProps> = ({\n value,\n onChange,\n disabled = false,\n ...rangeInputProps\n}) => {\n const handleChange = useCallback(({ from, to }: INumberRange) => {\n onChange({\n from,\n to\n });\n }, [ onChange ]);\n\n return (\n <RangeInput\n valueFrom={value ? value.from : null}\n valueTo={value ? value.to : null}\n onChange={handleChange}\n disabled={disabled}\n {...rangeInputProps}\n />\n );\n};\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport './Filter.css';\n\nconst cn = classname.bind(null, 'Filter');\n\ninterface IProps {\n className?: string;\n filterTitle?: string;\n}\n\nexport const Filter: React.FC<IProps> = ({ className, filterTitle, children }) => (\n <div className={className}>\n <div className={cn('filter-title')}>\n <Typography\n variant='secondary-alone'\n color='secondary'\n >\n {filterTitle}\n </Typography>\n </div>\n <div>\n {children}\n </div>\n </div>\n);\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport './MobileFilter.css';\n\nconst cn = classname.bind(null, 'MobileFilter');\n\ninterface IProps {\n filterTitle?: string;\n className?: string;\n}\n\nfunction MobileFilterTitle({ children }: { children: React.ReactChild }) {\n return (\n <Typography\n variant='secondary-alone'\n color='secondary'\n className={`col-xs-12 ${cn('filter-title')}`}\n >\n {children}\n </Typography>\n );\n}\n\nconst MobileFilter: React.FC<IProps> = ({ filterTitle, children, className }) => {\n return (\n <>\n {filterTitle && (<MobileFilterTitle>{filterTitle}</MobileFilterTitle>)}\n <div className={className}>\n {children}\n </div>\n </>\n );\n};\n\nexport default MobileFilter;\n","import './MobileFilter2.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MobileFilter2');\n\ninterface IProps {\n filterTitle?: string | React.ReactNode;\n className?: string;\n childrenClassName?: string;\n dataTestId?: string;\n desktopTitleGap?: boolean;\n}\n\nexport const MobileFilter2: React.FC<IProps> = ({\n filterTitle,\n children,\n className,\n desktopTitleGap,\n dataTestId = null,\n childrenClassName\n}) => {\n return filterTitle ? (\n <div className={className} data-testid={dataTestId}>\n {filterTitle && (\n <Typography\n variant='secondary-alone'\n color='secondary'\n className={cn('filter-title', { desktopTitleGap }, className)}\n >\n {filterTitle}\n </Typography>\n )}\n <div className={childrenClassName}>\n {children}\n </div>\n </div>\n ) : (\n <div className={childrenClassName ?? className} data-testid={dataTestId}>\n {children}\n </div>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { IsApartmentsOptions } from '@search/filter-enums/enums/IsApartmentsOptions';\n\nimport { ApartmentFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ninterface IApartmentFilterProps {\n filter: ApartmentFilter;\n handleChange: (filter: ApartmentFilter) => void;\n}\n\nconst apartmentsMapping: Record<string, string> = {\n [IsApartmentsOptions.APARTMENTS_ONLY]: 'Апартаменты',\n [IsApartmentsOptions.NO_APARTMENTS]: 'Без апартаментов'\n};\n\nconst apartmentEnumeration: IsApartmentsOptions[] = [\n IsApartmentsOptions.APARTMENTS_ONLY,\n IsApartmentsOptions.NO_APARTMENTS\n];\n\nexport const DesktopApartmentFilterView: React.FC<IApartmentFilterProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n handleChange(new ApartmentFilter(val));\n }, [ handleChange ]);\n\n const component = apartmentEnumeration.map(apartment => {\n return (\n <Checkbox\n variant='filter'\n key={apartment}\n name={String(apartment)}\n block\n >\n {apartmentsMapping[apartment]}\n </Checkbox>\n );\n });\n\n return (\n <Filter2 filterTitle='Апартаменты'>\n <CheckboxGroup2\n mode='radio-check'\n name='apartment'\n onChange={onChange}\n value={[ filter.isApartment ].map(elem => String(elem))}\n isFilter\n >\n {component}\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { AreaFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IAreaFilterProps extends IFilterAvailableProps {\n filter: AreaFilter;\n handleChange: (value: AreaFilter) => void;\n isMobile?: boolean;\n}\n\nexport const AreaFilterView: React.FC<IAreaFilterProps> = ({\n filter,\n handleChange,\n withoutTitle,\n isMobile\n}) => {\n const handleAreaChange = useCallback((value: INumberRange) => {\n handleChange(new AreaFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Площадь'} dataTestId='AreaFilterView'>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n fromPostfix='м²'\n value={filter.value}\n onChange={handleAreaChange}\n nameFrom='areaFrom'\n nameTo='areaTo'\n max={100_000}\n />\n </MobileFilter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { Bathroom } from '@search/filter-enums/enums/Bathroom';\n\nimport { BathroomFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ntype BathroomEnumForUi = Exclude<Bathroom, Bathroom.UNKNOWN>;\ninterface IBathroomFilterProps {\n filter: BathroomFilter;\n handleChange: (value: BathroomFilter) => void;\n several?: boolean;\n}\n\nconst bathroomMapping: Record<BathroomEnumForUi, string> = {\n [Bathroom.COMBINED]: 'Совмещённый',\n [Bathroom.PARTED]: 'Раздельный',\n [Bathroom.SEVERAL]: 'Несколько'\n};\n\nconst bathroomEnumeration: BathroomEnumForUi[] = [\n Bathroom.COMBINED,\n Bathroom.PARTED\n];\n\nexport const BathroomFilterView: React.FC<IBathroomFilterProps> = ({\n filter,\n handleChange,\n several = false\n}) => {\n const onChange = useCallback(value => {\n handleChange(new BathroomFilter(value));\n }, [ handleChange ]);\n const component = bathroomEnumeration.map(bathroom => {\n return (\n <Checkbox\n variant='filter'\n key={bathroom}\n name={bathroom}\n block\n >\n {bathroomMapping[bathroom]}\n </Checkbox>\n );\n });\n\n several && component.push(\n <Checkbox\n variant='filter'\n key={Bathroom.SEVERAL}\n value={Bathroom.SEVERAL}\n block\n >\n {bathroomMapping[Bathroom.SEVERAL]}\n </Checkbox>\n );\n\n return (\n <Filter2 filterTitle='Санузел'>\n <CheckboxGroup2\n mode='check'\n onChange={onChange}\n name='bathroom'\n value={filter.value as unknown as string[]}\n isFilter\n >\n {component}\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { CeilingHeight } from '@search/filter-enums/enums/CeilingHeight';\n\nimport { CellHeightFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ninterface ICeilHeightFilterProps {\n filter: CellHeightFilter;\n handleChange: (value: CellHeightFilter) => void;\n}\n\nconst ceilHeightEnumeration = [\n { title: '2,5 м', value: CeilingHeight.FROM_2_5 },\n { title: '2,7 м', value: CeilingHeight.FROM_2_7 },\n { title: '3 м', value: CeilingHeight.FROM_3 },\n { title: '4 м', value: CeilingHeight.FROM_4 }\n];\n\nexport const CeilHeightFilterView: React.FC<ICeilHeightFilterProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new CellHeightFilter(Number(value)));\n }, [ handleChange ]);\n\n const component = ceilHeightEnumeration.map((height, i) => {\n return (\n <Checkbox\n variant='filter'\n key={height.value}\n name={height.value}\n block\n >\n от {height.title}\n </Checkbox>\n );\n });\n const value = (filter.value) ? [ filter.value ] : [];\n\n return (\n <Filter2 filterTitle='Высота потолков'>\n <CheckboxGroup2\n mode='radio-check'\n onChange={onChange}\n name='ceilHeight'\n value={value}\n isFilter\n >\n {component}\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\nimport CheckboxGroup from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\nimport Checkbox from '@search/vtbeco-ui/src/components/controls/Checkbox';\n\nexport type MultiSelectValue = string[] | number[] | null;\n\nexport interface MultiSelectOption<Value> {\n label: string;\n value: Value;\n className?: string;\n disabled?: boolean;\n description?: string;\n}\n\nexport function MultiSelect<Value, Option extends MultiSelectOption<Value>>({\n value,\n name,\n className,\n dataTest,\n options,\n handleChange: onChange\n}: {\n value?: Value[];\n name: string;\n dataTest?: string;\n className?: string;\n options: Option[];\n handleChange: (value: Value[], oldValue?: Value[]) => void;\n}) {\n const handleChange = useCallback((newValue: Value[] | null) => {\n if (newValue === null) {\n return;\n }\n\n onChange(newValue, value);\n }, [ onChange, value ]);\n\n const component =\n options.map(({\n label,\n value: optionValue,\n className: optionClassname,\n description,\n disabled,\n ...rest\n }) => {\n return (<Checkbox\n width='max'\n disabled={disabled}\n type='button'\n view='primary'\n tone='secondary'\n key={String(optionValue)}\n\n // @ts-ignore\n value={optionValue}\n className={optionClassname}\n {...rest}\n >\n {label}\n </Checkbox>);\n });\n\n return (\n <CheckboxGroup\n className={className}\n dataTest={dataTest}\n mode='check'\n // @ts-ignore\n onChange={handleChange}\n name={name}\n // @ts-ignore\n value={value}>\n {component}\n </CheckboxGroup>\n );\n}\n","import React, { useCallback } from 'react';\nimport CheckboxGroup from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\nimport Checkbox from '@search/vtbeco-ui/src/components/controls/Checkbox';\n\nexport type RadioValue = string | number | null | undefined;\n\nexport interface RadioOption {\n label: string;\n value: RadioValue;\n className?: string;\n disabled?: boolean;\n}\n\ninterface RadioSelectProps {\n value: RadioValue | null;\n name: string;\n className?: string;\n options: RadioOption[];\n allowNull?: boolean;\n handleChange: (value: RadioValue, oldValue: RadioValue) => void;\n}\n\nexport const RadioSelect: React.FC<RadioSelectProps> = ({\n value,\n name,\n className,\n options,\n allowNull = false,\n handleChange: onChange\n}) => {\n const handleChange = useCallback((newValue: string[] | string | number | null) => {\n if (! allowNull && newValue === null) {\n return;\n }\n\n onChange(newValue as RadioValue, value);\n }, [ onChange, value ]);\n const component =\n options.map(({\n label,\n value: optionValue,\n className: optionClassname,\n disabled\n }) => {\n return (\n <Checkbox\n className={optionClassname}\n width='max'\n disabled={disabled}\n type='button'\n view='primary'\n tone='secondary'\n // @ts-ignore\n key={optionValue}\n // @ts-ignore\n value={optionValue}\n >\n {label}\n </Checkbox>\n );\n });\n\n return (\n <CheckboxGroup\n className={className}\n mode='radio-check'\n onChange={handleChange}\n name={name}\n // @ts-ignore\n value={[ value ]}>\n {component}\n </CheckboxGroup>\n );\n};\n","import React, { useCallback } from 'react';\nimport upperFirst from 'lodash/upperFirst';\n\nimport { NumberInput, Typography } from '@vtblife/uikit';\nimport { Dropdown, Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport { INumberRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport {\n IFilter, AreaFilter, LivingAreaFilter, KitchenAreaFilter\n} from '../../../../models/Filter';\n\nimport { FilterSelectButton } from '../../../common/FilterSelect';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\nimport './DesktopAreaFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopAreaFilterView');\n\nconst formatAreaRange = (\n { from, to }: INumberRange,\n prefix: string = ''\n) => {\n const range = formatRange(from, to);\n\n return range ? `${prefix}${range} м²` : range;\n};\n\nconst makeTitle = (\n totalArea: INumberRange,\n livingArea: INumberRange,\n kitchenArea: INumberRange\n) => {\n const labels = [];\n const totalAreaString = formatAreaRange(totalArea);\n\n if (totalAreaString) {\n labels.push(totalAreaString);\n }\n\n const livingAreaString = formatAreaRange(livingArea, 'жилая ');\n\n if (livingAreaString) {\n labels.push(livingAreaString);\n }\n\n const kitchenAreaString = formatAreaRange(kitchenArea, 'кухня ');\n\n if (kitchenAreaString) {\n labels.push(kitchenAreaString);\n }\n\n const title = labels.join(', ');\n\n if (totalAreaString) {\n return title;\n }\n\n if (livingAreaString || kitchenAreaString) {\n return upperFirst(title);\n }\n\n return 'Площадь';\n};\n\ninterface IDesktopAreaFilterViewProps {\n totalAreaFilter: AreaFilter;\n livingAreaFilter: LivingAreaFilter;\n kitchenAreaFilter: KitchenAreaFilter;\n onChange: (filter: IFilter[]) => void;\n}\n\nexport const DesktopAreaFilterView: React.FC<IDesktopAreaFilterViewProps> = ({\n totalAreaFilter,\n livingAreaFilter,\n kitchenAreaFilter,\n onChange\n}) => {\n const { value: totalArea } = totalAreaFilter;\n const { value: livingArea } = livingAreaFilter;\n const { value: kitchenArea } = kitchenAreaFilter;\n\n const handleTotalAreaChange = useCallback((total: INumberRange) => onChange([\n new AreaFilter(total)\n ]), [ onChange ]);\n\n const handleLivingAreaChange = useCallback((living: INumberRange) => onChange([\n new LivingAreaFilter(living)\n ]), [ onChange ]);\n\n const handleKitchenAreaChange = useCallback((kitchenFrom: number) => onChange([\n new KitchenAreaFilter({\n from: kitchenFrom,\n to: null\n })\n ]), [ onChange ]);\n\n const handleReset = useCallback(() => onChange([\n new AreaFilter(),\n new LivingAreaFilter(),\n new KitchenAreaFilter()\n ]), [ onChange ]);\n\n return (\n <Dropdown renderTrigger={\n ({ isOpen, handleToggle, triggerRef }) => (\n <FilterSelectButton\n size='l'\n side='square'\n ref={triggerRef}\n onClick={handleToggle}\n focused={isOpen}\n icon={<Icon name={isOpen ? 'chevron-up' : 'chevron-down'} size='s' />}\n style={{ position: 'relative' }}\n >\n <div className={cn('selectTitle')}>\n {makeTitle(totalArea, livingArea, kitchenArea)}\n </div>\n </FilterSelectButton>\n )\n }>\n <div className={cn('popup')}>\n <div\n onClick={handleReset}\n className={cn('reset')}\n >\n <Typography\n tag='span'\n className={cn('resetLink')}\n >\n Сбросить\n </Typography>\n </div>\n <Typography\n variant='primary'\n className={cn('title', { name: 'total' })}\n >\n Площадь\n </Typography>\n <div className={cn('filter', { name: 'total' })}>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n value={totalArea}\n onChange={handleTotalAreaChange}\n max={100_000}\n />\n </div>\n <Typography\n variant='primary'\n className={cn('title', { name: 'living' })}\n >\n Жилая\n </Typography>\n <div className={cn('filter', { name: 'living' })}>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n value={livingArea}\n onChange={handleLivingAreaChange}\n max={100_000}\n />\n </div>\n <Typography\n variant='primary'\n className={cn('title', { name: 'kitchen' })}\n >\n Кухня\n </Typography>\n <div className={cn('filter', { name: 'kitchen' })}>\n <NumberInput\n value={kitchenArea.from ?? undefined}\n postfix='м²'\n onChange={handleKitchenAreaChange}\n size={Size.Small}\n name='kitchenAreaFrom'\n max={100_000}\n type='text'\n placeholder='от'\n />\n </div>\n </div>\n </Dropdown>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport classname from '@search/classname/src';\nimport { Checkbox } from '@vtblife/uikit';\nimport { BalconyOptions } from '@search/filter-enums/enums/BalconyOptions';\n\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { BalconyFilter } from '../../../../models/Filter';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst cn = classname.bind(null, 'DesktopBalconyFilterView');\n\ninterface IBalconyFilterProps {\n filter: BalconyFilter;\n handleChange: (filter: BalconyFilter) => void;\n}\n\nexport const DesktopBalconyFilterView: React.FC<IBalconyFilterProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n handleChange(new BalconyFilter());\n }\n if (Array.isArray(val)) {\n const value = val.includes(BalconyOptions.HAS_ANY);\n\n if (value) {\n handleChange(new BalconyFilter(BalconyOptions.HAS_ANY));\n } else {\n handleChange(new BalconyFilter());\n }\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Балкон/лоджия'>\n <CheckboxGroup2\n mode='check'\n onChange={onChange}\n name='balcony'\n className={cn('checkbox-group')}\n value={[ filter.hasBalcony ]}\n isFilter\n >\n {\n [ <Checkbox\n variant='filter'\n key={'balcony'}\n name={BalconyOptions.HAS_ANY}\n block\n >\n Балкон\n </Checkbox> ]\n\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Button } from '@vtblife/uikit';\n\nimport { FilterSelectButton } from '../../../common/FilterSelect';\n\ninterface IDesktopBuildingsFilterViewProps {\n standalone?: boolean;\n showBuildingPicker: () => void;\n}\n\nexport const DesktopBuildingsFilterView: React.FC<IDesktopBuildingsFilterViewProps> = ({\n standalone: isStandalone = false,\n showBuildingPicker\n}) => {\n const handleClick = useCallback(showBuildingPicker, [ showBuildingPicker ]);\n\n if (isStandalone) {\n return (\n <Button\n variant='secondary'\n icon='map'\n onClick={handleClick}\n >\n Выбрать корпус\n </Button>\n );\n }\n\n return (\n <FilterSelectButton\n size='l'\n side='square'\n onClick={handleClick}\n style={{ position: 'relative' }}\n >\n Выбрать корпус\n </FilterSelectButton>\n );\n};\n","import React, { useCallback } from 'react';\nimport { quarters } from '@search/helpers/src/quarters';\nimport { Commissioning, Quarter } from '@search/filter-enums/enums';\n\nimport { CommissioningFilter } from '../../../../models/Filter';\nimport { SlimSelect } from '../../../../../common/components/SlimSelect/SlimSelect';\n\nconst defaultOptions = [\n {\n value: Commissioning.UNKNOWN,\n label: 'Любой'\n },\n {\n value: Commissioning.COMMISSIONED,\n label: 'Сдан'\n },\n {\n value: Commissioning.IN_PROGRESS,\n label: 'Строится'\n },\n ...quarters()\n .map(({ quarter, year }) => ({\n value: `${Quarter[quarter]}_${year}`,\n label: `До ${quarter} кв. ${year}`\n }))\n];\n\ninterface IDesktopCommissioningFilterViewProps {\n filter: CommissioningFilter;\n onChange: (filter: CommissioningFilter) => void;\n options?: { value: string; label: string }[];\n}\n\nexport const DesktopCommissioningFilterView: React.FC<IDesktopCommissioningFilterViewProps> = ({\n filter,\n onChange,\n options = defaultOptions\n}) => {\n let { commissioning } = filter;\n\n const handleChange = useCallback(\n (val: string) => {\n onChange(new CommissioningFilter(val));\n },\n [ onChange ]\n );\n\n if (! options.some(({ value }) => value === commissioning)) {\n commissioning = Commissioning.UNKNOWN;\n }\n\n return (\n <SlimSelect\n forcePlaceholder={commissioning === Commissioning.UNKNOWN}\n placeholder='Срок сдачи'\n size='s'\n options={options}\n value={commissioning}\n onChange={handleChange}\n height={400}\n dataTest='commissioning'\n adaptivePlacement={false}\n adaptiveHeight={false}\n />\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { CommissioningListFilter } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\ninterface IDesktopCommissioningListFilterViewProps {\n filter: CommissioningListFilter;\n onChange: (filter: CommissioningListFilter) => void;\n options: { value: string; label: string }[];\n}\n\nexport const DesktopCommissioningListFilterView: React.FC<IDesktopCommissioningListFilterViewProps> = ({\n filter,\n onChange,\n options\n}) => {\n const { commissioningList } = filter;\n\n const handleChange = useCallback(\n (val: string[]) => {\n onChange(new CommissioningListFilter(val));\n },\n [ onChange ]\n );\n\n return (\n <SlimMultiSelect\n dataTest='commissioning'\n placeholder='Срок сдачи'\n forcePlaceholder={commissioningList.length === 0}\n size='s'\n options={options}\n value={commissioningList}\n onChange={handleChange}\n height={400}\n adaptivePlacement={false}\n adaptiveHeight={false}\n />\n );\n};\n","import React, { useCallback } from 'react';\nimport { FinishingBuildingEnum, SelectFinishingFlatOption } from '@search/graphql-typings';\n\nimport { FinishingFlatFilter } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\ninterface IProps {\n filter: FinishingFlatFilter;\n onChange: (filter: FinishingFlatFilter) => void;\n options: SelectFinishingFlatOption[];\n}\n\n/**\n * Фильтр \"Отделка\" в разделе \"Квартиры и корпуса\" на карточке ЖК\n * */\nexport const DesktopFinishingFlatTypeFilterView: React.FC<IProps> = ({\n filter,\n onChange,\n options\n}) => {\n const handleChange = useCallback((newValue: FinishingBuildingEnum[]) => onChange(\n new FinishingFlatFilter({\n finishingType: newValue\n })\n ), [ onChange ]);\n\n const { finishingType } = filter.value;\n\n return (\n <SlimMultiSelect<FinishingBuildingEnum>\n placeholder='Отделка'\n forcePlaceholder={finishingType.length === 0}\n size='s'\n options={options}\n value={finishingType}\n onChange={handleChange}\n dataTest='finishingFlat'\n adaptivePlacement={false}\n adaptiveHeight={false}\n />\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { FinishingEnum, FinishingTypeEnum } from '@search/graphql-typings';\n\nimport { FinishingTypeFilter, allWithFinishingValues } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\nconst SELECT_OPTIONS = [\n {\n value: FinishingTypeEnum.WithoutFinishing,\n label: 'Без отделки'\n },\n {\n value: FinishingTypeEnum.PreFinishing,\n label: 'Предчистовая'\n },\n {\n value: FinishingTypeEnum.Fine,\n label: 'Чистовая'\n },\n {\n value: FinishingTypeEnum.WithFurniture,\n label: 'С мебелью'\n },\n];\n\ninterface IProps {\n filter: FinishingTypeFilter;\n onChange: (filter: FinishingTypeFilter) => void;\n}\n\n/**\n * Фильтр \"Тип отделки\"\n* */\nexport const DesktopFinishingTypeFilterView: React.FC<IProps> = ({\n filter,\n onChange\n}) => {\n const { finishingType } = filter.value;\n\n const handleChange = useCallback((values: FinishingTypeEnum[]) => {\n const hasAllAvailableValues = new Set([ ...values, ...allWithFinishingValues ]).size === allWithFinishingValues.length && values.length === allWithFinishingValues.length;\n\n onChange(new FinishingTypeFilter({\n hasFinishing: hasAllAvailableValues ? FinishingEnum.Available : undefined,\n finishingType: values\n }));\n }, [ onChange ]);\n\n return (\n <SlimMultiSelect\n placeholder='Тип отделки'\n dataTest='finishingType'\n size='s'\n options={SELECT_OPTIONS}\n value={finishingType}\n onChange={handleChange}\n adaptivePlacement={false}\n adaptiveHeight={false}\n />\n );\n};\n","import React, { useCallback } from 'react';\nimport upperFirst from 'lodash/upperFirst';\n\nimport { Dropdown, Typography } from '@vtblife/uikit';\nimport { Checkbox, Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { FloorConstraints } from '@search/filter-enums/enums';\nimport { INumberRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\n\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport { FloorFilter } from '../../../../models/Filter';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\nimport './DesktopFloorFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopFloorFilterView');\n\nconst floorConstraintsPrefixes = {\n [FloorConstraints.UNKNOWN]: null,\n [FloorConstraints.ONLY]: 'только',\n [FloorConstraints.EXCLUDE]: 'не'\n};\n\nconst makeTitle = (\n { from, to }: INumberRange,\n first: FloorConstraints,\n last: FloorConstraints\n): string => {\n const labels = [];\n const rangeString = formatRange(from, to);\n\n if (rangeString) {\n labels.push(rangeString);\n }\n\n const lastPrefix = floorConstraintsPrefixes[last];\n\n if (lastPrefix) {\n labels.push(`${lastPrefix} последний`);\n }\n\n const firstPrefix = floorConstraintsPrefixes[first];\n\n if (firstPrefix) {\n labels.push(`${firstPrefix} первый`);\n }\n\n const title = labels.join(', ');\n\n if (rangeString) {\n return `Этаж ${title}`;\n }\n\n if (firstPrefix || lastPrefix) {\n return `${upperFirst(title)} этаж`;\n }\n\n return 'Этаж';\n};\n\ninterface IDesktopAreaFilterViewProps {\n filter: FloorFilter;\n onChange: (filter: FloorFilter) => void;\n}\n\nexport const DesktopFloorFilterView: React.FC<IDesktopAreaFilterViewProps> = ({\n filter,\n onChange\n}) => {\n const { range, first, last } = filter;\n\n const handleRangeChange = useCallback((value: INumberRange) => onChange(\n new FloorFilter(value, first, last)\n ), [ onChange, first, last ]);\n\n const handleLastOnlyChange = useCallback((checked: boolean) => onChange(\n new FloorFilter(range, first, checked ? FloorConstraints.ONLY : FloorConstraints.UNKNOWN)\n ), [ onChange, range, first ]);\n\n const handleLastExcludeChange = useCallback((checked: boolean) => onChange(\n new FloorFilter(range, first, checked ? FloorConstraints.EXCLUDE : FloorConstraints.UNKNOWN)\n ), [ onChange, range, first ]);\n\n const handleFirstExcludeChange = useCallback((checked: boolean) => onChange(\n new FloorFilter(range, checked ? FloorConstraints.EXCLUDE : FloorConstraints.UNKNOWN, last)\n ), [ onChange, range, last ]);\n\n const handleReset = useCallback(() => onChange(\n new FloorFilter()\n ), [ onChange ]);\n\n return (<Dropdown>\n <Dropdown.Control\n arrow\n size='s'\n >{makeTitle(range, first, last)}</Dropdown.Control>\n\n <Dropdown.Content placement='local'>\n <div className={cn('popup')}>\n <div\n onClick={handleReset}\n className={cn('reset')}\n >\n <Typography\n tag='span'\n className={cn('resetLink')}\n >\n Сбросить\n </Typography>\n </div>\n <div className={cn('range')}>\n <NumberInputRange\n size={Size.Small}\n value={range}\n onChange={handleRangeChange}\n max={1_000}\n />\n </div>\n {[\n {\n title: 'Последний',\n name: 'only-last',\n checked: last === FloorConstraints.ONLY,\n handleChange: handleLastOnlyChange\n },\n {\n title: 'Не последний',\n name: 'exclude-last',\n checked: last === FloorConstraints.EXCLUDE,\n handleChange: handleLastExcludeChange\n },\n {\n title: 'Не первый',\n name: 'exclude-first',\n checked: first === FloorConstraints.EXCLUDE,\n handleChange: handleFirstExcludeChange\n }\n ].map(({ title, name, checked, handleChange }) => (\n <div\n key={name}\n className={cn('constraint')}\n >\n <Checkbox\n name={name}\n checked={checked}\n onChange={handleChange}\n >\n {title}\n </Checkbox>\n </div>\n ))}\n </div>\n </Dropdown.Content>\n </Dropdown>);\n};\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport {\n TipTypeEnum,\n RootRegionsApplicationEnum,\n SuggestTypeEnum\n} from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\n\nimport classname from '@search/classname/src';\nimport Input from '@search/vtbeco-ui/src/components/controls/Input';\n\nimport { voidFunction } from '@search/helpers/src/voidFunction';\nimport { regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport type { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport type { GeoBaseStore } from '../../../../../../domain/geo/GeoBase';\nimport type { AddQueryDisplayValue, ExtendedTip, QueryDisplayValue } from '../../../../../common/hooks/useQueryDisplayValues';\nimport { GeoSuggest, correctAndBroadenRegionId } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport type { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport {\n Filters,\n GeoFilter,\n TransportLimitFilter,\n NewBuildingDataFilter,\n RegionFilter,\n DeveloperFilter\n} from '../../../../models/Filter';\nimport type { IFilter } from '../../../../models/Filter';\n\nimport { GeoSelector, TabsEnum as GeoSelectorTabsEnum } from './GeoSelector';\nimport { FilterTagList } from './FilterTagList/FilterTagList';\nimport './DesktopGeoFiltersView.css';\n\nconst cn = classname.bind(null, 'DesktopGeoFiltersView');\n\nexport interface IDesktopGeoFilterViewProps {\n rootRegionsApp: RootRegionsApplicationEnum;\n filters: FilterCollection;\n onChange: (filters: IFilter[]) => void;\n onSubmit?: () => void;\n count: number;\n showNewBuildingsGroup?: boolean;\n startWithNewBuildings?: boolean;\n addQueryDisplayValue?: AddQueryDisplayValue;\n placeholder?: string;\n placeholderWithNewBuildings?: string;\n geoStore: GeoBaseStore;\n limit?: number;\n inputSize?: Size.Small | Size.Large;\n inputBorderSide?: 'square' | 'rounded_square' | 'square_rounded';\n isVertical?: boolean;\n filterTitle?: string;\n tips?: QueryDisplayValue[];\n removeTips?: (tips: ExtendedTip[]) => void;\n suggestTypes?: SuggestTypeEnum[];\n className?: string;\n spySuggest?: UseToggleChainResult;\n}\n\nexport const DesktopGeoFiltersView: React.FC<IDesktopGeoFilterViewProps> = ({\n geoStore,\n filters,\n onChange,\n onSubmit = voidFunction,\n count,\n rootRegionsApp,\n suggestTypes,\n limit,\n showNewBuildingsGroup,\n startWithNewBuildings,\n addQueryDisplayValue,\n placeholder = 'Введите город, метро, район, адрес',\n placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n inputSize = Size.Large,\n inputBorderSide,\n isVertical = false,\n filterTitle,\n tips,\n removeTips,\n className,\n spySuggest\n}) => {\n const geoFilter = filters.get<GeoFilter>(Filters.geo);\n const transportLimitFilter = filters.get<TransportLimitFilter>(Filters.transportLimit);\n const regionId = filters.get<RegionFilter>(Filters.region).region;\n\n const { stations: metro } = geoStore;\n\n /** District в збс, новостройки не поддерживают byRegion */\n const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion() : geoStore.districts;\n\n // eslint-disable-next-line complexity\n const handleChange = useCallback((suggestion: SuggestionType) => {\n const suggestionRegionId = suggestion?.__typename === 'SuggestItemDeveloper' ?\n undefined :\n suggestion?.data.regionId;\n\n const newRegionId = suggestionRegionId && regionId !== suggestionRegionId ? suggestionRegionId : undefined;\n\n const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : geoFilter.geoIds);\n const filterMetroIds: number[] = newRegionId ? [] : [ ...geoFilter.metroIds ];\n const filterDistrictIds: number[] = newRegionId ? [] : [ ...geoFilter.districtIds ];\n const filterAddressIds: number[] = newRegionId ? [] : [ ...geoFilter.addressIds ];\n const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...geoFilter.newBuildingIds ];\n let newBuildingData;\n let developerId;\n\n switch (suggestion.__typename) {\n case SuggestItemTypeEnum.NewBuilding: {\n const { id } = suggestion.data;\n\n if (! filterNewBuildingIds.includes(id)) {\n filterNewBuildingIds.push(id);\n }\n\n const { newBuilding } = suggestion;\n\n if (newBuilding) {\n const {\n id: newBuildingId,\n type: newBuildingType,\n name: newBuildingName,\n title: newBuildingTitle\n } = newBuilding;\n\n addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n id: newBuildingId,\n title: newBuildingTitle?.nominative,\n type: TipTypeEnum.NewBuilding\n });\n\n newBuildingData = {\n type: newBuildingType,\n name: newBuildingName,\n id: newBuildingId\n };\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Developer: {\n const { developer } = suggestion;\n\n if (developer) {\n const { id } = developer;\n\n developerId = id;\n\n addQueryDisplayValue && addQueryDisplayValue('developers', {\n id,\n title: developer.title,\n type: TipTypeEnum.Developer\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Metro: {\n const {\n label,\n data: { id }\n } = suggestion;\n\n if (! filterMetroIds.includes(id)) {\n filterMetroIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('metros', {\n id,\n title: label,\n type: TipTypeEnum.Metro\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.District: {\n const { district } = suggestion;\n const { id } = suggestion.data;\n\n if (! filterDistrictIds.includes(id)) {\n filterDistrictIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('addresses', {\n id: district.id,\n kind: district.kind,\n translit: district.translit,\n title: district.displayName,\n type: TipTypeEnum.District\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Address: {\n const {\n address,\n data: { id }\n } = suggestion;\n\n if (! filterAddressIds.includes(id)) {\n filterAddressIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('addresses', {\n id: address.id,\n kind: address.kind,\n translit: address.translit,\n title: address.displayName,\n type: TipTypeEnum.Address\n });\n }\n\n break;\n }\n\n default:\n return;\n }\n\n const newFilters: IFilter[] = [\n new GeoFilter(\n filterGeoIds,\n filterMetroIds,\n filterDistrictIds,\n filterAddressIds,\n filterNewBuildingIds\n ),\n new NewBuildingDataFilter(newBuildingData)\n ];\n\n if (newRegionId) {\n newFilters.push(\n new RegionFilter(newRegionId)\n );\n }\n\n if (developerId) {\n newFilters.push(\n new DeveloperFilter(developerId)\n );\n }\n\n onChange(newFilters);\n }, [\n geoFilter.geoIds,\n geoFilter.districtIds,\n geoFilter.addressIds,\n geoFilter.metroIds,\n geoFilter.newBuildingIds,\n onChange,\n regionId,\n addQueryDisplayValue\n ]);\n\n const [ geoSelectorActiveTab, setGeoSelectorActiveTab ] = useState<GeoSelectorTabsEnum | null>(null);\n\n const handleGeoSelectorClose = useCallback(() => {\n setGeoSelectorActiveTab(null);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleGeoSelectorSubmit = useCallback(() => {\n handleGeoSelectorClose();\n onSubmit();\n }, [ onSubmit, handleGeoSelectorClose ]);\n\n const handleMetroClick = useCallback(() => {\n setGeoSelectorActiveTab(GeoSelectorTabsEnum.metro);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleDistrictClick = useCallback(() => {\n setGeoSelectorActiveTab(GeoSelectorTabsEnum.district);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleGeoSelectorChange = useCallback(data => {\n const changedFilters = [];\n\n if (data.metroIds || data.districtIds) {\n const geoIds = new Set(geoFilter.geoIds);\n const metroIds = new Set(geoFilter.metroIds);\n const districtIds = new Set(geoFilter.districtIds);\n\n if (data.metroIds) {\n if (data.metroIds.diff.selected) {\n data.metroIds.diff.selected.forEach((id: number) => {\n metroIds.add(id);\n geoIds.add(id);\n });\n }\n\n if (data.metroIds.diff.deselected) {\n data.metroIds.diff.deselected.forEach((id: number) => {\n metroIds.delete(id);\n geoIds.delete(id);\n });\n }\n }\n\n if (data.districtIds) {\n if (data.districtIds.diff.selected) {\n data.districtIds.diff.selected.forEach((id: number) => {\n districtIds.add(id);\n geoIds.add(id);\n });\n }\n\n if (data.districtIds.diff.deselected) {\n data.districtIds.diff.deselected.forEach((id: number) => {\n districtIds.delete(id);\n geoIds.delete(id);\n });\n }\n }\n\n const metroIdList = Array.from(metroIds);\n const districtIdList = Array.from(districtIds);\n const ids: {\n type: SuggestItemTypeEnum;\n idList: number[];\n }[] = [\n {\n type: SuggestItemTypeEnum.Metro,\n idList: metroIdList\n },\n {\n type: SuggestItemTypeEnum.District,\n idList: districtIdList\n }\n ];\n\n let newRegionId: number | undefined;\n\n for (const { type, idList } of ids) {\n for (const id of idList) {\n const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n if (broadenedRegionId !== regionId) {\n newRegionId = broadenedRegionId;\n\n break;\n }\n }\n\n if (newRegionId) {\n changedFilters.push(new RegionFilter(newRegionId));\n\n break;\n }\n }\n\n changedFilters.push(new GeoFilter(\n geoIds,\n metroIdList,\n districtIdList,\n geoFilter.addressIds,\n geoFilter.newBuildingIds\n ));\n }\n\n onChange(changedFilters);\n }, [ onChange, geoFilter, regionId ]);\n\n const handleTransportLimitChange = useCallback((tranpostLimitFilter: TransportLimitFilter) => {\n onChange([ tranpostLimitFilter ]);\n }, [ onChange ]);\n\n const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! metro.isEmpty();\n const hasDistricts = districts.isEmpty ? ! districts.isEmpty() : districts?.ids?.length;\n\n return (\n <>\n {filterTitle && (\n <Typography\n variant='secondary-alone'\n color='secondary'\n className={cn('filter-title')}\n >\n {filterTitle}\n </Typography>\n )}\n <div className={cn(null, undefined, className)}>\n <GeoSuggest\n regionId={regionId}\n rootRegionsApp={rootRegionsApp}\n suggestTypes={suggestTypes}\n limit={limit}\n showNewBuildingsGroup={showNewBuildingsGroup && ! geoFilter.newBuildingIds.length}\n startWithNewBuildings={startWithNewBuildings}\n onGeoChange={handleChange}\n placeholder={placeholder}\n placeholderWithNewBuildings={placeholderWithNewBuildings}\n spySuggest={spySuggest}\n renderInput={(props, state, handlers) => {\n return (\n <Input\n size={inputSize}\n borderSide={inputBorderSide}\n width='max'\n className={cn('input', { vertical: isVertical })}\n name='filter-geo-input'\n onBlur={handlers.handleBlur}\n onFocus={handlers.handleFocus}\n onChange={handlers.handleInputChange}\n onKeyDown={handlers.handleInputKeyDown}\n value={state.label}\n placeholder={props.placeholder}\n title={props.placeholder}\n extraAfter={isVertical ? null : (\n <>\n {\n hasMetro ? (\n <span\n className={cn('extra')}\n onClick={handleMetroClick}\n data-test='filter-geo-metro-popup'\n >\n Метро\n </span>\n ) : null\n }\n {\n hasDistricts ? (\n <span\n className={cn('extra')}\n onClick={handleDistrictClick}\n data-test='filter-geo-district-popup'\n >\n Районы\n </span>\n ) : null\n }\n </>\n )}\n />\n );\n }}\n />\n {\n geoSelectorActiveTab === null ? null : (\n <GeoSelector\n count={count}\n regionId={regionId}\n geoFilter={geoFilter}\n metro={metro}\n districts={districts}\n activeTab={geoSelectorActiveTab}\n onChange={handleGeoSelectorChange}\n transportLimitFilter={transportLimitFilter}\n onChangeTransportLimitChange={handleTransportLimitChange}\n onTabChange={setGeoSelectorActiveTab}\n onClose={handleGeoSelectorClose}\n onSubmit={handleGeoSelectorSubmit}\n />\n )\n }\n {\n isVertical ? (\n <div className={cn('extra-links')}>\n <span className={cn('extra-links-text')}>Выбрать: </span>\n {hasMetro && (\n <span\n className={cn('extra-link')}\n onClick={handleMetroClick}\n data-test='filter-geo-metro-popup'>\n метро{hasDistricts ? ', ' : ''}\n </span>\n )}\n {hasDistricts && (\n <span\n className={cn('extra-link')}\n onClick={handleDistrictClick}\n data-test='filter-geo-district-popup'\n >\n районы\n </span>\n )}\n </div>\n ) : null\n }\n {\n tips?.length && removeTips ? (\n <FilterTagList\n tips={tips}\n filters={filters}\n openMetroModal={handleMetroClick}\n removeTips={removeTips}\n />\n ) : null\n }\n </div>\n </>\n );\n};\n","import React, { useCallback, useContext, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { RootRegionsApplicationEnum, SuggestTypeEnum, TipTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport Input from '@search/vtbeco-ui/src/components/controls/Input';\n\nimport { voidFunction } from '@search/helpers/src/voidFunction';\nimport type { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport type { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport type { GeoBaseStore } from '../../../../../../domain/geo/GeoBase';\nimport type {\n AddQueryDisplayValue,\n ExtendedTip,\n QueryDisplayValue\n} from '../../../../../common/hooks/useQueryDisplayValues';\nimport type { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport { correctAndBroadenRegionId, GeoSuggest } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport type { IFilter } from '../../../../models/Filter';\nimport {\n DeveloperFilter,\n Filters,\n GeoFilter,\n NewBuildingDataFilter,\n RegionFilter,\n TransportLimitFilter\n} from '../../../../models/Filter';\n\nimport { GeoSelector, TabsEnum as GeoSelectorTabsEnum } from './GeoSelector';\nimport { FilterTagList2 } from './FilterTagList2/FilterTagList2';\nimport './DesktopGeoFiltersView.css';\n\nconst cn = classname.bind(null, 'DesktopGeoFiltersView');\n\nexport interface IDesktopGeoFilterViewProps {\n rootRegionsApp: RootRegionsApplicationEnum;\n filters: FilterCollection;\n onChange: (filters: IFilter[]) => void;\n onSubmit?: () => void;\n count: number;\n showNewBuildingsGroup?: boolean;\n startWithNewBuildings?: boolean;\n addQueryDisplayValue?: AddQueryDisplayValue;\n placeholder?: string;\n placeholderWithNewBuildings?: string;\n geoStore: GeoBaseStore;\n limit?: number;\n inputSize?: Size.Small | Size.Large;\n inputBorderSide?: 'square' | 'rounded_square' | 'square_rounded';\n isVertical?: boolean;\n filterTitle?: string;\n tips?: QueryDisplayValue[];\n removeTips?: (tips: ExtendedTip[]) => void;\n suggestTypes?: SuggestTypeEnum[];\n className?: string;\n spySuggest?: UseToggleChainResult;\n showMapArea?(): void;\n clMap?: boolean;\n isClGeoFilter?: boolean;\n}\n\nexport const DesktopGeoFiltersView2: React.FC<IDesktopGeoFilterViewProps> = ({\n geoStore,\n filters,\n onChange,\n onSubmit = voidFunction,\n count,\n rootRegionsApp,\n suggestTypes,\n limit,\n showNewBuildingsGroup,\n startWithNewBuildings,\n addQueryDisplayValue,\n placeholder = 'Введите город, метро, район, адрес',\n placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n inputSize = Size.Large,\n inputBorderSide,\n isVertical = false,\n filterTitle,\n tips,\n removeTips,\n className,\n spySuggest,\n showMapArea,\n clMap = false,\n isClGeoFilter = false\n}) => {\n const geoFilter = filters.get<GeoFilter>(Filters.geo);\n const transportLimitFilter = filters.get<TransportLimitFilter>(Filters.transportLimit);\n const regionId = filters.get<RegionFilter>(Filters.region).region;\n\n const { stations: metro } = geoStore;\n\n /** District в збс, новостройки не поддерживают byRegion */\n const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion() : geoStore.districts;\n\n // eslint-disable-next-line complexity\n const handleChange = useCallback((suggestion: SuggestionType) => {\n let newRegionId: RegionIdEnum | undefined;\n\n if (\n suggestion?.data?.regionId &&\n regionId !== suggestion?.data?.regionId\n ) {\n newRegionId = suggestion.data.regionId;\n }\n\n const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : geoFilter.geoIds);\n const filterMetroIds: number[] = newRegionId ? [] : [ ...geoFilter.metroIds ];\n const filterDistrictIds: number[] = newRegionId ? [] : [ ...geoFilter.districtIds ];\n const filterAddressIds: number[] = newRegionId ? [] : [ ...geoFilter.addressIds ];\n const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...geoFilter.newBuildingIds ];\n let newBuildingData;\n let developerId;\n\n switch (suggestion.__typename) {\n case SuggestItemTypeEnum.NewBuilding: {\n const { id } = suggestion.data;\n\n if (! filterNewBuildingIds.includes(id)) {\n filterNewBuildingIds.push(id);\n }\n\n const { newBuilding } = suggestion;\n\n if (newBuilding) {\n const {\n id: newBuildingId,\n type: newBuildingType,\n name: newBuildingName,\n title: newBuildingTitle\n } = newBuilding;\n\n addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n id: newBuildingId,\n title: newBuildingTitle?.nominative,\n type: TipTypeEnum.NewBuilding\n });\n\n newBuildingData = {\n type: newBuildingType,\n name: newBuildingName,\n id: newBuildingId\n };\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Developer: {\n const { developer } = suggestion;\n\n if (developer) {\n const { id } = developer;\n\n developerId = id;\n\n addQueryDisplayValue && addQueryDisplayValue('developers', {\n id,\n title: developer.title,\n type: TipTypeEnum.Developer\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.District: {\n const { district } = suggestion;\n const { id, regionId } = suggestion.data;\n\n if (! filterDistrictIds.includes(id)) {\n filterDistrictIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('districts', {\n id: district.id,\n title: district.displayName,\n type: TipTypeEnum.District,\n region: regionId ?? undefined,\n translit: district.translit,\n locative: district.locative,\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Metro: {\n const {\n label,\n data: { id }\n } = suggestion;\n\n if (! filterMetroIds.includes(id)) {\n filterMetroIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('metros', {\n id,\n title: label,\n type: TipTypeEnum.Metro\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Address: {\n const {\n address,\n data: { id, regionId }\n } = suggestion;\n\n if (! filterAddressIds.includes(id)) {\n filterAddressIds.push(id);\n filterGeoIds.add(id);\n\n addQueryDisplayValue && addQueryDisplayValue('addresses', {\n id: address.id,\n kind: address.kind,\n translit: address.translit,\n locative: address.locative,\n title: address.displayName,\n type: TipTypeEnum.Address,\n region: regionId ?? undefined\n });\n }\n\n break;\n }\n\n default:\n return;\n }\n\n const newFilters: IFilter[] = [\n new GeoFilter(\n filterGeoIds,\n filterMetroIds,\n filterDistrictIds,\n filterAddressIds,\n filterNewBuildingIds\n ),\n new NewBuildingDataFilter(newBuildingData)\n ];\n\n if (newRegionId) {\n newFilters.push(\n new RegionFilter(newRegionId)\n );\n }\n\n if (developerId) {\n newFilters.push(\n new DeveloperFilter(developerId)\n );\n }\n\n onChange(newFilters);\n }, [\n geoFilter.geoIds,\n geoFilter.districtIds,\n geoFilter.addressIds,\n geoFilter.metroIds,\n geoFilter.newBuildingIds,\n onChange,\n regionId,\n addQueryDisplayValue\n ]);\n\n const [ geoSelectorActiveTab, setGeoSelectorActiveTab ] = useState<GeoSelectorTabsEnum | null>(null);\n\n const handleGeoSelectorClose = useCallback(() => {\n setGeoSelectorActiveTab(null);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleGeoSelectorSubmit = useCallback(() => {\n handleGeoSelectorClose();\n onSubmit();\n }, [ onSubmit, handleGeoSelectorClose ]);\n\n const handleMetroClick = useCallback(() => {\n setGeoSelectorActiveTab(GeoSelectorTabsEnum.metro);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleDistrictClick = useCallback(() => {\n setGeoSelectorActiveTab(GeoSelectorTabsEnum.district);\n }, [ setGeoSelectorActiveTab ]);\n\n const handleGeoSelectorChange = useCallback(data => {\n const changedFilters = [];\n\n if (data.metroIds || data.districtIds) {\n const geoIds = new Set(geoFilter.geoIds);\n const metroIds = new Set(geoFilter.metroIds);\n const districtIds = new Set(geoFilter.districtIds);\n\n if (data.metroIds) {\n if (data.metroIds.diff.selected) {\n data.metroIds.diff.selected.forEach((id: number) => {\n metroIds.add(id);\n geoIds.add(id);\n });\n }\n\n if (data.metroIds.diff.deselected) {\n data.metroIds.diff.deselected.forEach((id: number) => {\n metroIds.delete(id);\n geoIds.delete(id);\n });\n }\n }\n\n if (data.districtIds) {\n if (data.districtIds.diff.selected) {\n data.districtIds.diff.selected.forEach((id: number) => {\n districtIds.add(id);\n geoIds.add(id);\n });\n }\n\n if (data.districtIds.diff.deselected) {\n data.districtIds.diff.deselected.forEach((id: number) => {\n districtIds.delete(id);\n geoIds.delete(id);\n });\n }\n }\n\n const metroIdList = Array.from(metroIds);\n const districtIdList = Array.from(districtIds);\n const ids: {\n type: SuggestItemTypeEnum;\n idList: number[];\n }[] = [\n {\n type: SuggestItemTypeEnum.Metro,\n idList: metroIdList\n },\n {\n type: SuggestItemTypeEnum.District,\n idList: districtIdList\n }\n ];\n\n let newRegionId: number | undefined;\n\n for (const { type, idList } of ids) {\n for (const id of idList) {\n const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n if (broadenedRegionId !== regionId) {\n newRegionId = broadenedRegionId;\n\n break;\n }\n }\n\n if (newRegionId) {\n changedFilters.push(new RegionFilter(newRegionId));\n\n break;\n }\n }\n\n changedFilters.push(new GeoFilter(\n geoIds,\n metroIdList,\n districtIdList,\n geoFilter.addressIds,\n geoFilter.newBuildingIds\n ));\n }\n\n onChange(changedFilters);\n }, [ onChange, geoFilter, regionId ]);\n\n const handleTransportLimitChange = useCallback((tranpostLimitFilter: TransportLimitFilter) => {\n onChange([ tranpostLimitFilter ]);\n }, [ onChange ]);\n\n const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! metro.isEmpty();\n const hasDistricts = districts.isEmpty ? ! districts.isEmpty() : districts?.ids?.length;\n\n const extraLinks = clMap ? (\n <div className={cn('extra-links-cl')}>\n {hasMetro && (\n <div\n className={cn('metro')}\n data-test='filter-geo-metro-popup'\n onClick={handleMetroClick}\n >\n <span className={cn('metro-icon')}>\n <svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'>\n <path\n d='M20.486 13.765 15.347 0 11 8.047 6.67 0 1.514 13.765H0v2.086h7.78v-2.086H6.617l1.126-3.427L11 16l3.256-5.662 1.126 3.427h-1.161v2.086H22v-2.086h-1.514Z'\n fill='#DD201C'\n />\n </svg>\n </span>\n <Typography className={cn('metro-text')} variant='secondary-alone' bold>\n Выбрать метро\n </Typography>\n {geoFilter.metroIds.length > 0 && (\n <div className={cn('metro-count')}>{geoFilter.metroIds.length}</div>\n )}\n </div>\n )}\n {hasDistricts && (\n <div\n className={cn('district')}\n data-test='filter-geo-district-popup'\n onClick={handleDistrictClick}\n >\n <span className={cn('district-icon')}>\n <Icon name='m2-building-multiple' color='#6e6a81' size='m' />\n </span>\n <Typography className={cn('district-text')} variant='secondary-alone' bold>\n Выбрать район\n </Typography>\n </div>\n )}\n </div>\n ) : (\n <div className={cn('extra-links')}>\n <Typography tag='span' color='secondary'>Выбрать: </Typography>\n {hasMetro && (\n <Typography\n tag='span'\n color='blue'\n className={cn('extra-link')}\n onClick={handleMetroClick}\n data-test='filter-geo-metro-popup'>\n {hasDistricts ? 'метро, ' : 'метро'}\n </Typography>\n )}\n {hasDistricts && (\n <Typography\n tag='span'\n color='blue'\n className={cn('extra-link')}\n onClick={handleDistrictClick}\n data-test='filter-geo-district-popup'\n >\n районы\n </Typography>\n )}\n </div>\n );\n\n return (\n <>\n {filterTitle && (\n <Typography\n color='black-250'\n variant='secondary-alone'\n className={cn('filter-title')}\n >\n {filterTitle}\n </Typography>\n )}\n <div className={cn(null, undefined, className)}>\n <GeoSuggest\n regionId={regionId}\n rootRegionsApp={rootRegionsApp}\n suggestTypes={suggestTypes}\n limit={limit}\n showNewBuildingsGroup={showNewBuildingsGroup && ! geoFilter.newBuildingIds.length}\n startWithNewBuildings={startWithNewBuildings}\n selected={geoFilter.geoIds}\n onGeoChange={handleChange}\n placeholder={placeholder}\n placeholderWithNewBuildings={placeholderWithNewBuildings}\n spySuggest={spySuggest}\n renderInput={(props, state, handlers) => {\n return (\n <Input\n size={inputSize}\n borderSide={inputBorderSide}\n width='max'\n className={cn('input', { vertical: isVertical })}\n name='filter-geo-input'\n onBlur={handlers.handleBlur}\n onFocus={handlers.handleFocus}\n onChange={handlers.handleInputChange}\n onKeyDown={handlers.handleInputKeyDown}\n value={state.label}\n placeholder={props.placeholder}\n title={props.placeholder}\n extraAfter={isVertical ? null : (<>\n { hasMetro ? (\n <span\n className={cn('extra')}\n onClick={handleMetroClick}\n data-test='filter-geo-metro-popup'\n >\n Метро\n </span>\n ) : null}\n { hasDistricts ? (\n <span\n className={cn('extra')}\n onClick={handleDistrictClick}\n data-test='filter-geo-district-popup'\n >\n Районы\n </span>\n ) : null}\n {isClGeoFilter ? <span\n className={cn('extra')}\n data-test='filter-geo-map-popup'\n onClick={showMapArea}\n >\n Область на карте\n </span> : null}\n </>)}\n />\n );\n }}\n />\n {\n geoSelectorActiveTab === null ? null : (\n <GeoSelector\n count={count}\n regionId={regionId}\n geoFilter={geoFilter}\n metro={metro}\n districts={districts}\n activeTab={geoSelectorActiveTab}\n onChange={handleGeoSelectorChange}\n transportLimitFilter={transportLimitFilter}\n onChangeTransportLimitChange={handleTransportLimitChange}\n onTabChange={setGeoSelectorActiveTab}\n onClose={handleGeoSelectorClose}\n onSubmit={handleGeoSelectorSubmit}\n />\n )\n }\n {\n isVertical && (hasMetro || hasDistricts) ? extraLinks : null\n }\n {\n tips?.length && removeTips ? (\n <FilterTagList2\n tips={tips}\n filters={filters}\n openMetroModal={handleMetroClick}\n removeTips={removeTips}\n />\n ) : null\n }\n </div>\n </>\n );\n};\n","import './FilterTagList.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { ClassifiedFilterCollection } from '../../../../../../../domain/offer/filters/ClassifiedFilterCollection';\nimport { NewbuildingFilterCollection } from '../../../../../../../domain/newbuilding/filters/NewbuildingFilterCollection';\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\nimport { IconPedestrian } from '../../../../../../common/components/OfferRouteCard/IconPedestrian';\nimport { IconBus } from '../../../../../../common/components/OfferRouteCard/IconBus';\nimport { ExtendedTip, QueryDisplayValue } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { timeLimitLabel } from '../../../../../../tips/labels';\nimport { Filters, TransportLimitFilter } from '../../../../../models/Filter';\nimport { FilterTagListItem } from './FilterTagListItem';\n\nconst cn = classname.bind(null, 'FilterTagList');\n\nexport function FilterTagList({\n filters,\n tips,\n removeTips,\n openMetroModal\n}: {\n removeTips(tips: ExtendedTip[]): void;\n filters: ClassifiedFilterCollection | NewbuildingFilterCollection;\n tips: QueryDisplayValue[];\n openMetroModal: () => void;\n}) {\n const transportType = filters.get<TransportLimitFilter>(Filters.transportLimit).transportType;\n const timeLimit = filters.get<TransportLimitFilter>(Filters.transportLimit).timeLimit;\n\n const [ expanded, setExpanded ] = React.useState(false);\n const toggleExpanded = React.useCallback(() => {\n setExpanded(prevState => ! prevState);\n }, [ setExpanded ]);\n\n const allTips: ExtendedTip[] = transportType && timeLimit ?\n [\n {\n __typename: 'TipRouteMetro',\n id: 'TipRouteMetro',\n transportType: {\n value: transportType\n },\n timeLimit: {\n formatted: timeLimitLabel[timeLimit]!\n }\n },\n ...tips\n ] :\n tips;\n\n const maxVisible = 3;\n const visibleTips = expanded ? allTips : allTips.slice(0, maxVisible);\n const toggleExpandedDisabled = allTips.length <= maxVisible;\n\n const deleteTip = React.useCallback((tip: ExtendedTip) => {\n removeTips([ tip ]);\n }, [ removeTips ]);\n\n const resetAll = React.useCallback(() => {\n removeTips(allTips);\n }, [ removeTips, allTips ]);\n\n return (\n <div className={cn()}>\n {visibleTips.map(tip => (\n <FilterTagListItem\n id={`filter-tag-${tip.id}`}\n key={tip.id}\n onDelete={() => deleteTip(tip)}\n children={<TipContent tip={tip} />}\n openMetroModal={tip.__typename === 'TipRouteMetro' ? openMetroModal : undefined}\n />\n ))}\n {\n allTips.length === 0 ? null : (\n <div className={cn('links')}>\n <button\n data-test='filter-tag-more'\n className={cn('more', { disabled: toggleExpandedDisabled })}\n disabled={toggleExpandedDisabled}\n onClick={toggleExpanded}\n >\n {/* eslint-disable-next-line no-nested-ternary */}\n {toggleExpandedDisabled ? '' : (expanded ? 'Свернуть' : 'Показать еще')}\n </button>\n <button\n data-test='filter-tag-reset'\n className={cn('reset')}\n onClick={resetAll}\n >\n Сбросить все\n </button>\n </div>\n )\n }\n </div>\n );\n}\n\nfunction TransportTypeIcon({\n transportType\n}: {\n transportType: TransportType | null;\n}) {\n switch (transportType) {\n case TransportType.FOOT:\n return <IconPedestrian color='currentColor' />;\n default:\n return <IconBus color='currentColor' />;\n }\n}\n\nfunction TipContent({\n tip\n}: {\n tip: ExtendedTip;\n}) {\n switch (tip.__typename) {\n case 'TipRouteMetro':\n return (\n <>\n До метро \n <TransportTypeIcon transportType={tip.transportType.value} />\n {tip.timeLimit.formatted} мин.\n </>\n );\n case 'TipMetroStation':\n return (\n <>\n {tip.allRoutesColors ? <MetroMark colors={tip.allRoutesColors} /> : 'м.'}\n {tip.title}\n </>\n );\n default:\n return <>{tip.title}</>;\n }\n}\n","import './FilterTagListItem.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'FilterTagListItem');\n\nexport function FilterTagListItem({\n id,\n children,\n isActive = false,\n openMetroModal,\n onDelete\n}: {\n id: string;\n onDelete: () => void;\n children: React.ReactNode;\n isActive?: boolean;\n openMetroModal?: () => void;\n}) {\n return (\n <div\n onClick={openMetroModal}\n className={cn('item', { active: isActive, clickable: Boolean(openMetroModal) })}\n >\n <div className={cn('text')}>{children}</div>\n <button\n className={cn('delete')}\n data-test={`${id}-delete`}\n onClick={e => {\n e.stopPropagation();\n onDelete();\n }}\n >\n <Icon name='times-circle' />\n </button>\n </div>\n );\n}\n","import './FilterTagList2.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { ClassifiedFilterCollection } from '@search/vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterCollection';\nimport { NewbuildingFilterCollection } from '@search/vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterCollection';\n\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\nimport { IconPedestrian } from '../../../../../../common/components/OfferRouteCard/IconPedestrian';\nimport { IconBus } from '../../../../../../common/components/OfferRouteCard/IconBus';\nimport { ExtendedTip, QueryDisplayValue } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { timeLimitLabel } from '../../../../../../tips/labels';\nimport { Filters, TransportLimitFilter } from '../../../../../models/Filter';\n\nconst cn = classname.bind(null, 'FilterTagList2');\n\nexport function FilterTagList2({\n filters,\n tips,\n removeTips,\n openMetroModal\n}: {\n removeTips(tips: ExtendedTip[]): void;\n filters: ClassifiedFilterCollection | NewbuildingFilterCollection;\n tips: QueryDisplayValue[];\n openMetroModal: () => void;\n}) {\n const transportType = filters.get<TransportLimitFilter>(Filters.transportLimit).transportType;\n const timeLimit = filters.get<TransportLimitFilter>(Filters.transportLimit).timeLimit;\n\n const [ expanded, setExpanded ] = React.useState(false);\n const toggleExpanded = React.useCallback(() => {\n setExpanded(prevState => ! prevState);\n }, [ setExpanded ]);\n\n const allTips: ExtendedTip[] = transportType && timeLimit ?\n [\n {\n __typename: 'TipRouteMetro',\n id: 'TipRouteMetro',\n transportType: {\n value: transportType\n },\n timeLimit: {\n formatted: timeLimitLabel[timeLimit]!\n }\n },\n ...tips\n ] :\n tips;\n\n const maxVisible = 3;\n const visibleTips = expanded ? allTips : allTips.slice(0, maxVisible);\n const toggleExpandedDisabled = allTips.length <= maxVisible;\n\n const deleteTip = React.useCallback((tip: ExtendedTip) => {\n removeTips([ tip ]);\n }, [ removeTips ]);\n\n const resetAll = React.useCallback(() => {\n removeTips(allTips);\n }, [ removeTips, allTips ]);\n\n return (\n <div className={cn()}>\n {visibleTips.map(tip => (\n <FilterTagListItem2\n id={`filter-tag-${tip.id}`}\n key={tip.id}\n onDelete={() => deleteTip(tip)}\n children={<TipContent tip={tip} />}\n openMetroModal={tip.__typename === 'TipRouteMetro' ? openMetroModal : undefined}\n />\n ))}\n {\n allTips.length === 0 ? null : (\n <div className={cn('links')}>\n <Typography\n data-test='filter-tag-more'\n color='blue'\n className={cn('more')}\n // disabled={toggleExpandedDisabled}\n onClick={toggleExpanded}\n >\n {/* eslint-disable-next-line no-nested-ternary */}\n {toggleExpandedDisabled ? '' : (expanded ? 'Свернуть' : 'Показать еще')}\n </Typography>\n <Typography\n color='black-250'\n data-test='filter-tag-reset'\n className={cn('reset')}\n onClick={resetAll}\n >\n Сбросить все\n </Typography>\n </div>\n )\n }\n </div>\n );\n}\n\nfunction TransportTypeIcon({\n transportType\n}: {\n transportType: TransportType | null;\n}) {\n switch (transportType) {\n case TransportType.FOOT:\n return <IconPedestrian color='currentColor' />;\n default:\n return <IconBus color='currentColor' />;\n }\n}\n\nfunction TipContent({\n tip\n}: {\n tip: ExtendedTip;\n}) {\n switch (tip.__typename) {\n case 'TipRouteMetro':\n return (<Typography color='blue'>\n До метро \n <TransportTypeIcon transportType={tip.transportType.value} />\n {tip.timeLimit.formatted} мин.\n </Typography>);\n case 'TipMetroStation':\n return (<div className={cn('tipMetro')}>\n {tip.allRoutesColors ? <MetroMark colors={tip.allRoutesColors} /> : 'м.'}\n {tip.title}\n </div>);\n default:\n return <>{tip.title}</>;\n }\n}\n\nexport function FilterTagListItem2({\n id,\n children,\n openMetroModal,\n onDelete,\n view = 'default'\n}: {\n id: string;\n view?: 'ellipse' | 'default';\n onDelete: () => void;\n children: React.ReactNode;\n openMetroModal?: () => void;\n}) {\n return (\n <div\n onClick={openMetroModal}\n className={cn('item', { clickable: Boolean(openMetroModal), view })}\n >\n <Typography color={view === 'ellipse' ? 'primary' : 'secondary'}>\n {children}\n </Typography>\n\n <div\n data-test={`${id}-delete`}\n onClick={e => {\n e.stopPropagation();\n onDelete();\n }}\n className={cn('removeBtn')}\n >\n <Icon\n name='times-circle'\n color='#CCC9D9'\n />\n </div>\n </div>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/ekb.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/kzn.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactNode, ReactElement } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/msk.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/nnv.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/nsk.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/smr.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/spb.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n return children(svg);\n};\n","import React, { useCallback } from 'react';\nimport { Select, Typography, useSelect } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { TimeLimit, TransportType } from '@search/filter-enums/enums';\n\nimport { TransportLimitFilter } from '../../../../models/Filter';\nimport { MobileFilter2 } from '../../../filter/MobileFilter2';\n\nimport './styles.css';\n\ninterface IMobileTransportLimitFilterViewProps {\n filter: TransportLimitFilter;\n onChange: (filter: TransportLimitFilter) => void;\n isMobile?: boolean;\n isTitle?: boolean;\n containerClass?: string;\n hiddenTimeOptionsWithoutTransportType?: boolean;\n desktopTitleGap?: boolean;\n isShort?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileTransportLimitFilterView');\n\nconst transportTypeOptions = [\n {\n value: TransportType.UNKNOWN,\n label: 'Неважно'\n },\n {\n value: TransportType.FOOT,\n label: 'Пешком'\n }, {\n value: TransportType.PUBLIC_TRANSPORT,\n label: 'На транспорте'\n }\n];\n\nconst timeLimitOptions = [\n {\n value: TimeLimit.MAX_5_MINUTES,\n label: '5 мин.'\n },\n {\n value: TimeLimit.MAX_10_MINUTES,\n label: '10 мин.'\n },\n {\n value: TimeLimit.MAX_15_MINUTES,\n label: '15 мин.'\n },\n {\n value: TimeLimit.MAX_20_MINUTES,\n label: '20 мин.'\n },\n {\n value: TimeLimit.MAX_30_MINUTES,\n label: '30 мин.'\n },\n {\n value: TimeLimit.MAX_40_MINUTES,\n label: '40 мин.'\n },\n {\n value: TimeLimit.MAX_50_MINUTES,\n label: '50 мин.'\n },\n {\n value: TimeLimit.MAX_60_MINUTES,\n label: '1 ч.'\n }\n];\n\nconst timeLimitShortOptions = [\n {\n value: TimeLimit.MAX_5_MINUTES,\n label: '5 мин.'\n },\n {\n value: TimeLimit.MAX_10_MINUTES,\n label: '10 мин.'\n },\n {\n value: TimeLimit.MAX_15_MINUTES,\n label: '15 мин.'\n },\n {\n value: TimeLimit.MAX_20_MINUTES,\n label: '20 мин.'\n },\n {\n value: TimeLimit.MAX_30_MINUTES,\n label: '30 мин.'\n }\n];\n\nexport const MobileTransportLimitFilterView2: React.FC<IMobileTransportLimitFilterViewProps> = ({\n filter,\n onChange,\n isTitle,\n isMobile,\n containerClass,\n hiddenTimeOptionsWithoutTransportType,\n desktopTitleGap,\n isShort = false\n}) => {\n const transportSelectChange = useCallback((value: TransportType) => {\n let timeLimit = filter.timeLimit;\n\n if (value === TransportType.UNKNOWN) timeLimit = TimeLimit.UNKNOWN;\n else if (timeLimit === TimeLimit.UNKNOWN) timeLimit = TimeLimit.MAX_20_MINUTES;\n\n onChange(new TransportLimitFilter(\n timeLimit,\n value\n ));\n }, [ filter.timeLimit, onChange ]);\n\n const transportSelectOptions = transportTypeOptions.map(option => ({ value: option.value, text: option.label }));\n\n const transportSelect = useSelect(\n transportSelectChange,\n {\n selected: filter.transportType,\n texts: transportSelectOptions\n }\n );\n\n const timeLimitSelectChange = useCallback((value: TimeLimit) => {\n const transportType = filter.transportType;\n\n if (transportType === TransportType.UNKNOWN) return;\n\n onChange(new TransportLimitFilter(\n value,\n transportType\n ));\n }, [ filter.transportType, onChange ]);\n\n const timeLimitSelectOptions = (isShort ? timeLimitShortOptions : timeLimitOptions).map(option => ({\n value: option.value,\n text: option.label\n }));\n\n const timeLimitSelect = useSelect(\n timeLimitSelectChange,\n { selected: filter.timeLimit, texts: timeLimitSelectOptions }\n );\n\n return (<MobileFilter2\n filterTitle={isTitle ? 'Время до метро' : undefined}\n desktopTitleGap={desktopTitleGap}\n childrenClassName={cn('container', {\n mobile: isMobile\n }, containerClass)}\n >\n <Select native={isMobile} mode='single' onChange={transportSelect.handleChange}>\n <Select.Button size='s' dataTest='transportType-trigger'>\n {filter.transportType === TransportType.UNKNOWN ? <Typography color='black-300'>Неважно</Typography> : transportSelect.selectedText}\n </Select.Button>\n <Select.Content>\n {transportSelectOptions.map(option => (\n <Select.Option\n dataTest={`transportType-${option.value}`}\n key={option.value}\n value={option.value}\n selected={transportSelect.is(option.value)}\n >\n {option.text}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n {hiddenTimeOptionsWithoutTransportType && filter.transportType === TransportType.UNKNOWN ? null : (\n <Select native={isMobile} mode='single' onChange={timeLimitSelect.handleChange}>\n <Select.Button\n dataTest='timeLimit-trigger'\n disabled={filter.transportType === TransportType.UNKNOWN}\n size='s'\n >\n {filter.transportType === TransportType.UNKNOWN ? <Typography color='black-300'>Время</Typography> : timeLimitSelect.selectedText}\n </Select.Button>\n <Select.Content>\n {timeLimitSelectOptions.map(option => (\n <Select.Option\n key={option.value}\n dataTest={`timeLimit-${option.value}`}\n value={option.value}\n selected={timeLimitSelect.is(option.value)}\n >\n {option.text}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n )}\n </MobileFilter2>);\n};\n","import React from 'react';\nimport { withScope, captureException } from '@sentry/browser';\n\nclass GeoErrorBoundary extends React.Component<{}, { hasError: boolean }> {\n constructor(props: {} | Readonly<{}>) {\n super(props);\n\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: unknown) {\n withScope(scope => {\n scope.setExtra('errors', error.name);\n scope.setExtra('errorInfo', errorInfo);\n\n captureException(error, {\n tags: {\n section: 'GeoErrorBoundary'\n }\n });\n });\n }\n\n render() {\n if (this.state.hasError) {\n return <div>Ошибка загрузки карты</div>;\n }\n\n return this.props.children;\n }\n}\n\nexport default GeoErrorBoundary;\n","import React, { useState, useCallback, useMemo } from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport Suggest from '@search/vtbeco-ui/src/components/controls/Suggest';\nimport { SizeEnum } from '@search/vtbeco-ui/src/types';\n\nimport latinToCyrillic from '@search/helpers/src/latinToCyrillic.json';\n\nimport { SubwayStationMark } from '../../../../../../../common/components/SubwayStation';\nimport { MetroStore, MetroStation } from '../../../../../../../../domain/geo/MetroStation';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'MetroSuggest');\n\ninterface IProps {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange: (data: any) => void;\n metro: MetroStore;\n selected: Set<number>;\n className?: string;\n}\n\nconst escapeRegExp = (string: string) => string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst filterMetro = (text: string, metro: MetroStation[]) => {\n text = text.trim().toLowerCase();\n\n const textRegExp = new RegExp(escapeRegExp(text).replace(/е/g, '(е|ё)'));\n\n const anotherTextLetters: string[] = [];\n\n text.split('').forEach(letter => {\n // @ts-ignore\n anotherTextLetters.push(latinToCyrillic[letter] || letter);\n });\n\n const anotherText = anotherTextLetters.join('');\n const anotherTextRegExp = new RegExp(escapeRegExp(anotherText).replace(/е/g, '(е|ё)'));\n\n return metro\n .filter(({ title }) => {\n title = title.toLowerCase();\n\n return textRegExp.test(title) || anotherTextRegExp.test(title);\n });\n};\n\nconst metroTitleTrim = (title: string) => {\n return title\n // \"Площадь Александра Невского-1\" => \"Площадь Александра Невского\"\n .replace(/-\\d$/, '')\n // \"Мичуринский проспект (2021)\" => \"Мичуринский проспект\"\n .replace(/ \\(\\d\\d\\d\\d\\)$/, '');\n};\n\nconst MetroSuggest: React.FC<IProps> = ({ onChange, selected, metro, className }) => {\n const [ suggestion, setSuggestion ] = useState<{ label: string } | null>(null);\n\n // TODO Нормализация с учётом схлопывания смежных станций, будет сделано на бекэнде\n const metros = useMemo(() => {\n const ret: MetroStation[] = [];\n\n metro.sortedByTitle.forEach(station => {\n const { interchangedStations, route } = station;\n let isNeedToAdd = true;\n\n // Станции линии \"Каховская\"\n if (route.id === 86) {\n return;\n }\n\n // Если среди станций пересадок есть станция с эквивалентным именем и меньшим по значению id,\n // то такую станцию не добавляем в список\n if (interchangedStations && interchangedStations.length) {\n const { title } = station;\n const trimmedStationTitle = metroTitleTrim(title);\n\n interchangedStations.forEach(interchangedStation => {\n if (\n metroTitleTrim(interchangedStation.title) === trimmedStationTitle &&\n interchangedStation.id < station.id\n ) {\n isNeedToAdd = false;\n }\n });\n }\n\n if (isNeedToAdd) {\n ret.push(station);\n }\n });\n\n return ret;\n }, [ metro ]);\n\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const handleOnSelect = useCallback(suggestion => {\n const id = suggestion.id;\n\n onChange({\n diff: {\n [selected.has(id) ? 'deselected' : 'selected']: new Set([ id ])\n }\n });\n }, [ onChange, selected ]);\n\n const handleTextChange = useCallback((text: string) => {\n setSuggestion({\n label: text\n });\n }, [ setSuggestion ]);\n\n const suggestions = useMemo(() => {\n return filterMetro(suggestion && suggestion.label || '', metros);\n }, [ suggestion, metros ]);\n\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const checkListShowing = useCallback(({ isFocus, suggestions }) => {\n if (! isFocus) {\n setSuggestion(prev => {\n return prev && prev.label ? null : prev;\n });\n }\n\n return isFocus && suggestions.length > 0;\n }, [ setSuggestion ]);\n\n return (\n <div className={cn(null, undefined, className)}>\n <Suggest\n width='max'\n size={SizeEnum.S}\n inputSize={SizeEnum.S}\n suggestions={suggestions}\n renderList={({ suggestions: renderSuggestions }, { focusedIndex }, handlers) => (\n <div className={cn('list')}>\n <div className={cn('list-inner')}>\n { renderSuggestions.map((item, index) => (\n <div\n key={index}\n className={cn('list-item', { focused: focusedIndex === index })}\n onMouseEnter={e => handlers.handleItemMouseEnter(e, index)}\n onMouseDown={e => handlers.handleItemMouseDown(e, index)}\n >\n <div className={cn('list-item-mark')}>\n <SubwayStationMark colors={item.allRoutesColorsList} />\n </div>\n <div className={cn('list-item-text')}>\n {\n // \"Площадь Александра Невского-1\" => \"Площадь Александра Невского\"\n item.title.replace(/-\\d$/, '')\n }\n </div>\n <div className={cn('list-item-check')}>\n {selected.has(item.id) ? (\n <Icon name='check' />\n ) : null}\n </div>\n </div>\n )) }\n </div>\n </div>\n )}\n onSelect={handleOnSelect}\n suggestion={suggestion}\n placeholder='Найти станцию'\n onTextChange={handleTextChange}\n checkListShowing={checkListShowing}\n renderEmptyList={() => {}}\n />\n </div>\n );\n};\n\nexport default MetroSuggest;\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { DistrictGroup } from '../../../../../../helpers/districtHelper';\nimport type { ArrayElement } from '../../../../../../../../types/common';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'DistrictsTabGeoSelector');\n\ninterface IProps {\n groups: DistrictGroup[];\n selected: Set<number>;\n onChange: (data: any) => void;\n}\n\nexport const DistrictsTab: React.FC<IProps> = ({\n groups,\n selected,\n onChange\n}) => {\n const handleCheckboxChange = useCallback((\n checked: boolean,\n id: ArrayElement<DistrictGroup['items']>['id'],\n groupIndex: number,\n groupId: DistrictGroup['id']\n ) => {\n let checkedDiff = new Set<number>();\n let uncheckedDiff = new Set<number>();\n\n if (! groupId) {\n if (checked) {\n checkedDiff.add(id);\n } else {\n uncheckedDiff.add(id);\n }\n\n onChange({\n diff: {\n selected: checkedDiff,\n deselected: uncheckedDiff\n }\n });\n\n return;\n }\n\n if (checked) {\n const isGroupChecked = groups[groupIndex].items.every(item => selected.has(item.id) || item.id === id);\n\n if (isGroupChecked) {\n const selectedIdsFromGroup = groups[groupIndex].items\n .map(item => item.id)\n .filter(value => selected.has(value));\n\n checkedDiff = new Set([ groupId ]);\n uncheckedDiff = new Set([ id, ...selectedIdsFromGroup ]);\n } else {\n checkedDiff = new Set([ id ]);\n }\n } else {\n if (selected.has(groupId)) {\n const otherGroupIds = groups[groupIndex].items\n .filter(item => item.id !== id)\n .map(item => item.id);\n\n checkedDiff = new Set(otherGroupIds);\n uncheckedDiff = new Set([ groupId, id ]);\n } else {\n uncheckedDiff = new Set([ id ]);\n }\n }\n\n onChange({\n diff: {\n selected: checkedDiff,\n deselected: uncheckedDiff\n }\n });\n }, [ groups, onChange, selected ]);\n\n const handleCheckboxGroupChange = useCallback((\n checked: boolean,\n groupIndex: number,\n groupId: DistrictGroup['id']\n ) => {\n let checkedDiff = new Set<number>();\n let uncheckedDiff = new Set<number>();\n\n const groupIds = groups[groupIndex].items.map(item => item.id);\n\n if (checked) {\n checkedDiff = new Set(groupId ? [ groupId ] : groupIds);\n } else {\n uncheckedDiff = new Set(groupId && selected.has(groupId) ? [ groupId ] : groupIds);\n }\n\n onChange({\n diff: {\n selected: checkedDiff,\n deselected: uncheckedDiff\n }\n });\n }, [ groups, onChange, selected ]);\n\n return (\n <div className={cn()}>\n {groups.map((group, groupIdx) => {\n const { title, items, id: groupId } = group;\n\n const isGroupIdChecked = groupId && selected.has(groupId);\n const isGroupChecked = isGroupIdChecked || items.every(item => selected.has(item.id));\n const isGroupItemChecked = ! isGroupChecked ? items.some(item => selected.has(item.id)) : false;\n\n return (\n <div className={cn('group')} key={title}>\n <Checkbox\n name='districtGroupId'\n value={isGroupChecked || isGroupItemChecked}\n indeterminate={isGroupItemChecked}\n onChange={newValue => handleCheckboxGroupChange(newValue, groupIdx, groupId)}\n >\n <b>{ title }</b>\n </Checkbox>\n <div className={cn('list')}>\n {items.map(item => (\n <div className={cn('item', { isIntracity: item?.isIntracity })} key={item.id}>\n <Checkbox\n key={item.id}\n name='districtId'\n value={isGroupIdChecked || selected.has(item.id)}\n onChange={\n newValue => handleCheckboxChange(newValue, item.id, groupIdx, groupId)\n }\n >\n {item.title}\n </Checkbox>\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import './styles.css';\n\nimport React, { useCallback, useMemo, Suspense } from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Tabs as DSTabs, Checkbox, Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\nimport { Modal, ModalClosedBy } from '@search/vtbeco-ui/src/components/Modal';\nimport MetroMapSelector from '@search/metro/src/view/components/MetroMapSelector';\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { RegionIdEnum, AdditionalRegionWithMetroIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { MobileTransportLimitFilterView2 } from '../../../mobile/transportLimit/MobileTransportLimitFilterView2';\nimport { FilterTagListItem2 } from '../FilterTagList2/FilterTagList2';\nimport type { GeoFilter, TransportLimitFilter } from '../../../../../models/Filter';\nimport { getDistrictCount, groupDistricts } from '../../../../../helpers/districtHelper';\nimport type { DistrictStore } from '../../../../../../../domain/geo/District';\nimport type { MetroStore } from '../../../../../../../domain/geo/MetroStation';\nimport { ESCAPE } from '../../../../../../constants/keycode';\nimport { DistrictControl } from '../../../../../../common/components/DistrictControl';\nimport GeoErrorBoundary from './GeoErrorBoundary';\n\nimport MetroSuggest from './MetroSuggest';\nimport { DistrictsTab } from './DistricsTab';\n\nconst metroMapMskSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapMsk'));\nconst metroMapSpbSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapSpb'));\nconst metroMapKznSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapKzn'));\nconst metroMapEkbSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapEkb'));\nconst metroMapNskSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapNsk'));\nconst metroMapNnvSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapNnv'));\nconst metroMapSmrSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapSmr'));\n\nconst cn = classname.bind(null, 'GeoSelector');\n\n// TODO: Добавить соответствующий признак в данные (RS-1965)\nconst STATIONS_IN_RING_MSK = [\n 156, 215, 214, 213, 179, 79, 77, 76, 75, 74, 73, 154, 282, 281,\n 280, 279, 278, 314, 313, 312, 152, 180, 178, 177, 159, 31, 28,\n 25, 24, 22, 21, 19, 18, 151, 14567, 126, 14568, 124, 123, 129, 161, 162, 254, 128\n];\n\nexport enum TabsEnum {\n metro,\n district\n}\n\ninterface IProps {\n count: number;\n regionId: RegionIdEnum | AdditionalRegionWithMetroIdEnum;\n activeTab: TabsEnum;\n metro: MetroStore;\n districts: DistrictStore;\n geoFilter: GeoFilter;\n onTabChange: (tab: TabsEnum) => void;\n onClose: () => void;\n onSubmit: () => void;\n onChange: (data: any) => void;\n transportLimitFilter: TransportLimitFilter;\n onChangeTransportLimitChange: (tranpostLimitFilter: TransportLimitFilter) => void;\n}\n\nexport const GeoSelector: React.FC<IProps> = React.memo(({\n count,\n regionId,\n activeTab,\n metro,\n districts,\n onTabChange,\n onClose,\n onChange,\n onSubmit,\n geoFilter,\n transportLimitFilter,\n onChangeTransportLimitChange\n}) => {\n const allowedTabs = [];\n const isMetroTab = activeTab === TabsEnum.metro;\n\n const isKeyPressed = useKeyPress(ESCAPE);\n\n if (isKeyPressed) {\n onClose();\n }\n\n if (! districts.isEmpty()) {\n allowedTabs.push(TabsEnum.district);\n }\n\n const value = useMemo(() => ({\n metroIds: new Set(geoFilter.metroIds),\n districtIds: new Set(geoFilter.districtIds)\n }), [ geoFilter ]);\n\n const districtGroups = useMemo(() => groupDistricts({\n districts: districts.items,\n regionId: regionId as RegionIdEnum\n }), [ districts, regionId ]);\n\n const districtCount = useMemo(\n () => getDistrictCount([ ...value.districtIds ], districtGroups),\n [ value.districtIds, districtGroups ]\n );\n\n const handleModalRequestClose = useCallback((closeBy: ModalClosedBy) => {\n if (closeBy !== ModalClosedBy.ClickOutside) {\n onClose();\n }\n }, [ onClose ]);\n\n const handleSelectedRemove = useCallback(() => {\n onChange({\n [isMetroTab ? 'metroIds' : 'districtIds']: {\n diff: {\n deselected: new Set(isMetroTab ? value.metroIds : value.districtIds)\n }\n }\n });\n }, [ onChange, isMetroTab, value ]);\n\n const handleMetroChange = useCallback(data => {\n onChange({\n metroIds: data\n });\n }, [ onChange ]);\n\n const handleDistrictsChange = useCallback(data => {\n onChange({\n districtIds: data\n });\n }, [ onChange ]);\n\n const [ metroMapSvg, isMetroMapSvgVertical ] = useMemo<\n [] |\n [ typeof metroMapMskSvg ] |\n [ typeof metroMapMskSvg, boolean ]\n >(() => {\n switch (regionId) {\n case RegionIdEnum.MSK:\n case RegionIdEnum.MSK_OBL:\n case RegionIdEnum.MSK_AND_MSK_OBL:\n return [ metroMapMskSvg ];\n\n case RegionIdEnum.SPB:\n case RegionIdEnum.SPB_AND_LEN_OBL:\n case RegionIdEnum.LEN_OBL:\n return [ metroMapSpbSvg ];\n\n case AdditionalRegionWithMetroIdEnum.KZN:\n return [ metroMapKznSvg, true ];\n\n case AdditionalRegionWithMetroIdEnum.EKB:\n return [ metroMapEkbSvg, true ];\n\n case AdditionalRegionWithMetroIdEnum.NSK:\n return [ metroMapNskSvg, true ];\n\n case AdditionalRegionWithMetroIdEnum.NNV:\n return [ metroMapNnvSvg, true ];\n\n case AdditionalRegionWithMetroIdEnum.SMR:\n return [ metroMapSmrSvg, true ];\n\n default:\n return [];\n }\n }, [ regionId ]);\n\n const isMskOrObl = useMemo(() => {\n return (\n regionId === RegionIdEnum.MSK_AND_MSK_OBL ||\n regionId === RegionIdEnum.MSK_OBL ||\n regionId === RegionIdEnum.MSK\n );\n }, [ regionId ]);\n\n if (metroMapSvg) {\n allowedTabs.push(TabsEnum.metro);\n }\n\n const isMetroInRingSelected = STATIONS_IN_RING_MSK.every(id => value.metroIds.has(id));\n\n const handleMetroInRingCheck = useCallback(() => {\n onChange({\n metroIds: {\n diff: {\n [isMetroInRingSelected ? 'deselected' : 'selected']: new Set(STATIONS_IN_RING_MSK)\n }\n }\n });\n }, [ onChange, isMetroInRingSelected ]);\n\n let selectedText;\n\n if (isMetroTab) {\n if (value.metroIds.size) {\n selectedText = `${value.metroIds.size} ${declensionByNumber(value.metroIds.size, [\n 'станция', 'станции', 'станций'\n ])}`;\n }\n } else {\n if (districtCount) {\n selectedText = `${districtCount} ${declensionByNumber(districtCount, [\n 'район', 'района', 'районов'\n ])}`;\n }\n }\n\n const tabs = useMemo<[TabsEnum, string, boolean][]>(() => ([\n [ TabsEnum.metro, 'Метро', value.metroIds.size > 0 ],\n [ TabsEnum.district, 'Район', value.districtIds.size > 0 ]\n ]), [ value.metroIds.size, value.districtIds.size ]);\n\n const MetroSvgComponent = metroMapSvg;\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const showDistrictControl = regionId === RegionIdEnum.SPB || regionId === RegionIdEnum.MSK;\n\n return (\n <Modal\n dataTest='filter-geo-modal'\n borderRadius='none'\n onRequestClose={handleModalRequestClose}\n contentClassName={cn('modal')}\n >\n <div className={cn()}>\n <div className={cn('content', { displayedDistricts: ! isMetroTab })}>\n <div className={cn('metro-map-selector')} style={{ display: isMetroTab ? undefined : 'none' }}>\n {\n MetroSvgComponent ? (\n <GeoErrorBoundary>\n <Suspense fallback=''>\n <MetroSvgComponent>\n {\n svg =>\n <MetroMapSelector\n svg={svg}\n vertical={isMetroMapSvgVertical}\n selected={value.metroIds}\n onChange={handleMetroChange}\n />\n }\n </MetroSvgComponent>\n </Suspense>\n </GeoErrorBoundary>\n ) : null\n }\n </div>\n {isMetroTab ? null : (\n <DistrictsTab\n groups={districtGroups}\n selected={value.districtIds}\n onChange={handleDistrictsChange}\n />\n )}\n </div>\n\n <div className={cn('filters')}>\n <div className={cn('tabs-container')}>\n <Tabs\n tabs={tabs}\n activeTab={activeTab}\n onChange={onTabChange}\n allowedTabs={allowedTabs}\n />\n </div>\n\n {showDistrictControl || isMetroTab ? (\n <div className={cn('grid-row-standart')}>\n {isMetroTab ? (<>\n <MetroSuggest\n metro={metro}\n selected={value.metroIds}\n onChange={handleMetroChange}\n className={cn('metroSuggest')}\n />\n {isMskOrObl ? (\n <Checkbox\n value={isMetroInRingSelected}\n onChange={handleMetroInRingCheck}\n >\n Станции внутри кольца\n </Checkbox>\n ) : null}\n <MobileTransportLimitFilterView2\n filter={transportLimitFilter}\n isTitle\n onChange={onChangeTransportLimitChange}\n containerClass={cn('grid-transportLimit')}\n desktopTitleGap\n />\n </>) : null}\n {showDistrictControl && ! isMetroTab ? (\n <DistrictControl\n regionId={regionId}\n onChange={handleDistrictsChange}\n selectedDistricts={value.districtIds}\n />\n ) : null}\n </div>\n ) : null}\n <div className={cn('bottom-block')}>\n {selectedText ? (\n <FilterTagListItem2\n view='ellipse'\n id='geo-modal-suggest'\n onDelete={handleSelectedRemove}\n >\n {selectedText}\n </FilterTagListItem2>\n ) : null}\n <Button\n fullWidth\n onClick={onSubmit}\n >\n {`Показать${count ? ' ' + formatNumber(count) : ''}`}\n </Button>\n </div>\n </div>\n <div className={cn('close')} onClick={onClose}>\n <Icon name='times' />\n </div>\n </div>\n </Modal>\n );\n});\n\ninterface ITabsProps {\n tabs: [TabsEnum, string, boolean][];\n activeTab: TabsEnum;\n onChange: (activeTab: TabsEnum) => void;\n allowedTabs: TabsEnum[];\n}\n\nconst Tabs: React.FC<ITabsProps> = React.memo(({ activeTab, onChange, allowedTabs, tabs }) => {\n return (\n <DSTabs variant='text' size='s' onChange={onChange} f>\n {\n tabs.filter(([ type ]) => allowedTabs.includes(type as TabsEnum))\n .map((item: [TabsEnum, string, boolean]) => {\n const isActive = item[0] === activeTab;\n\n return (\n <DSTabs.Option\n active={item[0] === activeTab}\n key={item[0]}\n data-test={`filter-geo-selector-tab-${item[0]}`}\n value={item[0]}\n >\n {item[1]}\n {item[2] && ! isActive ? (\n <span className={cn('tab-text-mark')} />\n ) : null}\n </DSTabs.Option>\n );\n })\n }\n </DSTabs>\n );\n});\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { Accreditation } from '@search/filter-enums/enums';\n\nimport { AccreditationFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ Accreditation.ACCREDITED_BY_VTB, 'Аккредитовано ВТБ' ]\n];\n\ninterface IProps {\n filter: AccreditationFilter;\n handleChange: (filter: AccreditationFilter) => void;\n}\n\nexport const DesktopAccreditationFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new AccreditationFilter(val));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Аккредитация'>\n <CheckboxGroup2\n mode='check'\n name='accreditation'\n onChange={onChange}\n value={filter.accreditation}\n colRestriction={2}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { BuildingClass } from '@search/filter-enums/enums';\n\nimport { BuildingClassFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ BuildingClass.ECONOMY, 'Эконом' ],\n [ BuildingClass.COMFORT, 'Комфорт' ],\n [ BuildingClass.COMFORT_PLUS, 'Комфорт+' ],\n [ BuildingClass.BUSINESS, 'Бизнес' ],\n [ BuildingClass.ELITE, 'Элитный' ]\n];\n\ninterface IProps {\n filter: BuildingClassFilter;\n handleChange: (filter: BuildingClassFilter) => void;\n}\n\nexport const DesktopBuildingClassFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new BuildingClassFilter(val));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Класс ЖК'>\n <CheckboxGroup2\n mode='check'\n name='buildingClass'\n onChange={onChange}\n value={filter.buildingClass}\n colRestriction={3}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\nimport Grid from '@vtblife/uikit-grid';\nimport { Checkbox, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { ClosedSalesFilter } from '../../../../models/Filter';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nimport './DesktopClosedSalesFilterView.css';\n\ninterface IProps {\n filter: ClosedSalesFilter;\n handleChange: (filter: ClosedSalesFilter) => void;\n}\n\nconst cn = classname.bind(null, 'DesktopClosedSalesFilterView');\n\nconst TRUE = 'TRUE';\n\nexport const DesktopClosedSalesFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new ClosedSalesFilter(\n val.includes(TRUE)\n ));\n }\n }, [ handleChange ]);\n\n return (\n <div className={cn()}>\n <Grid\n cols={2}\n variables={{\n '--row-gap-xs': '20px',\n '--row-gap-s': '20px',\n '--row-gap-m': '20px',\n '--row-gap-l': '20px',\n '--row-gap-xl': '20px',\n '--column-gap-xs': '20px',\n '--column-gap-s': '20px',\n '--column-gap-m': '20px',\n '--column-gap-l': '20px',\n '--column-gap-xl': '20px'\n }}\n >\n <Grid.Cell>\n <CheckboxGroup2\n mode='check'\n name='closedSales'\n onChange={onChange}\n value={filter.includingClosedSales ? [ TRUE ] : []}\n isFilter\n >\n {[\n <Checkbox\n variant='filter'\n key='closedSales-checkbox'\n name={TRUE}\n block\n >\n С закрытыми продажами\n </Checkbox>\n ]}\n </CheckboxGroup2>\n </Grid.Cell>\n <Grid.Cell>\n <Typography\n variant='tiny-alone'\n color='minor'\n className={cn('explanation')}\n >\n Новостройки, в которых все квартиры от застройщика проданы или продажи временно приостановлены\n </Typography>\n </Grid.Cell>\n </Grid>\n </div>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { NewBuildingDeal } from '@search/filter-enums/enums';\n\nimport { NewBuildingDealFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ NewBuildingDeal.LAW_214, '214 ФЗ' ],\n [ NewBuildingDeal.ESCROW, 'Эскроу-счета' ]\n];\n\ninterface IProps {\n filter: NewBuildingDealFilter;\n handleChange: (filter: NewBuildingDealFilter) => void;\n}\n\nexport const DesktopNewBuildingDealFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new NewBuildingDealFilter(val));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Сделка'>\n <CheckboxGroup2\n mode='check'\n name='newBuildingDeal'\n onChange={onChange}\n value={filter.deal}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { PaymentType } from '@search/filter-enums/enums';\n\nimport { PaymentTypeFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ PaymentType.ARMY_MORTGAGE, 'Военная ипотека' ],\n [ PaymentType.INSTALLMENT, 'Рассрочка' ],\n [ PaymentType.MOTHER_CAPITAL, 'Материнский капитал' ]\n];\n\ninterface IProps {\n filter: PaymentTypeFilter;\n handleChange: (filter: PaymentTypeFilter) => void;\n}\n\nexport const DesktopPaymentTypeFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new PaymentTypeFilter(val));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Покупка'>\n <CheckboxGroup2\n mode='check'\n name='paymentType'\n onChange={onChange}\n value={filter.type}\n colRestriction={2}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { Position } from '@search/filter-enums/enums';\n\nimport { PositionFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ Position.STANDALONE, 'Одиночное здание' ]\n];\n\nconst cn = classname.bind(null, 'DesktopPositionFilterView');\n\ninterface IProps {\n filter: PositionFilter;\n handleChange: (filter: PositionFilter) => void;\n}\n\nexport const DesktopPositionFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback((val: string | string[] | null) => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new PositionFilter(val as Position[]));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2\n className='DesktopPositionFilterView'\n filterTitle='Размер ЖК'\n >\n <CheckboxGroup2\n mode='check'\n name='position'\n onChange={onChange}\n value={filter.position}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { Safety } from '@search/filter-enums/enums';\n\nimport { SafetyFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n [ Safety.GUARDED_AREA, 'Охрана' ],\n [ Safety.CONCIERGE, 'Консьерж' ],\n [ Safety.CLOSED_AREA, 'Закр. территория' ],\n];\n\ninterface IProps {\n filter: SafetyFilter;\n handleChange: (filter: SafetyFilter) => void;\n}\n\nexport const DesktopSafetyFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback((val: string | number | string[] | null) => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new SafetyFilter(val as Safety[]));\n }\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Безопасность'>\n <CheckboxGroup2\n mode='check'\n name='safety'\n onChange={onChange}\n value={filter.safety}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { ParkingFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IParkingFilterProps {\n filter: ParkingFilter;\n handleChange: (filter: ParkingFilter) => void;\n}\n\nenum Parking {\n Closed = 1,\n Underground = 2,\n Opened = 3\n}\n\nconst parkingEnumeration = [\n Parking.Closed,\n Parking.Underground,\n Parking.Opened\n];\n\nconst parkingMapping = {\n [Parking.Closed]: 'Закрытая',\n [Parking.Underground]: 'Подземная',\n [Parking.Opened]: 'Открытая'\n} as const;\n\nexport const DesktopParkingFilterView: React.FC<IParkingFilterProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new ParkingFilter(val.map(elem => Number(elem))));\n }\n }, [ handleChange ]);\n\n const component = parkingEnumeration.map(parking => {\n return (\n <Checkbox\n variant='filter'\n key={parking}\n name={String(parking)}\n block\n >\n {parkingMapping[parking]}\n </Checkbox>\n );\n });\n\n return (\n <Filter2 filterTitle='Парковка'>\n <CheckboxGroup2\n mode='check'\n name='parkingEnumeration'\n onChange={onChange}\n value={filter.parkings.map(elem => String(elem))}\n isFilter\n >\n {component}\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import { AreaUnit } from '@search/filter-enums/enums';\n\nexport const priceTypeShortMapping = {\n [AreaUnit.UNKNOWN]: 'за всё',\n [AreaUnit.METER]: 'за м²',\n [AreaUnit.ARE]: 'за сот.',\n [AreaUnit.MORTGAGE_PAYMENT]: 'Платёж до'\n} as const;\n\nexport const priceTypeMapping = {\n [AreaUnit.UNKNOWN]: 'За всё',\n [AreaUnit.METER]: 'За м²',\n [AreaUnit.ARE]: 'За сотку',\n [AreaUnit.MORTGAGE_PAYMENT]: 'Платёж по ипотеке'\n} as const;\n\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\nimport { abbreviateNumber, formatLocaleNumber } from '@search/helpers/src/formatNumber';\n\nimport { NumberInputRange } from '../NewNumberInputRange/NumberInputRange';\nimport type { INumberRange } from '../../../types/IRange';\n\nimport { priceTypeMapping } from './priceTypeMapping';\nimport './PriceInput.css';\n\nconst cn = classname.bind(null, 'PriceInput');\n\ninterface IPriceInputProps {\n className?: string;\n isShowPriceType?: boolean;\n isShowReset?: boolean;\n range: INumberRange;\n priceType?: AreaUnit;\n priceTypes?: AreaUnit[];\n pricePreset?: INumberRange[];\n handlePriceType: (priceType: AreaUnit) => void;\n handleChange: (value: INumberRange) => void;\n handleFrom: (value: number | null) => void;\n handleTo: (value: number | null) => void;\n handleReset?: () => void;\n mortgageInput?: React.ReactNode;\n}\n\ntype FocusPosition = 'from' | 'to';\n\nexport const PriceInput: React.FC<IPriceInputProps> = ({\n className,\n isShowReset = false,\n range,\n pricePreset = [],\n priceTypes = [ AreaUnit.UNKNOWN ],\n priceType = AreaUnit.UNKNOWN,\n handlePriceType,\n handleChange,\n handleFrom,\n handleTo,\n handleReset = function() {},\n mortgageInput\n}) => {\n const [ focusPosition, updateFocusPosition ] = useState<FocusPosition>('to');\n const isShowPriceType = ! (priceTypes.length === 1 && priceTypes[0] === AreaUnit.UNKNOWN);\n\n const handleFocusMin = useCallback(() => {\n updateFocusPosition('from');\n }, []);\n\n const handleFocusMax = useCallback(() => {\n updateFocusPosition('to');\n }, []);\n\n return (\n <div className={cn('popup-container', undefined, className)}>\n <div className={cn('toolbar')}>\n <div className={cn('price-types')}>\n { isShowPriceType && priceTypes.map(type => (\n <Typography\n key={type.toString()}\n className={cn('price-type-item', { active: type === priceType, mortgagePayment: type === AreaUnit.MORTGAGE_PAYMENT })}\n data-test={`price-type-${type}`}\n onClick={() => handlePriceType(type)}\n >\n {\n // @ts-ignore\n priceTypeMapping[type]\n }\n {type === AreaUnit.MORTGAGE_PAYMENT ? (\n <span className={cn('circle')}>●</span>\n ) : null}\n </Typography>\n ))}\n </div>\n {isShowReset && (\n <Typography\n tag='span'\n onClick={handleReset}\n className={cn('reset')}\n data-test='price-reset'\n >\n Сбросить\n </Typography>\n )}\n </div>\n {priceType === AreaUnit.MORTGAGE_PAYMENT ? mortgageInput : <>\n <NumberInputRange\n size='s'\n unit='₽'\n value={range}\n onChange={handleChange}\n focusFrom={handleFocusMin}\n focusTo={handleFocusMax}\n nameFrom='priceFrom'\n nameTo='priceTo'\n />\n <div className={cn('price-presets')}>\n {\n pricePreset.map(item => {\n const { value: fromValue, type: fromType } = abbreviateNumber(item.from, { thousandsAsNumber: true });\n const { value: toValue, type: toType } = abbreviateNumber(item.to, { thousandsAsNumber: true });\n\n return (\n <div\n key={item.from!.toString()}\n className={cn('predefined-prices')}\n data-test='price-preset'\n >\n <div\n className={cn('price-item', { focus: focusPosition === 'from', active: range.from === item.from })}\n data-test={`price-preset-from-${item.from}`}\n onClick={() => {\n if (focusPosition === 'from') {\n handleFrom(item.from);\n updateFocusPosition('to');\n }\n }}\n >\n {\n focusPosition === 'from' && `${formatLocaleNumber(fromValue!)} ${fromType}`\n }\n </div>\n <div\n className={cn('price-item', { focus: focusPosition === 'to', active: range.to === item.to })}\n data-test={`price-preset-to-${item.to}`}\n onClick={() => {\n if (focusPosition === 'to') {\n handleTo(item.to);\n }\n }}\n >\n {\n focusPosition === 'to' && `${formatLocaleNumber(toValue!)} ${toType}`\n }\n </div>\n </div>\n );\n })\n }\n </div>\n </>}\n </div>\n );\n};\n","import { formatPrice } from '@search/helpers/src/formatPrice';\nimport { Currency } from '@search/filter-enums/enums/Currency';\n\nexport const MINIMAL_MORTGAGE_PAYMENT = 15000;\nexport const minMortgagePaymentFormatted = formatPrice({\n value: MINIMAL_MORTGAGE_PAYMENT * 100,\n currency: Currency.RUB,\n});\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { Checkbox, Dropdown, useDropdown, NumberInput, Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\n// @ts-ignore\nimport classname from '@search/classname/src';\n// @ts-ignore\nimport { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\n// @ts-ignore\nimport { formatNumber, formatRange } from '@search/helpers/src/formatNumber';\nimport { PredefinedPrice } from '../../../../types/PredefinedPrice';\nimport { MortgagePaymentFilter, PriceFilter } from '../../../../models/Filter';\nimport { PriceInput } from '../../../common/PriceInput/PriceInput';\nimport { priceTypeShortMapping } from '../../../common/PriceInput/priceTypeMapping';\nimport { FilterSelectButton, FilterSelectButtonBorderSide } from '../../../common/FilterSelect';\nimport { MINIMAL_MORTGAGE_PAYMENT, minMortgagePaymentFormatted } from '../../../../helpers/contants';\nimport { INumberRange } from '../../../../types/IRange';\n\nimport './DesktopPriceFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopPriceFilterView');\n\ninterface IMortgagePaymentInput {\n preset?: number[];\n onChange: (filter: PriceFilter | MortgagePaymentFilter) => void;\n filter: MortgagePaymentFilter;\n priceFilter?: PriceFilter;\n mobile?: boolean;\n handlePriceType?: (priceType: AreaUnit) => void;\n toggle?: (update?: boolean) => void;\n}\n\ninterface IDesktopPriceFilterViewProps {\n filter: PriceFilter;\n mortgagePaymentFilter?: MortgagePaymentFilter;\n priceTypes?: AreaUnit[];\n pricePreset?: PredefinedPrice[] | number[];\n onChange: (filter: PriceFilter | MortgagePaymentFilter) => void;\n updateFewFilters?: (filters: (PriceFilter | MortgagePaymentFilter)[]) => void;\n isLarge?: boolean;\n inputBorderSide?: FilterSelectButtonBorderSide;\n}\n\nfunction getAreaUnitPlaceholder(filter: PriceFilter, priceTypes: AreaUnit[]) {\n const { from, to } = filter.value;\n const priceType = filter.priceType;\n\n if (priceTypes.length === 1 && priceTypes[0] === AreaUnit.UNKNOWN) {\n return '';\n }\n\n if (priceTypes.length > 1 && (from || to)) {\n // @ts-ignore\n return priceTypeShortMapping[priceType];\n }\n\n return '';\n}\n\nexport const DesktopPriceFilterView : React.FC<IDesktopPriceFilterViewProps> = props => {\n return (\n <Dropdown>\n <DesktopPriceFilterViewWithoutDropdown {...props} />\n </Dropdown>\n );\n};\n\nconst DesktopPriceFilterViewWithoutDropdown: React.FC<IDesktopPriceFilterViewProps> = ({\n filter,\n mortgagePaymentFilter,\n pricePreset = [],\n priceTypes = [ AreaUnit.UNKNOWN ],\n onChange,\n isLarge,\n inputBorderSide = 'square',\n updateFewFilters,\n}) => {\n const { toggle, opened, registerControl } = useDropdown();\n const control = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n registerControl(control.current as HTMLElement);\n }, [ registerControl ]);\n\n const handleChange = useCallback((value: INumberRange) => {\n if (mortgagePaymentFilter) {\n onChange(new MortgagePaymentFilter());\n }\n onChange(new PriceFilter(filter.priceType, value));\n }, [ filter.priceType, onChange, mortgagePaymentFilter ]);\n const handleChangeMortgagePayment = useCallback((newFilter: MortgagePaymentFilter | PriceFilter) => {\n if (newFilter instanceof MortgagePaymentFilter && newFilter.payment && updateFewFilters) {\n updateFewFilters([ new PriceFilter(filter.priceType, { from: null, to: null }), newFilter ]);\n } else {\n onChange(newFilter);\n }\n }, [ filter.priceType, onChange, updateFewFilters ]);\n\n const handleFrom = useCallback((value: INumberRange['from']) => {\n onChange(new PriceFilter(filter.priceType, { from: value, to: filter.value.to }));\n }, [ filter.priceType, onChange, filter.value.to ]);\n\n const handleTo = useCallback((value: INumberRange['to']) => {\n toggle();\n onChange(new PriceFilter(filter.priceType, { from: filter.value.from, to: value }));\n }, [ filter.priceType, onChange, filter.value.from, toggle ]);\n\n const handlePriceType = useCallback((value: AreaUnit) => {\n onChange(new PriceFilter(value, filter.value));\n }, [ onChange, filter ]);\n\n const handleReset = useCallback(() => {\n if (mortgagePaymentFilter) onChange(new MortgagePaymentFilter(null));\n onChange(new PriceFilter(filter.priceType, { from: null, to: null }));\n toggle();\n }, [ filter.priceType, onChange, toggle ]);\n\n const { from, to } = filter.value;\n\n const placeholder = formatRange(\n from,\n to\n );\n\n const areaUnitPlaceholder = getAreaUnitPlaceholder(filter, priceTypes);\n\n const mortgageInput = mortgagePaymentFilter ? (<MortgagePaymentInput\n filter={mortgagePaymentFilter}\n priceFilter={filter}\n preset={pricePreset as number[]}\n onChange={handleChangeMortgagePayment}\n handlePriceType={handlePriceType}\n toggle={toggle}\n />) : null;\n\n return (\n <div className={cn()}>\n <FilterSelectButton\n size={isLarge ? 'l' : 'm'}\n dataTest='price-trigger'\n side={inputBorderSide}\n ref={control}\n // @ts-ignore\n onClick={toggle}\n focused={opened}\n className={cn('trigger')}\n icon={<Icon name={opened ? 'chevron-up' : 'chevron-down'} size='s' />}\n >\n {filter.priceType === AreaUnit.MORTGAGE_PAYMENT && mortgagePaymentFilter ? <span style={{ marginRight: 4 }}>\n {mortgagePaymentFilter.payment ? `Платёж до ${formatNumber(mortgagePaymentFilter.payment)}₽ / мес.` : 'Платёж'}\n </span> : (\n <>\n <span style={{ marginRight: 4 }}>{placeholder ? `${placeholder} ₽` : 'Цена'}</span>\n <span>{areaUnitPlaceholder}</span>\n </>\n )}\n </FilterSelectButton>\n <Dropdown.Content adaptivePlacement={false}>\n <PriceInput\n isShowReset\n handleReset={handleReset}\n range={filter.value}\n priceType={filter.priceType}\n priceTypes={priceTypes}\n // @ts-ignore\n pricePreset={pricePreset}\n handlePriceType={handlePriceType}\n handleChange={handleChange}\n handleFrom={handleFrom}\n handleTo={handleTo}\n mortgageInput={mortgageInput}\n />\n </Dropdown.Content>\n </div>\n );\n};\n\nexport const MortgagePaymentInput: React.FC<IMortgagePaymentInput> = ({\n preset,\n filter,\n onChange,\n mobile = false,\n handlePriceType,\n toggle\n}) => {\n const handleChange = useCallback((payment: number) => {\n if (isNaN(payment)) {\n onChange(new MortgagePaymentFilter());\n handlePriceType?.(AreaUnit.UNKNOWN);\n } else {\n onChange(new MortgagePaymentFilter(payment));\n }\n }, [ onChange, handlePriceType ]);\n\n return (\n <div className={cn('filter.payment')}>\n <NumberInput\n value={filter.payment ?? undefined}\n onChange={handleChange}\n error={Boolean(filter.payment && filter.payment < MINIMAL_MORTGAGE_PAYMENT)}\n size='s'\n placeholder='до'\n postfix='₽ / мес.'\n />\n {filter.payment && filter.payment < MINIMAL_MORTGAGE_PAYMENT ? (\n <Typography color='link-alt-bg-hover' variant='secondary-alone' className={cn('error')}>\n Минимальный платёж по ипотеке в вашем регионе — {minMortgagePaymentFormatted} ₽/мес.\n </Typography>) :\n null\n }\n {! mobile ? <div className={cn('presets')}>\n {preset?.map(value => (\n <div key={value}>\n <Checkbox\n variant='filter'\n value={filter.payment === value}\n onChange={(v) => {\n toggle?.();\n if (v) handleChange(value);\n }}\n block\n >\n {formatNumber(value)}\n </Checkbox>\n </div>\n ))}\n </div> : null}\n </div>\n );\n};\n","import React, { useCallback, useMemo, useState } from 'react';\n\nimport { Select, Dropdown, useSelect } from '@vtblife/uikit';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { useGeoUserRegion } from '@search/geo/src/useGeoUserRegion';\nimport {\n getFilteredFlatRegionSelectOptions,\n getSelectedOptionLabel\n} from '../../../../helpers/regionHelper';\nimport defaultRegionSelectOptions from '../../../../../../dict/filters/regions';\nimport { RegionFilter } from '../../../../../filters/models/Filter';\nimport {\n RenderRegionSelectUikitContent,\n OptionTypeRegionFilter, GroupedOptions,\n MIN_OPTIONS_NUMBER_WITH_INPUT\n} from '../../region/RenderRegionSelectUikitContent';\n\ninterface IProps {\n filter: RegionFilter;\n options?: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[];\n onChange: (filter: RegionFilter) => void;\n emptyText?: React.ReactNode;\n}\n\nconst defaultOptions = defaultRegionSelectOptions.map(option => ({\n ...option,\n value: String(option.value)\n}));\n\nexport const DesktopRegionFilterView: React.FC<IProps> = ({\n filter,\n options = defaultOptions,\n onChange,\n emptyText\n}) => {\n const [ searchInputValue, setSearchInputValue ] = useState('');\n const resetSearchInputValue = useCallback(() => setSearchInputValue(''), []);\n const { setRegionId } = useGeoUserRegion();\n const value = String(filter.region || RegionIdEnum.MSK_AND_MSK_OBL);\n\n const { is, handleChange: handleSelectChange } = useSelect(\n (newValue: string) => {\n const parsedValue = parseInt(newValue, 10) as RegionIdEnum;\n\n setRegionId(parsedValue);\n onChange(new RegionFilter(parsedValue));\n },\n { selected: value }\n );\n\n const title = useMemo(\n () => getSelectedOptionLabel(value, options),\n [ value, options ]\n );\n\n let currentOptions = options;\n\n if (searchInputValue.length) {\n currentOptions = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n }\n\n return (\n <Select\n onChange={handleSelectChange}\n dataTest='region'\n onToggle={() => {\n resetSearchInputValue();\n }}\n >\n <Dropdown.Control arrow size='s' dataTest='region-trigger'>{title}</Dropdown.Control>\n <Select.Content\n height={310}\n adaptiveHeight={false}\n adaptivePlacement={false}\n placement='local'\n >\n <RenderRegionSelectUikitContent\n is={is}\n searchInputValue={searchInputValue}\n emptyText={emptyText}\n setSearchInputValue={setSearchInputValue}\n showInput={options.length >= MIN_OPTIONS_NUMBER_WITH_INPUT}\n options={currentOptions}\n />\n </Select.Content>\n </Select>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Select, useMultipleSelect } from '@vtblife/uikit';\nimport { SelectMode, OptionType, SelectProps } from '@vtblife/uikit/legacy';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { RoomFilter } from '../../../../models/Filter';\n\ninterface IProps {\n filter: RoomFilter;\n onChange: (filter: RoomFilter) => void;\n isLarge?: boolean;\n}\n\nconst SELECT_OPTIONS: OptionType<Rooms>[] = [\n { label: 'Студия', value: Rooms.STUDIO },\n { label: '1 комната', value: Rooms.ROOM_1 },\n { label: '2 комнаты', value: Rooms.ROOM_2 },\n { label: '3 комнаты', value: Rooms.ROOM_3 },\n { label: '4 комнаты', value: Rooms.ROOM_4 },\n { label: '5+ комнат', value: Rooms.ROOM_5_AND_MORE },\n { label: 'Свободная планировка', value: Rooms.OPEN_PLAN }\n];\n\ntype Mutable<T> = {\n -readonly[P in keyof T]: T[P]\n};\n\nexport const DesktopRoomsTypeFilterView: React.FC<IProps> = ({\n filter,\n onChange\n}) => {\n const currentValues = new Set<Rooms>(filter.rooms);\n\n const handleChange = useCallback<NonNullable<SelectProps<OptionType<Rooms>, SelectMode.Multiple>['onChange']>>(\n val => {\n onChange(new RoomFilter(val as Mutable<typeof val>));\n },\n [ onChange ]\n );\n\n const {\n handleChange: handleChangeSelect,\n is\n } = useMultipleSelect<Rooms>(\n handleChange,\n {\n selected: filter.rooms\n }\n );\n\n return (\n <Select mode='multiple' onChange={handleChangeSelect}>\n <Select.Button dataTest='rooms-trigger'>\n {currentValues.size > 0 ?\n renderCustomTitle(SELECT_OPTIONS.filter(({ value }) => currentValues.has(value))) :\n 'Комнат'\n }\n </Select.Button>\n <Select.Content adaptivePlacement={false}>\n {SELECT_OPTIONS.map(({ value, label }) => (\n <Select.Option\n key={value}\n selected={is(value)}\n value={value}\n >{label}</Select.Option>\n ))}\n </Select.Content>\n </Select>\n );\n};\n\nexport const renderCustomTitle = (selectedOptions: OptionType<Rooms>[]) => {\n const parsedValues = selectedOptions.map(({ value, ...rest }) => ({\n value: Number(value) as Rooms,\n ...rest\n }));\n\n if (parsedValues.length === 1) {\n const [ room ] = parsedValues;\n\n return room.value === Rooms.OPEN_PLAN ? 'Своб. план.' : room.label;\n }\n\n return parsedValues\n .reduce<(Pick<OptionType, 'index'> & { customlabel: string })[]>(\n (acc, opt, index, array) => {\n let customlabel = opt.label;\n\n if (opt.value === Rooms.STUDIO) customlabel = 'Ст.';\n if (opt.value === Rooms.OPEN_PLAN) customlabel = 'св. пл.';\n if ([\n Rooms.ROOM_1,\n Rooms.ROOM_2,\n Rooms.ROOM_3,\n Rooms.ROOM_4,\n Rooms.ROOM_5_AND_MORE\n ].includes(opt.value)) {\n const [ count ] = opt.label.split(' ');\n const postFix = array.length < 3 ? ' комн.' : ' к.';\n\n customlabel = `${count}${array.length === index + 1 ? postFix : ''}`;\n }\n\n acc = [\n ...acc,\n {\n index: opt.index,\n customlabel\n }\n ];\n\n return acc;\n }, [])\n .sort((a, b) => a.index! - b.index!)\n .map(opt => opt.customlabel)\n .join(', ');\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { FlatsSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { FlatsSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopFlatsSpecialEventsFilterViewProps {\n filter: FlatsSpecialEventsFilter;\n handleChange: (value: FlatsSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n [ FlatsSpecialEvent.FLAT_DISCOUNT, 'Скидка' ],\n [ FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN, 'Рассрочка' ],\n [ FlatsSpecialEvent.FLAT_SALES_START, 'Старт продаж' ]\n];\n\nexport const DesktopFlatsSpecialEventsFilterView: React.FC<IDesktopFlatsSpecialEventsFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new FlatsSpecialEventsFilter(value));\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Квартиры'>\n <CheckboxGroup2\n mode='check'\n name='flatsSpecialEvents'\n onChange={onChange}\n value={filter.value}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { MiscSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { MiscSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopMiscSpecialEventsFilterViewProps {\n filter: MiscSpecialEventsFilter;\n handleChange: (value: MiscSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n [ MiscSpecialEvent.PROMO, 'Акция' ],\n [ MiscSpecialEvent.GIFT, 'Подарок' ]\n];\n\nexport const DesktopMiscSpecialEventsFilterView: React.FC<IDesktopMiscSpecialEventsFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new MiscSpecialEventsFilter(value));\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Другое'>\n <CheckboxGroup2\n mode='check'\n name='miscSpecialEvents'\n onChange={onChange}\n value={filter.value}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { OtherSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { OtherSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopOtherSpecialEventsFilterViewProps {\n filter: OtherSpecialEventsFilter;\n handleChange: (value: OtherSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n [ OtherSpecialEvent.OTHER_DISCOUNT, 'Скидка' ],\n [ OtherSpecialEvent.OTHER_INSTALLMENT_PLAN, 'Рассрочка' ],\n [ OtherSpecialEvent.OTHER_SALES_START, 'Старт продаж' ]\n];\n\nexport const DesktopOtherSpecialEventsFilterView: React.FC<IDesktopOtherSpecialEventsFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new OtherSpecialEventsFilter(value));\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Паркинг, кладовки'>\n <CheckboxGroup2\n mode='check'\n name='otherSpecialEvents'\n onChange={onChange}\n value={filter.value}\n isFilter\n >\n {\n ITEMS.map(([ value, label ]) => (\n <Checkbox\n variant='filter'\n key={value}\n name={value}\n block\n >\n {label}\n </Checkbox>\n ))\n }\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { WallsType } from '@search/filter-enums/enums/WallsType';\n\nimport { WallsTypeFilter } from '../../../../../filters/models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst wallsEnumeration = [\n WallsType.MONOLITH,\n WallsType.PANEL,\n WallsType.BRICK,\n WallsType.BRICK_MONOLITH,\n WallsType.BLOCK\n];\n\nconst wallsEnumerationWithWood = [\n ...wallsEnumeration,\n WallsType.WOOD\n];\n\nconst wallsMapping = {\n [WallsType.MONOLITH]: 'Монолит',\n [WallsType.PANEL]: 'Панель',\n [WallsType.BRICK]: 'Кирпич',\n [WallsType.BRICK_MONOLITH]: 'Кирпич-монолит',\n [WallsType.BLOCK]: 'Блок',\n [WallsType.WOOD]: 'Дерево'\n};\n\ninterface IWallsFilterProps {\n withWood?: boolean;\n filter: WallsTypeFilter;\n handleChange: (filter: WallsTypeFilter) => void;\n}\n\nexport const DesktopWallsFilterView: React.FC<IWallsFilterProps> = ({\n withWood = true,\n filter,\n handleChange\n}) => {\n const onChange = useCallback(val => {\n if (val === null) {\n return;\n }\n\n if (Array.isArray(val)) {\n handleChange(new WallsTypeFilter(val));\n }\n }, [ handleChange ]);\n\n const component = (withWood ? wallsEnumerationWithWood : wallsEnumeration).map(wall => {\n return (\n <Checkbox\n variant='filter'\n key={wall}\n name={String(wall)}\n block\n >\n {wallsMapping[wall]}\n </Checkbox>\n );\n });\n\n return (\n <Filter2 filterTitle='Материал стен'>\n <CheckboxGroup2\n mode='check'\n name='walls'\n onChange={onChange}\n value={filter.walls.map(elem => String(elem))}\n colRestriction={3}\n isFilter\n >\n {component}\n </CheckboxGroup2>\n </Filter2>\n );\n};\n","/* eslint-disable no-shadow */\nimport React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\nimport { FloorConstraints } from '@search/filter-enums/enums/FloorConstraints';\n\nimport { FloorFilter } from '../../../models/Filter';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { Filter2, IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { CheckboxGroup2, ICheckboxGroupModificationProps } from '../../common/CheckboxGroup2';\n\nimport './FloorFilter.css';\n\nconst cn = classname.bind(null, 'FloorFilter');\n\ninterface IFloorFilterProps extends IFilterAvailableProps, ICheckboxGroupModificationProps {\n filter: FloorFilter;\n handleChange: (value: FloorFilter) => void;\n renderFloorTotalFilter?: React.ReactElement;\n classNameSubGroup?: string;\n}\n\nenum Floors {\n NotFirst = 1,\n NotLast = 2,\n Last = 3\n}\n\nconst floorOptions = [ {\n label: 'Не первый',\n value: Floors.NotFirst\n}, {\n label: 'Не последний',\n value: Floors.NotLast\n}, {\n label: 'Последний',\n value: Floors.Last\n} ];\n\nexport const FloorFilterView: React.FC<IFloorFilterProps> = ({\n filter,\n handleChange,\n renderFloorTotalFilter,\n withoutTitle,\n withoutGrid,\n classNameGroup\n}) => {\n const value = getValue(filter);\n const valueSet = new Set(value);\n const onChangeCtx = { filter, handleChange, valueSet };\n const onChangeCtxRef = React.useRef(onChangeCtx);\n\n onChangeCtxRef.current = onChangeCtx;\n\n const onChange = useCallback((values: Floors[]) => {\n const { filter, handleChange, valueSet } = onChangeCtxRef.current;\n\n let newValue: Floors | undefined;\n let isFirstSeen = false;\n let isLastSeen = false;\n\n values.forEach(val => {\n const isNew = ! valueSet.has(val);\n\n if (isNew) newValue = val;\n });\n\n let last: FloorConstraints = FloorConstraints.UNKNOWN;\n let first: FloorConstraints = FloorConstraints.UNKNOWN;\n\n if (newValue !== undefined) {\n values.unshift(newValue);\n }\n\n values.forEach(newValue => {\n if (! isFirstSeen && newValue === Floors.NotFirst) {\n isFirstSeen = true;\n first = FloorConstraints.EXCLUDE;\n }\n if (! isLastSeen && (newValue === Floors.NotLast || newValue === Floors.Last)) {\n isLastSeen = true;\n if (newValue === Floors.NotLast) last = FloorConstraints.EXCLUDE;\n if (newValue === Floors.Last) last = FloorConstraints.ONLY;\n }\n });\n handleChange(new FloorFilter(filter.range, first, last));\n }, [ ]);\n\n const handleRangeChange = useCallback(value => {\n handleChange(new FloorFilter(value, filter.first, filter.last));\n }, [ filter, handleChange ]);\n\n const renderCheckboxGroup = (\n <CheckboxGroup2\n mode='check'\n onChange={onChange}\n name='floor'\n value={value}\n withoutGrid={withoutGrid}\n classNameGroup={classNameGroup}\n isFilter\n >\n {floorOptions.map(({ value: floorValue, label }) => (\n <Checkbox\n variant='filter'\n name={floorValue}\n key={floorValue}\n block\n >\n {label}\n </Checkbox>\n ))}\n </CheckboxGroup2>\n );\n\n const renderFloorFilter = (\n <Filter2\n filterTitle={withoutTitle ? undefined : 'Этаж'}\n >\n <NumberInputRange\n size={Size.Small}\n fromLabel='от'\n toLabel='до'\n value={filter.range}\n onChange={handleRangeChange}\n max={1_000}\n nameFrom='floorFrom'\n nameTo='floorTo'\n />\n </Filter2>\n );\n\n return (<>\n <div className={cn('group')}>\n {renderFloorFilter}\n {renderFloorTotalFilter}\n </div>\n {renderCheckboxGroup}\n </>);\n};\n\nfunction getValue(filter: FloorFilter): Floors[] {\n const result = [];\n\n if (FloorConstraints.EXCLUDE === filter.first) {\n result.push(Floors.NotFirst);\n }\n if (FloorConstraints.EXCLUDE === filter.last) {\n result.push(Floors.NotLast);\n }\n if (FloorConstraints.ONLY === filter.last) {\n result.push(Floors.Last);\n }\n\n return result;\n}\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { FloorsTotalFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IFloorsTotalFilterViewProps extends IFilterAvailableProps {\n filter: FloorsTotalFilter;\n handleChange: (value: FloorsTotalFilter) => void;\n isMobile?: boolean;\n}\n\nexport const FloorsTotalFilterView: React.FC<IFloorsTotalFilterViewProps> = ({\n filter,\n handleChange,\n withoutTitle,\n isMobile\n}) => {\n const onChange = useCallback((value: INumberRange) => {\n handleChange(new FloorsTotalFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Этажей в доме'}>\n <NumberInputRange\n size={Size.Small}\n fromLabel='от'\n toLabel='до'\n value={filter.range}\n onChange={onChange}\n max={1_000}\n nameFrom='floorsTotalFrom'\n nameTo='floorsTotalTo'\n ></NumberInputRange>\n </MobileFilter2>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { NumberInput } from '@vtblife/uikit';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { KitchenAreaFilter } from '../../../models/Filter';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IKitchenAreaFilterProps extends IFilterAvailableProps {\n filter: KitchenAreaFilter;\n handleChange: (value: KitchenAreaFilter) => void;\n withPlaceholder?: boolean;\n isMobile?: boolean;\n}\n\nexport const KitchenAreaFromFilterView: React.FC<IKitchenAreaFilterProps> = ({\n filter,\n handleChange,\n withoutTitle,\n withPlaceholder,\n isMobile\n}) => {\n const onChange = useCallback((value: number | null | string) => {\n const minValue = value === null || value === undefined || isNaN(value) || value === '' ?\n null :\n Number(value.toString().replace(/\\s/, ''));\n\n handleChange(new KitchenAreaFilter({ from: minValue, to: null }));\n }, [ handleChange ]);\n\n return (\n <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Площадь кухни'}>\n <NumberInput\n value={filter.value.from ?? undefined}\n postfix='м²'\n placeholder={withPlaceholder ? 'Кухня от' : 'от'}\n onChange={onChange}\n max={100_000}\n name='kitchenAreaFrom'\n size='s'\n />\n </MobileFilter2>\n );\n};\n\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { LivingAreaFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\n\ninterface ILivingAreaFilterProps {\n filter: LivingAreaFilter;\n handleChange: (value: LivingAreaFilter) => void;\n}\n\nexport const LivingAreaFilterView: React.FC<ILivingAreaFilterProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback((value: INumberRange) => {\n handleChange(new LivingAreaFilter(value));\n }, [ handleChange ]);\n\n return (\n <Filter2 filterTitle='Жилая'>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n value={filter.value}\n onChange={onChange}\n nameFrom='livingAreaFrom'\n nameTo='livingAreaTo'\n max={100_000}\n ></NumberInputRange>\n </Filter2>\n );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { Accreditation } from '@search/filter-enums/enums';\nimport { AccreditationFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: Accreditation.ACCREDITED_BY_VTB,\n label: 'Аккредитовано ВТБ',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n filter: AccreditationFilter;\n handleChange: (filter: AccreditationFilter) => void;\n}\n\nexport const MobileAccreditationFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new AccreditationFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Аккредитация'\n >\n <MultiSelect\n name='accreditation'\n className='container container__clamp'\n options={selectOptions}\n value={filter.accreditation}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { IsApartmentsOptions } from '@search/filter-enums/enums';\nimport { ApartmentFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileApartmentFilterViewProps {\n filter: ApartmentFilter;\n handleChange: (filter: ApartmentFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n value: IsApartmentsOptions.APARTMENTS_ONLY,\n label: 'Апартаменты',\n className: 'col-xs-12 filter-item-gap'\n},\n{\n value: IsApartmentsOptions.NO_APARTMENTS,\n label: 'Без апартаментов',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileApartmentFilterView: React.FC<IMobileApartmentFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n value = (value === null) ? IsApartmentsOptions.UNKNOWN : value;\n handleChange(new ApartmentFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Апартаменты'\n >\n <RadioSelect\n allowNull\n name='apartment'\n className='container container__clamp'\n options={selectOptions}\n value={filter.isApartment || null}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { BalconyOptions } from '@search/filter-enums/enums';\nimport { BalconyFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileBalconyFilterViewProps {\n filter: BalconyFilter;\n handleChange: (filter: BalconyFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n value: BalconyOptions.HAS_ANY,\n label: 'Балкон',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileBalconyFilterView: React.FC<IMobileBalconyFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new BalconyFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Балкон/лоджия'\n >\n <RadioSelect\n allowNull\n name='balcony'\n className='container container__clamp'\n options={selectOptions}\n value={filter.hasBalcony}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Bathroom } from '@search/filter-enums/enums';\nimport { BathroomFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileBathroomFilterViewProps {\n filter: BathroomFilter;\n handleChange: (filter: BathroomFilter) => void;\n hasSeveral?: boolean;\n}\n\nconst selectOptions: MultiSelectOption[] = [\n {\n value: Bathroom.COMBINED,\n label: 'Совмещённый',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: Bathroom.PARTED,\n label: 'Раздельный',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nconst selectOptionsWithSeveral: MultiSelectOption[] = [\n ...selectOptions,\n {\n value: Bathroom.SEVERAL,\n label: 'Несколько',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nexport const MobileBathroomFilterView: React.FC<IMobileBathroomFilterViewProps> = ({\n filter,\n handleChange,\n hasSeveral = true\n}) => {\n const onChange = useCallback(value => {\n handleChange(new BathroomFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Санузел'\n >\n <MultiSelect\n name='bathroom'\n className='container container__clamp'\n options={hasSeveral ? selectOptionsWithSeveral : selectOptions}\n value={filter.value}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { BuildingClass } from '@search/filter-enums/enums';\nimport { BuildingClassFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: BuildingClass.ECONOMY,\n label: 'Эконом',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: BuildingClass.COMFORT,\n label: 'Комфорт',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: BuildingClass.COMFORT_PLUS,\n label: 'Комфорт+',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: BuildingClass.BUSINESS,\n label: 'Бизнес',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: BuildingClass.ELITE,\n label: 'Элитное',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n filter: BuildingClassFilter;\n handleChange: (filter: BuildingClassFilter) => void;\n}\n\nexport const MobileBuildingClassFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new BuildingClassFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Класс ЖК'\n >\n <MultiSelect\n name='buildingClass'\n className='container container__clamp'\n options={selectOptions}\n value={filter.buildingClass}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { CeilingHeight } from '@search/filter-enums/enums';\nimport { CellHeightFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileCeilHeightFilterViewProps {\n filter: CellHeightFilter;\n handleChange: (filter: CellHeightFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n value: CeilingHeight.FROM_2_5,\n label: 'от 2,5 м',\n className: 'col-xs-6 filter-item-gap'\n}, {\n value: CeilingHeight.FROM_2_7,\n label: 'от 2,7 м',\n className: 'col-xs-6 filter-item-gap'\n}, {\n value: CeilingHeight.FROM_3,\n label: 'от 3 м',\n className: 'col-xs-6 filter-item-gap'\n}, {\n value: CeilingHeight.FROM_4,\n label: 'от 4 м',\n className: 'col-xs-6 filter-item-gap'\n} ];\n\nexport const MobileCeilHeightFilterView: React.FC<IMobileCeilHeightFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new CellHeightFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Высота потолков'\n >\n <RadioSelect\n allowNull\n name='cellHeight'\n className='container container__clamp'\n options={selectOptions}\n value={filter.value}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { ClosedSalesFilter } from '../../../../models/Filter';\nimport { RadioOption, RadioSelect } from '../../common/RadioSelect';\n\nimport './MobileClosedSalesFilterView.css';\n\ninterface IProps {\n filter: ClosedSalesFilter;\n handleChange: (filter: ClosedSalesFilter) => void;\n}\n\nconst cn = classname.bind(null, 'MobileClosedSalesFilterView');\n\nconst TRUE = 'TRUE';\n\nconst selectOptions: RadioOption[] = [ {\n value: TRUE,\n label: 'С закрытыми продажами',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileClosedSalesFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new ClosedSalesFilter(Boolean(value)));\n }, [ handleChange ]);\n\n return (\n <div className={cn()}>\n <RadioSelect\n allowNull\n name='closedSales'\n className='container container__clamp'\n options={selectOptions}\n value={filter.includingClosedSales ? TRUE : null}\n handleChange={onChange}\n />\n <Typography\n variant='tiny-alone'\n color='minor'\n className={cn('explanation')}\n >\n Новостройки, в которых все квартиры от застройщика проданы или продажи временно приостановлены\n </Typography>\n </div>\n );\n};\n","import React, { useCallback } from 'react';\nimport { PlainSelect as Select, PlainSelectOption } from '@vtblife/uikit';\nimport { Commissioning, Quarter } from '@search/filter-enums/enums';\n\nimport { quarters } from '@search/helpers/src/quarters';\nimport { CommissioningFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\ninterface IMobileCommissioningFilterViewProps {\n filter: CommissioningFilter;\n onChange: (filter: CommissioningFilter) => void;\n options?: PlainSelectOption[];\n onMap?: boolean;\n}\n\nconst defaultOptions: PlainSelectOption[] = [\n {\n value: Commissioning.UNKNOWN,\n text: 'Любой срок сдачи'\n },\n {\n value: Commissioning.COMMISSIONED,\n text: 'Сдан'\n },\n {\n value: Commissioning.IN_PROGRESS,\n text: 'Строится'\n },\n ...quarters()\n .map(({ quarter, year }) => ({\n value: `${Quarter[quarter]}_${year}`,\n text: `До ${quarter} кв. ${year}`\n }))\n];\n\nexport const MobileCommissioningFilterView: React.FC<IMobileCommissioningFilterViewProps> = ({\n filter,\n onChange,\n options = defaultOptions,\n onMap\n}) => {\n const handleChange = useCallback(\n (val: string) => onChange(new CommissioningFilter(val)),\n [ onChange ]\n );\n\n let { commissioning } = filter;\n\n if (! options.some(({ value }) => value === commissioning)) {\n commissioning = Commissioning.UNKNOWN;\n }\n\n return (\n <MobileFilter>\n <div className='container'>\n <div className='col-xs-12'>\n <Select\n name='commissioning'\n dataTest='commissioning'\n size='s'\n value={commissioning}\n options={options}\n onChange={v => handleChange(v as string)}\n height={onMap ? 400 : undefined}\n native={! onMap}\n />\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport {\n SuggestTypeEnum,\n SuggestItemDeveloper\n} from '@search/graphql-typings';\nimport {\n graphql,\n useGqlContext\n} from '@search/gql-client/src';\n\nimport classname from '@search/classname/src';\nimport { Highlight } from '@search/vtbeco-ui/src/components/controls/Highlight/Highlight';\nimport Suggest from '@search/vtbeco-ui/src/components/controls/Suggest';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\n\nimport useDebouncedCallback from '../../../../../common/hooks/useDebouncedCallback';\n\nimport type {\n MobileDeveloperSuggestModalQuery$data as MobileDeveloperSuggestModalQueryResponse,\n MobileDeveloperSuggestModalQuery$variables as MobileDeveloperSuggestModalQueryVariables\n} from './__generated__/MobileDeveloperSuggestModalQuery.graphql';\n\nimport './MobileDeveloperSuggestModal.css';\n\nconst cn = classname.bind(null, 'MobileDeveloperSuggestModal');\n\nconst QUERY = graphql`\n query MobileDeveloperSuggestModalQuery($text: String! $suggestTypes: [SuggestTypeEnum!]) {\n suggest(text: $text suggestTypes: $suggestTypes) {\n __typename\n\n ... on SuggestItemDeveloper {\n label\n data {\n id\n scope\n }\n developer {\n title\n id\n }\n }\n }\n }\n`;\n\ninterface IMobileDeveloperSuggestModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n hide: () => void;\n onChange: (value?: SuggestItemDeveloper) => void;\n value?: SuggestItemDeveloper;\n placeholder: string;\n}\n\nconst MobileDeveloperSuggestModal: React.FC<IMobileDeveloperSuggestModalProps> = ({\n hide,\n onChange,\n value,\n placeholder,\n uikitZIndexEnabled\n}) => {\n const gql = useGqlContext();\n\n const handleSelect = useCallback((val?: SuggestItemDeveloper) => {\n onChange(val);\n val && hide();\n }, [ hide, onChange ]);\n\n const handleClear = useCallback(() => {\n onChange();\n }, [ onChange ]);\n\n const [ suggestions, setSuggestions ] = useState<SuggestItemDeveloper[]>([]);\n\n const [ debouncedSuggest ] = useDebouncedCallback(\n (text: string) => {\n gql.execute<MobileDeveloperSuggestModalQueryVariables, MobileDeveloperSuggestModalQueryResponse>(\n QUERY, {\n text,\n suggestTypes: [ SuggestTypeEnum.Developer ]\n })\n .then(data => {\n if (data.data) {\n setSuggestions(data?.data?.suggest || []);\n } else {\n setSuggestions([]);\n }\n }).catch(() => setSuggestions([]));\n },\n 300\n );\n\n const fetchSuggestions = (text: string) => {\n debouncedSuggest(text);\n };\n\n return (\n <Modal\n size={ModalSize.FULL_L}\n borderRadius={BorderRadius.none}\n uikitZIndexEnabled={uikitZIndexEnabled}\n fullScreen\n >\n <ModalHeading\n text='Застройщик'\n onClose={hide}\n />\n <div className={cn('select')}>\n <Suggest\n autoFocus\n clear\n width='max'\n size='xxl'\n inputSize={Size.Small}\n onClear={handleClear}\n borderOut={false}\n placeholder={placeholder}\n suggestion={value}\n suggestions={suggestions}\n fetchSuggestions={fetchSuggestions}\n renderList={(props, { focusedIndex, label }, handlers) => (\n <div className={cn('suggest')}>\n {\n suggestions.map((suggestion, i) => (\n <div\n key={i}\n className={cn('suggestion', {\n highlighted: i === focusedIndex\n })}\n onMouseDown={e => handlers.handleItemMouseDown(e, i)}\n onMouseEnter={e => handlers.handleItemMouseDown(e, i)}\n >\n <div>\n <Highlight\n text={suggestion.label || ''}\n highlight={label || ''}\n />\n {\n suggestion?.data?.scope ? (\n <Typography\n variant='small-alone'\n color='secondary'\n >\n {suggestion.data.scope}\n </Typography>\n ) : null\n }\n </div>\n </div>\n ))\n }\n </div>\n )}\n renderEmptyList={({ emptyText }) => (\n <div className={cn('empty')}>\n {emptyText}\n </div>\n )}\n onSelect={handleSelect}\n clearOnSelect={false}\n />\n </div>\n </Modal>\n );\n};\n\nexport default MobileDeveloperSuggestModal;\n","import React, { MouseEvent, useCallback } from 'react';\nimport {\n SuggestItemDeveloper\n} from '@search/graphql-typings';\nimport { Input, Size } from '@vtblife/uikit/legacy';\nimport { useModal } from '@search/vtbeco-ui/src/components/Modal';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport MobileDeveloperSuggestModal from './MobileDeveloperSuggestModal';\n\nimport './MobileDeveloperFilterView.css';\n\nexport interface IProps {\n onChange: (value?: SuggestItemDeveloper) => void;\n value?: SuggestItemDeveloper;\n placeholder?: string;\n uikitModalZIndexEnabled?: boolean;\n}\n\nexport const MobileDeveloperFilterView: React.FC<IProps> = ({\n value,\n onChange,\n placeholder = 'Название компании',\n uikitModalZIndexEnabled\n}) => {\n const { on: showSuggest, off: hideSuggest, visible: isSuggestVisible } = useModal();\n\n const handleSuggestOpen = useCallback(() => showSuggest(), [ showSuggest ]);\n\n const handleClear = useCallback((e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n onChange();\n }, [ onChange ]);\n\n return (\n <MobileFilter filterTitle='Застройщик'>\n <div\n className={'container'}\n onClick={handleSuggestOpen}\n >\n <div className={'col-xs-12 MobileDeveloperFilterView__input'}>\n <Input\n hasClear\n fullWidth\n placeholder={placeholder}\n value={value?.label}\n size={Size.Small}\n />\n {\n value?.label ? (\n <div\n className='MobileDeveloperFilterView__clear'\n onClick={handleClear}\n />\n ) : null\n }\n </div>\n </div>\n {\n isSuggestVisible ? (\n <MobileDeveloperSuggestModal\n hide={hideSuggest}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n uikitZIndexEnabled={uikitModalZIndexEnabled}\n />\n ) : null\n }\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { FinishingEnum, FinishingTypeEnum } from '@search/graphql-typings';\n\nimport { FinishingTypeFilter, allWithFinishingValues } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst SELECT_OPTIONS: MultiSelectOption<FinishingTypeEnum>[] = [\n {\n value: FinishingTypeEnum.WithoutFinishing,\n label: 'Без отделки',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: FinishingTypeEnum.PreFinishing,\n label: 'Предчистовая',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: FinishingTypeEnum.Fine,\n label: 'Чистовая',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: FinishingTypeEnum.WithFurniture,\n label: 'С мебелью',\n className: 'col-xs-12 filter-item-gap'\n },\n];\n\ninterface IProps {\n filter: FinishingTypeFilter;\n onChange: (filter: FinishingTypeFilter) => void;\n}\n\n/**\n * Фильтр \"Тип отделки\"\n * */\nexport const MobileFinishingTypeFilterView: React.FC<IProps> = ({\n filter,\n onChange\n}) => {\n const handleChange = useCallback(values => {\n const hasAllAvailableValues = new Set([ ...values, ...allWithFinishingValues ]).size === allWithFinishingValues.length && values.length === allWithFinishingValues.length;\n\n onChange(new FinishingTypeFilter({\n hasFinishing: hasAllAvailableValues ? FinishingEnum.Available : undefined,\n finishingType: values\n }));\n }, [ onChange ]\n );\n\n const { finishingType } = filter.value;\n\n return (\n <MobileFilter\n filterTitle='Тип отделки'\n >\n <MultiSelect\n name='finishingType'\n className='container container__clamp'\n options={SELECT_OPTIONS}\n value={finishingType}\n handleChange={handleChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { FloorConstraints } from '@search/filter-enums/enums';\n\nimport { FloorFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\nimport { MultiSelect } from '../../common/MultiSelect';\n\ninterface IMobileFloorFilterViewProps {\n filter: FloorFilter;\n handleChange: (filter: FloorFilter) => void;\n}\n\nenum Floors {\n NotFirst = 1,\n NotLast = 2,\n Last = 3\n}\n\nfunction getFirst(added: Floors[], removed: Floors[]) {\n if (removed.includes(Floors.NotFirst)) {\n return FloorConstraints.UNKNOWN;\n } else if (added.includes(Floors.NotFirst)) {\n return FloorConstraints.EXCLUDE;\n }\n return null;\n}\n\nfunction getLast(added: Floors[], removed: Floors[]) {\n if (removed.includes(Floors.NotLast) || removed.includes(Floors.Last)) {\n return FloorConstraints.UNKNOWN;\n } else if (added.includes(Floors.NotLast)) {\n return FloorConstraints.EXCLUDE;\n } else if (added.includes(Floors.Last)) {\n return FloorConstraints.ONLY;\n }\n\n return null;\n}\n\nconst selectOptions = [\n {\n label: 'Не первый',\n value: Floors.NotFirst,\n className: 'col-xs-12 filter-item-gap'\n },\n {\n label: 'Не последний',\n value: Floors.NotLast,\n className: 'col-xs-12 filter-item-gap'\n },\n {\n label: 'Последний',\n value: Floors.Last,\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nexport const MobileFloorFilterView: React.FC<IMobileFloorFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const value = getValue(filter);\n const onChange = useCallback(newValue => {\n handleChange(new FloorFilter(newValue, filter.first, filter.last));\n }, [ filter, handleChange ]);\n\n const onChangeFloor = useCallback((newValue: Floors[], oldValue: Floors[]) => {\n const added = newValue.filter(x => ! oldValue.includes(x));\n const removed = oldValue.filter(x => ! newValue.includes(x));\n\n const first = getFirst(added, removed);\n const firstValue = (first === null || first === undefined) ? filter.first : first;\n\n const last = getLast(added, removed);\n const lastValue = (last === null || last === undefined) ? filter.last : last;\n\n handleChange(new FloorFilter(filter.range, firstValue, lastValue));\n }, [ value, handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Этаж'\n >\n <div className='container'>\n <div className={'col-xs-12 filter-item-gap'}>\n <NumberInputRange\n size={Size.Small}\n value={filter.range}\n onChange={onChange}\n max={1_000}\n nameFrom='floorFrom'\n nameTo='floorTo'\n />\n </div>\n </div>\n <MultiSelect\n className='container container__clamp'\n name='floor'\n options={selectOptions}\n value={value}\n // @ts-ignore\n handleChange={onChangeFloor}\n />\n </MobileFilter>\n );\n};\n\nfunction getValue(filter: FloorFilter): Floors[] {\n const result = [];\n\n if (FloorConstraints.EXCLUDE === filter.first) {\n result.push(Floors.NotFirst);\n }\n if (FloorConstraints.EXCLUDE === filter.last) {\n result.push(Floors.NotLast);\n }\n if (FloorConstraints.ONLY === filter.last) {\n result.push(Floors.Last);\n }\n\n return result;\n}\n\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\nimport { FloorsTotalFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\nimport '../MobileCommon.css';\n\ninterface IMobileFloorsTotalFilterViewProps {\n filter: FloorsTotalFilter;\n handleChange: (value: FloorsTotalFilter) => void;\n}\n\nexport const MobileFloorsTotalFilterView: React.FC<IMobileFloorsTotalFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new FloorsTotalFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Этажей в доме'\n >\n <div className='container'>\n <div className={'col-xs-12'}>\n <NumberInputRange\n size={Size.Small}\n value={filter.range}\n onChange={onChange}\n nameFrom='floorsTotalFrom'\n nameTo='floorsTotalTo'\n max={1_000}\n />\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import './MetroMark2.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MetroMark2');\n\nexport function MetroMark2Item({ color, children }: { color: string; children?: React.ReactNode }) {\n return (\n <span\n style={{ backgroundColor: color }}\n className={cn('line')}\n >{children ?? colorsToNameMapOut[color]}</span>\n );\n}\n\nexport function MetroMark2({ colors }: {\n colors: readonly string[];\n}) {\n return (\n <span className={cn()}>\n {\n colors.slice(0).reverse().map((color, index) => (\n <MetroMark2Item\n key={index}\n color={color}\n />\n ))\n }\n </span>\n );\n}\n\nconst colorsToNameMapOut: Record<string, string> = {\n '#EA7D27': '6',\n '#4baf4f': '1',\n '#bac8e8': '12',\n '#943f90': '5',\n '#0572b9': '2',\n '#FBCD24': '8',\n '#d68ab1': '15',\n '#d14a43': '14',\n '#BED12E': '10',\n '#DD201C': '1',\n '#F7A600': 'D1',\n '#925233': '5',\n '#41BCEF': '4',\n '#adacac': '9',\n '#E94282': 'D2',\n '#89cdcf': '11',\n '#e42518': '1',\n '#986000': '6',\n '#f07e23': '4',\n '#f03d2f': '1',\n '#23a12c': '2',\n '#0042a5': '2'\n};\n","import './MetroSelect.css';\n\nimport React from 'react';\nimport { Input, Collapse, Tabs, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport { MetroMark2, MetroMark2Item } from '../MetroMark2/MetroMark2';\nimport {\n MetroAlphabetGroup,\n MetroRouteGroup,\n MetroStation,\n MetroStore\n} from '../../../../../../../domain/geo/MetroStation';\n\nimport {\n useMetroSelect,\n UseMetroSelectProps,\n useMetroSelectRouteGroup\n} from './useMetroSelect';\n\nconst cn = classname.bind(null, 'MetroSelect');\n\ninterface MetroSelectProps extends UseMetroSelectProps {\n /** Станции метро */\n metros: MetroStore;\n\n className?: string;\n}\n\nexport const MetroSelect: React.FC<MetroSelectProps> = props => {\n const {\n groupByAlphabet,\n groupByLine,\n isGrouppedByLine,\n checkStations,\n isStationChecked\n } = useMetroSelect(props);\n\n const [ search, setSearchRaw ] = React.useState('');\n const setSearch = React.useCallback((next: string) => {\n setSearchRaw(next);\n }, []);\n const resetSearch = React.useCallback(() => setSearch(''), []);\n\n const groupedByAlphabet = isGrouppedByLine ? [] : props.metros.groupedByAlphabet.map(grp => {\n const stations = grp.stations.filter(station => station.title.toLocaleUpperCase().includes(search.toLocaleUpperCase()));\n\n return { ...grp, stations };\n }).filter(item => item.stations.length !== 0);\n\n const groupedByRoute = ! isGrouppedByLine ? [] : props.metros.groupedByRoute.map(grp => {\n const stations = grp.stations.filter(station => station.title.toLocaleUpperCase().includes(search.toLocaleUpperCase()));\n\n return { ...grp, stations };\n }).filter(item => item.stations.length !== 0);\n\n return (\n <div className={cn()}>\n <div className={cn('filter')}>\n <Input\n size={Size.Small}\n value={search}\n onChange={setSearch}\n onReset={resetSearch}\n type='search'\n placeholder='Название станции'\n >\n <Input.Content placement='start'>\n <Icon name='magnifier' />\n </Input.Content>\n </Input>\n <Tabs size='s' variant='text' onChange={v => v === 'by-alpha' ? groupByAlphabet() : groupByLine()} justified>\n <Tabs.Option value='by-alpha' active={! isGrouppedByLine}>По алфавиту</Tabs.Option>\n <Tabs.Option value='by-line' active={isGrouppedByLine}>По линиям</Tabs.Option>\n </Tabs>\n </div>\n {groupedByRoute.length > 0 && ! search && (<Collapse variant='line'>\n {groupedByRoute.map(group => (\n <RouteGroup\n key={group.route.id}\n group={group}\n isStationChecked={isStationChecked}\n checkStations={checkStations}\n />\n ))}\n </Collapse>)}\n {groupedByRoute.length > 0 && search && (<div className={cn('groups')}>\n {groupedByRoute.map(group => (\n <AlphaGroup\n key={group.route.id}\n group={group}\n isStationChecked={isStationChecked}\n checkStations={checkStations}\n />\n ))}\n </div>)}\n {groupedByAlphabet.length > 0 && (<div className={cn('groups')}>\n {groupedByAlphabet.map(group => (\n <AlphaGroup\n key={group.letter}\n group={group}\n isStationChecked={isStationChecked}\n checkStations={checkStations}\n />\n ))}\n </div>)}\n </div>\n );\n};\n\nfunction RouteGroup({\n group,\n isStationChecked,\n checkStations\n}: {\n group: MetroRouteGroup;\n checkStations: (station: readonly MetroStation[], checked: boolean) => void;\n isStationChecked: (station: MetroStation) => boolean;\n}) {\n const { allChecked, checkAllInGroup } = useMetroSelectRouteGroup(\n group.stations,\n checkStations,\n isStationChecked\n );\n\n const checkedInGroup = group.stations.filter(station => isStationChecked(station)).length;\n\n return (\n <Collapse.Item key={group.id}>\n <Collapse.Title>\n <div className={cn('route-title')}>\n <MetroMark2Item color={group.route.color} />{group.route.title\n .replace(/ (линия|диаметр)$/, '')\n }\n {checkedInGroup > 0 && (\n <div className={cn('route-count')}></div>\n )}\n </div>\n </Collapse.Title>\n <div className={cn('route')}>\n <Item\n onClick={checkAllInGroup}\n checked={allChecked}\n ><div className={cn('all-stations')}>Все станции</div></Item>\n {group.stations.map((station, index) => (\n <Item\n key={station.id}\n checked={isStationChecked(station)}\n onClick={(next) => checkStations([ station ], next)}\n >\n {/* <RouteIcon\n color={group.route.color}\n isFirst={index === 0}\n isLast={index === group.stations.length - 1}\n /> */}\n <div className={cn('all-stations')}>\n <Typography variant='primary'>{station.title}</Typography>\n <MetroMark2\n colors={station.allRoutesColorsList.filter(color => color !== group.route.color)}\n />\n </div>\n </Item>\n ))}\n </div>\n </Collapse.Item>\n );\n}\n\nfunction AlphaGroup({\n group,\n isStationChecked,\n checkStations\n}: {\n group: MetroAlphabetGroup;\n checkStations: (station: readonly MetroStation[], checked: boolean) => void;\n isStationChecked: (station: MetroStation) => boolean;\n}) {\n return (\n <div className={cn('alpha')}>\n {group.letter && (<div className={cn('alpha-title')}>{group.letter}</div>)}\n <div className={cn('items')}>\n {group.stations.map(station => (\n <Item\n key={station.id}\n checked={isStationChecked(station)}\n onClick={checked => checkStations([ station ], checked)}\n >\n <Typography variant='primary'>{station.title}</Typography>\n <MetroMark2 colors={station.allRoutesColorsList} />\n </Item>\n ))}\n </div>\n </div>\n );\n}\n\nfunction Item({ children, checked, onClick }: {\n children?: React.ReactNode;\n checked?: boolean;\n onClick?(checked: boolean, e: React.MouseEvent): void;\n}) {\n return (\n <div\n role='button'\n className={cn('station', { checked })}\n onClick={onClick?.bind(null, ! checked)}\n >\n {children}\n {checked && (\n <div className={cn('check')}>\n <Icon name='check' />\n </div>\n )}\n </div>\n );\n}\n\nfunction RouteIcon({ color, isFirst, isLast }: {\n color: string;\n isLast?: boolean;\n isFirst?: boolean;\n}) {\n return (\n <div style={{ color, lineHeight: 0, width: '20px' }}>\n <svg width='12' height='52' viewBox='0 0 12 52' fill='none' xmlns='http://www.w3.org/2000/svg'>\n {! isFirst && (<path\n clipRule='evenodd'\n fill='currentColor'\n fillRule='evenodd'\n strokeWidth={0.73}\n d='m 4.5,22.610739 2e-5,-22.615407 H 7.5 l -2e-5,22.615407 z'\n />)}\n {! isLast && (<path\n clipRule='evenodd'\n fill='currentColor'\n fillRule='evenodd'\n strokeWidth={0.73}\n d='m 4.5136962,51.995639 2e-5,-22.681184 h 2.99998 l -2e-5,22.681184 z'\n />)}\n <circle\n fill='white'\n stroke='currentColor'\n strokeWidth={3}\n r='4.5'\n cy='26'\n cx='6'\n />\n </svg>\n </div>\n );\n}\n\n","import React from 'react';\nimport type { MetroStation } from '../../../../../../../domain/geo/MetroStation';\n\nexport interface UseMetroSelectProps {\n /**\n * Массив выбранных станций\n */\n checked: readonly number[];\n\n /**\n * Изначально группировать по линиям, а не по алфавиту\n */\n groupByLineInitial?: boolean;\n\n onChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n}\n\nexport function useMetroSelect({\n onChange,\n checked,\n groupByLineInitial\n}: UseMetroSelectProps) {\n const checkSet = React.useMemo(() => new Set(checked), [ checked ]);\n\n const checkStations = React.useCallback(\n (stations: readonly MetroStation[], check: boolean) => {\n const uncheckedDiff = new Set<number>();\n const checkedDiff: number[] = [];\n\n for (const station of stations) {\n if (check) checkedDiff.push(station.id);\n else uncheckedDiff.add(station.id);\n }\n\n onChange(checkedDiff, uncheckedDiff);\n },\n [ onChange ]\n );\n\n const isStationChecked = React.useCallback(\n (station: MetroStation) => checkSet.has(station.id),\n [ checkSet ]\n );\n\n const [ isGrouppedByLine, setIsGrouupedByLine ] = React.useState(\n groupByLineInitial || false\n );\n\n const groupByAlphabetAction = React.useCallback(() => {\n setIsGrouupedByLine(false);\n }, []);\n\n const groupByLineAction = React.useCallback(() => {\n setIsGrouupedByLine(true);\n }, []);\n\n const stationsSelected = checkSet.size;\n\n const reset = React.useCallback(() => {\n onChange([], checkSet);\n }, [ checkSet ]);\n\n return {\n stationsSelected,\n reset,\n isStationChecked,\n checkStations,\n groupByAlphabet: groupByAlphabetAction,\n groupByLine: groupByLineAction,\n isGrouppedByLine\n };\n}\n\nexport function useMetroSelectRouteGroup(\n stations: readonly MetroStation[],\n checkStations: (station: readonly MetroStation[], checked: boolean) => void,\n isStationChecked: (station: MetroStation) => boolean\n) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const allChecked = stations.every(station => isStationChecked(station));\n const checkAllInGroup = React.useCallback(() => {\n checkStations(stations, ! allChecked);\n }, [ stations, checkStations, allChecked ]);\n\n return { allChecked, checkAllInGroup };\n}\n","import './MetroModal.css';\n\nimport React from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport { MetroStore } from '../../../../../../domain/geo/MetroStation';\n\nimport { MetroSelect } from './MetroSelect/MetroSelect';\n\nconst cn = classname.bind(null, 'MetroModal');\n\ninterface IMetroModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n hide: () => void;\n checkedIds: number[];\n store: MetroStore;\n handleChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n onReset: () => void;\n onSubmit: () => void;\n}\n\nexport const MetroModal: React.FC<IMetroModalProps> = ({\n hide: metroOff,\n checkedIds: checkedMetroIds,\n store: stations,\n handleChange,\n onReset,\n onSubmit: onMetroSubmit,\n uikitZIndexEnabled\n}) => {\n return (\n <Modal\n size={ModalSize.FULL_L}\n borderRadius={BorderRadius.none}\n uikitZIndexEnabled={uikitZIndexEnabled}\n fullScreen\n >\n <ModalHeading\n text='Метро'\n reset={onReset}\n activeCount={checkedMetroIds.length}\n onClose={metroOff}\n withDeclension={false}\n />\n <div className={cn('select')}>\n <MetroSelect\n metros={stations}\n checked={checkedMetroIds}\n onChange={handleChange}\n />\n </div>\n <div className={cn('submit')}>\n <Button\n fullWidth\n size='s'\n onClick={onMetroSubmit}\n >\n {checkedMetroIds.length ? `Выбрать ${checkedMetroIds.length} ${\n declensionByNumber(checkedMetroIds.length, [ 'станцию', 'станции', 'станций' ])\n }` : 'Сохранить'}\n </Button>\n </div>\n </Modal>\n\n );\n};\n","import React from 'react';\nimport { RootRegionsApplicationEnum, SuggestTypeEnum } from '@search/graphql-typings';\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport { GeoSuggest } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport './SuggestModal.css';\n\nconst cn = classname.bind(null, 'SuggestModal');\n\ninterface ISuggestModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n regionId: number;\n rootRegionsApp: RootRegionsApplicationEnum;\n hide: () => void;\n handleChange: (ids: SuggestionType) => void;\n onInputToggleFocus?: (disabled: boolean) => void;\n showNewBuildingsGroup?: boolean;\n startWithNewBuildings?: boolean;\n placeholder: string;\n placeholderWithNewBuildings: string;\n limit?: number;\n suggestTypes?: SuggestTypeEnum[];\n selected?: Set<number>;\n}\n\nexport const SuggestModal: React.FC<ISuggestModalProps> = ({\n hide,\n regionId,\n handleChange,\n onInputToggleFocus,\n rootRegionsApp,\n suggestTypes,\n limit,\n showNewBuildingsGroup,\n startWithNewBuildings,\n placeholder,\n placeholderWithNewBuildings,\n uikitZIndexEnabled,\n selected\n}) => {\n return (\n <Modal\n size={ModalSize.FULL_L}\n borderRadius={BorderRadius.none}\n uikitZIndexEnabled={uikitZIndexEnabled}\n fullScreen\n >\n <ModalHeading\n text='Поиск ЖК или адреса'\n onClose={hide}\n />\n <div className={cn('select')}>\n <GeoSuggest\n autoFocus\n clear\n listBorderOut\n regionId={regionId}\n rootRegionsApp={rootRegionsApp}\n suggestTypes={suggestTypes}\n limit={limit}\n borderOut={false}\n onGeoChange={handleChange}\n onInputToggleFocus={onInputToggleFocus}\n showNewBuildingsGroup={showNewBuildingsGroup}\n startWithNewBuildings={startWithNewBuildings}\n placeholder={placeholder}\n placeholderWithNewBuildings={placeholderWithNewBuildings}\n selected={selected}\n />\n </div>\n </Modal>\n );\n};\n","import './DistrictSelectItem.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { DistrictGroup } from '../../../../../../../helpers/districtHelper';\nimport type { ArrayElement } from '../../../../../../../../../types';\n\ninterface DistrictSelectItemProps {\n district: ArrayElement<DistrictGroup['items']>;\n checked: boolean;\n onCheck: (checked: boolean) => void;\n}\n\nconst cnStation = classname.bind(null, 'DistrictSelect__Item');\n\nexport const DistrictSelectItem: React.FC<DistrictSelectItemProps> = ({\n district,\n checked,\n onCheck\n}) => {\n return (\n <div\n role='button'\n className={cnStation(null, { checked })}\n onClick={() => onCheck(! checked)}\n >\n <Typography\n bold={district.isIntracity}\n variant='primary'\n color={checked ? 'blue-500' : 'primary'}\n >\n {district.title}\n </Typography>\n {checked ? <Icon name='check' /> : null}\n </div>\n );\n};\n","import './DistrictSelectGroup.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\ninterface DistrictSelectGroupProps {\n title: string;\n checked: boolean;\n onCheck: (checked: boolean) => void;\n}\n\nconst cnStation = classname.bind(null, 'DistrictSelect__Item');\n\nexport const DistrictSelectGroup: React.FC<DistrictSelectGroupProps> = ({\n title,\n checked,\n onCheck\n}) => {\n return (\n <div\n role='button'\n className={cnStation('group', { checked })}\n onClick={() => onCheck(! checked)}\n >\n <Typography variant='promo-h4' responsive bold>\n {title}\n </Typography>\n {checked ? <Icon name='check' /> : null}\n </div>\n );\n};\n","import './DistrictSelect.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { DistrictControl } from '../../../../../../common/components/DistrictControl';\nimport type { DistrictGroup } from '../../../../../helpers/districtHelper';\n\nimport { useDistrictSelect } from './useDistrictSelect';\nimport { DistrictSelectItem } from './components/DistrictSelectItem';\nimport { DistrictSelectGroup } from './components/DistrictSelectGroup';\n\nconst cn = classname.bind(null, 'DistrictSelect');\n\nexport interface DistrictSelectProps {\n groups: DistrictGroup[];\n checked: readonly number[];\n onChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n regionId: number;\n limit?: Limit;\n className?: string;\n}\n\nexport enum Limit {\n noLimit,\n hasLimit\n}\n\nexport const DistrictSelect: React.FC<DistrictSelectProps> = ({\n groups,\n checked,\n onChange,\n limit = Limit.hasLimit,\n className,\n regionId\n}) => {\n const {\n isChecked,\n checkSet: selectedDistricts,\n checkGroup,\n checkItem\n } = useDistrictSelect({\n checked,\n onChange,\n groups\n });\n\n return (\n <div className={cn(null, { limit: limit === Limit.hasLimit ? 'limited' : 'unlimited' }, className)}>\n <DistrictControl\n className={cn('controls')}\n regionId={regionId}\n onChange={newValues => {\n onChange(newValues.diff.selected, new Set(newValues.diff.deselected));\n }}\n selectedDistricts={selectedDistricts}\n />\n <div className={cn((limit === Limit.hasLimit) ? 'items-limited' : 'items-unlimited')}>\n {groups.map((group, groupIdx, arr) => {\n const { items, id: groupId } = group;\n\n const isGroupIdChecked = groupId && isChecked(groupId);\n const isGroupChecked = isGroupIdChecked || items.every(item => isChecked(item.id));\n\n return (\n <div key={group.title}>\n <DistrictSelectGroup\n title={group.title}\n checked={isGroupChecked}\n onCheck={newIsChecked => checkGroup(newIsChecked, groupIdx, groupId)}\n />\n\n {items.map(district => (\n <DistrictSelectItem\n key={district.id}\n district={district}\n checked={isGroupIdChecked || isChecked(district.id)}\n onCheck={newIsChecked => checkItem(newIsChecked, district.id, groupIdx, groupId)}\n />\n ))}\n\n {arr.length - 1 !== groupIdx ? (\n <div className={cn('groupSeparator')} />\n ) : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport type { ArrayElement } from '../../../../../../../types/common';\nimport type { DistrictGroup } from '../../../../../helpers/districtHelper';\n\nimport type { DistrictSelectProps } from './DistrictSelect';\n\ninterface UseDistrictSelectProps extends Pick<DistrictSelectProps, 'checked' | 'onChange'>{\n groups: DistrictGroup[];\n}\n\nexport function useDistrictSelect({\n checked: selected,\n onChange,\n groups\n}: UseDistrictSelectProps) {\n const checkSet = React.useMemo(() => new Set(selected), [ selected ]);\n\n const isChecked = React.useCallback(\n (id: number) => checkSet.has(id),\n [ checkSet ]\n );\n\n const checkGroup = React.useCallback((\n checked: boolean,\n groupIndex: number,\n groupId: DistrictGroup['id']\n ) => {\n let uncheckedDiff = new Set<number>();\n let checkedDiff: number[] = [];\n\n const groupIds = groups[groupIndex].items.map(item => item.id);\n\n if (checked) {\n checkedDiff = groupId ? [ groupId ] : groupIds;\n } else {\n uncheckedDiff = new Set(groupId && isChecked(groupId) ? [ groupId ] : groupIds);\n }\n\n onChange(checkedDiff, uncheckedDiff);\n }, [ groups, onChange, isChecked ]);\n\n const checkItem = React.useCallback((\n checked: boolean,\n id: ArrayElement<DistrictGroup['items']>['id'],\n groupIndex: number,\n groupId: DistrictGroup['id']\n ) => {\n let uncheckedDiff = new Set<number>();\n let checkedDiff: number[] = [];\n\n if (! groupId) {\n if (checked) {\n checkedDiff.push(id);\n } else {\n uncheckedDiff.add(id);\n }\n\n onChange(checkedDiff, uncheckedDiff);\n\n return;\n }\n\n if (checked) {\n const isGroupChecked = groups[groupIndex].items.every(item => isChecked(item.id) || item.id === id);\n\n if (isGroupChecked) {\n const selectedIdsFromGroup = groups[groupIndex].items\n .map(item => item.id)\n .filter(value => isChecked(value));\n\n checkedDiff = [ groupId ];\n uncheckedDiff = new Set([ id, ...selectedIdsFromGroup ]);\n } else {\n checkedDiff = [ id ];\n }\n } else {\n if (isChecked(groupId)) {\n const otherGroupIds = groups[groupIndex].items\n .filter(item => item.id !== id)\n .map(item => item.id);\n\n checkedDiff = otherGroupIds;\n uncheckedDiff = new Set([ groupId, id ]);\n } else {\n uncheckedDiff = new Set([ id ]);\n }\n }\n\n onChange(checkedDiff, uncheckedDiff);\n }, [ groups, onChange, isChecked ]);\n\n return { checkItem, checkGroup, isChecked, checkSet };\n}\n","import './DistrictModal.css';\n\nimport React, { useMemo } from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport type { DistrictStore } from '../../../../../../domain/geo/District';\nimport { getDistrictCount, groupDistricts } from '../../../../helpers/districtHelper';\n\nimport { Limit, DistrictSelect } from './DistrictSelect/DistrictSelect';\n\nconst cn = classname.bind(null, 'DistrictModal');\n\ninterface IDistrictModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n hide: () => void;\n checkedIds: number[];\n districts: DistrictStore;\n handleChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n onReset: () => void;\n onSubmit: () => void;\n regionId: number;\n}\n\nexport const DistrictModal: React.FC<IDistrictModalProps> = ({\n hide,\n checkedIds,\n districts,\n handleChange,\n onReset,\n onSubmit,\n regionId,\n uikitZIndexEnabled\n}) => {\n const districtGroups = useMemo(() => groupDistricts({\n districts: districts.items,\n regionId\n }), [ districts, regionId ]);\n\n const districtCount = useMemo(\n () => getDistrictCount(checkedIds, districtGroups),\n [ checkedIds, districtGroups ]\n );\n\n return (\n <Modal\n size={ModalSize.FULL_L}\n borderRadius={BorderRadius.none}\n uikitZIndexEnabled={uikitZIndexEnabled}\n fullScreen\n >\n <ModalHeading\n text='Район'\n activeCount={districtCount}\n onClose={hide}\n />\n <DistrictSelect\n regionId={regionId}\n groups={districtGroups}\n checked={checkedIds}\n limit={Limit.noLimit}\n onChange={handleChange}\n />\n <div className={cn('clear')}>\n <Button\n fullWidth\n size='s'\n variant='secondary'\n onClick={onReset}\n >\n Сбросить районы\n </Button>\n </div>\n <div className={cn('submit')}>\n <Button\n fullWidth\n size='s'\n onClick={onSubmit}\n >\n Сохранить\n </Button>\n </div>\n </Modal>\n\n );\n};\n","import React, { ReactNode } from 'react';\nimport { TipTypeEnum } from '@search/graphql-typings';\n\nimport classname from '@search/classname/src';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\n\nimport { MetroStation } from '../../../../../../../domain/geo/MetroStation';\nimport { District } from '../../../../../../../domain/geo/District';\nimport { Address } from '../../../../../../../domain/geo/Address';\n\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\n\nimport { FilteredItem, isQueryDisplayValue, isGeoDistrictsGroupItem } from '../MobileGeoFilterView';\n\nimport './GeoTagItem.css';\n\nconst cn = classname.bind(null, 'GeoTagItem');\n\ninterface IGeoTagItemProps {\n item: FilteredItem;\n handleRemove: (item: FilteredItem) => void;\n}\n\nexport const GeoTagItem: React.FC<IGeoTagItemProps> = ({\n item,\n handleRemove\n}) => {\n let component: ReactNode | null = null;\n\n if (isGeoDistrictsGroupItem(item)) {\n component = item.title;\n } else if (isQueryDisplayValue(item)) {\n if (item.type === TipTypeEnum.NewBuilding) {\n component = item.title || 'Жилой комплекс';\n }\n\n if (item.type === TipTypeEnum.Address) {\n component = item.title;\n }\n } else {\n if (item.kind === GeoKind.METRO) {\n const metroItem = item as MetroStation;\n\n component = (\n <>\n <span className={cn('marks')}>\n <MetroMark\n colors={metroItem.allRoutesColorsList}\n />\n </span>\n <span className={cn('title')}>\n {metroItem.title}\n </span>\n </>\n );\n } else if (item.kind === GeoKind.DISTRICT || item.kind === GeoKind.LOCALITY) {\n const districtItem = item as District;\n\n component = districtItem.title;\n } else {\n const addressItem = item as Address;\n\n component = addressItem.displayName || addressItem.mainName;\n }\n }\n\n return (\n <div\n className={`${cn('flex')} ${cn('item')} container`}\n key={item.id}\n >\n <div className={cn('flex', undefined, 'col-xs-11')}>\n {component}\n </div>\n <div\n className={cn('icon', undefined, 'col-xs-1')}\n onClick={() => handleRemove(item)}\n >\n <svg width='12' height='14' viewBox='0 0 12 14' fill='none' xmlns='http://www.w3.org/2000/svg'>\n {/* eslint-disable-next-line max-len */}\n <path fillRule='evenodd' clipRule='evenodd' d='M4.52778 1C4.31317 1 4.1225 1.13695 4.05397 1.34032L3.93422 1.69565H8.06578L7.94603 1.34032C7.8775 1.13695 7.68683 1 7.47222 1H4.52778ZM9.12103 1.69565L8.89367 1.02097C8.68806 0.41086 8.11604 0 7.47222 0H4.52778C3.88396 0 3.31194 0.410859 3.10633 1.02097L2.87897 1.69565H0V2.69565H0.679334L1.43134 12.6134C1.49065 13.3956 2.14261 14 2.92705 14H8.81029C9.58029 14 10.2252 13.417 10.3027 12.6509L11.3091 2.69565H12V1.69565H9.12103ZM10.304 2.69565H1.6822L2.42848 12.5378C2.44825 12.7985 2.66557 13 2.92705 13H8.81029C9.06695 13 9.28193 12.8057 9.30775 12.5503L10.304 2.69565ZM3.5 11.5V4H4.5V11.5H3.5ZM5.5 11.5V4H6.5V11.5H5.5ZM7.5 11.5V4H8.5V11.5H7.5Z' fill='#B6B9C9' />\n </svg>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { GeoTagItem } from './taglist/GeoTagItem';\nimport { FilteredItem } from './MobileGeoFilterView';\n\ninterface IGeoTagListProps {\n items: FilteredItem[];\n handleRemove: (item: FilteredItem) => void;\n}\n\nexport const GeoTagList: React.FC<IGeoTagListProps> = ({\n items,\n handleRemove\n}) => {\n return (\n <>\n {\n items.map(item => (\n <GeoTagItem\n key={item.id}\n item={item}\n handleRemove={handleRemove}\n />\n ))\n }\n </>\n );\n};\n","import React from 'react';\n\nimport { ModalHeading } from '../../../../../../mobile/components/ModalHeading';\n\nimport { GeoTagList } from '../GeoTagList';\nimport { FilteredItem } from '../MobileGeoFilterView';\n\ninterface IFullGeoTagListProps {\n items: FilteredItem[];\n handleRemove: (item: FilteredItem) => void;\n fullGeoTagOff?: () => void;\n dataTest?: string;\n}\n\nexport const FullGeoTagList: React.FC<IFullGeoTagListProps> = ({\n items,\n dataTest,\n handleRemove,\n fullGeoTagOff\n}) => {\n return (\n <>\n <ModalHeading\n text='Адреса'\n dataTest={dataTest ? `${dataTest}-heading` : undefined}\n onClose={fullGeoTagOff}\n />\n <div>\n <GeoTagList\n items={items}\n handleRemove={handleRemove}\n />\n </div>\n </>\n );\n};\n","/* eslint-disable max-len */\nimport React, { useMemo } from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, ModalSize, useModal } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { GeoFilter } from '../../../../../models/Filter';\nimport { GeoBaseStore } from '../../../../../../../domain/geo/GeoBase';\nimport { GeoTagList } from '../GeoTagList';\nimport { FilteredItem } from '../MobileGeoFilterView';\nimport { QueryDisplayValues } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { groupDistricts } from '../../../../../helpers/districtHelper';\nimport { FullGeoTagList } from './FullGeoTagList';\n\nimport './PreviewGeoTagList.css';\n\nconst cn = classname.bind(null, 'PreviewGeoTagList');\n\nfunction notUndefined<T>(x: T | undefined): x is T {\n return x !== undefined;\n}\n\ninterface IPreviewGeoTagListProps {\n filter: GeoFilter;\n regionId: RegionIdEnum;\n store: GeoBaseStore;\n handleRemove: (item: FilteredItem) => void;\n queryDisplayValues?: QueryDisplayValues;\n}\n\nexport const PreviewGeoTagList: React.FC<IPreviewGeoTagListProps> = ({\n filter,\n store,\n handleRemove,\n queryDisplayValues,\n regionId\n}) => {\n const { on: fullGeoTagOn, off: fullGeoTagOff, visible: isFullGeoTagVisible } = useModal();\n\n const geoObjects = useMemo(() => {\n const districtIdsSet = new Set(filter.districtIds);\n\n const groupedDistricts = groupDistricts({\n regionId,\n districts: store.districts.items\n }).filter(group => group.items.every(item => districtIdsSet.has(Number(item.id))));\n\n const nextGeoObjects: FilteredItem[] = groupedDistricts\n .map(({ items, title }) => {\n const districtIds: number[] = [];\n\n items.forEach(({ id }) => {\n const numberedId = Number(id);\n\n districtIds.push(numberedId);\n districtIdsSet.delete(numberedId);\n });\n\n return {\n title,\n districtIds,\n id: `group-${title}`,\n kind: 'districts-group'\n };\n });\n\n const ids = [\n ...filter.metroIds,\n ...Array.from(districtIdsSet),\n ...filter.addressIds\n ];\n\n nextGeoObjects.push(\n ...ids.map(id => {\n const d = store.districts.get(id);\n\n if (d) {\n return d;\n }\n\n const m = store.stations.get(id);\n\n if (m) {\n return m;\n }\n\n const a = queryDisplayValues?.addresses && queryDisplayValues?.addresses[id];\n\n if (a) {\n return a;\n }\n\n return;\n }).filter(notUndefined)\n );\n\n return nextGeoObjects;\n }, [\n regionId, store,\n filter.districtIds, filter.addressIds, filter.metroIds,\n queryDisplayValues\n ]);\n\n let slicedItems = geoObjects.slice(0, 3);\n let items = geoObjects;\n\n if (filter.newBuildingIds.length) {\n const newBuildingItems = filter.newBuildingIds.map(id =>\n queryDisplayValues?.newBuildings && queryDisplayValues?.newBuildings[id]\n ).filter(notUndefined);\n\n if (newBuildingItems.length) {\n slicedItems = [\n ...newBuildingItems,\n ...slicedItems\n ];\n\n items = [\n ...newBuildingItems,\n ...items\n ];\n }\n }\n\n return (\n <div className={cn(null, { withoutMargin: Boolean(slicedItems.length <= 0) })}>\n <GeoTagList\n items={slicedItems}\n handleRemove={handleRemove}\n />\n {slicedItems.length > 0 && <div\n className={`${cn('flex')} ${cn('item')} container`}\n onClick={fullGeoTagOn}\n data-test='filter-geo-show-all'\n >\n <div className={`${cn('flex')} ${cn('addresses')} col-xs-11`}>\n Все выбранные адреса\n </div>\n <div\n className={cn('icon', undefined, 'col-xs-1')}\n >\n {items.length}\n </div>\n </div>\n }\n {isFullGeoTagVisible && (\n <Modal\n size={ModalSize.FULL_L}\n borderRadius={BorderRadius.none}\n fullScreen\n >\n <FullGeoTagList\n items={items}\n handleRemove={handleRemove}\n fullGeoTagOff={fullGeoTagOff}\n />\n </Modal>\n )}\n </div>\n );\n};\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, { Fragment, useCallback } from 'react';\n\nimport { RootRegionsApplicationEnum, SuggestTypeEnum, TipTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\n\nimport { Input, Size } from '@vtblife/uikit/legacy';\n\nimport { useModal } from '@search/vtbeco-ui/src/components/Modal';\nimport classname from '@search/classname/src';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { RegionIdEnum, regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\n\nimport { Address } from '@search/vtbeco-frontend-core/domain/geo/Address';\nimport { GeoBaseStore, GeoFilteredItem, GeoId } from '@search/vtbeco-frontend-core/domain/geo/GeoBase';\nimport { correctAndBroadenRegionId, SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport {\n Filters,\n GeoFilter,\n NewBuildingDataFilter,\n IFilter,\n RegionFilter,\n DeveloperFilter\n} from '../../../../models/Filter';\nimport {\n AddQueryDisplayValue,\n QueryDisplayValue,\n QueryDisplayValues\n} from '../../../../../common/hooks/useQueryDisplayValues';\nimport { dataLayerPush } from '../../../../../../domain/google/dataLayerPush';\n\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { TipItem } from '../../../../../tips/OffersSearchTips';\nimport { FilterTagList } from '../../desktop/geo/FilterTagList/FilterTagList';\n\nimport { MetroModal } from './MetroModal';\nimport { SuggestModal } from './SuggestModal';\nimport { DistrictModal } from './DistrictModal';\nimport { PreviewGeoTagList } from './taglist/PreviewGeoTagList';\n\nimport './MobileGeoFilterView.css';\n\ntype GeoDistrictsGroupItem = {\n id: string;\n __typename?: undefined;\n title: string;\n districtIds: number[];\n kind: 'districts-group';\n}\n\nexport function isGeoDistrictsGroupItem(item: FilteredItem): item is GeoDistrictsGroupItem {\n return (item as GeoDistrictsGroupItem).kind === 'districts-group';\n}\n\nexport type FilteredItem = GeoFilteredItem | QueryDisplayValue | GeoDistrictsGroupItem;\n\ninterface IMobileGeoFilterViewProps {\n geoStore: GeoBaseStore;\n filters: FilterCollection;\n rootRegionsApp: RootRegionsApplicationEnum;\n onChange: (filter: IFilter[]) => void;\n onInputToggleFocus?: (disabled: boolean) => void;\n showNewBuildingsGroup?: boolean;\n startWithNewBuildings?: boolean;\n queryDisplayValues?: QueryDisplayValues;\n addQueryDisplayValue?: AddQueryDisplayValue;\n title?: string;\n titleWithNewBuildings?: string;\n placeholder?: string;\n placeholderWithNewBuildings?: string;\n limit?: number;\n tips?: QueryDisplayValue[];\n removeTips?: (tips: TipItem[]) => void;\n suggestTypes?: SuggestTypeEnum[];\n oldFilters?: boolean;\n uikitModalZIndexEnabled?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileGeoFilterView');\n\nexport function isQueryDisplayValue(\n item: FilteredItem\n): item is QueryDisplayValue {\n return (item as QueryDisplayValue).type !== undefined;\n}\n\nexport const MobileGeoFilterView: React.FC<IMobileGeoFilterViewProps> = ({\n rootRegionsApp,\n suggestTypes,\n limit,\n geoStore: geoStoreProp,\n filters,\n onChange,\n onInputToggleFocus,\n showNewBuildingsGroup,\n startWithNewBuildings,\n queryDisplayValues,\n addQueryDisplayValue,\n title = 'Город, метро, район, адрес',\n titleWithNewBuildings = 'ЖК, город, метро, район, адрес',\n placeholder = 'Введите город, метро, район, адрес',\n placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n tips,\n removeTips,\n oldFilters,\n uikitModalZIndexEnabled\n}) => {\n const filter = filters.get(Filters.geo) as GeoFilter;\n const regionId = (filters.get(Filters.region) as RegionFilter).region;\n const geoStore = geoStoreProp;\n const { geoIds } = filter;\n const { on: districtOn, off: districtOff, visible: isDistrictVisible } = useModal();\n const { on: metroOn, off: metroOff, visible: isMetroVisible } = useModal();\n const { on: suggestOn, off: suggestOff, visible: isSuggestVisible } = useModal();\n /** District в збс, новостройки не поддерживают byRegion */\n const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion(regionId) : geoStore.districts;\n\n const splitIds = useCallback((newGeoIds: Set<number>) => {\n const tipIds = Array.from(newGeoIds);\n const districtIds = tipIds.filter(id => geoStore.districts.has(id));\n const metroIds = tipIds.filter(id => geoStore.stations.has(id));\n\n return { tipIds, districtIds, metroIds };\n }, [ geoStore.districts, geoStore.stations ]);\n\n const { districtIds, metroIds } = splitIds(geoIds);\n\n const handleMetroDistrictChange = useCallback((checkedDiff: GeoId[], uncheckedDiff: Set<GeoId>) => {\n const newGeoIds = new Set<number>(filter.geoIds);\n\n uncheckedDiff.forEach(id => newGeoIds.delete(id));\n for (const id of checkedDiff) newGeoIds.add(id);\n\n const splitted = splitIds(newGeoIds);\n const {\n metroIds: metroIdList,\n districtIds: districtIdList\n } = splitted;\n const ids: {\n type: SuggestItemTypeEnum;\n idList: number[];\n }[] = [\n {\n type: SuggestItemTypeEnum.Metro,\n idList: metroIdList\n },\n {\n type: SuggestItemTypeEnum.District,\n idList: districtIdList\n }\n ];\n\n let newRegionId: number | undefined;\n\n for (const { type, idList } of ids) {\n for (const id of idList) {\n const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n if (broadenedRegionId !== regionId) {\n newRegionId = broadenedRegionId;\n\n break;\n }\n }\n\n if (newRegionId) {\n break;\n }\n }\n\n const newGeoFilter = new GeoFilter(\n newGeoIds,\n metroIdList,\n districtIdList,\n filter.addressIds,\n filter.newBuildingIds\n );\n\n onChange(newRegionId ? [\n new RegionFilter(newRegionId),\n newGeoFilter\n ] : [\n newGeoFilter\n ]);\n }, [\n splitIds,\n onChange,\n filter.geoIds,\n filter.addressIds,\n filter.newBuildingIds,\n regionId\n ]);\n\n const onResetMetro = useCallback(() => {\n const newGeoIds = new Set<number>();\n\n filter.geoIds.forEach(id => {\n if (! geoStore.stations.has(id)) newGeoIds.add(id);\n });\n\n const splitted = splitIds(newGeoIds);\n\n onChange([\n new GeoFilter(\n newGeoIds,\n splitted.metroIds,\n splitted.districtIds,\n filter.addressIds,\n filter.newBuildingIds\n )\n ]);\n metroOff();\n }, [\n filter.geoIds,\n filter.addressIds,\n filter.newBuildingIds,\n splitIds,\n onChange,\n metroOff,\n geoStore.stations\n ]);\n\n const onResetDistrict = useCallback(() => {\n const newGeoIds = new Set<number>();\n\n filter.geoIds.forEach(id => {\n if (! geoStore.districts.has(id)) newGeoIds.add(id);\n });\n\n const splitted = splitIds(newGeoIds);\n\n onChange([\n new GeoFilter(\n newGeoIds,\n splitted.metroIds,\n splitted.districtIds,\n filter.addressIds,\n filter.newBuildingIds\n )\n ]);\n districtOff();\n }, [\n filter.geoIds,\n filter.addressIds,\n filter.newBuildingIds,\n splitIds,\n onChange,\n districtOff,\n geoStore.districts\n ]);\n\n const onMetroSubmit = useCallback(() => {\n metroOff();\n }, [ metroOff ]);\n\n const onDistrictSubmit = useCallback(() => {\n districtOff();\n }, [ districtOff ]);\n\n const handleRemoveItem = useCallback((item: FilteredItem) => {\n const id = item.id as Exclude<FilteredItem, GeoDistrictsGroupItem>['id']; // to Number type for ignore errors in cases with string id;\n const newGeoIds = new Set(filter.geoIds);\n const newDistrictIds = new Set(filter.districtIds);\n\n let newMetroIds = filter.metroIds;\n let newAddressIds = filter.addressIds;\n let newNewBuildingIds = filter.newBuildingIds;\n\n if (isGeoDistrictsGroupItem(item)) {\n item.districtIds.forEach(districtId => {\n newGeoIds.delete(districtId);\n newDistrictIds.delete(districtId);\n });\n } else if (isQueryDisplayValue(item)) {\n if (item.type === TipTypeEnum.NewBuilding) {\n newNewBuildingIds = newNewBuildingIds.filter(newBuildingId => newBuildingId !== id);\n }\n\n if (item.type === TipTypeEnum.Address) {\n newAddressIds = newAddressIds.filter(addressId => addressId !== id);\n }\n\n newGeoIds.delete(id);\n } else {\n newGeoIds.delete(id);\n\n if (item.kind === GeoKind.METRO) {\n newMetroIds = newMetroIds.filter(metroId => metroId !== id);\n } else if (item.kind === GeoKind.DISTRICT || item.kind === GeoKind.LOCALITY) {\n newDistrictIds.delete(id);\n } else {\n newAddressIds = newAddressIds.filter(addressId => addressId !== id);\n }\n }\n\n onChange([\n new GeoFilter(newGeoIds, newMetroIds, Array.from(newDistrictIds), newAddressIds, newNewBuildingIds)\n ]);\n }, [ filter, onChange ]);\n\n // eslint-disable-next-line complexity\n const onSuggestChange = useCallback((suggestion: SuggestionType) => {\n let newRegionId: RegionIdEnum | undefined;\n\n if (\n suggestion!.data &&\n suggestion.data.regionId &&\n regionId !== suggestion!.data.regionId\n ) {\n newRegionId = suggestion.data.regionId;\n }\n\n const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : filter.geoIds);\n const filterMetroIds: number[] = newRegionId ? [] : [ ...filter.metroIds ];\n const filterDistrictIds: number[] = newRegionId ? [] : [ ...filter.districtIds ];\n const filterAddressIds: number[] = newRegionId ? [] : [ ...filter.addressIds ];\n const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...filter.newBuildingIds ];\n let newBuildingData;\n let developerId;\n\n switch (suggestion.__typename) {\n case SuggestItemTypeEnum.NewBuilding: {\n const { id } = suggestion.data;\n\n if (! filterNewBuildingIds.includes(id)) {\n filterNewBuildingIds.push(id);\n\n const { newBuilding } = suggestion;\n\n if (newBuilding) {\n const {\n id: newBuildingId,\n type: newBuildingType,\n name: newBuildingName,\n title: newBuildingTitle\n } = newBuilding;\n\n addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n id: newBuildingId,\n title: newBuildingTitle?.nominative,\n type: TipTypeEnum.NewBuilding\n });\n\n newBuildingData = {\n type: newBuildingType,\n name: newBuildingName,\n id: newBuildingId\n };\n }\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Developer: {\n const { developer } = suggestion;\n\n if (developer) {\n const { id } = developer;\n\n developerId = id;\n\n addQueryDisplayValue && addQueryDisplayValue('developers', {\n id,\n title: developer.title,\n type: TipTypeEnum.Developer\n });\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.District: {\n const { id } = suggestion.data;\n\n if (! filterDistrictIds.includes(id)) {\n filterDistrictIds.push(id);\n filterGeoIds.add(id);\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Metro: {\n const { id } = suggestion.data;\n\n if (! filterMetroIds.includes(id)) {\n filterMetroIds.push(id);\n filterGeoIds.add(id);\n }\n\n break;\n }\n\n case SuggestItemTypeEnum.Address: {\n const { id } = suggestion.data;\n\n if (! filterAddressIds.includes(id)) {\n filterAddressIds.push(id);\n filterGeoIds.add(id);\n\n if (\n suggestion.address\n ) {\n // Для обратной совместимости с текущими tips, перейти потом на displayValues\n geoStore.addresses.add({\n ...suggestion.address,\n kind: GeoKind.STREET_ADDRESS\n } as Address);\n\n addQueryDisplayValue && addQueryDisplayValue('addresses', {\n id: suggestion.address.id,\n kind: suggestion.address.kind,\n translit: suggestion.address.translit,\n title: suggestion.address.displayName,\n type: TipTypeEnum.Address\n });\n }\n }\n\n break;\n }\n\n default:\n return;\n }\n\n const newFilters: IFilter[] = [\n new GeoFilter(\n filterGeoIds,\n filterMetroIds,\n filterDistrictIds,\n filterAddressIds,\n filterNewBuildingIds\n ),\n new NewBuildingDataFilter(newBuildingData)\n ];\n\n if (newRegionId) {\n newFilters.push(\n new RegionFilter(newRegionId)\n );\n }\n\n if (developerId) {\n newFilters.push(\n new DeveloperFilter(developerId)\n );\n }\n\n onChange(newFilters);\n suggestOff();\n }, [\n filter.geoIds,\n filter.districtIds,\n filter.addressIds,\n filter.metroIds,\n filter.newBuildingIds,\n onChange,\n regionId,\n geoStore,\n suggestOff,\n addQueryDisplayValue\n ]);\n\n const shouldHaveNewBuildings = showNewBuildingsGroup && ! filter.newBuildingIds.length;\n const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! geoStore.stations.isEmpty();\n const hasDistricts = geoStore?.districts?.ids?.length;\n\n return (\n <MobileFilter\n filterTitle={shouldHaveNewBuildings ? titleWithNewBuildings : title}\n className={cn('', { oldFilters })}\n >\n <div className={'GeoSuggest'} onClick={() => suggestOn()}>\n <div className={'col-xs-12'} data-test='filter-geo-suggest'>\n <Input\n fullWidth\n size={Size.Small}\n name='filter-geo-input'\n // Баг ui-kit, пустое значение превращается в 'undefined'\n value=''\n placeholder={\n shouldHaveNewBuildings ?\n placeholderWithNewBuildings :\n placeholder\n }\n />\n </div>\n </div>\n <div className={`container ${cn('choose')}`}>\n {\n (hasMetro || hasDistricts) ? (\n <span\n className={cn('choose-geo-item')}\n >\n Выбрать: \n </span>\n ) : null\n }\n {\n hasMetro ? (\n <Fragment>\n <span\n className={cn('geo-item')}\n onClick={() => {\n metroOn();\n dataLayerPush({ event: 'classified_filter_metro' });\n }}\n data-test='filter-geo-metro-popup'\n >\n метро\n </span>\n { hasDistricts ? <span>, </span> : null }\n </Fragment>\n ) : null\n }\n {\n hasDistricts ? (\n <span\n className={cn('geo-item')}\n data-test='filter-geo-district-popup'\n onClick={() => {\n districtOn();\n dataLayerPush({ event: 'classified_filter_district' });\n }}\n >\n районы\n </span>\n ) : null\n }\n </div>\n {\n tips ? (\n <FilterTagList\n tips={tips}\n filters={filters}\n openMetroModal={metroOn}\n removeTips={removeTips}\n />\n ) : (\n <PreviewGeoTagList\n filter={filter}\n store={geoStore}\n regionId={regionId}\n handleRemove={handleRemoveItem}\n queryDisplayValues={queryDisplayValues}\n />\n )\n }\n {\n isSuggestVisible ? (\n <SuggestModal\n regionId={regionId}\n hide={suggestOff}\n rootRegionsApp={rootRegionsApp}\n limit={limit}\n onInputToggleFocus={onInputToggleFocus}\n handleChange={onSuggestChange}\n showNewBuildingsGroup={shouldHaveNewBuildings}\n startWithNewBuildings={startWithNewBuildings}\n placeholder={placeholder}\n placeholderWithNewBuildings={placeholderWithNewBuildings}\n suggestTypes={suggestTypes}\n uikitZIndexEnabled={uikitModalZIndexEnabled}\n />\n ) : null\n }\n {\n isDistrictVisible ? (\n <DistrictModal\n regionId={regionId}\n hide={districtOff}\n checkedIds={districtIds}\n districts={districts}\n handleChange={handleMetroDistrictChange}\n onReset={onResetDistrict}\n onSubmit={onDistrictSubmit}\n uikitZIndexEnabled={uikitModalZIndexEnabled}\n />\n ) : null\n }\n {\n isMetroVisible ? (\n <MetroModal\n hide={metroOff}\n checkedIds={metroIds}\n store={geoStore.stations}\n handleChange={handleMetroDistrictChange}\n onReset={onResetMetro}\n onSubmit={onMetroSubmit}\n uikitZIndexEnabled={uikitModalZIndexEnabled}\n />\n ) : null\n }\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { NumberInput } from '@vtblife/uikit';\n\nimport { useEnterBlur } from '@search/hooks/src/useEnterBlur';\nimport { KitchenAreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\n\ninterface IMobileKitchenAreaFilterViewProps {\n filter: KitchenAreaFilter;\n handleChange: (filter: KitchenAreaFilter) => void;\n}\n\nexport const MobileKitchenAreaFilterView: React.FC<IMobileKitchenAreaFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback((value: number) => {\n handleChange(new KitchenAreaFilter({ from: Number(value) || null, to: null }));\n }, [ handleChange ]);\n\n const onKeyPressEnterBlur = useEnterBlur();\n\n return (\n <MobileFilter\n filterTitle='Кухня'\n >\n <div className='container'>\n <div className={'col-xs-12'}>\n <NumberInput\n value={filter.value.from ?? undefined}\n postfix={'м²'}\n onChange={onChange}\n onKeyPress={onKeyPressEnterBlur}\n max={100_000}\n name='kitchenAreaFrom'\n placeholder='от'\n />\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { LivingAreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobileLivingAreaFilterViewProps {\n filter: LivingAreaFilter;\n handleChange: (filter: LivingAreaFilter) => void;\n}\n\nexport const MobileLivingAreaFilterView: React.FC<IMobileLivingAreaFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new LivingAreaFilter(value));\n }, [ filter, handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Жилая'\n >\n <div className='container'>\n <div className={'col-xs-12'}>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n value={filter.value}\n onChange={onChange}\n max={100_000}\n nameFrom='livingAreaFrom'\n nameTo='livingAreaTo'\n />\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { NewBuildingDeal } from '@search/filter-enums/enums';\n\nimport { NewBuildingDealFilter } from '../../../../models/Filter';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: NewBuildingDeal.LAW_214,\n label: '214 ФЗ',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: NewBuildingDeal.ESCROW,\n label: 'Эскроу-счета',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n filter: NewBuildingDealFilter;\n handleChange: (filter: NewBuildingDealFilter) => void;\n}\n\nexport const MobileNewBuildingDealFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new NewBuildingDealFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Сделка'\n >\n <MultiSelect\n name='newBuildingDeal'\n className='container container__clamp'\n options={selectOptions}\n value={filter.deal}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport classname from '@search/classname/src';\n\nimport { M2PRO_OPTIONS, M2ProEnum } from '../../../../../../domain/newbuilding/libs/constants';\nimport { NotOnlyM2ProFilter } from '../../../../models/Filter';\nimport { RadioSelect, RadioValue } from '../../common/RadioSelect';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\nimport './MobileNotOnlyM2ProFilterView.css';\n\nconst cn = classname.bind(null, 'MobileNotOnlyM2ProFilterView');\n\nconst M2PRO_OPTIONS_MOBILE = [\n M2PRO_OPTIONS[M2ProEnum.M2Pro],\n {\n ...M2PRO_OPTIONS[M2ProEnum.All],\n className: cn('option')\n }\n];\n\nexport const MobileNotOnlyM2ProFilterView = ({\n filter,\n handleChange\n}: {\n filter: NotOnlyM2ProFilter;\n handleChange: (filter: NotOnlyM2ProFilter) => void;\n}) => {\n const { notOnlyM2Pro } = filter;\n const m2ProSelectedOption = M2PRO_OPTIONS_MOBILE.find(item => item.value === (\n notOnlyM2Pro ? M2ProEnum.All : M2ProEnum.M2Pro\n ))!;\n const handleM2ProChange = useCallback((m2ProValue: RadioValue) => handleChange(\n new NotOnlyM2ProFilter(m2ProValue === M2ProEnum.All)\n ), [ handleChange ]);\n\n return (\n <MobileFilter filterTitle='Сортировка ЖК'>\n <div className='container'>\n <RadioSelect\n name='M2Pro'\n options={M2PRO_OPTIONS_MOBILE}\n value={m2ProSelectedOption.value}\n handleChange={handleM2ProChange}\n className={cn('checkboxGroup')}\n />\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { ParkingType } from '@search/filter-enums/enums';\nimport { ParkingFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileParkingFilterViewProps {\n filter: ParkingFilter;\n handleChange: (filter: ParkingFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: ParkingType.CLOSED,\n label: 'Закрытая',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: ParkingType.UNDERGROUND,\n label: 'Подземная',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: ParkingType.OPEN,\n label: 'Открытая',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileParkingFilterView: React.FC<IMobileParkingFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new ParkingFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Парковка'\n >\n <MultiSelect\n name='parkingEnumeration'\n className='container container__clamp'\n options={selectOptions}\n value={filter.parkings}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { PaymentType } from '@search/filter-enums/enums';\n\nimport { PaymentTypeFilter } from '../../../../models/Filter';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [\n {\n value: PaymentType.ARMY_MORTGAGE,\n label: 'Военная ипотека',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: PaymentType.INSTALLMENT,\n label: 'Рассрочка',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: PaymentType.MOTHER_CAPITAL,\n label: 'Материнский капитал',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\ninterface IProps {\n filter: PaymentTypeFilter;\n handleChange: (filter: PaymentTypeFilter) => void;\n}\n\nexport const MobilePaymentTypeFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new PaymentTypeFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Покупка'\n >\n <MultiSelect\n name='paymentType'\n className='container container__clamp'\n options={selectOptions}\n value={filter.type}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { Position } from '@search/filter-enums/enums';\nimport { PositionFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: Position.STANDALONE,\n label: 'Одиночное здание',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n filter: PositionFilter;\n handleChange: (filter: PositionFilter) => void;\n}\n\nexport const MobilePositionFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new PositionFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Размер ЖК'\n >\n <MultiSelect\n name='position'\n className='container container__clamp'\n options={selectOptions}\n value={filter.position}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { AreaUnit } from '@search/filter-enums/enums';\n\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\nimport { PriceFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobilePriceFilterViewProps {\n filter: PriceFilter;\n priceTypes?: AreaUnit[];\n handleChange: (filter: PriceFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n value: AreaUnit.UNKNOWN,\n label: 'За всё',\n className: 'col-xs-6'\n}, {\n value: AreaUnit.METER,\n label: 'За м²',\n className: 'col-xs-6'\n}, {\n value: AreaUnit.ARE,\n label: 'За сотку',\n className: 'col-xs-6'\n} ];\n\nexport const MobilePriceFilterView: React.FC<IMobilePriceFilterViewProps> = ({\n filter,\n priceTypes = [ AreaUnit.UNKNOWN, AreaUnit.METER ],\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new PriceFilter(filter.priceType, value));\n }, [ filter, handleChange ]);\n\n const onChangePriceType = useCallback(value => {\n handleChange(new PriceFilter(value, filter.value));\n }, [ filter, handleChange ]);\n\n const filteredOptions = selectOptions.filter(item => {\n // @ts-ignore\n return priceTypes.includes(item.value);\n });\n\n return (\n <MobileFilter\n filterTitle='Цена'\n >\n <div className='container'>\n <div className={'col-xs-12 filter-item-gap'}>\n <NumberInputRange\n size={Size.Small}\n unit='₽'\n value={filter.value}\n onChange={onChange}\n nameFrom='priceFrom'\n nameTo='priceTo'\n />\n </div>\n {\n filteredOptions.length > 1 ? (\n <RadioSelect\n name='Price'\n options={filteredOptions}\n value={filter.priceType}\n handleChange={onChangePriceType}\n />\n ) : null\n }\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback, useMemo, useState } from 'react';\n\nimport { Select, useSelect } from '@vtblife/uikit';\n\nimport { useGeoUserRegion } from '@search/geo/src/useGeoUserRegion';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport classname from '@search/classname/src';\n\nimport defaultRegionSelectOptions from '../../../../../../dict/filters/regions';\n\nimport {\n getFilteredFlatRegionSelectOptions,\n getSelectedOptionLabel\n} from '../../../../helpers/regionHelper';\nimport { RegionFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport {\n RenderRegionSelectUikitContent,\n MIN_OPTIONS_NUMBER_WITH_INPUT,\n OptionTypeRegionFilter, GroupedOptions,\n} from '../../region/RenderRegionSelectUikitContent';\n\nimport '../MobileCommon.css';\n\ninterface IMobileRegionFilterViewProps {\n filter: RegionFilter;\n onChange: (filter: RegionFilter) => void;\n options?: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[];\n isDesktop?: boolean;\n native?: boolean;\n onMap?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileRegionFilterView');\n\nconst defaultOptions = defaultRegionSelectOptions.map(option => ({\n ...option,\n value: String(option.value)\n}));\n\nexport const MobileRegionFilterView: React.FC<IMobileRegionFilterViewProps> = ({\n filter,\n onChange,\n isDesktop,\n options = defaultOptions,\n native,\n onMap,\n}) => {\n const { setRegionId } = useGeoUserRegion();\n const handleChange = useCallback((newValue: string) => {\n const parsedValue = parseInt(newValue, 10) as RegionIdEnum;\n\n setRegionId(parsedValue);\n onChange(new RegionFilter(parsedValue));\n }, [ onChange, setRegionId ]);\n\n const [ searchInputValue, setSearchInputValue ] = useState('');\n const resetSearchInputValue = useCallback(() => setSearchInputValue(''), []);\n\n const value = String(filter.region || RegionIdEnum.MSK_AND_MSK_OBL);\n\n const title = useMemo(\n () => getSelectedOptionLabel(value, options),\n [ value, options ]\n );\n\n let currentOptions = options;\n\n if (searchInputValue) {\n currentOptions = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n }\n\n const linearOptionsList = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n const prepared = linearOptionsList.map(option => ({ value: option.value, text: option.label }));\n\n const { handleChange: handleSelectChange, is, selectedText } = useSelect(\n handleChange,\n { selected: value, texts: prepared }\n );\n\n const [ filterValue, setFilterValue ] = React.useState('');\n const updateFilterValue = React.useCallback((v: string) => {\n setFilterValue(v);\n }, []);\n const filterValueNormalized = filterValue.toLowerCase().replace('ё', 'е');\n\n const filtered = linearOptionsList.filter(option => ! filterValueNormalized ||\n option.label.toLowerCase().replace('ё', 'е').includes(filterValueNormalized)\n );\n\n if (isDesktop && ! native) {\n return (\n <Select\n mode='single'\n dataTest='region'\n onChange={handleSelectChange}\n onToggle={() => {\n resetSearchInputValue();\n }}\n >\n <Select.Button size='s'>{selectedText}</Select.Button>\n <Select.Content placement='local' height={400}>\n <Select.Search value={filterValue} onChange={updateFilterValue} />\n {filtered.map((option, index, all) => (\n <Select.Option\n dataTest={`region-${option.value}`}\n disabled={option.disabled}\n key={option.value}\n value={option.value}\n selected={is(option.value)}\n divider={all[index + 1]?.isParent}\n >\n {option.isParent ? <b>{option.label}</b> : option.label}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n );\n }\n\n return (\n <MobileFilter className={cn()}>\n <div className='container'>\n <div className='col-xs-12'>\n <Select\n mode='single'\n dataTest='region'\n onChange={handleSelectChange}\n onToggle={() => {\n resetSearchInputValue();\n }}\n >\n <Select.Button size='s'>{title}</Select.Button>\n <Select.Content\n adaptiveHeight={true}\n adaptivePlacement={false}\n placement='local'\n >\n <RenderRegionSelectUikitContent\n is={is}\n searchInputValue={searchInputValue}\n setSearchInputValue={setSearchInputValue}\n showInput={options.length >= MIN_OPTIONS_NUMBER_WITH_INPUT}\n options={currentOptions}\n isMobile={! onMap}\n />\n </Select.Content>\n </Select>\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Rooms } from '@search/filter-enums/enums';\n\nimport { RoomFilter } from '../../../../../filters/models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileRoomFilterViewProps {\n filter: RoomFilter;\n handleChange: (filter: RoomFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: Rooms.STUDIO,\n label: 'Студия',\n className: 'col-xs-6 filter-item-gap'\n},\n{\n value: Rooms.ROOM_1,\n label: '1',\n className: 'col-xs-3 filter-item-gap'\n},\n{\n value: Rooms.ROOM_2,\n label: '2',\n className: 'col-xs-3 filter-item-gap'\n},\n{\n value: Rooms.ROOM_3,\n label: '3',\n className: 'col-xs-3 filter-item-gap'\n},\n{\n value: Rooms.ROOM_4,\n label: '4',\n className: 'col-xs-3 filter-item-gap'\n},\n{\n value: Rooms.ROOM_5_AND_MORE,\n label: '5 и более',\n className: 'col-xs-6 filter-item-gap'\n},\n{\n value: Rooms.OPEN_PLAN,\n label: 'Свободная планировка',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileRoomFilterView: React.FC<IMobileRoomFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new RoomFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Количество комнат'\n >\n <MultiSelect\n name='rooms'\n className='container container__clamp'\n options={selectOptions}\n value={filter.rooms}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Safety } from '@search/filter-enums/enums';\nimport { SafetyFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [\n {\n value: Safety.GUARDED_AREA,\n label: 'Охрана',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: Safety.CONCIERGE,\n label: 'Консьерж',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: Safety.CLOSED_AREA,\n label: 'Закр. территория',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\ninterface IProps {\n filter: SafetyFilter;\n handleChange: (filter: SafetyFilter) => void;\n}\n\nexport const MobileSafetyFilterView: React.FC<IProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new SafetyFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Безопасность'\n >\n <MultiSelect\n name='safety'\n className='container container__clamp'\n options={selectOptions}\n value={filter.safety}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { FlatsSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { FlatsSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileFlatsSpecialEventsFilterViewProps {\n filter: FlatsSpecialEventsFilter;\n onChange: (value: FlatsSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<FlatsSpecialEvent>[] = [\n {\n value: FlatsSpecialEvent.FLAT_DISCOUNT,\n label: 'Скидка',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN,\n label: 'Рассрочка',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: FlatsSpecialEvent.FLAT_SALES_START,\n label: 'Старт продаж',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nexport const MobileFlatsSpecialEventsFilterView: React.FC<IMobileFlatsSpecialEventsFilterViewProps> = ({\n filter,\n onChange\n}) => {\n const handleChange = useCallback(value => {\n onChange(new FlatsSpecialEventsFilter(value));\n }, [ onChange ]);\n\n return (\n <MobileFilter filterTitle='Квартиры'>\n <MultiSelect\n name='flatsSpecialEvents'\n options={SELECT_OPTIONS}\n value={filter.value}\n handleChange={handleChange}\n className='container container__clamp'\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { MiscSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { MiscSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileMiscSpecialEventsFilterViewProps {\n filter: MiscSpecialEventsFilter;\n onChange: (value: MiscSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<MiscSpecialEvent>[] = [\n {\n value: MiscSpecialEvent.PROMO,\n label: 'Акция',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: MiscSpecialEvent.GIFT,\n label: 'Подарок',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nexport const MobileMiscSpecialEventsFilterView: React.FC<IMobileMiscSpecialEventsFilterViewProps> = ({\n filter,\n onChange\n}) => {\n const handleChange = useCallback(value => {\n onChange(new MiscSpecialEventsFilter(value));\n }, [ onChange ]);\n\n return (\n <MobileFilter filterTitle='Другое'>\n <MultiSelect\n name='miscSpecialEvents'\n options={SELECT_OPTIONS}\n value={filter.value}\n handleChange={handleChange}\n className='container container__clamp'\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { OtherSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { OtherSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileOtherSpecialEventsFilterViewProps {\n filter: OtherSpecialEventsFilter;\n onChange: (value: OtherSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<OtherSpecialEvent>[] = [\n {\n value: OtherSpecialEvent.OTHER_DISCOUNT,\n label: 'Скидка',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: OtherSpecialEvent.OTHER_INSTALLMENT_PLAN,\n label: 'Рассрочка',\n className: 'col-xs-12 filter-item-gap'\n },\n {\n value: OtherSpecialEvent.OTHER_SALES_START,\n label: 'Старт продаж',\n className: 'col-xs-12 filter-item-gap'\n }\n];\n\nexport const MobileOtherSpecialEventsFilterView: React.FC<IMobileOtherSpecialEventsFilterViewProps> = ({\n filter,\n onChange\n}) => {\n const handleChange = useCallback(value => {\n onChange(new OtherSpecialEventsFilter(value));\n }, [ onChange ]);\n\n return (\n <MobileFilter filterTitle='Паркинг, кладовки'>\n <MultiSelect\n name='otherSpecialEvents'\n options={SELECT_OPTIONS}\n value={filter.value}\n handleChange={handleChange}\n className='container container__clamp'\n />\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\nimport { AreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobileTotalAreaFilterViewProps {\n filter: AreaFilter;\n handleChange: (filter: AreaFilter) => void;\n}\n\nexport const MobileTotalAreaFilterView: React.FC<IMobileTotalAreaFilterViewProps> = ({\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new AreaFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Площадь'\n >\n <div className='container'>\n <div className={'col-xs-12'}>\n <NumberInputRange\n size={Size.Small}\n unit='м²'\n value={filter.value}\n onChange={onChange}\n max={100_000}\n nameFrom='areaFrom'\n nameTo='areaTo'\n />\n </div>\n </div>\n </MobileFilter>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Select, useSelect } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { TimeLimit, TransportType } from '@search/filter-enums/enums';\n\nimport { TransportLimitFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\nimport './styles.css';\n\ninterface IMobileTransportLimitFilterViewProps {\n filter: TransportLimitFilter;\n onChange: (filter: TransportLimitFilter) => void;\n isMobile?: boolean;\n isTitle?: boolean;\n containerClass?: string;\n}\n\nconst cn = classname.bind(null, 'MobileTransportLimitFilterView');\n\nconst transportTypeOptions = [\n {\n value: TransportType.UNKNOWN,\n label: 'Неважно'\n },\n {\n value: TransportType.FOOT,\n label: 'Пешком'\n }, {\n value: TransportType.PUBLIC_TRANSPORT,\n label: 'На транспорте'\n }\n];\n\nconst timeLimitOptions = [\n {\n value: TimeLimit.MAX_5_MINUTES,\n label: '5 мин.'\n },\n {\n value: TimeLimit.MAX_10_MINUTES,\n label: '10 мин.'\n },\n {\n value: TimeLimit.MAX_15_MINUTES,\n label: '15 мин.'\n },\n {\n value: TimeLimit.MAX_20_MINUTES,\n label: '20 мин.'\n },\n {\n value: TimeLimit.MAX_30_MINUTES,\n label: '30 мин.'\n },\n {\n value: TimeLimit.MAX_40_MINUTES,\n label: '40 мин.'\n },\n {\n value: TimeLimit.MAX_50_MINUTES,\n label: '50 мин.'\n },\n {\n value: TimeLimit.MAX_60_MINUTES,\n label: '1 ч.'\n }\n];\n\nexport const MobileTransportLimitFilterView: React.FC<IMobileTransportLimitFilterViewProps> = ({\n filter,\n onChange,\n isTitle,\n isMobile,\n containerClass\n}) => {\n const transportSelectChange = useCallback((value: TransportType) => {\n let timeLimit = filter.timeLimit;\n\n if (value === TransportType.UNKNOWN) timeLimit = TimeLimit.UNKNOWN;\n else if (timeLimit === TimeLimit.UNKNOWN) timeLimit = TimeLimit.MAX_20_MINUTES;\n\n onChange(new TransportLimitFilter(\n timeLimit,\n value\n ));\n }, [ filter.timeLimit, onChange ]);\n\n const transportSelectOptions = transportTypeOptions.map(option => ({ value: option.value, text: option.label }));\n\n const transportSelect = useSelect(\n transportSelectChange,\n {\n selected: filter.transportType,\n texts: transportSelectOptions\n }\n );\n\n const timeLimitSelectChange = useCallback((value: TimeLimit) => {\n const transportType = filter.transportType;\n\n if (transportType === TransportType.UNKNOWN) return;\n\n onChange(new TransportLimitFilter(\n value,\n transportType\n ));\n }, [ filter.transportType, onChange ]);\n\n const timeLimitSelectOptions = timeLimitOptions.map(option => ({\n value: option.value,\n text: option.label\n }));\n\n const timeLimitSelect = useSelect(\n timeLimitSelectChange,\n { selected: filter.timeLimit, texts: timeLimitSelectOptions }\n );\n\n return (<MobileFilter\n filterTitle={isTitle ? 'Время до метро' : undefined}\n className={cn('container', undefined, containerClass)}\n >\n <Select native={isMobile} mode='single' onChange={transportSelect.handleChange}>\n <Select.Button size='s' dataTest='transportType-trigger'>{transportSelect.selectedText}</Select.Button>\n <Select.Content>\n {transportSelectOptions.map(option => (\n <Select.Option\n dataTest={`transportType-${option.value}`}\n key={option.value}\n value={option.value}\n selected={transportSelect.is(option.value)}\n >\n {option.text}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n <Select native={isMobile} mode='single' onChange={timeLimitSelect.handleChange}>\n <Select.Button\n dataTest='timeLimit-trigger'\n disabled={filter.transportType === TransportType.UNKNOWN}\n size='s'\n >{timeLimitSelect.selectedText}</Select.Button>\n <Select.Content>\n {timeLimitSelectOptions.map(option => (\n <Select.Option\n key={option.value}\n dataTest={`timeLimit-${option.value}`}\n value={option.value}\n selected={timeLimitSelect.is(option.value)}\n >\n {option.text}\n </Select.Option>\n ))}\n </Select.Content>\n </Select>\n </MobileFilter>);\n};\n","import React, { useCallback } from 'react';\nimport { WallsType } from '@search/filter-enums/enums';\nimport { WallsTypeFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileWallsFilterViewProps {\n withWood?: boolean;\n filter: WallsTypeFilter;\n handleChange: (filter: WallsTypeFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n value: WallsType.MONOLITH,\n label: 'Монолит',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: WallsType.PANEL,\n label: 'Панель',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: WallsType.BRICK,\n label: 'Кирпич',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: WallsType.BRICK_MONOLITH,\n label: 'Кирпич-монолит',\n className: 'col-xs-12 filter-item-gap'\n}, {\n value: WallsType.BLOCK,\n label: 'Блок',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nconst selectOptionsWithWood: MultiSelectOption[] = [ ...selectOptions, {\n value: WallsType.WOOD,\n label: 'Дерево',\n className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileWallsFilterView: React.FC<IMobileWallsFilterViewProps> = ({\n withWood = true,\n filter,\n handleChange\n}) => {\n const onChange = useCallback(value => {\n handleChange(new WallsTypeFilter(value));\n }, [ handleChange ]);\n\n return (\n <MobileFilter\n filterTitle='Материал стен'\n >\n <MultiSelect\n name='walls'\n className='container container__clamp'\n options={withWood ? selectOptionsWithWood : selectOptions}\n value={filter.walls}\n handleChange={onChange}\n />\n </MobileFilter>\n );\n};\n","import React, { Dispatch, SetStateAction, useCallback } from 'react';\nimport { Select, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './RenderRegionSelectUikitContent.css';\n\nexport const MIN_OPTIONS_NUMBER_WITH_INPUT = 10;\n\nfunction isGroupedOption<Option extends OptionType>(\n option: SelectOption<Option>,\n) {\n return option.options !== undefined;\n}\n\ntype OptionType<Value extends string | number = string> = {\n options?: undefined;\n value: Value;\n label: string;\n disabled?: boolean;\n index?: number;\n}\n\nexport interface OptionTypeRegionFilter extends OptionType<string> {\n fullName: string;\n isParent?: boolean;\n}\n\ntype SelectOption<Option extends OptionType> = GroupedOptions<Option> | Option;\n\nexport type GroupedOptions<Option extends OptionType> = {\n label?: string;\n options: Option[];\n};\n\nconst cn = classname.bind(null, 'RegionSelectUikitContent');\n\nconst FlatOptionList = ({ options, isBoldParentOption, is, lastIndex }: {\n options: OptionTypeRegionFilter[];\n isBoldParentOption?: boolean;\n is: (check: string) => boolean;\n lastIndex?: number;\n}) => (\n <Select.Group>\n {options.map((option, i) => {\n return (\n <Select.Option\n value={option.value}\n key={`${option.value}`}\n selected={is(option.value)}\n >\n {\n ! isGroupedOption(option) && option.isParent && isBoldParentOption ?\n <b>{option.label}</b> :\n <>{option.label}</>\n }\n </Select.Option>\n );\n })}\n </Select.Group>\n);\n\nconst FilteredOptionList = ({\n options,\n emptyText = 'Нет похожих регионов с новостройками',\n is,\n}: {\n emptyText?: React.ReactNode;\n options: OptionTypeRegionFilter[];\n is: (check: string) => boolean;\n}) => (\n options.length ? (\n <FlatOptionList is={is} options={options} />\n ) : (\n <Typography\n color='minor'\n className={cn('not-found')}\n >\n {emptyText}\n </Typography>\n )\n);\n\nconst GroupedOptionList = ({ options, is }: {\n options: GroupedOptions<OptionTypeRegionFilter>[];\n is: (check: string) => boolean;\n}) => (\n <>\n {options.map((option, index) => (\n <FlatOptionList\n key={index}\n is={is}\n options={option.options}\n isBoldParentOption\n lastIndex={option.options.length - 1}\n />\n ))}\n </>\n);\n\ninterface IRenderRegionSelectCustomMenu {\n options: SelectOption<OptionTypeRegionFilter>[];\n is: (check: string) => boolean;\n\n searchInputValue: string;\n setSearchInputValue: Dispatch<SetStateAction<string>>;\n isMobile?: boolean;\n isNative?: boolean;\n showInput?: boolean;\n emptyText?: React.ReactNode;\n}\n\nexport const RenderRegionSelectUikitContent: React.FC<IRenderRegionSelectCustomMenu> = ({\n options,\n is,\n searchInputValue,\n setSearchInputValue,\n isMobile,\n isNative,\n showInput,\n emptyText,\n}: IRenderRegionSelectCustomMenu) => {\n if (isNative) {\n return (\n <GroupedOptionList\n options={options as GroupedOptions<OptionTypeRegionFilter>[]}\n is={is}\n />\n );\n }\n\n return (\n <div className={cn(null, { full: isMobile })}>\n {showInput && (\n <Select.Search\n placeholder='Введите регион'\n size='s'\n name='region'\n value={searchInputValue}\n onChange={setSearchInputValue}\n />\n )}\n <>\n {options.length && isGroupedOption(options[0]) ? (\n <GroupedOptionList\n options={options as GroupedOptions<OptionTypeRegionFilter>[]}\n is={is}\n />\n ) : (\n <FilteredOptionList\n options={options as OptionTypeRegionFilter[]}\n emptyText={emptyText}\n is={is}\n />\n )}\n </>\n </div>\n );\n};\n\n","import './Filter2.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'Filter2');\n\nexport interface IFilterAvailableProps {\n withoutTitle?: boolean;\n}\n\ninterface IProps {\n className?: string;\n filterTitle?: string;\n}\n\nexport const Filter2: React.FC<IProps> = ({ className, filterTitle, children }) => (\n filterTitle ? (\n <div className={className}>\n {filterTitle ? (\n <Typography\n variant='secondary-alone'\n color='secondary'\n className={cn('filter-title')}\n >\n {filterTitle}\n </Typography>\n ) : null}\n <div>\n {children}\n </div>\n </div>\n ) : <>{children}</>\n);\n","import sortBy from 'lodash/sortBy';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport type { District } from '../../../domain/geo/District';\n\nexport type DistrictGroup = {\n id?: number;\n title: string;\n items: ({\n id: number;\n title: string;\n isIntracity?: boolean;\n })[];\n}\n\ntype GroupMskDistrictsParams = {\n districts?: District[];\n regionId: RegionIdEnum;\n}\n\nconst prepareTitle = (title: string) => {\n return title.replace(/(район|округ|городской|административный|посёлок)/g, '');\n};\n\nconst splitListByParentId = (list: District[] | undefined, parentId: number) => {\n const ret: [ DistrictGroup['items'], DistrictGroup['items'] ] = [ [], [] ];\n\n list?.forEach(item => {\n ret[item.narrowRegionId === parentId ? 0 : 1].push(item);\n });\n\n return ret;\n};\n\nconst sortDistricts = (districts: DistrictGroup['items']): DistrictGroup['items'] => {\n return districts.sort((a, b) => {\n const titleA = a.title.trim();\n const titleB = b.title.trim();\n\n // if (titleA === titleB) return 0;\n\n return titleA > titleB ? 1 : -1;\n });\n};\n\nconst prepareList = (list?: DistrictGroup['items']): DistrictGroup['items'] => {\n const ret: DistrictGroup['items'] = [];\n\n list?.forEach(item => {\n ret.push({\n id: item.id,\n isIntracity: item.isIntracity ?? false,\n title: prepareTitle(item.title)\n });\n });\n\n return sortDistricts(ret);\n};\n\nconst groupMskDistricts = ({ districts, regionId }: GroupMskDistrictsParams): DistrictGroup[] => {\n const districtsMap = new Map<number | string, DistrictGroup>();\n\n districts?.forEach(district => {\n if (district.parentId === RegionIdEnum.MSK) {\n let districtGroup = districtsMap.get(district.id);\n\n if (! districtGroup) {\n districtGroup = {\n id: district.id,\n title: district.title,\n items: []\n };\n\n districtsMap.set(district.id, districtGroup);\n }\n }\n });\n\n if (regionId === RegionIdEnum.MSK_AND_MSK_OBL) {\n const mskOblGroup = {\n title: 'Районы Московской области',\n items: []\n };\n\n districtsMap.set('mskObl', mskOblGroup);\n }\n\n districts?.forEach(district => {\n if (district.parentId === RegionIdEnum.MSK_OBL) {\n const districtGroup = districtsMap.get('mskObl');\n\n districtGroup?.items.push({\n id: district.id,\n title: prepareTitle(district.title)\n });\n }\n\n if (district.parentId !== RegionIdEnum.MSK && district.parentId !== RegionIdEnum.MSK_OBL) {\n const districtGroup = districtsMap.get(district.parentId);\n\n districtGroup?.items.push({\n id: district.id,\n title: prepareTitle(district.title)\n });\n }\n });\n\n return sortBy(Array.from(districtsMap.values()), o => {\n const sortedNestedDistricts = { ...o, items: sortDistricts(o.items) };\n\n return sortedNestedDistricts.title === 'Районы Московской области' ? false : sortedNestedDistricts.title;\n });\n};\n\nexport const groupDistricts = ({ districts, regionId }: GroupMskDistrictsParams): DistrictGroup[] => {\n if ((districts?.length ?? 0) <= 0) return [];\n\n switch (regionId) {\n case RegionIdEnum.MSK_AND_MSK_OBL: {\n return groupMskDistricts({ districts, regionId });\n }\n\n case RegionIdEnum.MSK_OBL: {\n return [\n {\n title: 'Районы Московской области',\n items: prepareList(districts)\n }\n ];\n }\n\n case RegionIdEnum.MSK: {\n return groupMskDistricts({ districts, regionId });\n }\n\n case RegionIdEnum.SPB_AND_LEN_OBL: {\n const splited = splitListByParentId(districts, 444);\n\n return [\n {\n title: 'Районы Санкт-Петербурга',\n items: prepareList(splited[0])\n },\n {\n title: 'Районы Ленинградской области',\n items: prepareList(splited[1])\n }\n ];\n }\n\n case RegionIdEnum.LEN_OBL: {\n return [\n {\n title: 'Районы Ленинградской области',\n items: prepareList(districts)\n }\n ];\n }\n\n case RegionIdEnum.SPB: {\n return [\n {\n title: 'Районы Санкт-Петербурга',\n items: prepareList(districts)\n }\n ];\n }\n\n default:\n return [\n {\n title: 'Районы',\n items: prepareList(districts)\n }\n ];\n }\n};\n\nexport const getDistrictCount = (districtIds: Array<number>, groups: Array<DistrictGroup>) => (\n districtIds.reduce((count, districtId) => (\n count + (groups.find(group => group.id === districtId)?.items.length ?? 1)\n ), 0)\n);\n","import { PredefinedPrice } from '../types/PredefinedPrice';\n\nexport const sellFlatPricesPerAllSquareMsk: PredefinedPrice[] = [ {\n from: 1000000,\n to: 2500000\n}, {\n from: 2500000,\n to: 3000000\n}, {\n from: 3000000,\n to: 4000000\n}, {\n from: 4000000,\n to: 5000000\n}, {\n from: 5000000,\n to: 8000000\n}, {\n from: 8000000,\n to: 10000000\n}, {\n from: 10000000,\n to: 15000000\n}, {\n from: 15000000,\n to: 20000000\n}, {\n from: 20000000,\n to: 50000000\n}, {\n from: 50000000,\n to: 100000000\n} ];\n\nexport const sellFlatPricesPerAllSquareSpb: PredefinedPrice[] = [ {\n from: 1000000,\n to: 2000000\n}, {\n from: 2000000,\n to: 3000000\n}, {\n from: 3000000,\n to: 4000000\n}, {\n from: 4000000,\n to: 5000000\n}, {\n from: 5000000,\n to: 6000000\n}, {\n from: 6000000,\n to: 8000000\n}, {\n from: 8000000,\n to: 10000000\n}, {\n from: 10000000,\n to: 15000000\n}, {\n from: 15000000,\n to: 30000000\n}, {\n from: 30000000,\n to: 50000000\n} ];\n\nexport const sellFlatPricesPerAllSquare: PredefinedPrice[] = [ {\n from: 1000000,\n to: 5000000\n}, {\n from: 2000000,\n to: 7500000\n}, {\n from: 3000000,\n to: 10000000\n}, {\n from: 4000000,\n to: 15000000\n}, {\n from: 5000000,\n to: 20000000\n}, {\n from: 10000000,\n to: 30000000\n}, {\n from: 15000000,\n to: 40000000\n}, {\n from: 20000000,\n to: 50000000\n}, {\n from: 30000000,\n to: 75000000\n}, {\n from: 50000000,\n to: 100000000\n} ];\n\nexport const sellFlatPricesPerMeterMskMo: PredefinedPrice[] = [ {\n from: 30000,\n to: 50000\n}, {\n from: 50000,\n to: 75000\n}, {\n from: 75000,\n to: 100000\n}, {\n from: 100000,\n to: 150000\n}, {\n from: 150000,\n to: 200000\n}, {\n from: 200000,\n to: 250000\n}, {\n from: 250000,\n to: 300000\n}, {\n from: 300000,\n to: 400000\n}, {\n from: 400000,\n to: 500000\n}, {\n from: 500000,\n to: 800000\n} ];\n\nexport const sellFlatPricesPerMeterSpbLo: PredefinedPrice[] = [ {\n from: 20000,\n to: 40000\n}, {\n from: 40000,\n to: 60000\n}, {\n from: 60000,\n to: 80000\n}, {\n from: 80000,\n to: 100000\n}, {\n from: 100000,\n to: 120000\n}, {\n from: 120000,\n to: 150000\n}, {\n from: 150000,\n to: 200000\n}, {\n from: 200000,\n to: 250000\n}, {\n from: 250000,\n to: 350000\n}, {\n from: 350000,\n to: 500000\n} ];\n\nexport const rentFlatPricesMsk: PredefinedPrice[] = [ {\n from: 10000,\n to: 15000\n}, {\n from: 15000,\n to: 20000\n}, {\n from: 20000,\n to: 25000\n}, {\n from: 25000,\n to: 30000\n}, {\n from: 30000,\n to: 40000\n}, {\n from: 40000,\n to: 50000\n}, {\n from: 50000,\n to: 60000\n}, {\n from: 60000,\n to: 80000\n}, {\n from: 80000,\n to: 100000\n}, {\n from: 100000,\n to: 150000\n} ];\n\nexport const rentFlatPricesSpb: PredefinedPrice[] = [ {\n from: 10000,\n to: 15000\n}, {\n from: 15000,\n to: 20000\n}, {\n from: 20000,\n to: 25000\n}, {\n from: 25000,\n to: 30000\n}, {\n from: 30000,\n to: 35000\n}, {\n from: 35000,\n to: 40000\n}, {\n from: 40000,\n to: 50000\n}, {\n from: 50000,\n to: 60000\n}, {\n from: 60000,\n to: 80000\n}, {\n from: 80000,\n to: 120000\n} ];\n\nexport const rentFlatPrices: PredefinedPrice[] = [ {\n from: 10000,\n to: 30000\n}, {\n from: 15000,\n to: 35000\n}, {\n from: 20000,\n to: 40000\n}, {\n from: 25000,\n to: 45000\n}, {\n from: 30000,\n to: 50000\n}, {\n from: 35000,\n to: 60000\n}, {\n from: 40000,\n to: 70000\n}, {\n from: 45000,\n to: 80000\n}, {\n from: 50000,\n to: 90000\n}, {\n from: 55000,\n to: 100000\n} ];\n\nexport const mortgagePaymentMskAndSpb = [ 35000, 50000, 70000, 90000, 120000, 150000 ];\n\nexport const mortgagePaymentRegions = [ 25000, 35000, 50000, 70000, 90000, 120000, 150000 ];\n\n/**\n * Вычисляет стоимость объекта по ежемесячному платежу и годовой ставке\n * Формула для вычисления: s = p * (x/y), где x = (1+r)^n - 1, y = r * (1+r)^n\n * p - ежемесячный платеж, r - ежемесячная процентная ставка, n - срок кредита в месяцах (по умолчанию 360 = 30 лет)\n * @param {number} [p] ежемесячный платеж\n * @returns {number}\n */\nexport const priceByMortgagePayment = (p: number, rate: number = 10.5) => {\n // процентная ставка в год\n const r = rate / 12 / 100;\n const n = 360;\n const x = Math.pow(1 + r, n) - 1;\n const y = r * Math.pow(1 + r, n);\n const s = p * (x / y);\n // Учтем первоначальный взнос 20%\n const l = s / 0.8;\n\n // Округлим до порядков десятков тысяч\n return Math.trunc(l / 10000) * 10000;\n};\n\n/**\n * Вычисляет приблизительный платеж объекта по стоимости и годовой ставке\n * Формула для вычисления: p = s / (x/y), где x = (1+r)^n - 1, y = r * (1+r)^n\n * Просто разворот формулы выше\n * p - ежемесячный платеж, r - ежемесячная процентная ставка, n - срок кредита в месяцах (по умолчанию 360 = 30 лет)\n * @param {number} [s] стоимость объекта\n * @returns {number}\n */\nexport const mortgagePaymentByPrice = (s: number, rate: number = 10.5) => {\n const r = rate / 12 / 100;\n const n = 360;\n const x = Math.pow(1 + r, n) - 1;\n const y = r * Math.pow(1 + r, n);\n\n // Учтем первоначальный взнос 20%\n return Math.trunc((s * 0.8) / (x / y));\n};\n","import { GroupedOptions, isGroupedOption } from '@vtblife/uikit/legacy';\nimport type { OptionTypeRegionFilter } from '../../filters/components/filter_types/region/RenderRegionSelectUikitContent';\n\nconst filterFlatOptionsBySubstr = (options: OptionTypeRegionFilter[], substr: string): OptionTypeRegionFilter[] => {\n const needle = substr.toLowerCase().replace('ё', 'е');\n\n return options.filter(\n ({ fullName }) => fullName.toLowerCase().replace('ё', 'е').indexOf(needle) + 1\n );\n};\n\nexport function getFlatOptions(\n options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): OptionTypeRegionFilter[] {\n if (options.length && isGroupedOption(options[0])) {\n return (options as GroupedOptions<OptionTypeRegionFilter>[]).reduce(\n (res: OptionTypeRegionFilter[], option) => [ ...res, ...option.options ],\n []\n );\n }\n\n return options as OptionTypeRegionFilter[];\n}\n\nexport function getFilteredFlatRegionSelectOptions(\n searchInputValue: string | undefined,\n options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): OptionTypeRegionFilter[] {\n const flatOptions = getFlatOptions(options);\n\n return searchInputValue ? filterFlatOptionsBySubstr(flatOptions, searchInputValue) : flatOptions;\n}\n\nexport function getSelectedOptionLabel(\n value: string,\n options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): string {\n const flatOptions = getFlatOptions(options);\n\n return flatOptions.find(option => option.value === value)?.label || '';\n}\n","import {\n WindowsDirectionSearchOffersEnum,\n FinishingTypeEnum\n} from '@search/graphql-typings';\nimport { YMapBounds } from '@search/ymap/src/bounds';\nimport { YMapVector } from '@search/ymap/src/Vector';\nimport {\n Accreditation,\n AreaUnit,\n AuthorTypeOptionsWithRealtor,\n BalconyOptions,\n BankPledgeOptions,\n Bathroom,\n BathroomLocationOptions,\n BuildingClass,\n CeilingHeight,\n Commissioning,\n CommissionType,\n DealType,\n DepositType,\n ElectricityOptions,\n FloorConstraints,\n FurnitureOption,\n GasOptions,\n HeatingOptions,\n HouseCategory,\n InfrastructureOptions,\n IsApartmentsOptions,\n LandStatus,\n LayoutImageOptions,\n LiftOptions,\n LivingFacilitiesOption,\n LivingTenantOption,\n NearbyOptions,\n NewBuilding,\n NewBuildingDeal,\n ParkingType,\n PaymentType,\n PhotoOptions,\n Position,\n PrepaymentType,\n RealtyObjectType,\n Renovation,\n RenovationProgram,\n Rooms,\n RoomsOfferedOptions,\n Safety,\n SellType,\n SewerageOptions,\n TimeLimit,\n TransportType,\n WallsType,\n WaterOptions,\n FlatsSpecialEvent,\n OtherSpecialEvent,\n MiscSpecialEvent,\n BuildEpoch,\n OnlineView,\n FinishingTypeOption\n} from '@search/filter-enums/enums';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport type { INumberRange } from '../types/IRange';\nimport type { IFinishing, FinishingParams, FinishingBuilding, FinishingBuildingParams } from '../types/IFinishing';\n\nexport enum Filters {\n dealType = 'dealType',\n categoryType = 'categoryType',\n rooms = 'rooms',\n newBuilding = 'newBuilding',\n price = 'price',\n region = 'region',\n totalArea = 'totalArea',\n livingArea = 'livingArea',\n kitchenArea = 'kitchenArea',\n floor = 'floor',\n floorsTotal = 'floorsTotal',\n builtYear = 'builtYear',\n cellHeight = 'cellHeight',\n renovation = 'renovation',\n bathroom = 'bathroom',\n transportLimit = 'transportLimit',\n windowsDirection = 'windowsDirection',\n geo = 'geo',\n livingFacility = 'livingFacility',\n furniture = 'furniture',\n livingTenantOptions = 'livingTenantOptions',\n rentConditions = 'rentConditions',\n rentPrepayment = 'rentPrepayment',\n walls = 'walls',\n parkings = 'parkings',\n author = 'author',\n userId = 'userId',\n sellType = 'sellType',\n infrastructure = 'infrastructure',\n balcony = 'balcony',\n photoOptions = 'photoOptions',\n layoutImageOptions = 'layoutImageOptions',\n apartments = 'apartments',\n position = 'position',\n commissioning = 'commissioning',\n commissioningList = 'commissioningList',\n finishingType = 'finishingType',\n finishingFlat = 'finishingFlat',\n safety = 'safety',\n developer = 'developer',\n buildingClass = 'buildingClass',\n accreditation = 'accreditation',\n newBuildingDeal = 'newBuildingDeal',\n paymentType = 'paymentType',\n roomsInOffer = 'roomsInOffer',\n landStatus = 'landStatus',\n landArea = 'landArea',\n supplyOptions = 'supplyOptions',\n houseCategory = 'houseCategory',\n houseArea = 'houseArea',\n bathroomLocation = 'bathroomLocation',\n heating = 'heating',\n mapBounds = 'mapBounds',\n bankPledgeOptions = 'bankPledgeOptions',\n seoMortgageAllowed = 'seoMortgageAllowed',\n buildings = 'buildings',\n closedSales = 'closedSales',\n newBuildingData = 'newBuildingData',\n selectedNewBuilding = 'selectedNewBuilding',\n showHighlighted = 'showHighlighted',\n flatsSpecialEvents = 'flatsSpecialEvents',\n otherSpecialEvents = 'otherSpecialEvents',\n miscSpecialEvents = 'miscSpecialEvents',\n renovationProgram = 'renovationProgram',\n nearbyOptions = 'nearbyOptions',\n sellerOrganizationName = 'sellerOrganizationName',\n buildEpoch = 'buildEpoch',\n onlineView = 'onlineView',\n notOnlyM2Pro = 'notOnlyM2Pro',\n mortgagePayment = 'mortgagePayment',\n hasLift = 'hasLift'\n}\n\n// FIXME Add correct Id generation, if there's will be two filter collections\nexport type FilterId = Filters\n\nexport abstract class IFilter {\n abstract id: FilterId;\n abstract isDefault(): boolean;\n create(): IFilter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new (this.constructor as any)();\n }\n}\n\nexport class MapBoundsFilter extends IFilter {\n id: FilterId = Filters.mapBounds;\n\n constructor(\n readonly bounds?: YMapBounds,\n readonly polygon: readonly YMapVector[] = [],\n readonly geohash?: string\n ) {\n super();\n this.bounds = bounds;\n this.polygon = polygon;\n this.geohash = geohash;\n }\n\n isDefault() {\n return this.bounds === undefined && this.polygon.length === 0 && this.geohash === undefined;\n }\n\n hasPolygon() {\n return this.polygon.length !== 0;\n }\n}\n\nexport class DealTypeFilter extends IFilter {\n id: FilterId = Filters.dealType;\n constructor(\n readonly dealType: DealType = DealType.SELL\n ) {\n super();\n this.dealType = dealType;\n }\n isDefault() {\n return this.dealType === DealType.SELL;\n }\n}\n\nexport class CategoryTypeFilter extends IFilter {\n id: FilterId = Filters.categoryType;\n constructor(\n readonly categoryType: RealtyObjectType = RealtyObjectType.FLAT\n ) {\n super();\n this.categoryType = categoryType;\n }\n isDefault(): boolean {\n return RealtyObjectType.FLAT === this.categoryType;\n }\n}\n\nexport class NewBuildingFilter extends IFilter {\n id: FilterId;\n newBuilding: NewBuilding[];\n constructor(\n newBuilding?: NewBuilding[]\n ) {\n super();\n this.id = Filters.newBuilding;\n this.newBuilding = ! newBuilding || newBuilding.length === 2 ? [] : newBuilding;\n }\n isDefault(): boolean {\n return this.newBuilding.length === 0 || (this.newBuilding.length === 2 &&\n this.newBuilding.includes(NewBuilding.NEW) &&\n this.newBuilding.includes(NewBuilding.SECOND));\n }\n}\n\nexport class RoomFilter extends IFilter {\n id: FilterId;\n rooms: readonly Rooms[];\n constructor(rooms?: readonly Rooms[]) {\n super();\n this.id = Filters.rooms;\n this.rooms = rooms || [ ];\n }\n isDefault(): boolean {\n return this.rooms.length === 0;\n }\n}\n\nexport class PriceFilter extends IFilter {\n isDefault(): boolean {\n const isDefaultValue = this.value.from === null && this.value.to === null;\n\n return isDefaultValue;\n }\n id: FilterId;\n priceType: AreaUnit;\n value: INumberRange\n constructor(priceType?: AreaUnit, value?: INumberRange) {\n super();\n this.id = Filters.price;\n this.priceType = priceType || AreaUnit.UNKNOWN;\n this.value = { from: value?.from || null, to: value?.to || null };\n }\n}\n\nexport class RegionFilter extends IFilter {\n id: FilterId = Filters.region;\n region: RegionIdEnum;\n\n constructor(region?: RegionIdEnum) {\n super();\n this.region = region !== undefined ? region : RegionIdEnum.MSK;\n }\n\n isDefault(): boolean {\n return this.region === RegionIdEnum.MSK;\n }\n}\n\nexport class AreaFilter extends IFilter {\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n id: FilterId;\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.id = Filters.totalArea;\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class MortgagePaymentFilter extends IFilter {\n id: FilterId = Filters.mortgagePayment;\n payment: number | null;\n isDefault(): boolean {\n return this.payment === null;\n }\n constructor(payment?: number | null) {\n super();\n this.payment = payment ?? null;\n }\n}\n\nexport class LivingAreaFilter extends IFilter {\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n id: FilterId;\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.id = Filters.livingArea;\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class KitchenAreaFilter extends IFilter {\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n id: FilterId;\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.id = Filters.kitchenArea;\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class YearBuildingFilter extends IFilter {\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n id: FilterId;\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.id = Filters.builtYear;\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class FloorFilter extends IFilter {\n isDefault(): boolean {\n const isDefaultRange = this.range.from === null && this.range.to === null;\n const isDefaultEdge =\n this.last === FloorConstraints.UNKNOWN &&\n this.first === FloorConstraints.UNKNOWN;\n\n return isDefaultEdge && isDefaultRange;\n }\n id: FilterId;\n range: INumberRange;\n last: FloorConstraints;\n first: FloorConstraints;\n constructor(range?: INumberRange, first?: FloorConstraints, last?: FloorConstraints) {\n super();\n this.id = Filters.floor;\n this.range = range || { from: null, to: null };\n this.last = last || FloorConstraints.UNKNOWN;\n this.first = first || FloorConstraints.UNKNOWN;\n }\n}\n\nexport class CellHeightFilter extends IFilter {\n isDefault(): boolean {\n return this.value === CeilingHeight.UNKNOWN;\n }\n id: FilterId;\n readonly value: CeilingHeight;\n constructor(value?: CeilingHeight) {\n super();\n this.id = Filters.cellHeight;\n this.value = value || CeilingHeight.UNKNOWN;\n }\n}\n\nexport class FlatsSpecialEventsFilter extends IFilter {\n id: FilterId = Filters.flatsSpecialEvents;\n value: FlatsSpecialEvent[];\n\n constructor(value?: FlatsSpecialEvent[]) {\n super();\n this.value = value || [];\n }\n\n isDefault() {\n return this.value.length === 0;\n }\n}\n\nexport class OtherSpecialEventsFilter extends IFilter {\n id: FilterId = Filters.otherSpecialEvents;\n value: OtherSpecialEvent[];\n\n constructor(value?: OtherSpecialEvent[]) {\n super();\n this.value = value || [];\n }\n\n isDefault() {\n return this.value.length === 0;\n }\n}\n\nexport class MiscSpecialEventsFilter extends IFilter {\n id: FilterId = Filters.miscSpecialEvents;\n value: MiscSpecialEvent[];\n\n constructor(value?: MiscSpecialEvent[]) {\n super();\n this.value = value || [];\n }\n\n isDefault() {\n return this.value.length === 0;\n }\n}\n\nexport class RenovationFilter extends IFilter {\n isDefault(): boolean {\n return this.value.length === 0;\n }\n id: FilterId;\n value: Renovation[];\n constructor(value?: Renovation[]) {\n super();\n this.id = Filters.renovation;\n this.value = value || [];\n }\n}\n\nexport class FinishingFilter extends IFilter {\n id: FilterId = Filters.finishingType;\n finishingType: FinishingTypeOption[];\n\n constructor(\n finishingType: FinishingTypeOption[] = []\n ) {\n super();\n this.finishingType = finishingType;\n }\n\n isDefault(): boolean {\n return this.finishingType.length === 0;\n }\n}\n\nexport class BathroomFilter extends IFilter {\n id: FilterId;\n value: Bathroom[];\n\n constructor(value?: Bathroom[]) {\n super();\n\n this.id = Filters.bathroom;\n this.value = value || [];\n }\n\n isDefault(): boolean {\n return this.value.length === 0;\n }\n}\n\nexport class TransportLimitFilter extends IFilter {\n id: FilterId = Filters.transportLimit;\n\n timeLimit: TimeLimit;\n transportType: TransportType;\n\n constructor(\n timeLimit?: TimeLimit,\n transportType?: TransportType\n ) {\n super();\n this.timeLimit = timeLimit || TimeLimit.UNKNOWN;\n this.transportType = transportType || TransportType.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.transportType === TransportType.UNKNOWN && this.timeLimit === TimeLimit.UNKNOWN;\n }\n}\n\nexport class FloorsTotalFilter extends IFilter {\n isDefault(): boolean {\n return this.range.from === null && this.range.to === null;\n }\n id: FilterId = Filters.floorsTotal;\n range: INumberRange;\n constructor(range?: INumberRange) {\n super();\n this.range = range || { from: null, to: null };\n }\n}\n\nexport class GeoFilter extends IFilter {\n id: FilterId = Filters.geo;\n geoIds: Set<number>;\n metroIds: number[];\n districtIds: number[];\n addressIds: number[];\n newBuildingIds: number[];\n\n constructor(\n // deprecated. Used only for tags\n geoIds = new Set<number>(),\n metroIds: number[] = [],\n districtIds: number[] = [],\n addressIds: number[] = [],\n newBuildingIds: number[] = []\n ) {\n super();\n this.geoIds = geoIds;\n this.metroIds = metroIds;\n this.districtIds = districtIds;\n this.addressIds = addressIds;\n this.newBuildingIds = newBuildingIds;\n }\n\n add(geo: { id: number; kind: string }) {\n if (this.geoIds.has(geo.id)) return;\n\n this.geoIds.add(geo.id);\n if (this.districtIds.includes(geo.id)) return;\n if (this.addressIds.includes(geo.id)) return;\n if (geo.kind === 'DISTRICT') {\n this.districtIds.push(geo.id);\n } else this.addressIds.push(geo.id);\n }\n\n isDefault(): boolean {\n return this.metroIds.length === 0 &&\n this.districtIds.length === 0 &&\n this.addressIds.length === 0 &&\n this.newBuildingIds.length === 0;\n }\n}\n\nexport class NewBuildingDataFilter extends IFilter {\n id: FilterId = Filters.newBuildingData;\n\n newBuilding?: {\n type: string;\n name: string;\n id: number;\n };\n\n constructor(\n newBuilding?: {\n type: string;\n name: string;\n id: number;\n }\n ) {\n super();\n\n this.newBuilding = newBuilding;\n }\n\n isDefault(): boolean {\n return this.newBuilding === undefined;\n }\n}\n\nexport class LivingFacilityFilter extends IFilter {\n id: FilterId = Filters.livingFacility;\n facilities: LivingFacilitiesOption[];\n\n constructor(\n facilities: LivingFacilitiesOption[] = []\n ) {\n super();\n this.facilities = facilities;\n }\n\n isDefault(): boolean {\n return this.facilities.length === 0;\n }\n}\n\nexport class FurnitureFilter extends IFilter {\n id: FilterId = Filters.furniture;\n furnitures: FurnitureOption[];\n\n constructor(\n furnitures: FurnitureOption[] = []\n ) {\n super();\n this.furnitures = furnitures;\n }\n\n isDefault(): boolean {\n return this.furnitures.length === 0;\n }\n}\n\nexport class LivingTenantOptionFilter extends IFilter {\n id: FilterId = Filters.livingTenantOptions;\n livingTenantOptions: LivingTenantOption[]\n\n constructor(\n livingTenantOptions: LivingTenantOption[] = []\n ) {\n super();\n this.livingTenantOptions = livingTenantOptions;\n }\n\n isDefault(): boolean {\n return this.livingTenantOptions.length === 0;\n }\n}\n\nexport class RentPrepaymentFilter extends IFilter {\n id: FilterId = Filters.rentPrepayment;\n prePaymentType: PrepaymentType | null;\n\n constructor(\n prePaymentType?: PrepaymentType\n ) {\n super();\n this.prePaymentType = prePaymentType || null;\n }\n\n isDefault(): boolean {\n return this.prePaymentType === null;\n }\n}\n\nexport class RentConditionsFilter extends IFilter {\n id: FilterId = Filters.rentConditions;\n\n utilitiesIncluded: boolean;\n depositType: DepositType;\n commisionType: CommissionType;\n\n constructor(\n utilitiesIncluded = false,\n depositType = DepositType.UNKNOWN,\n commisionType = CommissionType.UNKNOWN\n ) {\n super();\n this.utilitiesIncluded = utilitiesIncluded;\n this.depositType = depositType;\n this.commisionType = commisionType;\n }\n\n isDefault(): boolean {\n return ! this.utilitiesIncluded && this.depositType === DepositType.UNKNOWN &&\n this.commisionType === CommissionType.UNKNOWN;\n }\n}\n\nexport class WallsTypeFilter extends IFilter {\n id: FilterId = Filters.walls;\n\n walls: WallsType[];\n\n constructor(walls?: WallsType[]) {\n super();\n this.walls = walls || [];\n }\n\n isDefault(): boolean {\n return this.walls.length === 0;\n }\n}\n\nexport class ParkingFilter extends IFilter {\n id: FilterId = Filters.parkings;\n\n parkings: ParkingType[];\n\n constructor(parkings?: ParkingType[]) {\n super();\n this.parkings = parkings || [];\n }\n\n isDefault(): boolean {\n return this.parkings.length === 0;\n }\n}\n\nexport class InfrastructureFilter extends IFilter {\n id: FilterId = Filters.infrastructure;\n infrastructure: InfrastructureOptions[];\n\n hasLift: LiftOptions;\n\n constructor(\n infrastructure?: InfrastructureOptions[],\n hasLift?: LiftOptions\n ) {\n super();\n this.infrastructure = infrastructure || [];\n this.hasLift = hasLift || LiftOptions.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.infrastructure.length === 0 &&\n this.hasLift === LiftOptions.UNKNOWN;\n }\n}\n\nexport class BalconyFilter extends IFilter {\n id: FilterId = Filters.balcony;\n\n hasBalcony: BalconyOptions;\n\n constructor(\n hasBalcony?: BalconyOptions\n ) {\n super();\n this.hasBalcony = hasBalcony || BalconyOptions.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.hasBalcony === BalconyOptions.UNKNOWN;\n }\n}\n\nexport class RenovationProgramFilter extends IFilter {\n id: FilterId = Filters.renovationProgram;\n\n willRenovation: RenovationProgram\n\n constructor(\n willRenovation?: RenovationProgram\n ) {\n super();\n this.willRenovation = willRenovation || RenovationProgram.UNKNOWN;\n }\n\n isDefault() {\n return this.willRenovation === RenovationProgram.UNKNOWN;\n }\n}\n\nexport class NearbySchoolFilter extends IFilter {\n id: FilterId = Filters.nearbyOptions;\n\n hasNearbySchool: NearbyOptions;\n\n constructor(\n hasNearbySchool?: NearbyOptions\n ) {\n super();\n this.hasNearbySchool = hasNearbySchool || NearbyOptions.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.hasNearbySchool === NearbyOptions.UNKNOWN;\n }\n}\n\nexport class PhotoOptionsFilter extends IFilter {\n id: FilterId = Filters.photoOptions;\n\n photoOption: PhotoOptions\n\n constructor(\n photoOption?: PhotoOptions\n ) {\n super();\n this.photoOption = photoOption || PhotoOptions.UNKNOWN;\n }\n\n isDefault() {\n return this.photoOption === PhotoOptions.UNKNOWN;\n }\n}\n\nexport class LayoutImageOptionsFilter extends IFilter {\n id: FilterId = Filters.layoutImageOptions;\n\n constructor(\n readonly layoutImageOption: LayoutImageOptions[] = []\n ) {\n super();\n this.layoutImageOption = layoutImageOption || [];\n }\n\n isDefault() {\n return this.layoutImageOption.length === 0;\n }\n}\n\nexport class BankPledgeOptionsFilter extends IFilter {\n id: FilterId = Filters.bankPledgeOptions;\n\n bankPledgeOption: BankPledgeOptions | null;\n\n constructor(bankPledgeOption: BankPledgeOptions | null = null) {\n super();\n this.bankPledgeOption = bankPledgeOption;\n }\n\n isDefault() {\n return this.bankPledgeOption === null;\n }\n}\n\nexport class SeoMortgageAllowedFilter extends IFilter {\n id: FilterId = Filters.seoMortgageAllowed;\n\n constructor(readonly isAllowed = false) {\n super();\n this.isAllowed = isAllowed;\n }\n\n isDefault() {\n return ! this.isAllowed;\n }\n}\n\nexport class ApartmentFilter extends IFilter {\n id: FilterId = Filters.apartments;\n\n isApartment: IsApartmentsOptions;\n\n constructor(\n isApartment?: IsApartmentsOptions\n ) {\n super();\n this.isApartment = isApartment || IsApartmentsOptions.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.isApartment === IsApartmentsOptions.UNKNOWN;\n }\n}\n\nexport class PositionFilter extends IFilter {\n id: FilterId = Filters.position;\n\n position: Position[];\n\n constructor(\n position?: Position[]\n ) {\n super();\n this.position = position || [];\n }\n\n isDefault(): boolean {\n return this.position.length === 0;\n }\n}\n\nexport class AuthorFilter extends IFilter {\n id: FilterId = Filters.author;\n\n author: AuthorTypeOptionsWithRealtor[];\n\n constructor(author?: AuthorTypeOptionsWithRealtor[]) {\n super();\n this.author = author || [];\n }\n\n isDefault(): boolean {\n return this.author.length === 0;\n }\n}\n\nexport class UserIdFilter extends IFilter {\n id: FilterId = Filters.userId;\n\n userId: string | undefined;\n\n constructor(userId?: string) {\n super();\n this.userId = userId || undefined;\n }\n\n isDefault(): boolean {\n return this.userId === undefined;\n }\n}\n\nexport class SellTypeFilter extends IFilter {\n id: FilterId = Filters.sellType;\n\n sellType: SellType[];\n\n constructor(sellType?: SellType[]) {\n super();\n this.sellType = sellType || [];\n }\n\n isDefault(): boolean {\n return this.sellType.length === 0;\n }\n}\n\nexport class CommissioningFilter extends IFilter {\n id: FilterId = Filters.commissioning;\n commissioning: Commissioning | string;\n\n constructor(commissioning?: Commissioning | string) {\n super();\n this.commissioning = commissioning || Commissioning.UNKNOWN;\n }\n isDefault() {\n return this.commissioning === Commissioning.UNKNOWN;\n }\n}\n\nexport class CommissioningListFilter extends IFilter {\n id: FilterId = Filters.commissioningList;\n commissioningList: (Commissioning | string)[];\n\n constructor(commissioningList: (Commissioning | string)[] = []) {\n super();\n\n this.commissioningList = commissioningList;\n }\n\n isDefault() {\n return this.commissioningList.length === 0;\n }\n}\n\nexport const allWithFinishingValues = [ FinishingTypeEnum.Fine, FinishingTypeEnum.PreFinishing, FinishingTypeEnum.WithFurniture ];\nexport class FinishingTypeFilter extends IFilter {\n id: FilterId = Filters.finishingType;\n value: IFinishing;\n\n constructor(value?: FinishingParams) {\n super();\n this.value = {\n hasFinishing: value?.hasFinishing,\n finishingType: value?.finishingType ?? []\n };\n }\n\n isDefault(): boolean {\n const { hasFinishing, finishingType } = this.value;\n\n return (\n hasFinishing === undefined && finishingType.length === 0\n );\n }\n}\n\nexport class FinishingFlatFilter extends IFilter {\n id: FilterId = Filters.finishingFlat;\n value: FinishingBuilding;\n\n constructor(value?: FinishingBuildingParams) {\n super();\n this.value = {\n hasFinishing: value?.hasFinishing,\n finishingType: value?.finishingType ?? []\n };\n }\n\n isDefault(): boolean {\n const { hasFinishing, finishingType } = this.value;\n\n return (\n hasFinishing === undefined && finishingType.length === 0\n );\n }\n}\n\nexport class SafetyFilter extends IFilter {\n id: FilterId = Filters.safety;\n safety: Safety[];\n\n constructor(\n safety?: Safety[]\n ) {\n super();\n this.safety = safety || [];\n }\n\n isDefault(): boolean {\n return this.safety.length === 0;\n }\n}\n\nexport class DeveloperFilter extends IFilter {\n id: FilterId = Filters.developer;\n\n developerId?: number;\n\n constructor(\n developerId?: number\n ) {\n super();\n this.developerId = developerId;\n }\n\n isDefault(): boolean {\n return typeof this.developerId !== 'number';\n }\n}\n\nexport class BuildingClassFilter extends IFilter {\n id: FilterId = Filters.buildingClass;\n buildingClass: BuildingClass[];\n\n constructor(\n buildingClass?: BuildingClass[]\n ) {\n super();\n this.buildingClass = buildingClass || [];\n }\n\n isDefault(): boolean {\n return this.buildingClass.length === 0;\n }\n}\n\nexport class AccreditationFilter extends IFilter {\n id: FilterId = Filters.accreditation;\n accreditation: Accreditation[];\n\n constructor(\n accreditation?: Accreditation[]\n ) {\n super();\n this.accreditation = accreditation || [];\n }\n\n isDefault(): boolean {\n return this.accreditation.length === 0;\n }\n}\n\nexport class NewBuildingDealFilter extends IFilter {\n id: FilterId = Filters.newBuildingDeal;\n deal: NewBuildingDeal[];\n\n constructor(\n deal?: NewBuildingDeal[]\n ) {\n super();\n this.deal = deal || [];\n }\n\n isDefault(): boolean {\n return this.deal.length === 0;\n }\n}\n\nexport class PaymentTypeFilter extends IFilter {\n id: FilterId = Filters.paymentType;\n type: PaymentType[];\n\n constructor(\n type?: PaymentType[]\n ) {\n super();\n this.type = type || [];\n }\n\n isDefault(): boolean {\n return this.type.length === 0;\n }\n}\n\nexport class RoomsInOfferFilter extends IFilter {\n id: FilterId = Filters.roomsInOffer;\n roomsInOffer: RoomsOfferedOptions[];\n\n constructor(roomsInOffer: RoomsOfferedOptions[] = []) {\n super();\n this.roomsInOffer = roomsInOffer;\n }\n\n isDefault(): boolean {\n return this.roomsInOffer.length === 0;\n }\n}\n\nexport class LandStatusFilter extends IFilter {\n id: FilterId = Filters.landStatus;\n landStatuses: LandStatus[];\n\n constructor(landStatuses: LandStatus[] = []) {\n super();\n this.landStatuses = landStatuses;\n }\n\n isDefault(): boolean {\n return this.landStatuses.length === 0;\n }\n}\n\nexport class LandAreaFilter extends IFilter {\n id: FilterId = Filters.landArea;\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class SupplyOptionsFilter extends IFilter {\n id: FilterId = Filters.supplyOptions;\n\n isDefault(): boolean {\n return this.gas.length === 0 &&\n this.water.length === 0 &&\n this.electricity.length === 0 &&\n this.sewerage.length === 0;\n }\n\n gas: GasOptions[];\n water: WaterOptions[];\n electricity: ElectricityOptions[];\n sewerage: SewerageOptions[];\n\n constructor(\n gas: GasOptions[] = [],\n water: WaterOptions[] = [],\n electricity: ElectricityOptions[] = [],\n sewerage: SewerageOptions[] = []\n ) {\n super();\n this.gas = gas;\n this.water = water;\n this.electricity = electricity;\n this.sewerage = sewerage;\n }\n}\n\nexport class HouseCategoryFilter extends IFilter {\n id = Filters.houseCategory;\n categories: HouseCategory[];\n isDefault(): boolean {\n return this.categories.length === 0;\n }\n\n constructor(\n categories: HouseCategory[] = []\n ) {\n super();\n this.categories = categories;\n }\n}\n\nexport class HouseAreaFilter extends IFilter {\n id: FilterId = Filters.houseArea;\n isDefault(): boolean {\n return this.value.from === null && this.value.to === null;\n }\n value: INumberRange;\n constructor(value?: INumberRange) {\n super();\n this.value = value || { from: null, to: null };\n }\n}\n\nexport class BathroomLocationFilter extends IFilter {\n id: FilterId = Filters.bathroomLocation;\n\n locations: BathroomLocationOptions[];\n\n isDefault() {\n return this.locations.length === 0;\n }\n\n constructor(locations: BathroomLocationOptions[] = []) {\n super();\n this.locations = locations;\n }\n}\n\nexport class HeatingFilter extends IFilter {\n id: FilterId = Filters.heating;\n\n heating: HeatingOptions[];\n\n isDefault() {\n return this.heating.length === 0;\n }\n\n constructor(heating: HeatingOptions[] = []) {\n super();\n this.heating = heating;\n }\n}\n\nexport class BuildingsFilter extends IFilter {\n id: FilterId = Filters.buildings;\n buildings: number[];\n\n constructor(\n buildings?: number[]\n ) {\n super();\n this.buildings = buildings || [];\n }\n\n isDefault() {\n return this.buildings.length === 0;\n }\n}\n\nexport class ClosedSalesFilter extends IFilter {\n id: FilterId = Filters.closedSales;\n includingClosedSales: boolean;\n\n constructor(includingClosedSales: boolean = false) {\n super();\n this.includingClosedSales = includingClosedSales;\n }\n\n isDefault() {\n return ! this.includingClosedSales;\n }\n}\n\nexport class SelectedNewBuildingFilter extends IFilter {\n id: FilterId = Filters.selectedNewBuilding;\n selectedNewBuildingId?: number;\n\n constructor(selectedNewBuildingId?: number) {\n super();\n this.selectedNewBuildingId = selectedNewBuildingId;\n }\n\n isDefault(): boolean {\n return typeof this.selectedNewBuildingId !== 'number';\n }\n}\n\nexport class ShowHighlightedFilter extends IFilter {\n id: FilterId = Filters.showHighlighted;\n shouldShowHighlighted: boolean;\n\n constructor(shouldShowHighlighted: boolean = false) {\n super();\n this.shouldShowHighlighted = shouldShowHighlighted;\n }\n\n isDefault(): boolean {\n return ! this.shouldShowHighlighted;\n }\n}\n\nexport class WindowsDirectionFilter extends IFilter {\n id: FilterId;\n value: WindowsDirectionSearchOffersEnum[];\n\n constructor(value: WindowsDirectionSearchOffersEnum[] = []) {\n super();\n this.id = Filters.windowsDirection;\n this.value = value;\n }\n\n isDefault() {\n return this.value.length === 0;\n }\n}\n\nexport class SellerOrganizationNameFilter extends IFilter {\n id: FilterId = Filters.sellerOrganizationName;\n\n constructor(public sellerOrganizationName?: string) {\n super();\n }\n\n isDefault() {\n return ! this.sellerOrganizationName;\n }\n}\n\nexport class BuildEpochFilter extends IFilter {\n id: FilterId = Filters.buildEpoch;\n\n buildEpoch: BuildEpoch[];\n\n constructor(buildEpoch?: BuildEpoch[]) {\n super();\n this.buildEpoch = buildEpoch || [];\n }\n\n isDefault(): boolean {\n return this.buildEpoch.length === 0;\n }\n}\n\nexport class OnlineViewFilter extends IFilter {\n id: FilterId = Filters.onlineView;\n onlineView: OnlineView;\n\n constructor(onlineView?: OnlineView) {\n super();\n this.onlineView = onlineView || OnlineView.UNKNOWN;\n }\n\n isDefault(): boolean {\n return this.onlineView === OnlineView.UNKNOWN;\n }\n}\n\nexport class NotOnlyM2ProFilter extends IFilter {\n id: FilterId = Filters.notOnlyM2Pro;\n notOnlyM2Pro: boolean;\n\n constructor(notOnlyM2Pro?: boolean) {\n super();\n this.notOnlyM2Pro = notOnlyM2Pro ?? false;\n }\n\n isDefault(): boolean {\n return ! this.notOnlyM2Pro;\n }\n}\n","import { IFilter, FilterId, Filters, MapBoundsFilter, InfrastructureFilter } from './Filter';\n\nexport class FilterCollection {\n constructor(filters?: Map<FilterId, IFilter>) {\n this._filters = filters || new Map();\n }\n reset() {\n const values = this._filters.values();\n\n for (const value of values) {\n if (! value) continue;\n if (value.id === Filters.region) continue;\n if (value.id === Filters.categoryType) continue;\n if (value.id === Filters.dealType) continue;\n if (value.isDefault()) continue;\n\n this._filters.set(value.id, value.create());\n }\n\n return this.rebuild();\n }\n rebuild() {\n return new FilterCollection(this._filters);\n }\n readonly _filters: Map<FilterId, IFilter>;\n update(filter: IFilter) {\n // Need to preserve filter update order - last updated filter is last in Array.from(this._filters.values())\n this._filters.delete(filter.id);\n this._filters.set(filter.id, filter);\n return this.rebuild();\n }\n getFilters() {\n return this._filters;\n }\n get<K extends IFilter>(id: FilterId) {\n return this._filters.get(id) as K;\n }\n remove(filter?: IFilter) {\n if (! filter) return this;\n\n this._filters.set(filter.id, filter.create());\n return this.rebuild();\n }\n getCountActiveFilters(ids?: Filters[]): number {\n const values = this._filters.values();\n\n let counter = 0;\n\n for (const value of values) {\n if (! value) continue;\n if (value.id === Filters.categoryType) continue;\n if (value.id === Filters.dealType) continue;\n if (value.id === Filters.region) continue;\n if (value.isDefault()) continue;\n if (ids?.includes(value.id)) continue;\n if (value.id === Filters.infrastructure) {\n counter += (value as InfrastructureFilter).infrastructure.length;\n if ((value as InfrastructureFilter).hasLift) counter++;\n continue;\n }\n counter++;\n }\n\n return counter;\n }\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\n\nconst cn = classname.bind(null, 'ModalHeading');\n\ninterface IProps {\n text: string;\n icon?: React.ReactNode;\n activeCount?: number;\n reset?: () => void;\n onClose?: () => void;\n dataTest?: string;\n className?: string;\n withDeclension?: boolean;\n}\n\nexport const ModalHeading = ({\n icon,\n text,\n activeCount,\n reset,\n onClose,\n dataTest,\n className,\n withDeclension = true\n}: IProps) => (\n <div className={cn(null, undefined, className)}>\n <ModalHeadingInner\n icon={icon}\n text={text}\n activeCount={activeCount}\n reset={reset}\n dataTest={dataTest}\n withDeclension={withDeclension}\n />\n <div\n onClick={onClose}\n className={cn('close')}\n data-test={dataTest ? `${dataTest}-close` : undefined}\n >\n <Icon\n name='times'\n size={Size.Small}\n />\n </div>\n </div>\n);\n\nexport const ModalHeadingInner = ({\n icon,\n text,\n activeCount,\n reset,\n dataTest,\n withDeclension = true\n}: IProps) => (\n <div className={cn('inner')}>\n {icon}\n {text}\n {\n // eslint-disable-next-line no-nested-ternary\n activeCount ? (\n reset ? (<>\n <div className={cn('counter')}>{activeCount}</div>\n <Typography\n tag='span'\n onClick={reset}\n className={cn('reset')}\n data-test={dataTest ? `${dataTest}-reset` : undefined}\n >\n Сбросить\n </Typography>\n </>) : (\n <Typography\n tag='span'\n color='black-400'\n className={cn('text-counter')}\n >\n {activeCount} \n {\n withDeclension ?\n declensionByNumber(activeCount, [ 'выбран', 'выбрано', 'выбрано' ]) :\n 'выбрано'\n }\n </Typography>\n )\n ) : null\n }\n </div>\n);\n","import React from 'react';\nimport { FunctionComponent, RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport throttle from 'lodash/throttle';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'StickyPhoneWrapper');\n\nexport const StickyPhoneWrapper: FunctionComponent<{\n className?: string;\n bottomOffset?: number;\n safeAreaBottom?: number;\n anchor?: RefObject<HTMLElement>;\n hasBackground?: boolean;\n showBeforeScrolling?: boolean;\n}> = ({\n children,\n className,\n anchor,\n bottomOffset = 16,\n safeAreaBottom = 12,\n hasBackground = false,\n showBeforeScrolling = false\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const ref = useRef<HTMLDivElement>(null);\n\n const handleScroll = useCallback(() => {\n const anchorRect = anchor?.current?.getBoundingClientRect();\n\n const viewPortHeight = window.innerHeight;\n\n if (ref.current && anchorRect && wrapperRef.current) {\n const currentRect = ref.current.getBoundingClientRect();\n\n const isHideAnchor = (anchorRect.bottom - viewPortHeight - anchorRect.height) <= 0;\n\n if (! isHideAnchor) {\n ref.current.style.position = 'fixed';\n\n if (hasBackground) {\n ref.current.style.paddingBottom = `calc(${bottomOffset}px + env(safe-area-inset-bottom, ${safeAreaBottom}px))`;\n ref.current.style.bottom = '0';\n } else {\n ref.current.style.bottom = `calc(${bottomOffset}px + env(safe-area-inset-bottom, ${safeAreaBottom}px))`;\n }\n } else {\n ref.current.style.bottom = `-${currentRect.height}px`;\n }\n }\n }, [ anchor, bottomOffset, safeAreaBottom, hasBackground ]);\n\n useEffect(() => {\n if (anchor) {\n if (showBeforeScrolling) {\n handleScroll();\n }\n\n const throttledHandleScroll = throttle(handleScroll, 100);\n\n window.addEventListener('scroll', throttledHandleScroll);\n\n return () => {\n window.removeEventListener('scroll', throttledHandleScroll);\n };\n }\n }, [ anchor, handleScroll ]);\n\n return (\n <div ref={wrapperRef}>\n <div\n ref={ref}\n className={cn(null, { fixed: ! anchor, hasBackground }, className)}\n >\n {children}\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport './styles.css';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface FiltersFormTipsProps {\n\n}\n\nconst FiltersFormTips: React.FunctionComponent<FiltersFormTipsProps> = ({ children }) => {\n return (<div className='FiltersFormTips'>\n {children}\n </div>);\n};\n\nexport default FiltersFormTips;\n","import React from 'react';\nimport Icon, { IIconProps } from '../Icon';\n\nimport './styles.css';\n\ninterface IIconClose extends IIconProps {\n type?: 'close';\n}\n\nexport default (props: IIconClose): React.ReactElement => React.cloneElement(<Icon />, { type: 'close', ...props });\n","import React, { ReactNode } from 'react';\n// @ts-ignore\nimport Button from '@search/vtbeco-ui/src/components/controls/Button';\n// @ts-ignore\nimport IconClose from '@search/vtbeco-ui/src/components/controls/IconClose';\n// @ts-ignore\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport interface IFiltersFormTip {\n children: ReactNode;\n\n /**\n * Обработчик удаления подсказки\n * @param name\n */\n onRemove: () => void;\n enabled: boolean;\n onWhiteBackground?: boolean;\n mortgageTip?: boolean;\n}\n\nconst cn = classname.bind(null, 'FiltersFormTip');\n\nconst FiltersFormTip: React.FC<IFiltersFormTip> = ({\n children,\n onRemove,\n mortgageTip = false,\n onWhiteBackground: onWhite = true\n}) => {\n const handleClickRemove = () => {\n onRemove();\n };\n\n return (\n <div className={cn(null, { onWhite, mortgageTip })}>\n <span className={cn('label')}>\n {children}\n </span>\n <Button\n view='clear'\n onClick={handleClickRemove}\n iconLeft={<IconClose />}\n className={cn('remove')}\n />\n </div>\n );\n};\n\nexport default FiltersFormTip;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AuthorTypeOptions, LayoutImageOptions, PhotoOptions } from '@search/filter-enums/enums';\nimport { IRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\nimport { formatRange } from '@search/helpers/src/formatNumber';\nimport {\n ApartmentFilter,\n AreaFilter,\n AuthorFilter,\n CellHeightFilter,\n Filters,\n FloorFilter,\n FloorsTotalFilter,\n KitchenAreaFilter,\n LayoutImageOptionsFilter,\n LivingAreaFilter,\n PhotoOptionsFilter,\n TransportLimitFilter,\n YearBuildingFilter,\n SellerOrganizationNameFilter,\n MortgagePaymentFilter\n} from '../filters/models/Filter';\nimport { priceByMortgagePayment } from '../filters/helpers/priceHelper';\nimport {\n apartmentsLabels,\n authorLabels,\n ceilingHeightLabels,\n floorConstraintsLabels,\n timeLimitLabel,\n transportTypeLabel\n} from './labels';\n\nexport const extraFiltersIds: Filters[] = [\n Filters.bathroomLocation,\n Filters.heating,\n Filters.supplyOptions,\n Filters.landArea,\n Filters.houseArea,\n Filters.mapBounds,\n Filters.geo,\n Filters.totalArea,\n Filters.livingArea,\n Filters.kitchenArea,\n Filters.floor,\n Filters.floorsTotal,\n Filters.cellHeight,\n Filters.renovation,\n Filters.bathroom,\n Filters.balcony,\n Filters.developer,\n Filters.buildingClass,\n Filters.builtYear,\n Filters.parkings,\n Filters.walls,\n Filters.apartments,\n Filters.position,\n Filters.infrastructure,\n Filters.safety,\n Filters.accreditation,\n Filters.newBuildingDeal,\n Filters.paymentType,\n Filters.author,\n Filters.photoOptions,\n Filters.layoutImageOptions,\n Filters.livingFacility,\n Filters.sellType,\n Filters.furniture,\n Filters.livingTenantOptions,\n Filters.rentConditions,\n Filters.rentPrepayment,\n Filters.bankPledgeOptions,\n Filters.seoMortgageAllowed,\n Filters.closedSales,\n Filters.buildings,\n Filters.windowsDirection,\n Filters.transportLimit,\n Filters.flatsSpecialEvents,\n Filters.otherSpecialEvents,\n Filters.miscSpecialEvents,\n Filters.nearbyOptions,\n Filters.renovationProgram,\n Filters.sellerOrganizationName,\n Filters.buildEpoch,\n Filters.onlineView,\n Filters.mortgagePayment,\n Filters.finishingType,\n Filters.commissioning\n];\n\nexport const buildRangeLabel = (\n value: IRange<number | null>,\n title: string,\n unit = ''\n) => {\n if (value === null) {\n return null;\n }\n const spacedUnit = unit ? ` ${unit}` : unit;\n\n if (value.from && value.to) {\n return `${title}: от ${value.from}${spacedUnit} до ${value.to}${spacedUnit}`;\n } else if (value.from && ! value.to) {\n return `${title}: от ${value.from}${spacedUnit}`;\n } else if (! value.from && value.to) {\n return `${title}: до ${value.to}${spacedUnit}`;\n }\n\n return null;\n};\n\nconst getTransportLimitTip = (filter: TransportLimitFilter) => {\n const { transportType, timeLimit } = filter;\n\n if (transportType && timeLimit) {\n return `До метро ${timeLimitLabel[timeLimit]} мин. ${transportTypeLabel[transportType]}`;\n }\n\n return null;\n};\n\nconst getFloorLabelTip = (filter: FloorFilter) => {\n const { range, last, first } = filter;\n const labels = [ buildRangeLabel(range, 'Этаж в доме') ];\n\n if (last) {\n labels.push(`${floorConstraintsLabels[last]} последний`);\n }\n\n if (first) {\n labels.push(`${floorConstraintsLabels[first]} первый`);\n }\n\n return labels.join(', ');\n};\n\nconst getMortgagePriceTip = (filter: MortgagePaymentFilter) => {\n if (filter.payment) {\n return `С таким платежом вы сможете купить квартиру ${formatRange(null, priceByMortgagePayment(filter.payment))}.`;\n }\n\n return null;\n};\nconst getCeilingHeightLabelTip = (filter: CellHeightFilter) =>\n ceilingHeightLabels[filter.value];\n\nconst getAreaLabelTip = (filter: AreaFilter) =>\n buildRangeLabel(filter.value, 'Общая площадь', 'м²');\n\nconst getLivingLabelTip = (filter: LivingAreaFilter) =>\n buildRangeLabel(filter.value, 'Жилая площадь', 'м²');\n\nconst getKitchenLabelTip = (filter: KitchenAreaFilter) =>\n buildRangeLabel(filter.value, 'Площадь кухни', 'м²');\n\nconst getFloorsTotalLabelTip = (filter: FloorsTotalFilter) =>\n buildRangeLabel(filter.range, 'Этажей в доме');\n\nconst getYearBuildingLabelTip = (filter: YearBuildingFilter) =>\n buildRangeLabel(filter.value, 'Год постройки', 'г.');\n\nconst getApartmentsLabelTip = (filter: ApartmentFilter) =>\n apartmentsLabels[filter.isApartment];\n\nconst getAuthorTypeTip = (filter: AuthorFilter) => {\n const check = (v: number) => {\n return (! isNaN(v) && (v in AuthorTypeOptions));\n };\n const result = [];\n\n for (const i of filter.author) {\n if (check(Number(i))) {\n result.push(\n authorLabels[Number(i)]\n );\n }\n }\n return result.join(', ');\n};\n\nconst getPhotoTypeTip = (filter: PhotoOptionsFilter) => filter.photoOption === PhotoOptions.WITH_PHOTO ?\n 'Только с фото' :\n null;\n\nconst getLayoutImageTypeTip = (filter: LayoutImageOptionsFilter) =>\n filter.layoutImageOption.find(option => option === LayoutImageOptions.HAS_ANY) ?\n 'С планировкой' : null;\n\nconst getSellerOrganizationName = (filter: SellerOrganizationNameFilter) => {\n return filter.sellerOrganizationName ? `${filter.sellerOrganizationName}` : null;\n};\n\nconst getBankPledgeTip = () => 'В залоге';\n\nconst getNearbySchoolTip = () => 'Рядом хорошая школа';\n\nconst getRenovationProgramTip = () => 'Дом под реновацию';\n\nconst getClosedSalesTip = () => 'С закрытыми продажами';\n\nconst getOnlineViewTip = () => 'Онлайн-просмотр';\n\n// eslint-disable-next-line complexity\nexport const serializeToTips = (id: Filters, filter: any) => {\n switch (id) {\n case Filters.photoOptions: {\n return getPhotoTypeTip(filter as PhotoOptionsFilter);\n }\n case Filters.layoutImageOptions: {\n return getLayoutImageTypeTip(filter as LayoutImageOptionsFilter);\n }\n case Filters.seoMortgageAllowed: {\n return 'В ипотеку';\n }\n case Filters.bankPledgeOptions: {\n return getBankPledgeTip();\n }\n case Filters.renovationProgram: {\n return getRenovationProgramTip();\n }\n case Filters.nearbyOptions: {\n return getNearbySchoolTip();\n }\n case Filters.author: {\n return getAuthorTypeTip(filter as AuthorFilter);\n }\n case Filters.transportLimit: {\n return getTransportLimitTip(filter as TransportLimitFilter);\n }\n case Filters.floor: {\n return getFloorLabelTip(filter as FloorFilter);\n }\n case Filters.cellHeight: {\n return getCeilingHeightLabelTip(filter as CellHeightFilter);\n }\n case Filters.totalArea: {\n return getAreaLabelTip(filter as AreaFilter);\n }\n case Filters.livingArea: {\n return getLivingLabelTip(filter as LivingAreaFilter);\n }\n case Filters.kitchenArea: {\n return getKitchenLabelTip(filter as KitchenAreaFilter);\n }\n case Filters.floorsTotal: {\n return getFloorsTotalLabelTip(filter as FloorsTotalFilter);\n }\n case Filters.builtYear: {\n return getYearBuildingLabelTip(filter as YearBuildingFilter);\n }\n case Filters.apartments: {\n return getApartmentsLabelTip(filter as ApartmentFilter);\n }\n case Filters.closedSales: {\n return getClosedSalesTip();\n }\n case Filters.sellerOrganizationName: {\n return getSellerOrganizationName(filter as SellerOrganizationNameFilter);\n }\n case Filters.onlineView: {\n return getOnlineViewTip();\n }\n case Filters.mortgagePayment: {\n return getMortgagePriceTip(filter as MortgagePaymentFilter);\n }\n default: {\n return null;\n }\n }\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable complexity */\nimport React, {\n useEffect,\n useState,\n Fragment\n} from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport classname from '@search/classname/src';\nimport {\n DealType,\n RoomsOfferedOptions,\n LandStatus,\n GasOptions,\n ElectricityOptions,\n SewerageOptions,\n WaterOptions,\n HeatingOptions,\n BathroomLocationOptions,\n Rooms,\n LivingFacilitiesOption,\n PrepaymentType,\n CommissionType,\n DepositType,\n FurnitureOption,\n LivingTenantOption,\n FinishingTypeOption,\n Commissioning,\n Quarter\n} from '@search/filter-enums/enums';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport { WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\n\nimport type { QueryDisplayValues } from '../../common/hooks/useQueryDisplayValues';\nimport type { MetroStation } from '../../../domain/geo/MetroStation';\nimport { MetroMark } from '../../common/components/GeoSuggest/MetroMark';\nimport FiltersFormTips from '../../desktop/components/FiltersForm/FiltersFormTips';\nimport FiltersFormTip from '../../desktop/components/FiltersForm/FiltersFormTips/FiltersFormTip';\nimport { groupDistricts } from '../../filters/helpers/districtHelper';\nimport {\n AccreditationFilter,\n BathroomFilter,\n BalconyFilter,\n BuildingClassFilter,\n NewBuildingDealFilter,\n DeveloperFilter,\n ClosedSalesFilter,\n Filters,\n GeoFilter,\n IFilter,\n InfrastructureFilter,\n SafetyFilter,\n ParkingFilter,\n PositionFilter,\n RenovationFilter,\n PaymentTypeFilter,\n WallsTypeFilter,\n MapBoundsFilter,\n RoomsInOfferFilter,\n DealTypeFilter,\n LandStatusFilter,\n CategoryTypeFilter,\n RoomFilter,\n LandAreaFilter,\n SupplyOptionsFilter,\n HeatingFilter,\n BathroomLocationFilter,\n HouseAreaFilter,\n FloorsTotalFilter,\n LivingFacilityFilter,\n RentPrepaymentFilter,\n RentConditionsFilter,\n FurnitureFilter,\n LivingTenantOptionFilter,\n SellTypeFilter,\n BuildingsFilter,\n AuthorFilter,\n WindowsDirectionFilter,\n RegionFilter,\n FlatsSpecialEventsFilter,\n OtherSpecialEventsFilter,\n MiscSpecialEventsFilter,\n BuildEpochFilter,\n MortgagePaymentFilter,\n FinishingFilter,\n CommissioningFilter\n} from '../../filters/models/Filter';\n\nimport { extraFiltersIds, serializeToTips, buildRangeLabel } from '../serializeToTips';\nimport {\n accreditationLabels,\n positionLabels,\n bathroomLabels,\n balconyLabels,\n buildingClassLabels,\n newBuildingDealLabels,\n infrastructureLabels,\n safetyLabels,\n parkingLabels,\n renovationLabels,\n paymentTypeLabels,\n wallsLabels,\n saleTypeLabels,\n authorLabels,\n flatsSpecialEventsLabels,\n otherSpecialEventsLabels,\n miscSpecialEventsLabels,\n buildEpochLabels\n} from '../labels';\n\nimport './style.css';\nimport type { GeoBaseStore } from '../../../domain/geo/GeoBase';\n\ntype Id = typeof extraFiltersIds[number];\n\nexport type TipItemBase = {\n id: number;\n __typename?: 'TipRouteMetro';\n geoId?: number;\n}\n\nexport type TipItem = {\n type?: any;\n id: Id;\n kind?: GeoKind | Filters | 'METRO';\n partial?: boolean;\n title: string | null;\n geoId?: number;\n} | {\n kind: 'district-group';\n title: string;\n id: string;\n districts: TipItemBase[];\n};\n\ninterface ITipProps {\n removeTip: (tip: TipItem) => void;\n tip: TipItem;\n enabled?: boolean;\n onWhiteBackground: boolean;\n openMortgagePaymentSearchModal?: () => void;\n}\n\ntype QuarterType = keyof typeof Quarter;\n\nconst MIN_TIPS_COUNT = 3;\nconst TIP_CLASS = 'FiltersFormTip';\nconst cn = classname.bind(null, TIP_CLASS);\nconst cnButton = classname.bind(null, cn('TipButton'));\n\nconst Tip = ({\n tip,\n removeTip,\n enabled = true,\n onWhiteBackground,\n openMortgagePaymentSearchModal\n}: ITipProps) => {\n let content;\n\n if (tip.kind === GeoKind.METRO) {\n const metroTip = tip as MetroStation;\n\n content = (\n <>\n {\n metroTip.allRoutesColorsList ? (\n <MetroMark\n colors={metroTip.allRoutesColorsList}\n className={cn('mark')}\n />\n ) : (\n <Typography variant='secondary-alone'>{'м. '}</Typography>\n )\n }\n <Typography\n variant='secondary-alone'\n className={cn('metro')}\n >\n {metroTip.title}\n </Typography>\n </>\n );\n } else if (tip.id === Filters.mortgagePayment) {\n content = (\n <Typography variant='secondary-alone' onClick={openMortgagePaymentSearchModal}>\n {tip.title}\n <span style={{ color: '#3216B5' }}> Расчёт →</span>\n </Typography>\n );\n } else {\n content = (\n <Typography variant='secondary-alone'>\n {tip.title}\n </Typography>\n );\n }\n\n return (\n <FiltersFormTip\n key={tip.id}\n onRemove={() => enabled ? removeTip(tip) : undefined}\n enabled={enabled}\n onWhiteBackground={onWhiteBackground}\n mortgageTip={tip.id === Filters.mortgagePayment}\n >\n {content}\n </FiltersFormTip>\n );\n};\n\ntype IProps = {\n filters: FilterCollection;\n updateFilter: (filter: IFilter) => void;\n removeFilter: (filter: IFilter) => void;\n expandFilter: (state: boolean) => void | undefined;\n removeGeo?: (tip: TipItemBase[]) => void;\n onUpdateLength?: (length: number) => void;\n reset?: () => void;\n customFilterBehavior?: {\n developer: {\n reset: () => void;\n };\n };\n onWhiteBackground?: boolean;\n classNamesNewFilters?: {\n firstLineTipsOnly: string;\n allTips: string;\n tipsButtons: string;\n };\n loading?: boolean;\n tipsExpanded?: boolean;\n openMortgagePaymentSearchModal?: () => void;\n} & ({\n shouldIgnoreGeoIds?: boolean;\n geoStore?: any;\n tips?: undefined;\n queryDisplayValues?: QueryDisplayValues;\n} | { tips: ReturnType<typeof getTipsCollection> })\n\nfunction getDealForRoom(dealTypeFilter: DealTypeFilter) {\n if (dealTypeFilter.dealType === DealType.SELL) {\n return 'на продажу';\n } else if (dealTypeFilter.dealType === DealType.RENT) {\n return 'в аренду';\n }\n}\n\nconst roomsInOffer = {\n [RoomsOfferedOptions.ROOM_1]: '1',\n [RoomsOfferedOptions.ROOM_2]: '2',\n [RoomsOfferedOptions.ROOM_3]: '3',\n [RoomsOfferedOptions.ROOM_4_AND_MORE]: '4+'\n};\n\nconst roomInOfferWithText = {\n [RoomsOfferedOptions.ROOM_1]: '1 комната',\n [RoomsOfferedOptions.ROOM_2]: '2 комнаты',\n [RoomsOfferedOptions.ROOM_3]: '3 комнаты',\n [RoomsOfferedOptions.ROOM_4_AND_MORE]: '4+ комнат'\n};\n\nconst roomForSale = {\n [Rooms.ROOM_1]: '1',\n [Rooms.ROOM_2]: '2',\n [Rooms.ROOM_3]: '3',\n [Rooms.ROOM_4]: '4',\n [Rooms.ROOM_5_AND_MORE]: '5+'\n};\n\nconst roomWithText = {\n [Rooms.ROOM_1]: '1 комната',\n [Rooms.ROOM_2]: '2 комнаты',\n [Rooms.ROOM_3]: '3 комнаты',\n [Rooms.ROOM_4]: '4 комнаты',\n [Rooms.ROOM_5_AND_MORE]: '5+ комнат'\n};\n\nfunction getRoomsInOfferTips(\n roomsInOfferFilter: RoomsInOfferFilter | undefined,\n dealTypeFilter: DealTypeFilter\n) {\n const rooms = roomsInOfferFilter?.roomsInOffer ?? [];\n\n if (rooms.length === 0) {\n return null;\n }\n\n const roomsInOfferText = rooms.map(room => roomsInOffer[room]).join(', ');\n const roomsText = rooms.length === 1 ? roomInOfferWithText[rooms[0]] : `${roomsInOfferText} комнат`;\n const dealTypeText = getDealForRoom(dealTypeFilter);\n\n return `${roomsText} ${dealTypeText}`;\n}\n\nfunction getAtRealtyType(realtyType?: RealtyObjectType) {\n if (\n realtyType === RealtyObjectType.FLAT ||\n realtyType === RealtyObjectType.ROOM\n ) {\n return 'в квартире';\n } else if (\n realtyType === RealtyObjectType.HOUSE\n ) {\n return 'в доме';\n }\n\n return '';\n}\n\nconst livingFacilityMapping = {\n [LivingFacilitiesOption.INTERNET]: 'Интернет',\n [LivingFacilitiesOption.WASHING_MACHINE]: 'Стиральная машина',\n [LivingFacilitiesOption.FRIDGE]: 'Холодильник',\n [LivingFacilitiesOption.DISHWASHER]: 'Посудомоечная машина',\n [LivingFacilitiesOption.AIR_CONDITIONER]: 'Кондиционер',\n [LivingFacilitiesOption.TV]: 'Телевизор'\n};\n\nfunction getLivingFacilityTip(\n facility: LivingFacilitiesOption\n): string | undefined {\n return livingFacilityMapping[facility];\n}\n\nfunction getRoomsTips(\n roomFilter: RoomFilter | undefined,\n realtyObjectFilter: CategoryTypeFilter | undefined\n) {\n const rooms = roomFilter?.rooms ?? [];\n\n if (rooms.length === 0) {\n return null;\n }\n\n const roomsCountText = rooms.map(room => roomForSale[room]).join(', ');\n let roomsText = rooms.length === 1 ? roomWithText[rooms[0]] : `${roomsCountText} комнат`;\n const atRealtyTypeText = getAtRealtyType(realtyObjectFilter?.categoryType);\n\n // roomsText maybe absent, if bot/robot will come with wrong url (/moskva/nedvizhimost/snyat-dom/svobodnaya-planirovka/rayon-lianozovo/s-vodoj/)\n if (realtyObjectFilter?.categoryType === RealtyObjectType.HOUSE && roomsText) {\n roomsText = roomsText.replace('4, 5+', '4+');\n }\n\n return `${roomsText} ${atRealtyTypeText}`;\n}\n\nconst getLandAreaLabelTip = (filter: LandAreaFilter) =>\n buildRangeLabel(filter.value, 'Площадь участка', 'сот.');\n\nconst getHouseAreaLabelTip = (filter: HouseAreaFilter) =>\n buildRangeLabel(filter.value, 'Площадь дома', 'м²');\n\nconst landStatus = {\n [LandStatus.IZHS]: 'ИЖС',\n [LandStatus.SNT]: 'СНТ',\n [LandStatus.DNP]: 'ДНП',\n [LandStatus.AGRICULTURAL]: 'ЛПХ'\n};\n\nfunction getLandStatusTips(filter: LandStatusFilter) {\n const statuses = filter.landStatuses\n .map(status => landStatus[status])\n .filter(a => a);\n\n if (statuses.length === 0) {\n return null;\n }\n\n return `Статус участка: ${statuses.join(', ')}`;\n}\n\nfunction getSupplyOptionsTip(supplyOptionsFilter: SupplyOptionsFilter, heatingFilter?: HeatingFilter) {\n const result: string[] = [];\n\n if (supplyOptionsFilter.gas.includes(GasOptions.HAS_ANY)) {\n result.push('газ');\n }\n\n if (supplyOptionsFilter.electricity.includes(ElectricityOptions.HAS_ANY)) {\n result.push('электричество');\n }\n\n if (supplyOptionsFilter.sewerage.includes(SewerageOptions.HAS_ANY)) {\n result.push('канализация');\n }\n\n if (supplyOptionsFilter.water.includes(WaterOptions.HAS_ANY)) {\n result.push('вода');\n }\n\n if (heatingFilter && heatingFilter.heating.includes(HeatingOptions.HAS_ANY)) {\n result.push('отопление');\n }\n\n if (result.length === 0) {\n return null;\n }\n\n const resultText = result.join(', ');\n\n return `Коммуникации: ${resultText}`;\n}\n\nfunction getWindowsDirectionLabel(filter: WindowsDirectionFilter) {\n const result: string[] = [];\n\n if (filter.value.includes(WindowsDirectionSearchOffersEnum.Rear)) {\n result.push('во двор');\n }\n\n if (filter.value.includes(WindowsDirectionSearchOffersEnum.Front)) {\n result.push('на улицу');\n }\n\n const resultText = result.join(' и ');\n\n return `Вид из ок${result.length > 1 ? 'он' : 'на'}: ${resultText}`;\n}\n\nfunction getHeatingTip(filter: HeatingFilter) {\n if (filter.heating.includes(HeatingOptions.HAS_ANY)) {\n return 'Отопление: есть';\n }\n\n return null;\n}\n\nfunction getBathroomLocationTip(filter: BathroomLocationFilter) {\n if (filter.locations.includes(BathroomLocationOptions.INSIDE)) {\n return 'Санузел в доме';\n }\n\n return null;\n}\n\nfunction getFloorsTotalTip(filter: FloorsTotalFilter) {\n return buildRangeLabel(filter.range, 'Этажей в доме', 'эт.');\n}\n\nfunction getExtraFilterIds(filters: FilterCollection) {\n const result = [ ...extraFiltersIds ];\n const realtyTypeFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n const categoryType = realtyTypeFilter?.categoryType;\n\n if (\n categoryType === RealtyObjectType.ROOM\n ) {\n result.push(Filters.rooms);\n result.push(Filters.roomsInOffer);\n }\n if (categoryType === RealtyObjectType.HOUSE) {\n result.push(Filters.rooms);\n result.push(Filters.landStatus);\n }\n\n return result;\n}\n\nfunction getPrepaymentTip(filter: RentPrepaymentFilter) {\n const prepaymentType = filter.prePaymentType;\n\n if (prepaymentType === PrepaymentType.NO_PREPAYMENT) {\n return 'Без предоплаты';\n } else if (prepaymentType === PrepaymentType.UP_TO_1_PRICE) {\n return 'Предоплата до 1 месяца';\n } else if (prepaymentType === PrepaymentType.UP_TO_2_PRICE) {\n return 'Предоплата до 2 месяцев';\n } else if (prepaymentType === PrepaymentType.UP_TO_3_PRICE) {\n return 'Предоплата до 3 месяцев';\n }\n\n return null;\n}\n\nfunction getRentConditionsTip(filter: RentConditionsFilter) {\n const result: any[] = [];\n\n if (filter.commisionType === CommissionType.NO_CLIENT_COMMISSION) {\n result.push({\n id: Filters.rentConditions + filter.commisionType as Id,\n type: 'commisionType',\n kind: Filters.rentConditions,\n title: 'Без комиссии'\n });\n }\n\n if (filter.depositType === DepositType.NO_DEPOSIT) {\n result.push({\n id: Filters.rentConditions + 'depositType' as Id,\n type: 'depositType',\n kind: Filters.rentConditions,\n title: 'Без залога'\n });\n }\n\n if (filter.utilitiesIncluded === true) {\n result.push({\n id: Filters.rentConditions + 'utilitiesIncluded' as Id,\n type: 'utilitiesIncluded',\n kind: Filters.rentConditions,\n title: 'КУ Включены'\n });\n }\n\n return result;\n}\n\nfunction getFurnitureTip(filter: FurnitureFilter) {\n const result: any[] = [];\n const furnitures = filter.furnitures;\n\n furnitures.forEach(furniture => {\n if (furniture === FurnitureOption.ALL) {\n result.push({\n id: Filters.furniture + String(furniture) as Id,\n type: furniture,\n kind: Filters.furniture,\n title: 'С мебелью'\n });\n } else if (furniture === FurnitureOption.KITCHEN) {\n result.push({\n id: Filters.furniture + String(furniture) as Id,\n type: furniture,\n kind: Filters.furniture,\n title: 'Мебель на кухне'\n });\n } else if (furniture === FurnitureOption.NO) {\n result.push({\n id: Filters.furniture + String(furniture) as Id,\n type: furniture,\n kind: Filters.furniture,\n title: 'Без мебели'\n });\n }\n });\n\n return result;\n}\n\nfunction getFinishingTip(filter: FinishingFilter) {\n const result: any[] = [];\n const finishingTypes = filter.finishingType;\n\n finishingTypes.forEach(type => {\n if (type === FinishingTypeOption.WITHOUT_FINISHING) {\n result.push({\n id: Filters.finishingType + String(type) as Id,\n type,\n kind: Filters.finishingType,\n title: 'Отделка: Без отделки'\n });\n } else if (type === FinishingTypeOption.FINE) {\n result.push({\n id: Filters.finishingType + String(type) as Id,\n type,\n kind: Filters.finishingType,\n title: 'Отделка: Чистовая'\n });\n } else if (type === FinishingTypeOption.PRE_FINISHING) {\n result.push({\n id: Filters.finishingType + String(type) as Id,\n type,\n kind: Filters.finishingType,\n title: 'Отделка: Предчистовая'\n });\n } else if (type === FinishingTypeOption.WITH_FURNITURE) {\n result.push({\n id: Filters.finishingType + String(type) as Id,\n type,\n kind: Filters.finishingType,\n title: 'Отделка: C мебелью'\n });\n }\n });\n\n return result;\n}\n\nfunction getCommissioningTip(filter: CommissioningFilter) {\n const commissioning = filter.commissioning;\n\n let tip = 'Срок сдачи: ';\n\n switch (commissioning) {\n case (Commissioning.COMMISSIONED): {\n tip += 'Сдан';\n break;\n }\n case (Commissioning.IN_PROGRESS): {\n tip += 'Строится';\n break;\n }\n case (Commissioning.UNKNOWN): {\n return;\n }\n default: {\n if (! commissioning) {\n return;\n }\n\n const yearArr = commissioning.split('_');\n const quarter: QuarterType = yearArr[0] as QuarterType;\n const year = yearArr[1];\n\n tip += `До ${Quarter[quarter]} кв. ${year}`;\n break;\n }\n }\n\n return ({\n id: Filters.commissioning,\n type: tip,\n kind: Filters.commissioning,\n title: tip\n });\n}\n\nfunction getLivingTenantOptionsTip(filter: LivingTenantOptionFilter) {\n const result: any[] = [];\n const livingOptions = filter.livingTenantOptions;\n\n livingOptions.forEach(livingOption => {\n if (livingOption === LivingTenantOption.CHILDREN_ALLOWED) {\n result.push({\n id: Filters.livingTenantOptions + String(livingOption) as Id,\n type: livingOption,\n kind: Filters.livingTenantOptions,\n title: 'Можно с детьми'\n });\n } else if (livingOption === LivingTenantOption.PETS_ALLOWED) {\n result.push({\n id: Filters.livingTenantOptions + String(livingOption) as Id,\n type: livingOption,\n kind: Filters.livingTenantOptions,\n title: 'Можно с животными'\n });\n }\n });\n\n return result;\n}\n\nexport function getTipsCollection({\n geoStore,\n filters,\n queryDisplayValues,\n shouldIgnoreGeoIds = false\n}: {\n geoStore?: GeoBaseStore;\n filters: FilterCollection;\n queryDisplayValues?: QueryDisplayValues;\n shouldIgnoreGeoIds?: boolean;\n}) {\n const filterKeys = Array.from(filters.getFilters().keys());\n\n const bathroomFilter = filters.get(Filters.bathroom) as BathroomFilter;\n const balconyFilter = filters.get(Filters.balcony) as BalconyFilter;\n const renovationFilter = filters.get(Filters.renovation) as RenovationFilter;\n const developerFilter = filters.get(Filters.developer) as DeveloperFilter;\n const closedSalesFilter = filters.get(Filters.closedSales) as ClosedSalesFilter;\n const buildingClassFilter = filters.get(Filters.buildingClass) as BuildingClassFilter;\n const parkingFilter = filters.get(Filters.parkings) as ParkingFilter;\n const wallsTypeFilter = filters.get(Filters.walls) as WallsTypeFilter;\n const infrastructureFilter = filters.get(Filters.infrastructure) as InfrastructureFilter;\n const safetyFilter = filters.get(Filters.safety) as SafetyFilter;\n const positionFilter = filters.get(Filters.position) as PositionFilter;\n const accreditationFilter = filters.get(Filters.accreditation) as AccreditationFilter;\n const newBuildingDealFilter = filters.get(Filters.newBuildingDeal) as NewBuildingDealFilter;\n const paymentTypeFilter = filters.get(Filters.paymentType) as PaymentTypeFilter;\n const livingTenantOptionFilter = filters.get(Filters.livingTenantOptions) as LivingTenantOptionFilter;\n const rentConditionsFilter = filters.get(Filters.rentConditions) as RentConditionsFilter;\n const furnitureFilter = filters.get(Filters.furniture) as FurnitureFilter;\n const mapBoundsFilter = filters.get(Filters.mapBounds) as MapBoundsFilter;\n const sellTypeFilter = filters.get(Filters.sellType) as SellTypeFilter;\n const buildingsFilter = filters.get(Filters.buildings) as BuildingsFilter;\n const authorFilter = filters.get(Filters.author) as AuthorFilter;\n const livingFacilityFilter = filters.get(Filters.livingFacility) as LivingFacilityFilter;\n const flatsSpecialEventsFilter = filters.get(Filters.flatsSpecialEvents) as FlatsSpecialEventsFilter;\n const otherSpecialEventsFilter = filters.get(Filters.otherSpecialEvents) as OtherSpecialEventsFilter;\n const miscSpecialEventsFilter = filters.get(Filters.miscSpecialEvents) as MiscSpecialEventsFilter;\n const buildEpochFilter = filters.get(Filters.buildEpoch) as BuildEpochFilter;\n const finishingFilter = filters.get(Filters.finishingType) as FinishingFilter;\n\n const tipsCollection: TipItem[] = [];\n\n for (const key of getExtraFilterIds(filters)) {\n if (\n key === Filters.timeLimit ||\n ! filterKeys.includes(key as any)\n ) {\n continue;\n }\n\n const filter = filters.get(key);\n\n if (! filter || filter.isDefault()) {\n continue;\n }\n\n const realtyTypeFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n const dealTypeFilter = filters.get(Filters.dealType) as DealTypeFilter;\n\n switch (key) {\n case Filters.floorsTotal: {\n const title = getFloorsTotalTip(filter as FloorsTotalFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.floorsTotal,\n title\n });\n }\n break;\n }\n case Filters.rooms: {\n const title = getRoomsTips(filter as RoomFilter, realtyTypeFilter);\n\n const isRoomOrHome = (\n realtyTypeFilter.categoryType === RealtyObjectType.ROOM ||\n realtyTypeFilter.categoryType === RealtyObjectType.HOUSE\n );\n\n if (title !== null && isRoomOrHome) {\n tipsCollection.push({\n id: Filters.rooms,\n title\n });\n }\n\n break;\n }\n case Filters.roomsInOffer: {\n const roomsInOfferFilter = filters.get(Filters.roomsInOffer) as RoomsInOfferFilter;\n\n const title = getRoomsInOfferTips(roomsInOfferFilter, dealTypeFilter);\n\n if (title !== null && realtyTypeFilter.categoryType === RealtyObjectType.ROOM) {\n tipsCollection.push({\n id: Filters.roomsInOffer,\n title\n });\n }\n\n break;\n }\n case Filters.landStatus: {\n const title = getLandStatusTips(filter as LandStatusFilter);\n const isHome = realtyTypeFilter.categoryType === RealtyObjectType.HOUSE;\n\n if (title !== null && isHome) {\n tipsCollection.push({\n id: Filters.landStatus,\n title\n });\n }\n break;\n }\n case Filters.landArea: {\n const title = getLandAreaLabelTip(filter as LandAreaFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.landArea,\n title\n });\n }\n break;\n }\n case Filters.supplyOptions: {\n const title = getSupplyOptionsTip(filter as SupplyOptionsFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.supplyOptions,\n title\n });\n }\n break;\n }\n case Filters.houseArea: {\n const title = getHouseAreaLabelTip(filter as HouseAreaFilter);\n\n if (title !== null) {\n tipsCollection.push({\n title,\n id: Filters.houseArea,\n kind: Filters.houseArea\n });\n }\n break;\n }\n case Filters.bathroomLocation: {\n const title = getBathroomLocationTip(filter as BathroomLocationFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.bathroomLocation,\n title\n });\n }\n break;\n }\n\n case Filters.heating: {\n const title = getHeatingTip(filter as HeatingFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.heating,\n title\n });\n }\n break;\n }\n\n case Filters.mapBounds: {\n let titleMapFilter = '';\n\n if (mapBoundsFilter.hasPolygon()) titleMapFilter = 'Выделенная область';\n if (mapBoundsFilter.bounds) titleMapFilter = 'Видимая область';\n if (mapBoundsFilter.geohash) titleMapFilter = 'Область на карте';\n\n tipsCollection.push({\n id: Filters.mapBounds,\n title: titleMapFilter\n });\n break;\n }\n\n case Filters.rentPrepayment: {\n const title = getPrepaymentTip(filter as RentPrepaymentFilter);\n\n if (title !== null) {\n tipsCollection.push({\n id: Filters.rentPrepayment,\n title\n });\n }\n break;\n }\n\n case Filters.rentConditions: {\n const options = getRentConditionsTip(filter as RentConditionsFilter);\n\n options.forEach(option => {\n tipsCollection.push(option);\n });\n\n break;\n }\n\n case Filters.furniture: {\n const options = getFurnitureTip(filter as FurnitureFilter);\n\n options.forEach(option => {\n tipsCollection.push(option);\n });\n\n break;\n }\n\n case Filters.finishingType: {\n const options = getFinishingTip(filter as FinishingFilter);\n\n options.forEach(option => {\n tipsCollection.push(option);\n });\n\n break;\n }\n\n case Filters.commissioning: {\n const tip = getCommissioningTip(filter as CommissioningFilter);\n\n if (tip) {\n tipsCollection.push(tip);\n }\n\n break;\n }\n\n case Filters.livingTenantOptions: {\n const options = getLivingTenantOptionsTip(filter as LivingTenantOptionFilter);\n\n options.forEach(option => {\n tipsCollection.push(option);\n });\n\n break;\n }\n\n case Filters.author:\n for (const author of authorFilter.author) {\n tipsCollection.push({\n kind: Filters.author,\n type: author,\n id: Filters.author + String(author) as Id,\n title: authorLabels[author]\n });\n }\n\n break;\n case Filters.floor:\n let floorLabel = serializeToTips(filter.id, filter);\n\n if (floorLabel) {\n const re = new RegExp(/^,/gm);\n\n floorLabel = re.test(floorLabel) ?\n floorLabel.toLowerCase().replace(re, 'Этаж: ') :\n floorLabel.substr(0, 1) + floorLabel.substr(1).toLowerCase();\n\n tipsCollection.push({\n id: Filters.floor,\n title: floorLabel\n } as TipItem);\n }\n\n break;\n case Filters.transportLimit:\n const transportTypeLabel = serializeToTips(\n Filters.transportLimit,\n filters.get(Filters.transportLimit)\n );\n\n if (transportTypeLabel) {\n tipsCollection.push({\n id: Filters.transportLimit,\n title: transportTypeLabel\n });\n }\n\n break;\n case Filters.livingFacility:\n const facilities = livingFacilityFilter.facilities;\n\n for (const facility of facilities) {\n const tip = getLivingFacilityTip(facility);\n\n if (tip) {\n tipsCollection.push({\n id: Filters.livingFacility,\n title: tip,\n type: facility,\n kind: Filters.livingFacility\n });\n }\n }\n\n break;\n case Filters.geo:\n const geoFilter = filters.get(Filters.geo) as GeoFilter;\n const newBuildings = queryDisplayValues?.newBuildings || {};\n\n for (const id of geoFilter.newBuildingIds) {\n tipsCollection.push({\n id: 'geo',\n kind: 'newBuilding',\n title: newBuildings[id] ?\n newBuildings[id]?.title :\n 'Жилой комплекс',\n geoId: id\n });\n }\n\n [ ...new Set(geoFilter.addressIds) ].forEach(id => {\n const geoObject = geoStore?.addresses.get(id);\n\n if (geoObject) {\n const geoName =\n geoObject.displayName ||\n geoObject.mainName;\n\n tipsCollection.push({\n id: 'geo',\n kind: geoObject.kind,\n title: geoName,\n geoId: geoObject.id\n });\n } else if (queryDisplayValues?.addresses && queryDisplayValues?.addresses[id]) { // Поддержка двойственного поведения на сервисе\n const addressObj = queryDisplayValues?.addresses[id];\n\n tipsCollection.push({\n id: 'geo',\n kind: GeoKind.STREET,\n title: addressObj && addressObj.title ? addressObj.title : 'Улица',\n geoId: id\n });\n }\n });\n\n const idsSet = new Set(geoFilter.districtIds);\n const districtsGeo = geoStore?.districts.items;\n const districtGroups = districtsGeo ?\n groupDistricts({\n districts: districtsGeo.filter(item => item.id !== 390),\n regionId: (filters.get(Filters.region) as RegionFilter).region\n }).filter(group => group.items.every(item => idsSet.has(Number(item.id)))) :\n [];\n\n for (const group of districtGroups) {\n const districts: TipItemBase[] = [];\n\n for (const item of group.items) {\n const numberedId = Number(item.id);\n\n districts.push({ id: numberedId });\n idsSet.delete(numberedId);\n }\n tipsCollection.push({\n id: `group-${group.title}`,\n kind: 'district-group',\n title: group.title,\n districts\n });\n }\n\n for (const id of Array.from(idsSet)) {\n const geo = geoStore?.districts.get(id) ?? queryDisplayValues?.addresses?.[id];\n let geoTitle = geo?.title ?? '';\n\n // округ у Королёва оставляем, чтобы отличать от города Королёв в типсах\n if (geoTitle.includes('Королёв') && geo?.kind === GeoKind.DISTRICT) geoTitle = geoTitle.trim();\n else geoTitle = geoTitle.replace('городской округ', '').trim();\n\n if (geo) {\n tipsCollection.push({\n id: 'geo',\n kind: geo.kind,\n title: geoTitle,\n geoId: geo.id\n });\n } else if (queryDisplayValues?.districts && queryDisplayValues?.districts[id]) {\n const districtObj = queryDisplayValues?.districts[id];\n\n tipsCollection.push({\n id: 'geo',\n kind: GeoKind.DISTRICT,\n title: districtObj && districtObj.title ? districtObj.title : 'Район',\n geoId: id\n });\n }\n }\n\n const groupsAndStations = geoStore?.stations\n .findRouteByStations([ ...new Set((filter as GeoFilter).metroIds) ]);\n\n if (groupsAndStations) {\n const { groups, stations } = groupsAndStations;\n\n if (shouldIgnoreGeoIds) {\n for (const station of stations ?? []) {\n tipsCollection.push(station);\n }\n }\n\n if (groups.length) {\n for (const group of groups) {\n tipsCollection.push({\n id: group.route.id,\n kind: group.route.kind,\n title: group.route.title,\n stations: group.stations\n });\n }\n\n if (! shouldIgnoreGeoIds) {\n for (const station of stations ?? []) {\n tipsCollection.push(station);\n }\n }\n } else {\n const geoTips = geoStore?.getByIds([ ...geoFilter.geoIds ]) as unknown as TipItem[];\n\n for (const geoTip of geoTips) {\n if (\n geoTip.kind === GeoKind.METRO ||\n geoTip.kind === 'METRO'\n ) {\n tipsCollection.push(geoTip);\n }\n }\n }\n }\n\n break;\n case Filters.bathroom:\n for (const bathroomType of bathroomFilter.value) {\n tipsCollection.push({\n kind: Filters.bathroom,\n type: bathroomType,\n id: Filters.bathroom + String(bathroomType) as Id,\n title: bathroomLabels[bathroomType]\n });\n }\n\n break;\n case Filters.sellType:\n for (const sellType of sellTypeFilter.sellType) {\n tipsCollection.push({\n kind: Filters.sellType,\n type: sellType,\n id: Filters.sellType + String(sellType) as Id,\n title: saleTypeLabels[sellType]\n });\n }\n\n break;\n case Filters.balcony:\n if (balconyFilter.hasBalcony) {\n tipsCollection.push({\n kind: Filters.balcony,\n type: balconyFilter.hasBalcony,\n id: Filters.balcony + String(balconyFilter.hasBalcony) as Id,\n title: balconyLabels[balconyFilter.hasBalcony]\n });\n }\n\n break;\n case Filters.buildEpoch:\n for (const buildEpoch of buildEpochFilter.buildEpoch) {\n tipsCollection.push({\n kind: Filters.buildEpoch,\n type: buildEpoch,\n id: Filters.buildEpoch + String(buildEpoch) as Id,\n title: buildEpochLabels[buildEpoch]\n });\n }\n\n break;\n case Filters.renovation:\n for (const renovationType of renovationFilter.value) {\n tipsCollection.push({\n kind: Filters.renovation,\n type: renovationType,\n id: Filters.renovation + String(renovationType) as Id,\n title: renovationLabels[renovationType]\n });\n }\n\n break;\n case Filters.developer:\n const { developerId } = developerFilter;\n\n if (developerId) {\n const developers = queryDisplayValues?.developers || {};\n\n tipsCollection.push({\n kind: Filters.developer,\n id: Filters.developer + String(developerId) as Id,\n title: developers[developerId] ?\n `Застройщик ${developers[developerId].title}` :\n 'Застройщик'\n });\n }\n\n break;\n case Filters.buildingClass:\n for (const buildingClass of buildingClassFilter.buildingClass) {\n tipsCollection.push({\n kind: Filters.buildingClass,\n type: buildingClass,\n id: Filters.buildingClass + String(buildingClass) as Id,\n title: buildingClassLabels[buildingClass]\n });\n }\n\n break;\n case Filters.parkings:\n for (const parking of parkingFilter.parkings) {\n tipsCollection.push({\n kind: Filters.parkings,\n type: parking,\n id: Filters.parkings + String(parking) as Id,\n title: parkingLabels[parking]\n });\n }\n\n break;\n case Filters.walls:\n for (const walls of wallsTypeFilter.walls) {\n tipsCollection.push({\n kind: Filters.walls,\n type: walls,\n id: Filters.walls + String(walls) as Id,\n title: `Материал стен: ${wallsLabels[walls]}`\n });\n }\n\n break;\n case Filters.infrastructure:\n for (const infrastructure of infrastructureFilter.infrastructure) {\n tipsCollection.push({\n kind: Filters.infrastructure,\n type: infrastructure,\n id: Filters.infrastructure + String(infrastructure) as Id,\n title: infrastructureLabels[infrastructure]\n });\n }\n\n if (infrastructureFilter.hasLift) {\n tipsCollection.push({\n kind: Filters.infrastructure,\n id: 'hasLift' as Id,\n title: 'Лифт'\n });\n }\n\n break;\n case Filters.safety:\n for (const safety of safetyFilter.safety) {\n tipsCollection.push({\n kind: Filters.safety,\n type: safety,\n id: Filters.safety + String(safety) as Id,\n title: safetyLabels[safety]\n });\n }\n\n break;\n case Filters.position:\n for (const position of positionFilter.position) {\n tipsCollection.push({\n kind: Filters.position,\n type: position,\n id: Filters.position + String(positionFilter) as Id,\n title: positionLabels[position]\n });\n }\n\n break;\n case Filters.accreditation:\n for (const accreditation of accreditationFilter.accreditation) {\n tipsCollection.push({\n kind: Filters.accreditation,\n type: accreditation,\n id: Filters.accreditation + String(accreditation) as Id,\n title: accreditationLabels[accreditation]\n });\n }\n\n break;\n case Filters.newBuildingDeal:\n for (const deal of newBuildingDealFilter.deal) {\n tipsCollection.push({\n kind: Filters.newBuildingDeal,\n type: deal,\n id: Filters.newBuildingDeal + String(deal) as Id,\n title: newBuildingDealLabels[deal]\n });\n }\n\n break;\n case Filters.paymentType:\n for (const type of paymentTypeFilter.type) {\n tipsCollection.push({\n kind: Filters.paymentType,\n type,\n id: Filters.paymentType + String(type) as Id,\n title: paymentTypeLabels[type]\n });\n }\n\n break;\n case Filters.closedSales: {\n const label = serializeToTips(filter.id, filter);\n\n tipsCollection.push({\n kind: Filters.closedSales,\n type: closedSalesFilter.includingClosedSales,\n id: Filters.closedSales,\n title: label\n });\n }\n\n break;\n case Filters.buildings:\n const { buildings: buildingIds } = buildingsFilter;\n\n if (buildingIds.length) {\n const buildings = queryDisplayValues?.buildings || {};\n\n for (const buildingId of buildingIds) {\n tipsCollection.push({\n kind: Filters.buildings,\n type: buildingId,\n id: `${Filters.buildings}${buildingId}` as Id,\n title: buildings[buildingId]?.title || 'Корпус'\n });\n }\n }\n\n break;\n case Filters.windowsDirection: {\n if ((filter as WindowsDirectionFilter).value.length) {\n const title = getWindowsDirectionLabel(filter as WindowsDirectionFilter);\n\n tipsCollection.push({\n title,\n id: Filters.windowsDirection\n });\n }\n\n break;\n }\n case Filters.flatsSpecialEvents:\n for (const value of flatsSpecialEventsFilter.value) {\n tipsCollection.push({\n kind: Filters.flatsSpecialEvents,\n type: value,\n id: Filters.flatsSpecialEvents + String(value) as Id,\n title: `Квартиры: ${flatsSpecialEventsLabels[value]}`\n });\n }\n\n break;\n case Filters.otherSpecialEvents:\n for (const value of otherSpecialEventsFilter.value) {\n tipsCollection.push({\n kind: Filters.otherSpecialEvents,\n type: value,\n id: Filters.otherSpecialEvents + String(value) as Id,\n title: `Паркинг, кладовки: ${otherSpecialEventsLabels[value]}`\n });\n }\n\n break;\n case Filters.miscSpecialEvents:\n for (const value of miscSpecialEventsFilter.value) {\n tipsCollection.push({\n kind: Filters.miscSpecialEvents,\n type: value,\n id: Filters.miscSpecialEvents + String(value) as Id,\n title: miscSpecialEventsLabels[value]\n });\n }\n\n break;\n default:\n const label = serializeToTips(filter.id, filter);\n\n if (label) {\n tipsCollection.push({\n id: key,\n kind: key,\n title: label\n } as TipItem);\n }\n }\n }\n\n return {\n tipsCollection,\n bathroomFilter,\n renovationFilter,\n buildingClassFilter,\n parkingFilter,\n wallsTypeFilter,\n infrastructureFilter,\n safetyFilter,\n positionFilter,\n accreditationFilter,\n newBuildingDealFilter,\n paymentTypeFilter,\n livingTenantOptionFilter,\n rentConditionsFilter,\n furnitureFilter,\n sellTypeFilter,\n buildingsFilter,\n authorFilter,\n livingFacilityFilter,\n flatsSpecialEventsFilter,\n otherSpecialEventsFilter,\n miscSpecialEventsFilter,\n buildEpochFilter,\n finishingFilter\n };\n}\n\nexport const OffersSearchTips = ({\n reset,\n loading,\n filters,\n updateFilter,\n removeFilter,\n expandFilter,\n removeGeo,\n customFilterBehavior,\n onUpdateLength = () => {},\n onWhiteBackground = true,\n classNamesNewFilters,\n tipsExpanded,\n openMortgagePaymentSearchModal,\n ...props\n}: IProps) => {\n const [ tipsIndex, setTipsIndex ] = useState(0);\n const [ expandButton, setExpandButton ] = useState(false);\n const [ expandTipsMode, setExpandTipsMode ] = useState(false);\n const {\n tipsCollection,\n bathroomFilter,\n renovationFilter,\n buildingClassFilter,\n parkingFilter,\n wallsTypeFilter,\n infrastructureFilter,\n safetyFilter,\n positionFilter,\n accreditationFilter,\n newBuildingDealFilter,\n paymentTypeFilter,\n livingTenantOptionFilter,\n rentConditionsFilter,\n furnitureFilter,\n sellTypeFilter,\n buildingsFilter,\n authorFilter,\n livingFacilityFilter,\n flatsSpecialEventsFilter,\n otherSpecialEventsFilter,\n miscSpecialEventsFilter,\n buildEpochFilter,\n finishingFilter\n } = props.tips ?? getTipsCollection({\n shouldIgnoreGeoIds: props.shouldIgnoreGeoIds,\n geoStore: props.geoStore,\n filters,\n queryDisplayValues: props.queryDisplayValues\n });\n\n const handleRemoveTip = (tip: TipItem) => {\n if (tip.id === 'geo') {\n removeGeo?.([ tip ]);\n\n return;\n }\n\n switch (tip.kind) {\n case GeoKind.ROUTE:\n removeGeo?.(tip.stations);\n\n break;\n case GeoKind.METRO:\n removeGeo?.([ tip ]);\n\n break;\n\n case 'district-group':\n removeGeo?.(tip.districts);\n break;\n\n case GeoKind.DISTRICT:\n removeGeo?.([ tip ]);\n\n break;\n\n case Filters.livingFacility:\n const { facilities: livingFacilities } = livingFacilityFilter;\n\n const index = livingFacilities.indexOf(tip.type);\n\n if (index > -1) {\n livingFacilities.splice(index, 1);\n }\n\n updateFilter(\n new LivingFacilityFilter(livingFacilities)\n );\n break;\n case Filters.rooms:\n updateFilter(\n new RoomFilter()\n );\n break;\n case Filters.roomsInOffer:\n updateFilter(\n new RoomsInOfferFilter()\n );\n break;\n case Filters.landStatus:\n updateFilter(\n new LandStatusFilter()\n );\n break;\n case Filters.landArea:\n updateFilter(\n new LandAreaFilter()\n );\n break;\n case Filters.supplyOptions:\n updateFilter(\n new SupplyOptionsFilter()\n );\n break;\n case Filters.houseArea:\n updateFilter(\n new HouseAreaFilter()\n );\n break;\n case Filters.bathroomLocation:\n updateFilter(\n new BathroomLocationFilter()\n );\n break;\n case Filters.heating:\n updateFilter(\n new HeatingFilter()\n );\n break;\n case Filters.bathroom:\n updateFilter(\n new BathroomFilter(bathroomFilter.value.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.sellType:\n updateFilter(\n new SellTypeFilter(sellTypeFilter.sellType.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.author:\n updateFilter(new AuthorFilter(authorFilter.author.filter(item => item !== tip.type)));\n\n break;\n\n case Filters.buildEpoch:\n updateFilter(new BuildEpochFilter(buildEpochFilter.buildEpoch?.filter(item => item !== tip.type)) ?? []);\n\n break;\n\n case Filters.balcony:\n updateFilter(new BalconyFilter());\n\n break;\n case Filters.livingTenantOptions:\n updateFilter(\n new LivingTenantOptionFilter(\n livingTenantOptionFilter.livingTenantOptions\n .filter(item => item !== tip.type)\n )\n );\n\n break;\n case Filters.rentConditions: {\n // eslint-disable-next-line max-len\n const utilitiesIncluded = tip.type === 'utilitiesIncluded' ? false : rentConditionsFilter.utilitiesIncluded;\n const depositType = tip.type === 'depositType' ? DepositType.UNKNOWN : rentConditionsFilter.depositType;\n // eslint-disable-next-line max-len\n const commisionType = tip.type === 'commisionType' ? CommissionType.UNKNOWN : rentConditionsFilter.commisionType;\n\n updateFilter(\n new RentConditionsFilter(\n utilitiesIncluded,\n depositType,\n commisionType\n )\n );\n\n break;\n }\n\n case Filters.furniture: {\n updateFilter(\n new FurnitureFilter(\n furnitureFilter.furnitures.filter(item => item !== tip.type)\n )\n );\n break;\n }\n\n case Filters.finishingType: {\n updateFilter(\n new FinishingFilter(\n finishingFilter.finishingType.filter(item => item !== tip.type)\n )\n );\n break;\n }\n\n case Filters.commissioning: {\n updateFilter(new CommissioningFilter(Commissioning.UNKNOWN));\n break;\n }\n\n case Filters.renovation:\n updateFilter(\n new RenovationFilter(renovationFilter.value.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.developer:\n if (customFilterBehavior && customFilterBehavior.developer) {\n customFilterBehavior.developer.reset();\n } else {\n updateFilter(new DeveloperFilter());\n }\n\n break;\n case Filters.buildingClass:\n updateFilter(\n new BuildingClassFilter(buildingClassFilter.buildingClass.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.parkings:\n updateFilter(\n new ParkingFilter(parkingFilter.parkings.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.walls:\n updateFilter(\n new WallsTypeFilter(wallsTypeFilter.walls.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.infrastructure: {\n const newFilter = tip?.id === Filters.hasLift ?\n new InfrastructureFilter(infrastructureFilter.infrastructure) :\n new InfrastructureFilter(infrastructureFilter.infrastructure.filter(item => item !== tip.type), infrastructureFilter.hasLift);\n\n updateFilter(newFilter);\n\n break;\n }\n case Filters.safety:\n updateFilter(\n new SafetyFilter(safetyFilter.safety.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.position:\n updateFilter(\n new PositionFilter(positionFilter.position.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.accreditation:\n updateFilter(\n new AccreditationFilter(accreditationFilter.accreditation.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.newBuildingDeal:\n updateFilter(\n new NewBuildingDealFilter(newBuildingDealFilter.deal.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.paymentType:\n updateFilter(\n new PaymentTypeFilter(paymentTypeFilter.type.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.closedSales:\n updateFilter(\n new ClosedSalesFilter()\n );\n\n break;\n case Filters.buildings: {\n updateFilter(\n new BuildingsFilter(\n buildingsFilter.buildings.filter(item => item !== tip.type)\n )\n );\n\n break;\n }\n case Filters.flatsSpecialEvents:\n updateFilter(\n new FlatsSpecialEventsFilter(flatsSpecialEventsFilter.value.filter(item => item !== tip.type))\n );\n\n break;\n case Filters.otherSpecialEvents: {\n updateFilter(\n new OtherSpecialEventsFilter(otherSpecialEventsFilter.value.filter(item => item !== tip.type))\n );\n\n break;\n }\n case Filters.miscSpecialEvents: {\n updateFilter(\n new MiscSpecialEventsFilter(miscSpecialEventsFilter.value.filter(item => item !== tip.type))\n );\n\n break;\n }\n default:\n removeFilter(filters.get(Filters[tip.id]));\n }\n };\n const expandTipsToggle = () => {\n setExpandTipsMode(prev => ! prev);\n };\n const getTipsIndexInfo = () => {\n const container = document.getElementsByClassName(TIP_CLASS); // eslint-disable-line\n const result = {\n index: 0,\n size: container.length,\n state: false,\n line: 0,\n arr: []\n };\n let position = 0;\n\n for (let i = 0; i < container.length; i++) {\n const x: number = container[i].getBoundingClientRect().left;\n\n if (x < position) {\n result.index = i;\n result.state = true;\n break;\n }\n result.line++;\n position = x;\n }\n\n return result;\n };\n\n useEffect(() => {\n const info = getTipsIndexInfo();\n\n setTipsIndex(info.line);\n if (info.state) {\n setExpandButton(true);\n } else {\n setExpandButton(false);\n setExpandTipsMode(false);\n }\n\n const value = tipsCollection.length - tipsIndex;\n\n if (value < 0) {\n setExpandTipsMode(false);\n }\n }, [ tipsCollection, expandButton, tipsIndex ]);\n\n useEffect(() => {\n if (tipsExpanded === false) setExpandTipsMode(false);\n }, [ tipsExpanded ]);\n\n useEffect(() => {\n onUpdateLength(tipsCollection.length);\n }, [ tipsCollection.length, onUpdateLength ]);\n\n useEffect(() => {\n expandFilter && expandFilter(expandTipsMode);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ expandTipsMode ]);\n\n return (\n <Fragment>\n {\n (expandTipsMode) ? (\n <div className={cn('all-tips', undefined, classNamesNewFilters?.allTips)}>\n <FiltersFormTips>\n {\n tipsCollection.map((tip, index) => (<Tip\n enabled={! loading}\n key={index + '_' + tip.id}\n tip={tip}\n removeTip={handleRemoveTip}\n onWhiteBackground={onWhiteBackground}\n openMortgagePaymentSearchModal={openMortgagePaymentSearchModal}\n />))\n }\n </FiltersFormTips>\n </div>\n ) : null\n }\n {\n (! expandTipsMode) ? (\n <div className={cn('first-line-tips-only', undefined, classNamesNewFilters?.firstLineTipsOnly)}>\n <FiltersFormTips>\n {\n tipsCollection.map((tip, index) => (<Tip\n enabled={! loading}\n key={index + '_' + tip.id}\n tip={tip}\n removeTip={handleRemoveTip}\n onWhiteBackground={onWhiteBackground}\n openMortgagePaymentSearchModal={openMortgagePaymentSearchModal}\n />))\n }\n </FiltersFormTips>\n </div>\n ) : null\n }\n <div\n className={cn('tipButtons', undefined, classNamesNewFilters?.tipsButtons)}\n data-test='filter-tipButtons'\n >\n {\n reset && tipsCollection.length >= MIN_TIPS_COUNT ? (\n <TipButton\n onClick={reset}\n className={cn('resetTipButton', { hiddenExpandButton: ! expandButton })}\n type='discard'\n onWhiteBackground={onWhiteBackground}\n >\n <Typography\n variant='secondary-alone'\n className={cn('resetButton')}\n >\n Сбросить\n </Typography>\n </TipButton>\n ) : null\n }\n {\n expandButton ? (\n <TipButton\n onClick={expandTipsToggle}\n type='expand'\n onWhiteBackground={onWhiteBackground}\n >\n <Typography\n variant='secondary-alone'\n className={cnButton('more')}\n >\n {`Ещё ${\n tipsCollection.length - tipsIndex > 0 ?\n tipsCollection.length - tipsIndex :\n ''\n } `}\n <Icon\n name={expandTipsMode ? 'chevron-up' : 'chevron-down'}\n size='s'\n />\n </Typography>\n </TipButton>\n ) : null\n }\n </div>\n </Fragment>\n );\n};\n\nfunction TipButton({\n onClick,\n children,\n type,\n onWhiteBackground: onWhite,\n className\n}: {\n onClick: () => void;\n children: React.ReactChild;\n type: string;\n onWhiteBackground: boolean;\n className?: string;\n}) {\n return (\n <button\n className={cnButton(type, { onWhite }, className)}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n","import {\n FloorConstraints,\n TimeLimit,\n TransportType as TransportTypeEnum,\n BalconyOptions as BalconyOptionsEnum,\n Bathroom as BathroomEnum,\n Renovation as RenovationEnum,\n CeilingHeight as CeilingHeightEnum\n} from '@search/filter-enums/enums';\n\nimport {\n BuildingClass,\n ParkingType,\n IsApartmentsOptions,\n WallsType,\n InfrastructureOptions,\n Safety,\n NewBuildingDeal,\n PaymentType,\n Accreditation,\n Position,\n SellType,\n AuthorTypeOptionsWithRealtor,\n FlatsSpecialEvent,\n OtherSpecialEvent,\n MiscSpecialEvent,\n BuildEpoch\n} from '@search/filter-enums/enums';\n\nexport const ceilingHeightLabels: Record<CeilingHeightEnum, string | null> = {\n [CeilingHeightEnum.UNKNOWN]: null,\n [CeilingHeightEnum.FROM_2_5]: 'Высота потолков от 2,5 м',\n [CeilingHeightEnum.FROM_2_7]: 'Высота потолков от 2,7 м',\n [CeilingHeightEnum.FROM_3]: 'Высота потолков от 3 м',\n [CeilingHeightEnum.FROM_4]: 'Высота потолков от 4 м'\n};\n\nexport const renovationLabels: Record<RenovationEnum, string | null> = {\n [RenovationEnum.UNKNOWN]: null,\n [RenovationEnum.EURO]: 'Евроремонт',\n [RenovationEnum.COSMETIC]: 'Косметический ремонт',\n [RenovationEnum.DESIGNED]: 'Дизайнерский ремонт',\n [RenovationEnum.NEED]: 'Нужен ремонт',\n [RenovationEnum.NONE]: 'Без ремонта'\n};\n\nexport const bathroomLabels: Record<BathroomEnum, string | null> = {\n [BathroomEnum.UNKNOWN]: null,\n [BathroomEnum.COMBINED]: 'Совмещённый санузел',\n [BathroomEnum.PARTED]: 'Раздельный санузел',\n [BathroomEnum.SEVERAL]: 'Несколько санузлов'\n};\n\nexport const balconyLabels: Record<BalconyOptionsEnum, string | null> = {\n [BalconyOptionsEnum.UNKNOWN]: null,\n [BalconyOptionsEnum.HAS_ANY]: 'Балкон/Лоджия'\n};\n\nexport const floorConstraintsLabels: Record<FloorConstraints, string | null> = {\n [FloorConstraints.UNKNOWN]: null,\n [FloorConstraints.ONLY]: 'Только',\n [FloorConstraints.EXCLUDE]: 'Не'\n};\n\nexport const timeLimitLabel: Record<TimeLimit, string | null> = {\n [TimeLimit.UNKNOWN]: null,\n [TimeLimit.MAX_5_MINUTES]: '5',\n [TimeLimit.MAX_10_MINUTES]: '10',\n [TimeLimit.MAX_15_MINUTES]: '15',\n [TimeLimit.MAX_20_MINUTES]: '20',\n [TimeLimit.MAX_25_MINUTES]: '25',\n [TimeLimit.MAX_30_MINUTES]: '30',\n [TimeLimit.MAX_40_MINUTES]: '40',\n [TimeLimit.MAX_50_MINUTES]: '50',\n [TimeLimit.MAX_60_MINUTES]: '60'\n};\n\nexport const transportTypeLabel: Record<TransportTypeEnum, string | null> = {\n [TransportTypeEnum.UNKNOWN]: null,\n [TransportTypeEnum.PUBLIC_TRANSPORT]: 'на\\u00A0транспорте',\n [TransportTypeEnum.FOOT]: 'пешком'\n};\n\nexport const buildingClassLabels: Record<BuildingClass, string> = {\n [BuildingClass.ECONOMY]: 'Эконом',\n [BuildingClass.COMFORT]: 'Комфорт',\n [BuildingClass.COMFORT_PLUS]: 'Комфорт+',\n [BuildingClass.BUSINESS]: 'Бизнес',\n [BuildingClass.ELITE]: 'Элитный'\n};\n\nexport const parkingLabels: Record<ParkingType, string | null> = {\n [ParkingType.UNKNOWN]: null,\n [ParkingType.CLOSED]: 'Закрытая парковка',\n [ParkingType.UNDERGROUND]: 'Подземная парковка',\n [ParkingType.OPEN]: 'Открытая парковка'\n};\n\nexport const wallsLabels: Record<WallsType, string | null> = {\n [WallsType.UNKNOWN]: null,\n [WallsType.MONOLITH]: 'монолит',\n [WallsType.PANEL]: 'панель',\n [WallsType.BRICK]: 'кирпич',\n [WallsType.BRICK_MONOLITH]: 'кирпич-монолит',\n [WallsType.BLOCK]: 'блок',\n [WallsType.WOOD]: 'дерево'\n};\n\nexport const apartmentsLabels: Record<IsApartmentsOptions, string | null> = {\n [IsApartmentsOptions.UNKNOWN]: null,\n [IsApartmentsOptions.APARTMENTS_ONLY]: 'Апартаменты',\n [IsApartmentsOptions.NO_APARTMENTS]: 'Без апартаментов'\n};\n\nexport const infrastructureLabels: Record<InfrastructureOptions, string | null> = {\n [InfrastructureOptions.UNKNOWN]: null,\n [InfrastructureOptions.CONCIERGE]: 'Консьерж',\n [InfrastructureOptions.CLOSED_AREA]: 'Закрытая территория'\n};\n\nexport const safetyLabels: Record<Safety, string> = {\n [Safety.CONCIERGE]: 'Консьерж',\n [Safety.CLOSED_AREA]: 'Закрытая территория',\n [Safety.GUARDED_AREA]: 'Охрана'\n};\n\nexport const positionLabels: Record<Position, string> = {\n [Position.STANDALONE]: 'Одиночное здание'\n};\n\nexport const accreditationLabels: Record<Accreditation, string> = {\n [Accreditation.ACCREDITED_BY_VTB]: 'Аккредитовано ВТБ'\n};\n\nexport const newBuildingDealLabels: Record<NewBuildingDeal, string> = {\n [NewBuildingDeal.LAW_214]: '214 ФЗ',\n [NewBuildingDeal.ESCROW]: 'Эскроу-счета'\n};\n\nexport const paymentTypeLabels: Record<PaymentType, string> = {\n [PaymentType.ARMY_MORTGAGE]: 'Военная ипотека',\n [PaymentType.INSTALLMENT]: 'Рассрочка',\n [PaymentType.MOTHER_CAPITAL]: 'Материнский капитал'\n};\n\nexport const authorLabels = {\n [AuthorTypeOptionsWithRealtor.UNKNOWN]: null,\n [AuthorTypeOptionsWithRealtor.OWNER]: 'Собственник',\n [AuthorTypeOptionsWithRealtor.DEVELOPER]: 'Застройщик',\n [AuthorTypeOptionsWithRealtor.AGENCY]: 'Агентство',\n [AuthorTypeOptionsWithRealtor.PARTNER]: 'Офф. Партнёр',\n [AuthorTypeOptionsWithRealtor.REALTOR]: 'Мои объявления',\n [AuthorTypeOptionsWithRealtor.PIT]: 'Имущественные торги'\n};\n\nexport const saleTypeLabels = {\n [SellType.UNKNOWN]: null,\n [SellType.SECONDARY]: 'Прямая продажа',\n [SellType.ALTERNATIVE]: 'Альтернативная продажа',\n [SellType.PRIMARY]: 'От застройщика',\n [SellType.SECONDARY_PRIMARY]: 'Прямая продажа',\n [SellType.PRIMARY_REASSIGNMENT]: 'Переуступка'\n};\n\nexport const flatsSpecialEventsLabels: Record<FlatsSpecialEvent, string> = {\n [FlatsSpecialEvent.FLAT_DISCOUNT]: 'скидка',\n [FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN]: 'рассрочка',\n [FlatsSpecialEvent.FLAT_SALES_START]: 'старт продаж'\n};\n\nexport const otherSpecialEventsLabels: Record<OtherSpecialEvent, string> = {\n [OtherSpecialEvent.OTHER_DISCOUNT]: 'скидка',\n [OtherSpecialEvent.OTHER_INSTALLMENT_PLAN]: 'рассрочка',\n [OtherSpecialEvent.OTHER_SALES_START]: 'старт продаж'\n};\n\nexport const miscSpecialEventsLabels: Record<MiscSpecialEvent, string> = {\n [MiscSpecialEvent.PROMO]: 'Акция',\n [MiscSpecialEvent.GIFT]: 'Подарок'\n};\n\nexport const buildEpochLabels: Record<BuildEpoch, string | null> = {\n [BuildEpoch.UNKNOWN]: null,\n [BuildEpoch.STALIN]: 'Сталинка',\n [BuildEpoch.BREZHNEV]: 'Брежневка',\n [BuildEpoch.KHRUSHCHEV]: 'Хрущевка'\n};\n","import React, { useMemo } from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cnBreadcrumb = classname.bind(null, 'Breadcrumb');\n\nexport interface BreadcrumbSection {\n /** Уникальный ключ */\n key?: string;\n /** Контент в отображении */\n content: React.ReactNode;\n /** Ссылка ведущая к секции */\n href: string;\n /** свойство target у тега a\n * @default \"_self\"\n */\n target?: '_blank' | '_self' | '_parent' | '_top';\n /** Активная секция\n * @default \"false\"\n */\n active?: boolean;\n /** Контент в отображении, может быть с иконками/смайлами */\n contentSeo?: React.ReactNode;\n}\n\nexport default function Breadcrumb(\n {\n allClickable = false,\n sections,\n onClick,\n regionModalSelect,\n className: classNameProp,\n withoutSeoMarkup = false\n }: {\n allClickable?: boolean;\n regionModalSelect?: boolean;\n sections: readonly BreadcrumbSection[];\n onClick?(\n event: React.MouseEvent<HTMLAnchorElement>,\n href: string,\n section: BreadcrumbSection\n ): void;\n className?: string;\n withoutSeoMarkup?: boolean;\n }\n) {\n const schema = useMemo(() => {\n return {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@context': 'https://schema.org',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@type': 'BreadcrumbList',\n itemListElement: sections.map((section, idx) => ({\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@type': 'ListItem',\n position: idx + 1,\n item: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '@id': section.href,\n name: section.contentSeo ?? section.content\n }\n }))\n };\n }, [ sections ]);\n\n return (<>\n <script\n type='application/ld+json'\n dangerouslySetInnerHTML={! withoutSeoMarkup ? {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n __html: JSON.stringify(schema)\n } : undefined}\n />\n <ol className={cnBreadcrumb(null, { regionModalSelect }, classNameProp)}>\n {sections.map((section, index) => {\n const isLastElement = allClickable ? false : index === sections.length - 1;\n const {\n content: text,\n href,\n key = href ?? index,\n target = '_self'\n } = section;\n\n return (\n <React.Fragment key={key}>\n {index > 0 ?\n <li\n aria-hidden='true'\n className={cnBreadcrumb('section', { separator: true })}\n >\n {'›'}\n </li> :\n null\n }\n {isLastElement ? (\n <li\n className={cnBreadcrumb('section', { active: true })}\n >\n <span className={cnBreadcrumb('anchor', { active: true })}>\n <Typography\n variant='small'\n className={cnBreadcrumb('text')}\n >{text}</Typography>\n </span>\n </li>\n ) : (\n <li className={cnBreadcrumb('section')}>\n <a\n className={cnBreadcrumb('anchor')}\n target={target}\n href={href}\n onClick={e => onClick?.(e, href, section)}\n >\n <Typography\n variant='small'\n className={cnBreadcrumb('text')}\n >{text}</Typography>\n </a>\n </li>\n )}\n </React.Fragment>\n );\n })}\n </ol>\n </>);\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, {\n useRef,\n FunctionComponent,\n useLayoutEffect,\n createContext,\n useState,\n useContext,\n useCallback,\n memo,\n ReactNode,\n useMemo\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport classname from '@search/classname/src';\n\nimport './Modal.css';\nimport Paper, { BorderRadius } from '../Paper';\nimport { SizeEnum } from '../../types';\n\nexport enum ModalSize {\n FULL_M = 'full_m',\n FULL_S = 'full_s',\n FULL_L = 'full_l',\n S = 's',\n M = 'm',\n XL = 'xl',\n L = 'l',\n}\n\nexport interface ModalProps extends React.HTMLAttributes<HTMLElement> {\n coverRef?: React.LegacyRef<HTMLDivElement> | null;\n\n alignLeft?: boolean;\n\n /**\n * Сработает при нажатии на кнопку закрытия, по клику на пространство вне модалки, по нажатию esc\n */\n onRequestClose?: (closedBy: ModalClosedBy) => void;\n\n /**\n * Показывать кнопку закрытия\n * @default true\n */\n showCloseButton?: boolean;\n height?: ModalSize;\n fullScreen?: boolean;\n width?: ModalSize;\n /**\n * Переводить ли фокус на последний интерактивный элемент в модалке после ее появления\n * @default false\n */\n focusLast?: boolean;\n\n /**\n * Размер модалки по горизонтали\n * MarginSize задает размер отступов от верха и низа видимой части окна\n *\n * @default SizeEnum.M\n **/\n size?: ModalSize;\n\n /**\n * Размер радиуса бордера. none - 0px, m - 4px, l - 8px\n * @default SizeEnum.L\n */\n borderRadius?: BorderRadius.none | SizeEnum.M | SizeEnum.L | 'none';\n\n children?: ReactNode;\n\n contentClassName?: string;\n\n dataTest?: string;\n\n withScroll?: boolean;\n\n withoutScroll?: boolean;\n\n /**\n * Размер иконки закрытия\n * @default { widht: 18, height: 18 }\n */\n closeIconSize?: { width: number; height: number };\n\n stylesCloseIcon?: React.CSSProperties;\n\n /**\n * Убрать белый паддинг у Modal__body элемента\n * @default false\n */\n withoutBodyPadding?: boolean;\n\n /**\n * Фикс для небольшого отступа снизу из-за табличных стилей.\n * Встречался в панораме, при выключении padding у элемента Modal__body (withoutBodyPadding)\n * @default false\n */\n offTableCSS?: boolean;\n\n /**\n * Включает z-index = 10001, чтобы стать выше, чем фуллскрин режим Я.Карт\n * @default false\n */\n hugePriorityZIndexEnabled?: boolean;\n\n /**\n * Включает актуальное значение z-index из uikit для модального окна --l-modal (1050)\n */\n uikitZIndexEnabled?: boolean;\n}\n\nexport const cnModal = classname.bind(null, 'Modal');\n\nexport enum ModalClosedBy {\n ClickOutside = 'ClickOutside',\n CloseButton = 'CloseButton',\n Esc = 'Esc'\n}\n\n// const overflowClass = 'Modal__overflow';\n\n// lock body scroll hook\nexport function useLockBodyScroll() {\n useLayoutEffect(() => {\n if (! window || ! document) return;\n\n const body = document.body;\n const originalOverflowX = body.style.overflowX;\n const originalOverflowY = body.style.overflowY;\n\n // Удалить, после перехода на общий body scroll lock.\n // https://gitlab.m2.ru/vtblife/frontend/root/-/blob/master/src/common-modules/layout-components/header/header.tsx\n const handler = setInterval(() => {\n if (body.style.overflowY === 'initial') {\n body.style.overflowY = 'hidden';\n }\n }, 500);\n\n body.style.overflowX = 'hidden';\n body.style.overflowY = 'hidden';\n\n return () => {\n clearInterval(handler);\n body.style.overflowX = originalOverflowX;\n body.style.overflowY = originalOverflowY;\n };\n }, [ ]);\n}\n\n/*\n * Modal dialog\n *\n * @example Simple demo\n *\n * ```tsx\n * function ModalDemoSimple() {\n * const modal = useModal()\n *\n * return <div>\n * {modal.visible\n * ? null\n * : <button onClick={modal.on}>Show modal</button>\n * }\n * {modal.visible ? <Modal onRequestClose={modal.off}>Modal Text</Modal> : null}\n * </div>\n * }\n * ```\n *\n * @example Contexted demo\n *\n * ```tsx\n * // ModalDemoContextedRoot.tsx\n * function ModalDemoContextedRoot() {\n *\n * return <ModalProvider>\n * <ModalDemoContextedFirst/>\n * </ModalProvider>\n * }\n *\n * // ModalDemoContextedFirst.tsx\n * function ModalDemoContextedFirst() {\n * const modal = createModal(() => (\n * <Modal onRequestClose={modal.hide}>\n * Controlled modal: <button onClick={modal.hide}>Close</button>\n * </Modal>\n * ))\n * return <div>\n * <button onClick={modal.hide}>Show modal</button>\n * </div>\n * }\n * ```\n *\n * @see https://assortment.io/posts/accessible-modal-component-react-portals-part-1\n * @see https://gist.github.com/danethurber/a586dbc9097e2e5696719c390a00c683\n * @see https://github.com/mpontus/react-modal-hook\n */\nexport const Modal = ({\n coverRef = null,\n contentClassName,\n className,\n size = ModalSize.M,\n alignLeft = false,\n height,\n width,\n fullScreen = false,\n borderRadius = SizeEnum.L,\n showCloseButton,\n onRequestClose,\n children,\n dataTest,\n withScroll = false,\n withoutScroll = false,\n withoutBodyPadding = false,\n offTableCSS = false,\n closeIconSize = { width: 18, height: 18 },\n stylesCloseIcon,\n onScroll: handleScroll,\n title,\n hugePriorityZIndexEnabled,\n uikitZIndexEnabled\n}: ModalProps) => {\n const asideRef = useRef<HTMLDivElement>(null);\n const ref = useRef<HTMLDivElement>(null);\n\n // @todo Переделать https://jira.cloud.vtblife.ru/browse/RS-463\n // useFocusLock(focusLast ? ref : undefined);\n useLockBodyScroll();\n // useKeyUp('Escape', onRequestClose);\n // useOnClickOutside(ref, onRequestClose);\n\n const onCloseButton = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n if (onRequestClose) e.preventDefault();\n\n onRequestClose?.(ModalClosedBy.CloseButton);\n }, [ onRequestClose ]);\n\n const clickOnAside = (e: React.SyntheticEvent) => {\n if (e.target !== asideRef.current) return;\n if (onRequestClose) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onRequestClose?.(ModalClosedBy.ClickOutside);\n };\n\n const sizeClass = (height && width) ? { width, height } : { size };\n\n return createPortal(\n <div\n ref={coverRef}\n onScroll={handleScroll}\n className={cnModal('cover', {\n 'with-scroll': withScroll,\n 'without-scroll': withoutScroll,\n 'max-z-index': hugePriorityZIndexEnabled,\n 'uikit-z-index': uikitZIndexEnabled\n })}\n >\n <div className={cnModal('table', { offTableCSS })}>\n <div className={cnModal('cell', { ...sizeClass, offTableCSS })} onClick={clickOnAside} ref={asideRef}>\n <Paper\n className={cnModal('content', {\n ...sizeClass,\n withoutBodyPadding\n }, contentClassName)}\n borderRadius={borderRadius}\n ref={ref}\n >\n {showCloseButton ? <button\n data-test={dataTest ? `${dataTest}-close` : undefined}\n className={cnModal('close')}\n onClick={onCloseButton}\n style={stylesCloseIcon}\n >\n <span className='u-hide-visually'>Close</span>\n <svg className={cnModal('icon')} {...closeIconSize} fill='none' viewBox='0 0 18 18'>\n <path\n stroke='#1B2233'\n strokeOpacity='0.92'\n strokeWidth='1.5'\n d='M1 1.00001L17 17M17 1L1 17'\n />\n </svg>\n </button> :\n null}\n <div className={cnModal(\n 'body',\n { full: fullScreen, alignLeft, withoutBodyPadding },\n className\n )}>\n {title ? <div className={cnModal('title')}>{title}</div> : null}\n {children}\n </div>\n </Paper>\n </div>\n </div>\n </div>\n ,\n document.body\n );\n};\n\nexport const useModal = (visibleDefault = false) => {\n const [ visible, setVisible ] = useState(visibleDefault);\n\n return {\n visible,\n on: useCallback(() => setVisible(true), []),\n off: useCallback(() => setVisible(false), []),\n setVisible\n };\n};\n\nconst ModalContext = createContext({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n show: (modal: React.ReactNode) => {},\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hide: (modal: React.ReactNode) => {}\n});\n\nconst ModalRenderer = memo(({ component }: {component: () => ReactNode}) => <>{component()}</>);\n\nlet componentId = 0;\n\nexport function createModal(createFn: () => React.ReactNode) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const id = useMemo(() => String(++componentId), []);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const component = useMemo(() => <ModalRenderer key={id} component={createFn} />, [ createFn, id ]);\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const context = useContext(ModalContext);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMemo(() => ({\n show: () => context.show(component),\n hide: () => context.hide(component)\n }), [ context, component ]);\n}\n\nexport const ModalProvider: FunctionComponent<{children: React.ReactNode}> = ({ children }) => {\n const [ modals, setModals ] = useState(new Set<React.ReactNode>());\n\n const show = useCallback((modal: React.ReactNode) => {\n if (modals.has(modal)) return;\n modals.add(modal);\n\n setModals(new Set(modals));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const hide = useCallback((modal: React.ReactNode) => {\n modals.delete(modal);\n setModals(new Set(modals));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const context = useMemo(() => ({ show, hide }), []);\n\n return (<ModalContext.Provider value={context}>\n {children}\n <>{Array.from(modals)}</>\n </ModalContext.Provider>);\n};\n","import React, { Ref, HTMLAttributes, forwardRef } from 'react';\nimport cn from '@search/classname/src';\nimport './styles.css';\nimport { SizeEnum } from '../../types';\n\nconst cnPaper = cn.bind(null, 'Paper');\n\nexport interface IPaperProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Высота в Z-координаты компонента для визаулизации тени\n * @default \"s\"\n **/\n elevation?: 's' | 'm' | 'l' | 'xl' | 'xxl';\n /**\n * Цвет тени\n * @default \"gray\"\n **/\n shadowСolor?: 'gray' | 'green' | 'red' | 'blue';\n /**\n * Свойство обнуляет border-radius\n * @deprecated use borderRadius: BorderRadius.none\n * @default false\n **/\n square?: boolean;\n\n /**\n * Размер радиуса бордера.\n * @default SizeEnum.M\n */\n borderRadius?: BorderRadius.none | SizeEnum.M | SizeEnum.L | 'none';\n\n dataTest?: string;\n\n id?: string;\n}\n\nexport enum BorderRadius {\n none = 'none'\n}\n\n/**\n * @todo forwardRef is not supported in storybook without export const: https://github.com/storybookjs/storybook/issues/7933\n */\nexport const Paper = forwardRef(({\n elevation = 's',\n shadowСolor = 'gray',\n square = false,\n className,\n dataTest,\n borderRadius = SizeEnum.M,\n ...rest\n}: IPaperProps, ref: Ref<HTMLDivElement>) => {\n const mods = `${shadowСolor}_${elevation}`;\n\n return (\n <div\n {...rest}\n data-test={dataTest}\n ref={ref}\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n className={cnPaper(null, { elevation: mods, square, 'border-radius': borderRadius }, className)}\n />\n );\n});\n\nexport default Paper;\n","import React, {\n Fragment,\n useCallback,\n MouseEvent,\n RefObject,\n ReactNode,\n HTMLAttributes,\n DetailedHTMLFactory\n} from 'react';\nimport classname from '@search/classname/src';\nimport useControl from '@search/hooks/src/useControl';\n\nimport {\n Tone,\n Size,\n View,\n Width,\n ToneEnum,\n SizeEnum,\n ViewEnum,\n Height\n} from '../../../types';\n\nimport './Button.css';\nimport './ButtonSize/ButtonSize.css';\n\nexport type ContainerElement =\n | HTMLButtonElement\n | HTMLLinkElement;\n\ntype ReactButtonElement =\n DetailedHTMLFactory<HTMLAttributes<ContainerElement>, ContainerElement>;\n\n// @ts-ignore\nexport interface IButtonProps extends HTMLAttributes<ContainerElement> {\n /**\n * Тип кнопки.\n * @default 'button'\n */\n type?: 'submit' | 'link' | 'button' | 'rest';\n\n /**\n * Кнопка отключена | включена\n */\n disabled?: boolean;\n\n /**\n * Кнопка в фокусе\n */\n focused?: boolean;\n\n /**\n * Сотсояние натажтия\n */\n pressed?: boolean;\n\n /**\n * Зажатость кнопки (используется в CheckboxGroup)\n */\n checked?: boolean;\n\n /**\n * Ширина кнопки\n */\n width?: Width;\n\n height?: Height;\n\n /**\n * Размер кнопки\n */\n size?: Size;\n\n /**\n * Заглавная первая буква\n */\n capitalize?: boolean;\n\n /**\n * Вид кнопки\n */\n view?: View | 'filter';\n\n /**\n * Тон кнопки (цвет)\n */\n tone?: Tone;\n\n /**\n * Дополнительный контент после `children`.\n */\n contentAfter?: ReactNode;\n\n /**\n * Дополнительный контент перед `children`.\n */\n contentBefore?: ReactNode;\n\n /**\n * Иконка слева.\n */\n iconLeft?: ReactNode;\n\n /**\n * Иконка справа.\n */\n iconRight?: ReactNode;\n\n /**\n * Ссылка на рутовый DOM элемент компонента.\n */\n innerRef?: RefObject<ContainerElement>;\n\n square?: boolean;\n\n /**\n * Предотвращаем событие по умолчанию\n */\n prevent?: boolean;\n\n onClick?: (e: MouseEvent<ContainerElement>, state?: object) => void;\n\n href?: string;\n\n target?: string;\n\n name?: string;\n}\n\nconst cnButton = classname.bind(null, 'Button');\n\nconst Button: React.FunctionComponent<IButtonProps> = ({\n type = 'button',\n width,\n height,\n checked,\n className,\n onBlur,\n onFocus,\n onMouseDown,\n onMouseUp,\n innerRef,\n children = false,\n pressed = false,\n focused = false,\n disabled = false,\n capitalize = false,\n iconLeft,\n iconRight,\n contentBefore,\n contentAfter,\n size = SizeEnum.S,\n tone = ToneEnum.SECONDARY,\n view = ViewEnum.PRIMARY,\n square = false,\n prevent,\n ...props\n}) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const TagName = (type === 'link' ? 'a' : 'button' as any) as ReactButtonElement;\n const [ buttonState, controlHandlers ] = useControl({ disabled, focused, pressed }, {\n onBlur,\n onFocus,\n onMouseUp,\n onMouseDown\n }, { disabled, focused });\n const handleClick = useCallback((event: React.MouseEvent<ContainerElement>) => {\n if (! disabled) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (prevent) {\n event.preventDefault();\n }\n\n // @ts-ignore\n // eslint-disable-next-line\n props.onClick && props.onClick(event, { ...buttonState, ...props });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ props.onClick, disabled ]);\n\n return (\n // @ts-ignore\n <TagName\n {...props}\n // @ts-ignore\n type={type}\n ref={innerRef}\n role={props.role}\n onClick={handleClick}\n disabled={buttonState.disabled}\n onBlur={controlHandlers.handleBlur}\n onFocus={controlHandlers.handleFocus}\n onMouseUp={controlHandlers.handleMouseUp}\n onMouseDown={controlHandlers.handleMouseDown}\n onMouseLeave={controlHandlers.handleMouseLeave}\n onMouseEnter={controlHandlers.handleMouseEnter}\n className={cnButton(null, { ...buttonState, size, view, tone, width, height, checked, square }, className)}>\n <Fragment>\n {contentBefore}\n {iconLeft}\n {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n children ?\n <span className={cnButton('text', { capitalize })}>\n {children}\n </span> : null\n }\n {iconRight}\n {contentAfter}\n </Fragment>\n </TagName>\n );\n};\n\nexport default Button;\n","import React, { RefObject, InputHTMLAttributes } from 'react';\n\nimport { cnCheckbox } from '../';\n\nimport './styles.css';\n\nexport interface ICheckboxControlProps extends InputHTMLAttributes<HTMLInputElement> {\n /**\n * Ссылка на DOM элемент нативного инпута.\n */\n controlRef?: RefObject<HTMLInputElement>;\n}\n\nexport const CheckboxControl: React.FunctionComponent<ICheckboxControlProps> = ({ controlRef, className, ...props }) =>\n <input\n {...props}\n ref={controlRef}\n type='checkbox'\n name={props.name}\n value={props.value}\n onChange={props.onChange}\n className={cnCheckbox('control', {}, className)} />;\n","import React, { RefObject, useCallback } from 'react';\n\nimport classname from '@search/classname/src';\nimport useControl from '@search/hooks/src/useControl';\nimport Button from '../Button';\nimport {\n Size,\n View,\n Tone,\n SizeEnum,\n ViewEnum,\n ToneEnum,\n Maybe\n} from '../../../types';\n\nimport { ICheckboxControlProps, CheckboxControl } from './CheckboxControl/CheckboxControl';\n\nimport './Checkbox.css';\n\nexport type CheckboxControlProps = Omit<ICheckboxControlProps, 'size'>;\n\nexport interface ICheckboxProps extends CheckboxControlProps {\n /**\n * Ссылка на корневой DOM-элемент компонента.\n */\n innerRef?: RefObject<HTMLLabelElement>;\n\n /**\n * Ссылка на DOM элемент нативного инпута.\n */\n controlRef?: RefObject<HTMLInputElement>;\n\n /**\n * Вид элемента\n */\n view?: View;\n\n /**\n * Цветовое решение\n */\n tone?: Tone;\n\n /**\n * Размер контрола\n */\n size?: Size;\n\n /**\n * Состояние переключателя: включен или выключен\n */\n checked?: boolean;\n\n /**\n * Тип отображения\n */\n type?: 'button' | 'checkbox';\n\n square?: boolean;\n\n onCheck?: (\n checked: boolean,\n props: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>;\n }) => void;\n}\n\nexport const cnCheckbox = classname.bind(null, 'Checkbox');\n\nconst Checkbox = ({\n name,\n type,\n square = false,\n className,\n value = '',\n innerRef,\n checked = false,\n disabled = false,\n autoComplete = 'off',\n size = SizeEnum.S,\n view = ViewEnum.PRIMARY,\n tone = ToneEnum.PRIMARY,\n ...props\n}: ICheckboxProps): React.ReactElement => {\n const [ buttonState, controlHandlers ] = useControl({ disabled, focused: false }, props, { disabled });\n\n const handleChange = useCallback(() => {\n if (disabled) {\n return;\n }\n\n // eslint-disable-next-line\n props.onCheck && props.onCheck(! checked, { name, value });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ name, value, disabled, checked, props.onCheck ]);\n\n const handleButtonClick = useCallback(() => {\n // eslint-disable-next-line\n props.onCheck && props.onCheck(! checked, { name, value });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ name, value, disabled, checked, props.onCheck ]);\n\n if (type === 'button') {\n return (\n <label\n ref={innerRef}\n className={cnCheckbox(null, { ...buttonState, checked, tone, size, view, type }, className)}>\n {checked &&\n // eslint-disable-next-line\n <input type='hidden' name={name} value={value} disabled={disabled}/>\n }\n <Button\n type='button'\n width='max'\n name={name}\n size={size}\n view={view}\n tone={tone}\n square={square}\n disabled={disabled}\n checked={checked}\n onFocus={controlHandlers.handleFocus}\n onMouseUp={controlHandlers.handleMouseUp}\n onMouseDown={controlHandlers.handleMouseDown}\n onMouseLeave={controlHandlers.handleMouseLeave}\n onMouseEnter={controlHandlers.handleMouseEnter}\n onClick={handleButtonClick}>\n {props.children}\n </Button>\n </label>\n\n );\n }\n\n return (\n <label\n htmlFor={name}\n ref={innerRef}\n onMouseUp={controlHandlers.handleMouseUp}\n onMouseDown={controlHandlers.handleMouseDown}\n onMouseEnter={controlHandlers.handleMouseEnter}\n onMouseLeave={controlHandlers.handleMouseLeave}\n className={cnCheckbox(null, { ...buttonState, disabled, checked, tone, size, view }, className)}>\n <span className={cnCheckbox('box')}>\n <CheckboxControl\n id={name}\n name={name}\n value={value}\n controlRef={props.controlRef}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n autoComplete={autoComplete}\n />\n <span className={cnCheckbox('tick')} />\n </span>\n <span\n role='presentation'\n className={cnCheckbox('text')}>\n {props.children}\n </span>\n </label>\n );\n};\n\nexport default Checkbox;\n","import React, { useCallback, ReactNode } from 'react';\n\nimport classname from '@search/classname/src';\nimport {\n Size,\n Mode,\n SizeEnum,\n ModeEnum,\n Maybe\n} from '../../../types';\n\nimport { ICheckboxProps } from '../Checkbox';\n\nimport './styles.css';\n\n// FIXME Move to string[] only value\nexport interface ICheckboxGroupProps {\n /**\n * Режим работы контрола\n */\n mode?: Mode;\n\n /**\n * Размер будет прокинут всем детям\n */\n size?: Size;\n\n /**\n * Значения контролы\n */\n value: string[];\n\n children?: ReactNode[];\n\n onChange: (value: string | number | string[] | null) => void;\n className?: string;\n\n name?: string;\n\n /**\n * Отключен или нет\n */\n disabled?: boolean;\n\n dataTest?: string;\n}\n\nexport const cnCheckboxGroup = classname.bind(null, 'CheckboxGroup');\n\nconst CheckboxGroup: React.FunctionComponent<ICheckboxGroupProps> = ({\n name,\n value,\n children,\n disabled,\n onChange,\n dataTest,\n mode = ModeEnum.CHECK,\n size = SizeEnum.S,\n className\n}) => {\n const handleChildCheck = useCallback((\n checked: boolean,\n childProps: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>}\n ) => {\n let newValue: string | null | string[] = [];\n const childValue: string = childProps.value as string;\n\n switch (true) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n case (checked && ModeEnum.CHECK === mode):\n // @ts-ignore\n newValue = [].concat(value).filter(a => a === 0 || Boolean(a)).concat(childValue);\n\n break;\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n case (checked && ModeEnum.RADIO_CHECK === mode):\n // eslint-disable-next-line\n case (checked && ModeEnum.RADIO === mode):\n newValue = childValue;\n\n break;\n // eslint-disable-next-line\n case (! checked && ModeEnum.RADIO === mode):\n newValue = value;\n\n break;\n // eslint-disable-next-line\n case (! checked && ModeEnum.RADIO_CHECK === mode):\n newValue = null;\n\n break;\n // eslint-disable-next-line\n case (! checked && ModeEnum.CHECK === mode):\n // @ts-ignore\n newValue = [].concat(value).filter(item => item !== childValue);\n break;\n default:\n newValue = [];\n }\n\n // @ts-ignore\n onChange(newValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ onChange, disabled, value ]);\n\n return (\n <span\n data-test={dataTest ?? name}\n className={cnCheckboxGroup(null, {}, className)}>\n {\n // @ts-ignore\n React.Children.map(children, (child: React.ReactElement<ICheckboxProps>): ReactNode => {\n // eslint-disable-next-line\n const checked = value && value.indexOf(child.props.value as string) !== -1;\n\n return React.cloneElement(child, {\n ...child.props,\n name: `${name ?? ''}-${String(child.props.value ?? '')}`,\n checked,\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n disabled: disabled ?? child.props.disabled,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n size: size ?? child.props.size,\n onCheck: handleChildCheck\n } as ICheckboxProps);\n })\n }\n </span>\n );\n};\n\nexport default CheckboxGroup;\n","import React from 'react';\n\ninterface IHighlightProps {\n text: string;\n highlight?: string;\n}\n\nfunction escapeRegExp(str: string) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nexport const Highlight: React.FC<IHighlightProps> = ({\n text, highlight = ''\n}) => {\n const tokens = highlight.toLowerCase().split(' ');\n\n let result = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n result += `(${token})${(i === tokens.length - 1) ? '' : '|'}`;\n }\n\n const sanitizedRegexp = escapeRegExp(result);\n\n const parts = text.split(new RegExp(sanitizedRegexp, 'gi')).filter(part => part !== undefined && part !== '');\n\n return (<span> { parts.map((part, i) =>\n // eslint-disable-next-line @typescript-eslint/prefer-includes\n <span key={i} style={tokens.indexOf(part.toLowerCase()) !== -1 ? { fontWeight: 'bold' } : {}}>\n { part }\n </span>)\n } </span>);\n};\n","import React, { CSSProperties, HTMLAttributes } from 'react';\nimport classname from '@search/classname/src';\n\nimport './Icon.css';\n\nexport interface IIconProps extends HTMLAttributes<HTMLSpanElement> {\n /**\n * Тип иконки\n */\n type?: string;\n\n /**\n * Размер иконки\n */\n size?: 'xs' | 's' | 'm' | 'l';\n\n /**\n * Стили иконки\n *\n * @default {}\n */\n style?: CSSProperties;\n\n /**\n * Адрес иконки\n */\n url?: string;\n\n /**\n * Цвет иконки\n */\n color?: string;\n}\n\nexport const cnIcon = classname.bind(null, 'Icon');\n\nconst Icon = ({\n size,\n url,\n type,\n style = {},\n children,\n color,\n ...props\n}: IIconProps): React.ReactElement => {\n const className = cnIcon(null, { size, type, color }, props.className);\n\n if (url !== undefined) {\n style.backgroundImage = `url('${url}')`;\n }\n\n return (\n <span\n {...props}\n aria-hidden\n className={className}\n style={style}\n >\n {children}\n </span>\n );\n};\n\nexport default Icon;\n","import React, { InputHTMLAttributes, Ref } from 'react';\n\nimport { cnInput } from '../Input';\n\nimport './InputControl.css';\n\nexport type IInputControlProps = InputHTMLAttributes<HTMLInputElement>;\n\nconst InputControl = React.forwardRef((props: IInputControlProps, ref: Ref<HTMLInputElement>) => (\n <input\n {...props}\n ref={ref}\n autoCorrect='off'\n autoComplete='off'\n className={cnInput('control')} />\n));\n\nexport { InputControl };\n","/* eslint-disable max-len */\nimport React, { RefObject, useState, useRef, FormEvent, useEffect, ReactNode, MutableRefObject } from 'react';\nimport NumberFormat, { NumberFormatProps } from 'react-number-format';\nimport useHoverable from '@search/hooks/src/useHoverable';\nimport useFocusable from '@search/hooks/src/useFocusable';\n\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\n\nimport {\n InputControl,\n IInputControlProps\n} from './InputControl/InputControl';\n\nimport './input.css';\n\nexport type InputMode = 'number' | 'text' | 'mask';\n\ninterface IInputProps extends Omit<IInputControlProps, 'onChange' | 'size'> {\n\n /**\n * Ссылка на корневой DOM-элемент компонента.\n */\n innerRef?: RefObject<HTMLElement>;\n\n /**\n * Ссылка на DOM элемент нативного инпута.\n */\n controlRef?: MutableRefObject<HTMLInputElement>;\n\n onChange?: (value: string, opts: object) => void;\n\n /**\n * Дополнительный контент до инпута\n */\n extraBefore?: ReactNode;\n\n /**\n * Дополнительный контент после инпута\n */\n extraAfter?: ReactNode;\n\n mode?: InputMode;\n\n size?: string;\n\n width?: string;\n\n borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n clear?: boolean;\n\n borderOut?: boolean;\n\n maskProps?: Omit<NumberFormatProps, 'value' | 'onChange'>;\n}\n\nexport const cnInput = classname.bind(null, 'Input');\n\nconst Input = ({\n autoComplete = 'off',\n className,\n name,\n value = '',\n disabled,\n width,\n size = 's',\n innerRef,\n controlRef,\n extraAfter,\n extraBefore,\n mode,\n maskProps,\n borderOut = false,\n borderSide,\n clear = false,\n ...props\n}: IInputProps): React.ReactElement => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const [ hovered, hoverRef ] = useHoverable();\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const [ focused, focusRef ] = useFocusable();\n const inputRef = useRef<HTMLElement>();\n\n const [ currentValue, setValue ] = useState(value);\n\n useEffect(() => {\n if (currentValue !== value) {\n setValue(value);\n }\n }, [ value, currentValue ]);\n\n /*\n * Изменение значения в поле\n * @param value\n */\n const changeValue = (val: string) => {\n setValue(val);\n // eslint-disable-next-line\n props.onChange && props.onChange(val, { name });\n };\n\n const handleClear = () => {\n changeValue('');\n };\n\n /*\n * Событие на изменение значения для \"простого\" поля\n * @param e\n */\n const handleChange = (e: FormEvent<HTMLInputElement>) => {\n changeValue(e.currentTarget.value);\n };\n\n /*\n * Событие на изменение значения для поля с \"маской\"\n * @param e\n */\n const handleChangeWithMask = (e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n const newValue = target.value.replace(/\\s/gm, '');\n\n changeValue(newValue);\n };\n\n return (\n <span\n ref={innerRef}\n className={cnInput(null, { hovered, focused, disabled, size, width }, className)}>\n {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n extraBefore ?\n <span className={cnInput('extra-before')}>\n {extraBefore}\n </span> : null\n }\n {mode === 'mask' ?\n (\n <NumberFormat\n type='tel'\n thousandSeparator={' '}\n decimalSeparator={false}\n isNumericString\n {...maskProps}\n onBlur={props.onBlur}\n placeholder={props.placeholder}\n className={cnInput('control')}\n name={name}\n getInputRef={mergeRefs(inputRef, controlRef, hoverRef, focusRef)}\n disabled={disabled}\n // @ts-ignore\n value={currentValue}\n onChange={handleChangeWithMask}\n autoComplete={autoComplete}\n />\n ) :\n (\n <InputControl\n {...props}\n name={name}\n value={currentValue}\n type={mode}\n ref={mergeRefs(inputRef, controlRef, hoverRef, focusRef)}\n disabled={disabled}\n onChange={handleChange}\n autoComplete={autoComplete}\n />\n )}\n {\n clear && currentValue !== '' && currentValue !== undefined && (\n // eslint-disable-next-line\n <span className={cnInput('clear-button')} onClick={handleClear}>\n <svg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path fillRule='evenodd' clipRule='evenodd' d='M5.00004 5.70714L9.14648 9.85359L9.85359 9.14648L5.70714 5.00004L9.85359 0.853592L9.14648 0.146485L5.00004 4.29293L0.853591 0.146484L0.146484 0.853591L4.29293 5.00004L0.146484 9.14648L0.853591 9.85359L5.00004 5.70714Z' fill='#1F212E' />\n </svg>\n </span>\n )\n }\n {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n extraAfter &&\n // eslint-disable-next-line\n (<span className={cnInput('extra-after')}>\n {extraAfter}\n </span>)\n }\n <span className={cnInput('box', { borderSide, borderOut })} />\n </span>\n );\n};\n\nexport default Input;\n","/* eslint-env browser */\nimport { RefObject } from 'react';\nimport { AnchorDimensions, PopupDimensions, ViewportDimensions, Position, TailDimensions } from './types';\n\n/*\n * Вычисляет размеры анкора.\n *\n * @param anchorRef Ссылка на DOM элемент анкора.\n */\nexport const getAnchorDimensions = (anchorRef?: RefObject<HTMLElement>): AnchorDimensions => {\n const dimensions = {\n left: 0,\n top: 0,\n height: 0,\n width: 0\n };\n\n if (anchorRef !== undefined && anchorRef.current !== null) {\n const { offsetWidth, offsetHeight } = anchorRef.current;\n const { left, top } = anchorRef.current.getBoundingClientRect();\n\n dimensions.left = left + window.pageXOffset;\n dimensions.top = top + window.pageYOffset;\n dimensions.height = offsetHeight;\n dimensions.width = offsetWidth;\n }\n\n return dimensions;\n};\n\n/*\n * Вычисляет размеры попапа.\n * @param popupRef Ссылка на DOM элемент попапа.\n */\nexport const getPopupDimensions = (popupRef?: RefObject<HTMLElement | undefined>): PopupDimensions => {\n const dimensions = {\n area: 0,\n height: 0,\n width: 0,\n popupHeight: 0,\n popupWidth: 0\n };\n\n if (popupRef !== undefined && popupRef.current !== null && popupRef.current !== undefined) {\n const { clientWidth, clientHeight } = popupRef.current;\n const { width, height } = popupRef.current.getBoundingClientRect();\n\n dimensions.area = clientWidth * clientHeight;\n // Погрешность расчета при рендеринге ie11\n dimensions.height = Math.round(height);\n // Погрешность при расчете offsetWidth при рендеринге в chrome\n dimensions.width = Math.round(width);\n dimensions.popupHeight = clientHeight;\n dimensions.popupWidth = clientWidth;\n }\n\n return dimensions;\n};\n\n/*\n * Вычисляет размеры окна.\n */\nexport const getViewportDimensions = (): ViewportDimensions => {\n return {\n top: window.pageYOffset,\n left: window.pageXOffset,\n bottom: window.pageYOffset + window.innerHeight,\n right: window.pageXOffset + window.innerWidth\n };\n};\n\n/*\n * Вычисляет размеры области.\n *\n * @param scopeRef Ссылка на DOM элемент области.\n */\nexport const getScopeDimensions = (scopeRef?: RefObject<HTMLElement>): Position => {\n const dimensions = { top: 0, left: 0 };\n\n if (scopeRef !== undefined && scopeRef.current !== null) {\n const { left, top } = scopeRef.current.getBoundingClientRect();\n\n dimensions.top = top; // - (scopeRef.current.scrollTop + top);\n dimensions.left = left; // - (scopeRef.current.scrollLeft + left);\n }\n\n return dimensions;\n};\n\n/*\n * Вычисляет размеры хвостика.\n *\n * tailRef Ссылка на DOM элемент хвостика.\n */\nexport const getTailDimensions = (tailRef?: RefObject<HTMLElement>): TailDimensions => {\n const dimensions = { size: 0 };\n\n if (tailRef && tailRef.current) {\n dimensions.size = tailRef.current.offsetWidth;\n }\n\n return dimensions;\n};\n","import { checkMainDirection, checkSecondaryDirection } from './utils';\nimport { AnchorDimensions, PopupDimensions, TailDimensions } from './types';\n\n/*\n * Вычисляет координаты попапа для заданного направления.\n *\n * @param direction Текущее направление в котором раскрыт попап\n * @param anchorDimensions Размеры анкора\n * @param popupDimensions Размеры попапа\n * @param offsets Отступы\n */\nexport const getPopupPosition = (\n direction: string,\n anchorDimensions: AnchorDimensions,\n popupDimensions: PopupDimensions,\n offsets = {\n secondary: 0,\n main: 0\n }\n): {\n left: number;\n top: number;\n} => {\n const position = { left: 0, top: 0 };\n\n if (checkMainDirection(direction, 'bottom')) {\n position.top = anchorDimensions.top + anchorDimensions.height + offsets.main;\n } else if (checkMainDirection(direction, 'top')) {\n position.top = anchorDimensions.top - popupDimensions.height - offsets.main;\n } else if (checkMainDirection(direction, 'left')) {\n position.left = anchorDimensions.left - popupDimensions.width - offsets.main;\n } else if (checkMainDirection(direction, 'right')) {\n position.left = anchorDimensions.left + anchorDimensions.width + offsets.main;\n }\n\n if (checkSecondaryDirection(direction, 'right')) {\n position.left = anchorDimensions.left + anchorDimensions.width - popupDimensions.width - offsets.secondary;\n } else if (checkSecondaryDirection(direction, 'left')) {\n position.left = anchorDimensions.left + offsets.secondary;\n } else if (checkSecondaryDirection(direction, 'bottom')) {\n position.top = anchorDimensions.top + anchorDimensions.height - popupDimensions.height - offsets.secondary;\n } else if (checkSecondaryDirection(direction, 'top')) {\n position.top = anchorDimensions.top + offsets.secondary;\n } else if (checkSecondaryDirection(direction, 'center')) {\n if (checkMainDirection(direction, 'top', 'bottom')) {\n position.left = anchorDimensions.left + (anchorDimensions.width / 2) - (popupDimensions.width / 2);\n } else if (checkMainDirection(direction, 'left', 'right')) {\n position.top = anchorDimensions.top + (anchorDimensions.height / 2) - (popupDimensions.height / 2);\n }\n }\n\n return position;\n};\n\n/*\n * Вычисляет координаты хвостика для заданного направления.\n *\n * @param direction Текущее направление в котором раскрыт попап\n * @param anchorDimensions Размеры анкора\n * @param popupDimensions Размеры попапа\n * @param tailDimensions Размеры хвостика\n * @param offsets Отступы\n */\nexport const getTailPosition = (\n direction: string,\n anchorDimensions: AnchorDimensions,\n popupDimensions: PopupDimensions,\n tailDimensions: TailDimensions,\n offsets = {\n tail: 0\n }\n): {\n left: number;\n top: number;\n} => {\n const position = { left: 0, top: 0 };\n const halfSizeOfTail = tailDimensions.size / 2;\n\n if (checkMainDirection(direction, 'bottom')) {\n position.top = -halfSizeOfTail;\n } else if (checkMainDirection(direction, 'top')) {\n position.top = Math.floor(popupDimensions.popupHeight - halfSizeOfTail);\n } else if (checkMainDirection(direction, 'left')) {\n position.left = Math.floor(popupDimensions.popupWidth - halfSizeOfTail);\n } else if (checkMainDirection(direction, 'right')) {\n position.left = -halfSizeOfTail;\n }\n\n if (checkSecondaryDirection(direction, 'right')) {\n position.left = (\n popupDimensions.popupWidth -\n Math.ceil(Math.min(popupDimensions.popupWidth, anchorDimensions.width) / 2) -\n halfSizeOfTail - offsets.tail\n );\n } else if (checkSecondaryDirection(direction, 'left')) {\n position.left = Math.ceil(Math.min(popupDimensions.popupWidth, anchorDimensions.width) / 2) -\n halfSizeOfTail + offsets.tail;\n } else if (checkSecondaryDirection(direction, 'bottom')) {\n position.top = (\n popupDimensions.popupHeight -\n Math.ceil(Math.min(popupDimensions.popupHeight, anchorDimensions.height) / 2) -\n halfSizeOfTail - offsets.tail);\n } else if (checkSecondaryDirection(direction, 'top')) {\n position.top = Math.ceil(Math.min(popupDimensions.popupHeight, anchorDimensions.height) / 2) -\n halfSizeOfTail + offsets.tail;\n } else if (checkSecondaryDirection(direction, 'center')) {\n if (checkMainDirection(direction, 'top', 'bottom')) {\n position.left = Math.ceil(popupDimensions.popupWidth / 2) - halfSizeOfTail + offsets.tail;\n } else {\n position.top = Math.ceil(popupDimensions.popupHeight / 2) - halfSizeOfTail + offsets.tail;\n }\n }\n\n return position;\n};\n","import { PopupDimensions, ViewportDimensions, Position } from './types';\n\n/*\n * Вычисляет коэффициент пересечения доступной площади для открытия попапа и собственной площади попапа.\n *\n * @param popupPosition\n * @param viewportDimensions\n * @param popupDimensions\n * @param offsets\n */\nexport const getViewportFactor = (\n popupPosition: Position,\n viewportDimensions: ViewportDimensions,\n popupDimensions: PopupDimensions,\n offsets = {\n viewport: 0\n }\n): number => {\n let viewportFactor = 0;\n const intersectionLeft = Math.max(popupPosition.left, viewportDimensions.left + offsets.viewport);\n const intersectionRight = Math.min(\n popupPosition.left + popupDimensions.width,\n viewportDimensions.right - offsets.viewport\n );\n const intersectionTop = Math.max(\n popupPosition.top,\n viewportDimensions.top + offsets.viewport\n );\n const intersectionBottom = Math.min(\n popupPosition.top + popupDimensions.height,\n viewportDimensions.bottom - offsets.viewport\n );\n\n if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n viewportFactor = (intersectionRight - intersectionLeft) *\n (intersectionBottom - intersectionTop) / popupDimensions.area;\n }\n\n return viewportFactor;\n};\n","export const checkMainDirection = (\n direction: string,\n mainFirstDirection: string,\n mainSecondDirection?: string\n) => (\n direction.indexOf(mainFirstDirection) === 0 || (mainSecondDirection && direction.indexOf(mainSecondDirection) === 0)\n);\n\nexport const checkSecondaryDirection = (\n direction: string,\n secondaryDirection: string\n) => (\n direction.indexOf('-' + secondaryDirection) > 0\n);\n","/* eslint-disable @typescript-eslint/naming-convention */\nexport enum KEY_CODE {\n UP = 38,\n DOWN = 40,\n ENTER = 13,\n TAB = 9,\n ESC = 27\n}\n","import React, { useCallback, useState, useMemo, useEffect, KeyboardEvent } from 'react';\nimport { KEY_CODE } from '../../../enums';\n\nexport interface IUseSuggestionListState {\n focusedIndex: number | null;\n}\n\nexport interface IUseSuggestionListHandlers {\n handleInputKeyDown: (event: KeyboardEvent) => void;\n handleItemMouseDown: (event: React.MouseEvent, index: number) => void;\n handleItemMouseEnter: (event: React.MouseEvent, index: number) => void;\n}\n\nfunction useSuggestionList <Suggestion>(\n { suggestions, isListOpened }: { isListOpened: boolean; suggestions: Suggestion[] },\n onSelect: (item: Suggestion) => void\n): { focusedIndex: number | null; suggestionHandlers: IUseSuggestionListHandlers } {\n const suggestionsLength = useMemo(() => suggestions.length, [ suggestions ]);\n\n const [ state, setFocusedItem ] = useState<IUseSuggestionListState>({ focusedIndex: null });\n\n const handleInputKeyDown = useCallback((event: React.KeyboardEvent) => {\n switch (event.keyCode) {\n case KEY_CODE.UP:\n event.preventDefault();\n event.stopPropagation();\n\n setFocusedItem(({ focusedIndex, ...rest }) => ({\n ...rest,\n focusedIndex: focusedIndex ? focusedIndex - 1 : suggestionsLength - 1\n }));\n\n break;\n case KEY_CODE.DOWN:\n event.preventDefault();\n event.stopPropagation();\n\n setFocusedItem(({ focusedIndex, ...rest }) => ({\n ...rest,\n focusedIndex: focusedIndex === null || focusedIndex === suggestionsLength - 1 ? 0 : focusedIndex + 1\n }));\n\n break;\n\n case KEY_CODE.ENTER:\n if (suggestionsLength && state.focusedIndex !== null) {\n event.preventDefault();\n event.stopPropagation();\n\n onSelect(suggestions[state.focusedIndex]);\n\n setFocusedItem(prevState => ({\n ...prevState,\n focusedIndex: null\n }));\n } else {\n setFocusedItem(prevState => ({\n ...prevState,\n focusedIndex: null\n }));\n }\n\n break;\n\n default:\n break;\n }\n\n // onKeyDown(event);\n }, [ suggestions, state ]);\n\n const handleItemMouseDown = useCallback((event: React.MouseEvent, index: number) => {\n event.stopPropagation();\n event.preventDefault();\n\n onSelect(suggestions[index]);\n\n setFocusedItem(prevState => ({\n ...prevState,\n focusedIndex: null\n }));\n }, [ suggestions, state ]);\n\n const handleItemMouseEnter = useCallback((_: React.MouseEvent, index: number) => {\n setFocusedItem(prevState => ({\n ...prevState,\n focusedIndex: index\n }));\n }, []);\n\n useEffect(() => {\n if (! isListOpened) {\n setFocusedItem(prevState => ({\n ...prevState,\n focusedIndex: null\n }));\n }\n }, [ isListOpened ]);\n\n return {\n ...state,\n suggestionHandlers: {\n handleInputKeyDown,\n handleItemMouseDown,\n handleItemMouseEnter\n }\n };\n}\n\nexport default useSuggestionList;\n","import React, { ReactNode, RefObject, useCallback, useEffect, useState } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { Input } from '@vtblife/uikit/dist/components/input/legacy/input';\nimport cn from '@search/classname/src';\nimport useControl, { IUseControlReturnedHandlers } from '@search/hooks/src/useControl';\n\nimport useSuggestionList, { IUseSuggestionListState } from './useSuggestionList';\n\nimport './styles.css';\n\nexport interface ISuggestion {\n label: string;\n type?: string;\n}\n\ninterface ICheckIsOpen <Suggestion extends ISuggestion> {\n /**\n * Признак фокуса на списке\n */\n isFocus: boolean;\n /**\n * Введенный текст\n */\n label: string;\n /**\n * Выбранные элемент из списка\n */\n suggestion?: Suggestion;\n\n /**\n * Набор подсказок\n */\n suggestions?: Suggestion[];\n}\n\nexport interface IInitialSuggestState<Suggestion extends ISuggestion> {\n /**\n * Введенный текст\n */\n label: string;\n\n /**\n * Состояние списка, открыт или нет\n */\n isListOpened: boolean;\n\n /**\n * Обьект выбранной подсказки\n */\n suggestion?: Suggestion;\n}\n\nexport interface ISuggestProps<Suggestion extends ISuggestion = ISuggestion> {\n /**\n * Ссылка на рутовый DOM элемент компонента.\n */\n innerRef?: RefObject<HTMLDivElement>;\n\n /**\n * Кастомный ренедер инпута\n */\n renderInput?: (\n props: {\n inputRef?: RefObject<HTMLSpanElement | HTMLInputElement>;\n borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n inputSize?: Size;\n placeholder?: string;\n onInputToggleFocus?: (disabled: boolean) => void;\n label?: string;\n disabled?: boolean;\n borderOut?: boolean;\n clear?: boolean;\n isError?: boolean;\n autoFocus?: boolean;\n focused?: boolean;\n },\n state: IInitialSuggestState<Suggestion>,\n handlers: IUseControlReturnedHandlers & {\n handleInputChange: (text: string) => void;\n handleInputKeyDown: (e: React.KeyboardEvent) => void;\n }\n ) => ReactNode;\n\n /**\n * Кастомный ренедер списка\n */\n renderList?: (props: {\n suggestions: Suggestion[];\n renderItemLabel: (suggestion: Suggestion) => ReactNode;\n }, suggestionState: IUseSuggestionListState & { label?: string }, handlers: {\n handleItemMouseDown: (event: React.MouseEvent, index: number) => void;\n handleItemMouseEnter: (event: React.MouseEvent, index: number) => void;\n }) => ReactNode;\n\n /**\n * Обработчик пустого инпута\n */\n onClear?: () => void;\n\n /**\n * Кастомный ренедер пустого списка\n */\n renderEmptyList?: (props: {emptyText?: string}) => void;\n\n /**\n * Коллбэк получения данных\n */\n fetchSuggestions?: (text: string) => void;\n\n /**\n * Обработчик изменения текста в инпуте\n * @param text\n */\n onTextChange?: (text: string) => void;\n\n /**\n * Обработчик потери фокуса в input\n */\n onBlur?: (e:React.FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик получения фокуса в input\n */\n onFocus?: (e:React.FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Кастомный ренедер элемента списка подсказок\n */\n renderItemLabel?: (suggestion: Suggestion) => React.ReactNode;\n\n width?: 'max';\n\n borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n\n inputSize?: Size;\n\n /**\n * Коллбэк выбора значения\n * @param suggestion\n */\n onSelect: (suggestion: Suggestion) => void;\n\n /**\n * Очищать состояние саджеста после выбора значения\n */\n clearOnSelect?: boolean;\n\n /**\n * Кнопка для очищения input\n */\n clear?: boolean;\n\n /**\n * Ошибка ?\n */\n isError?: boolean;\n\n /**\n * Выбранные элемент из списка\n */\n suggestion?: Suggestion;\n\n borderOut?: boolean;\n\n /**\n * Набор подсказок\n */\n suggestions?: Suggestion[];\n\n /**\n * Состояние саджеста\n */\n disabled?: boolean;\n\n /**\n * Вспомогательный текст внутри компонента. Отображается, когда значение не выбрано\n */\n placeholder?: string;\n\n /**\n * Label внутри компонента. Отображается всегда\n */\n label?: string;\n\n /**\n * Размер\n */\n size?: Size;\n\n /**\n * Автофокус для input\n */\n autoFocus?: boolean;\n\n /**\n * Текст для пустого списка\n */\n emptyText?: string;\n\n /**\n * Класс миксин\n */\n className?: string;\n\n /**\n * Обработчик проверки отрисовки списка\n */\n checkListShowing?: (state: ICheckIsOpen<Suggestion>) => boolean;\n\n /**\n * Обработчик фокуса и блюра на поле Suggest (дизейбл формы для фикса бага на iOS Safari)\n */\n onInputToggleFocus?: (disabled: boolean) => void;\n\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n}\n\nexport const cnSuggest = cn.bind(null, 'Suggest');\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_SUGGESTIONS: any[] = [];\n\nconst renderInputDefault: ISuggestProps['renderInput'] = (suggestProps, state, handlers) => {\n const onFocus = suggestProps.onInputToggleFocus ? () => {\n suggestProps.onInputToggleFocus?.(true);\n } : handlers.handleFocus;\n\n const onBlur = suggestProps.onInputToggleFocus ? () => {\n suggestProps.onInputToggleFocus?.(false);\n } : handlers.handleBlur;\n\n return (\n <Input\n autoFocus={suggestProps.autoFocus}\n // @ts-ignore\n size={suggestProps.inputSize} // eslint-disable-line\n value={state.label}\n onBlur={onBlur}\n onFocus={onFocus}\n name='suggest-input'\n onChange={handlers.handleInputChange}\n onKeyDown={handlers.handleInputKeyDown}\n placeholder={suggestProps.placeholder}\n label={suggestProps.label}\n hasClear={suggestProps.clear}\n isError={suggestProps.isError}\n className={cnSuggest('input')}\n disabled={suggestProps.disabled}\n />\n );\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst renderListDefault: ISuggestProps<any>['renderList'] = (suggestProps, state, handlers) =>\n <ul className={cnSuggest('list')}>\n {suggestProps.suggestions.map((suggestion, index) => {\n return (\n <li\n key={index}\n onMouseEnter={e => handlers.handleItemMouseEnter(e, index)}\n onMouseDown={e => handlers.handleItemMouseDown(e, index)}\n className={cnSuggest('list-item', { focused: state.focusedIndex === index })}>\n {suggestProps.renderItemLabel(suggestion)}\n </li>\n );\n })}\n </ul>;\n\nconst renderEmptyListDefault: ISuggestProps['renderEmptyList'] = ({ emptyText }) => {\n return (\n <div className={cnSuggest('list', { empty: true })}>\n {emptyText}\n </div>\n );\n};\n\nconst renderItemLabelDefault: ISuggestProps['renderItemLabel'] = suggestion => suggestion.label;\n\nconst Suggest = <Suggestion extends ISuggestion>({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n size = Size.Medium,\n borderSide,\n borderOut = false,\n onInputToggleFocus,\n inputSize,\n width,\n className,\n innerRef,\n disabled,\n onSelect,\n renderInput = renderInputDefault,\n renderList = renderListDefault,\n renderItemLabel = renderItemLabelDefault,\n renderEmptyList = renderEmptyListDefault,\n clearOnSelect = false,\n autoFocus = false,\n suggestions = DEFAULT_SUGGESTIONS as Suggestion[],\n suggestion,\n onClear,\n onTextChange,\n onFocus,\n onBlur,\n fetchSuggestions,\n onClick,\n placeholder,\n label,\n emptyText = 'Ничего не найдено',\n clear = false,\n isError = false,\n checkListShowing\n}: ISuggestProps<Suggestion>) => {\n const [ state, setState ] = useState<IInitialSuggestState<Suggestion>>({\n label: suggestion ? suggestion.label : '',\n isListOpened: false\n });\n\n const handleSelectItem = useCallback((selectedItem: Suggestion) => {\n if (selectedItem) {\n setState(prevState => {\n const newState = { ...prevState };\n\n if (clearOnSelect) {\n newState.label = '';\n } else if (suggestion === undefined) {\n // Устанавливаем значение, если саджест неуправляемый извне\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n newState.label = selectedItem.label;\n newState.suggestion = selectedItem;\n }\n\n return ({\n ...newState,\n isListOpened: false\n });\n });\n }\n\n onSelect && onSelect(selectedItem);\n }, [ clearOnSelect, onSelect, suggestion ]);\n\n const { suggestionHandlers, focusedIndex } = useSuggestionList<Suggestion>({\n suggestions,\n isListOpened: state.isListOpened\n }, handleSelectItem);\n\n const [ controlState, controlHandlers ] = useControl({ disabled, focused: autoFocus }, {\n onBlur,\n onFocus\n }, { disabled });\n\n const handleInputChange = useCallback((text: string) => {\n onTextChange && onTextChange(text);\n\n setState(prevState => {\n if (text !== state.label) {\n fetchSuggestions && fetchSuggestions(text);\n }\n\n return ({\n ...prevState,\n label: text,\n suggestion: undefined,\n isListOpened: Boolean(text)\n });\n });\n\n if (! text) {\n onClear && onClear();\n }\n }, [ onTextChange, state.label, fetchSuggestions, onClear ]);\n\n useEffect(() => {\n // Если инпут потерял фокус, то закрываем список\n if (! controlState.focused) {\n const trimmedText = state?.label?.trim();\n\n setState(prevState => {\n return ({ ...prevState, label: trimmedText, isListOpened: false });\n });\n } else {\n // Если инпут в фокусе\n setState(prevState => {\n const isListOpened = Boolean(prevState.label && ! prevState.suggestion);\n\n return ({\n ...prevState,\n isListOpened\n });\n });\n }\n }, [ controlState.focused, suggestions, state?.label ]);\n\n useEffect(() => {\n if (suggestion) {\n setState(prevState => {\n return ({\n ...prevState,\n label: suggestion ? suggestion.label : '',\n suggestion\n });\n });\n } else if (! suggestion) {\n setState(prevState => {\n return ({\n ...prevState,\n label: '',\n suggestion: undefined\n });\n });\n }\n }, [ suggestion ]);\n\n const isShowEmptyList = state.isListOpened && ! suggestions.length && Boolean(state.label);\n let isShowList = suggestions.length > 0 && state.isListOpened;\n\n if (checkListShowing) {\n isShowList = checkListShowing({\n isFocus: Boolean(controlState.focused),\n label: state.label,\n suggestion,\n suggestions\n });\n }\n\n return (\n <div\n data-test='filter-geo-suggest'\n ref={innerRef}\n onClick={onClick}\n className={cnSuggest(null, { size, width }, className)}>\n {\n renderInput(\n {\n borderOut,\n borderSide,\n inputSize,\n placeholder,\n label,\n disabled,\n clear,\n autoFocus,\n isError,\n focused: controlState.focused,\n onInputToggleFocus\n },\n state,\n {\n ...controlHandlers,\n handleInputChange,\n handleInputKeyDown: suggestionHandlers.handleInputKeyDown\n })\n }\n {\n isShowList && renderList({\n suggestions,\n renderItemLabel\n }, {\n label: state.label,\n focusedIndex\n }, {\n handleItemMouseDown: suggestionHandlers.handleItemMouseDown,\n handleItemMouseEnter: suggestionHandlers.handleItemMouseEnter\n })\n }\n {\n isShowEmptyList && renderEmptyList({ emptyText })\n }\n </div>\n );\n};\n\nexport default Suggest;\n","import React, { HTMLAttributes, RefObject } from 'react';\n\nimport { cnPopup } from '../Popup';\nimport './PopupTail.css';\n\nexport interface IPopupTailProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Ссылка на хвостик.\n */\n innerRef?: RefObject<HTMLDivElement>;\n}\n\nexport const PopupTail = ({\n className,\n innerRef,\n ...props\n}: IPopupTailProps): React.ReactElement => (\n <div\n {...props}\n className={cnPopup('tail', undefined, className)}\n ref={innerRef}\n />\n);\n","import React, {\n useRef,\n useState,\n useEffect,\n RefObject,\n HTMLAttributes,\n FunctionComponent,\n MutableRefObject\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\nimport {\n Size,\n View,\n Tone,\n SizeEnum,\n ToneEnum,\n ViewEnum\n} from '../../../types';\n\nimport {\n Offset,\n Direction,\n DrawingParams\n} from './types';\n\nimport { PopupTail } from './PopupTail';\n\nimport { getViewportFactor } from './getViewportFactor';\nimport { getPopupPosition, getTailPosition } from './getPosition';\nimport {\n getTailDimensions,\n getPopupDimensions,\n getScopeDimensions,\n getAnchorDimensions,\n getViewportDimensions\n} from './getDimensions';\n\nimport './Popup.css';\n\nconst VIEWPORT_ACCURACY_FACTOR = 0.99;\n\nexport const cnPopup = classname.bind(null, 'Popup');\n\nexport interface IPopupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Элемент, относительно которого необходимо позиционировать попап.\n */\n anchor: RefObject<HTMLElement>;\n\n /**\n * Ссылка на DOM элемент попапа.\n */\n innerRef?: MutableRefObject<HTMLDivElement | undefined> | undefined;\n\n /**\n * Видимость попапа.\n */\n visible?: boolean;\n\n /**\n * Наличие хвостика у попапа.\n */\n hasTail?: boolean;\n\n /**\n * Направления раскрытия блока.\n *\n * @default ['bottom-left', 'bottom-center', 'bottom-right', 'top-left', 'top-center', 'top-right', 'right-top', 'right-center', 'right-bottom', 'left-top', 'left-center', 'left-bottom']\n */\n directions?: Direction[];\n\n /**\n * Цвет попапа\n */\n tone?: Tone;\n\n /**\n * Вид попапа\n */\n view?: View;\n\n /**\n * Рамер попапа\n */\n size?: Size;\n\n /**\n * Отступ попапа относительно основного направления.\n *\n * @default 0\n */\n mainOffset?: number;\n\n /**\n * Отступ попапа относительно второстепенного направления.\n *\n * @default 0\n */\n secondaryOffset?: number;\n\n /**\n * Отступ хвостика от края попапа.\n *\n * @default 0\n */\n tailOffset?: number;\n\n /**\n * Отступ от края окна браузера.\n *\n * @default 0\n */\n viewportOffset?: number;\n}\n\nconst getDrawingParams = (\n anchor: RefObject<HTMLElement>,\n popupRef: RefObject<HTMLDivElement | undefined>,\n directions: Direction[],\n hasTail: boolean,\n tailRef: RefObject<HTMLElement>,\n offsets: Offset\n): DrawingParams => {\n const anchorDimensions = getAnchorDimensions(anchor);\n const popupDimensions = getPopupDimensions(popupRef);\n const viewportDimensions = getViewportDimensions();\n const scopeDimensions = getScopeDimensions({ current: document.body });\n\n let viewportFactor = 0;\n\n const params: DrawingParams = {\n direction: 'bottom-left',\n popupPosition: { top: 0, left: 0 },\n tailPosition: { top: 0, left: 0 }\n };\n\n for (const nextDirection of directions) {\n const popupPosition = getPopupPosition(nextDirection, anchorDimensions, popupDimensions, offsets);\n const nextViewportFactor = getViewportFactor(popupPosition, viewportDimensions, popupDimensions, offsets);\n\n if (nextViewportFactor >= viewportFactor) {\n params.popupPosition = {\n top: popupPosition.top - (scopeDimensions.top + window.pageYOffset),\n left: popupPosition.left - (scopeDimensions.left + window.pageXOffset)\n };\n\n params.direction = nextDirection;\n\n viewportFactor = nextViewportFactor;\n }\n\n if (viewportFactor > VIEWPORT_ACCURACY_FACTOR) {\n break;\n }\n }\n\n if (hasTail) {\n const tailDimensions = getTailDimensions(tailRef);\n\n params.tailPosition = getTailPosition(\n params.direction,\n anchorDimensions,\n popupDimensions,\n tailDimensions,\n offsets\n );\n }\n\n return params;\n};\n\nconst getOffsets = ({\n mainOffset,\n secondaryOffset,\n tailOffset,\n viewportOffset\n}: {\n mainOffset: number;\n secondaryOffset: number;\n tailOffset: number;\n viewportOffset: number;\n}, tailRef: RefObject<HTMLElement>): Offset => {\n const tailDimensions = getTailDimensions(tailRef);\n const computedMainOffset =\n (mainOffset >= 0 && tailDimensions.size > 0) ?\n Math.max(mainOffset, Math.round(tailDimensions.size * Math.SQRT1_2)) :\n mainOffset;\n\n return {\n main: computedMainOffset,\n secondary: secondaryOffset,\n tail: tailOffset,\n viewport: viewportOffset\n };\n};\n\nconst Popup: FunctionComponent<IPopupProps> = ({\n anchor,\n className,\n visible = true,\n hasTail = false,\n size = SizeEnum.M,\n tone = ToneEnum.LIGHT,\n view = ViewEnum.PRIMARY,\n directions = [\n 'bottom-center'\n ],\n innerRef,\n secondaryOffset = 0,\n mainOffset = 0,\n tailOffset = 0,\n viewportOffset = 0,\n ...props\n}) => {\n const [ direction, setDirection ] = useState(directions[0]);\n\n const timerRef = useRef<number>(0);\n\n /**\n * Контейнер с ссылкой на DOM элемент попапа\n */\n const popupRef = useRef<HTMLDivElement>();\n\n /**\n * Контейнер с ссылкой на DOM элемент хвостика\n */\n const tailRef = useRef<HTMLDivElement>(null);\n\n const updateRefsPosition = () => {\n if (timerRef.current === 0) {\n if (popupRef.current !== null) {\n if (popupRef.current && ! popupRef.current.style.top) {\n // При первом рендеринге попап появляется, но у него ещё нету координат,\n popupRef.current.style.top = '-9999px';\n }\n }\n }\n\n window.clearTimeout(timerRef.current);\n\n timerRef.current = window.setTimeout(() => {\n const offsets = getOffsets({\n mainOffset,\n tailOffset,\n secondaryOffset,\n viewportOffset\n }, tailRef);\n const params = getDrawingParams(anchor, popupRef, directions, hasTail, tailRef, offsets);\n\n if (popupRef.current !== null && popupRef.current !== undefined) {\n popupRef.current.style.top = `${params.popupPosition!.top}px`;\n popupRef.current.style.left = `${params.popupPosition!.left}px`;\n popupRef.current.style.visibility = 'visible';\n }\n\n if (tailRef.current !== null) {\n tailRef.current.style.top = `${params.tailPosition!.top}px`;\n tailRef.current.style.left = `${params.tailPosition!.left}px`;\n }\n\n setDirection(params.direction);\n }, 0);\n };\n\n useEffect(() => {\n updateRefsPosition();\n\n if (visible) {\n window.addEventListener('scroll', updateRefsPosition);\n window.addEventListener('resize', updateRefsPosition);\n } else {\n window.removeEventListener('scroll', updateRefsPosition);\n window.removeEventListener('resize', updateRefsPosition);\n }\n\n return () => {\n window.clearTimeout(timerRef.current);\n\n window.removeEventListener('scroll', updateRefsPosition);\n window.removeEventListener('resize', updateRefsPosition);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ visible, anchor.current, directions ]);\n\n if (! visible) {\n return null;\n }\n\n return (\n createPortal(\n <div\n style={props.style}\n ref={mergeRefs(popupRef, innerRef)}\n className={cnPopup(null, { visible, view, tone, direction, size }, className)}>\n {props.children}\n {\n hasTail ? <PopupTail innerRef={tailRef} /> : null\n }\n </div>,\n document.body\n )\n );\n};\n\nexport default Popup;\n","import React, {\n useRef,\n RefObject,\n HTMLAttributes,\n FunctionComponent,\n MutableRefObject\n} from 'react';\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\nimport {\n Size,\n View,\n Tone,\n SizeEnum,\n ToneEnum,\n ViewEnum\n} from '../../../types';\n\nimport { PopupTail } from '../Popup/PopupTail';\n\nimport {\n Direction\n} from '../Popup/types';\n\nimport './InlinePopup.css';\n\nexport const cnPopup = classname.bind(null, 'InlinePopup');\n\nexport interface InlinePopupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Элемент, относительно которого необходимо позиционировать попап.\n */\n anchor: RefObject<HTMLElement>;\n\n /**\n * Ссылка на DOM элемент попапа.\n */\n innerRef?: MutableRefObject<HTMLDivElement | undefined> | undefined;\n\n /**\n * Видимость попапа.\n */\n visible?: boolean;\n\n /**\n * Наличие хвостика у попапа.\n */\n hasTail?: boolean;\n\n /**\n * Направления раскрытия блока.\n * Пока реализовано только bottom-center'\n *\n * @default 'bottom-center'\n */\n direction?: Direction;\n\n /**\n * Цвет попапа\n */\n tone?: Tone;\n\n /**\n * Вид попапа\n */\n view?: View;\n\n /**\n * Рамер попапа\n */\n size?: Size;\n\n /**\n * Отступ попапа относительно основного направления.\n *\n * @default 0\n */\n mainOffset?: number;\n\n /**\n * Отступ попапа относительно второстепенного направления.\n *\n * @default 0\n */\n secondaryOffset?: number;\n\n /**\n * Отступ хвостика от края попапа.\n *\n * @default 0\n */\n tailOffset?: number;\n\n /**\n * Отступ от края окна браузера.\n *\n * @default 0\n */\n viewportOffset?: number;\n}\n\nconst InlinePopup: FunctionComponent<InlinePopupProps> = ({\n anchor,\n className,\n visible = true,\n hasTail = false,\n size = SizeEnum.M,\n tone = ToneEnum.LIGHT,\n view = ViewEnum.PRIMARY,\n direction = 'bottom-center',\n innerRef,\n ...props\n}) => {\n /**\n * Контейнер с ссылкой на DOM элемент попапа\n */\n const popupRef = useRef<HTMLDivElement>();\n\n /**\n * Контейнер с ссылкой на DOM элемент хвостика\n */\n const tailRef = useRef<HTMLDivElement>(null);\n\n if (! visible) {\n return null;\n }\n\n return (\n <div\n style={props.style}\n ref={mergeRefs(popupRef, innerRef)}\n className={cnPopup(null, { visible, view, tone, direction, size }, className)}>\n {props.children}\n {\n hasTail ? <PopupTail innerRef={tailRef} /> : null\n }\n </div>\n );\n};\n\nexport default InlinePopup;\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, { Fragment, useState, useCallback, useRef, RefObject, useEffect } from 'react';\nimport classname from '@search/classname/src';\nimport { useOnClickOutside } from '@search/hooks/src/useOnClickOutside';\nimport Popup, { IPopupProps } from '../Popup';\nimport InlinePopup from '../InlinePopup';\nimport { SizeEnum, ToneEnum, ViewEnum } from '../../../types';\n\nexport type TriggerElement = HTMLDivElement | HTMLButtonElement | HTMLLinkElement;\n\nimport './styles.css';\n\nconst cnTooltip = classname.bind(null, 'Tooltip');\n\ninterface ITooltipHandlers {\n isVisible: boolean;\n handleShow: () => void;\n handleClose: () => void;\n handleToggle: () => void;\n triggerRef: RefObject<TriggerElement>;\n}\n\nexport interface ITooltipProps extends Omit<IPopupProps, 'anchor'> {\n /**\n * Видимость tooltip\n */\n visible?: boolean;\n\n /**\n * Рендер контента\n * @param opts\n */\n renderContent: (opts: {handleClose(): void}) => React.ReactNode;\n\n /**\n * Рендер триггера\n * @param opts\n */\n renderTrigger: (opts: ITooltipHandlers) => React.ReactNode;\n\n /**\n * коллбэк закрытия тултипа\n */\n onHide?: () => void;\n\n /**\n * Инлайновый тултип\n */\n inline?: boolean;\n}\n\nconst Tooltip = ({\n hasTail,\n directions,\n size = SizeEnum.M,\n tone = ToneEnum.LIGHT,\n view = ViewEnum.CLEAR,\n visible = false,\n renderContent,\n renderTrigger,\n className,\n mainOffset = 4,\n onHide,\n inline = false\n}: ITooltipProps) => {\n const [ currentVisible, setVisible ] = useState<boolean>(visible);\n const triggerRef = useRef<TriggerElement>(null);\n const contentRef = useRef<HTMLDivElement>();\n\n const handleClickOutside = useCallback(() => {\n setVisible(false);\n\n if (onHide) {\n onHide();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useOnClickOutside([ contentRef, triggerRef ], handleClickOutside, currentVisible);\n\n const handleShow = useCallback(() => {\n setVisible(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setVisible(false);\n\n if (onHide) {\n onHide();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleToggle = useCallback(() => setVisible((prevState: boolean) => ! prevState), []);\n\n useEffect(() => {\n setVisible(visible);\n }, [ visible ]);\n\n const popupContent = inline ? (\n <InlinePopup\n mainOffset={mainOffset}\n size={size}\n tone={tone}\n view={view}\n innerRef={contentRef}\n hasTail={hasTail}\n anchor={triggerRef}\n className={cnTooltip(null, { size, view, tone }, className)}\n direction={directions ? directions[0] : undefined}\n visible={currentVisible}\n >\n <div className={cnTooltip('content')}>\n {renderContent({ handleClose })}\n </div>\n </InlinePopup>\n ) : (\n <Popup\n mainOffset={mainOffset}\n size={size}\n tone={tone}\n view={view}\n innerRef={contentRef}\n hasTail={hasTail}\n anchor={triggerRef}\n className={cnTooltip(null, { size, view, tone }, className)}\n directions={directions}\n visible={currentVisible}\n >\n <div className={cnTooltip('content')}>\n {renderContent({ handleClose })}\n </div>\n </Popup>\n );\n\n return inline ? (\n <div className={cnTooltip('wrap')}>\n {\n renderTrigger({ isVisible: currentVisible, handleShow, handleClose, handleToggle, triggerRef })\n }\n {\n currentVisible ? popupContent : null\n }\n </div>\n ) : (\n <Fragment>\n {\n renderTrigger({ isVisible: currentVisible, handleShow, handleClose, handleToggle, triggerRef })\n }\n {\n currentVisible ? popupContent : null\n }\n </Fragment>\n );\n};\n\nexport default Tooltip;\n","import { RefObject, MutableRefObject } from 'react';\n\nexport const mergeRefs = <TElement extends HTMLElement>(\n source?: MutableRefObject<HTMLElement | undefined>,\n ...targets: (MutableRefObject<HTMLElement | undefined> | undefined)[]\n) => {\n if (typeof requestAnimationFrame !== 'undefined') {\n /* eslint-env browser */\n requestAnimationFrame(() => {\n targets.forEach(target => {\n if (source && target) {\n target.current = source.current;\n }\n });\n });\n }\n\n return source as RefObject<TElement>;\n};\n\nexport default mergeRefs;\n","export enum SizeEnum {\n XS = 'xs',\n S = 's',\n M = 'm',\n L = 'l',\n XL = 'xl',\n XXL = 'xxl',\n XXXL = 'xxxl',\n XXXXL = 'xxxxl'\n}\n\nexport type Size = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'xxxl' | 'xxxxl';\n","export enum ToneEnum {\n GREY = 'grey',\n BLUE = 'blue',\n LIGHT = 'light',\n DARK = 'dark',\n PRIMARY = 'primary',\n SECONDARY = 'secondary'\n}\n\nexport type Tone = 'grey' | 'blue' | 'dark' | 'primary' | 'secondary' | 'light';\n","export enum ViewEnum {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n CLEAR = 'clear',\n OUTLINED = 'outlined'\n}\n\nexport type View = 'primary' | 'secondary' | 'clear' | 'outlined';\n","export enum ModeEnum {\n RADIO = 'radio',\n RADIO_CHECK = 'radio-check',\n CHECK = 'check'\n}\n\nexport enum InputModeEnum {\n number = 'number'\n}\n\nexport type Mode = 'radio' | 'radio-check' | 'check';\n"],"names":["SuggestItemTypeEnum","View","InspectionStatusEnum","DeveloperAppLandingType","s","developerId","developerLandingMapper","developerName","DeveloperAppLandingSeoType","origin","developerNameSeo","developerAppLandingMapper","developerAppLandingDefaults","DeveloperAppLandingRoute","SusaninRoute","displayName","metadata","config","pattern","p","this","patternHost","conditions","super","defaults","fromQuery","toQuery","DeveloperLandingType","DeveloperLandingSeoType","developerLandingDefaults","DeveloperLandingRoute","DeveloperType","id","name","region","pageNumber","DeveloperSeoType","developerDefaults","DeveloperRoute","NewBuildingRoute","params","seoParams","regionId","defaultRegion","undefined","Number","strToNum","parsedParams","result","regionParams","translit","String","numToStr","DeveloperSearchType","DeveloperSearchSeoType","developerSearchDefaults","DeveloperSearchRoute","NewBuildingCardCommonParams","commissioningDate","finishingFlat","floorMin","floorMax","floorFirst","floorLast","bathroom","rooms","roomMapper","priceMin","priceMax","priceType","totalAreaRangeMin","totalAreaRangeMax","livingAreaRangeMin","livingAreaRangeMax","kitchenAreaRangeMin","buildingId","pageSize","sort","from","NewBuildingCardCommonSeoParams","newBuildingCardCommonDefaults","NewBuildingOffersSortEnum","fromCommonQuery","Array","isArray","map","toCommonQuery","NewBuildingCardType","subRegion","type","newBuildingTypeMapper","NewBuildingCardSeoType","newBuildingCardDefaults","NewBuildingCardRoute","regionSlugSimple","context","rootRegions","getById","NewBuildingConstructionCommonParams","NewBuildingConstructionCommonSeoParams","NewBuildingConstructionType","NewBuildingConstructionSeoType","newBuildingConstructionDefaults","NewBuildingConstructionRoute","NewBuildingQuizType","NewBuildingQuizSeoType","NewBuildingQuizRoute","ROSSIYA","regionSlugHost","parentId","narrowRegion","regionSlug","getByTranslitName","hostParts","regionSlugPath","countrySlugPath","getSlugFromGeo","countrySlugId","slug","getGeoFromSlug","NewBuildingSearchMapRoute","NewBuildingSearchRoute","commissioningSeo","roomSeo","euroPlanningSeo","hasFinishingSeo","finishingTypeSeo","buildingClassSeo","wallsTypeSeo","floorLastSeo","ceilingHeightSeo","kitchenAreaRangeMinSeo","law214Seo","escrowSeo","armyMortgageSeo","motherCapitalSeo","installmentSeo","closedAreaSeo","conciergeSeo","balconySeo","apartmentsSeo","parkingSeo","flatsSpecialEventsSeo","priceMaxSeo","pricePerMeterMaxSeo","cheapSeo","closeToMetroSeo","metroSeo","rayon","okrug","geoSlugSeo","city","NewBuildingSearchParams","excludeLong","excludeLat","NewBuildingSearchSeoParams","NewBuildingSearchMapTileRoute","WLNewBuildingSearchRoute","seo","parseFloat","commissioning","addressId","metroId","districtId","newBuildingId","transportType","maxMinutes","wallsType","wallsTypeMapper","parking","parkingMapper","floorsTotalMin","floorsTotalMax","floorLastMapper","ceilingHeight","balcony","buildingClass","buildingClassMapper","hasFinishing","finishingMapper","finishingType","finishingTypeMapper","standalone","apartments","apartmentsMapper","concierge","closedArea","guardedArea","accreditedByVTB","law214","escrow","armyMortgage","installment","motherCapital","closedSales","selectedNewBuildingId","flatsSpecialEvents","otherSpecialEvents","miscSpecialEvents","notOnlyM2Pro","geoSlug","mapBounds","bounds","min","x","y","max","polygon","z","showHighlighted","NewBuildingSearchType","euroPlanningMapper","closeToMetroMapper","priceMaxMapper","cheapMapper","priceTypeSeo","pricePerMeterMaxMapper","kitchenAreaRangeMinMapper","ceilingHeightMapper","balconyMapper","conciergeMapper","closedAreaMapper","law214Mapper","escrowMapper","armyMortgageMapper","installmentMapper","motherCapitalMapper","flatsSpecialEventMapper","lx","ly","rx","ry","pol","NewBuildingSearchSeoType","fillGeoSeo","geoIds","isCloseToMetro","length","geoId","cityMapper","getCityMapperByRegion","seoFromTypeOptional","districtMapper","getDistrictMapperByRegion","mskRayonMapper","rayonOrOkrug","addGeo","geoArray","getGeoNumber","geo","searchDefaults","NewBuildingSortEnum","mskCityMapper","spbCityMapper","newBuildingTypes","raw","indexOf","split","year","quarter","quarterNumber","parseInt","quarterMapper","Object","values","CommissioningEnum","includes","commissioningMapper","kitchen","finishingTypeFromHasFinishing","FinishingTypeEnum","sOtdelkoySeoValue","concat","YES","apartmentsOnlySeoStr","IsApartmentsOptionsString","ParkingTypeString","AreaUnitEnum","toIds","mskDistrictIds","Boolean","hasBounds","some","coord","yMapVectorUnpack","metroMapper","getMetroMapperByRegion","kind","seoResult","queryResult","totalSegments","join","finishingTypeDeduplicated","Set","finishingSeoTag","FinishingEnum","slugNumber","slugSource","toString","yMapVectorPack","RegionIdEnum","ret","regionRet","convertParamsToGQLFilters","ClassifiedRoute","byId","bySlug","regGeo","regionMapper","regionIdDefault","createRouterProvider","RouterProvider","useRouter","parkingsMapper","SeoMapper","UNKNOWN","CLOSED","UNDERGROUND","OPEN","livingTenantMapper","CHILDREN_ALLOWED","PETS_ALLOWED","sortOffersMapper","date","timeToMetro","room","floor","totalArea","price","date_asc","timeToMetro_desc","room_desc","floor_desc","totalArea_desc","price_desc","priceSqMeter","priceSqMeter_desc","distanceToCityCenter","updateDate_desc","updateDate","windowsDirectionMapper","BOTH","REAR","FRONT","seoSeg1","seoSeg2","seoSegPrice","geoSlug1","geoSlug2","renovation","renovationMapper","renovationSegment","metroIds","metroSegment","metroBranch","newSegment","newBuildingMapper","newBuilding","bankPledgeOptionsSegment","bankPledgeMapper","bankPledgeOptions","houseCategory","houseCategorySegment","cotedjSegment","roomsInOffer","addresses","geohash","districtIds","newBuildingIds","newBuildingType","newBuildingName","dealType","dealTypeMapper","categoryType","categoryTypeMapper","totalAreaMin","totalAreaMax","landAreaMin","landAreaMax","houseAreaMin","houseAreaMax","bathroomLocation","mortgagePayment","priceMaxSegment","priceUnit","livingAreaMin","livingAreaMax","kitchenAreaMin","kitchenAreaMax","seoSegBuildEpoch","builtYearMin","builtYearMax","last","first","cellHeight","bathroomMapper","bathroomSegment","landStatus","landStatusSegment","heating","gas","water","electricity","sewerage","communications","timeLimit","transport","transportTimeLimit","nearMetroSegment","livingFacility","livingFacilityMapper","furniture","furnitureMapper","livingTenantOptions","utilitiesIncluded","depositType","commisionType","rentPrepayment","rentPrepaymentSegment","walls","wallsMapper","parkings","parkingsSegment","author","authorTypeMapper","userId","authorSegment","sellType","sellTypeMapper","photoOptions","layoutImageOptions","layoutImageMapper","renovationProgram","nearbyOptions","sellerOrganizationName","infrastructure","hasLift","seoMortgageAllowed","seoMortgageAllowedSegment","windowsDirection","buildEpoch","buildEpochMapper","onlineView","selectedOffers","citySegment","segments","isGetEmpty","tagCount","mskMetroBranchMapper","geoSlugs","tile","utm_source","utm_medium","utm_campaign","utm_content","utm_term","DealType","RealtyObjectType","floorArr","areArr","SearchSeoChpuMapper","SeoChpuMapper","extraTagWeight","Map","tagsIntersection","ctx","isFlat","isRent","isHouse","isLand","isApartments","isEuroLayout","Rooms","euroKitchenArea","isLastFloor","isChpuDeposite","renovacziya","evroodnushka","evrodvushka","evrotreshka","malogabaritnaya","apartamenty","cottage","returnParams","reduce","prev","cur","generateFloorMap","generateAreChpuMap","odnoetazhnyj","dvuhetazhnyj","trekhetazhnyj","chpuKeys","keys","chpuMap","PhoneCallType","offerId","PhoneCallSeoType","PhoneCallRoute","e","message","middlewareUrl","sid","uid","oid","dedupeValues","o","key","match","add","unknown","AuthorTypeOptionsWithRealtor","owner","agency","developer","partner","realtor","pit","kvartiru","komnatu","uchastok","dom","usadba","kupit","snyat","new","NewBuilding","second","Renovation","euro","cosmeticheskii","disainerskii","studiya","SellType","secondary_primary","secondary","primary_reassignment","primary","alternative","MONOLITH","BRICK_MONOLITH","BRICK","PANEL","BLOCK","WOOD","INTERNET","WASHING_MACHINE","FRIDGE","DISHWASHER","AIR_CONDITIONER","TV","NO","KITCHEN","ALL","notInPledge","HAS_ANY","stalin","brezhnev","khrushchev","WITHOUT_FINISHING","PRE_FINISHING","FINE","WITH_FURNITURE","studii","FIRST","SECOND","THIRD","FOURTH","FinishingFlatEnum","chistovaya","biznes","BuildingClass","komfort","ekonom","elitnyy","kirpichnye","WallsTypeString","monolitnye","panelnye","blochnye","FloorConstraintsString","sdan","stroitsya","lyuboy","zhk","kvartal","loft","mfk","rezidentsiya","mikroraion","samolet","deshevyye","CeilingHeightString","evrodvushki","evrotreshki","FlatsSpecialEventString","zamoskvoretskaya","solncevskaya","sokolnicheskaya","mck","mskOblCity","balashikha","dubna","aprelevka","bronnitsy","vidnoe","volokolamsk","voskresensk","vysokovsk","golitsyno","dedovsk","dzerzhinskiy","dmitrov","dolgoprudniy","domodedovo","drezna","egorevsk","zhukovskiy","zvenigorod","ivanteevka","istra","kashira","klin","kolomna","korolyov","kotelniki","krasnoarmeysk","krasnogorsk","krasnozavodsk","krasnoznamensk","kubinka","lobnya","lukhovitsy","lytkarino","lyubertsy","mozhaisk","mytischi","noginsk","odintsovo","ozyory","podolsk","protvino","pushkino","puschino","ramenskoe","reutov","ruza","serpukhov","solnechnogorsk","stupino","taldom","fryazino","khimki","khotkovo","chekhov","shatura","schyolkovo","elektrogorsk","elektrostal","yakhroma","mskCity","mskOblCityIds","mskCityIds","mskOblDistrict","mskSpecialDistricts","mskDistrict","mskDistrictMapper","mskOblDistrictIds","mskOblMetroStation","myakinino","mskMetroStation","aeroport","akademicheskaya","alekseevskaya","altufevo","aminevskaya","andronovka","anikeevka","annino","arbatskaya","arbatskaya2","aviamotornaya","aviamotornaya2","avtozavodskaya","avtozavodskaya2","babushkinskaya","bagrationovskaya","bakovka","balakovka","baltiiskaya","barrikadnaya","baumanskaya","begovaya","belokamennaya","belomorskaya","belorusskaya","belorusskaya2","belyaevo","beskudnikovo","bibirevo","bittsa","borisovo","borovitskaya","bratislavskaya","butirskaya","butovo","chekhovskaya","cherkizovskaya","chertanovskaya","chkalovskaya","davidkovo","degunino","depo","dinamo","dmitrovskaya","dmitrovskaya2","dobrininskaya","dolgoprudnaya","domodedovskaya","dostoevskaya","dubrovka","dubrovka2","elektrozavodskaya","fili","fili2","fiztekh","fonvizinskaya","frunzenskaya","govorovo","grazhdanskaya","izmailovo","izmailovskaya","kakhovskaya","kalanchyovskaya","kalitniki","kaluzhskaya","kantemirovskaya","kashirskaya","khlebnikovo","khoroshyovo","khoroshyovskaya","khovrino","kievskaya","kolomenskaya","kommunarka","komsomolskaya","konkovo","koptevo","kosino","kozhukhovskaya","krasnogorskaya","krasnogvardeiskaya","krasnopresnenskaya","krasnoselskaya","krilatskoe","krimskaya","kropotkinskaya","kubanskaya","kuntsevskaya","kuntsevskaya2","kurskaya","kutuzovskaya","kuzminki","lefortovo","lesoparkovaya","lianozovo","lianozovo2","likhobori","lokomotiv","lubyanka","lukhmanovskaya","luzhniki","lyublino","marino","mark","marksistskaya","mayakovskaya","medvedkovo","mendeleevskaya","mezhdunarodnaya","minskaya","mitino","mnyovniki","molodyozhnaya","moskvoreche","nagatinskaya","nagornaya","nakhabino","nekrasovka","nemchinovka","nizhegorodskaya","novatorskaya","novodachnaya","novogireevo","novokhokhlovskaya","novokosino","novokuznetskaya","novoperedelkino","novoslobodskaya","novoyasenevskaya","okruzhnaya","okruzhnaya2","okruzhnaya3","okskaya","oktyabrskaya","olkhovaya","opalikha","orekhovo","ostafevo","otradnoe","ozyornaya","panfilovskaya","partizanskaya","paveletskaya","pavshino","pechatniki","penyagino","pererva","perovo","pervomaiskaya","pikhtino","pionerskaya","planernaya","pokrovskoe","polezhaevskaya","polyanka","novomoskovskaya","prazhskaya","profsoyuznaya","prokshino","proletarskaya","pushkinskaya","ramenki","rasskazovka","rimskaya","rizhskaya","rostokino","rumyantsevo","salarevo","savyolovskaya","savyolovskaya2","seligerskaya","semyonovskaya","serpukhovskaya","setun","sevastopolskaya","shabolovskaya","shcherbinka","shchukinskaya","shchyolkovskaya","shelepikha","sheremetevskaya","shipilovskaya","silikatnaya","skhodnenskaya","skolkovo","smolenskaya","smolenskaya2","sokol","sokolniki","solntsevo","spartak","sportivnaya","stakhanovskaya","streshnevo","strogino","studencheskaya","sukharevskaya","sviblovo","taganskaya","teatralnaya","tekhnopark","tekstilshchiki","terekhovo","testovskaya","timiryazevskaya","timiryazevskaya2","tretyakovskaya","trikotazhnaya","troparyovo","trubnaya","tsaritsino","tsaritsino2","tsska","tulskaya","turgenevskaya","tushinskaya","tushinskaya2","tverskaya","ugreshskaya","universitet","varshavskaya","vdnkh","vikhino","vistavochnaya","vladikino","vnukovo","vodniki","voikovskaya","volokolamskaya","volokolamskaya2","volzhskaya","voroncovskaya","voroncovskaya2","yasenevo","yuzhnaya","zhulebino","zil","zorge","zyablikovo","zyuzino","mskMetroMapper","mskOblMetroIds","mskMetroIds","mskOblRayon","mskRayon","bogorodskoe","golovinskiy","brateevo","filyovskiy_park","taganskiy","meschanskiy","ostankinskiy","cheryomushki","beskudnikovskiy","chertanovo_severnoe","marina_roscha","khoroshyovskiy","veshnyaki","vostochnoe_izmailovo","savyolki","yuzhnoe_medvedkovo","preobrazhenskoe","basmannyi","severnoe_izmailovo","presnenskiy","severnoe_tushino","tekstilschiki","severnoe_medvedkovo","babushkinskiy","alekseevskiy","akademicheskiy","chertanovo_yuzhnoe","severnoe_butovo","yuzhnoe_butovo","altufevskiy","biryulyovo_vostochnoe","vostochnyi","kurkino","losinoostrovskiy","kotlovka","lomonosovskiy","molzhaninovskiy","nizhegorodskiy","matushkino","staroe_kryukovo","metrogorodok","krasnoselskiy","khamovniki","zamoskvoreche","prospekt_vernadskogo","kuntsevo","sokolinaya_gora","yakimanka","schukino","ryazanskiy","gagarinskiy","savyolovskiy","timiryazevskiy","biryulyovo_zapadnoe","golyanovo","dmitrovskiy","donskoi","marfino","mozhaiskiy","kryukovo","silino","arbat","tverskoi","danilovskiy","levoberezhnyi","voikovskiy","dorogomilovo","yuzhnoe_tushino","yuzhnoportovyi","obruchevskiy","tyopliy_stan","nagornyi","chertanovo_tsentralnoe","zapadnoe_degunino","butyrskiy","begovoi","vostochnoe_degunino","ivanovskoe","kapotnya","severnyi","yaroslavskiy","mskOblRayonIds","mskRayonIds","ekbMetroMapper","uralmash","geologicheskaya","botanicheskaya","mashinostroitelei","uralskaya","kznMetroMapper","aviastroitelnaya","yashlek","ametevo","gorki","dubravnaya","kremlyovskaya","nskMetroMapper","sibirskaya","gagarinskaya","zaeltsovskaya","samaraMetroMapper","bezimyanka","moskovskaya","kirovskaya","yungorodok","rossiiskaya","pobeda","sovetskaya","alabinskaya","nnMetroMapper","gorkovskaya","burevestnik","leninskaya","burnakovskaya","kanavinskaya","strelka","zarechnaya","moskva","isMskWide","isSpbWide","spbMetroMapper","regionMetroSlugMapper","spbDistrictMapper","lenOblCity","spbInnerTowns","kolpino","kronshtadt","zelenogorsk","sestroretsk","lomonosov","petergof","pavlovsk","pushkin","spbCity","pargolovo","levashovo","pontonniy","sapyorniy","metallostroi","beloostrov","komarovo","molodyozhnoe","pesochniy","repino","serovo","smolyachkovo","solnechnoe","ushkovo","strelna","lisiy_nos","shushary","aleksandrovskaya","tyarlevo","lenOblCityIds","spbCityIds","lenOblDistrict","boksitogorskii","volosovskii","volkhovskii","vsevolozhskii","viborgskii_lo","gatchinskii","kingiseppskii","kirishskii","kirovskii_lo","lodeinopolskii","lomonosovskii","luzhskii","podporozhskii","priozerskii","slantsevskii","sosnovoborskii","tikhvinskii","tosnenskii","spbDistrict","admiralteiskii","vasileostrovskii","viborgskii","kalininskii","kirovskii","kolpinskii","krasnogvardeiskii","krasnoselskii","kronshtadtskii","kurortnii","moskovskii","nevskii","petrogradskii","petrodvortsovii","primorskii","pushkinskii","frunzenskii","tsentralnii","lenOblDistrictIds","spbDistrictIds","lenOblMetroStation","devyatkino","spbMetroStation","avtovo","admiralteiskaya","bukharestskaya","vasileostrovskaya","vladimirskaya","volkovskaya","viborgskaya","dunaiskaya","elizarovskaya","zvenigorodskaya","zvyozdnaya","kupchino","ladozhskaya","lesnaya","lomonosovskaya","narvskaya","novokrestovskaya","zenit","novocherkasskaya","obukhovo","ozerki","parnas","petrogradskaya","politekhnicheskaya","primorskaya","ribatskoe","sadovaya","spasskaya","udelnaya","chernishevskaya","elektrosila","putylovskaya","lenOblMetroIds","spbMetroIds","OfferSeoType","slugAndId","offerDefaults","slugRegExp","RegExp","OfferRoute","extraPatterns","groups","SchemaTypeError","deal","house","land","studio","multiroom","openplan","BuildEpochSeoMatcher","mapCached","entries","stalinka","khrushchevka","brezhnevka","matchAll","_isFirstMatch","seg","variants","isSegAlreadyPushed","push","$","PriceSeoMatcher","msk","spb","province","deshevye","nedorogo","elitnye","dachu","find","reg","regionTranslit","fullName","label","value","getGtmLabel","window","Sentry","isPresent","t","titleSorter","a","b","title","CopyObject","copy","changed","next","constructor","mutation","graphql","useCallbackEmail","gql","useGqlContext","useCallback","vars","opts","client","AddressStore","items","get","getGql","__typename","mainName","TipTypeEnum","item","set","remove","delete","DistrictStore","ids","_sorted","byRegionDistricts","titleShort","has","sortedByTitle","filter","byRegion","filtered","addDistrict","district","isEmpty","GeoKind","Error","shortDisplayName","locativeName","locativeDisplayName","cityInTitle","word","locativeWord","startsWith","substring","endsWith","cityIn","textPrefixIn","narrowRegionId","isIntracity","geoProtoDistrict","RouteStore","route","body","color","colorHex","geoProtoRoute","MetroStore","routes","_entities","_noInterchanged","entities","allRoutesColors","allRoutesColorsList","sorted","station","createMetroStation","findRouteByStations","stationIds","groupedByRoute","idSet","fullGroups","group","equalStations","stations","stationId","stationsMap","stationGroup","groupedByAlphabet","noInterchanged","letter","aggregate","charCodeAt","forEach","processed","interchangedStations","interchanged","metroStationNoIntercharged","routeId","replace","metro","interchangeStationsIds","interchangeStationsIdsList","coordinates","geoProtoMetroStationRaw","stationMap","routeMap","processedStations","stationRaw","interchangedStation","geoKindFromGqlKind","GeoBaseStore","districts","store","lines","locative","line","geoBaseStoreFromGql","address","getByIds","useGeoTips","qv","filters","geoFilter","Filters","developerFilter","addressIds","React","metros","newBuildings","developers","dataLayerPush","data","dataLayer","googleOptimizeConfigDefault","GoogleOptimizeContext","GoogleOptimizeProvider","children","Provider","GtmOnVisibleContext","it","IntersectionTrigger","threshold","useGtmOnVisibleContext","useGtmOnVisible","containerRef","onVisible","el","current","imageLazyOptionsDefault","defaultMockSrc","isBrowserSupportsLazy","HTMLImageElement","prototype","rootMargin","ImageLazyObserverContext","useImageLazyObserver","ImageLazyObserverProvider","rootRef","parent","useIntersectionTrigger","useImageLazy","loadingLazy","ref","src","srcSet","mockSrc","ll","loading","mock","realRef","setCount","imgRef","extRef","subRef","real","cn","classname","ImageLazySeo","dataSet","noLocalItemScope","itemProp","itemScope","width","height","srcWidth","srcHeight","originPath","metaName","className","imgClassName","imgProps","toLowerCase","getSrcSet","useImageLazySrcSet","calc","itemType","crossOrigin","content","defaultData","defaultProvider","img","ImageLazySrcSetContext","useClImageLazySrcSetUrl","baseUrl","scale","isHiDpi","URLSearchParams","location","search","ImageLazySrcSetProvide","scales","getUrl","url","imageSliderActiveItemRestoreItem","scrollIntoView","imageSliderCrossSwipeAnimateDefault","isVertical","touchShift","shiftAbs","Math","abs","dims","getBoundingClientRect","right","left","bottom","top","opacity","style","transform","toFixed","ImageSlider","crossSwipeAnimate","itemClassName","containerCrossSwipeEnabled","onCrossSwipeFwd","onCrossSwipeBack","restoreItemKey","onActiveItem","noOverflow","itemRefs","setItem","useImageSliderItems","restoreItem","savedRef","onScroll","parentRect","parentFirst","parentLast","parentCenter","round","targetKey","targetChild","child","childRect","childFirst","childLast","preventDefault","useImageSliderActiveItem","touchPosStartRef","touchShiftEndRef","getItemElement","onTouchStart","event","touches","clientX","clientY","onTouchEnd","onTouchMove","shift","isActionTriggered","useImageSliderCross","vertical","overflow","index","bind","deferQueue","deferTick","deferQueueRun","cb","pop","props","ioCache","elementOptions","isNative","IntersectionObserver","io","root","observerCallback","update","disconnect","size","observer","entry","target","isIntersecting","onInvisible","unobserve","clear","Promise","resolve","then","observe","visibleRoot","setVisibleRoot","itRef","NewBuildingAnalytics","cnCustomTypography","CustomTypography","level","tag","bold","lineThrough","noWrap","align","classNameProp","rest","Component","useMemo","icons","FOOT","fill","xmlns","d","fillOpacity","PUBLIC_TRANSPORT","fillRule","clipRule","IconTransport","Icon","ImageBanner","targetLink","image","view","gtm","gtmClickData","gtmShowData","gtmAdditionalClickData","useClassifiedOfferDataLayerPush","handleClick","href","onClick","alt","cnList","List","separator","layout","ListItem","dataGtm","placementId","format","onShow","defaultProps","desktopImageUrl","urls","MetroRoute","onDarkBackground","withoutTransport","searchUrl","timeMinutes","hasSearchUrl","backgroundColor","text","variant","isUrl","DEFAULT_BUTTON_TEXT","SNIPPET_PHONE_QUERY","SnippetPhone","onPhoneEventPush","phoneParams","render","isMobile","onMap","calltouchId","buttonProps","useState","formattedNumber","isReplaceable","phoneFromGql","setPhoneFromGql","originalPhone","setOriginalPhone","buttonData","setButtonData","phoneParamsRef","useRef","useEffect","isEqual","load","useManualGql","makeCall","phoneURL","open","prevState","newBuildingPhone","original","useCalltouchReplacement","ctId","calltouchPhone","hasTriedReplace","replaceError","phone","formatPhone","skipSymbols","separateLast","replaceable","replaced","commonButtonProps","DATA_GTM","fullWidth","FilterCollapser","activeCount","collapsed","resetRaw","reset","toggle","stopPropagation","Size","useFilterCollapser","initCollapsed","clearSelected","setCollapsed","toggleCollapsed","close","SnippetContext","SnippetProviderContext","isOpenMap","state","setState","toggleMap","openMap","closeMap","DeveloperToRegionMap","mortgage","getDeveloperBannerGtmData","developerWithPromoName","page_type","pageType","commonFields","keySpecProject","theme","ensureArray","ensureNumericArray","deserializers","handler","CommissioningFilter","FinishingTypeFilter","RegionFilter","RoomFilter","PriceFilter","Area","to","TransportLimitFilter","TimeLimit","TransportType","parsedMetroIds","parsedDistrictIds","parsedAddressIds","parsedNewBuildingIds","GeoFilter","AreaFilter","LivingAreaFilter","KitchenAreaFilter","FloorFilter","FloorConstraints","CellHeightFilter","CeilingHeight","BathroomFilter","Bathroom","BalconyFilter","BalconyOptions","ParkingFilter","ParkingType","WallsTypeFilter","WallsType","ApartmentFilter","IsApartments","PositionFilter","Position","SafetyFilter","Safety","DeveloperFilter","FloorsTotalFilter","BuildingClassFilter","AccreditationFilter","Accreditation","NewBuildingDealFilter","NewBuildingDeal","PaymentTypeFilter","PaymentType","CommissioningListFilter","BuildingsFilter","FinishingFlatFilter","ClosedSalesFilter","ShowHighlightedFilter","MapBoundsFilter","SelectedNewBuildingFilter","FlatsSpecialEventsFilter","FlatsSpecialEvents","OtherSpecialEventsFilter","OtherSpecialEvents","MiscSpecialEventsFilter","MiscSpecialEvents","NotOnlyM2ProFilter","newbuildingFilterDeserializer","deserialize","parsedQuery","filterName","hasFilter","parsedObject","NewbuildingFilterCollection","FilterCollection","rebuild","_filters","newbuildingFilterFactory","create","getInitialFilters","initialFilters","getInitialAdditionalFilters","resetGeo","getFilters","getInitialOfferBuildingsFilters","getInitialOfferFilters","serializers","val","range","hasBalcony","isApartment","position","safety","accreditation","commissioningList","buildings","includingClosedSales","shouldShowHighlighted","addValue","destructObjects","filteredValue","subValues","subKey","newbuildingFilterSerializer","serialize","stringValue","enumValue","METER","FloorConstraintsEnum","ONLY","EXCLUDE","RoomsEnum","STUDIO","ROOM_1","ROOM_2","ROOM_3","ROOM_4","ROOM_5_AND_MORE","OPEN_PLAN","TransportTypeEnum","TimeLimitEnum","MAX_5_MINUTES","MAX_10_MINUTES","MAX_15_MINUTES","MAX_20_MINUTES","MAX_25_MINUTES","MAX_30_MINUTES","MAX_40_MINUTES","MAX_50_MINUTES","MAX_60_MINUTES","CeilingHeightEnum","FROM_2_5","FROM_2_7","FROM_3","FROM_4","BathroomEnum","COMBINED","PARTED","BalconyOptionsEnum","ParkingTypeEnum","WallsTypeEnum","IsApartmentsEnum","NO_APARTMENTS","APARTMENTS_ONLY","PositionEnum","SafetyEnum","BuildingClassEnum","ECONOMY","COMFORT","COMFORT_PLUS","BUSINESS","ELITE","NewBuildingDealEnum","AccreditationEnum","PaymentTypeEnum","FlatsSpecialEventEnum","OtherSpecialEventEnum","OtherSpecialEventString","MiscSpecialEventEnum","MiscSpecialEventString","i","convertDynamicReplacementError","v","DynamicReplacementErrorEnum","replacementData","setReplacementData","longRequestTimeout","setLongRequestTimeout","replacementDataRef","setFailedReplacementData","launchDynamicReplacement","modId","subpoolName","setTimeout","ct","callback","success","phoneNumber","slice","errorType","subPoolNames","clearTimeout","CalltouchError","JSON","stringify","cause","callTouchId","code","toJSON","calltouchReplacementFetch","async","addCallTouchScript","reject","timer","newPhone","VTB_IPOTEKA_LINK","STATIC_URL","NO_PHOTO_SRC","NO_PHOTO_SRC_SET","CURRENT_YEAR","Date","getFullYear","M2ProEnum","M2PRO_OPTIONS","All","buttonLabel","M2Pro","SORT_OPTIONS","OFFERS_SORT_OPTIONS","developerLandingDataGTM","isRegionSection","rootRegion","buildRegionMap","regions","buildFlatRegion","isParent","RootRegions","regionsIdMap","regionsFlat","slugs","SlugMapper","regionsEnumeration","newSlug","legacySlugToNew","getFlatList","getRegions","getRegionsLikeOptions","options","addGeoSlug","getGeoSlug","ClassifiedAnalytics","AnalyticsFromTags","contextDefault","ownerId","ClassifiedOfferGtmContext","offerRegionToMortgage","boRegion","backofficeRegionRepository","OfferYMapDesktopSwitchContainer","dark","OfferYMapDesktopSwitchLink","active","icon","dataTest","onClickRaw","OfferYMapDesktopSwitch","listUrl","mapUrl","OfferYMapDesktop","errorCatcherWrap","tileUrl","tipsVisible","tipsExpanded","handleClickList","setBounds","setPolygon","selectedArea","displaySwitcher","displayArea","isDrawAreaVisible","controlAlign","toggleDrawArea","altLayout","hasSidebar","saveSearch","showInfrastructure","setShowInfrastructure","renderCustomerFeedback","renderMortgageButton","margin","moving","setMoving","trigger","topLeft","bottomRight","isScrollZoomEnabled","onMouseUp","onMouseDown","hAlign","vAlign","hasSave","checked","onChange","shadow","handleDrawEnd","YMapClickPane","resetSelected","useYMapPane","events","win","SeoSearchUtm","storage","utmParams","hasValues","getItem","parse","localStorage","LandStatus","HouseType","RegionEnum","CategoryType","PriceUnitEnum","NewBuildingTypeEnum","SortEnum","NewBuildingSortingEnum","BuildingStatusEnum","QuarterEnum","NewBuildingClassEnum","GeoKindEnum","ImageAttributesTypeEnum","initCookieModalHack","cookieName","cookiesRejectedLSKey","styleId","userAuthorizationStateStyleId","document","querySelector","userAuthorizationStateStyle","user","__INITIAL_STATE__","userStore","styleTextNode","userAuthorizationStateStyleTextNode","__shouldUseChatStub","hostname","__isCookieModalVisible","cookie","decodeURIComponent","__isUserAuthorized","isAuthenticated","__hideCookiesModal","hideCookiesModal","updateCss","css","textContent","createTextNode","appendChild","updateUserInfoCss","run","err","console","error","DefaultBadge","textClassName","GalleryBadge","NewBuildingClassBadge","newBuildingClass","class","noBottomMargin","PreferentialMortgageBadge","Badge","before","IconPercent","rightIndent","anchorRef","BadgeBox","MortgageOfferIcon","pseudoCount","offer","staticPath","useStaticPathConfig","mul","imgUrl","iconMortgageFamily","iconMortgagePreferential","WorkingHours","mobile","workingHoursRange","setStartHoursRange","setEndHoursRange","startHourValues","endHourValues","native","start","disabled","selected","end","CalltouchCallbackError","sendCalltouchCallbackRequest","routeKey","fields","hours","tags","unitId","scheduleTime","resultDate","setHours","setMinutes","setSeconds","untilDate","setDate","getDate","toLocaleString","timeZone","time","reverse","getScheduleTime","res","rej","requestCallback","makeRequestCallback","ctw","createRequest","responseData","DEFAULT_REQUEST_ERROR_MESSAGE","INIT_REQUEST_DATA","status","STATUS","errorMessage","CallbackModal","startHour","endHour","offerLink","extra","subjectExtra","emailSender","gtmSendClick","onSendEventPush","gtmShowModal","renderTrigger","btnWrapperClass","callbackUnitId","newBuildingRanking","isNewBuilding","onClose","enableInnerText360","hasNoText","withoutIconOnButton","buttonSize","useWorkingHours","rawWorkingHoursRange","initialPhone","useInitialPhone","setPhoneNumber","requestData","setRequestData","useToggleValue","handleToggleModal","handleToggleTogVal","isOpenModal","isToggleValue","isFirstShowModal","sendGtmFirstShowModal","sendCallBackRequest","pathUniqSuffix","useCallbackRequest","sendRequest","makeSendCallBackRequest","isCallbackRequestCreated","normalizeCallbackUrl","createEmailCallback","emailMessageId","isLimitExceeded","callbackRequestId","REQUEST_THROTTLE_TIMEOUT","REQUEST_THROTTLE_COUNT","catch","isResolvedData","applicationContext","useApplicationContext","isClassifiedApp","ApplicationIdEnum","buttons","zIndex","opened","swipeToClose","scrollable","skipParenthesis","hasClear","inputMode","CoreSvgSpriteIcon","viewBoxWidth","viewBoxHeight","otherProps","viewBox","OpenButtonBlue","handleCloseOpenBtn","handleOpen","rounded","OpenButtonBlueBanner","isVisible","setVisible","hasTimerWorked","setTimerWorked","footerElement","getElementById","viewportHeight","innerHeight","handleScroll","footerTop","throttledHandleScroll","throttle","addEventListener","removeEventListener","timeoutId","OpenButtonDefault","isSticky","CustomerFeedbackOpenButton","applicationId","rect","visibility","throttleHandleScroll","customerFeedbackMutation","initialFormState","usability","details","customText","infoFullness","extraFeatures","searchSuccess","comment","contact","ACTIONS","reducer","action","USABILITY_UPDATE","payload","USABILITY_DETAILS_UPDATE","isCheck","USABILITY_DETAILS_RESET","USABILITY_CUSTOM_TEXT_UPDATE","INFO_FULLNESS_UPDATE","INFO_FULLNESS_DETAILS_UPDATE","INFO_FULLNESS_DETAILS_RESET","INFO_FULLNESS_CUSTOM_TEXT_UPDATE","EXTRA_FEATURES_UPDATE","EXTRA_FEATURES_RESET","SEARCH_SUCCESS_UPDATE","COMMENT_UPDATE","CONTACT_UPDATE","SET_INITIAL_FORM_DATA","QUESTION","FeedbackOption","USABILITY_OPTIONS","INFO_FULLNESS_OPTIONS","SEARCH_SUCCESS_OPTIONS","UsabilityDetail","InfoFullnessDetail","ExtraFeature","USABILITY_DETAILS_OPTIONS","LACK_FILTER","DIFFICULTLY","FEW_OFFERS","INACCURATE_SEARCH","SLOW_LOADING","OTHER","INFO_FULLNESS_DETAILS_OPTIONS","STREET_PANORAMA","AREA_GENERAL_PLAN","PARKING_SCHEME","MORE_PHOTO","PROJECT_BOOKLETS","EXTRA_FEATURES_OPTIONS","WINDOW_VIEW","FLOOR_PLAN","FINISHING_TYPE","REPAIR_COST","VIRTUAL_TOURS","FURNITURE_PLAN","ERROR_MESSAGE","buildCustomerFeedbackVars","usabilityText","infoFullnessText","rating","CustomerFeedbackModalNewBuildings","modalIsOpen","handleCloseModalExternal","handleCloseModal","handleFinishedFeedback","disableFeedbackReappearance","useReducer","dispatch","requestStatus","setRequestStatus","sendCustomerFeedback","useSendCustomerFeedback","handleSendCustomerFeedback","alert","SuccessModalContent","PrimaryModalContent","isLoading","radio","placeholder","rows","isUsabilityDetailsModalOpen","setUsabilityDetailsModalOpen","isInfoFullnessModalOpen","setInfoFullnessModalOpen","isExtraFeaturesModalOpen","setExtraFeaturesModalOpen","handleOpenUsabilityDetailsModal","handleCloseUsabilityDetailsModal","handleOpenInfoFullnessModal","handleCloseInfoFullnessModal","handleOpenExtraFeaturesModal","handleCloseExtraFeaturesModal","UsabilityDetailsModal","isOpen","handleClose","InfoFullnessModal","ExtraFeaturesModal","extraFeaturesSelectedText","mode","buildSurveyLink","userIdQuery","yMetricaId","CustomerFeedbackAnketologModal","auth","useM2AuthContext","cookies","useCookies","link","survey","setSurvey","CustomerFeedbackModal","useKeyCancel","onCancel","handlers","Escape","onKeyUp","CL_LOCAL_STORAGE_KEY","NB_LOCAL_STORAGE_KEY","LOCAL_STORAGE_KEY_MAP","CustomerFeedback","modalOpenEvent","setModalIsOpen","openBtnIsVisible","setOpenBtnIsVisible","handleOpenModal","currentDate","lastOpening","dateToShowBtn","useCustomerFeedbackExternalState","SPB_CENTER_DISTRICTS","SPBCenterDistricts","selectedDistricts","every","selectSPBCenterDistricts","diff","deselected","NEW_MOSCOW_DISTRICT","EXCEPT_NEW_MOSCOW_DISTRICTS","NewMoscowDistricts","isNewMoscowSelected","isExceptNewMoscowSelected","intersectExpectNewMoscowDistricts","selectNewMoscowDistricts","selectExceptNewMoscowDistricts","DistrictControl","districtsSelectButton","BasicErrorContext","setError","useBasicError","BasicErrorProvider","closeModal","modal","UseAuthClosedError","UseAuthError","closeOnOverlayClick","favoritesUrl","useLkLinks","isOpenLimitModal","FavoriteModalsContext","useFavoritesModal","FavoritesModalProvider","setParentError","setChildError","downloadOfferPdf","form","createElement","method","submit","ClassifiedFilterCollection","getDealTypeFilter","getCategoryTypeFilter","getPriceFilter","getRegionFilter","getNewBuildingFilter","getMapBoundsFilter","getMortgagePurpose","isActiveFilterHouseAllowedMortgage","MortgagePurpose","getSellerOrganizationName","categories","category","HouseCategory","isOnlySecond","isOnlyNewBuildings","isFlatFilterActive","isLandFilterActive","isHouseFilterActive","isRoomFilterActive","isRentFilterActive","isSellFilterActive","isPricePerAllSquare","AreaUnit","isPricePerMeterSquare","isMortgagePayment","isRegionMsk","isRegionMskMo","isRegionMo","isRegionMskOrMo","isRegionSpb","isRegionSpbLO","isRegionLo","isRegionSpbOrLo","isNewBuildingShown","isBankPledgeOptionActive","isSellFlatFilterActive","isFlatOrRoomFilterActive","isFloorTotalFilterShownNotHouse","isLandOrHouseFilterActive","isSellRoomFilterActive","isSellFlatOrRoomFilterActive","isWindowsDirectionFilterShownInRent","isRentFlatOrRoomFilterActive","hasMetroInRegion","regionsWithMetroEnumeration","isRenovationProgramFilterActive","isNearbySchoolFilterActive","isOnlineViewFilterActive","filterCreator","DealTypeFilter","CategoryTypeFilter","MortgagePaymentFilter","YearBuildingFilter","RenovationFilter","NewBuildingFilter","NewBuildingDataFilter","AuthorFilter","SellTypeFilter","InfrastructureFilter","PhotoOptionsFilter","LayoutImageOptionsFilter","LivingFacilityFilter","FurnitureFilter","LivingTenantOptionFilter","RentPrepaymentFilter","RentConditionsFilter","RoomsInOfferFilter","LandStatusFilter","LandAreaFilter","SupplyOptionsFilter","HouseCategoryFilter","HouseAreaFilter","HeatingFilter","BankPledgeOptionsFilter","SeoMortgageAllowedFilter","WindowsDirectionFilter","NearbySchoolFilter","RenovationProgramFilter","SellerOrganizationNameFilter","BuildEpochFilter","OnlineViewFilter","FinishingFilter","sellFlatMetadata","filterIds","persistIds","rentFlatMetadata","sellLandMetadata","sellHouseMetadata","sellRoomMetadata","rentRoomMetadata","rentHouseMetadata","createOrUpdateFilters","getRelevantFilterMetadata","isChangeSegment","filterList","newFilter","gettingFilter","filterMap","dealTypeFilter","realtyTypeFilter","realtyType","getAdditionalFilterIds","exceptIds","clearAdditionalFilters","favoritesMutation","useFavoritesMutationSafe","authScheduler","favoritesMutationCb","execute","fe","editFavoritePersonal2","firstError","BaseError","useFavoritesMutation","register","argsById","args","arg","history","favoritedIds","useRefState","initialState","deps","refresh","setAll","newState","useFavoritesButtonState","isFavoriteInitial","isFavorite","noteTextInitial","eventAddId","organizationName","forceFavoriteUpdate","isProf","isProfessional","currentRoleType","favoritesMutationSafe","isSaving","setIsSaving","pendingArgs","favorite","noteText","favoriteString","sessionStorage","depsObj","depsRef","updateFavorite","req","favoriteToggle","isNoteEditing","setNoteEditing","noteEditOpen","noteEditClose","handleDownloadPdf","noteSave","note","finally","noteDelete","setIsFavorite","query","FooterMenuItemComponent","path","useGql","footer","rawMiddleLinks","middleLinks","downloadAppQrCode","socialLinks","buildLink","absoluteUrl","cdn","topLinks","links","column","middle","menuItemComponent","directions","directionAlias","up","down","createPopper","popperGenerator","defaultModifiers","preventOverflow","offsetModifier","arrowModifier","hideModifier","arrow","padding","offset","adaptiveDirection","$container","direction","enabled","phase","fn","placement","$control","$tooltip","box","getElementSize","getWindowSize","control","tooltip","cleft","cright","ctop","cbottom","xmin","xmax","ymin","ymax","controlWithin","possibleDirections","realDirection","dir","fit","elements","reference","popper","defaultContainer","usePopper","container","triggerElement","hide","popperRefs","onClickOutside","refs","isEnabled","listener","contains","containerElement","init","tooltipElement","destroy","modifiers","boundary","SuggestPopup","popupElement","createPortal","offsetWidth","TYPE_MAP","SuggestItemMetro","SuggestItemAddress","SuggestItemDistrict","SuggestItemNewBuilding","SuggestItemDeveloper","QUERY","mskGeoIds","mskOblGeoIds","spbGeoIds","lenOblGeoIds","correctAndBroadenRegionId","currentRegionId","GeoSuggest","rootRegionsApp","RootRegionsApplicationEnum","onGeoChange","renderInput","onInputToggleFocus","autoFocus","borderOut","listBorderOut","showNewBuildingsGroup","startWithNewBuildings","placeholderWithNewBuildings","limit","suggestTypes","spySuggest","suggestionsByGroup","suggestions","setSuggestions","debouncedSuggest","useDebouncedCallback","userRegionId","suggest","groupBy","groupedItems","setSuggestion","suggestion","newSuggestion","correctSuggestion","newRegionId","renderList","focusedIndex","realIndex","ent","currentIndex","handleItemMouseDown","highlight","onMouseEnter","handleItemMouseEnter","scope","Fragment","metroStation","MetroMark","colors","Highlight","renderSuggestItem","Suggest","inputSize","show","suggestionState","renderEmptyList","emptyText","onSelect","clearOnSelect","fetchSuggestions","cnMetroMark","POSSIBLE_ACTIVE_PARTNERS_SET","headerQuery","useHeaderLoader","useGql2Loader","useHeaderFetcher","cachePrefix","authTrack","developerPromoRegionId","isFullWidth","isBordered","dataRaw","headerLoader","dataRef","router","developerWithPromoNameByRegion","resultPartner","getDeveloperPromoName","partners","fromEntries","header","onPartnerClick","partnerName","dataObj","section","currentRole","dropdownMenu","dropDownItem","subDropdownItem","isColored","cdnUrl","loginPaths","pathname","activePartner","authorizedItems","sidebar","roleType","logoutPath","encodeURIComponent","currentUrl","personalButtons","today","currentMonthStart","UTC","getMonth","nextMonthEnd","seoLdEventScript","actionName","actionNamePrefix","imageUrl","description","startDate","endDate","latitude","longitude","organizer","obj","toISOString","streetAddress","addressLocality","addressRegion","performer","Image","refImg","Tag","attrs","backgroundImage","onload","onerror","onLoad","onLoadVerticalImage","onError","MinimalBanksMortgageEconomy","underline","dotted","useTooltip","registerControl","PROPERTY_COST_MIN","PROPERTY_COST_MAX","PROPERTY_COST_STEP","OWN_AMOUNT_STEP","TERM_MIN","TERM_MAX","calculateFactoredRange","relativeValue","minFactor","maxFactor","minRelativeValue","maxRelativeValue","correctRelativeValue","getRangedValue","calculateOwnAmount","factor","useBankMortgageForm","ownAmountFromPropertyCost","formState","setFormState","calculatedFormValues","propertyCost","ownAmountMin","ownAmountMax","percent","ownAmount","step","labelFrom","formatNumber","labelTo","term","handleFieldChange","isNaN","formErrors","MinimalBanksMortgageOffersQuery","useMinimalBanksMortgageOffersLoader","response","useMinimalBanksMortgageOffersFetcher","useMinimalBanksMortgageOffersSliced","purpose","isPreferentialNbCondition","defaultVisibleOffers","formData","setFormDataRaw","isFormChangedRef","wrapperSetFormDataRaw","setFormData","fakeLoadingRaw","setFakeLoading","minimalBanksMortgageOffersLoad","isPreferential","errors","offersFull","minimalBanksMortgageOffers","offers","bestMortgageOffer","mortgage2BestOfferFromOffers","fakeLoading","handle","totalCost","totalCostFormatted","formatPrice","displayCurrency","noFractional","currency","Currency","offersOrMocks","fakeOffers","useMinimalBanksMortgageEconomy","isFormChanged","Source","UNKNOWN_SOURCE","WEB_LK","MOBILE_APP","BANKI_RU","COMFORT_SEARCH_M2","SRAVNI_RU","WEB_LANDING","NOVOSTROIKY","ZBS","MortgageAppSourceContext","useMortgageAppSource","MortgageAppSourceProvider","source","MortgageGovernmentDisclaimer","isAccent","isLongDescr","descriptionText","mainText","isImportant","splitOnRows","accent","MortgageGovernmentDisclaimerModal","onSuccess","additionalPrograms","withoutAccent","btnText","closable","inner","desc","MortgagePurposeEnum","defaultBanksTotal","defaultMortgageRateNbFormatted","formatLocaleNumber","defaultMortgageRateSecondFormatted","declensionYear","declensionByNumber","declensionHour","declensionMinute","minutes","declensionBankNominative","banksTotal","declensionBankGenitive","MortgageField","gap","titleProps","descriptionProps","resetFont","minimalBanksMortgageUrlCreate","initialSource","normalize","hash","fullUrl","Mortgage2FieldControls","Mortgage2FieldDescription","Mortgage2FieldTitle","Mortgage2Field","space","titleSize","titleAccent","descriptionAccent","Mortgage2FieldPercent","minimalPercentOld","minimalPercent","isFrom","MortgageContactFields","domain","showCallbackHours","sendQueryOnEnter","onBlur","setNameTouched","onKeyPress","nameInputValid","setName","isFormSyncing","setPhoneTouched","phoneInputValid","setPhone","Mortgage2IconWrap","isLandscapeOrientation","mortgage2ContactsFormSendMutation","useMortgage2ContactsFormSend","getSubjectAppName","appId","getRealtyObjectTypeGql","RealtyObjectEnum","offerUrl","mortgage2ParamsFromClasified","estimatedPriceByRegion","CurrencyEnum","getTotalPrice","estimatePrice","mortgageRegionId","Mortgage2StarterModal","isDefaultSelectedOffer","showMoreBankIcons","initialGovernmentMortgage","governmentMortgage","isNewVibe","alwaysFromWord","selectedMortgageOffer","mortgageOffers","isPreferentialOffer","MortgageOfferType","userInfo","useUserDetailsLoader","userInfoLoad","getGovernmentMortgage","useMortgage2Request","userDetails","userProfile","person","isFirstOpen","withoutShowContainer","gtmShowId","isModalOpened","setIsModalOpened","banksIcons","bankId","isTitlePercentAccent","shouldVTBDiscountLogic","VTB_ID","fromWord","default","payment","renderFieldNodes","minimalPaymentDiscountFormatted","minimalPaymentFormatted","propertyCostFormatted","realtyTypeFormattedLocative","ownAmountFormatted","banksInfo","timeFromBanksFormatted","textVariant","sendQuery","withoutAuth","isFormSended","Mortgage2SuccessContent","subtitle","withoutGridWrapper","upperContent","gridContent","xs","m","Mortgage2IconSuccess","cols","acc","minimalPaymentItem","minimalPaymentDiscount","minimalPayment","minimalPaymentAcc","textVariants","mortgageBannerTextVariantDefault","random","responseTimeVariants","fieldText","mortgageBannerMinutesVariantDefault","showPreferential","gtmSendId","gtmSendData","mortgageBannerMinutesVariant","mortgageBannerTextVariant","locationPlacement","withoutForm","discounts","mortgage2ContactsFormSend","useMortgage2UserForm","setFormAllTouched","setFormSended","setFormIsSending","setFormResetSendingsFields","isNameValid","isNameRequired","isPhoneValid","minimalPercentDefault","offerForPercent","minimalPercentWithDiscount","minimalPercentDiscount","waitAuth","userDetailsFetcher","useUserDetailsFetcher","userFioPhone","updateUserDetails","nameArr","surname","patronymic","primaryPhone","number","isClApp","isNbApp","isZbsApp","sourceMortgage","utm","resolveResultPromise","place","minimalBanksMortgageUrl","mobilePhone","fio","assign","URL","inputs","searchParams","k","innerHTML","windowOpen","rejectedResultPromise","optionalMortgage2ContactsFormSend","userDataFromPromise","list","subject","startCallbackHour","endCallbackHour","withGA","withoutBackofficeEmail","optionalWaitAuth","authInfo","openOrAuth","continueAfterLogin","dataUserDetails","preparedUserDetails","responseTimeFormatted","responseDescriptionFormatted","banksTotalFormattedGenitive","isFormSending","sendingError","isPhoneTouched","isNameTouched","Mortgage2ConsultModal","sendGtmId","userDetailsLoad","MortgageOfferSkeleton","BankMortgageOffers","gtmCommonClick","isAlternativeBg","selectMortgageOffer","equalPercent","minimalPercentDiscountFormatted","minimalPercentFormatted","typed","discount","PriceHoverControl","useDropdownHover","cnMrtgBuyOrDie","MortgageBuyOrDieResultCard","isProfitable","isOverLimit","texts","resultText","isOpenDisclaimer","setIsOpenDisclaimer","openDislaimer","closeDislaimer","positioning","MortgageBuyOrDieReason","RISE_PRICE_RATE","calcMortgageRate","mortgagePercent","calcFormula","futureCost","invoice","currentCost","rate","numeratorNumeratora","denominatorNumeratora","log","calcMonthPaymentMap","formatMonths","monthsFloat","timeYears","trunc","timeMonths","ceil","getDeclensionMonths","calcAccPeriod","initialRateRise","currentRateRise","currentPropertyCost","propertyCostPeriod","isFirstYear","currentPropertyCostRise","periodPaymentsWithRise","countYearsWithRise","periodPaymentsWithRiseInYears","LIMIT_ACC_YEARS","riseInPrice","calculateBuyOrDie","initialPayment","comfortInvoice","rent","cost","calculatedDieMonths","calculatedDieFinalCost","isOverLimitAcc","calculatedBuyMonths","priceMortgage","priceAcc","inWords","timeMortgage","timeAcc","typeProfitable","REQUIRED_FIELD_TEXT","validateComfortInvoice","touched","isError","mortgagePaymentWithCurrentInvoice","years","sumCredit","stupidKey","mortgageRate","countMonths","pow","calcMonthPayment","validateOwnAmount","validateRent","regionsEnumerationDie","mapRegionToSelect","MortgageBuyOrDieFormField","ROOM_OPTIONS","MortgageBuyOrDieModalForm","onCalculate","setForm","setOwnAmount","newValue","setPropertyCost","setRent","setComfortInvoice","setRoomType","roomType","regionsSelect","useSelect","option","formTouched","setFormTouched","validateForm","isFinalValidate","formValues","validateFormFields","formValidMessages","setFormValidMessages","setRentTouched","setPropertyCostTouched","setOwnAmountTouched","setComfortInvoiceTouched","handleValidToCalculate","isValidFormFields","handleChange","selectedText","is","postfix","hint","RENT_BUY_OR_ACC_KEY","COMFORT_INVOICE_BUY_OR_ACC_KEY","convertRoomForAssign","typeProfitableTextReasons","buy","die","MortgageBuyOrDieModal","modalView","setModalView","setTypeProfitable","calculatedData","setCalculatedData","getLocalStorageLastValue","handleCalculate","calculatedTypeProfitable","calculatedResult","scrollTo","handleBackToForm","handleSubmitMortgageReq","actionText","MortgageBuyOrDieTrigger","mortgageBuyOrDieImg","formatYear","FORM_ID","BanksMortgageCalculatorFields","hidden","readOnly","grid","logarithmic","contentAfter","hideNoteSpace","formatter","ArrowButton","isDisabledToHide","ArrowButtonPair","onArrowClick","isLeftEdge","isRightEdge","dataTestPrefix","ArrowButtonPop","findInvizibleNearestChilds","cr","parentElement","childs","childNodes","r","CardScroller","controls","isLeftMask","isRightMask","isBottomMargin","autoWidth","onContainerScroll","isLeftMargin","leftMargin","BanksMortgageOffersScroller","isControls","setIsLeftEdge","setIsRightEdge","arrowDirection","nearest","inline","behavior","block","scrollLeft","scrollWidth","isScrollNeeded","setIsScrollNeeded","useArrowButton","MortgageCondition","onChangeDiscount","discountType","textStyleCheckbox","MortgageDiscountConditions","discountTypes","maxMortgageDiscountFormatted","DiscountCalcEnum","NoOffersBanner","NoOffersImg","Mortgage3Calc","areButtonsHidden","gtmStarterModalSendedId","gtmShowMoreClick","buyOrDieMode","mortgageDemandLink","mortgageOfferFormData","minimalMortgagePaymentSendData","minimalMortgageRate","isSendModalOpened","isConsultModalOpened","senderState","setSenderState","isPreferentialSelectedOffer","isStupidModalOpened","setIsStupidModalOpened","isCalcBuyOrDieModalOpened","setIsCalcBuyOrDieModalOpened","openBuyOrDieModal","closeBuyOrDieModal","openStupidModalByBuyOrDie","closeStupidModal","formUrl","useGovernmentMortgage","useChangeDiscount","isShowAdditionalDiscounts","minimalIncome","firstNatureOfferMinimalPayment","parseAndFormatNumber","sendModalClose","consultModalClose","willNeedSendDiscountsVTB","initialBestMortgageOffer","isMrtgDisclaimerModalOpened","setIsMrtgDisclaimerModalOpened","handleSubmitRequest","MortgageStupidModal","isSendBuyDieAnalytics","withDiscount","isGovernmentDebtExceeds","isGovernmentPercentPoor","governmentMaxDebt","activeDiscountTypes","setActiveDiscountTypes","debt","mortgageOfferDiscountify","mortgageOfferSort","familyOffer","itOffer","emptyOffer","governmentMinPercent","discountPercent","monthPercent","denominator","calculatePayment","lastValueStr","lastValue","MortgageFieldsBuilder","gridFields","contactFields","actions","prefixNodes","renderCustomFirstGrid","prices","useStupidMortgage","isModalGovernmentOpened","setIsModalGovernmentOpened","bankLogos","minimalBanksMortgageParamsFromOffer","getMinimalBanksMortgageEconomyPercent","economy","MAX_ECONOMY","economyFormatted","maxEconomyFormatted","variables","useMinimalBanksMortgageOverall","allMinimalPayment","allMinimalPaymentFormatted","IconBus","IconPedestrian","innerWidth","$element","QRCodeTrigger","qrFgColor","qrCodeValue","fgColor","QRCodePhoneButton","renderButton","buttonVariant","dropdownContainer","Slider","totalItems","onIndexChange","contentClassName","navClassName","isNavHidden","onSetMaxItems","setIndex","maxItems","setMaxItems","slidesTotal","maxIndex","handleSetMaxItems","handleResize","clientWidth","documentElement","throttledHandleResize","handleShift","newIndex","onSwipeLeft","onSwipeRight","useSwiper","handleTouchEnd","handleTouchMove","handleTouchStart","SlimMultiSelect","forcePlaceholder","adaptiveHeight","adaptivePlacement","useMultipleSelect","capitalize","SlimSelect","cnSubwayStationMark","SubwayStationMark","cnSubwayStation","SubwayStation","noClickable","textBold","textColor","hour","padStart","withoutStartValues","filterHours","withoutOffset","setWorkingHouseRange","getSelectValues","startValue","endValue","VTBCoreYMapDesktop","center","noZoom","noPlacemark","zoom","useChangedMargin","small","point","VTBCoreYMapProvider","apiKey","staticApiKey","staticApiUrl","PoiKindToIconName","PoiKindEnum","PoiKindToImageName","PoiHintWrapper","CorePoiHint","specialization","noctidial","iconName","YMapPOI","isSelected","layerPriority","hintLayout","renderToStaticMarkup","IconClose","stroke","strokeOpacity","strokeWidth","LoadingSpinner","staticLoader","PictureWrapper","isAltView","Picture","isLayout","Arrow","HeroPictureWrapper","renderArrow","handlePrev","handleNext","renderLoader","DirectionArrow","HeroPicture","countText","offerTitle","figcaptionPosition","figcaptionPositionColor","withCount","urlErrorImage","cache","setCache","setRenderLoader","hero","setInterval","clearInterval","Mortgage2IconM2","Gallery","starterBanner","repairBanner","srcImages","initialIndexSrcImage","isOpenRepairForm","FigcaptionPosition","FigcaptionPositionColor","clickByCenter","withDuplicateSearchButton","hideThumbnails","isMortgage","isRepair","firstItem","lastItem","initialItem","mortgageRec","repairRec","indexPositionMortgageBanner","preview","imgRec","attributesType","totalImages","getImgRec","setHeroRaw","changeHero","focus","handlePrevClick","handleNextClick","thumbnailsWrapRef","upKey","useKeyPress","ARROW_UP","rightKey","ARROW_RIGHT","downKey","ARROW_DOWN","leftKey","ARROW_LEFT","wrapEl","thumbEl","thumbRect","wrapRect","thumbWidth","WIDTH_THUMBNAIL","OFFSET_THUMBNAIL","withTopTitle","paddingTop","PADDED_PREVIEW","rec","HEIGHT_THUMBNAIL","isActive","modalNode","FSGallery","belowModal","esc","ESCAPE","base","classList","classes","removeChild","ReactDOM","SizeThumbnail","M","L","ButtonTwoState","tooltipText","tooltipAsText","tooltipDirection","dataAttrs","onlyIconStyle","paddingSize","noTooltip","iconColor","normalVariant","normalColor","button","isBlack","ShareButton","gtmShare","isCircle","textPlacement","preferNativeShare","onModalVisibilityChange","isModal","setIsModal","shareUrl","isNativeShare","navigator","share","analyticsPush","fullId","nativeShare","useShareLinksNative","showModal","tt","soc_sources","onShare","circle","FavoritesButton","GalleryButtons","handleOpenPanorama","handleOpenLayout","GalleryMobile2","pictures","isVisited","layoutImageSrc","layoutImageIndex","imageDataset","renderBadges","renderSpecialEvents","renderVases","anchorHidingCircleButtons","isOfferCard","withDots","withSpace","withSpaceProp","noSlider","noSliderProps","maxPicturesCount","hovered","withNavButtons","relativeHeight","hideActionsButtons","isFirstOffer","isFavoriteActive","onFavoriteClick","renderFavoriteProp","renderFavorite","showShareButton","onShareModalVisibilityChange","gotoBack","images","restCountImages","indexImage","galleryRef","galleryImageRefs","setCurrentIndex","rectParent","childRectRight","relativeChildPosRightSide","setChildRef","setIndexImage","useGetCurrentIndexImages","layoutImageRef","circleButtonsRef","circleRightButtonsRef","circleButtonsWrapperRef","observerCircleButtonsSticky","intersectionRatio","observerCircleButtonsShow","isAnchorVisibleOrScrollThrough","boundingClientRect","display","galleryWidth","handleClickArrow","lastImageIndex","showNavButtons","showActionButtons","renderFavoriteInner","mainSrc","visited","withActionButtons","NavButtons","isLastImage","isFirstImage","ImageLazy","NoPhoto","imageSrc","setRefProps","borderBottom","Dots","carousel","showBothButtons","delay","maxWaitArgs","functionTimeoutHandler","isComponentUnmounted","debouncedFunction","cancelDebouncedCallback","debouncedCallback","apply","useIdle","isIdle","setIsIdle","idle","Idle","windowIdle","NotIdle","idleOnTabChange","idleTimeout","rememberKey","isWatcherEnabled","enableIdle","activeModals","querySelectorAll","hasFocus","disableIdle","stop","resetIdle","whenNotInteractive","within","do","when","useUseInfoFetcher","touchStart","touchEnd","isSwipe","targetTouches","dist","useVHProperty","setVHProperty","vh","setProperty","makeOfferUrl","routeParams","MinimalBanksMortgageSnippetDesktop","stateParams","isModalOpen","toggleModal","openModal","MortgageModal","snippetURL","mortgageParams","calculatorUrl","NewsTinyCard","news","Link","formattedShort","NewBuildingNews","heading","onClickNewsItem","disclaimerList","developerLogo","dataGTM","erid","mainImg","gallery","main","medium","firstImg","metroName","listItems","formatRange","billionsAsString","parts","preferRelativeUrl","relativeUrl","onlyRelativeUrl","isDomainOnlySlug","getNewBuildingLink","Paper","role","background","nominative","disclaimer","idx","dangerouslySetInnerHTML","__html","click","isClSnippet","handleClickArrowByType","arrowType","clSnippet","src2x","isFrozen","isFirst","isLast","restCount","resizeImageWidth","resizeImageHeight","frozen","handleSetActiveImageIndex","withLazyLoad","onActiveImageChange","counterEnabled","miniImagesEnabled","relativeSize","previewSize","mainRef","activeImageIndex","setActiveImageIndex","hasThumbs","visiblePictures","restPicturesCount","resetActiveImageIndex","activeImage","onMouseLeave","thumbnail","CheckboxGroup2","ModeEnum","SizeEnum","colRestriction","withoutGrid","classNameGroup","isFilter","handleChildCheck","childProps","childValue","handleChildCheckFilter","renderChildren","checkedValue","elemProps","onCheck","elem","cnFilterSelectButton","FilterSelectButton","memo","forwardRef","focused","side","NumberFormats","RangeInput","valueFrom","valueTo","unit","fromPostfix","fromLabel","toLabel","focusFrom","focusTo","Default","nameFrom","nameTo","formatOnChange","handleChangeRangeFrom","handleChangeRangeTo","onFocus","NumberInputRange","rangeInputProps","Filter","filterTitle","MobileFilterTitle","MobileFilter","MobileFilter2","desktopTitleGap","dataTestId","childrenClassName","apartmentsMapping","IsApartmentsOptions","apartmentEnumeration","DesktopApartmentFilterView","component","apartment","AreaFilterView","withoutTitle","handleAreaChange","bathroomMapping","bathroomEnumeration","BathroomFilterView","several","ceilHeightEnumeration","CeilHeightFilterView","MultiSelect","optionValue","optionClassname","tone","RadioSelect","allowNull","formatAreaRange","prefix","DesktopAreaFilterView","totalAreaFilter","livingAreaFilter","kitchenAreaFilter","livingArea","kitchenArea","handleTotalAreaChange","total","handleLivingAreaChange","living","handleKitchenAreaChange","kitchenFrom","handleReset","handleToggle","triggerRef","labels","totalAreaString","livingAreaString","kitchenAreaString","upperFirst","makeTitle","DesktopBalconyFilterView","DesktopBuildingsFilterView","isStandalone","showBuildingPicker","defaultOptions","Commissioning","quarters","Quarter","DesktopCommissioningFilterView","DesktopCommissioningListFilterView","DesktopFinishingFlatTypeFilterView","SELECT_OPTIONS","DesktopFinishingTypeFilterView","hasAllAvailableValues","allWithFinishingValues","floorConstraintsPrefixes","DesktopFloorFilterView","handleRangeChange","handleLastOnlyChange","handleLastExcludeChange","handleFirstExcludeChange","rangeString","lastPrefix","firstPrefix","DesktopGeoFiltersView","geoStore","onSubmit","voidFunction","count","addQueryDisplayValue","inputBorderSide","tips","removeTips","transportLimitFilter","suggestionRegionId","filterGeoIds","filterMetroIds","filterDistrictIds","filterAddressIds","filterNewBuildingIds","newBuildingData","newBuildingTitle","newFilters","geoSelectorActiveTab","setGeoSelectorActiveTab","handleGeoSelectorClose","handleGeoSelectorSubmit","handleMetroClick","GeoSelectorTabsEnum","handleDistrictClick","handleGeoSelectorChange","changedFilters","metroIdList","districtIdList","idList","broadenedRegionId","handleTransportLimitChange","tranpostLimitFilter","hasMetro","hasDistricts","borderSide","handleBlur","handleFocus","handleInputChange","onKeyDown","handleInputKeyDown","extraAfter","activeTab","onChangeTransportLimitChange","onTabChange","openMetroModal","DesktopGeoFiltersView2","showMapArea","clMap","isClGeoFilter","extraLinks","FilterTagList","expanded","setExpanded","toggleExpanded","allTips","formatted","timeLimitLabel","visibleTips","toggleExpandedDisabled","deleteTip","tip","resetAll","onDelete","TipContent","TransportTypeIcon","FilterTagListItem","clickable","FilterTagList2","FilterTagListItem2","svg","transportTypeOptions","timeLimitOptions","timeLimitShortOptions","MobileTransportLimitFilterView2","isTitle","containerClass","hiddenTimeOptionsWithoutTransportType","isShort","transportSelectChange","transportSelectOptions","transportSelect","timeLimitSelectChange","timeLimitSelectOptions","timeLimitSelect","GeoErrorBoundary","hasError","componentDidCatch","errorInfo","withScope","setExtra","captureException","escapeRegExp","string","metroTitleTrim","isNeedToAdd","trimmedStationTitle","handleOnSelect","handleTextChange","trim","textRegExp","anotherTextLetters","latinToCyrillic","anotherText","anotherTextRegExp","test","filterMetro","checkListShowing","isFocus","renderSuggestions","onTextChange","DistrictsTab","handleCheckboxChange","groupIndex","groupId","checkedDiff","uncheckedDiff","selectedIdsFromGroup","otherGroupIds","handleCheckboxGroupChange","groupIds","groupIdx","isGroupIdChecked","isGroupChecked","isGroupItemChecked","indeterminate","metroMapMskSvg","metroMapSpbSvg","metroMapKznSvg","metroMapEkbSvg","metroMapNskSvg","metroMapNnvSvg","metroMapSmrSvg","STATIONS_IN_RING_MSK","TabsEnum","GeoSelector","allowedTabs","isMetroTab","districtGroups","groupDistricts","districtCount","getDistrictCount","handleModalRequestClose","closeBy","ModalClosedBy","handleSelectedRemove","handleMetroChange","handleDistrictsChange","AdditionalRegionWithMetroIdEnum","metroMapSvg","isMetroMapSvgVertical","isMskOrObl","isMetroInRingSelected","handleMetroInRingCheck","tabs","MetroSvgComponent","showDistrictControl","Modal","borderRadius","onRequestClose","displayedDistricts","Suspense","fallback","MetroMapSelector","Tabs","f","ITEMS","DesktopAccreditationFilterView","DesktopBuildingClassFilterView","TRUE","DesktopClosedSalesFilterView","DesktopNewBuildingDealFilterView","DesktopPaymentTypeFilterView","DesktopPositionFilterView","DesktopSafetyFilterView","Parking","parkingEnumeration","Closed","Underground","Opened","parkingMapping","DesktopParkingFilterView","priceTypeShortMapping","priceTypeMapping","PriceInput","isShowReset","pricePreset","priceTypes","handlePriceType","handleFrom","handleTo","mortgageInput","focusPosition","updateFocusPosition","isShowPriceType","handleFocusMin","handleFocusMax","abbreviateNumber","thousandsAsNumber","fromValue","fromType","toValue","toType","MINIMAL_MORTGAGE_PAYMENT","minMortgagePaymentFormatted","DesktopPriceFilterView","DesktopPriceFilterViewWithoutDropdown","mortgagePaymentFilter","isLarge","updateFewFilters","useDropdown","handleChangeMortgagePayment","areaUnitPlaceholder","getAreaUnitPlaceholder","MortgagePaymentInput","priceFilter","preset","FilterSelect","marginRight","defaultRegionSelectOptions","DesktopRegionFilterView","searchInputValue","setSearchInputValue","resetSearchInputValue","setRegionId","useGeoUserRegion","parsedValue","handleSelectChange","getSelectedOptionLabel","currentOptions","getFilteredFlatRegionSelectOptions","onToggle","showInput","MIN_OPTIONS_NUMBER_WITH_INPUT","DesktopRoomsTypeFilterView","currentValues","handleChangeSelect","renderCustomTitle","selectedOptions","parsedValues","opt","array","customlabel","postFix","FlatsSpecialEvent","DesktopFlatsSpecialEventsFilterView","MiscSpecialEvent","DesktopMiscSpecialEventsFilterView","OtherSpecialEvent","DesktopOtherSpecialEventsFilterView","wallsEnumeration","wallsEnumerationWithWood","wallsMapping","DesktopWallsFilterView","withWood","wall","Floors","floorOptions","NotFirst","NotLast","Last","FloorFilterView","renderFloorTotalFilter","getValue","valueSet","onChangeCtx","onChangeCtxRef","isFirstSeen","isLastSeen","unshift","renderCheckboxGroup","floorValue","renderFloorFilter","FloorsTotalFilterView","KitchenAreaFromFilterView","withPlaceholder","minValue","LivingAreaFilterView","selectOptions","MobileAccreditationFilterView","MobileApartmentFilterView","MobileBalconyFilterView","selectOptionsWithSeveral","MobileBathroomFilterView","hasSeveral","MobileBuildingClassFilterView","MobileCeilHeightFilterView","MobileClosedSalesFilterView","MobileCommissioningFilterView","uikitZIndexEnabled","handleSelect","handleClear","SuggestTypeEnum","ModalSize","BorderRadius","fullScreen","ModalHeading","onClear","highlighted","MobileDeveloperFilterView","uikitModalZIndexEnabled","useModal","showSuggest","on","hideSuggest","off","isSuggestVisible","visible","handleSuggestOpen","I","MobileFinishingTypeFilterView","MobileFloorFilterView","onChangeFloor","oldValue","added","removed","getFirst","firstValue","getLast","MobileFloorsTotalFilterView","MetroMark2Item","colorsToNameMapOut","MetroMark2","MetroSelect","groupByLineInitial","checkSet","checkStations","check","isStationChecked","isGrouppedByLine","setIsGrouupedByLine","groupByAlphabetAction","groupByLineAction","stationsSelected","groupByAlphabet","groupByLine","useMetroSelect","setSearchRaw","setSearch","resetSearch","grp","toLocaleUpperCase","onReset","justified","RouteGroup","AlphaGroup","allChecked","checkAllInGroup","useMetroSelectRouteGroup","checkedInGroup","Item","MetroModal","metroOff","checkedMetroIds","checkedIds","onMetroSubmit","withDeclension","SuggestModal","cnStation","DistrictSelectItem","DistrictSelectGroup","responsive","Limit","DistrictSelect","hasLimit","isChecked","checkGroup","checkItem","useDistrictSelect","newValues","arr","newIsChecked","DistrictModal","noLimit","GeoTagItem","handleRemove","isGeoDistrictsGroupItem","isQueryDisplayValue","metroItem","addressItem","GeoTagList","FullGeoTagList","fullGeoTagOff","notUndefined","PreviewGeoTagList","queryDisplayValues","fullGeoTagOn","isFullGeoTagVisible","geoObjects","districtIdsSet","nextGeoObjects","numberedId","slicedItems","newBuildingItems","withoutMargin","MobileGeoFilterView","geoStoreProp","titleWithNewBuildings","oldFilters","districtOn","districtOff","isDistrictVisible","metroOn","isMetroVisible","suggestOn","suggestOff","splitIds","newGeoIds","tipIds","handleMetroDistrictChange","splitted","newGeoFilter","onResetMetro","onResetDistrict","onDistrictSubmit","handleRemoveItem","newDistrictIds","newMetroIds","newAddressIds","newNewBuildingIds","onSuggestChange","shouldHaveNewBuildings","MobileKitchenAreaFilterView","onKeyPressEnterBlur","useEnterBlur","MobileLivingAreaFilterView","MobileNewBuildingDealFilterView","M2PRO_OPTIONS_MOBILE","MobileNotOnlyM2ProFilterView","m2ProSelectedOption","handleM2ProChange","m2ProValue","MobileParkingFilterView","MobilePaymentTypeFilterView","MobilePositionFilterView","MobilePriceFilterView","onChangePriceType","filteredOptions","MobileRegionFilterView","isDesktop","linearOptionsList","prepared","filterValue","setFilterValue","updateFilterValue","filterValueNormalized","all","divider","MobileRoomFilterView","MobileSafetyFilterView","MobileFlatsSpecialEventsFilterView","MobileMiscSpecialEventsFilterView","MobileOtherSpecialEventsFilterView","MobileTotalAreaFilterView","MobileTransportLimitFilterView","selectOptionsWithWood","MobileWallsFilterView","isGroupedOption","FlatOptionList","isBoldParentOption","lastIndex","FilteredOptionList","GroupedOptionList","RenderRegionSelectUikitContent","full","Filter2","prepareTitle","sortDistricts","prepareList","groupMskDistricts","districtsMap","districtGroup","mskOblGroup","sortBy","sortedNestedDistricts","splited","splitListByParentId","sellFlatPricesPerAllSquareMsk","sellFlatPricesPerAllSquareSpb","sellFlatPricesPerMeterMskMo","sellFlatPricesPerMeterSpbLo","priceByMortgagePayment","l","getFlatOptions","flatOptions","substr","needle","filterFlatOptionsBySubstr","IFilter","isDefault","hasPolygon","builtYear","isDefaultRange","transportLimit","floorsTotal","facilities","furnitures","prePaymentType","DepositType","CommissionType","rentConditions","LiftOptions","willRenovation","RenovationProgram","hasNearbySchool","NearbyOptions","photoOption","PhotoOptions","layoutImageOption","bankPledgeOption","isAllowed","newBuildingDeal","paymentType","landStatuses","landArea","supplyOptions","houseArea","BathroomLocationFilter","locations","selectedNewBuilding","OnlineView","getCountActiveFilters","counter","ModalHeadingInner","StickyPhoneWrapper","anchor","bottomOffset","safeAreaBottom","hasBackground","showBeforeScrolling","wrapperRef","anchorRect","viewPortHeight","currentRect","paddingBottom","fixed","onRemove","mortgageTip","onWhiteBackground","onWhite","Button","iconLeft","extraFiltersIds","buildRangeLabel","spacedUnit","serializeToTips","getPhotoTypeTip","LayoutImageOptions","getLayoutImageTypeTip","AuthorTypeOptions","authorLabels","getAuthorTypeTip","transportTypeLabel","getTransportLimitTip","floorConstraintsLabels","getFloorLabelTip","ceilingHeightLabels","getCeilingHeightLabelTip","getAreaLabelTip","getLivingLabelTip","getKitchenLabelTip","getFloorsTotalLabelTip","getYearBuildingLabelTip","apartmentsLabels","getApartmentsLabelTip","getMortgagePriceTip","TIP_CLASS","cnButton","Tip","removeTip","openMortgagePaymentSearchModal","metroTip","RoomsOfferedOptions","roomInOfferWithText","roomForSale","roomWithText","getRoomsInOfferTips","roomsInOfferFilter","roomsInOfferText","roomsText","dealTypeText","getDealForRoom","livingFacilityMapping","LivingFacilitiesOption","getLivingFacilityTip","facility","getRoomsTips","roomFilter","realtyObjectFilter","roomsCountText","atRealtyTypeText","getLandAreaLabelTip","getHouseAreaLabelTip","getLandStatusTips","statuses","getSupplyOptionsTip","supplyOptionsFilter","heatingFilter","GasOptions","ElectricityOptions","SewerageOptions","WaterOptions","HeatingOptions","getWindowsDirectionLabel","WindowsDirectionSearchOffersEnum","getHeatingTip","getBathroomLocationTip","BathroomLocationOptions","getFloorsTotalTip","getPrepaymentTip","prepaymentType","PrepaymentType","getRentConditionsTip","getFurnitureTip","FurnitureOption","getFinishingTip","FinishingTypeOption","getCommissioningTip","yearArr","getLivingTenantOptionsTip","livingOption","LivingTenantOption","getTipsCollection","shouldIgnoreGeoIds","filterKeys","bathroomFilter","balconyFilter","renovationFilter","closedSalesFilter","buildingClassFilter","parkingFilter","wallsTypeFilter","infrastructureFilter","safetyFilter","positionFilter","accreditationFilter","newBuildingDealFilter","paymentTypeFilter","livingTenantOptionFilter","rentConditionsFilter","furnitureFilter","mapBoundsFilter","sellTypeFilter","buildingsFilter","authorFilter","livingFacilityFilter","flatsSpecialEventsFilter","otherSpecialEventsFilter","miscSpecialEventsFilter","buildEpochFilter","finishingFilter","tipsCollection","getExtraFilterIds","isRoomOrHome","isHome","titleMapFilter","floorLabel","re","geoObject","geoName","addressObj","idsSet","districtsGeo","geoTitle","districtObj","groupsAndStations","geoTip","bathroomType","bathroomLabels","saleTypeLabels","balconyLabels","buildEpochLabels","renovationType","renovationLabels","buildingClassLabels","parkingLabels","wallsLabels","infrastructureLabels","safetyLabels","positionLabels","accreditationLabels","newBuildingDealLabels","paymentTypeLabels","buildingIds","flatsSpecialEventsLabels","otherSpecialEventsLabels","miscSpecialEventsLabels","OffersSearchTips","updateFilter","removeFilter","expandFilter","removeGeo","customFilterBehavior","onUpdateLength","classNamesNewFilters","tipsIndex","setTipsIndex","expandButton","setExpandButton","expandTipsMode","setExpandTipsMode","handleRemoveTip","livingFacilities","splice","info","getElementsByClassName","getTipsIndexInfo","firstLineTipsOnly","tipsButtons","TipButton","hiddenExpandButton","RenovationEnum","InfrastructureOptions","BuildEpoch","cnBreadcrumb","Breadcrumb","allClickable","sections","regionModalSelect","withoutSeoMarkup","schema","itemListElement","contentSeo","isLastElement","cnModal","coverRef","alignLeft","showCloseButton","withScroll","withoutScroll","withoutBodyPadding","offTableCSS","closeIconSize","stylesCloseIcon","hugePriorityZIndexEnabled","asideRef","useLayoutEffect","originalOverflowX","overflowX","originalOverflowY","overflowY","onCloseButton","CloseButton","sizeClass","ClickOutside","visibleDefault","cnPaper","elevation","shadowСolor","square","mods","innerRef","pressed","iconRight","contentBefore","ToneEnum","ViewEnum","prevent","TagName","useControl","buttonState","controlHandlers","handleMouseUp","handleMouseDown","handleMouseLeave","handleMouseEnter","CheckboxControl","controlRef","cnCheckbox","autoComplete","handleButtonClick","htmlFor","cnCheckboxGroup","tokens","sanitizedRegexp","part","fontWeight","cnIcon","InputControl","autoCorrect","cnInput","extraBefore","maskProps","useHoverable","hoverRef","useFocusable","focusRef","inputRef","currentValue","setValue","changeValue","thousandSeparator","decimalSeparator","isNumericString","getInputRef","mergeRefs","currentTarget","getAnchorDimensions","dimensions","offsetHeight","pageXOffset","pageYOffset","getPopupDimensions","popupRef","area","popupHeight","popupWidth","clientHeight","getViewportDimensions","getScopeDimensions","scopeRef","getTailDimensions","tailRef","getPopupPosition","anchorDimensions","popupDimensions","offsets","checkMainDirection","checkSecondaryDirection","getTailPosition","tailDimensions","tail","halfSizeOfTail","getViewportFactor","popupPosition","viewportDimensions","viewport","viewportFactor","intersectionLeft","intersectionRight","intersectionTop","intersectionBottom","mainFirstDirection","mainSecondDirection","secondaryDirection","KEY_CODE","isListOpened","suggestionsLength","setFocusedItem","keyCode","UP","DOWN","ENTER","_","suggestionHandlers","cnSuggest","DEFAULT_SUGGESTIONS","renderInputDefault","suggestProps","renderListDefault","renderItemLabel","renderEmptyListDefault","empty","renderItemLabelDefault","handleSelectItem","selectedItem","useSuggestionList","controlState","trimmedText","isShowEmptyList","isShowList","PopupTail","cnPopup","hasTail","secondaryOffset","mainOffset","tailOffset","viewportOffset","setDirection","timerRef","updateRefsPosition","SQRT1_2","getOffsets","scopeDimensions","tailPosition","nextDirection","nextViewportFactor","getDrawingParams","cnTooltip","renderContent","onHide","currentVisible","contentRef","handleClickOutside","useOnClickOutside","handleShow","popupContent","targets","requestAnimationFrame","InputModeEnum"],"sourceRoot":""}