{"mappings":"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","sources":["src/Apartments/Page/ApartmentPageNew.tsx","src/Apartments/Api/ApartmentAM.ts","src/Apartments/ApartmentMatcher.tsx","src/Apartments/Page/StickyRentalBottomBar.tsx","src/Apartments/Page/Loader.tsx","src/Apartments/Page/NearbyServicesMap.tsx","src/Apartments/Page/TopBarFavoriteButton.tsx","src/Apartments/Page/ApartmentInfo.tsx","src/Components/ResourceImageInlineSvg.tsx","src/Apartments/Page/ApartmentDetails.tsx","src/Apartments/Page/ApartmentFeatures.tsx","src/Apartments/Page/ApartmentIcons.tsx","src/Common/CommonIcons.tsx","src/Apartments/Page/BusinessEntityDetailsNew.tsx","src/BusinessEntities/Page/BusinessEntityInformationNew.tsx","src/Apartments/Page/CampaignBanner.tsx","src/Apartments/Page/DialogBanner.tsx","src/Apartments/Page/ApartmentShowingBanner.tsx","src/Apartments/Page/CustomerTestimonials.tsx","src/Apartments/Page/AllBenefits.tsx","src/Apartments/Page/OtherAvailableApartmentsList.tsx","src/hooks/useActivityTimerRef.tsx","src/hooks/createTimer.tsx","src/Apartments/Page/ApartmentPageBreadcrumb.tsx"],"sourcesContent":["import * as React from 'react';\nimport { connect } from 'react-redux';\nimport {\n\tLocationBusinessEntity,\n\tLocationData,\n\tLocationMunicipality,\n\tLocationMunicipalitySubArea,\n} from '../../LocationDataProvider/LocationData';\nimport { apartmentPageActions } from './apartmentPageActions';\nimport { ApartmentPageState } from './apartmentPageState';\nimport { ILumoOneAppState } from '../../boot/configureStore';\nimport { IUseResourceTexts, ResourceText, withResourceTextSupport } from '../../Components/ResourceText';\nimport { ApartmentAM, ApartmentStateAM } from '../Api/ApartmentAM';\nimport { GetUrlForCriteria, GetUrlForSearchResults } from '../Browser/apartmentSearchUrlHandling';\nimport SuggestedApartmentsReel from '../SuggestedApartments/SuggestedApartmentsReel';\nimport { getApartmentTypeByRoomCount } from '../ApartmentMatcher';\nimport { Language } from '../../Common/interfaces/language';\nimport { toFormattedString } from '../../Components/numberUtils';\nimport NotFoundPage from '../../Common/NotFoundPage';\nimport ApartmentChangerBanner from '../../FrontPage/ApartmentChangerBanner';\nimport { layoutActions, LayoutDispatchProps } from '../../Common/Layout/layoutActions';\nimport { BreadCrumbItem, createTranslatedUrlsUsing } from '../../Common/Layout/layoutState';\nimport {\n\tgetBreadCrumbForSearchResults,\n\tgetBreadCrumbForSearchResultsBusinessEntityPart,\n} from '../Browser/breadCrumbUtils';\nimport { GetUrlForApartment } from './apartmentPageUrlHandling';\nimport TopBar from '../../Common/TopBar';\nimport { IDefineSsrRequirements, withSsrSupport } from '../../SSR/ssrDispatchWrapper';\nimport { suggestedApartmentsActions } from '../SuggestedApartments/suggestedApartmentsActions';\nimport { addTelemetryEventForApartmentView } from '../Telemetry';\nimport { pageViewTelemetryActions } from '../../Telemetry/pageViewTelemetryActions';\nimport PageMeta, { PageMetaFields } from '../../Common/Layout/PageMeta';\nimport { getApartmentDataForPageViewEvent } from '../../Telemetry/TelemetryManager';\nimport { isAlreadyRequested, isOperationSuccess } from '../../Common/Api/ApiOperationState';\nimport { formatApartmentLoadIdentifier } from './formatApartmentLoadIdentifier';\nimport { StickyRentalBottomBar } from './StickyRentalBottomBar';\nimport { Loader } from './Loader';\nimport { NearbyServicesMap } from './NearbyServicesMap';\nimport { TopBarFavoriteButton } from './TopBarFavoriteButton';\nimport { ApartmentInfo } from './ApartmentInfo';\nimport { CampaignBanner, CampaignBannerVariant } from './CampaignBanner';\nimport { AlternateLangExactUrl } from '../../Common/Layout/AlternateLangExactUrl';\nimport ApartmentPageBreadcrumb from './ApartmentPageBreadcrumb';\nimport { useSetStatusCode } from '../../boot/LumoRouterContext';\nimport { useRunOnce } from '../../SSR/inlineRenderDispatchHelper';\n\ninterface IApartmentPageParams {\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea?: LocationMunicipalitySubArea;\n\tbusinessEntity: LocationBusinessEntity;\n\tapartmentSlug: string;\n}\n\ntype ApartmentPageStateProps = ApartmentPageState & {\n\tlanguage: Language;\n\tcurrentSearchUrl?: string;\n\tcommonUiRoot: string;\n\tpageViewEventSent?: boolean;\n\tlocationData: LocationData | undefined;\n\tbreadCrumbParents: BreadCrumbItem[];\n};\n\ntype IApartmentPageProps = IApartmentPageParams &\n\tApartmentPageStateProps &\n\tApartmentPageDispatchProps &\n\tIUseResourceTexts &\n\tIDefineSsrRequirements;\n\ntype ApartmentPageDispatchProps = LayoutDispatchProps & {\n\tgetApartment: typeof apartmentPageActions.getApartmentBySlug.request;\n\tgetApartmentState: typeof apartmentPageActions.getApartmentState.request;\n\tpageComplete: typeof pageViewTelemetryActions.pageComplete;\n};\n\ninterface ApartmentPageComponentState {\n\tshowRentalProcessSticky: boolean;\n\tshowRentalBottomBar: boolean;\n}\n\nclass ApartmentPage extends React.Component<IApartmentPageProps, ApartmentPageComponentState> {\n\tmarketingTextDiv: React.RefObject<HTMLDivElement>;\n\tapartmentLoadIdentifier: string | undefined;\n\tprivate detailsEventSent = false;\n\n\tconstructor(props: IApartmentPageProps, state: ApartmentPageComponentState, context?: any) {\n\t\tsuper(props, context);\n\t\tthis.marketingTextDiv = React.createRef();\n\t\tthis.apartmentLoadIdentifier = formatApartmentLoadIdentifier(props.businessEntity.id, this.props.apartmentSlug);\n\t\tthis.state = { showRentalProcessSticky: false, showRentalBottomBar: false };\n\t\tthis.getApartmentIfNotPresent();\n\n\t\tthis.props.requireForSsr(apartmentPageActions.getApartmentBySlug);\n\t\tif (this.props.apartment) {\n\t\t\tthis.props.requireForSsr(suggestedApartmentsActions.getApartments);\n\t\t}\n\t\tthis.setLayoutProps();\n\t}\n\n\tcomponentDidMount() {\n\t\twindow.addEventListener('scroll', this.onScrollChange);\n\t\tthis.logTelemetry();\n\t\tthis.fetchApartmentStateIfMissing();\n\t}\n\n\tcomponentWillUnmount() {\n\t\twindow.removeEventListener('scroll', this.onScrollChange);\n\t}\n\n\tcomponentDidUpdate(prevProps: Readonly<IApartmentPageProps>) {\n\t\tif (this.marketingTextDiv.current) {\n\t\t\tconst contentText = this.marketingTextDiv.current.innerText;\n\t\t\tif (this.marketingTextDiv.current.innerHTML != contentText) {\n\t\t\t\tthis.marketingTextDiv.current.innerHTML = contentText;\n\t\t\t}\n\t\t}\n\n\t\tthis.logTelemetry(prevProps);\n\n\t\tthis.getApartmentIfNotPresent();\n\t\tthis.fetchApartmentStateIfMissing();\n\n\t\tif (this.props.apartment?.streetAddress !== prevProps.apartment?.streetAddress) {\n\t\t\tthis.setLayoutProps();\n\t\t}\n\n\t\tif (this.props.apartment?.slug !== prevProps.apartment?.slug) {\n\t\t\tthis.detailsEventSent = false;\n\t\t}\n\t}\n\n\tonScrollChange = () => {\n\t\tthis.setState({ ...this.state, showRentalBottomBar: window.scrollY > 0 });\n\t};\n\n\tprivate fetchApartmentStateIfMissing() {\n\t\tif (this.props.apartment && !isAlreadyRequested(this.props.apartmentState, this.props.apartment.id)) {\n\t\t\tthis.props.getApartmentState(this.props.apartment.id);\n\t\t}\n\t}\n\n\tgetApartmentIfNotPresent(): boolean {\n\t\tif (\n\t\t\t!this.props.isDataLoading &&\n\t\t\tthis.props.dataLoadingFailedFor !== this.apartmentLoadIdentifier &&\n\t\t\t(!this.props.apartment ||\n\t\t\t\tthis.props.apartment.businessEntityId !== this.props.businessEntity.id ||\n\t\t\t\tthis.props.apartment.slug !== this.props.apartmentSlug)\n\t\t) {\n\t\t\tthis.props.getApartment({ businessEntityId: this.props.businessEntity.id, slug: this.props.apartmentSlug });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tlogTelemetry(prevProps?: Readonly<IApartmentPageProps>) {\n\t\tif (this.props.isDataLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst apartment = this.props.apartment;\n\t\tif (this.props.apartmentSlug === apartment?.slug && (!prevProps || prevProps.isDataLoading)) {\n\t\t\t// Pageview\n\t\t\tconst apartmentData = getApartmentDataForPageViewEvent(apartment, {\n\t\t\t\tmunicipality: this.props.municipality.name,\n\t\t\t\tmunicipalitySubArea: this.props.municipalitySubArea ? this.props.municipalitySubArea.name : undefined,\n\t\t\t\tbusinessEntity: this.props.businessEntity.name,\n\t\t\t});\n\t\t\tthis.props.pageComplete({ pageType: 'apartment', data: apartmentData });\n\t\t} else if (this.props.dataLoadingFailedFor === this.apartmentLoadIdentifier) {\n\t\t\tthis.props.pageComplete({ pageType: 'notFound' });\n\t\t}\n\n\t\t// Detail\n\t\tif (\n\t\t\tapartment &&\n\t\t\tthis.props.apartmentSlug === apartment?.slug &&\n\t\t\tthis.props.pageViewEventSent &&\n\t\t\t!this.detailsEventSent\n\t\t) {\n\t\t\tthis.detailsEventSent = true;\n\t\t\taddTelemetryEventForApartmentView(\n\t\t\t\tapartment,\n\t\t\t\tthis.props.municipality.name,\n\t\t\t\tthis.props.municipalitySubArea ? this.props.municipalitySubArea.name : undefined,\n\t\t\t\tthis.props.businessEntity.name,\n\t\t\t);\n\t\t}\n\t}\n\n\trender() {\n\t\tif (this.props.isDataLoading) {\n\t\t\treturn <Loader />;\n\t\t}\n\n\t\tif (this.props.dataLoadingFailedFor === this.apartmentLoadIdentifier) {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<PageMeta title=\"\" />\n\t\t\t\t\t<NotFoundPage />\n\t\t\t\t</>\n\t\t\t);\n\t\t}\n\n\t\tconst apartment = this.props.apartment!;\n\t\tif (!apartment) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst apartmentState = isOperationSuccess(this.props.apartmentState)\n\t\t\t? this.props.apartmentState.result\n\t\t\t: ApartmentStateAM.Available;\n\n\t\tif (\n\t\t\tthis.props.municipality.id !== apartment.municipalityId ||\n\t\t\t(!!this.props.municipalitySubArea &&\n\t\t\t\tthis.props.municipalitySubArea.id !== apartment.municipalitySubAreaId) ||\n\t\t\tthis.props.businessEntity == undefined ||\n\t\t\tthis.props.businessEntity.id !== apartment.businessEntityId\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{apartmentState === ApartmentStateAM.Rented && <Status404 />}\n\t\t\t\t<PageMeta\n\t\t\t\t\ttitle={this.formatWindowTitle()}\n\t\t\t\t\tmeta={this.formatMeta(apartment)}\n\t\t\t\t\tnoIndex\n\t\t\t\t\texcludeAlternateLangUrl\n\t\t\t\t/>\n\t\t\t\t<AlternateLangExactUrl />\n\t\t\t\t<div className=\"view-apartment\">\n\t\t\t\t\t<ApartmentPageBreadcrumb\n\t\t\t\t\t\tbreadcrumbCurrentName={apartment.streetAddress}\n\t\t\t\t\t\tcurrentLanguage={this.props.language}\n\t\t\t\t\t\tbreadcrumbParents={this.props.breadCrumbParents}\n\t\t\t\t\t/>\n\t\t\t\t\t<TopBar\n\t\t\t\t\t\tbackButton={\n\t\t\t\t\t\t\tthis.props.currentSearchUrl\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\ttarget: this.props.currentSearchUrl,\n\t\t\t\t\t\t\t\t\t\ttext: <ResourceText resourceKey=\"ApartmentPage_BackToSearchResults\" />,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvariant=\"bgWhite\"\n\t\t\t\t\t\tbanner={\n\t\t\t\t\t\t\tapartment.campaign ? (\n\t\t\t\t\t\t\t\t<CampaignBanner\n\t\t\t\t\t\t\t\t\tcampaign={apartment.campaign}\n\t\t\t\t\t\t\t\t\tvariant={CampaignBannerVariant.TopBanner}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TopBarFavoriteButton apartment={apartment} />\n\t\t\t\t\t</TopBar>\n\t\t\t\t\t<ApartmentInfo\n\t\t\t\t\t\tmunicipality={this.props.municipality}\n\t\t\t\t\t\tmunicipalitySubArea={this.props.municipalitySubArea}\n\t\t\t\t\t\tapartment={apartment}\n\t\t\t\t\t\tapartmentState={apartmentState}\n\t\t\t\t\t\tbusinessEntityName={this.props.businessEntity.name}\n\t\t\t\t\t\tbusinessEntity={this.props.businessEntity}\n\t\t\t\t\t\tlocationData={this.props.locationData}\n\t\t\t\t\t\tlanguage={this.props.language}\n\t\t\t\t\t/>\n\t\t\t\t\t<StickyRentalBottomBar\n\t\t\t\t\t\tapartment={apartment}\n\t\t\t\t\t\tapartmentState={apartmentState}\n\t\t\t\t\t\tlanguage={this.props.language}\n\t\t\t\t\t\tmunicipality={this.props.municipality}\n\t\t\t\t\t\tmunicipalitySubArea={this.props.municipalitySubArea}\n\t\t\t\t\t\tbusinessEntity={this.props.businessEntity}\n\t\t\t\t\t\tvisible={this.state.showRentalBottomBar}\n\t\t\t\t\t/>\n\t\t\t\t\t<NearbyServicesMap apartment={apartment} />\n\t\t\t\t\t<ApartmentChangerBanner />\n\t\t\t\t\t<SuggestedApartmentsReel\n\t\t\t\t\t\texcludeApartmentId={apartment.id}\n\t\t\t\t\t\tmaxAmount={9}\n\t\t\t\t\t\tsearchCriteria={{\n\t\t\t\t\t\t\tlocation: { businessEntityIds: [apartment.businessEntityId] },\n\t\t\t\t\t\t\troomCount: [getApartmentTypeByRoomCount(apartment.roomCount)],\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshowMoreLinkText={\n\t\t\t\t\t\t\t<ResourceText\n\t\t\t\t\t\t\t\tresourceKey=\"SuggestedApartments_ShowAllNearbyApartments\"\n\t\t\t\t\t\t\t\tdefaultText=\"Näytä kaikki lähialueen kodit\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tshowMoreLinkUrl={GetUrlForSearchResults(\n\t\t\t\t\t\t\tthis.props.language,\n\t\t\t\t\t\t\tthis.props.municipality.slug,\n\t\t\t\t\t\t\tthis.props.municipalitySubArea ? this.props.municipalitySubArea.slug : undefined,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t);\n\t}\n\n\tprivate formatMeta(apartment: ApartmentAM): PageMetaFields {\n\t\tconst shareTitle =\n\t\t\tthis.props.municipality.name +\n\t\t\t', ' +\n\t\t\t(this.props.municipalitySubArea ? this.props.municipalitySubArea.name + ', ' : '') +\n\t\t\ttoFormattedString(apartment.rent) +\n\t\t\t' ' +\n\t\t\tthis.props.getResourceText('General_EurosPerMonth') +\n\t\t\t', ' +\n\t\t\tapartment.plan;\n\t\tconst shareImageUrl =\n\t\t\tapartment && apartment.mainImage\n\t\t\t\t? this.props.commonUiRoot + `images/apartments/${apartment.mainImage.id}/1200x800-shop-carousel`\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tshareTitle,\n\t\t\tdescription: this.props.getResourceText('ApartmentPage_MetaDescription'),\n\t\t\tshareImageUrl,\n\t\t};\n\t}\n\n\tsetLayoutProps = () => {\n\t\tconst breadCrumb = this.formatBreadCrumb();\n\n\t\tthis.props.setLayoutValues({\n\t\t\tbreadcrumbCurrentName: this.props.apartment?.streetAddress,\n\t\t\tbreadcrumbParents: breadCrumb.slice(0, breadCrumb.length - 1),\n\t\t\ttranslateUrl: createTranslatedUrlsUsing((l) => this.getUrl(l)),\n\t\t});\n\t};\n\n\tprivate getUrl(l: Language) {\n\t\tif (!this.props.apartment) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn GetUrlForApartment(\n\t\t\tl,\n\t\t\tthis.props.apartment,\n\t\t\tthis.props.businessEntity,\n\t\t\tthis.props.municipalitySubArea,\n\t\t\tthis.props.municipality,\n\t\t);\n\t}\n\n\tprivate formatBreadCrumb(): BreadCrumbItem[] {\n\t\tconst bc = getBreadCrumbForSearchResults(this.props.language);\n\t\tbc.push(\n\t\t\t...getBreadCrumbForSearchResultsBusinessEntityPart(\n\t\t\t\tthis.props.language,\n\t\t\t\tthis.props.businessEntity,\n\t\t\t\tthis.props.municipality,\n\t\t\t\tthis.props.municipalitySubArea,\n\t\t\t),\n\t\t);\n\t\t// apartment is not available while page is loading and if the apartment is not found\n\t\tif (this.props.apartment) {\n\t\t\tbc.push({\n\t\t\t\tname: this.props.apartment.streetAddress!,\n\t\t\t\tpath: '',\n\t\t\t});\n\t\t} else if (this.props.dataLoadingFailedFor === this.apartmentLoadIdentifier) {\n\t\t\tbc.push({\n\t\t\t\tname: this.props.getResourceText('ApartmentPage_BreadCrumb_ApartmentNotFound'),\n\t\t\t\tpath: '',\n\t\t\t});\n\t\t}\n\n\t\treturn bc;\n\t}\n\n\tprivate formatWindowTitle(): string {\n\t\tif (!this.props.apartment) {\n\t\t\treturn '';\n\t\t}\n\t\treturn this.props.getResourceText('WindowTitle_ApartmentPage', '{0} - Vuokrataan {1}', {\n\t\t\tparameters: [this.props.apartment.streetAddress!, this.formatApartmentSize()],\n\t\t});\n\t}\n\n\tprivate formatApartmentSize() {\n\t\tif (this.props.apartment && this.props.apartment.roomCount >= 1 && this.props.apartment.roomCount <= 5) {\n\t\t\treturn this.props.getResourceText(\n\t\t\t\t`ApartmentPage_ApartmentTypeByRoomCount_${this.props.apartment.roomCount}`,\n\t\t\t\tthis.props.apartment.plan,\n\t\t\t);\n\t\t}\n\n\t\treturn '';\n\t}\n}\n\nexport default withResourceTextSupport(\n\twithSsrSupport(\n\t\tconnect<ApartmentPageStateProps, ApartmentPageDispatchProps, IApartmentPageParams, ILumoOneAppState>(\n\t\t\t({ layout, apartmentPage, locationData, apartmentBrowser, language, settings, pageViewTelemetry }) => ({\n\t\t\t\t...apartmentPage,\n\t\t\t\tlanguage: language.currentLanguage,\n\t\t\t\tlocationData: locationData.locationData,\n\t\t\t\tcurrentSearchUrl:\n\t\t\t\t\tapartmentBrowser &&\n\t\t\t\t\tlocationData.locationData &&\n\t\t\t\t\tGetUrlForCriteria(\n\t\t\t\t\t\tlanguage.currentLanguage,\n\t\t\t\t\t\tapartmentBrowser.currentSearchState.criteria || {},\n\t\t\t\t\t\tlocationData.locationData!,\n\t\t\t\t\t),\n\t\t\t\tcommonUiRoot: settings.settings!.commonUiRoot,\n\t\t\t\tpageViewEventSent: pageViewTelemetry.eventHasBeenSent,\n\t\t\t\tbreadCrumbParents: layout.breadcrumbParents,\n\t\t\t}),\n\t\t\t{\n\t\t\t\tgetApartment: apartmentPageActions.getApartmentBySlug.request,\n\t\t\t\tgetApartmentState: apartmentPageActions.getApartmentState.request,\n\t\t\t\tsetLayoutValues: layoutActions.setValues,\n\t\t\t\tpageComplete: pageViewTelemetryActions.pageComplete,\n\t\t\t},\n\t\t)(ApartmentPage),\n\t),\n);\n\nfunction Status404() {\n\tconst setStatusCode = useSetStatusCode();\n\tuseRunOnce(() => setStatusCode(404));\n\treturn null;\n}\n","import { ApartmentSearchResultAM, NearbyServiceCategory } from './ApartmentSearchResultAM';\nimport { filterInOrder } from '../../Components/arrayUtilities';\nimport { ImageAM } from './ImageAM';\nimport { CableTVDetails, BusinessEntityFeature, BroadbandDetails } from './BusinessEntityAM';\nimport { LinkedMediaAM } from './LinkedMediaAM';\nimport { BenefitCategory } from '../../Benefits/Api/ApiModels';\n\nexport type NearbyServiceList = Record<NearbyServiceCategory, NearbyServiceAM[]>;\n\nexport class ApartmentAM extends ApartmentSearchResultAM {\n\tzipCode: string;\n\tbusinessEntity: ApartmentBusinessEntityAM;\n\tmarketingText?: string;\n\tmarketingTextEn?: string;\n\tdirectRentalAvailabilityDate?: Date;\n\trenovationCompletionDate?: Date;\n\tnextShowingEndTime?: Date;\n\tnextShowingDescription?: string;\n\tfeatures: ApartmentFeatureAM[];\n\tbuildingType: string;\n\tnonSmokingBuilding: boolean;\n\timages: ImageAM[];\n\tlocation?: LocationAM;\n\tnearbyServices: NearbyServiceList;\n\tisNew: boolean;\n\tisFreshlyRenovated: boolean;\n\tcustomerTestimonials: string[];\n\tmedia: LinkedMediaAM[];\n\tcampaign?: ApartmentCampaignAM;\n\tbenefits: ApartmentBenefitAM[];\n\telectricityIncludedInRent?: boolean;\n\trentableWithBookingFee?: boolean;\n\tbookingFee: number;\n\twaterFeeBasis: WaterFeeBasisAM;\n}\n\nexport function getSpecialFeatures(a: ApartmentAM): ApartmentFeatureAM[] {\n\treturn [...filterInOrder(a.features, 'Elevator'), ...getOutdoorFeatures(a), ...filterInOrder(a.features, 'Sauna')];\n}\n\nexport function getOutdoorFeatures(a: ApartmentAM): ApartmentFeatureAM[] {\n\tconst desired: ApartmentFeatureAM[] = [\n\t\t'FrenchBalcony',\n\t\t'GlassedBalcony',\n\t\t'NormalBalcony',\n\t\t'Yard',\n\t\t'Terrace',\n\t\t'GlassedTerrace',\n\t];\n\n\treturn filterInOrder(a.features, ...desired);\n}\n\nexport function getOtherFeatures(a: ApartmentAM): ApartmentFeatureAM[] {\n\tconst desired: ApartmentFeatureAM[] = [\n\t\t'ClothesRoom',\n\t\t'Alcove',\n\t\t'SleepingLoft',\n\t\t'UtilityRoom',\n\t\t'SeparateWc',\n\t\t'HeatedStorage',\n\t\t'OutdoorStorage',\n\t\t'Accessible',\n\t\t'BroadbandWithVvoPricing',\n\t\t'Dishwasher',\n\t\t'SleepingArea',\n\t];\n\n\treturn filterInOrder(a.features, ...desired);\n}\n\nexport enum ApartmentStateAM {\n\tAvailable = 'Available',\n\tRented = 'Rented',\n\tReservedForCurrentUser = 'ReservedForCurrentUser',\n\tReservedForOtherUser = 'ReservedForOtherUser',\n}\n\nexport enum WaterFeeBasisAM {\n\tUnknown = 'Unknown',\n\tInhabitantCount = 'InhabitantCount',\n\tConsumption = 'Consumption',\n\tIncludedInRent = 'IncludedInRent',\n}\n\nexport class ApartmentBusinessEntityAM {\n\tisPreMarketing: false;\n\tconstructionYear: string;\n\tbuildingType: string;\n\tisTenantSelectionFinanciallyLimited: boolean;\n\n\tid: string;\n\n\tmarketingText?: string;\n\tmarketingTextEn?: string;\n\tareaMarketingText: string;\n\thasSubAreaMarketingText: string;\n\tenergyEfficiencyClass?: string;\n\thasCarbonNeutralHeating: boolean;\n\twaterFeePerPersonMonth: number;\n\n\texternalParkingSpaceManagementDescription: string;\n\tavailableParkingSpaceCount?: number;\n\telectricChargingParkingSpaceCount: number;\n\n\thasElevator?: boolean;\n\tcableTV?: CableTVDetails;\n\tisNonSmoking?: boolean;\n\n\tfeatures: BusinessEntityFeature[];\n\n\tbroadband: BroadbandDetails;\n}\n\nexport class LocationAM {\n\tlat: number;\n\tlon: number;\n}\n\nexport enum ApartmentStatusAM {\n\tUnknown = 'Unknown',\n\tNotavailable = 'Notavailable',\n\tReserved = 'Reserved',\n\tAvailable = 'Available',\n\tInrenovation = 'Inrenovation',\n}\n\nexport type ApartmentFeatureAM =\n\t| 'NormalBalcony'\n\t| 'FrenchBalcony'\n\t| 'GlassedBalcony'\n\t| 'Yard'\n\t| 'Terrace'\n\t| 'GlassedTerrace'\n\t| 'ClothesRoom'\n\t| 'UtilityRoom'\n\t| 'Accessible'\n\t| 'NonSmoking'\n\t| 'Alcove'\n\t| 'HeatedStorage'\n\t| 'OutdoorStorage'\n\t| 'BroadbandWithVvoPricing'\n\t| 'WaterBillingByInhabitantCount'\n\t| 'WaterBillingByConsumption'\n\t| 'Dishwasher'\n\t| 'SeparateWc'\n\t| 'BathroomWithWc'\n\t| 'BathroomWithoutWc'\n\t| 'Sauna'\n\t| 'Elevator'\n\t| 'SleepingLoft'\n\t| 'SleepingArea';\n\nexport class NearbyServiceAM {\n\tname: string;\n\tinfo: string;\n\tdistance: number;\n}\n\nexport class ApartmentCampaignAM {\n\tactionLinkText?: string;\n\tactionLink?: string;\n\tshortDescription: string;\n\tlongDescription: string;\n}\n\nexport class ApartmentBenefitAM {\n\ttechnicalName: string;\n\theading: string;\n\tdescription: string;\n\tcategories: BenefitCategory[];\n\tlinkText: string;\n\tlinkUrl: string;\n\tpriceFrom: number | undefined;\n}\n","import { ApartmentSalesChannel, ApartmentSearchResultAM } from './Api/ApartmentSearchResultAM';\nimport {\n\tApartmentSearchCriteria,\n\tApartmentFeature,\n\tSearchCriteriaNearbyService,\n\tApartmentType,\n} from './Browser/ApartmentSearchCriteria';\n\nconst isFeatureSet = (f: ApartmentFeature, criteria: ApartmentSearchCriteria): boolean =>\n\tcriteria != null && criteria.features != null && criteria.features.some((c) => c === f);\nconst isNearbySet = (s: SearchCriteriaNearbyService, criteria: ApartmentSearchCriteria): boolean =>\n\tcriteria != null && criteria.nearbyServices != null && criteria.nearbyServices.some((n) => n === s);\n\ntype IsRuleApplicable = (c: ApartmentSearchCriteria) => boolean;\ntype IsRuleMatch = (c: ApartmentSearchCriteria, a: ApartmentSearchResultAM) => boolean;\n\ntype SearchRule = [IsRuleApplicable, IsRuleMatch];\n\nexport const SuggestionSecondaryRules: SearchRule[] = [\n\t[(c) => !!c.maxRent, (c, a) => !a.rent || a.rent <= c.maxRent!],\n\t[\n\t\t(c) => !!c.areaInSqm,\n\t\t(c, a) =>\n\t\t\t!a.areaInSqm ||\n\t\t\t((!c.areaInSqm!.min || a.areaInSqm >= c.areaInSqm!.min) &&\n\t\t\t\t(!c.areaInSqm!.max || a.areaInSqm <= c.areaInSqm!.max)),\n\t],\n\t[(c) => isFeatureSet('NewOrRenovated', c), (c, a) => a.isNew || a.isFreshlyRenovated],\n\t[(c) => isFeatureSet('FinanciallyLimited', c), (c, a) => a.financiallyLimited === true],\n\t[\n\t\t(c) => isFeatureSet('FreeParkingPlaces', c),\n\t\t(c, a) => !!a.availableParkingSpaceCount && a.availableParkingSpaceCount > 0,\n\t],\n\t[\n\t\t(c) => isFeatureSet('FreeElectricChargingParkingPlace', c),\n\t\t(c, a) => !!a.availableParkingSpaceCount && a.availableParkingSpaceCount > 0,\n\t],\n\t[\n\t\t(c) => isFeatureSet('DirectRentalAvailable', c),\n\t\t(c, a) =>\n\t\t\ta.channel === ApartmentSalesChannel.DirectRental || a.channel === ApartmentSalesChannel.PersonalService,\n\t],\n\t[(c) => isFeatureSet('SeniorHousing', c), (c, a) => a.seniorHousing === true],\n\t//[c => isFeatureSet('Premium', c), (c, a) => a.isPremium === true],\n\t[(c) => isNearbySet('Daycare', c), (c, a) => a.nearby.some((s) => s === 'Daycare')],\n\t[(c) => isNearbySet('Grocery', c), (c, a) => a.nearby.some((s) => s === 'Grocery')],\n\t[(c) => isNearbySet('Schools', c), (c, a) => a.nearby.some((s) => s === 'Schools')],\n\t[(c) => isFeatureSet('Laundry', c), (c, a) => a.laundryRoom === true],\n\t[(c) => isFeatureSet('Sauna', c), (c, a) => a.sauna === true],\n\t[(c) => isFeatureSet('SharedSauna', c), (c, a) => a.sharedSauna === true],\n\t[(c) => isFeatureSet('TopFloor', c), (c, a) => a.topFloor === true],\n\t[(c) => isFeatureSet('BalconyOrTerrace', c), (c, a) => a.balcony === true || a.terrace === true],\n\t[(c) => isFeatureSet('AvailableByApplication', c), (c, a) => a.channel === ApartmentSalesChannel.Application],\n\t[(c) => isFeatureSet('Elevator', c), (c, a) => a.elevator === true],\n\t[\n\t\t// If Feature FinanciallyLimited is included then we can ignore this since that handles showing only apartments with FinanciallyLimited\n\t\t(c) => !isFeatureSet('FinanciallyLimited', c) && !c.includeFinanciallyLimited,\n\t\t(c, a) => !a.financiallyLimited,\n\t],\n];\n\nconst AllRules = SuggestionSecondaryRules.concat([\n\t[\n\t\t(c) => !!c.roomCount && c.roomCount.length > 0,\n\t\t(c, a) => c.roomCount!.some((r) => isMatchByApartmentType(a.roomCount, r)),\n\t],\n]);\n\n/**\n * Returns a set of match functions rules that apply based on given criteria\n * @param ruleset All possible rules to consider\n * @param criteria Search criteria, determines the applicable rules\n * @returns list of match functions that take an apartment as input\n */\nexport function getApplicableRules(ruleset: SearchRule[], criteria: ApartmentSearchCriteria) {\n\treturn ruleset\n\t\t.filter(([isApplicable]) => isApplicable(criteria))\n\t\t.map(\n\t\t\t([, isMatch]) =>\n\t\t\t\t(a: ApartmentSearchResultAM) =>\n\t\t\t\t\tisMatch(criteria, a),\n\t\t);\n}\n\n/**\n * Get apartments matching other-than-location criteria.\n * This was used solely for filtering before filtering was implemented to backend.\n * Might be worth saving even if it's unused.\n * @param apartments Apartment list, containing also other apartments than ones matching criteria\n * @param criteria Search criteria\n * @returns Apartments matching criteria, location omitted\n */\nexport function filterByOtherCriteriaThanLocation(\n\tapartments: ApartmentSearchResultAM[],\n\tcriteria?: ApartmentSearchCriteria,\n): ApartmentSearchResultAM[] {\n\tif (criteria == null) {\n\t\treturn apartments;\n\t}\n\n\tconst applicableRules = getApplicableRules(AllRules, criteria);\n\treturn apartments.filter((a) => applicableRules.every((r) => r(a)));\n}\n\nexport function getApartmentTypeByRoomCount(roomCount: number) {\n\tswitch (roomCount) {\n\t\tcase 1:\n\t\t\treturn ApartmentType.Yksio;\n\t\tcase 2:\n\t\t\treturn ApartmentType.Kaksio;\n\t\tcase 3:\n\t\t\treturn ApartmentType.Kolmio;\n\t\tcase 4:\n\t\t\treturn ApartmentType.Nelio;\n\t\tdefault:\n\t\t\treturn ApartmentType.SuurempiKuinNelio;\n\t}\n}\n\nexport function isMatchByApartmentType(roomCount: number, type: ApartmentType) {\n\tswitch (type) {\n\t\tcase ApartmentType.Yksio:\n\t\t\treturn roomCount === 1;\n\t\tcase ApartmentType.Kaksio:\n\t\t\treturn roomCount === 2;\n\t\tcase ApartmentType.Kolmio:\n\t\t\treturn roomCount === 3;\n\t\tcase ApartmentType.Nelio:\n\t\t\treturn roomCount === 4;\n\t\tdefault:\n\t\t\treturn roomCount > 4;\n\t}\n}\n","import { ResourceText } from '../../Components/ResourceText';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { ApartmentAM, ApartmentStateAM } from '../Api/ApartmentAM';\nimport { routeFromRoot, routes } from '../../Common/routes';\nimport { addTelemetryEventForNewRentalProcessStart } from '../../DirectRental/Telemetry';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { directRentalActions } from '../../DirectRental/directRentalActions';\nimport { useNavigate } from 'react-router-dom';\nimport { Language } from '../../Common/interfaces/language';\nimport { addApartmentToApplication, getApplicationUrl } from '../../Application/Page/applicationActions';\nimport { ApartmentApplicationProcessStage } from '../../Application/Page/applicationStage';\nimport { ILumoOneAppState } from '../../boot/configureStore';\nimport { applicationPageActions } from '../../Application/Page/applicationPageActions';\nimport { SiteIntroStep } from '../../FrontPage/SiteIntroStep';\nimport {\n\tLocationBusinessEntity,\n\tLocationMunicipality,\n\tLocationMunicipalitySubArea,\n} from '../../LocationDataProvider/LocationData';\nimport { ApartmentSalesChannel } from '../Api/ApartmentSearchResultAM';\nimport { useFavoritesContext } from '../../ApartmentAgent/FavoritesContext';\nimport { addTelemetryEventForLightLogin } from '../../Telemetry/TelemetryManager';\nimport { GA4EventAction } from '../../Telemetry/TelemetryGA4';\n\ninterface StickyRentalOperationProps {\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea?: LocationMunicipalitySubArea;\n\tbusinessEntity: LocationBusinessEntity;\n\tapartment: ApartmentAM;\n\tapartmentState: ApartmentStateAM;\n\tlanguage: Language;\n\tvisible: boolean;\n}\n\nexport function StickyRentalBottomBar(props: StickyRentalOperationProps) {\n\tconst { apartment, apartmentState, language } = props;\n\n\tif (apartmentState !== 'Available' && apartmentState !== 'ReservedForCurrentUser') {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={'sticky-start-rent-flow' + (props.visible ? ' -open' : '')}>\n\t\t\t{apartment.channel === ApartmentSalesChannel.DirectRental ||\n\t\t\tapartment.channel === ApartmentSalesChannel.PersonalService ? (\n\t\t\t\t<DirectRentalContent\n\t\t\t\t\t{...props}\n\t\t\t\t\thideSteps={apartment.channel === ApartmentSalesChannel.PersonalService}\n\t\t\t\t/>\n\t\t\t) : apartment.channel === ApartmentSalesChannel.Application ? (\n\t\t\t\t<ApplicationContent apartment={apartment} apartmentState={apartmentState} language={language} />\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n\ntype DirectRentalContentProps = StickyRentalOperationProps;\n\nfunction DirectRentalContent({\n\tapartment,\n\tapartmentState,\n\tlanguage,\n\tmunicipality,\n\tmunicipalitySubArea,\n\tbusinessEntity,\n\thideSteps,\n}: DirectRentalContentProps & { hideSteps?: boolean }) {\n\tconst dispatch = useDispatch();\n\tconst navigate = useNavigate();\n\tconst reduxState = useSelector(({ directRental }: ILumoOneAppState) => ({\n\t\tisRentInProgress: directRental.isDirectRentalInProgress,\n\t}));\n\tconst [expanded, setExpanded] = useState(false);\n\tconst { favoriteApartmentIDs } = useFavoritesContext();\n\n\tfunction startRental() {\n\t\tif (apartment && !reduxState.isRentInProgress) {\n\t\t\tdispatch(directRentalActions.resetRentalState());\n\t\t\tdispatch(directRentalActions.selectApartmentForRent(apartment.id));\n\t\t\taddTelemetryEventForNewRentalProcessStart(\n\t\t\t\tapartment,\n\t\t\t\tmunicipality.name,\n\t\t\t\tmunicipalitySubArea ? municipalitySubArea.name : undefined,\n\t\t\t\tbusinessEntity.name,\n\t\t\t);\n\t\t\tif (favoriteApartmentIDs.some((favorite) => favorite.id === apartment.id)) {\n\t\t\t\taddTelemetryEventForLightLogin(GA4EventAction.favorite_to_rent_process);\n\t\t\t}\n\t\t\tnavigate(routeFromRoot(routes.startRenting)[language]);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className={`directRentalContent${expanded ? ' -expanded' : ''}`}>\n\t\t\t{expanded && <CloseButton onClose={() => setExpanded(false)} />}\n\t\t\t{hideSteps !== true && <DirectRentalSteps />}\n\t\t\t<button\n\t\t\t\tclassName=\"button button__iconWrapper\"\n\t\t\t\tdisabled={apartmentState !== 'Available' || reduxState.isRentInProgress}\n\t\t\t\tonClick={startRental}\n\t\t\t>\n\t\t\t\t<DirectRentalActionText\n\t\t\t\t\tapartmentState={apartmentState}\n\t\t\t\t\tisRentInProgress={reduxState.isRentInProgress}\n\t\t\t\t\tisPersonalService={apartment.channel === ApartmentSalesChannel.PersonalService}\n\t\t\t\t/>\n\t\t\t</button>\n\t\t\t{!expanded && (\n\t\t\t\t<a className=\"howTo\" onClick={() => setExpanded(true)}>\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_StartRentalProcess_HowTo\" />\n\t\t\t\t</a>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction CloseButton({ onClose }: { onClose: () => void }) {\n\treturn <button className=\"closeExpanded\" onClick={onClose} />;\n}\n\nfunction DirectRentalSteps() {\n\treturn (\n\t\t<div className=\"directRentalSteps\">\n\t\t\t<SiteIntroStep number=\"1\" resourceKey=\"ApartmentPage_StartRentalProcess_Step1\" />\n\t\t\t<SiteIntroStep number=\"2\" resourceKey=\"ApartmentPage_StartRentalProcess_Step2\" />\n\t\t\t<SiteIntroStep number=\"3\" resourceKey=\"ApartmentPage_StartRentalProcess_Step3\" />\n\t\t</div>\n\t);\n}\n\ntype ApplicationContentProps = Pick<StickyRentalOperationProps, 'apartment' | 'apartmentState' | 'language'>;\n\nexport function ApplicationContent({ apartment, apartmentState, language }: ApplicationContentProps) {\n\tconst dispatch = useDispatch();\n\tconst navigate = useNavigate();\n\tconst reduxState = useSelector(({ apartmentPage, applicationPage }: ILumoOneAppState) => ({\n\t\tapartmentIsAddedToApplication: applicationPage.apartments.some(\n\t\t\t(a) => apartmentPage.apartment && a.id === apartmentPage.apartment.id,\n\t\t),\n\t\tapartmentsAddedToApplication: applicationPage.apartments,\n\t\tapplicationStage: applicationPage.applicationStage,\n\t}));\n\n\tfunction handleAddApartmentToApplication() {\n\t\tif (!reduxState.apartmentIsAddedToApplication) {\n\t\t\taddApartmentToApplication(\n\t\t\t\t(apartment: ApartmentAM) => dispatch(applicationPageActions.addApartmentToApplication(apartment)),\n\t\t\t\tapartment,\n\t\t\t\treduxState.apartmentsAddedToApplication,\n\t\t\t);\n\t\t}\n\t\tnavigate(\n\t\t\tgetApplicationUrl(\n\t\t\t\treduxState.applicationStage || ApartmentApplicationProcessStage.ChooseApartments,\n\t\t\t\tlanguage,\n\t\t\t),\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tclassName=\"button button__iconWrapper\"\n\t\t\tdisabled={apartmentState !== 'Available'}\n\t\t\tonClick={handleAddApartmentToApplication}\n\t\t>\n\t\t\t<StartApplicationProcessText\n\t\t\t\tapartmentIsAddedToApplication={reduxState.apartmentIsAddedToApplication}\n\t\t\t\tapplicationInProgress={Boolean(reduxState.applicationStage)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n\nfunction DirectRentalActionText({\n\tapartmentState,\n\tisRentInProgress,\n\tisPersonalService,\n}: {\n\tapartmentState: ApartmentStateAM;\n\tisRentInProgress: boolean;\n\tisPersonalService: boolean;\n}) {\n\tif (apartmentState === 'ReservedForCurrentUser') {\n\t\treturn <ResourceText resourceKey=\"ApartmentPage_RentalProcessAlreadyStarted\" />;\n\t}\n\n\tif (apartmentState === 'Available' && !isRentInProgress) {\n\t\treturn isPersonalService ? (\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_StartRentalProcess_Button_PersonalService\" />\n\t\t) : (\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_StartRentalProcess_Button\" />\n\t\t);\n\t}\n\n\tif (apartmentState === 'Available' && isRentInProgress) {\n\t\treturn <ResourceText resourceKey=\"ApartmentPage_RentalProcessStartedForAnotherApartment\" />;\n\t}\n\n\treturn <ResourceText resourceKey=\"ApartmentPage_StartRentalProcessButton_AlreadyRentedOrReserved\" />;\n}\n\nfunction StartApplicationProcessText({\n\tapartmentIsAddedToApplication,\n\tapplicationInProgress,\n}: {\n\tapartmentIsAddedToApplication: boolean;\n\tapplicationInProgress: boolean;\n}) {\n\treturn apartmentIsAddedToApplication ? (\n\t\t<ResourceText resourceKey=\"ApartmentPage_ApartmentAlreadyAddedToApplication\" />\n\t) : applicationInProgress ? (\n\t\t<ResourceText resourceKey=\"ApartmentPage_AddToApplication\" />\n\t) : (\n\t\t<ResourceText resourceKey=\"ApartmentPage_StartApplicationProcess\" />\n\t);\n}\n","import PageMeta from '../../Common/Layout/PageMeta';\nimport { ResourceText } from '../../Components/ResourceText';\nimport * as React from 'react';\n\nexport function Loader() {\n\treturn (\n\t\t<>\n\t\t\t<PageMeta title=\"\" />\n\t\t\t<div className=\"atom-loadingSpinner -topMargin\">\n\t\t\t\t<div className=\"atom-loadingSpinner__circle\" />\n\t\t\t\t<div className=\"atom-loadingSpinner__description\">\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_DataLoading\" defaultText=\"Haetaan asunnon tietoja...\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { ApartmentAM } from '../Api/ApartmentAM';\nimport { LazyContainer } from '../../Components/LazyImage';\nimport { NearbyServices } from '../../Components/NearbyServices';\nimport * as React from 'react';\n\nexport function NearbyServicesMap({ apartment }: { apartment: ApartmentAM }) {\n\tconst location = apartment.location || { lat: 0, lon: 0 };\n\treturn (\n\t\t<div id=\"nearbyServices\">\n\t\t\t<LazyContainer className=\"map-lazy-container\">\n\t\t\t\t<NearbyServices\n\t\t\t\t\tcenter={location}\n\t\t\t\t\tservices={apartment.nearbyServices}\n\t\t\t\t\tshowPublicTransportBar={true}\n\t\t\t\t\tbusinessEntityId={apartment.businessEntityId}\n\t\t\t\t/>\n\t\t\t</LazyContainer>\n\t\t</div>\n\t);\n}\n","import { ApartmentAM } from '../Api/ApartmentAM';\nimport { ResourceText } from '../../Components/ResourceText';\nimport * as React from 'react';\nimport { useFavoritesContext } from '../../ApartmentAgent/FavoritesContext';\n\nexport function TopBarFavoriteButton({ apartment }: { apartment: ApartmentAM }) {\n\tconst { favoriteApartmentIDs, addFavorite, removeFavorite } = useFavoritesContext();\n\tconst isFavorite = favoriteApartmentIDs.some((f) => f.id === apartment.id);\n\n\treturn (\n\t\t<button\n\t\t\tclassName={'mod-topBar__link -favourites' + (isFavorite ? ' -favAdded' : '')}\n\t\t\tonClick={() => (isFavorite ? removeFavorite(apartment.id) : addFavorite(apartment.id))}\n\t\t>\n\t\t\t{isFavorite ? (\n\t\t\t\t<ResourceText resourceKey=\"Apartment_RemoveFromFavorites\" defaultText=\"Poista suosikeista\" />\n\t\t\t) : (\n\t\t\t\t<ResourceText resourceKey=\"Apartment_AddToFavorites\" defaultText=\"Lisää suosikkeihin\" />\n\t\t\t)}\n\t\t</button>\n\t);\n}\n","import { ResourceText, ResourceTextInline } from '../../Components/ResourceText';\nimport { ResourceImageInlineSvg } from '../../Components/ResourceImageInlineSvg';\nimport * as React from 'react';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { ApartmentAM, ApartmentStateAM } from '../Api/ApartmentAM';\nimport {\n\tLocationBusinessEntity,\n\tLocationData,\n\tLocationMunicipality,\n\tLocationMunicipalitySubArea,\n} from '../../LocationDataProvider/LocationData';\nimport { LinkedMediaItem, MediaItem } from '../../Components/MediaCarousel';\nimport { ImageCarouselWithFullScreenSupport } from '../../Components/ImageCarouselWithFullScreenSupport';\nimport { ApartmentDetails } from './ApartmentDetails';\nimport { housingVideoPresetConfig } from '../../Components/realEstateMediaPresets';\nimport { BusinessEntityDetailsNew } from './BusinessEntityDetailsNew';\nimport ArticleLinks from '../../Components/ArticleLinks/ArticleLinks';\nimport { MarkdownContent } from '../../Components/MarkdownContent';\nimport { CampaignBanner, CampaignBannerVariant } from './CampaignBanner';\nimport { ApartmentShowingBanner, ApartmentShowingBannerVariant } from './ApartmentShowingBanner';\nimport { CustomerTestimonials } from './CustomerTestimonials';\nimport { AllBenefits } from './AllBenefits';\nimport OtherAvailableApartmentsList from './OtherAvailableApartmentsList';\nimport SmartLink from '../../Components/SmartLink';\nimport { GetUrlForCriteria } from '../Browser/apartmentSearchUrlHandling';\nimport { Language } from '../../Common/interfaces/language';\nimport { useLightLoginContext } from '../../ApartmentAgent/LightLoginContext';\nimport { useLightLoginTelemetryApi } from '../../ApartmentAgent/LightLoginTelemetryApiClient';\nimport { useActivityTimerRef } from '../../hooks/useActivityTimerRef';\nimport { useCarouselImages } from '../../Components/useCarouselImages';\n\ninterface ApartmentInfoProps {\n\tapartmentState: ApartmentStateAM;\n\tapartment: ApartmentAM;\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea?: LocationMunicipalitySubArea;\n\tbusinessEntity: LocationBusinessEntity;\n\tbusinessEntityName: string;\n\tlocationData: LocationData | undefined;\n\tlanguage: Language;\n}\n\nfunction useLightLoginTelemetry() {\n\tconst telemetryApiClient = useLightLoginTelemetryApi();\n\tconst { loggedIn } = useLightLoginContext();\n\tconst activityTimer = useActivityTimerRef();\n\n\tconst collectTelemetryRef = React.useRef<() => void | undefined>();\n\n\tconst telemetryData = React.useRef({\n\t\tapartmentId: '',\n\t\ttimeSpentOnPage: 0,\n\t\tuserInteractions: 0,\n\t});\n\n\t// Send telemetry and stop timer when component is disposed\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tconst elapsedMs = activityTimer.current.getElapsed();\n\t\t\ttelemetryData.current.timeSpentOnPage = elapsedMs / 1000;\n\n\t\t\t// Only send the telemetry data if light login session is available.\n\t\t\tif (collectTelemetryRef.current) {\n\t\t\t\tcollectTelemetryRef.current();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tcollectTelemetryRef.current = loggedIn\n\t\t\t? () =>\n\t\t\t\t\ttelemetryApiClient.sendTelemetryEvent({\n\t\t\t\t\t\titemType: 'LumoFi.ApartmentPageView',\n\t\t\t\t\t\tdata: telemetryData.current,\n\t\t\t\t\t})\n\t\t\t: undefined;\n\t}, [telemetryApiClient, loggedIn]);\n\n\tfunction addInteraction() {\n\t\ttelemetryData.current.userInteractions = telemetryData.current.userInteractions + 1;\n\t}\n\n\tfunction addApartmentId(id: string) {\n\t\ttelemetryData.current.apartmentId = id;\n\t}\n\n\treturn { addApartmentId, addInteraction };\n}\n\nexport function ApartmentInfo({\n\tapartment,\n\tapartmentState,\n\tmunicipality,\n\tmunicipalitySubArea,\n\tbusinessEntity,\n\tbusinessEntityName,\n\tlocationData,\n\tlanguage,\n}: ApartmentInfoProps) {\n\tconst { addInteraction, addApartmentId } = useLightLoginTelemetry();\n\n\tuseEffect(() => {\n\t\taddApartmentId(apartment.id);\n\t}, [apartment]);\n\n\treturn (\n\t\t<div className=\"view-apartment__infoPrimary\" onClick={addInteraction}>\n\t\t\t{apartment.nextShowingStartTime && (\n\t\t\t\t<ApartmentShowingBanner apartment={apartment} variant={ApartmentShowingBannerVariant.TopBanner} />\n\t\t\t)}\n\t\t\t<ImageCarousel\n\t\t\t\tapartment={apartment}\n\t\t\t\tmunicipality={municipality}\n\t\t\t\tmunicipalitySubArea={municipalitySubArea}\n\t\t\t/>\n\t\t\t<DesktopRightColumnContainer>\n\t\t\t\t<ApartmentDetails\n\t\t\t\t\tapartment={apartment}\n\t\t\t\t\tmunicipality={municipality}\n\t\t\t\t\tmunicipalitySubArea={municipalitySubArea}\n\t\t\t\t\tbusinessEntity={businessEntity}\n\t\t\t\t\tapartmentState={apartmentState}\n\t\t\t\t/>\n\t\t\t\t{apartment.nextShowingStartTime && (\n\t\t\t\t\t<ApartmentShowingBanner apartment={apartment} variant={ApartmentShowingBannerVariant.SideBanner} />\n\t\t\t\t)}\n\t\t\t\t{apartment.campaign && (\n\t\t\t\t\t<CampaignBanner campaign={apartment.campaign} variant={CampaignBannerVariant.SideBanner} />\n\t\t\t\t)}\n\t\t\t</DesktopRightColumnContainer>\n\n\t\t\t{apartmentState === 'Rented' && (\n\t\t\t\t<ResourceImageInlineSvg resourceKey=\"Apartment_AlreadyRented_Svg\" className=\"view-apartment__rented\" />\n\t\t\t)}\n\t\t\t{apartment.customerTestimonials.length > 0 && (\n\t\t\t\t<CustomerTestimonials items={apartment.customerTestimonials} showIndicators={true} />\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName=\"mod-textBlock apartmentDescription text text--small\"\n\t\t\t\tstyle={{ paddingBottom: 0 }}\n\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t__html:\n\t\t\t\t\t\tlanguage === 'en' && !!apartment.marketingTextEn\n\t\t\t\t\t\t\t? apartment.marketingTextEn\n\t\t\t\t\t\t\t: apartment.marketingText!,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<ArticleLinks\n\t\t\t\tclassName=\"mod-textBlock houseArticles\"\n\t\t\t\ttagPrimary={businessEntityName}\n\t\t\t\ttake={2}\n\t\t\t\tvariant=\"twoColumns\"\n\t\t\t\theading={\n\t\t\t\t\t<h3>\n\t\t\t\t\t\t<ResourceTextInline\n\t\t\t\t\t\t\tresourceKey=\"ApartmentPage_HouseArticles_Heading\"\n\t\t\t\t\t\t\tdefaultText=\"Artikkelit taloon liittyen\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</h3>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<div className=\"mod-textBlock areaDescription\">\n\t\t\t\t{apartment.businessEntity.areaMarketingText && (\n\t\t\t\t\t<AreaDescription\n\t\t\t\t\t\tapartment={apartment}\n\t\t\t\t\t\tmunicipality={municipality}\n\t\t\t\t\t\tmunicipalitySubArea={municipalitySubArea}\n\t\t\t\t\t\tlocationData={locationData}\n\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<OtherAvailableApartmentsList apartmentId={apartment.id} />\n\t\t\t\t<ArticleLinks\n\t\t\t\t\tclassName=\"house-articles\"\n\t\t\t\t\ttagPrimary={municipality.name}\n\t\t\t\t\ttagSecondary={municipalitySubArea ? municipalitySubArea.name : undefined}\n\t\t\t\t\ttake={2}\n\t\t\t\t\tvariant=\"twoColumns\"\n\t\t\t\t\theading={\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\t<ResourceTextInline\n\t\t\t\t\t\t\t\tresourceKey=\"ApartmentPage_AreaArticles_Heading\"\n\t\t\t\t\t\t\t\tdefaultText=\"Artikkelit alueeseen liittyen\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<AllBenefits benefits={apartment.benefits} />\n\t\t\t<BusinessEntityDetailsNew apartment={apartment} />\n\t\t</div>\n\t);\n}\n\ntype ImageCarouselProps = Omit<\n\tApartmentInfoProps,\n\t'apartmentState' | 'businessEntityName' | 'businessEntity' | 'locationData' | 'language'\n>;\n\nfunction ImageCarousel({ apartment, municipality, municipalitySubArea }: ImageCarouselProps) {\n\tconst [selectedImageIndex, setSelectedImageIndex] = useState(0);\n\n\tconst items = useCarouselImages(apartment.images, apartment.roomCount, municipality, municipalitySubArea);\n\titems.push(\n\t\t...apartment.media.map((m): LinkedMediaItem => ({ ...m, kind: 'linkedMedia', ...housingVideoPresetConfig })),\n\t);\n\n\tfunction setSelectedMedia(predicate: (m: MediaItem) => boolean) {\n\t\tconst selectedItemIndex = items.findIndex(predicate);\n\t\tif (selectedItemIndex >= 0) {\n\t\t\tsetSelectedImageIndex(selectedItemIndex);\n\t\t}\n\t}\n\n\tconst isBlueprint = (m: MediaItem) => m.kind == 'image' && m.type === 'Blueprint';\n\tconst isVideo = (m: MediaItem) => m.kind == 'linkedMedia' && m.mediaClass === 'Video';\n\tconst is3dContent = (m: MediaItem) =>\n\t\tm.kind == 'linkedMedia' && (m.mediaClass === 'Interactive' || m.mediaClass == 'Collection');\n\n\tconst ExtraControl = (predicate: (m: MediaItem) => boolean, resourceKey: string) => {\n\t\tif (!items.some(predicate)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst currentlySelected = items[selectedImageIndex];\n\t\tconst isActive = predicate(currentlySelected);\n\t\treturn (\n\t\t\t<button\n\t\t\t\tclassName={'carousel-extra-controls__button' + (isActive ? ' -active' : '')}\n\t\t\t\tonClick={() => setSelectedMedia(predicate)}\n\t\t\t>\n\t\t\t\t<ResourceText resourceKey={resourceKey} />\n\t\t\t</button>\n\t\t);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<ImageCarouselWithFullScreenSupport\n\t\t\t\tmediaItems={items}\n\t\t\t\tselectedItemIndex={selectedImageIndex}\n\t\t\t\tonSelectedItemChanged={(idx) => setSelectedImageIndex(idx)}\n\t\t\t\tthumbDisplayMode=\"new-singlerow\"\n\t\t\t\ttelemetryContext=\"apartment\"\n\t\t\t\textraControls={\n\t\t\t\t\t<div className=\"carousel-extra-controls\">\n\t\t\t\t\t\t{ExtraControl(isBlueprint, 'ApartmentPage_CarouselFloorPlanLinkLabel')}\n\t\t\t\t\t\t{ExtraControl(isVideo, 'ApartmentPage_CarouselVideoLinkLabel')}\n\t\t\t\t\t\t{ExtraControl(is3dContent, 'ApartmentPage_Carousel3dLinkLabel')}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t/>\n\t\t</>\n\t);\n}\n\nfunction DesktopRightColumnContainer({ children }: { children: ReactNode }) {\n\treturn <div className=\"desktopRightColumnContainer\">{children}</div>;\n}\n\ninterface AreaDescriptionProps {\n\tapartment: ApartmentAM;\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea?: LocationMunicipalitySubArea;\n\tlocationData: LocationData | undefined;\n\tlanguage: Language;\n}\n\nfunction AreaDescription({\n\tapartment,\n\tmunicipality,\n\tmunicipalitySubArea,\n\tlocationData,\n\tlanguage,\n}: AreaDescriptionProps) {\n\tconst locationCriteria = apartment.businessEntity.hasSubAreaMarketingText\n\t\t? { municipalitySubAreas: [municipalitySubArea!] }\n\t\t: { municipalities: [municipality] };\n\n\tconst otherApartmentsUrl = GetUrlForCriteria(\n\t\tlanguage,\n\t\t{\n\t\t\tlocation: locationCriteria,\n\t\t},\n\t\tlocationData,\n\t);\n\n\treturn (\n\t\t<div>\n\t\t\t<h4>\n\t\t\t\t<ResourceTextInline resourceKey=\"ApartmentPage_AreaDescription_Heading\" defaultText=\"Alueen kuvaus\" />\n\t\t\t</h4>\n\t\t\t<div className=\"mod-textBlock__text\">\n\t\t\t\t<h3>\n\t\t\t\t\t{apartment.businessEntity.hasSubAreaMarketingText ? municipalitySubArea!.name : municipality.name}\n\t\t\t\t</h3>\n\t\t\t\t<MarkdownContent text={apartment.businessEntity.areaMarketingText} className=\"text text--small\" />\n\t\t\t</div>\n\t\t\t<a href=\"#nearbyServices\">\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_AreaDescription_ShowOnMap_Link\" /> ›\n\t\t\t</a>\n\t\t\t&nbsp;&nbsp;&nbsp;&nbsp;\n\t\t\t<SmartLink to={otherApartmentsUrl}>\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_AreaDescription_SeeOtherApartmentsFromArea_Link\" /> ›\n\t\t\t</SmartLink>\n\t\t</div>\n\t);\n}\n","import * as React from 'react';\nimport { useResource } from './ResourceText';\n\nexport function ResourceImageInlineSvg({ resourceKey, className }: { resourceKey: string; className?: string }) {\n\tconst { getResourceText } = useResource();\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t__html: getResourceText(resourceKey),\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import * as React from 'react';\nimport {\n\tApartmentAM,\n\tApartmentBenefitAM,\n\tApartmentBusinessEntityAM,\n\tApartmentFeatureAM,\n\tApartmentStateAM,\n\tgetOtherFeatures,\n\tgetSpecialFeatures,\n\tWaterFeeBasisAM,\n} from '../Api/ApartmentAM';\nimport {\n\tLocationBusinessEntity,\n\tLocationMunicipality,\n\tLocationMunicipalitySubArea,\n} from '../../LocationDataProvider/LocationData';\nimport { ResourceText, useLanguage, useResource } from '../../Components/ResourceText';\nimport { FinanciallyLimitedTag, FreshlyRenovatedTag, NewApartmentTag, SeniorHousingTag, TrendingTag } from '../Badges';\nimport { ApartmentFeaturesContainer, CollapsibleFeatureGroup, CollapsibleFeatureGroupItem } from './ApartmentFeatures';\nimport {\n\tApartmentFloorIcon,\n\tApartmentFloorPlanIcon,\n\tApartmentRentGuaranteeIcon,\n\tApartmentRentIcon,\n\tApartmentSizeIcon,\n\tApartmentWaterIcon,\n\tHouseCarbonNeutralHeatingIcon,\n\tHouseElectricCarChargingIcon,\n\tHouseParkingIcon,\n\tRecidencyElectricityIcon,\n} from './ApartmentIcons';\nimport { toFormattedString } from '../../Components/numberUtils';\nimport { filterInOrder } from '../../Components/arrayUtilities';\nimport { BusinessEntityFeature } from '../Api/BusinessEntityAM';\nimport { Tooltip } from '../../Components/Tooltip';\nimport { getAvailability } from '../ApartmentAvailability';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport { ILumoOneAppState } from '../../boot/configureStore';\nimport { directRentalActions } from '../../DirectRental/directRentalActions';\nimport { routeFromRoot, routes } from '../../Common/routes';\nimport { addTelemetryEventForNewRentalProcessStart } from '../../DirectRental/Telemetry';\nimport { PoiMarkerIcon } from '../../Common/CommonIcons';\nimport { ApplicationContent } from './StickyRentalBottomBar';\nimport { getBenefitIconUrl, getBenefitIconUrlByTechicalName } from '../../Benefits/BenefitUtils';\nimport { ApartmentSalesChannel } from '../Api/ApartmentSearchResultAM';\nimport { ResourceImage } from '../../Components/ResourceImage';\nimport { useFavoritesContext } from '../../ApartmentAgent/FavoritesContext';\nimport { addTelemetryEventForLightLogin } from '../../Telemetry/TelemetryManager';\nimport { GA4EventAction } from '../../Telemetry/TelemetryGA4';\n\ninterface ApartmentProp {\n\tapartment: ApartmentAM;\n}\n\ninterface ApartmentDetailsProps extends ApartmentProp {\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea?: LocationMunicipalitySubArea;\n}\n\nexport function ApartmentDetails({\n\tapartment,\n\tmunicipality,\n\tmunicipalitySubArea,\n\tapartmentState,\n\tbusinessEntity,\n}: ApartmentDetailsProps & { apartmentState: ApartmentStateAM; businessEntity: LocationBusinessEntity }) {\n\treturn (\n\t\t<ApartmentFeaturesContainer>\n\t\t\t<ApartmentAddress\n\t\t\t\tapartment={apartment}\n\t\t\t\tmunicipality={municipality}\n\t\t\t\tmunicipalitySubArea={municipalitySubArea}\n\t\t\t/>\n\t\t\t<ApartmentHighlightDetails apartment={apartment} />\n\t\t\t<ApartmentFeaturesSection apartment={apartment} />\n\t\t\t<RentButtonContainer\n\t\t\t\tapartment={apartment}\n\t\t\t\tmunicipality={municipality}\n\t\t\t\tmunicipalitySubArea={municipalitySubArea}\n\t\t\t\tapartmentState={apartmentState}\n\t\t\t\tbusinessEntity={businessEntity}\n\t\t\t/>\n\t\t\t<HouseFeaturesSection apartment={apartment} />\n\t\t\t<ClimateResponsibilityBanner />\n\t\t\t<RecidencyIncludedFeaturesSection apartment={apartment} />\n\t\t\t<PaidExtraFeaturesSection apartment={apartment} />\n\t\t</ApartmentFeaturesContainer>\n\t);\n}\n\nfunction ApartmentAddress({ apartment, municipality, municipalitySubArea }: ApartmentDetailsProps) {\n\treturn (\n\t\t<div className=\"mod-apartmentInfoSecondary__address\">\n\t\t\t<h1 className=\"mod-apartmentInfoSecondary__address-primary\">{apartment.streetAddress}</h1>\n\t\t\t<h2 className=\"mod-apartmentInfoSecondary__address-secondary\">\n\t\t\t\t{municipalitySubArea ? `${municipalitySubArea.name}, ` : ''}\n\t\t\t\t{apartment.zipCode} {municipality.name}\n\t\t\t</h2>\n\t\t\t<a href=\"#nearbyServices\" className=\"mod-apartmentInfoSecondary__address-seeOnMap\">\n\t\t\t\t<PoiMarkerIcon />\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_SeeOnMap\" defaultText=\"Katso kartalla\" />\n\t\t\t</a>\n\t\t</div>\n\t);\n}\n\ninterface RentButtonContainerProps {\n\tapartment: ApartmentAM;\n\tmunicipality: LocationMunicipality;\n\tmunicipalitySubArea: LocationMunicipalitySubArea | undefined;\n\tbusinessEntity: LocationBusinessEntity;\n\tapartmentState: ApartmentStateAM;\n}\n\nfunction RentButtonContainer({\n\tapartment,\n\tmunicipality,\n\tmunicipalitySubArea,\n\tbusinessEntity,\n\tapartmentState,\n}: RentButtonContainerProps) {\n\tconst dispatch = useDispatch();\n\tconst navigate = useNavigate();\n\tconst language = useLanguage();\n\tconst reduxState = useSelector(({ directRental }: ILumoOneAppState) => ({\n\t\tisRentInProgress: directRental.isDirectRentalInProgress,\n\t}));\n\tconst { favoriteApartmentIDs } = useFavoritesContext();\n\n\tfunction startRental() {\n\t\tif (apartment && !reduxState.isRentInProgress) {\n\t\t\tdispatch(directRentalActions.resetRentalState());\n\t\t\tdispatch(directRentalActions.selectApartmentForRent(apartment.id));\n\t\t\taddTelemetryEventForNewRentalProcessStart(\n\t\t\t\tapartment,\n\t\t\t\tmunicipality.name,\n\t\t\t\tmunicipalitySubArea ? municipalitySubArea.name : undefined,\n\t\t\t\tbusinessEntity.name,\n\t\t\t);\n\t\t\tif (favoriteApartmentIDs.some((favorite) => favorite.id === apartment.id)) {\n\t\t\t\taddTelemetryEventForLightLogin(GA4EventAction.favorite_to_rent_process);\n\t\t\t}\n\t\t\tnavigate(routeFromRoot(routes.startRenting)[language]);\n\t\t}\n\t}\n\n\tfunction getDirectRentalActionText() {\n\t\tif (apartmentState === 'ReservedForCurrentUser') {\n\t\t\treturn (\n\t\t\t\t<ResourceText\n\t\t\t\t\tresourceKey=\"ApartmentPage_RentalProcessAlreadyStarted\"\n\t\t\t\t\tdefaultText=\"Sinulla on vuokraus asunnosta kesken\"\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tif (apartmentState === 'Available' && !reduxState.isRentInProgress) {\n\t\t\treturn apartment.channel === ApartmentSalesChannel.PersonalService ? (\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_StartRentalProcess_PersonalService\" />\n\t\t\t) : (\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_StartRentalProcess\" />\n\t\t\t);\n\t\t}\n\n\t\tif (apartmentState === 'Available' && reduxState.isRentInProgress) {\n\t\t\treturn <ResourceText resourceKey=\"ApartmentPage_RentalProcessStartedForAnotherApartment\" />;\n\t\t}\n\n\t\treturn (\n\t\t\t<ResourceText\n\t\t\t\tresourceKey=\"ApartmentPage_StartRentalProcessButton_AlreadyRentedOrReserved\"\n\t\t\t\tdefaultText=\"Asunto vuokrattu\"\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (apartment!.channel === ApartmentSalesChannel.Application) {\n\t\treturn (\n\t\t\t<div className=\"rentButtonContainer\">\n\t\t\t\t<ApplicationContent apartment={apartment} apartmentState={apartmentState} language={language} />\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"rentButtonContainer\">\n\t\t\t<button\n\t\t\t\tclassName=\"button\"\n\t\t\t\tonClick={startRental}\n\t\t\t\tdisabled={apartmentState !== 'Available' || reduxState.isRentInProgress}\n\t\t\t>\n\t\t\t\t<span className=\"mod-apartmentInfo__iconWrapper\">\n\t\t\t\t\t<svg className=\"icon\" width=\"28\" height=\"31\" viewBox=\"0 0 28 31\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t<g transform=\"scale(1 -1) rotate(-45 -22.5 6.4)\" fill=\"none\" fillRule=\"evenodd\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td=\"M28 11l-8.2 8.2A7 7 0 0011 26a7 7 0 1013.5-2.5L27 21v-3h3l3-3v-4h-5z\"\n\t\t\t\t\t\t\t\tstroke=\"#FFF\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\tstrokeLinecap=\"square\"\n\t\t\t\t\t\t\t></path>\n\t\t\t\t\t\t\t<circle fill=\"#FFF\" cx=\"17.6\" cy=\"26.4\" r=\"2\"></circle>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td=\"M15.3 3.1l-3 11.3a7 7 0 00-4.2 10.2 7 7 0 002.8 2.7c-.2-5.3 3.3-8.8 8.5-8.3a8.8 8.8 0 00-.8-3.3l.9-3.4L18 9.7l2.6-1.5 1-4.1-2-3.5-4.3 2.5z\"\n\t\t\t\t\t\t\t\tstroke=\"#FFF\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\tstrokeLinecap=\"square\"\n\t\t\t\t\t\t\t></path>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{getDirectRentalActionText()}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction ApartmentHighlightDetails({ apartment }: ApartmentProp) {\n\tconst {\n\t\tbusinessEntity: { constructionYear },\n\t} = apartment;\n\n\tconst { prefix: availabilityPrefix, value: availabilityValue } = getAvailability(apartment);\n\n\treturn (\n\t\t<div className=\"mod-apartmentInfo__highlights\">\n\t\t\t<div className=\"mod-apartmentInfo__tags\">\n\t\t\t\t{apartment.isNew && <NewApartmentTag nextShowingTime={apartment.nextShowingStartTime} />}\n\t\t\t\t{apartment.isFreshlyRenovated && <FreshlyRenovatedTag />}\n\t\t\t\t{apartment.financiallyLimited && <FinanciallyLimitedTag />}\n\t\t\t\t{apartment.seniorHousing && <SeniorHousingTag />}\n\t\t\t\t{apartment.isTrending && <TrendingTag />}\n\t\t\t</div>\n\t\t\t{constructionYear && (\n\t\t\t\t<p className=\"mod-apartmentInfo__highlights-item\">\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPageNew_BuiltDate\" parameters={[constructionYear]} />\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<p className=\"mod-apartmentInfo__highlights-item\">\n\t\t\t\t{availabilityPrefix} {availabilityValue}\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n\nfunction ApartmentFeaturesSection({ apartment }: ApartmentProp) {\n\treturn (\n\t\t<CollapsibleFeatureGroup\n\t\t\theading={<ResourceText resourceKey=\"ApartmentPageNew_FeatureGroupTitle_Apartment\" />}\n\t\t\tisOpenInitially={true}\n\t\t>\n\t\t\t<ApartmentFeatureRent apartment={apartment} />\n\t\t\t{!apartment.financiallyLimited && <ApartmentFeatureRentGuarantee />}\n\t\t\t<ApartmentFeatureSize apartment={apartment} />\n\t\t\t<ApartmentFeatureFloorPlan apartment={apartment} />\n\t\t\t<ApartmentFeatureNonSmoking apartment={apartment} />\n\t\t\t<ApartmentFeatureFloorNumber apartment={apartment} />\n\t\t\t<ApartmentFeatureWaterCharge apartment={apartment} />\n\t\t\t{getNewSpecialFeatures(apartment).map((feature) => (\n\t\t\t\t<ApartmentFeatureItem feature={feature} key={feature} />\n\t\t\t))}\n\t\t\t<FeaturesAdditionally\n\t\t\t\tfeatures={getNewOtherFeatures(apartment)}\n\t\t\t\tresourceKeyPrefix=\"ApartmentPage_Features_\"\n\t\t\t/>\n\t\t</CollapsibleFeatureGroup>\n\t);\n}\n\nfunction HouseFeaturesSection({ apartment }: ApartmentProp) {\n\treturn (\n\t\t<CollapsibleFeatureGroup\n\t\t\theading={<ResourceText resourceKey=\"ApartmentPageNew_FeatureGroupTitle_House\" />}\n\t\t\tisOpenInitially={true}\n\t\t>\n\t\t\t{hasElevator(apartment) && <HouseFeatureElevator />}\n\t\t\t{hasSauna(apartment.businessEntity) && (\n\t\t\t\t<HouseFeatureSauna onlineReservation={hasSaunaWithOnlineReservation(apartment.businessEntity)} />\n\t\t\t)}\n\t\t\t<HouseFeatureParking\n\t\t\t\tavailableParkingSpaceCount={apartment.availableParkingSpaceCount}\n\t\t\t\telectricChargingParkingSpaceCount={apartment.businessEntity.electricChargingParkingSpaceCount}\n\t\t\t\tbusinessEntityId={apartment.businessEntityId}\n\t\t\t\texternalParkingSpaceManagementDescription={\n\t\t\t\t\tapartment.businessEntity.externalParkingSpaceManagementDescription\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{apartment.businessEntity.hasCarbonNeutralHeating && <HouseFeatureCarbonNeutralHeating />}\n\t\t\t<FeaturesAdditionally\n\t\t\t\tfeatures={getAdditionalHouseFeatures(apartment.businessEntity)}\n\t\t\t\tresourceKeyPrefix=\"BusinessEntityPage_Feature_\"\n\t\t\t/>\n\t\t</CollapsibleFeatureGroup>\n\t);\n}\n\nfunction RecidencyIncludedFeaturesSection({ apartment }: { apartment: ApartmentAM }) {\n\treturn (\n\t\t<CollapsibleFeatureGroup\n\t\t\theading={<ResourceText resourceKey=\"ApartmentPageNew_FeatureGroupTitle_RecidencyIncluded\" />}\n\t\t\tisOpenInitially={false}\n\t\t>\n\t\t\t{apartment.electricityIncludedInRent && <RecidencyFeatureElectricity />}\n\t\t\t<RecidencyFeatureInternet apartment={apartment} />\n\t\t\t<RecidencyFeaturePaint />\n\t\t\t<RecidencyFeatureMyLumo />\n\t\t\t<AllBenefitsLink\n\t\t\t\turl=\"#allIncludedInLivingBenefits\"\n\t\t\t\tlinkTextResourceKey=\"ApartmentPageNew_AllBenefitsIncludedInLiving_LinkText\"\n\t\t\t/>\n\t\t</CollapsibleFeatureGroup>\n\t);\n}\n\nfunction getBenefitIfAvailable(apartment: ApartmentAM, benefitName: string) {\n\treturn apartment.benefits.find((b) => b.technicalName === benefitName);\n}\n\nfunction ClimateResponsibilityBanner() {\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<div className=\"climate-responsibility-banner l-margin-5-b\">\n\t\t\t<ResourceImage\n\t\t\t\tclassName=\"banner-image\"\n\t\t\t\tresourceKey=\"ApartmentDetails_ClimateResponsibilityBanner_Image\"\n\t\t\t\tasBackgroundImage\n\t\t\t/>\n\t\t\t<div className=\"banner-content l-padding-5\">\n\t\t\t\t<p className=\"banner-text l-font-body is-l is-contrast l-margin-5-b\">\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPageNew_ClimateResponsibilityBanner_Text\" />\n\t\t\t\t</p>\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"banner-button l-button is-secondary\"\n\t\t\t\t\thref={getResourceText('ApartmentPageNew_ClimateResponsibilityBanner_LinkUrl')}\n\t\t\t\t>\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPageNew_ClimateResponsibilityBanner_LinkText\" />\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction PaidExtraFeaturesSection({ apartment }: ApartmentProp) {\n\tconst keyCourierBenefit = getBenefitIfAvailable(apartment, 'KeyCourier');\n\tconst movingServiceBenefit = getBenefitIfAvailable(apartment, 'MovingService');\n\tconst finalCleanUpServiceBenefit = getBenefitIfAvailable(apartment, 'FinalCleanUpService');\n\tconst assemblyServiceBenefit = getBenefitIfAvailable(apartment, 'AssemblyService');\n\n\tif (!keyCourierBenefit && !movingServiceBenefit && !finalCleanUpServiceBenefit && !assemblyServiceBenefit) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<CollapsibleFeatureGroup\n\t\t\theading={<ResourceText resourceKey=\"ApartmentPageNew_FeatureGroupTitle_PaidExtra\" />}\n\t\t\tisOpenInitially={false}\n\t\t>\n\t\t\t{keyCourierBenefit && <ExtraFeature benefit={keyCourierBenefit} />}\n\t\t\t{movingServiceBenefit && <ExtraFeature benefit={movingServiceBenefit} />}\n\t\t\t{finalCleanUpServiceBenefit && <ExtraFeature benefit={finalCleanUpServiceBenefit} />}\n\t\t\t{assemblyServiceBenefit && <ExtraFeature benefit={assemblyServiceBenefit} />}\n\t\t\t<AllBenefitsLink url=\"#allPaidBenefits\" linkTextResourceKey=\"ApartmentPageNew_AllPaidBenefits_LinkText\" />\n\t\t</CollapsibleFeatureGroup>\n\t);\n}\n\nfunction ApartmentFeatureRent({ apartment }: ApartmentProp) {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentRentIcon />\n\t\t\t{toFormattedString(apartment.rent)}&nbsp;\n\t\t\t<ResourceText resourceKey=\"General_EurosPerMonth\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureRentGuarantee() {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentRentGuaranteeIcon />\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_NoDeposit\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureSize({ apartment }: ApartmentProp) {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentSizeIcon />\n\t\t\t{toFormattedString(apartment.areaInSqm, 1) || ''} m²\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureFloorPlan({ apartment }: ApartmentProp) {\n\tconst { getResourceText } = useResource();\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentFloorPlanIcon />\n\t\t\t{getResourceText('General_BuildingType_' + apartment.buildingType, apartment.buildingType, {\n\t\t\t\ttransform: 'capitalize',\n\t\t\t})}\n\t\t\t, {apartment.plan}\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureFloorNumber({ apartment }: ApartmentProp) {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentFloorIcon />\n\t\t\t<ResourceText\n\t\t\t\tresourceKey=\"ApartmentPage_ApartmentFloor\"\n\t\t\t\tparameters={[\n\t\t\t\t\tapartment.floor!.toString(),\n\t\t\t\t\tapartment.buildingFloorCount ? apartment.buildingFloorCount.toString() : '-',\n\t\t\t\t]}\n\t\t\t/>\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureWaterCharge({ apartment }: ApartmentProp) {\n\tconst buildWaterChargeElement = (waterFeeBasis: WaterFeeBasisAM) => {\n\t\tif (waterFeeBasis === WaterFeeBasisAM.InhabitantCount) {\n\t\t\treturn (\n\t\t\t\t<ResourceText\n\t\t\t\t\tresourceKey=\"General_WaterChargeAmount\"\n\t\t\t\t\tparameters={[\n\t\t\t\t\t\tapartment.businessEntity.waterFeePerPersonMonth\n\t\t\t\t\t\t\t? toFormattedString(apartment.businessEntity.waterFeePerPersonMonth)\n\t\t\t\t\t\t\t: '-',\n\t\t\t\t\t]}\n\t\t\t\t/>\n\t\t\t);\n\t\t} else if (waterFeeBasis === WaterFeeBasisAM.Consumption) {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<ResourceText resourceKey=\"General_WaterCharge_Consumption\" />\n\t\t\t\t\t<Tooltip text={<ResourceText resourceKey=\"General_WaterCharge_Consumption_Tooltip\" />} />\n\t\t\t\t</>\n\t\t\t);\n\t\t} else if (waterFeeBasis === WaterFeeBasisAM.IncludedInRent) {\n\t\t\treturn <ResourceText resourceKey=\"General_WaterChargeIncludedInRent\" />;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\tif (apartment.waterFeeBasis === WaterFeeBasisAM.Unknown) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<ApartmentWaterIcon />\n\t\t\t{buildWaterChargeElement(apartment.waterFeeBasis)}\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureItem({ feature }: { feature: ApartmentFeatureAM | BusinessEntityFeature }) {\n\tconst { getResourceText } = useResource();\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<div\n\t\t\t\tclassName=\"mod-apartmentInfoSecondary__list-item__icon\"\n\t\t\t\tid={'ApartmentPage_FeatureIcon_' + feature}\n\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t__html: getResourceText('ApartmentPage_FeatureIcon_' + feature, ''),\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<ResourceText\n\t\t\t\tresourceKey={'ApartmentPage_Features_' + feature}\n\t\t\t\tdefaultText={feature}\n\t\t\t\ttransform={'capitalize'}\n\t\t\t/>\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction ApartmentFeatureNonSmoking({ apartment }: { apartment: ApartmentAM }) {\n\tlet textKey = 'ApartmentPage_Features_ClassicNonSmoking';\n\tlet tooltipTextKey = 'ApartmentPage_Features_ClassicNonSmoking_Description';\n\tif (apartment.features.some((f) => f === 'NonSmoking')) {\n\t\ttextKey = 'ApartmentPage_Features_NonSmokingApartment';\n\t\ttooltipTextKey = 'ApartmentPage_Features_NonSmokingApartment_Description';\n\t} else if (apartment.nonSmokingBuilding || apartment.businessEntity.isNonSmoking) {\n\t\t// Show 'non-smoking apartment' text (instead of 'non-smoking house' text),\n\t\t// even when we get the non-smoking feature from the building instead of the apartment.\n\t\ttextKey = 'ApartmentPage_Features_NonSmokingApartment';\n\t\ttooltipTextKey = 'ApartmentPage_Features_NonSmokingHouse_Description';\n\t}\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<IconNonSmoking />\n\t\t\t<ResourceText resourceKey={textKey} />\n\t\t\t<Tooltip text={<ResourceText resourceKey={tooltipTextKey} />} />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction FeaturesAdditionally({\n\tfeatures,\n\tresourceKeyPrefix,\n}: {\n\tfeatures: (ApartmentFeatureAM | BusinessEntityFeature)[];\n\tresourceKeyPrefix: string;\n}) {\n\treturn (\n\t\t<div className=\"additionalFeatures\">\n\t\t\t<span className=\"additionalFeatures_title\">\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPageNew_FeatureGroupFooter_Additionally\" />\n\t\t\t</span>\n\t\t\t{features.map((feature, index) => (\n\t\t\t\t<span key={index}>\n\t\t\t\t\t{0 < index ? ', ' : ' '}\n\t\t\t\t\t<ResourceText resourceKey={`${resourceKeyPrefix}${feature}`} />\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction HouseFeatureElevator() {\n\tconst { getResourceText } = useResource();\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<span\n\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t__html: getResourceText('ApartmentPage_FeatureIcon_Elevator'),\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<ResourceText resourceKey=\"ApartmentFeature_Elevator\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction HouseFeatureSauna({ onlineReservation }: { onlineReservation: boolean }) {\n\tconst { getResourceText } = useResource();\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<span\n\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t__html: getResourceText('ApartmentPage_FeatureIcon_Sauna'),\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<ResourceText resourceKey=\"ApartmentFeature_SharedSauna\" />\n\t\t\t{onlineReservation && (\n\t\t\t\t<Tooltip text={<ResourceText resourceKey=\"ApartmentFeature_SharedSauna_OnlineReservation\" />} />\n\t\t\t)}\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction HouseFeatureCarbonNeutralHeating() {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<HouseCarbonNeutralHeatingIcon />\n\t\t\t<ResourceText resourceKey=\"ApartmentFeature_CarbonNeutralHeating\" />\n\t\t\t<Tooltip text={<ResourceText resourceKey=\"ApartmentFeature_CarbonNeutralHeating_Tooltip\" />} />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction HouseFeatureParking({\n\tavailableParkingSpaceCount,\n\texternalParkingSpaceManagementDescription,\n\tbusinessEntityId,\n\telectricChargingParkingSpaceCount,\n}: {\n\texternalParkingSpaceManagementDescription: string | undefined;\n\tavailableParkingSpaceCount: number | undefined;\n\tbusinessEntityId: string;\n\telectricChargingParkingSpaceCount: number;\n}) {\n\tlet desc = externalParkingSpaceManagementDescription ? (\n\t\t<span className=\"mod-apartmentInfoSecondary__label--infoCircle\">\n\t\t\t<span className=\"mod-apartmentInfoSecondary__labelText\">\n\t\t\t\t<ResourceText\n\t\t\t\t\tresourceKey=\"ApartmentPage_ExternalParkingSpaceManagement\"\n\t\t\t\t\tdefaultText=\"Autopaikat pysäköintiyhtiöltä\"\n\t\t\t\t/>\n\t\t\t\t<Tooltip text={externalParkingSpaceManagementDescription} />\n\t\t\t</span>\n\t\t</span>\n\t) : undefined;\n\n\tif (!desc && availableParkingSpaceCount != undefined) {\n\t\tdesc = (\n\t\t\t<span className=\"mod-apartmentInfoSecondary__label\">\n\t\t\t\t<ResourceText\n\t\t\t\t\tresourceKey=\"ApartmentPage_ParkingSpacesWithManagementLink\"\n\t\t\t\t\tdefaultText=\"Autopaikkoja [vapaana {0} kpl ›](https://my.lumo.fi/autopaikat/{1})\"\n\t\t\t\t\tparameters={[String(availableParkingSpaceCount), businessEntityId]}\n\t\t\t\t\topenLinksInNewTab={true}\n\t\t\t\t/>\n\t\t\t</span>\n\t\t);\n\t}\n\n\tif (!desc) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<CollapsibleFeatureGroupItem>\n\t\t\t\t<HouseParkingIcon />\n\t\t\t\t{desc}\n\t\t\t</CollapsibleFeatureGroupItem>\n\t\t\t{electricChargingParkingSpaceCount > 0 && (\n\t\t\t\t<CollapsibleFeatureGroupItem>\n\t\t\t\t\t<HouseElectricCarChargingIcon />\n\t\t\t\t\t<ResourceText resourceKey=\"ApartmentFeature_ElectricCarCharging\" />\n\t\t\t\t</CollapsibleFeatureGroupItem>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nfunction RecidencyFeatureElectricity() {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<RecidencyElectricityIcon />\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_Benefit_Electricity\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction RecidencyFeatureInternet({ apartment }: { apartment: ApartmentAM }) {\n\tlet broadbandBenefit = apartment.benefits.find((b) => b.technicalName === 'BroadbandDNA');\n\tif (!broadbandBenefit) {\n\t\tbroadbandBenefit = apartment.benefits.find((b) => b.technicalName === 'BroadbandElisa');\n\t}\n\tif (!broadbandBenefit) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<img src={getBenefitIconUrl(broadbandBenefit, 'blue')} height=\"40\" width=\"40\" alt=\"\" />\n\t\t\t<span>\n\t\t\t\t{broadbandBenefit.heading} {apartment.businessEntity.broadband.speed}\n\t\t\t</span>\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction RecidencyFeaturePaint() {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<img src={getBenefitIconUrlByTechicalName('FreeDecorationPaints', 'blue')} height=\"40\" width=\"40\" alt=\"\" />\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_Benefit_Paint\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction RecidencyFeatureMyLumo() {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<img src={getBenefitIconUrlByTechicalName('MyLumo', 'blue')} height=\"40\" width=\"40\" alt=\"\" />\n\t\t\t<ResourceText resourceKey=\"ApartmentPage_Benefit_MyLumo\" />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\ninterface IExtraFeatureProps {\n\tbenefit: ApartmentBenefitAM;\n}\n\nfunction ExtraFeature({ benefit }: IExtraFeatureProps) {\n\treturn (\n\t\t<CollapsibleFeatureGroupItem>\n\t\t\t<img src={getBenefitIconUrl(benefit, 'blue')} height=\"40\" width=\"40\" alt=\"\" />\n\t\t\t<ResourceText resourceKey={'ApartmentPage_ExtraFeature_' + benefit.technicalName} />\n\t\t</CollapsibleFeatureGroupItem>\n\t);\n}\n\nfunction AllBenefitsLink({ url, linkTextResourceKey }: { url: string; linkTextResourceKey: string }) {\n\treturn (\n\t\t<div className=\"allBenefitsLinkContainer\">\n\t\t\t<a href={url}>\n\t\t\t\t<ResourceText resourceKey={linkTextResourceKey} /> ›\n\t\t\t</a>\n\t\t</div>\n\t);\n}\n\nfunction getNewSpecialFeatures(apartment: ApartmentAM): ApartmentFeatureAM[] {\n\treturn [\n\t\t...filterInOrder(apartment.features, 'Accessible'),\n\t\t...getSpecialFeatures(apartment).filter((feature) => feature !== 'Elevator'),\n\t];\n}\n\nfunction getNewOtherFeatures(apartment: ApartmentAM): ApartmentFeatureAM[] {\n\treturn getOtherFeatures(apartment).filter((feature) => feature !== 'Accessible');\n}\n\nfunction hasElevator(apartment: ApartmentAM) {\n\treturn apartment.features.some((feature) => feature === 'Elevator');\n}\n\nfunction hasSauna(businessEntity: ApartmentBusinessEntityAM) {\n\treturn businessEntity.features.some((feature) => feature === 'Sauna');\n}\n\nfunction hasSaunaWithOnlineReservation(businessEntity: ApartmentBusinessEntityAM) {\n\treturn businessEntity.features.some((feature) => feature === 'SaunaWithOnlineReservation');\n}\n\nfunction getAdditionalHouseFeatures(businessEntity: ApartmentBusinessEntityAM) {\n\treturn businessEntity.features.filter((feature) => feature !== 'Sauna' && feature !== 'SaunaWithOnlineReservation');\n}\n\nfunction IconNonSmoking() {\n\treturn (\n\t\t<svg width=\"34\" height=\"28\" viewBox=\"0 0 34 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M27.7946 6.99528C27.8247 6.20336 28.2114 5.46564 28.8498 4.98208H28.8815C28.1486 4.50368 27.6934 3.70869 27.6574 2.84434C27.7264 1.44058 28.8681 0.31783 30.2954 0.25C30.5868 0.25 30.823 0.482305 30.823 0.768868C30.823 1.05543 30.5868 1.28774 30.2954 1.28774C29.4536 1.36012 28.7862 2.01649 28.7126 2.84434C28.7862 3.67219 29.4536 4.32856 30.2954 4.40094H30.4537C30.7451 4.40094 30.9813 4.63325 30.9813 4.91981C30.9813 5.20637 30.7451 5.43868 30.4537 5.43868C29.6119 5.51107 28.9445 6.16743 28.8709 6.99528C28.9429 7.81606 29.5991 8.47006 30.4326 8.55189C30.724 8.55189 30.9602 8.78419 30.9602 9.07076C30.9602 9.35732 30.724 9.58962 30.4326 9.58962C29.0052 9.52179 27.8636 8.39904 27.7946 6.99528ZM32.0155 6.93302C32.6574 6.45235 33.045 5.71287 33.0707 4.91982C33.0017 3.51606 31.8601 2.39331 30.4327 2.32548C30.1413 2.32548 29.9051 2.55778 29.9051 2.84435C29.9051 3.13091 30.1413 3.36321 30.4327 3.36321C31.2827 3.426 31.9615 4.08478 32.0366 4.91982C31.963 5.74767 31.2956 6.40403 30.4538 6.47642C30.1624 6.47642 29.9262 6.70873 29.9262 6.99529C29.9262 7.28185 30.1624 7.51416 30.4538 7.51416H30.6121C31.4538 7.58654 32.1213 8.24291 32.1949 9.07076C32.1213 9.89861 31.4538 10.555 30.6121 10.6274C30.3207 10.6274 30.0845 10.8597 30.0845 11.1462C30.0845 11.4328 30.3207 11.6651 30.6121 11.6651C32.0394 11.5973 33.1811 10.4745 33.25 9.07076C33.21 8.20497 32.7511 7.4103 32.0155 6.93302ZM27.1299 17.3726V18.4104H22.0438L28.1851 27.75H22.7825L16.6412 18.4104H1.80519C1.22243 18.4104 0.75 17.9458 0.75 17.3726V14.2594C0.75 13.6863 1.22243 13.2217 1.80519 13.2217H13.2224L7.08117 3.88207H12.4838L18.625 13.2217H27.1299V14.2594H19.3109L21.358 17.3726H27.1299ZM28.7127 13.2217C28.4213 13.2217 28.1851 13.454 28.1851 13.7406V17.8915C28.1851 18.1781 28.4213 18.4104 28.7127 18.4104C29.0041 18.4104 29.2403 18.1781 29.2403 17.8915V13.7406C29.2403 13.454 29.0041 13.2217 28.7127 13.2217ZM30.823 13.2217C30.5316 13.2217 30.2954 13.454 30.2954 13.7406V17.8915C30.2954 18.1781 30.5316 18.4104 30.823 18.4104C31.1144 18.4104 31.3506 18.1781 31.3506 17.8915V13.7406C31.3506 13.454 31.1144 13.2217 30.823 13.2217ZM8.13638 17.3726H1.80522V14.2594H8.13638V17.3726ZM9.1916 14.2594V17.3726H15.9554L13.9083 14.2594H9.1916Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import React, * as react from 'react';\nimport { ReactNode } from 'react';\n\nexport function ApartmentFeaturesContainer({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<div className=\"mod-apartmentInfoSecondary\">\n\t\t\t<div className=\"mod-apartmentInfoSecondary__wrapper\">{children}</div>\n\t\t</div>\n\t);\n}\n\nexport function CollapsibleFeatureGroup(props: {\n\theading: React.ReactElement;\n\tchildren: React.ReactNode;\n\tisOpenInitially: boolean;\n}) {\n\tconst [isOpen, setIsOpen] = react.useState(props.isOpenInitially);\n\treturn (\n\t\t<>\n\t\t\t<button\n\t\t\t\tclassName={'mod-apartmentInfoSecondary__listButton' + (isOpen ? '  -isOpen' : '')}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tonClick={() => setIsOpen(!isOpen)}\n\t\t\t>\n\t\t\t\t<h3 className=\"mod-apartmentInfoSecondary__listHeading\">{props.heading}</h3>\n\t\t\t</button>\n\t\t\t<ul className={'mod-apartmentInfoSecondary__list' + (isOpen ? '  -isOpen' : '')}>{props.children}</ul>\n\t\t</>\n\t);\n}\n\nexport function CollapsibleFeatureGroupItem({ children }: { children: ReactNode }) {\n\treturn <li className=\"mod-apartmentInfoSecondary__list-item\">{children}</li>;\n}\n","import * as React from 'react';\n\nexport function ApartmentShowingIcon({ className }: { className: string }) {\n\treturn (\n\t\t<svg className={className} width=\"39\" height=\"38\" viewBox=\"0 0 39 38\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfill=\"#002663\"\n\t\t\t\td=\"M20.8 36.7H22L23 33h-1.3l-.8 3.7zm16-5.4l-.1.3-.8.8 1 4.3H38l-1.2-5.4zm-35.7.4l-1.1 5h1.2l1-4.1-1-.9zM15.2 33l.9 3.7h1.2l-.8-3.7h-1.3zM35 29L28.8 2.3c-.1-.6-.6-1-1.2-1h-17-.3c-.6.2-1 .9-.9 1.5l6.2 26.9c.1.6.6 1 1.2 1h17c.4 0 .7-.2 1-.5.2-.3.3-.7.2-1zm-20.2 1.6l-.3-.7L8.5 4 2.8 29c0 .3 0 .7.3 1 .2.3.6.5 1 .5h10.8zm21.5-1.3c0 1.4-1.1 2.5-2.5 2.5H3.4a2.4 2.4 0 01-1.9-3l6.2-27A2.4 2.4 0 0110.1 0h17.5c1.1 0 2.1.8 2.4 1.9l6.2 26.9v.5zM22.3 11l6 4.1-4.4 4.2-.3-1.7h-5.8l-1-4.9h5.8l-.3-1.7z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentRentIcon() {\n\treturn (\n\t\t<svg\n\t\t\tclassName=\"mod-apartmentInfo__icon mod-apartmentInfo__icon--rent\"\n\t\t\twidth=\"23\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 23 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M7 10.3v-1H6a.5.5 0 01-.5-.5c0-.3.2-.5.4-.5h1.2c.1-2 1.7-3.5 3.6-3.5 1 0 1.9.4 2.5 1 .5.6.8 1.1 1 1.7 0 .3-.1.6-.4.7a.5.5 0 01-.6-.4c-.1-.4-.3-.8-.7-1.2-.5-.5-1.1-.8-1.8-.8C9.3 5.8 8.2 7 8 8.3h2.5c.2 0 .4.2.4.5 0 .2-.2.4-.4.4H8.1v1.1h2c.3 0 .5.2.5.5 0 .2-.2.4-.4.4h-2c0 .7.2 1.3.7 1.7.4.5 1 .8 1.8.8 1.1 0 2.2-.8 2.5-2 0-.2.3-.4.6-.3.3 0 .4.3.4.6a3.6 3.6 0 01-3.5 2.8c-1 0-1.9-.4-2.6-1.1-.6-.7-1-1.5-1-2.5H5.9a.5.5 0 01-.4-.4c0-.3.2-.5.4-.5h1.2zm5.4 11c-1.7 0-3.3-.6-4.6-1.4.9.3 1.8.4 2.8.4a10 10 0 009.8-10.1c0-1-.2-2-.4-3 .8 1.4 1.3 3 1.3 4.8 0 5-4 9.2-8.9 9.2zM9.7 23a9 9 0 01-8.6-11c.4 2.4 1.7 4.6 3.6 6a9.6 9.6 0 009.1 4c-1.2.6-2.6 1-4 1zm1-22.2a9 9 0 018.8 9.3c0 5-4 9.2-8.9 9.2a9 9 0 01-8.8-9.2C1.8 5 5.8.9 10.6.9zm7.7 3A9.6 9.6 0 0010.6 0 10 10 0 001 9.6c-.6 1.3-.9 2.7-.9 4.2A10 10 0 009.7 24c2.6 0 5-1 6.7-2.7 3.4-1.6 5.8-5.2 5.8-9.3 0-3.3-1.5-6.2-3.8-8z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentRentGuaranteeIcon() {\n\treturn (\n\t\t<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M20 2.5L6.25 5.25V26.25C6.25 32.5 20 38.75 20 38.75C20 38.75 33.75 32.5 33.75 26.25V5.25L20 2.5ZM20 3.75L32.5 6.25V26.25C32.5 30.5 23.875 35.5 20 37.375C16.25 35.625 7.5 30.5 7.5 26.25V6.25L20 3.75ZM15 18.75V20.225H13.375C13.0298 20.225 12.75 20.5048 12.75 20.85C12.7566 21.1924 13.0326 21.4684 13.375 21.475H15C15.1597 24.1746 17.4083 26.2747 20.1125 26.25C22.3979 26.2363 24.3951 24.7039 25 22.5C25.0439 22.1349 24.8076 21.7948 24.4501 21.7086C24.0926 21.6225 23.7273 21.8175 23.6 22.1625C23.2488 23.4114 22.2611 24.38 21.0056 24.7068C19.75 25.0335 18.4155 24.6693 17.5 23.75C16.886 23.1528 16.5086 22.3536 16.4375 21.5H19.3625C19.7077 21.5 19.9875 21.2202 19.9875 20.875C19.9875 20.5298 19.7077 20.25 19.3625 20.25H16.4125V18.75H20C20.3452 18.75 20.625 18.4702 20.625 18.125C20.6183 17.7826 20.3424 17.5067 20 17.5H16.45C16.6127 15.6002 18.2058 14.1431 20.1125 14.15C21.0826 14.1495 22.0115 14.5418 22.6875 15.2375C23.1308 15.6656 23.4504 16.2054 23.6125 16.8C23.675 17.0479 23.865 17.2435 24.1109 17.3133C24.3568 17.3831 24.6213 17.3164 24.8047 17.1383C24.9881 16.9602 25.0625 16.6979 25 16.45C24.7861 15.6114 24.3549 14.844 23.75 14.225C22.7823 13.2439 21.4526 12.7057 20.075 12.7375C17.3922 12.7386 15.1714 14.8227 15 17.5H13.375C13.0326 17.5067 12.7566 17.7826 12.75 18.125C12.75 18.4702 13.0298 18.75 13.375 18.75H15Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentSizeIcon() {\n\treturn (\n\t\t<svg\n\t\t\tclassName=\"mod-apartmentInfo__icon mod-apartmentInfo__icon--size\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M7.8 23h-6a1 1 0 01-.9-.8v-6a.5.5 0 00-.9 0v6c0 1 .8 1.8 1.8 1.8h6a.5.5 0 000-1zM22.2 0h-6a.5.5 0 000 1h6c.5 0 .9.3.9.8v6a.5.5 0 00.9 0v-6c0-1-.8-1.8-1.8-1.8zm-4 10.7l.7-.6c.5-.5 1-1 1-1.6 0-.8-.7-1.4-1.8-1.4-1.2 0-1.9.6-2 1.7h1.3c0-.5.3-.7.6-.7s.5.2.5.5c0 .4-.3.7-.8 1.2L16 11.5v.2h3.7v-1h-1.5zm-3 1.2v4.2h-1.8v-4c0-.8-.4-1.2-1-1.2-.7 0-1.3.5-1.3 1.4V16H9.3v-4c0-.8-.4-1.2-1-1.2-.7 0-1.3.5-1.3 1.4V16H5.2V9.6H7v1c.3-.7 1-1.2 2-1.2.9 0 1.5.4 1.9 1.2.5-.8 1.3-1.2 2.2-1.2 1.2 0 2.1.8 2.1 2.5z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentFloorIcon() {\n\treturn (\n\t\t<svg\n\t\t\tclassName=\"mod-apartmentInfo__icon mod-apartmentInfo__icon--floor\"\n\t\t\twidth=\"25\"\n\t\t\theight=\"20\"\n\t\t\tviewBox=\"0 0 25 20\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M25 0h-8c-1 0-1.8.8-1.8 1.8v3.7H8.9c-1 0-1.8.8-1.8 1.8v4.5H1.8c-1 0-1.8.8-1.8 1.8V20h23.2c1 0 1.8-.8 1.8-1.8V0zm-.9 1v17.2c0 .5-.4.9-.9.9H1v-5.5c0-.5.4-.9.9-.9H8V7.3c0-.5.3-1 .8-1h7.2V1.9c0-.5.4-.9.9-.9H24z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentFloorPlanIcon() {\n\treturn (\n\t\t<svg\n\t\t\tclassName=\"mod-apartmentInfo__icon mod-apartmentInfo__icon--plan\"\n\t\t\twidth=\"22\"\n\t\t\theight=\"22\"\n\t\t\tviewBox=\"0 0 22 22\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M21.2 11.8h-5.5v-2a.4.4 0 00-.8 0v4.8c0 .2.2.3.4.3s.4-.1.4-.3v-2h5.5v7.8c0 .5-.3.8-.8.8h-4.7V20a.4.4 0 00-.8 0v1.2H8.6c0-3-2.4-5.5-5.5-5.5h-.7v5.5h-.8a.8.8 0 01-.8-.8v-6.3h9a.4.4 0 000-.7h-9V1.6c0-.5.3-.8.8-.8h13.3v3.5a.4.4 0 00.8 0V.8h4.7c.5 0 .8.3.8.8v10.2zm-18 9.4v-4.8c2.6 0 4.7 2.2 4.7 4.8H3.1zM20.3 0H1.6C.7 0 0 .7 0 1.6v18.8c0 .9.7 1.6 1.6 1.6h18.8c.9 0 1.6-.7 1.6-1.6V1.6c0-.9-.7-1.6-1.6-1.6z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function ApartmentWaterIcon() {\n\treturn (\n\t\t<svg\n\t\t\tclassName=\"mod-apartmentInfo__icon mod-apartmentInfo__icon--water\"\n\t\t\twidth=\"19\"\n\t\t\theight=\"24\"\n\t\t\tviewBox=\"0 0 19 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M9.67157895,1.32444444 C12.4225555,4.44444444 17.7926727,11.36 17.7926727,14.8977778 C17.7926727,19.4338765 14.1567352,23.1111111 9.67157895,23.1111111 C5.18642272,23.1111111 1.5504852,19.4338765 1.5504852,14.8977778 C1.5504852,11.3422222 6.92060238,4.48 9.67157895,1.32444444 L9.67157895,1.32444444 Z M9.67157895,0 C9.67157895,0 0.671578947,9.86666667 0.671578947,14.8977778 C0.671578947,19.9247963 4.7010162,24 9.67157895,24 C14.6421417,24 18.6715789,19.9247963 18.6715789,14.8977778 C18.6715789,9.86666667 9.67157895,0 9.67157895,0 Z\"\n\t\t\t\ttransform=\"translate(-.2)\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t\tfillRule=\"nonzero\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function HouseParkingIcon() {\n\treturn (\n\t\t<svg width=\"38\" height=\"30\" viewBox=\"0 0 38 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M37.75 9.756V9.444C37.75 9.16711 37.6354 8.90157 37.4315 8.70578C37.2275 8.50999 36.9509 8.4 36.6625 8.4H35.0875C34.4869 8.4 34 8.86741 34 9.444V9.6C33.9926 10.0101 33.9123 10.4159 33.7625 10.8L32.3 3.864C31.8351 1.61926 29.784 0.00183851 27.4 0H10.6C8.21597 0.00183851 6.16489 1.61926 5.7 3.864L4.2375 10.8C4.08771 10.4159 4.00739 10.0101 4 9.6V9.444C4 8.86741 3.51311 8.4 2.9125 8.4H1.3375C1.04908 8.4 0.772467 8.50999 0.568521 8.70578C0.364576 8.90157 0.25 9.16711 0.25 9.444V9.756C0.25 10.3326 0.73689 10.8 1.3375 10.8H2.925C3.02524 11.1602 3.17223 11.5069 3.3625 11.832C2.19451 12.6904 1.5067 14.0199 1.5 15.432V21.768C1.50213 22.9096 1.94786 24.0093 2.75 24.852V29.04C2.75 29.5702 3.19772 30 3.75 30H8C8.55228 30 9 29.5702 9 29.04V26.4H29V29.04C29 29.5702 29.4477 30 30 30H34.25C34.8023 30 35.25 29.5702 35.25 29.04V24.84C36.0521 23.9973 36.4979 22.8976 36.5 21.756V15.42C36.4933 14.0079 35.8055 12.6784 34.6375 11.82C34.8268 11.4987 34.9738 11.1561 35.075 10.8H36.6625C37.2631 10.8 37.75 10.3326 37.75 9.756ZM7.75 19.2C9.13071 19.2 10.25 18.1255 10.25 16.8C10.25 15.4745 9.13071 14.4 7.75 14.4C6.36929 14.4 5.25 15.4745 5.25 16.8C5.25 18.1255 6.36929 19.2 7.75 19.2ZM27.75 16.8C27.75 15.4745 28.8693 14.4 30.25 14.4C31.6307 14.4 32.75 15.4745 32.75 16.8C32.75 18.1255 31.6307 19.2 30.25 19.2C28.8693 19.2 27.75 18.1255 27.75 16.8ZM24.775 20.4H13.225C12.827 20.4041 12.4548 20.5899 12.2228 20.9003C11.9908 21.2108 11.9266 21.6087 12.05 21.972L12.4625 23.172C12.6412 23.6824 13.1523 24.0161 13.7125 23.988H24.4125C24.9499 23.9893 25.428 23.6608 25.6 23.172L26.0125 21.972C26.1397 21.5986 26.0684 21.189 25.8217 20.8756C25.5749 20.5621 25.1839 20.3845 24.775 20.4ZM5.775 9.6H32.225L31.075 4.092C30.7237 2.41083 29.1861 1.20081 27.4 1.2H10.6C8.8139 1.20081 7.27627 2.41083 6.925 4.092L5.775 9.6ZM32.75 12.132L33.275 12.396H33.2875C34.4861 12.9713 35.2452 14.1455 35.25 15.432V21.768C35.25 22.6782 34.8733 23.5512 34.2029 24.1948C33.5325 24.8384 32.6231 25.2 31.675 25.2H6.325C4.35058 25.2 2.75 23.6634 2.75 21.768V15.432C2.75483 14.1455 3.51386 12.9713 4.7125 12.396L5.25 12.132L5.3625 11.556L5.525 10.8H32.475L32.6375 11.556L32.75 12.132Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function HouseElectricCarChargingIcon() {\n\treturn (\n\t\t<svg width=\"38\" height=\"34\" viewBox=\"0 0 38 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M37.75 13.006V12.694C37.75 12.4171 37.6354 12.1516 37.4315 11.9558C37.2275 11.76 36.9509 11.65 36.6625 11.65H35.0875C34.4869 11.65 34 12.1174 34 12.694V12.85C33.9926 13.2601 33.9123 13.6659 33.7625 14.05L32.3 7.114C31.9852 5.59391 30.943 4.36149 29.5626 3.72363C28.9045 3.41955 28.1696 3.25059 27.4 3.25H21.768L21.6029 4.45H27.4C27.973 4.45026 28.5205 4.57498 29.0114 4.79978C30.0506 5.2757 30.8364 6.20018 31.075 7.342L32.225 12.85H26.4136L25.1595 14.05H6.85578L7.84676 12.85H5.775L6.925 7.342C7.27627 5.66083 8.8139 4.45081 10.6 4.45H15.0044L15.9015 3.25H10.6C8.21597 3.25184 6.16489 4.86926 5.7 7.114L4.2375 14.05C4.08771 13.6659 4.00739 13.2601 4 12.85V12.694C4 12.1174 3.51311 11.65 2.9125 11.65H1.3375C1.04908 11.65 0.772467 11.76 0.568521 11.9558C0.364576 12.1516 0.25 12.4171 0.25 12.694V13.006C0.25 13.5826 0.73689 14.05 1.3375 14.05H2.925C3.02524 14.4102 3.17223 14.7569 3.3625 15.082C2.19451 15.9404 1.5067 17.2699 1.5 18.682V25.018C1.50213 26.1596 1.94786 27.2593 2.75 28.102V32.29C2.75 32.8202 3.19772 33.25 3.75 33.25H8C8.55228 33.25 9 32.8202 9 32.29V29.65H29V32.29C29 32.8202 29.4477 33.25 30 33.25H34.25C34.8023 33.25 35.25 32.8202 35.25 32.29V28.09C36.0521 27.2473 36.4979 26.1476 36.5 25.006V18.67C36.4933 17.2579 35.8055 15.9284 34.6375 15.07C34.8268 14.7487 34.9738 14.4061 35.075 14.05H36.6625C37.2631 14.05 37.75 13.5826 37.75 13.006ZM6.85578 14.05H5.525L5.3625 14.806L5.25 15.382L4.7125 15.646C3.51386 16.2213 2.75483 17.3955 2.75 18.682V25.018C2.75 26.9134 4.35058 28.45 6.325 28.45H31.675C32.6231 28.45 33.5325 28.0884 34.2029 27.4448C34.8733 26.8012 35.25 25.9282 35.25 25.018V18.682C35.2452 17.3955 34.4861 16.2213 33.2875 15.646H33.275L32.75 15.382L32.6375 14.806L32.475 14.05H25.1595L25.153 14.0563H6.85062L6.85578 14.05ZM7.75 22.45C9.13071 22.45 10.25 21.3755 10.25 20.05C10.25 18.7245 9.13071 17.65 7.75 17.65C6.36929 17.65 5.25 18.7245 5.25 20.05C5.25 21.3755 6.36929 22.45 7.75 22.45ZM27.75 20.05C27.75 18.7245 28.8693 17.65 30.25 17.65C31.6307 17.65 32.75 18.7245 32.75 20.05C32.75 21.3755 31.6307 22.45 30.25 22.45C28.8693 22.45 27.75 21.3755 27.75 20.05ZM24.775 23.65H13.225C12.827 23.6541 12.4548 23.8399 12.2228 24.1503C11.9908 24.4608 11.9266 24.8587 12.05 25.222L12.4625 26.422C12.6412 26.9324 13.1523 27.2661 13.7125 27.238H24.4125C24.9499 27.2393 25.428 26.9108 25.6 26.422L26.0125 25.222C26.1397 24.8486 26.0684 24.439 25.8217 24.1256C25.5749 23.8121 25.1839 23.6345 24.775 23.65Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M20.2408 0.75L19.1617 8.49595L27.8973 8.49672L16.6565 21.7641L17.7342 14.0495L9 14.05L20.2408 0.75ZM18.4505 4.71266L11.743 12.8495L19.1625 12.85L18.4455 17.8002L25.153 9.75849L17.7348 9.75926L18.4505 4.71266Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\nexport function HouseCarbonNeutralHeatingIcon() {\n\treturn (\n\t\t<svg width=\"34\" height=\"28\" viewBox=\"0 0 34 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M23.4278 9.99009L22.75 9.875L22.6349 9.1972C22.8545 9.15991 23.0786 9.23135 23.2361 9.38887C23.3937 9.54639 23.4651 9.77047 23.4278 9.99009ZM19.8463 20.0553C17.8364 22.0649 14.5783 22.065 12.5692 20.055C10.5604 18.0454 10.5602 14.7875 12.5692 12.7785C12.5692 12.7785 12.5692 12.7785 12.5692 12.7785M12.5692 12.7785C13.1937 12.1538 14.1671 11.6376 15.1933 11.2136C16.2379 10.7819 17.4149 10.4151 18.5104 10.1186C19.6082 9.82152 20.6375 9.59158 21.3915 9.43598C21.7689 9.35811 22.0783 9.29867 22.2939 9.25858C22.4018 9.23854 22.4862 9.22333 22.5441 9.21306L22.6106 9.20138L22.6282 9.19835L22.6349 9.1972C22.6351 9.19718 22.6349 9.1972 22.75 9.875C23.4278 9.99009 23.4278 9.98995 23.4278 9.99009L23.4267 9.9968L23.4236 10.0144L23.4119 10.0809C23.4017 10.1388 23.3865 10.2232 23.3664 10.3311C23.3263 10.5467 23.2669 10.8561 23.189 11.2334C23.0334 11.9874 22.8034 13.0166 22.5063 14.1144C22.2098 15.2099 21.843 16.3867 21.4113 17.4313C20.9872 18.4574 20.471 19.4308 19.8463 20.0553M21.8867 10.7383C21.8172 10.7523 21.7447 10.7671 21.6694 10.7826C20.9337 10.9344 19.9329 11.1581 18.8696 11.4459C17.8038 11.7343 16.6884 12.0836 15.7184 12.4844C14.7301 12.8927 13.9668 13.3253 13.5416 13.7506C12.0696 15.2225 12.0694 17.6101 13.5417 19.083C15.0137 20.5556 17.4011 20.5558 18.8741 19.0829C19.2994 18.6577 19.7321 17.8944 20.1405 16.9061C20.5413 15.9363 20.8906 14.8208 21.1791 13.7552C21.4669 12.6919 21.6906 11.6912 21.8424 10.9555C21.8579 10.8802 21.8727 10.8077 21.8867 10.7383Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M18.5219 14.1031C18.7903 14.3716 18.7903 14.8069 18.5219 15.0754L10.8611 22.7361C10.5927 23.0046 10.1573 23.0046 9.88886 22.7361C9.62038 22.4677 9.62038 22.0323 9.88886 21.7639L17.5496 14.1031C17.8181 13.8347 18.2534 13.8347 18.5219 14.1031Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M7.94608 8.86838L6.25373 10.2787L6.25 10.2819V24.2536C6.25 25.2322 7.26192 26.2752 8.22736 26.3664L8.41071 26.375H26.0893C27.0789 26.375 28.149 25.3896 28.2413 24.4349L28.25 24.2536V10.2851L28.223 10.2625L18.7113 2.38405C18.3031 2.04368 17.8117 1.86579 17.3166 1.85038C16.7746 1.83352 16.228 2.01141 15.7811 2.38405L7.94608 8.86838ZM29.625 11.4373L29.79 11.5756L32.4852 13.7803C32.6196 13.901 32.7931 13.9647 32.971 13.9586C33.3027 13.9566 33.5972 13.7387 33.7064 13.4147C33.8155 13.0906 33.7155 12.7305 33.4567 12.5158L28.1916 8.20373V1.46004H23.4907V4.29693L19.6672 1.13582C18.9729 0.56229 18.1372 0.267262 17.2974 0.250735C16.4078 0.233229 15.5136 0.528257 14.7782 1.13582L1.89749 11.8512L1.03564 12.5482C0.702604 12.8372 0.653873 13.3485 0.925953 13.6992C1.05501 13.8676 1.2445 13.9747 1.45119 13.9961C1.65788 14.0174 1.86412 13.9513 2.02285 13.8127L2.53996 13.3912L4.70241 11.608L4.875 11.4601V24.2536L4.88196 24.4747C4.99732 26.3027 6.5331 27.75 8.41071 27.75H26.0893L26.3129 27.7431C28.1614 27.629 29.625 26.1103 29.625 24.2536V11.4373Z\"\n\t\t\t\tfill=\"#002663\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport function RecidencyElectricityIcon() {\n\treturn (\n\t\t<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M23.75 2.5H6.25V37.5H33.75V12.5L23.75 2.5ZM25 5.51251L30.7375 11.25H25V5.51251ZM28.125 36.25H32.5V12.5H23.75V3.75H7.5V36.25H26.875V35C26.8683 34.6576 26.5924 34.3817 26.25 34.375H12.5C11.4645 34.375 10.625 33.5355 10.625 32.5C10.625 31.4645 11.4645 30.625 12.5 30.625H18.75C19.0952 30.625 19.375 30.3452 19.375 30V27.5H18C16.6193 27.5 15.5 26.3807 15.5 25V18.75H17.5V15.625C17.5 15.2798 17.7798 15 18.125 15C18.4702 15 18.75 15.2798 18.75 15.625V18.75H21.25V15.625C21.25 15.2798 21.5298 15 21.875 15C22.2202 15 22.5 15.2798 22.5 15.625V18.75H24.4625V25C24.4625 26.3807 23.3432 27.5 21.9625 27.5H20.625V30C20.625 31.0355 19.7855 31.875 18.75 31.875H12.5C12.1548 31.875 11.875 32.1548 11.875 32.5C11.875 32.8452 12.1548 33.125 12.5 33.125H26.25C27.2855 33.125 28.125 33.9645 28.125 35V36.25ZM18 26.25C17.3096 26.25 16.75 25.6904 16.75 25V20H23.25V25C23.25 25.6904 22.6903 26.25 22 26.25H18ZM17.8625 10.2625H15.175V6.25L12.5 11.6125H15.175V15.625L17.8625 10.2625Z\"\n\t\t\t\tfill=\"#123274\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import * as React from 'react';\n\nexport function PoiMarkerIcon() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 28\">\n\t\t\t<path\n\t\t\t\tfill=\"#CF3F6C\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M0 10.2C0 4.6 4.5 0 10.1 0s10.2 4.6 10.2 10.2C20.3 16 10 27.7 10 27.7S0 16 0 10.2zm7.6 0c0 1.4 1.1 2.6 2.5 2.6 1.5 0 2.6-1.2 2.6-2.6 0-1.4-1.1-2.6-2.6-2.6a2.6 2.6 0 00-2.5 2.6z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import { ApartmentAM } from '../Api/ApartmentAM';\nimport { ResourceText } from '../../Components/ResourceText';\nimport BusinessEntityInformationNew from '../../BusinessEntities/Page/BusinessEntityInformationNew';\nimport * as React from 'react';\n\nexport function BusinessEntityDetailsNew({ apartment }: { apartment: ApartmentAM }) {\n\treturn (\n\t\t<div id=\"house\" className=\"mod-textBlocks apartmentPageHouseInfo\">\n\t\t\t<div className=\"mod-textBlocks__wrapper\">\n\t\t\t\t<div className=\"mod-textBlock -noBottomBorder -noBottomPadding\">\n\t\t\t\t\t<div className=\"mod-textBlock__figureCaption\">\n\t\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_HouseInfo\" defaultText=\"Talon tiedot\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<BusinessEntityInformationNew businessEntity={apartment.businessEntity} />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React, { ReactNode } from 'react';\nimport { BusinessEntityAM, BusinessEntityFeature } from '../../Apartments/Api/BusinessEntityAM';\nimport { ResourceText, useLanguage, useResource } from '../../Components/ResourceText';\nimport { ApartmentBusinessEntityAM } from '../../Apartments/Api/ApartmentAM';\nimport { filterInOrder } from '../../Components/arrayUtilities';\nimport { MarkdownContent } from '../../Components/MarkdownContent';\nimport { Tooltip } from '../../Components/Tooltip';\n\ninterface BusinessEntityInformationProps {\n\tbusinessEntity: BusinessEntityAM | ApartmentBusinessEntityAM;\n\tchildren?: React.ReactElement;\n}\n\nexport default function BusinessEntityInformationNew({ businessEntity, children }: BusinessEntityInformationProps) {\n\tconst isPreMarketing = businessEntity.isPreMarketing;\n\n\treturn (\n\t\t<div className=\"mod-entityInfo -alignLeft\">\n\t\t\t{businessEntity.marketingText && <MarketingText businessEntity={businessEntity} />}\n\t\t\t<HouseBasicInfoContainer>\n\t\t\t\t<span className=\"mod-textBlock__text\">\n\t\t\t\t\t<b>\n\t\t\t\t\t\t<ResourceText resourceKey=\"BusinessEntityPage_BasicHouseInfo\" />\n\t\t\t\t\t</b>\n\t\t\t\t</span>\n\t\t\t\t<InformationContainer>\n\t\t\t\t\t<BuildingType businessEntity={businessEntity} />\n\t\t\t\t\t{!isPreMarketing && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ConstructionYear businessEntity={businessEntity} />\n\t\t\t\t\t\t\t{businessEntity.energyEfficiencyClass && (\n\t\t\t\t\t\t\t\t<EnergyEfficiencyClass businessEntity={businessEntity} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isPreMarketing && <AntennaSystem businessEntity={businessEntity} />}\n\t\t\t\t\t{!isPreMarketing && <BroadbandDetails businessEntity={businessEntity} />}\n\t\t\t\t</InformationContainer>\n\t\t\t\t<CommunalAreaFeatures businessEntity={businessEntity} />\n\t\t\t</HouseBasicInfoContainer>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nfunction MarketingText({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\tconst language = useLanguage();\n\n\tconst localizedMarketingText =\n\t\tlanguage === 'en' && businessEntity.marketingTextEn\n\t\t\t? businessEntity.marketingTextEn\n\t\t\t: businessEntity.marketingText;\n\n\treturn (\n\t\t<div className=\"mod-textBlock -noBottomBorder\">\n\t\t\t{'marketingTextTitle' in businessEntity && (\n\t\t\t\t<h2 className=\"mod-textBlock__heading\">{businessEntity.marketingTextTitle}</h2>\n\t\t\t)}\n\t\t\t<div className=\"mod-textBlock__text\">\n\t\t\t\t{businessEntity.isPreMarketing ? (\n\t\t\t\t\t<MarkdownContent text={localizedMarketingText!} />\n\t\t\t\t) : (\n\t\t\t\t\t<div dangerouslySetInnerHTML={{ __html: localizedMarketingText! }} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction HouseBasicInfoContainer({ children }: { children: ReactNode }) {\n\treturn <div className=\"mod-textBlock -noBottomBorder houseBasicInfoContainer\">{children}</div>;\n}\n\nfunction InformationContainer({ children }: { children: ReactNode }) {\n\treturn <ul className=\"mod-textBlock__listing\">{children}</ul>;\n}\n\nfunction BuildingType({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\treturn (\n\t\t<li className=\"mod-textBlock__listingItem mod-textBlock__listingHeading\">\n\t\t\t<ResourceText resourceKey=\"BusinessEntityPage_BuildingType\" defaultText=\"Rakennustyyppi\" />\n\t\t\t{': '}\n\t\t\t<ResourceText resourceKey={'General_BuildingType_' + businessEntity.buildingType} transform=\"capitalize\" />\n\t\t</li>\n\t);\n}\n\nfunction ConstructionYear({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\treturn (\n\t\t<li className=\"mod-textBlock__listingItem mod-textBlock__listingHeading\">\n\t\t\t<ResourceText resourceKey=\"BusinessEntityPage_ConstructionYear\" defaultText=\"Rakennusvuosi\" />\n\t\t\t{': '}\n\t\t\t{businessEntity.constructionYear}\n\t\t</li>\n\t);\n}\n\nfunction EnergyEfficiencyClass({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\treturn (\n\t\t<li className=\"mod-textBlock__listingItem mod-textBlock__listingHeading\">\n\t\t\t<ResourceText resourceKey=\"BusinessEntityPage_EnergyEfficiencyClass\" defaultText=\"Energialuokka\" />\n\t\t\t{': '}\n\t\t\t{businessEntity.energyEfficiencyClass}\n\t\t</li>\n\t);\n}\n\nfunction AntennaSystem({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\treturn (\n\t\t<li className=\"mod-textBlock__listingItem mod-textBlock__listingHeading\">\n\t\t\t{businessEntity.cableTV && businessEntity.cableTV.available ? (\n\t\t\t\tbusinessEntity.cableTV.provider ? (\n\t\t\t\t\t<ResourceText\n\t\t\t\t\t\tresourceKey=\"BusinessEntityPage_DvbCWithProvider\"\n\t\t\t\t\t\tparameters={[businessEntity.cableTV.provider]}\n\t\t\t\t\t\tdefaultText=\"Kaapeli-TV (DVB-C): {0}\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ResourceText\n\t\t\t\t\t\tresourceKey=\"BusinessEntityPage_DvbCWithoutProvider\"\n\t\t\t\t\t\tdefaultText=\"Kaapeli-TV (DVB-C)\"\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t) : (\n\t\t\t\t<ResourceText resourceKey=\"BusinessEntityPage_DvbT\" defaultText=\"Antenni (DVB-T)\" />\n\t\t\t)}\n\t\t</li>\n\t);\n}\n\nfunction BroadbandDetails({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\treturn businessEntity.broadband ? (\n\t\t<li className=\"mod-textBlock__listingItem mod-textBlock__listingHeading\">\n\t\t\t<ResourceText resourceKey=\"General_Broadband\" />\n\t\t\t{': '}\n\t\t\t{`${businessEntity.broadband.provider} ${businessEntity.broadband.speed}`}\n\t\t\t{businessEntity.broadband.type === 'Mobile' && (\n\t\t\t\t<span>\n\t\t\t\t\t&nbsp; (<ResourceText resourceKey=\"BusinessEntityPage_BroadbandType_Mobile\" />)\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</li>\n\t) : null;\n}\n\nfunction CommunalAreaFeatures({ businessEntity }: Pick<BusinessEntityInformationProps, 'businessEntity'>) {\n\tconst { getResourceText } = useResource();\n\tconst desiredCommunalAreas: BusinessEntityFeature[] = [\n\t\t'BikeStorage',\n\t\t'ClubRoom',\n\t\t'Sauna',\n\t\t'CommonSauna',\n\t\t'LaundryRoom',\n\t\t'CommonLaundryRoom',\n\t\t'DryingRoom',\n\t\t'CommonDryingRoom',\n\t\t'Cellar',\n\t\t'CommonCellar',\n\t\t'Storage',\n\t\t'Shelter',\n\t\t'Gym',\n\t];\n\tconst communalAreaFeatures = filterInOrder(businessEntity.features, ...desiredCommunalAreas);\n\n\treturn (\n\t\t<>\n\t\t\t{communalAreaFeatures.length || businessEntity.isNonSmoking ? (\n\t\t\t\t<div className=\"mod-textBlock__listingText\">\n\t\t\t\t\t{communalAreaFeatures.length && (\n\t\t\t\t\t\t<b>\n\t\t\t\t\t\t\t<ResourceText\n\t\t\t\t\t\t\t\tresourceKey=\"BusinessEntityPage_CommunalAreas\"\n\t\t\t\t\t\t\t\tdefaultText=\"Talon yhteiset tilat\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</b>\n\t\t\t\t\t)}\n\t\t\t\t\t{': '}\n\t\t\t\t\t{communalAreaFeatures.map((feature, index) => (\n\t\t\t\t\t\t<TextFeature key={index} feature={feature} isFirst={index === 0} />\n\t\t\t\t\t))}\n\t\t\t\t\t{businessEntity.isNonSmoking && (\n\t\t\t\t\t\t<div className=\"mod-textBlock__listingText\">\n\t\t\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_Features_NonSmokingHouse\" />\n\t\t\t\t\t\t\t<Tooltip text={getResourceText('BusinessEntityPage_NonSmokingHouse_Description')} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n\nfunction TextFeature({ feature, isFirst }: { feature: BusinessEntityFeature; isFirst: boolean }) {\n\tconst { getResourceText } = useResource();\n\tconst resourceKey = 'BusinessEntityPage_Feature_' + feature;\n\tconst text = getResourceText(resourceKey, feature, { transform: isFirst ? 'capitalize' : undefined });\n\tconst desc = getResourceText(`${resourceKey}_Description`, undefined, { optional: true });\n\treturn (\n\t\t<React.Fragment key={feature}>\n\t\t\t{isFirst ? '' : ', '}\n\t\t\t{text}\n\t\t\t{!!desc && <Tooltip text={desc} />}\n\t\t</React.Fragment>\n\t);\n}\n","import * as React from 'react';\nimport { ApartmentCampaignAM } from '../Api/ApartmentAM';\nimport { DialogBanner } from './DialogBanner';\n\nexport enum CampaignBannerVariant {\n\tTopBanner = 'TopBanner',\n\tSideBanner = 'SideBanner',\n}\n\ninterface CampaignBannerProps {\n\tcampaign: ApartmentCampaignAM;\n\tvariant: CampaignBannerVariant;\n}\n\nexport function CampaignBanner({\n\tcampaign: { shortDescription, longDescription, actionLink, actionLinkText },\n\tvariant,\n}: CampaignBannerProps) {\n\treturn (\n\t\t<DialogBanner\n\t\t\tshortDescription={shortDescription}\n\t\t\tlongDescription={longDescription}\n\t\t\tactionLink={actionLink}\n\t\t\tactionLinkText={actionLinkText}\n\t\t\tclassName={`campaign${variant}`}\n\t\t/>\n\t);\n}\n","import { ApartmentCampaignAM } from '../Api/ApartmentAM';\nimport * as React from 'react';\nimport { ReactNode } from 'react';\nimport { ResourceText } from '../../Components/ResourceText';\nimport { Button, Dialog, IconChevronRight, IconClose, SpacingContainer } from '@kojamo/lumo-dls';\n\nexport function DialogBanner({\n\tIcon,\n\tclassName,\n\tshortDescription,\n\tlongDescription,\n\tactionLink,\n\tactionLinkText,\n}: ApartmentCampaignAM & { Icon?: ReactNode; className?: string }) {\n\tconst [showDialog, setShowDialog] = React.useState(false);\n\n\treturn (\n\t\t<div className={`dialogBanner__wrapper ${className ? className : ''}`}>\n\t\t\t<div className={`dialogBanner`}>\n\t\t\t\t{Icon}\n\t\t\t\t<div className=\"textContainer\" dangerouslySetInnerHTML={{ __html: shortDescription }} />\n\t\t\t\t<Dialog\n\t\t\t\t\topen={showDialog}\n\t\t\t\t\tonOpenChange={setShowDialog}\n\t\t\t\t\ttrigger={\n\t\t\t\t\t\t<button className=\"button\">\n\t\t\t\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_DialogBanner_Button_ReadMore\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<DialogContent\n\t\t\t\t\t\tshortDescription={shortDescription}\n\t\t\t\t\t\tlongDescription={longDescription}\n\t\t\t\t\t\tactionLink={actionLink}\n\t\t\t\t\t\tactionLinkText={actionLinkText}\n\t\t\t\t\t\tonHide={() => setShowDialog(false)}\n\t\t\t\t\t/>\n\t\t\t\t</Dialog>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\ninterface DialogProps extends ApartmentCampaignAM {\n\tonHide: () => void;\n}\n\nfunction DialogContent({ shortDescription, longDescription, actionLink, actionLinkText, onHide }: DialogProps) {\n\treturn (\n\t\t<SpacingContainer direction=\"column\" rowGap={5} align=\"start\" className=\"l-padding-7 l-padding-3-mobile\">\n\t\t\t<SpacingContainer className=\"l-fill-parent-width\" justify=\"edges\" align=\"start\" columnGap={4}>\n\t\t\t\t<h2 className=\"l-headline is-display\" dangerouslySetInnerHTML={{ __html: shortDescription }} />\n\t\t\t\t<Button variant=\"icon\" onClick={onHide}>\n\t\t\t\t\t<IconClose />\n\t\t\t\t</Button>\n\t\t\t</SpacingContainer>\n\t\t\t<div className=\"l-font-body\" dangerouslySetInnerHTML={{ __html: longDescription }} />\n\t\t\t{actionLink && actionLinkText && (\n\t\t\t\t<a className=\"l-button is-text\" href={actionLink}>\n\t\t\t\t\t{actionLinkText}\n\t\t\t\t\t<IconChevronRight />\n\t\t\t\t</a>\n\t\t\t)}\n\t\t\t<Button variant=\"secondary\" onClick={onHide}>\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_DialogBanner_Button_Close\" />\n\t\t\t</Button>\n\t\t</SpacingContainer>\n\t);\n}\n","import { ApartmentAM } from '../Api/ApartmentAM';\nimport { useSelector } from 'react-redux';\nimport { ILumoOneAppState } from '../../boot/configureStore';\nimport { useResource } from '../../Components/ResourceText';\nimport { formatDateTimeRange } from '../../DateUtils';\nimport * as React from 'react';\nimport { DialogBanner } from './DialogBanner';\nimport { ApartmentShowingIcon } from './ApartmentIcons';\n\nexport enum ApartmentShowingBannerVariant {\n\tTopBanner = 'TopBanner',\n\tSideBanner = 'SideBanner',\n}\n\nexport function ApartmentShowingBanner({\n\tapartment,\n\tvariant,\n}: {\n\tapartment: ApartmentAM;\n\tvariant: ApartmentShowingBannerVariant;\n}) {\n\tconst language = useSelector(({ language }: ILumoOneAppState) => language.currentLanguage);\n\tconst { getResourceText } = useResource();\n\tconst shortDescription = apartment.nextShowingStartTime\n\t\t? `${getResourceText('General_Showing', undefined, { transform: 'capitalize' })}: ${formatDateTimeRange(\n\t\t\t\tapartment.nextShowingStartTime,\n\t\t\t\tapartment.nextShowingEndTime,\n\t\t\t\tlanguage,\n\t\t\t)}`\n\t\t: '';\n\n\treturn apartment.nextShowingStartTime ? (\n\t\t<DialogBanner\n\t\t\tIcon={<ApartmentShowingIcon className=\"apartmentShowingIcon\" />}\n\t\t\tclassName={`apartmentShowing${variant}`}\n\t\t\tshortDescription={shortDescription}\n\t\t\tlongDescription={apartment.nextShowingDescription || ''}\n\t\t/>\n\t) : null;\n}\n","import * as React from 'react';\r\nimport { Carousel } from 'react-responsive-carousel';\r\nimport { ResourceTextInline } from '../../Components/ResourceText';\r\n\r\nexport function CustomerTestimonials({ items, showIndicators }: { items: string[]; showIndicators?: boolean }) {\r\n\tconst [index, setIndex] = React.useState(0);\r\n\r\n\tconst elements = items.map((t, idx) => (\r\n\t\t<div className=\"wrapper mod-textBlock__quoteItem\" key={idx}>\r\n\t\t\t<p className=\"mod-textBlock__quoteTitle\">\r\n\t\t\t\t<ResourceTextInline\r\n\t\t\t\t\tresourceKey=\"ApartmentPage_CustomerTestimonials_Title\"\r\n\t\t\t\t\tdefaultText=\"Asukkaiden kertomaa\"\r\n\t\t\t\t/>\r\n\t\t\t</p>\r\n\t\t\t<div className=\"mod-textBlock__quoteMark\">&ldquo;</div>\r\n\t\t\t<p className=\"mod-textBlock__quoteText\">{t}</p>\r\n\t\t</div>\r\n\t));\r\n\r\n\tconst hasMany = items.length > 1;\r\n\r\n\treturn (\r\n\t\t<Carousel\r\n\t\t\tclassName=\"mod-textBlock customer-testimonials -noBottomBorder\"\r\n\t\t\tshowThumbs={false}\r\n\t\t\tshowIndicators={hasMany ? showIndicators : false}\r\n\t\t\tshowStatus={false}\r\n\t\t\tinfiniteLoop={true}\r\n\t\t\tselectedItem={index || 0}\r\n\t\t\tonChange={(idx) => setIndex(idx)}\r\n\t\t\t/* Hack-ish way to hide arrows and disable swipe if only one item */\r\n\t\t\trenderArrowPrev={!hasMany ? () => null : undefined}\r\n\t\t\trenderArrowNext={!hasMany ? () => null : undefined}\r\n\t\t\tswipeable={hasMany}\r\n\t\t\tshowArrows={\r\n\t\t\t\tfalse\r\n\t\t\t} /* disable arrows as they were not visible in prod and overlap with quote marks if shown. New design TBD */\r\n\t\t>\r\n\t\t\t{elements}\r\n\t\t</Carousel>\r\n\t);\r\n}\r\n","import * as React from 'react';\nimport { BenefitCategory } from '../../Benefits/Api/ApiModels';\nimport { routeFromRoot, routes } from '../../Common/routes';\nimport { ResourceText, useLanguage } from '../../Components/ResourceText';\nimport SmartLink from '../../Components/SmartLink';\nimport { Tooltip } from '../../Components/Tooltip';\nimport { ApartmentBenefitAM } from '../Api/ApartmentAM';\nimport { MarkdownContent } from '../../Components/MarkdownContent';\nimport { BenefitIcon } from '../../Components/BenefitIcon';\n\ninterface AllBenefitsListProps {\n\tbenefits: ApartmentBenefitAM[];\n}\n\nexport function AllBenefits({ benefits }: AllBenefitsListProps) {\n\tconst includedInLivingBenefits = benefits.filter((b) =>\n\t\tb.categories.some((c) => c.toString() === BenefitCategory[BenefitCategory.IncludedInLiving]),\n\t);\n\n\tconst paidBenefits = benefits.filter((b) =>\n\t\tb.categories.some((c) => c.toString() === BenefitCategory[BenefitCategory.PaidBenefits]),\n\t);\n\n\tconst language = useLanguage();\n\n\treturn (\n\t\t<div className=\"allBenefits\">\n\t\t\t<h2 className=\"allBenefits__title mod-textBlock__figureCaption\">\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_AllBenefitsList_Title\" />\n\t\t\t</h2>\n\t\t\t<BenefitsCategorySection\n\t\t\t\tid=\"allIncludedInLivingBenefits\"\n\t\t\t\tbenefits={includedInLivingBenefits}\n\t\t\t\tcategory={BenefitCategory.IncludedInLiving}\n\t\t\t/>\n\t\t\t<BenefitsCategorySection\n\t\t\t\tid=\"allPaidBenefits\"\n\t\t\t\tbenefits={paidBenefits}\n\t\t\t\tcategory={BenefitCategory.PaidBenefits}\n\t\t\t/>\n\t\t\t<SmartLink className=\"button\" to={routeFromRoot(routes.benefits)[language]}>\n\t\t\t\t<ResourceText resourceKey=\"ApartmentPage_AllBenefitsList_Button_ReadMore\" />\n\t\t\t</SmartLink>\n\t\t</div>\n\t);\n}\n\ninterface BenefitsCategorySectionProps {\n\tbenefits: ApartmentBenefitAM[];\n\tcategory: BenefitCategory;\n\tid: string;\n}\n\nfunction BenefitsCategorySection({ category, benefits, id }: BenefitsCategorySectionProps) {\n\treturn (\n\t\t<div id={id} className=\"benefitsCategorySection\">\n\t\t\t<h3 className=\"benefitsCategorySection__title\">\n\t\t\t\t<ResourceText\n\t\t\t\t\tresourceKey={`ApartmentPage_AllBenefitsList_CategoryTitle_${BenefitCategory[category]}`}\n\t\t\t\t/>\n\t\t\t</h3>\n\t\t\t<ul className=\"benefitsList\">\n\t\t\t\t{benefits.map((b) => (\n\t\t\t\t\t<BenefitItem key={b.technicalName} benefit={b} />\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\nfunction BenefitItem({ benefit }: { benefit: ApartmentBenefitAM }) {\n\treturn (\n\t\t<li className=\"benefitItem\">\n\t\t\t<BenefitIcon benefitTechnicalName={benefit.technicalName} className=\"benefit-link__icon\" />\n\t\t\t<div>{benefit.heading}</div>\n\t\t\t<span className=\"mod-apartmentInfoSecondary__label--infoCircle\">\n\t\t\t\t<Tooltip text={MarkdownContent({ text: benefit.description, inline: true })!} />\n\t\t\t</span>\n\t\t</li>\n\t);\n}\n","import React from 'react';\nimport { useEffect } from 'react';\nimport { connect } from 'react-redux';\nimport { ILumoOneAppState } from '../../boot/configureStore';\nimport { isOperationSuccess, OperationState } from '../../Common/Api/ApiOperationState';\nimport { Language } from '../../Common/interfaces/language';\nimport { ResourceText } from '../../Components/ResourceText';\nimport SmartLink from '../../Components/SmartLink';\nimport { LocationData } from '../../LocationDataProvider/LocationData';\nimport { ApartmentSearchResultAM } from '../Api/ApartmentSearchResultAM';\nimport { ApartmentCard } from '../Browser/ApartmentCard';\nimport { GetUrlForCriteria } from '../Browser/apartmentSearchUrlHandling';\nimport { apartmentPageActions } from './apartmentPageActions';\n\nexport interface Params {\n\tapartmentId: string;\n}\n\nexport interface ReduxProps {\n\tapartments: OperationState<ApartmentSearchResultAM[], string> | undefined;\n\tlocationData: LocationData | undefined;\n\tlanguage: Language;\n}\n\nexport interface DispatchProps {\n\tgetApartments: typeof apartmentPageActions.getOtherAvailableApartments.request;\n}\n\nexport type OtherAvailableApartmentsListProps = Params & ReduxProps & DispatchProps;\n\nfunction OtherAvailableApartmentsList(props: OtherAvailableApartmentsListProps) {\n\tconst apartmentsNotFetched = typeof props.apartments === 'undefined';\n\n\tuseEffect(() => {\n\t\tif (apartmentsNotFetched || (props.apartments && props.apartments.param !== props.apartmentId)) {\n\t\t\tprops.getApartments(props.apartmentId);\n\t\t}\n\t}, []);\n\n\tif (\n\t\t!props.locationData ||\n\t\tapartmentsNotFetched ||\n\t\t!isOperationSuccess(props.apartments) ||\n\t\tprops.apartments.result.length === 0\n\t) {\n\t\treturn null;\n\t}\n\n\tconst allApartmentsUrl = GetUrlForCriteria(\n\t\tprops.language,\n\t\t{\n\t\t\tlocation: { businessEntityIds: [props.apartments.result[0].businessEntityId] },\n\t\t},\n\t\tprops.locationData,\n\t);\n\n\treturn (\n\t\t<div className=\"mod-otherAvailableApartmentsList\">\n\t\t\t<h3>\n\t\t\t\t<ResourceText resourceKey=\"Apartment_OtherAvailableApartmentsList_Title\" />\n\t\t\t</h3>\n\n\t\t\t<div className=\"mod-apartmentList\">\n\t\t\t\t{props.apartments.result.slice(0, 4).map((a) => (\n\t\t\t\t\t<ApartmentCard key={a.id} apartment={a} />\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{props.apartments.result.length > 4 && (\n\t\t\t\t<div className=\"mod-otherAvailableApartmentsList__buttonContainer\">\n\t\t\t\t\t<SmartLink to={allApartmentsUrl} className=\"button button--clear\" clearApartmentSearchState={true}>\n\t\t\t\t\t\t<ResourceText resourceKey=\"Apartment_OtherAvailableApartmentsList_SeeAllApartments_Link\" />\n\t\t\t\t\t</SmartLink>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default connect<ReduxProps, DispatchProps, Params, ILumoOneAppState>(\n\t({ locationData, language, apartmentPage }) => ({\n\t\tlocationData: locationData.locationData,\n\t\tlanguage: language.currentLanguage,\n\t\tapartments: apartmentPage.otherAvailableApartments,\n\t}),\n\t{\n\t\tgetApartments: apartmentPageActions.getOtherAvailableApartments.request,\n\t},\n)(OtherAvailableApartmentsList);\n","import { useEffect, useRef } from 'react';\nimport { createTimer } from './createTimer';\n\nexport function useActivityTimerRef() {\n\tconst state = useRef(createTimer());\n\n\tuseEffect(() => {\n\t\tconst gotFocus = () => {\n\t\t\tstate.current.start();\n\t\t};\n\t\tconst lostFocus = () => {\n\t\t\tstate.current.stop();\n\t\t};\n\n\t\twindow.addEventListener('focus', gotFocus);\n\t\twindow.addEventListener('blur', lostFocus);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('focus', gotFocus);\n\t\t\twindow.removeEventListener('blur', lostFocus);\n\t\t};\n\t}, []);\n\n\treturn state;\n}\n","export function createTimer() {\n\tlet running = true;\n\tlet startedMs = Date.now();\n\tlet elapsedMs = 0;\n\n\tfunction start() {\n\t\tif (running) {\n\t\t\treturn;\n\t\t}\n\n\t\tstartedMs = Date.now();\n\t\trunning = true;\n\t}\n\n\tfunction stop() {\n\t\tif (!running) {\n\t\t\treturn;\n\t\t}\n\n\t\telapsedMs = getElapsed();\n\t\trunning = false;\n\t}\n\n\tfunction getElapsed() {\n\t\tif (running) {\n\t\t\tconst currentTime = Date.now();\n\t\t\tconst elapsedMsSinceStart = currentTime - startedMs;\n\n\t\t\treturn elapsedMs + elapsedMsSinceStart;\n\t\t} else {\n\t\t\treturn elapsedMs;\n\t\t}\n\t}\n\n\treturn {\n\t\tstart,\n\t\tstop,\n\t\tgetElapsed,\n\t};\n}\n","import { IconChevronLeft, IconChevronRight } from '@kojamo/lumo-dls';\nimport React, { ReactNode } from 'react';\nimport { routeFromRoot } from '../../Common/routes';\nimport SmartLink from '../../Components/SmartLink';\nimport { Language } from '../../Common/interfaces/language';\nimport { BreadCrumbItem, ResourceTextRequest } from '../../Common/Layout/layoutState';\nimport { MobileBreakpointSelector } from '../../Components/MobileBreakpointSelector/MobileBreakpointSelector';\nimport { BreadcrumbText } from '../../Common/BreadcrumbText';\n\nfunction getNearestItems(\n\tlanguage: Language,\n\tbreadcrumbParents: BreadCrumbItem[],\n\tfilterFn?: (items: BreadCrumbItem[]) => BreadCrumbItem[],\n) {\n\tconst baseBreadcrumbItem = {\n\t\tname: {\n\t\t\tkey: 'BreadCrumb_Base',\n\t\t\tdefaultValue: '',\n\t\t},\n\t\tpath: routeFromRoot()[language],\n\t};\n\tconst breadCrumbItems = [baseBreadcrumbItem, ...breadcrumbParents];\n\treturn filterFn ? filterFn(breadCrumbItems) : breadCrumbItems;\n}\n\nfunction Breadcrumb({\n\tparentBreadcrumbs,\n\tcurrentBreadcrumb,\n}: {\n\tparentBreadcrumbs: ReactNode;\n\tcurrentBreadcrumb?: ReactNode;\n}) {\n\treturn (\n\t\t<div className=\"apartment-page-breadcrumb-wrapper l-background-color-beige is-light\">\n\t\t\t<ol className=\"apartment-page-breadcrumb l-display-flex l-padding-3-y\">\n\t\t\t\t{parentBreadcrumbs}\n\t\t\t\t{currentBreadcrumb}\n\t\t\t</ol>\n\t\t</div>\n\t);\n}\n\nconst MobileBreadcrumb = React.memo(\n\tfunction MobileBreadcrumb({\n\t\tlanguage,\n\t\tbreadcrumbParents,\n\t}: {\n\t\tlanguage: Language;\n\t\tbreadcrumbParents: BreadCrumbItem[];\n\t}) {\n\t\tconst nearestItems = getNearestItems(language, breadcrumbParents, (items) =>\n\t\t\titems.reverse().splice(0, 2).reverse(),\n\t\t);\n\n\t\treturn (\n\t\t\t<Breadcrumb\n\t\t\t\tparentBreadcrumbs={\n\t\t\t\t\t<>\n\t\t\t\t\t\t{nearestItems.map((breadcrumbItem, index) => (\n\t\t\t\t\t\t\t<li className=\"l-display-flex l-align-items-center l-margin-3-r\" key={index}>\n\t\t\t\t\t\t\t\t<IconChevronLeft className=\"divider-icon l-margin-3-r\" />\n\t\t\t\t\t\t\t\t<SmartLink to={breadcrumbItem.path} clearStates={true} className=\"l-font-body is-s\">\n\t\t\t\t\t\t\t\t\t<BreadcrumbText breadcrumbValue={breadcrumbItem.name} />\n\t\t\t\t\t\t\t\t</SmartLink>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t></Breadcrumb>\n\t\t);\n\t},\n\t(prevProps, currProps) => {\n\t\treturn JSON.stringify(prevProps) === JSON.stringify(currProps);\n\t},\n);\n\nconst DesktopBreadcrumb = React.memo(\n\tfunction DesktopBreadcrumb({\n\t\tlanguage,\n\t\tbreadcrumbCurrentName,\n\t\tbreadcrumbParents,\n\t}: {\n\t\tlanguage: Language;\n\t\tbreadcrumbCurrentName: string | ResourceTextRequest | undefined;\n\t\tbreadcrumbParents: BreadCrumbItem[];\n\t}) {\n\t\tconst nearestItems = getNearestItems(language, breadcrumbParents);\n\t\treturn (\n\t\t\t<Breadcrumb\n\t\t\t\tcurrentBreadcrumb={\n\t\t\t\t\t<li className=\"l-text-ui-highlight-dark l-display-flex l-align-items-center l-margin-3-r\">\n\t\t\t\t\t\t<IconChevronRight className=\"divider-icon l-text-ui-highlight-dark l-margin-3-r\" />\n\t\t\t\t\t\t<span className=\"l-font-body is-s\">\n\t\t\t\t\t\t\t<BreadcrumbText breadcrumbValue={breadcrumbCurrentName} />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>\n\t\t\t\t}\n\t\t\t\tparentBreadcrumbs={\n\t\t\t\t\t<>\n\t\t\t\t\t\t{nearestItems.map((breadcrumbItem, index) => (\n\t\t\t\t\t\t\t<li className=\"l-display-flex l-align-items-center l-margin-3-r\" key={index}>\n\t\t\t\t\t\t\t\t{index > 0 ? <IconChevronRight className=\"divider-icon l-margin-3-r\" /> : undefined}\n\t\t\t\t\t\t\t\t<SmartLink to={breadcrumbItem.path} clearStates={true} className=\"l-font-body is-s\">\n\t\t\t\t\t\t\t\t\t<BreadcrumbText breadcrumbValue={breadcrumbItem.name} />\n\t\t\t\t\t\t\t\t</SmartLink>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t></Breadcrumb>\n\t\t);\n\t},\n\t(prevProps, currProps) => {\n\t\treturn JSON.stringify(prevProps) === JSON.stringify(currProps);\n\t},\n);\n\nexport default function ApartmentPageBreadcrumb({\n\tcurrentLanguage,\n\tbreadcrumbParents,\n\tbreadcrumbCurrentName,\n}: {\n\tcurrentLanguage: Language;\n\tbreadcrumbParents: BreadCrumbItem[];\n\tbreadcrumbCurrentName: string | undefined;\n}) {\n\treturn (\n\t\t<MobileBreakpointSelector\n\t\t\tdesktopComponent={\n\t\t\t\t<DesktopBreadcrumb\n\t\t\t\t\tlanguage={currentLanguage}\n\t\t\t\t\tbreadcrumbCurrentName={breadcrumbCurrentName}\n\t\t\t\t\tbreadcrumbParents={breadcrumbParents}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tmobileComponent={<MobileBreadcrumb language={currentLanguage} breadcrumbParents={breadcrumbParents} />}\n\t\t/>\n\t);\n}\n"],"names":["$ed3kz","parcelRequire","ApartmentPage","React","detailsEventSent","constructor","props","state","context","super","this","marketingTextDiv","apartmentLoadIdentifier","formatApartmentLoadIdentifier","businessEntity","id","apartmentSlug","showRentalProcessSticky","showRentalBottomBar","getApartmentIfNotPresent","requireForSsr","apartmentPageActions","getApartmentBySlug","apartment","suggestedApartmentsActions","getApartments","setLayoutProps","componentDidMount","window","addEventListener","onScrollChange","logTelemetry","fetchApartmentStateIfMissing","componentWillUnmount","removeEventListener","componentDidUpdate","prevProps","current","contentText","innerText","innerHTML","streetAddress","slug","setState","scrollY","isAlreadyRequested","apartmentState","getApartmentState","isDataLoading","dataLoadingFailedFor","businessEntityId","getApartment","pageComplete","pageType","apartmentData","getApartmentDataForPageViewEvent","municipality","name","municipalitySubArea","undefined","data","pageViewEventSent","addTelemetryEventForApartmentView","render","jsx","$aQU8F","Loader","jsxs","Fragment","$2LBWb","default","title","$iK1dW","isOperationSuccess","result","ApartmentStateAM","Available","municipalityId","municipalitySubAreaId","Rented","$c47166386bd0e481$var$Status404","formatWindowTitle","meta","formatMeta","noIndex","excludeAlternateLangUrl","$1aRVN","AlternateLangExactUrl","className","$cbH91","breadcrumbCurrentName","currentLanguage","language","breadcrumbParents","breadCrumbParents","$9ma2w","backButton","currentSearchUrl","target","text","$jjuiK","ResourceText","resourceKey","variant","banner","campaign","$cdliT","CampaignBanner","CampaignBannerVariant","TopBanner","$1Jilp","TopBarFavoriteButton","$jUDBq","ApartmentInfo","businessEntityName","locationData","$LLZBN","StickyRentalBottomBar","visible","$1SLH4","NearbyServicesMap","$5KuIs","$jdgXg","excludeApartmentId","maxAmount","searchCriteria","location","businessEntityIds","roomCount","getApartmentTypeByRoomCount","showMoreLinkText","defaultText","showMoreLinkUrl","GetUrlForSearchResults","shareTitle","toFormattedString","rent","getResourceText","plan","shareImageUrl","mainImage","commonUiRoot","description","breadCrumb","formatBreadCrumb","setLayoutValues","slice","length","translateUrl","createTranslatedUrlsUsing","l","getUrl","GetUrlForApartment","bc","getBreadCrumbForSearchResults","push","getBreadCrumbForSearchResultsBusinessEntityPart","path","parameters","formatApartmentSize","$c47166386bd0e481$export$2e2bcd8739ae039","withResourceTextSupport","withSsrSupport","connect","layout","apartmentPage","apartmentBrowser","settings","pageViewTelemetry","GetUrlForCriteria","currentSearchState","criteria","eventHasBeenSent","request","layoutActions","setValues","pageViewTelemetryActions","Status404","setStatusCode","useSetStatusCode","useRunOnce","$e05Lt","ApartmentSearchResultAM","getSpecialFeatures","a","filterInOrder","features","getOutdoorFeatures","getOtherFeatures","$8ba4132dc726ef5c$export$b0023d6a041a1097","$8ba4132dc726ef5c$export$e9d3a642b8ed411a","WaterFeeBasisAM","ReservedForCurrentUser","ReservedForOtherUser","Unknown","InhabitantCount","Consumption","IncludedInRent","$8ba4132dc726ef5c$export$b8b597403126c2e6","ApartmentStatusAM","Notavailable","Reserved","Inrenovation","isFeatureSet","f","some","c","isNearbySet","s","nearbyServices","n","maxRent","areaInSqm","min","max","isNew","isFreshlyRenovated","financiallyLimited","availableParkingSpaceCount","channel","ApartmentSalesChannel","DirectRental","PersonalService","seniorHousing","nearby","laundryRoom","sauna","sharedSauna","topFloor","balcony","terrace","Application","elevator","includeFinanciallyLimited","concat","r","type","ApartmentType","Yksio","Kaksio","Kolmio","Nelio","isMatchByApartmentType","SuurempiKuinNelio","$91cd0a202f9a0c21$var$DirectRentalContent","hideSteps","$91cd0a202f9a0c21$export$66a9b98223d89e7e","DirectRentalContent","dispatch","useDispatch","navigate","useNavigate","reduxState","useSelector","directRental","isRentInProgress","isDirectRentalInProgress","expanded","setExpanded","useState","favoriteApartmentIDs","useFavoritesContext","$91cd0a202f9a0c21$var$CloseButton","onClose","$91cd0a202f9a0c21$var$DirectRentalSteps","disabled","onClick","directRentalActions","resetRentalState","selectApartmentForRent","addTelemetryEventForNewRentalProcessStart","favorite","addTelemetryEventForLightLogin","GA4EventAction","favorite_to_rent_process","routeFromRoot","routes","startRenting","$91cd0a202f9a0c21$var$DirectRentalActionText","isPersonalService","CloseButton","DirectRentalSteps","$jZmTk","SiteIntroStep","number","ApplicationContent","applicationPage","apartmentIsAddedToApplication","apartments","apartmentsAddedToApplication","applicationStage","addApartmentToApplication","applicationPageActions","getApplicationUrl","ApartmentApplicationProcessStage","ChooseApartments","$91cd0a202f9a0c21$var$StartApplicationProcessText","applicationInProgress","Boolean","DirectRentalActionText","StartApplicationProcessText","lat","lon","$btB8r","LazyContainer","$fR768","NearbyServices","center","services","showPublicTransportBar","addFavorite","removeFavorite","isFavorite","addInteraction","addApartmentId","telemetryApiClient","useLightLoginTelemetryApi","loggedIn","useLightLoginContext","activityTimer","useActivityTimerRef","collectTelemetryRef","telemetryData","apartmentId","timeSpentOnPage","userInteractions","useEffect","elapsedMs","getElapsed","sendTelemetryEvent","itemType","useLightLoginTelemetry","nextShowingStartTime","$eETVl","ApartmentShowingBanner","ApartmentShowingBannerVariant","$5eab71cc7feab584$var$ImageCarousel","$5eab71cc7feab584$var$DesktopRightColumnContainer","$7tW4b","ApartmentDetails","SideBanner","$cMB6H","ResourceImageInlineSvg","customerTestimonials","$hw2tH","CustomerTestimonials","items","showIndicators","style","paddingBottom","dangerouslySetInnerHTML","__html","marketingTextEn","marketingText","$77qec","tagPrimary","take","heading","ResourceTextInline","areaMarketingText","$5eab71cc7feab584$var$AreaDescription","$fOMXs","tagSecondary","$jwdIb","AllBenefits","benefits","$gmBQA","BusinessEntityDetailsNew","ImageCarousel","selectedImageIndex","setSelectedImageIndex","useCarouselImages","images","media","map","m","kind","housingVideoPresetConfig","ExtraControl","predicate","currentlySelected","isActive","selectedItemIndex","findIndex","setSelectedMedia","$044jS","ImageCarouselWithFullScreenSupport","mediaItems","onSelectedItemChanged","idx","thumbDisplayMode","telemetryContext","extraControls","mediaClass","DesktopRightColumnContainer","children","AreaDescription","locationCriteria","hasSubAreaMarketingText","municipalitySubAreas","municipalities","otherApartmentsUrl","$hJlnN","MarkdownContent","href","$e3EsW","to","useResource","$lL8wy","ApartmentFeaturesContainer","$3d2759a4984111d1$var$ApartmentAddress","$3d2759a4984111d1$var$ApartmentHighlightDetails","$3d2759a4984111d1$var$ApartmentFeaturesSection","$3d2759a4984111d1$var$RentButtonContainer","$3d2759a4984111d1$var$HouseFeaturesSection","$3d2759a4984111d1$var$ClimateResponsibilityBanner","$3d2759a4984111d1$var$RecidencyIncludedFeaturesSection","$3d2759a4984111d1$var$PaidExtraFeaturesSection","ApartmentAddress","zipCode","$l8vjv","PoiMarkerIcon","RentButtonContainer","useLanguage","width","height","viewBox","xmlns","transform","fill","fillRule","d","stroke","strokeWidth","strokeLinecap","cx","cy","ApartmentHighlightDetails","constructionYear","prefix","availabilityPrefix","value","availabilityValue","getAvailability","$4tqX2","NewApartmentTag","nextShowingTime","FreshlyRenovatedTag","FinanciallyLimitedTag","SeniorHousingTag","isTrending","TrendingTag","ApartmentFeaturesSection","CollapsibleFeatureGroup","isOpenInitially","$3d2759a4984111d1$var$ApartmentFeatureRent","$3d2759a4984111d1$var$ApartmentFeatureRentGuarantee","$3d2759a4984111d1$var$ApartmentFeatureSize","$3d2759a4984111d1$var$ApartmentFeatureFloorPlan","$3d2759a4984111d1$var$ApartmentFeatureNonSmoking","$3d2759a4984111d1$var$ApartmentFeatureFloorNumber","$3d2759a4984111d1$var$ApartmentFeatureWaterCharge","getNewSpecialFeatures","feature","$3d2759a4984111d1$var$ApartmentFeatureItem","$3d2759a4984111d1$var$FeaturesAdditionally","getNewOtherFeatures","resourceKeyPrefix","HouseFeaturesSection","hasElevator","$3d2759a4984111d1$var$HouseFeatureElevator","$3d2759a4984111d1$var$HouseFeatureSauna","onlineReservation","hasSaunaWithOnlineReservation","$3d2759a4984111d1$var$HouseFeatureParking","electricChargingParkingSpaceCount","externalParkingSpaceManagementDescription","hasCarbonNeutralHeating","$3d2759a4984111d1$var$HouseFeatureCarbonNeutralHeating","getAdditionalHouseFeatures","RecidencyIncludedFeaturesSection","electricityIncludedInRent","$3d2759a4984111d1$var$RecidencyFeatureElectricity","$3d2759a4984111d1$var$RecidencyFeatureInternet","$3d2759a4984111d1$var$RecidencyFeaturePaint","$3d2759a4984111d1$var$RecidencyFeatureMyLumo","$3d2759a4984111d1$var$AllBenefitsLink","url","linkTextResourceKey","getBenefitIfAvailable","benefitName","find","b","technicalName","ClimateResponsibilityBanner","$ciKd3","ResourceImage","asBackgroundImage","PaidExtraFeaturesSection","keyCourierBenefit","movingServiceBenefit","finalCleanUpServiceBenefit","assemblyServiceBenefit","$3d2759a4984111d1$var$ExtraFeature","benefit","ApartmentFeatureRent","CollapsibleFeatureGroupItem","$NaHU9","ApartmentRentIcon","ApartmentFeatureRentGuarantee","ApartmentRentGuaranteeIcon","ApartmentFeatureSize","ApartmentSizeIcon","ApartmentFeatureFloorPlan","ApartmentFloorPlanIcon","buildingType","ApartmentFeatureFloorNumber","ApartmentFloorIcon","floor","toString","buildingFloorCount","ApartmentFeatureWaterCharge","waterFeeBasis","ApartmentWaterIcon","waterFeePerPersonMonth","$4UxxT","Tooltip","buildWaterChargeElement","ApartmentFeatureItem","ApartmentFeatureNonSmoking","textKey","tooltipTextKey","nonSmokingBuilding","isNonSmoking","$3d2759a4984111d1$var$IconNonSmoking","FeaturesAdditionally","index","HouseFeatureElevator","HouseFeatureSauna","HouseFeatureCarbonNeutralHeating","HouseCarbonNeutralHeatingIcon","HouseFeatureParking","desc","String","openLinksInNewTab","HouseParkingIcon","HouseElectricCarChargingIcon","RecidencyFeatureElectricity","RecidencyElectricityIcon","RecidencyFeatureInternet","broadbandBenefit","src","getBenefitIconUrl","alt","broadband","speed","RecidencyFeaturePaint","getBenefitIconUrlByTechicalName","RecidencyFeatureMyLumo","ExtraFeature","AllBenefitsLink","filter","IconNonSmoking","clipRule","isOpen","setIsOpen","react","tabIndex","ApartmentShowingIcon","$iMUGz","$5447251086fe0ee8$export$2e2bcd8739ae039","isPreMarketing","$5447251086fe0ee8$var$MarketingText","$5447251086fe0ee8$var$HouseBasicInfoContainer","$5447251086fe0ee8$var$InformationContainer","$5447251086fe0ee8$var$BuildingType","$5447251086fe0ee8$var$ConstructionYear","energyEfficiencyClass","$5447251086fe0ee8$var$EnergyEfficiencyClass","$5447251086fe0ee8$var$AntennaSystem","$5447251086fe0ee8$var$BroadbandDetails","$5447251086fe0ee8$var$CommunalAreaFeatures","MarketingText","localizedMarketingText","marketingTextTitle","HouseBasicInfoContainer","InformationContainer","BuildingType","ConstructionYear","EnergyEfficiencyClass","AntennaSystem","cableTV","available","provider","BroadbandDetails","CommunalAreaFeatures","communalAreaFeatures","$5447251086fe0ee8$var$TextFeature","isFirst","TextFeature","optional","$parcel$interopDefault","$iU6fI","$f7b7844021572d0b$export$de6d75404cb2199b","shortDescription","longDescription","actionLink","actionLinkText","$dkeTX","DialogBanner","Icon","showDialog","setShowDialog","$icxVu","Dialog","open","onOpenChange","trigger","$51d3e1a965346c26$var$DialogContent","onHide","DialogContent","SpacingContainer","direction","rowGap","align","justify","columnGap","Button","IconClose","IconChevronRight","$21ffe495235f0200$export$e82c84b402c00b53","formatDateTimeRange","nextShowingEndTime","nextShowingDescription","setIndex","elements","t","hasMany","$ihHE3","Carousel","showThumbs","showStatus","infiniteLoop","selectedItem","onChange","renderArrowPrev","renderArrowNext","swipeable","showArrows","includedInLivingBenefits","categories","BenefitCategory","IncludedInLiving","paidBenefits","PaidBenefits","$ced481171ad28ff6$var$BenefitsCategorySection","category","BenefitsCategorySection","$ced481171ad28ff6$var$BenefitItem","BenefitItem","$fddP5","BenefitIcon","benefitTechnicalName","inline","$222b8f27a2bcd7ca$export$2e2bcd8739ae039","otherAvailableApartments","getOtherAvailableApartments","apartmentsNotFetched","param","allApartmentsUrl","$iCDXO","ApartmentCard","clearApartmentSearchState","useRef","createTimer","gotFocus","start","lostFocus","stop","running","startedMs","Date","now","currentTime","getNearestItems","filterFn","breadCrumbItems","key","defaultValue","Breadcrumb","parentBreadcrumbs","currentBreadcrumb","MobileBreadcrumb","memo","nearestItems","reverse","splice","$a4351a8bb09b72ed$var$Breadcrumb","breadcrumbItem","IconChevronLeft","clearStates","$6x2qe","BreadcrumbText","breadcrumbValue","currProps","JSON","stringify","DesktopBreadcrumb","$a4351a8bb09b72ed$export$2e2bcd8739ae039","$fVo2P","MobileBreakpointSelector","desktopComponent","$a4351a8bb09b72ed$var$DesktopBreadcrumb","mobileComponent","$a4351a8bb09b72ed$var$MobileBreadcrumb"],"version":3,"file":"ApartmentPageNew.59a2781d.js.map"}