{"version":3,"sources":["hooks/use-click-outside.tsx","components/AreaNavigation/styles.js","components/AreaNavigation/index.tsx","components/HousetypeDropdown/styles.js","components/HousetypeDropdown/index.tsx","components/Form/ContactFormLarge/styles.js","components/Form/ContactFormLarge/index.tsx","pages/SearchPage/styles.js","components/Search/SaleRentSelect/styles.js","components/Search/SaleRentSelect/index.tsx","components/Search/MonthlyPaymentSearch/styles.js","components/Search/ApartmentSearchBar/styles.js","components/Tooltip/styles.js","components/Tooltip/index.tsx","hooks/use-hover.tsx","components/Search/MonthlyPaymentSearch/index.tsx","components/Search/ApartmentSearchBar/extras.tsx","components/Search/ApartmentSearchBar/index.tsx","pages/SearchPage/SearchResultDescription/styles.js","pages/SearchPage/SearchResultDescription/index.tsx","pages/SearchPage/index.tsx"],"names":["useOnClickOutside","ref","handler","useEffect","listener","event","target","current","contains","document","addEventListener","removeEventListener","AreaNavContainer","styled","div","attrs","className","id","withConfig","componentId","props","position","AreaNav","nav","media","lgx","_templateObject","_taggedTemplateLiteral","isBlue","darken","color","connect","state","doc","blue","data","rest","__rest","areaNavi","isEmpty","page","getAreaNavi","hasWindow","body","classList","add","remove","React","createElement","map","_ref","index","name","link","active","Link","key","to","Select","SelectButton","button","fontFamily","base","isOpen","css","Selections","boxShadow","basic","Selection","HousetypeDropdown","_a","noSelectionsText","selections","selectables","onSelection","e","defaultValue","length","mounted","setMounted","useState","setSelections","selected","setSelected","setOpen","useRef","i","value","isActive","selection","Object","assign","onClick","type","label","FaIcon","icon","sels","s","select","FormWrapper","hugeLight","ribbon","md","textStyles","H3Condensed","_templateObject2","_templateObject3","FormContainer","_templateObject4","FormColumns","_templateObject5","FormColumn","_templateObject6","grid","gutterSmall","lg","_templateObject7","gutter","FormFooter","_templateObject8","FormButtonInfo","FormDisclaimer","MicroText","_templateObject9","_templateObject10","Formik","lazy","then","module","default","ErrorMessage","validationSchema","getSchema","FormPlaceholder","Placeholder","PlaceholderInput","PlaceholderTextarea","PlaceholderText","PlaceholderButton","ContactFormLarge","buttonText","buttonInfo","children","subjectIndex","agent","initialValues","email","message","phone","postCode","contactSubmitTimeout","isSubmitted","setSubmitted","clearTimeout","Suspense","fallback","onSubmit","doSubmit","values","_ref2","setSubmitting","resetForm","__awaiter","submitUrl","location","href","formData","res","contactService","doBasicContact","console","log","window","setTimeout","_ref3","handleChange","handleBlur","handleSubmit","isSubmitting","InputGroup","aria-label","disabled","onBlur","onChange","placeholder","component","msg","FormError","Textarea","CtaButton","text","submitting","ThankYouMessage","SearchPageWrapper","xsm","sm","spinHouse","keyframes","enterLoader","SearchLoader","wide","ResultsHeader","SortContainer","smd","ApartmentsWrapper","LoadMore","buttons","textLinkPrimary","SearchPageContactArea","SearchPageContactTitle","h3","SearchPageContactIngress","ContactFormContainer","Selected","SaleRentSelect","rental","useSelector","getApartmentSearch","toggle","onSelect","MPSearch","Title","h4","lineHeight","Description","p","InputGroupTitle","h5","MPSubmit","BaseButton","SearchBar","SearchBarSection","SearchBarContent","ExtraSection","SelectionTitle","Actions","mobile","ActionButton","light","condensed","KeySearch","TextLinkSecondary","DividerDash","span","vertical","_ref4","OptionWithTextInputs","Price","Area","BuildYear","Condition","_templateObject11","SelectionsWrapper","ExtrasToggle","DdSelectToggle","_templateObject12","HistoryButtonContainer","_templateObject13","TooltipContainer","TooltipIcon","TooltipContent","width","direction","getTooltipStyle","Tooltip","content","onHover","hoverRef","isHovered","setValue","handleMouseOver","handleMouseOut","node","useHover","getSuitablePriceRange","parsedValues","toString","interest","maxPrice","minPrice","savings","ownSavings","time","min","parseInt","max","undefined","series","a","parseFloat","replace","multiplier","Math","pow","minHousePrice","round","maxHousePrice","MonthlyPaymentSearch","defaultInterest","defaultTime","title","savedValues","setSavedValues","useLocalStorage","dispatch","useDispatch","setValues","priceRange","priceRangeText","concat","getSuitablePriceRangeText","htmlFor","TextInput","labelAfter","sagaAddConstraint","onSearch","SearchBarExtras","doReset","matches","isLoading","addresses","getAddresses","shallowEqual","shouldShowSearchWatchButton","as","PropertyKeySearch","clsx","NumberFormat","thousandSeparator","displayType","rangeReducer","acc","room","ranges","push","rangeStart","last","ApartmentSearchBar","PureComponent","constructor","super","createRef","addressSearchRef","this","wrapperOpen","handleInputChange","debounce","handleCondition","bind","handleFeatures","getTypesTitle","getRoomRangeText","getAreaTitle","getPriceTitle","toggleWrapper","limit","field","apartmentSearch","includes","addConstraint","condition","addSelection","feature","resetSelections","reset","selectableHouseTypes","activeTypes","filter","rooms","selectedRooms","roomRanges","sort","b","reduce","join","area","minArea","maxArea","areaType","areaTypePart","Fragment","range","setState","documentElement","arguments","substr","componentDidMount","init","componentWillUnmount","render","addAddresses","setRental","itemsWithSelections","constraints","conditions","selectableConditions","features","selectableFeatures","houseTypes","newConstruction","selectableNewConstruction","selectableRooms","valueListing","selectableValueListing","selectableAreaTypes","areaTypes","defaultSelectableAreaTypes","selectAreaType","roomRangeText","houseTypeText","hasSelectedRooms","hasSelectedHouseTypes","price","hasSelectedPrices","hasSelectedAreas","hasSelectedAreaType","year","hasOtherSearchTerms","hasMainSearchTerms","initiallyRental","AddressSearch","isProperty","buttonHtml","DropdownSelect","MultiButtonSelect","useRedux","CheckboxSelect","toggleDd","PriceRange","f","v","forEach","single","AreaRange","YearRange","Extras","ApartmentSearchBarContainer","ApartmentSearch","ApartmentSearchConsumer","DescriptionContainer","H1","h1","ValueListingDescription","SearchResultDescription","count","searched","restProps","noDynamicH1","pageH1","pageSearchInfo","dynamicH1","selectedHousetypes","Array","isArray","address","getAddressValues","alt","src","getAssetUrl","mapDispatchToProps","addSort","sagaAddSort","getProperties","sagaGetInitialProperties","loadMore","sagaLoadMore","sagaSetRental","memo","contactTitle","hasContactForm","searchData","searchProperties","searchResultLimit","parameterString","seniorHousing","query","option","geothermalHeating","results","ignoredFirstSort","setIgnoredFirstSort","searchedWithSearchData","setSearchedWithSearchData","initialSort","sortOrder","apartmentsWrapperRef","handlePropertyClick","currentTarget","dataset","sessionStorage","setItem","wake","loading","isSearchPage","localStorage","sagaGetPropertiesForLandingPage","AreaNavigation","Container","order","split","selectableSorting","property","ApartmentBlock","data-key","loadMoreProperties","Text","Editor"],"mappings":"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","file":"assets/js/pages-SearchPage.chunk.js?cb=50a1e4f927d1ecdd78d5","sourcesContent":["import React, { useEffect, RefObject } from 'react';\n\nconst useOnClickOutside = (ref: RefObject, handler: (e?: MouseEvent | TouchEvent) => void) => {\n\tuseEffect(() => {\n\t\tconst listener = (event: MouseEvent | TouchEvent) => {\n\t\t\tconst target = (event.target as HTMLElement);\n\t\t\t// Do nothing if clicking ref's element or descendent elements\n\t\t\tif (!ref.current || ref.current.contains(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thandler(event);\n\t\t};\n\n\t\tdocument.addEventListener('mousedown', listener);\n\t\tdocument.addEventListener('touchstart', listener);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', listener);\n\t\t\tdocument.removeEventListener('touchstart', listener);\n\t\t};\n\t}, []);\n};\n\nexport default useOnClickOutside;","import styled from \"styled-components\";\nimport { media, color } from \"@utils/style-utils\";\nimport { darken } from \"polished\";\n\nexport const AreaNavContainer = styled.div.attrs(() => ({\n\tclassName: \"area-nav-container\",\n\tid: \"area-nav-container\",\n}))`\n\tborder-top: 1px solid #d7e9e4;\n\tleft: 0;\n\tposition: ${props => props.position || \"absolute\"};\n\ttop: 56px;\n\twidth: 100%;\n\n\t@media (min-width: 530px) {\n\t\ttop: 65px;\n\t}\n\n\t&.area-nav--property {\n\t\tborder-top: 0;\n\t\tposition: relative;\n\t}\n`;\n\nexport const AreaNav = styled.nav.attrs(() => ({\n\tclassName: \"area-nav\",\n\tid: \"area-nav\",\n}))`\n\tdisplay: none;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\tmargin: 0 auto;\n\tmax-width: 1050px;\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n\twidth: 100%;\n\n\t${media.lgx`\n\t\tdisplay: flex;\n\t`}\n\n\ta {\n\t\tcolor: ${props => (props.isBlue ? darken(0.1, color(\"blue\", 2)) : color(\"greenDark\", 2))};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tfont-weight: 500;\n\t\tmargin: 10px 13px;\n\t\tpadding: 14px 10px;\n\t\ttext-decoration: none;\n\t\ttransition: color 150ms;\n\n\t\t&:hover {\n\t\t\tcolor: ${props => (props.isBlue ? darken(0.2, color(\"blue\", 1)) : color(\"greenDark\", 1))};\n\t\t}\n\n\t\t&.is-active {\n\t\t\tcolor: ${props => (props.isBlue ? darken(0.2, color(\"blue\", 1)) : color(\"greenDark\", 1))};\n\t\t}\n\t}\n`;\n","import React, { useEffect } from \"react\";\nimport { connect } from \"react-redux\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport { IApplicationState } from \"@redux\";\nimport { AreaNavContainer, AreaNav } from \"./styles\";\nimport { IDocument } from \"@redux/document\";\nimport { Link } from \"react-router-dom\";\nimport { hasWindow } from \"@utils\";\n\ninterface IAreaNavLink {\n\tactive: boolean;\n\tname: string;\n\tlink: string;\n}\n\nconst getAreaNavi = (doc: IDocument): IAreaNavLink[] => {\n\tif (!isEmpty(doc) && !isEmpty(doc.areaNavi)) {\n\t\treturn doc.areaNavi;\n\t} else if (!isEmpty(doc) && !isEmpty(doc.page) && !isEmpty(doc.page.areaNavi)) {\n\t\treturn doc.page.areaNavi;\n\t} else {\n\t\treturn [];\n\t}\n};\n\ninterface IProps {\n\tdoc: IDocument;\n\tdata?: object;\n\tposition?: string;\n\tblue?: boolean;\n\t[key: string]: any;\n}\n\nconst AreaNavigation = (props: IProps) => {\n\tconst { blue, doc, data, ...rest } = props;\n\tconst areaNavi: IAreaNavLink[] = getAreaNavi(data || doc);\n\n\tuseEffect(() => {\n\t\tif (hasWindow) {\n\t\t\tdocument.body.classList.add(\"has-area-nav\");\n\n\t\t\treturn () => {\n\t\t\t\tdocument.body.classList.remove(\"has-area-nav\");\n\t\t\t};\n\t\t}\n\t}, []);\n\n\tif (isEmpty(areaNavi)) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{areaNavi.map(({ name, link, active }: IAreaNavLink, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{name}\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\n\t\t\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tdoc: state.document,\n});\n\nexport default connect(mapStateToProps)(AreaNavigation);\n","import styled, { css } from \"styled-components\";\nimport { color, boxShadow, fontFamily } from \"@utils/style-utils\";\n\nexport const Select = styled.div`\n\tdisplay: inline-block;\n\tposition: relative;\n\tz-index: 9;\n`;\n\nexport const SelectButton = styled.button`\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tborder-radius: 4px;\n\tcursor: pointer;\n\tfont-family: ${fontFamily.base};\n\tfont-size: 16px;\n\tmin-width: 205px;\n\tpadding: 11px 50px 11px 16px;\n\tposition: relative;\n\ttext-align: left;\n\n\tspan.icon {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tfont-size: 16px;\n\t\tdisplay: block;\n\t\tright: 16px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%) rotate(0deg);\n\n\t\tsvg {\n\t\t\tmax-width: 16px;\n\t\t}\n\t}\n\n\t${props =>\n\t\tprops.isOpen &&\n\t\tcss`\n\t\t\tspan {\n\t\t\t\ttransform: translateY(-50%) rotate(180deg);\n\t\t\t}\n\t\t`}\n`;\n\nexport const Selections = styled.div`\n\tborder: 1px solid ${color(\"grey\", 5)};\n\tbox-shadow: ${boxShadow.basic};\n\tleft: 0;\n\tmin-width: 205px;\n\tposition: absolute;\n\ttop: 100%;\n`;\n\nexport const Selection = styled.div`\n\tbackground: ${color(\"white\")};\n\tborder-bottom: 1px solid ${color(\"grey\", 6)};\n\tcursor: pointer;\n\tfont-size: 16px;\n\tpadding: 11px 16px;\n\ttransition: background-color 150ms;\n\n\t&:hover {\n\t\tbackground: ${color(\"grey\", 7)};\n\t}\n\n\t${props =>\n\t\tprops.active &&\n\t\tcss`\n\t\t\tbackground: ${color(\"greenBright\", 4)};\n\t\t\tpointer-events: none;\n\t\t`}\n`;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport useOnClickOutside from \"@hooks/use-click-outside\";\nimport { ISelection } from \"@utils/apartment-search/selections\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { SelectButton, Select, Selections, Selection } from \"./styles\";\n\ninterface IProps {\n\tnoSelectionsText?: string;\n\tselections: ISelection[];\n\tonSelection?: (e) => void;\n\tdefaultValue?: any;\n\t[key: string]: any;\n}\n\nconst HousetypeDropdown = ({\n\tnoSelectionsText = \"Valitse\",\n\tselections: selectables,\n\tonSelection = e => void 0,\n\tdefaultValue = null,\n\t...rest\n}: IProps) => {\n\tif (!selectables || selectables.length <= 0) {\n\t\treturn null;\n\t}\n\tconst [mounted, setMounted] = useState(false);\n\tconst [selections, setSelections] = useState([...selectables]);\n\tconst [selected, setSelected] = useState([]);\n\tconst [isOpen, setOpen] = useState(false);\n\tconst ref = useRef(null);\n\n\tuseOnClickOutside(ref, () => setOpen(false));\n\n\tuseEffect(() => {\n\t\tif (defaultValue) {\n\t\t\tfor (const i in selections) {\n\t\t\t\tif (selections[i].value === defaultValue) {\n\t\t\t\t\tselections[i].selected = true;\n\n\t\t\t\t\tsetSelected([selections[i]]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsetMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (typeof onSelection === \"function\" && mounted) {\n\t\t\tonSelection(selected);\n\t\t}\n\t}, [selected]);\n\n\tconst select = (selection: ISelection) => {\n\t\tif (selected[0] && selection.value === selected[0].value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sels = selections.map(s => {\n\t\t\treturn {\n\t\t\t\t...s,\n\t\t\t\tselected: s.value === selection.value,\n\t\t\t};\n\t\t});\n\n\t\tsetSelections([...sels]);\n\t\tsetSelected([{ ...selection, selected: true }]);\n\t\tsetOpen(false);\n\t};\n\n\tconst isActive = (selection: ISelection): boolean =>\n\t\tselected && selected[0] && selection.value === selected[0].value;\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default HousetypeDropdown;\n","import styled from \"styled-components\";\nimport { color, media, textStyles, ribbon, boxShadow, grid } from \"@utils/style-utils\";\n\nexport const FormWrapper = styled.div.attrs(() => ({\n\tclassName: \"contact-form form\",\n\tid: \"contactForm\",\n}))`\n\tbackground: ${color(\"white\")};\n\tborder: 1px solid ${color(\"grey\", 6)};\n\tborder-radius: 4px;\n\tbox-shadow: ${boxShadow.hugeLight};\n\toverflow: hidden;\n\tpadding: 50px 15px 30px;\n\tposition: relative;\n\n\t&::before {\n\t\t${ribbon}\n\t\tcontent: '';\n\t\theight: 6px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t}\n\n\t${media.md`\n\t\tpadding: 60px 32px 40px;\n\t`}\n\n\th4 {\n\t\t${textStyles.H3Condensed}\n\t\tmargin: 0 auto 24px;\n\t\ttext-align: center;\n\t}\n\n\t.placeholder-textarea {\n\t\tmargin-bottom: 28px;\n\t\tmargin-top: 16px;\n\t}\n\n\t.placeholder-text {\n\t\theight: 32px;\n\t\tmargin: 0 auto 24px;\n\t\twidth: 85%;\n\n\t\t${media.md`\n\t\t\tmargin: 0;\n\t\t\twidth: 56%;\n\t\t`}\n\t}\n\n\t.placeholder-button {\n\t\t${media.md`\n\t\t\tmargin-right: 0;\n\t\t`}\n\t}\n\n\ttextarea {\n\t\tmargin-bottom: 28px;\n\t}\n\n\tbutton {\n\t\tdisplay: block;\n\t\tmax-width: 312px;\n\t\tmargin: 0 auto;\n\t\twidth: 100%;\n\t}\n`;\n\nexport const FormContainer = styled.div.attrs(props => ({\n\tclassName: \"form-container\",\n}))`\n\tmargin: 0 auto;\n\tmax-width: 450px;\n\twidth: 100%;\n\n\t${media.md`\n\t\tmax-width: 662px;\n\t`}\n`;\n\nexport const FormColumns = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t${media.md`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t`}\n`;\n\nexport const FormColumn = styled.div`\n\tflex-basis: 100%;\n\n\ttextarea {\n\t\tmargin-top: 16px;\n\t}\n\n\t${media.md`\n\t\tflex-basis: calc((100% - ${grid.gutterSmall}px) / 2);\n\n\t\ttextarea,\n\t\t.placeholder-textarea {\n\t\t\theight: 100%;\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-top: 0;\n\t\t}\n\t`}\n\n\t${media.lg`\n\t\tflex-basis: calc((100% - ${grid.gutter}px) / 2);\n\t`}\n`;\n\nexport const FormFooter = styled.div.attrs(() => ({\n\tclassName: \"form-footer\",\n}))`\n\tdisplay: flex;\n\tflex-direction: column;\n\n\tbutton {\n\t\tmargin-top: 20px;\n\t}\n\t${media.md`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tpadding-top: 10px;\n\t\tmargin-top: 30px;\n\n\t\tbutton {\n\t\t\tmargin-right: 0;\n\t\t\tmargin-top: 0;\n\t\t\tmax-height: 48px;\n\t\t\tmax-width: 200px;\n\t\t}\n\t`}\n`;\n\nexport const FormButtonInfo = styled.div`\n\tpadding-top: 20px;\n`;\n\nexport const FormDisclaimer = styled.div`\n\t${textStyles.MicroText}\n\tcolor: ${color(\"grey\", 3)};\n\tletter-spacing: normal;\n\tmargin: 6px auto 24px;\n\tmax-width: 361px;\n\ttext-align: center;\n\talign-items: center;\n\tdisplay: flex;\n\tpadding-bottom: 20px;\n\n\t${media.md`\n\t\tmargin: 0;\n\t\ttext-align: left;\n\t`}\n\n\ta {\n\t\tcolor: ${color(\"greenDark\", 1)};\n\t\tdisplay: block;\n\t\tmargin-top: 5px;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\n\t\t${media.md`\n\t\t\tdisplay: inline;\n\t\t\tmargin-top: 0;\n\t\t\ttext-align: left;\n\t\t`}\n\n\t\t.is-pointer & {\n\t\t\t&:hover {\n\t\t\t\tcolor: ${color(\"greenDark\", 2)};\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n`;\n","import React, { lazy, Suspense, useState, useEffect } from \"react\";\nimport {\n\tInputGroup,\n\tFormError,\n\tTextarea,\n\tThankYouMessage,\n\tPlaceholder,\n\tPlaceholderButton,\n\tPlaceholderInput,\n\tPlaceholderTextarea,\n\tPlaceholderText,\n} from \"@components/Form/form-styles\";\nimport contactService from \"@services/contact.service\";\nimport { hasWindow } from \"@utils\";\nimport { getSchema } from \"@utils/validators\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\nimport { Link } from \"react-router-dom\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tFormWrapper,\n\tFormContainer,\n\tFormDisclaimer,\n\tFormColumns,\n\tFormColumn,\n\tFormFooter,\n\tFormButtonInfo,\n} from \"./styles\";\n\nconst Formik = lazy(() => import(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.Formik })));\nconst ErrorMessage = lazy(() =>\n\timport(/* webpackPrefetch:true */ \"formik\").then(module => ({ default: module.ErrorMessage }))\n);\n\nconst validationSchema = getSchema([\"agent\", \"name\", \"email\", \"phone\", \"postCode\", \"message\"]);\n\nconst FormPlaceholder = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst ContactFormLarge = ({\n\tbuttonText = \"Lähetä\",\n\tbuttonInfo = \"\",\n\tchildren = null,\n\tsubjectIndex = 1,\n\tagent = null,\n}) => {\n\tconst initialValues = {\n\t\temail: \"\",\n\t\tmessage: \"\",\n\t\tname: \"\",\n\t\tphone: \"\",\n\t\tpostCode: \"\",\n\t};\n\n\tlet contactSubmitTimeout: number;\n\tconst [isSubmitted, setSubmitted] = useState(false);\n\n\tconst doSubmit = async (values, { setSubmitting, resetForm }) => {\n\t\tsetSubmitting(true);\n\n\t\tconst submitUrl = location.href;\n\n\t\tconst formData = {\n\t\t\tagent: agent ? agent.key : null,\n\t\t\tsubjectIndex,\n\t\t\tsubmitUrl,\n\t\t\t...values,\n\t\t};\n\n\t\ttry {\n\t\t\tconst res = await contactService.doBasicContact(formData);\n\t\t\tconsole.log(\"successful form submit\", res);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(true);\n\n\t\t\tif (hasWindow) {\n\t\t\t\tcontactSubmitTimeout = window.setTimeout(() => {\n\t\t\t\t\tsetSubmitted(false);\n\t\t\t\t\tresetForm(initialValues);\n\t\t\t\t}, 6000);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"error while sending form..\", e);\n\t\t\tsetSubmitting(false);\n\t\t\tsetSubmitted(false);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t/* clear the reset timeout before component unmounts */\n\t\t\tif (contactSubmitTimeout) {\n\t\t\t\tclearTimeout(contactSubmitTimeout);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{!children &&

Ota yhteyttä

}\n\t\t\t\t{children &&
{children}
}\n\t\t\t\t{!hasWindow && }\n\t\t\t\t{hasWindow && (\n\t\t\t\t\t}>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{({ values, handleChange, handleBlur, handleSubmit, isSubmitting }) => (\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{msg => {msg}}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t{!isSubmitted && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\tVälitämme yhteydenottopyynnön postinumeron perusteella lähimpään\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyymäläämme. \n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tTietosuojaseloste\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{buttonInfo && {buttonInfo}}\n\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{isSubmitted && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tKiitos yhteydenotosta!\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t
\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)}\n\t\t\t
\n\t\t
\n\t);\n};\n\nexport default ContactFormLarge;\n","import styled, { keyframes } from \"styled-components\";\nimport { boxShadow, buttons, color, media, ribbon } from \"@utils/style-utils\";\n\nexport const SearchPageWrapper = styled.div`\n\tpadding-top: 56px;\n\n\t${media.xsm`\n\t\tpadding-top: 65px;\n\t`};\n\n\t.container-loading {\n\t\t// add min-height during loading so that footer does not suddenly move thousands of pixels, making Google angry\n\t\tmin-height: 10830px; // 30 times 361px\n\n\t\t${media.sm`\n\t\t\tmin-height: 5250px; // 30 times 175px\n\t\t`};\n\t\t${media.md`\n\t\t\tmin-height: 8370px; // 30 times 279px\n\t\t`};\n\t\t${media.lg`\n\t\t\tmin-height: 6300px; // 30 times 210px\n\t\t`};\n\t}\n`;\n\nconst spinHouse = keyframes`\n\t0%, 100% {\n\t\ttransform: scale(1);\n\t}\n\t50% {\n\t\ttransform: scale(0.8);\n\t}\n`;\n\nconst enterLoader = keyframes`\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translate(-50%, -50%) scale(0.8);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t}\n`;\n\nexport const SearchLoader = styled.div`\n\tanimation: ${enterLoader} 200ms linear forwards;\n\talign-items: center;\n\tbackground: ${color(\"white\")};\n\tborder-radius: 50%;\n\tbox-shadow: ${boxShadow.wide};\n\tcolor: ${color(\"greenBright\", 1)};\n\tdisplay: flex;\n\tfont-size: 60px;\n\theight: 180px;\n\tjustify-content: center;\n\tleft: 50%;\n\topacity: 0;\n\tperspective: 1000px;\n\tposition: fixed;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n\twidth: 180px;\n\tz-index: 99;\n\n\t&::before {\n\t\tcontent: \"Ladataan\";\n\t\tdisplay: block;\n\t\tfont-size: 16px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\tbottom: 46px;\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t}\n\n\tsvg {\n\t\tanimation: ${spinHouse} 900ms linear infinite;\n\t\tmargin-bottom: 20px;\n\t\tmax-width: 60px;\n\t}\n`;\n\nexport const ResultsHeader = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-top: 56px;\n\tmargin-bottom: 15px;\n\t&.searched {\n\t\tmargin-bottom: 5px;\n\t}\n\n\t${media.lg`\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tmargin-bottom: 65px;\n\t\t&.searched {\n\t\t\tmargin-bottom: 5px;\n\t\t}\n\t`}\n\n\t.description {\n\t\tflex-basis: 100%;\n\t\tmargin-bottom: 15px;\n\n\t\t${media.lg`\n\t\t\tflex-basis: calc(100% - 240px - 40px);\n\t\t\tmargin-bottom: 0;\n\t\t\tmax-width: 1013px;\n\t\t`}\n\t}\n`;\n\nexport const SortContainer = styled.div`\n\talign-items: flex-end;\n\tdisplay: flex;\n\tflex-basis: 100%;\n\tjustify-content: flex-end;\n\n\t${media.lg`\n\t\tflex-basis: 240px;\n\t\tpadding-left: 20px;\n\t`}\n\n\t.sort-select {\n\t\twidth: 100%;\n\n\t\t${media.smd`\n\t\t\tmax-width: 260px;\n\t\t`}\n\n\t\t${media.lg`\n\t\t\tmargin-bottom: 38px;\n\t\t`}\n\n\t\tbutton {\n\t\t\twidth: 100%;\n\t\t}\n\t}\n`;\n\nexport const ApartmentsWrapper = styled.div`\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\t> div {\n\t\t/* flex-grow: 1; */\n\t\tmargin-bottom: 20px;\n\t\twidth: 100%;\n\n\t\t@media (min-width: 992px) {\n\t\t\twidth: calc((100% - 40px) / 2);\n\n\t\t\t&:nth-of-type(odd) {\n\t\t\t\tmargin-right: 20px;\n\t\t\t}\n\t\t\t&:nth-of-type(even) {\n\t\t\t\tmargin-left: 20px;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const LoadMore = styled.div`\n\tmargin: 80px auto 30px;\n\ttext-align: center;\n\n\tbutton {\n\t\t${buttons.textLinkPrimary}\n\t}\n`;\n\nexport const SearchPageContactArea = styled.div`\n\tbackground-color: ${color(\"beige\", 4)};\n\tbackground-image: url(\"/assets/images/brand-identity/graphics/form-bg-pattern-beige@2x.png\");\n\tbackground-position: calc(50% + 2px) calc(100% - 125px);\n\tbackground-repeat: no-repeat;\n\tbackground-size: 1809px auto;\n\tmargin-top: 40px;\n\tposition: relative;\n\n\t&:after {\n\t\tbackground: ${color(\"white\")};\n\t\tbottom: 0;\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 125px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t}\n`;\n\nexport const SearchPageContactTitle = styled.h3`\n\ttext-align: center;\n`;\n\nexport const SearchPageContactIngress = styled.div`\n\tmargin: 25px auto 40px;\n\ttext-align: center;\n`;\n\nexport const ContactFormContainer = styled.div`\n\tmax-width: 896px;\n\tbox-shadow: ${boxShadow.hugeLight};\n\tmargin: 86px auto 56px;\n\tposition: relative;\n\tz-index: 3;\n\n\t&::before {\n\t\t${ribbon};\n\t\tcontent: '';\n\t\theight: 6px;\n\t\tleft: 0;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t}\n`;\n","import styled from \"styled-components\";\nimport { color } from \"@utils/style-utils\";\n\nexport const Select = styled.div`\n\tcolor: ${color(\"grey\", 1)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tfont-size: 16px;\n\theight: 100%;\n\tjustify-content: center;\n\tmargin-right: 24px;\n\tposition: relative;\n\tz-index: 10;\n`;\n\nexport const Selected = styled.div`\n\tcursor: pointer;\n\n\tspan {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t\tdisplay: inline-block;\n\t\tfont-size: 14px;\n\t\tmargin-left: 4px;\n\t\tvertical-align: center;\n\n\t\tsvg {\n\t\t\tmax-width: 9px;\n\t\t}\n\t}\n`;\n\nexport const Selections = styled.div`\n\tbackground: ${color(\"white\")};\n\tbox-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n\tleft: -24px;\n\tposition: absolute;\n\ttop: 100%;\n\tz-index: 9;\n\n\t@media (max-width: 1800px) {\n\t\ttop: calc(100% + 5px);\n\t}\n\n\t&::before {\n\t\tbackground: ${color(\"grey\", 5)};\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 1px;\n\t\tleft: 24px;\n\t\tposition: absolute;\n\t\tright: 19px;\n\t\ttop: 0;\n\t}\n`;\n\nexport const Selection = styled.div`\n\tbackground: ${color(\"white\")};\n\tcursor: pointer;\n\tpadding: 22px 30px 22px 24px;\n\ttransition: background-color 150ms;\n\n\t&:hover {\n\t\tbackground: ${color(\"grey\", 7)};\n\t}\n`;\n","import React, { useRef, useState, RefObject } from \"react\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { Select, Selected, Selections, Selection } from \"./styles\";\nimport useOnClickOutside from \"@hooks/use-click-outside\";\nimport { useSelector } from \"react-redux\";\nimport { getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\n\ninterface IProps {\n\tonSelect?: (state?: boolean) => void;\n\t[key: string]: any;\n}\n\nconst SaleRentSelect = (props: IProps) => {\n\tconst ref: RefObject = useRef(null);\n\tconst { rental } = useSelector(getApartmentSearch);\n\tconst [isOpen, setOpen] = useState(false);\n\n\tuseOnClickOutside(ref, () => setOpen(false));\n\n\tconst toggle = () => {\n\t\tsetOpen(!isOpen);\n\n\t\tif (props.onSelect) {\n\t\t\tprops.onSelect(!rental);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t);\n};\n\nexport default SaleRentSelect;\n","import styled from 'styled-components';\nimport { color, lineHeight } from '@utils/style-utils';\nimport { BaseButton } from '@components/Buttons';\n\nexport const MPSearch = styled.div`\n\tbackground: ${ color('grey', 7) };\n\tpadding: 32px 24px;\n`\n\nexport const Title = styled.h4`\n\tcolor: ${ color('greenDark', 2) };\n\tfont-size: 13px;\n\tfont-weight: bold;\n\tletter-spacing: 0.03em;\n\tline-height: ${ lineHeight(13, 18) };\n\tmargin: 0 0 12px;\n\ttext-transform: uppercase;\n`\n\nexport const Description = styled.p`\n\tcolor: ${ color('grey', 2) };\n\tfont-size: 14px;\n\tline-height: ${ lineHeight(14, 18) };\n\tmargin-bottom: 20px;\n`\n\nexport const InputGroup = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tmargin-bottom: 24px;\n\n\t&:last-of-type {\n\t\tmargin-bottom: 38px;\n\t}\n\n\tinput {\n\t\twidth: 106px;\n\n\t\t+ label {\n\t\t\tmargin-left: 12px;\n\t\t}\n\t}\n`\n\nexport const InputGroupTitle = styled.h5`\n\tcolor: ${ color('grey', 1) };\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tline-height: ${ lineHeight(14, 18) };\n\tmargin: 0 0 6px;\n\twidth: 100%;\n\n\tlabel + span {\n\t\tmargin-left: 30px;\n\t}\n`\n\nexport const MPSubmit = styled(BaseButton)`\n\tbackground: transparent;\n\tborder: 0;\n\tborder-width: 0 !important;\n\tcolor: ${ color('greenBright', 1) };\n\tfont-size: 16px;\n\tfont-weight: bold;\n\tletter-spacing: 0.07em;\n\tpadding: 0;\n\ttext-transform: uppercase;\n\n\t&:hover {\n\t\tcolor: ${ color('greenBasic', 2) };\n\t}\n`","import styled from \"styled-components\";\nimport { color, fontFamily, media, textStyles, buttons } from \"@utils/style-utils\";\nimport { BaseButton } from \"@components/Buttons\";\nimport { DdSelectToggle } from \"@components/DropdownSelect/styles\";\n\nconst maxFitBreakpoint = \"1380px\";\n\nexport const SearchBar = styled.div`\n\tbackground: ${color(\"white\")};\n\tflex-wrap: wrap;\n\tposition: sticky;\n\tleft: 0;\n\ttop: 0;\n\ttransform: translateY(0px);\n\ttransition: transform 200ms ease-in-out;\n\twidth: 100%;\n\tz-index: 99;\n\n\t.search-open & {\n\t\t@media (max-width: ${maxFitBreakpoint}) {\n\t\t\ttransform: none !important;\n\t\t\tz-index: 150;\n\t\t}\n\t}\n\n\t.price-type {\n\t\tmargin: 6px 0;\n\t}\n\n\t${media.smd`\n\n\t\t.header-pinned & {\n\t\t\ttransform: translateY(64px);\n\t\t}\n\n\t\t.header-transparent.header-pinned & {\n\t\t\ttransform: translateY(calc(var(--sc, 65) * 1px));\n\t\t\ttransition: transform 100ms;\n\t\t}\n\n\t\t.price-type {\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 24px;\n\t\t\tmargin-top: 0;\n\t\t}\n\t`};\n\n\t.dropdown-select {\n\t\tmargin: 0 8px;\n\n\t\t&#extra-select .dropdown-select-content {\n\t\t\t@media (min-width: ${maxFitBreakpoint}) and (max-width: 1480px) {\n\t\t\t\tleft: -100px;\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: ${maxFitBreakpoint}) {\n\t\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\t\tdisplay: flex;\n\t\t\tmargin: 0;\n\t\t\tpadding-bottom: 10px;\n\t\t\twidth: 100%;\n\n\t\t\t> button,\n\t\t\t.monthly-payment {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.dropdown-select-content {\n\t\t\t\tbox-shadow: none;\n\t\t\t\tdisplay: flex !important;\n\t\t\t\tflex-direction: column;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 100% !important;\n\n\t\t\t\t> p {\n\t\t\t\t\tflex: 1 0 auto;\n\t\t\t\t}\n\n\t\t\t\t> div {\n\t\t\t\t\tflex: 3 0 auto;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&#extra-select .dropdown-select-content {\n\t\t\t\tflex-direction: column;\n\n\t\t\t\t> div {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex: 1 0 auto;\n\t\t\t\t\tflex-wrap: wrap;\n\n\t\t\t\t\t> p {\n\t\t\t\t\t\tflex: 1 0 100%;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\tflex: 3 0 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t${media.smd`\n\t\t\t\t.dropdown-select-content {\n\t\t\t\t\tflex-direction: row;\n\n\t\t\t\t\t> p {\n\t\t\t\t\t\tflex: 1 0 30%;\n\t\t\t\t\t}\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\tflex: 3 0 70%;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&#extra-select .dropdown-select-content {\n\n\t\t\t\t\t> div {\n\t\t\t\t\t\tflex: 1 0 auto;\n\t\t\t\t\t\tdisplay: flex;\n\n\t\t\t\t\t\t> p {\n\t\t\t\t\t\t\tflex: 1 0 30%;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t> div {\n\t\t\t\t\t\t\tflex: 3 0 70%;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t`};\n\t\t}\n\t}\n\n\t.small-title {\n\t\tdisplay: block;\n\t\tfont-size: xx-small;\n\t\tline-height: 0;\n\t}\n\t#area-select {\n\t\tbutton {\n\t\t\tpadding: 10px;\n\t\t}\n\t\t.multi-button-select {\n\t\t\tmargin-bottom: 10px;\n\t\t}\n\t}\n\n\t.search-input {\n\t\tmargin: 6px 0;\n\t\twidth: 100%;\n\n\t\t${media.smd`\n\t\t\tmargin-bottom: 0;\n\t\t\tmargin-right: 8px;\n\t\t\tmargin-top: 0;\n\t\t\twidth: unset;\n\t\t`};\n\n\t\t.form-group--search {\n\t\t\t.form-input {\n\t\t\t\twidth: 100%;\n\n\t\t\t\t${media.smd`\n\t\t\t\t\twidth: 306px;\n\t\t\t\t`};\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const SearchBarSection = styled.div`\n\talign-items: flex-start;\n\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\tborder-top: 1px solid ${color(\"grey\", 5)};\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 15px;\n\tflex-grow: 1;\n\tmargin-top: -1px;\n\n\t${media.smd`\n\t\talign-items: center;\n\t\tflex-direction: row;\n\t\tpadding: 5px 24px;\n\n\t\t&:first-of-type {\n\t\t\tpadding-right: 0;\n\t\t}\n\t`}\n\n\t&:last-of-type {\n\t\tflex: 1000 1 0;\n\t}\n\n\tspan.spacer {\n\t\tflex-grow: 1;\n\t}\n\n\t@media (max-width: ${maxFitBreakpoint}) {\n\t\tflex: 1 0 100%;\n\t\twidth: 100%;\n\n\t\t&:last-of-type {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n\nexport const SearchBarContent = styled.div`\n\tbackground: ${color(\"white\")};\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: wrap;\n\theight: 100%;\n\tpadding: 0;\n\twidth: 100%;\n\n\t${media.smd`\n\t\tflex-direction: row;\n\t`}\n`;\n\nexport const ExtraSection = styled.div`\n\tpadding: 16px 0;\n\n\t&:first-of-type {\n\t\tpadding-top: 0;\n\t}\n\n\t&.new-construction, &.area-type-select, &.value-listing {\n\t\t.multi-button-select {\n\t\t\t@media (max-width: 450px) {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\t\t}\n\n\t\t.selection-button {\n\t\t\twidth: 50%;\n\n\t\t\t&:last-of-type {\n\t\t\t\tmargin-left: -1px;\n\t\t\t\twidth: calc(50% + 1px);\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const SelectionTitle = styled.p`\n\tcolor: ${color(\"grey\", 1)};\n\tfont-size: 17px;\n\tfont-style: normal;\n\tfont-weight: 500;\n\tline-height: normal;\n\tmargin: 0 0 8px;\n`;\n\nexport const Actions = styled.div`\n\talign-items: center;\n\tdisplay: ${props => (props.mobile ? \"none\" : \"flex\")};\n\tflex-direction: column;\n\tflex-grow: 1;\n\tmin-width: 611px;\n\n\t> span {\n\t\tdisplay: none;\n\t}\n\n\t${media.smd`\n\t\tflex-direction: row;\n\n\t\t> span {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t`};\n\n\t@media (max-width: ${maxFitBreakpoint}) {\n\t\tbackground: ${color(\"white\")};\n\t\tborder-top: 1px solid ${color(\"grey\", 5)};\n\t\tbottom: 0;\n\t\tdisplay: ${props => (props.mobile ? \"flex\" : \"none\")};\n\t\tmin-width: 0;\n\t\tpadding: 20px;\n\t\tposition: fixed;\n\t\twidth: 100%;\n\t\tz-index: 99;\n\n\t\t&.mobile-extras {\n\t\t\tdisplay: flex;\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t\tz-index: 200;\n\n\t\t\t&.is-open {\n\t\t\t\topacity: 1;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\t@media (max-width: 767px) {\n\t\t\t\t.show-results-button {\n\t\t\t\t\tfont-size: 16px;\n\t\t\t\t\tmin-height: 47px;\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t&.is-loading {\n\t\t\t\t\t\twidth: 100% !important;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (min-width: 650px) {\n\t\t\t\t.show-results-button {\n\t\t\t\t\tmargin-left: auto;\n\t\t\t\t\tmax-width: 270px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 649px) {\n\t\t\t\ta {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const ActionButton = styled(BaseButton)`\n\tbackground: rgba(255, 255, 255, 0);\n\tborder: 0;\n\tcolor: ${({ light }) => (light ? color(\"grey\", 2) : color(\"greenDark\", 1))};\n\tfont-family: ${fontFamily.condensed};\n\tfont-size: 15px;\n\tmargin: 8px 2px;\n\tpadding: 3px 4px 2px;\n\n\t/* search related buttons inside searchwrapper (mobile) */\n\t&.historybutton {\n\t\tdisplay: none;\n\t}\n\n\t${media.smd`\n\t\tmargin: 0 2px;\n\n\t\t&.historybutton {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t`};\n\n\t&.hidden {\n\t\tdisplay: none;\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t\tvisibility: hidden;\n\n\t\t+ .divider-dash {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t&:first-of-type {\n\t\tmargin-left: -4px;\n\t}\n`;\n\nexport const KeySearch = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: flex-end;\n\tposition: relative;\n\n\tinput {\n\t\tbackground: ${color(\"white\")} !important;\n\t\tfont-family: ${fontFamily.condensed};\n\t\tpadding-right: 30px;\n\t\twidth: 186px;\n\t}\n\n\tbutton {\n\t\tbackground: ${color(\"white\")};\n\t}\n\n\t&.key-search-dt {\n\t\t@media (max-width: 1380px) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t&.key-search-mobile {\n\t\tbackground: ${color(\"grey\", 7)};\n\t\tborder-bottom: 1px solid ${color(\"grey\", 5)};\n\t\tdisplay: none;\n\t\tmargin-top: -7px;\n\t\tpadding: 16px;\n\n\t\t${media.sm`\n\t\t\tpadding: 16px 24px;\n\t\t`};\n\n\t\tspan {\n\t\t\t${textStyles.TextLinkSecondary}\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-right: 12px;\n\n\t\t\t@media (max-width: 373px) {\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\t\t}\n\n\t\tform {\n\t\t\tborder: 0;\n\t\t\theight: 32px;\n\t\t\toverflow: visible;\n\n\t\t\t.form-group {\n\t\t\t\tborder: 1px solid ${color(\"grey\", 5)};\n\t\t\t\tmax-width: 150px;\n\n\t\t\t\t${media.sm`\n\t\t\t\t\tmax-width: 160px;\n\t\t\t\t`};\n\n\t\t\t\tinput {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbutton {\n\t\t\tbackground: transparent;\n\t\t\tcolor: ${color(\"greenBright\", 1)};\n\t\t\tmargin-left: 12px;\n\t\t\ttext-transform: uppercase;\n\t\t\twidth: auto;\n\n\t\t\t${buttons.textLinkPrimary}\n\n\t\t\t&::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t@media (max-width: ${maxFitBreakpoint}) {\n\t\t\tdisplay: flex;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n`;\n\nexport const DividerDash = styled.span`\n\tbackground: ${({ light }) => (light ? color(\"grey\", 5) : color(\"grey\", 1))};\n\tdisplay: inline-block;\n\theight: ${({ vertical }) => (vertical ? 24 : 1)}px;\n\tmargin: 0 12px;\n\twidth: ${({ vertical }) => (vertical ? 1 : 8)}px;\n`;\n\n/* Options specific styles */\n\nexport const OptionWithTextInputs = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\n\tinput {\n\t\twidth: 80px;\n\n\t\t+ label {\n\t\t\tmargin-left: 12px;\n\t\t}\n\t}\n`;\n\nexport const Price = styled(OptionWithTextInputs)``;\n\nexport const Area = styled(OptionWithTextInputs)``;\n\nexport const BuildYear = styled(OptionWithTextInputs)``;\n\nexport const Condition = styled.div`\n\t.multi-button-select {\n\t\tdisplay: flex;\n\t}\n\n\t.selection-button {\n\t\tflex-grow: 1;\n\t\tpadding-left: 12px;\n\t\tpadding-right: 12px;\n\n\t\t& + .selection-button {\n\t\t\tmargin-left: -1px;\n\t\t}\n\t}\n\n\t&:first-of-type {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t&:last-of-type {\n\t\tdisplay: none;\n\t}\n\n\t@media (max-width: ${maxFitBreakpoint}) {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\n\t\t> p {\n\t\t\tflex: 1 0 100%;\n\t\t}\n\n\t\t> div {\n\t\t\tflex: 3 0 100%;\n\t\t}\n\n\t\t&:first-of-type {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t${media.smd`\n\t\t\tflex-direction: row;\n\n\t\t\t> p {\n\t\t\t\tflex: 1 0 30%;\n\t\t\t}\n\n\t\t\t> div {\n\t\t\t\tflex: 3 0 70%;\n\t\t\t}\n\t\t`};\n\t}\n`;\n\nexport const SelectionsWrapper = styled.div`\n\tdisplay: inline-flex;\n\tpadding-bottom: 7px;\n\tpadding-top: 7px;\n\n\t@media (max-width: ${maxFitBreakpoint}) {\n\t\tbackground: ${color(\"white\")};\n\t\tbackface-visibility: hidden;\n\t\t/* display: ${props => (props.isOpen ? \"block\" : \"none\")}; */\n\t\tdisplay: block;\n\t\topacity: ${props => (props.isOpen ? \"1\" : \"0\")};\n\t\tpointer-events: ${props => (props.isOpen ? \"auto\" : \"none\")};\n\t\theight: 100vh;\n\t\theight: calc(var(--vh, 1vh) * 100);\n\t\tleft: 0;\n\t\toverflow-y: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\toverscroll-behavior: none;\n\t\tpadding-bottom: 88px;\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t\tz-index: 999;\n\n\t\t.mobile-extras {\n\t\t\tposition: fixed;\n\t\t\tbackface-visibility: hidden;\n\t\t}\n\t}\n`;\n\nexport const ExtrasToggle = styled(DdSelectToggle)`\n\tdisplay: none;\n\ttext-align: left;\n\twidth: 100%;\n\n\t@media (max-width: ${maxFitBreakpoint}) {\n\t\tdisplay: inline-block;\n\t}\n\n\t${media.smd`\n\t\twidth: unset;\n\t`};\n\n\t&.has-selections {\n\t\tborder-color: ${color(\"greenBright\", 1)};\n\t}\n\n\t&.with-icon {\n\t\tdisplay: none;\n\t\tjustify-content: space-between;\n\n\t\t@media (max-width: ${maxFitBreakpoint}) {\n\t\t\tdisplay: inline-flex;\n\t\t}\n\n\t\tspan {\n\t\t\tcolor: ${color(\"grey\", 4)};\n\t\t\tdisplay: inline-block;\n\t\t\tfont-size: 14px;\n\t\t\tmargin-right: 2px;\n\n\t\t\t@media (min-width: 650px) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tmax-width: 14px;\n\t\t\t}\n\t\t}\n\t}\n`;\n\nexport const HistoryButtonContainer = styled.div`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\n\t> ${ActionButton} {\n\t\tmargin: 14px 16px;\n\t}\n\n\t${media.smd`\n\t\tdisplay: none;\n\t`};\n`;\n","import styled, { css } from 'styled-components';\nimport { color } from '@utils/style-utils';\n\nexport const TooltipContainer = styled.span`\n\tcursor: pointer;\n\tdisplay: inline-block;\n\tposition: relative;\n\tz-index: 3;\n`\n\nexport const TooltipIcon = styled.span`\n\tcolor: ${ color('greenBright', 1) };\n\tcursor: pointer;\n\tdisplay: inline-block;\n\tpadding: 3px;\n\n\tsvg {\n\t\tmax-width: 14px;\n\t}\n`\n\nconst getTooltipStyle = (direction) => {\n\tswitch (direction) {\n\t\tcase 'left':\n\t\t\treturn css`\n\t\t\t\tright: calc(100% + 6px);\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\n\t\t\t\t&::after {\n\t\t\t\t\tleft: calc(100% - 6px);\n\t\t\t\t\ttop: 50%;\n\t\t\t\t\ttransform: translateY(-50%) rotate(45deg);\n\t\t\t\t}\n\t\t\t`\n\t\tcase 'right':\n\t\t\treturn css`\n\t\t\t\tleft: calc(100% + 6px);\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\n\t\t\t\t&::after {\n\t\t\t\t\tright: calc(100% - 6px);\n\t\t\t\t\ttop: 50%;\n\t\t\t\t\ttransform: translateY(-50%) rotate(45deg);\n\t\t\t\t}\n\t\t\t`\n\t\tcase 'top':\n\t\t\treturn css`\n\t\t\t\tbottom: calc(100% + 6px);\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX(-50%);\n\n\t\t\t\t&::after {\n\t\t\t\t\tbox-shadow: 4px 4px 4px rgba(0,0,0,0.1);\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\ttop: calc(100% - 6px);\n\t\t\t\t\ttransform: translateX(-50%) rotate(45deg);\n\t\t\t\t}\n\t\t\t`\n\n\t\tcase 'bottom':\n\t\t\treturn css`\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(100% + 6px);\n\t\t\t\ttransform: translateX(-50%);\n\n\t\t\t\t&::after {\n\t\t\t\t\tbottom: calc(100% - 6px);\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\ttransform: translateX(-50%) rotate(45deg);\n\t\t\t\t}\n\t\t\t`\n\n\t\tdefault:\n\t\t\treturn css`\n\t\t\t\tbottom: calc(100% + 6px);\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX(-50%);\n\n\t\t\t\t&::after {\n\t\t\t\t\tbox-shadow: 4px 4px 4px rgba(0,0,0,0.1);\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\ttop: calc(100% - 6px);\n\t\t\t\t\ttransform: translateX(-50%) rotate(45deg);\n\t\t\t\t}\n\t\t\t`\n\t}\n}\n\nexport const TooltipContent = styled.div`\n\tbackground: ${ props => props.light ? color('white') : color('grey', 7) };\n\tborder-radius: 4px;\n\tbox-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n\tfont-size: 13px;\n\tmax-width: ${ props => props.width ? props.width : 200 }px;\n\tpadding: 10px;\n\tposition: absolute;\n width: 100vw;\n\tz-index: 3;\n\n\t&::after {\n\t\tbackground: ${ color('grey', 7) };\n\t\tcontent: '';\n\t\tdisplay: block;\n\t\theight: 12px;\n\t\tpointer-events: none;\n\t\tposition: absolute;\n\t\ttransform: rotate(45deg);\n\t\twidth: 12px;\n\t}\n\n\t${ props => props.light && css`\n\t\t&::after {\n\t\t\tbackground: ${ color('white') };\n\t\t}\n\t`}\n\n\t${ props => props.position && getTooltipStyle(props.position) };\n`","import React, { useState, useRef } from \"react\";\nimport useOnClickOutside from \"@hooks/use-click-outside\";\nimport useHover from \"@hooks/use-hover\";\n\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\n\nimport { TooltipContainer, TooltipIcon, TooltipContent } from \"./styles\";\n\ninterface IProps {\n\tcontent: string;\n\tposition?: string;\n\tonHover?: boolean;\n\twidth?: number;\n}\n\nconst Tooltip = (props: IProps) => {\n\tconst { content, position = \"top\", onHover = false, width } = props;\n\tconst ref = useRef(null);\n\tconst [isOpen, setOpen] = useState(false);\n\tconst [hoverRef, isHovered] = useHover();\n\n\tuseOnClickOutside(ref, () => setOpen(false));\n\n\treturn (\n\t\t\n\t\t\t !onHover && setOpen(!isOpen)}>\n\t\t\t\t\n\t\t\t\n\t\t\t{(isOpen || (onHover && isHovered)) && (\n\t\t\t\t\n\t\t\t\t\t{content}\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default Tooltip;\n","import { useRef, useState, useEffect } from 'react';\n\n// Usage\n/* function App() {\n const [hoverRef, isHovered] = useHover();\n\n\treturn (\n\t\t
\n\t\t\t{ isHovered ? 'hoveriii' : '️hoverit pois' }\n\t\t
\n\t);\n} */\n\n// Hook\nexport default function useHover() {\n\tconst [value, setValue] = useState(false);\n\n\tconst ref = useRef(null);\n\n\tconst handleMouseOver = () => setValue(true);\n\tconst handleMouseOut = () => setValue(false);\n\n\tuseEffect(() => {\n\t\t\tconst node = ref.current;\n\t\t\tif (node) {\n\t\t\t\tnode.addEventListener('mouseover', handleMouseOver);\n\t\t\t\tnode.addEventListener('mouseout', handleMouseOut);\n\t\t\t\tnode.addEventListener('touchstart', handleMouseOver);\n\t\t\t\tnode.addEventListener('touchend', handleMouseOut);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tnode.removeEventListener('mouseover', handleMouseOver);\n\t\t\t\t\tnode.removeEventListener('mouseout', handleMouseOut);\n\t\t\t\t\tnode.removeEventListener('touchstart', handleMouseOver);\n\t\t\t\t\tnode.removeEventListener('touchend', handleMouseOut);\n\t\t\t\t};\n\t\t\t}\n\t\t}, [ref.current], // Recall only if ref changes\n\t);\n\n\treturn [ref, value];\n}","import React, { useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { MPSearch, Title, Description, InputGroup, InputGroupTitle, MPSubmit } from \"./styles\";\nimport TextInput from \"@components/Form/TextInput\";\nimport { DividerDash } from \"@components/Search/ApartmentSearchBar/styles\";\nimport Tooltip from \"@components/Tooltip\";\nimport useLocalStorage from \"@hooks/use-localstorage\";\nimport { sagaAddConstraint } from \"@redux/apartment-search/apartment-search.actions\";\n\ninterface IProps {\n\ttitle?: string;\n\t[key: string]: any;\n}\n\ninterface IMonthlyPaymentValues {\n\tinterest?: string;\n\tmaxPrice?: string;\n\tminPrice?: string;\n\tsavings?: string;\n\ttime?: string;\n}\n\nconst getSuitablePriceRange = (values: IMonthlyPaymentValues) => {\n\tconst parsedValues: IMonthlyPaymentValues = {};\n\n\tfor (const key in values) {\n\t\tif (key) {\n\t\t\tparsedValues[key] = values[key].toString();\n\t\t}\n\t}\n\n\tconst { interest, maxPrice, minPrice, savings: ownSavings, time } = parsedValues;\n\n\t/* Pretty much copy-pasted from the old one */\n\tconst min = parseInt(minPrice, 10) || 0;\n\tlet max = maxPrice ? parseInt(maxPrice, 10) : undefined;\n\tmax = max < min ? undefined : max;\n\n\tconst savings = parseInt(ownSavings, 10) || 0;\n\tconst series = parseInt(time, 10) * 12;\n\n\tconst a = parseFloat(interest.replace(/[,]/, \".\")) / 1200;\n\tconst b = Math.pow(1 + a, series);\n\tconst c = Math.pow(1 + a, series) - 1;\n\tconst multiplier = (a * b) / c;\n\n\tconst minHousePrice = Math.round((min / multiplier + savings) / 1000) * 1000;\n\tlet maxHousePrice = null;\n\n\tif (min < max) {\n\t\tmaxHousePrice = Math.round((max / multiplier + savings) / 1000) * 1000;\n\t}\n\n\treturn { minHousePrice, maxHousePrice };\n};\n\nconst getSuitablePriceRangeText = values => {\n\tconst { minHousePrice, maxHousePrice } = values;\n\n\tif (!minHousePrice && !maxHousePrice) {\n\t\treturn null;\n\t}\n\n\tif (!minHousePrice && maxHousePrice) {\n\t\treturn `0 € – ${maxHousePrice}`;\n\t}\n\n\tif (minHousePrice && !maxHousePrice) {\n\t\treturn `${minHousePrice} € –`;\n\t}\n\n\treturn `${minHousePrice} € – ${maxHousePrice} €`;\n};\n\nconst MonthlyPaymentSearch = (props: IProps) => {\n\tconst defaultInterest: number = 1.8;\n\tconst defaultTime: number = 25;\n\n\tconst { title = \"Määrittele budjettiisi sopiva hintahaarukka\" } = props;\n\tconst [savedValues, setSavedValues] = useLocalStorage(\"monthlyPayment\", {});\n\n\tconst dispatch = useDispatch();\n\n\tconst {\n\t\tdata = {\n\t\t\tinterest: defaultInterest,\n\t\t\ttime: defaultTime,\n\t\t},\n\t} = savedValues;\n\n\tconst [values, setValues] = useState(data);\n\n\tfunction setValue(key: string, value: any) {\n\t\tsetValues({\n\t\t\t...values,\n\t\t\t[key]: value,\n\t\t});\n\t}\n\n\tfunction doSearch() {\n\t\tconst { minHousePrice, maxHousePrice } = getSuitablePriceRange(values);\n\n\t\tif (minHousePrice) {\n\t\t\tdispatch(sagaAddConstraint(\"min\", minHousePrice));\n\t\t}\n\n\t\tif (maxHousePrice) {\n\t\t\tdispatch(sagaAddConstraint(\"max\", maxHousePrice));\n\t\t}\n\n\t\tsetSavedValues(values);\n\n\t\tif (props.onSearch) {\n\t\t\tprops.onSearch();\n\t\t}\n\t}\n\n\tconst priceRange = getSuitablePriceRange(values);\n\tconst priceRangeText = getSuitablePriceRangeText(priceRange);\n\n\treturn (\n\t\t\n\t\t\t{title}\n\t\t\t\n\t\t\t\tMietitkö millaiseen asuntoon rahasi riittävät? Syötä laskuriin asuntolainakuluihin kuukausitasolla\n\t\t\t\tvaraamasi summa, pankilta saamasi lainaehdot sekä käteisvarallisuutesi määrä, niin kerromme sopivan\n\t\t\t\thintahaarukan uudelle kodillesi.\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t setValue(\"minPrice\", e.target.value)}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t setValue(\"maxPrice\", e.target.value)}\n\t\t\t\t/>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t setValue(\"interest\", e.target.value)}\n\t\t\t\t/>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t setValue(\"time\", e.target.value)}\n\t\t\t\t/>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t setValue(\"savings\", e.target.value)}\n\t\t\t\t/>\n\t\t\t\n\t\t\t{priceRange && (\n\t\t\t\t

\n\t\t\t\t\tKuukausierääsi soveltuva hinta\n\t\t\t\t\t
\n\t\t\t\t\t{priceRangeText}\n\t\t\t\t

\n\t\t\t)}\n\t\t\tNäytä sopivat asunnot →\n\t\t
\n\t);\n};\n\nexport default MonthlyPaymentSearch;\n","import React from \"react\";\nimport CtaButton from \"@components/Buttons/CtaButton\";\nimport PropertyKeySearch from \"@components/Search/PropertyKeySearch\";\nimport { ActionButton, Actions, DividerDash, KeySearch } from \"./styles\";\nimport { shallowEqual, useSelector } from \"react-redux\";\nimport { getAddresses, getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\nimport { Link } from \"react-router-dom\";\nimport NumberFormat from \"react-number-format\";\nimport clsx from \"clsx\";\n\nconst SearchBarExtras = props => {\n\tconst { mobile = false, doReset, toggle, ...rest } = props;\n\tconst { matches, isLoading } = useSelector(getApartmentSearch);\n\tconst addresses = useSelector(getAddresses, shallowEqual);\n\n\tconst shouldShowSearchWatchButton = addresses && addresses.length > 0;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\tTee hakuvahti valituilla ehdoilla\n\t\t\t\n\t\t\t\n\t\t\t{/* Hakuhistoria */}\n\t\t\t\n\t\t\t\tTyhjennä hakuehdot\n\t\t\t\n\t\t\t\n\t\t\t{!mobile && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{mobile && (\n\t\t\t\t\n\t\t\t\t\tNäytä tulokset ()\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default SearchBarExtras;\n","import React, { PureComponent, RefObject } from \"react\";\nimport MultiButtonSelect from \"@components/Form/MultiButtonSelect\";\nimport AddressSearch from \"@components/Search/AddressSearch\";\nimport DropdownSelect from \"@components/DropdownSelect\";\nimport CheckboxSelect from \"@components/CheckboxSelect\";\nimport SaleRentSelect from \"@components/Search/SaleRentSelect\";\nimport MonthlyPaymentSearch from \"@components/Search/MonthlyPaymentSearch\";\nimport ApartmentSearch, { ApartmentSearchConsumer } from \"@components/Search/ApartmentSearch\";\n\nimport { IApartmentSearch } from \"@redux/apartment-search\";\n\nimport { ISelection, selectableAreaTypes as defaultSelectableAreaTypes } from \"@utils/apartment-search/selections\";\n\nimport NumberFormat from \"react-number-format\";\n\nimport debounce from \"lodash-es/debounce\";\nimport includes from \"lodash-es/includes\";\nimport PriceRange from \"@components/Search/ApartmentSearch/PriceRange\";\nimport AreaRange from \"@components/Search/ApartmentSearch/AreaRange\";\nimport YearRange from \"@components/Search/ApartmentSearch/YearRange\";\n\nimport {\n\tActionButton,\n\tArea,\n\tBuildYear,\n\tCondition,\n\tExtraSection,\n\tExtrasToggle,\n\tHistoryButtonContainer,\n\tPrice,\n\tSearchBar,\n\tSearchBarContent,\n\tSearchBarSection,\n\tSelectionTitle,\n\tSelectionsWrapper,\n\tKeySearch,\n} from \"./styles\";\nimport Extras from \"./extras\";\nimport { hasWindow } from \"@utils/index\";\n\nimport clsx from \"clsx\";\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport { Link } from \"react-router-dom\";\nimport PropertyKeySearch from \"@components/Search/PropertyKeySearch\";\n\ninterface IRangeAccumulator {\n\tranges: any[];\n\trangeStart: number;\n\tlast: number;\n}\n\nconst rangeReducer = (acc: IRangeAccumulator, room: ISelection, i: number) => {\n\tif (i === 0) {\n\t\tacc.ranges.push(room.value);\n\t\tacc.rangeStart = room.value;\n\t} else {\n\t\tif (room.value === acc.last + 1) {\n\t\t\tacc.ranges[acc.ranges.length - 1] = acc.rangeStart + \"-\" + room.label;\n\t\t} else {\n\t\t\tacc.ranges.push(room.value);\n\t\t\tacc.rangeStart = room.value;\n\t\t}\n\t}\n\n\tacc.last = room.value;\n\n\treturn acc;\n};\n\ninterface IProps {\n\taddAddresses: (addresses: any) => void;\n\taddSelection: (field: string, selection: any, single?: boolean) => void;\n\taddConstraint: (field: string, value: any) => void;\n\tapartmentSearch: IApartmentSearch;\n\tresetSelections: () => void;\n\tsetRental: (isRental: boolean) => void;\n\t[key: string]: any;\n}\n\ninterface IState {\n\twrapperOpen?: boolean;\n}\n\nclass ApartmentSearchBar extends PureComponent {\n\tref: RefObject = React.createRef();\n\taddressSearchRef: RefObject = React.createRef();\n\n\tconstructor(props: IProps) {\n\t\tsuper(props);\n\n\t\tthis.state = {\n\t\t\twrapperOpen: false,\n\t\t};\n\n\t\tthis.handleInputChange = debounce(this.handleInputChange, 250);\n\t\tthis.handleCondition = this.handleCondition.bind(this);\n\t\tthis.handleFeatures = this.handleFeatures.bind(this);\n\t\tthis.doReset = this.doReset.bind(this);\n\t\tthis.getTypesTitle = this.getTypesTitle.bind(this);\n\t\tthis.getRoomRangeText = this.getRoomRangeText.bind(this);\n\t\tthis.getAreaTitle = this.getAreaTitle.bind(this);\n\t\tthis.getPriceTitle = this.getPriceTitle.bind(this);\n\t\tthis.toggleWrapper = this.toggleWrapper.bind(this);\n\t\tthis.limit = this.limit.bind(this);\n\t}\n\n\thandleInputChange(field: string, value: any) {\n\t\tconst { rental } = this.props.apartmentSearch;\n\n\t\tif (includes([\"minPrice\", \"maxPrice\"], field)) {\n\t\t\tfield = field.replace(\"Price\", \"\");\n\t\t\tvalue = value ? parseInt(value, 10) * (rental ? 1 : 1000) : null;\n\t\t}\n\n\t\tthis.props.addConstraint(field, value);\n\t}\n\n\thandleCondition(condition: ISelection) {\n\t\tthis.props.addSelection(\"conditions\", condition);\n\t}\n\n\thandleFeatures(feature: ISelection) {\n\t\tthis.props.addSelection(\"features\", feature);\n\t}\n\n\tdoReset() {\n\t\tthis.props.resetSelections();\n\n\t\tif (this.addressSearchRef.current && this.addressSearchRef.current.reset) {\n\t\t\tthis.addressSearchRef.current.reset();\n\t\t}\n\t}\n\n\tgetTypesTitle(selectableHouseTypes: ISelection[]) {\n\t\tconst activeTypes = selectableHouseTypes.filter(type => type.selected);\n\t\treturn activeTypes.length > 0 ? `Asuntotyyppi (${activeTypes.length})` : \"Asuntotyyppi\";\n\t}\n\n\tgetRoomRangeText(rooms?: ISelection[]): string {\n\t\tconst selectedRooms = rooms.filter(room => room.selected);\n\t\tif (!selectedRooms || selectedRooms.length <= 0) {\n\t\t\treturn \"Huoneluku\";\n\t\t}\n\n\t\tconst roomRanges = selectedRooms\n\t\t\t.sort((a, b) => a.value - b.value)\n\t\t\t.reduce(rangeReducer, { ranges: [], rangeStart: null, last: null })\n\t\t\t.ranges.join(\", \");\n\n\t\treturn `Huoneita ${roomRanges}`;\n\t}\n\n\tgetAreaTitle(area: { minArea?: string | number; maxArea?: string | number, areaType?: string }): JSX.Element {\n\t\tconst { minArea, maxArea, areaType } = area;\n\n\t\tlet areaTypePart = areaType && areaType === \"total\"\n\t\t\t? Kokonaispinta-ala\n\t\t\t: Asuinpinta-ala\n\t\t;\n\t\tif (minArea && !maxArea) {\n\t\t\treturn <>> {minArea} m²{areaTypePart};\n\t\t} else if (!minArea && maxArea) {\n\t\t\treturn <>< {maxArea} m²{areaTypePart};\n\t\t} else if (minArea && maxArea) {\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t\n\t\t\t\t\t\t{minArea} - {maxArea} m²\n\t\t\t\t\t\n\t\t\t\t\t{areaTypePart}\n\t\t\t\t\n\t\t\t);\n\t\t}\n\n\t\treturn Pinta-ala;\n\t}\n\n\tgetPriceTitle(range: { minPrice?: string; maxPrice?: string }): JSX.Element {\n\t\tconst { minPrice, maxPrice } = range;\n\t\tconst min = parseInt(minPrice, 10) || null;\n\t\tconst max = parseInt(maxPrice, 10) || null;\n\n\t\tif (min && !max) {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t> €\n\t\t\t\t\n\t\t\t);\n\t\t} else if (!min && max) {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t< €\n\t\t\t\t\n\t\t\t);\n\t\t} else if (min && max) {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t – \n\t\t\t\t\t €\n\t\t\t\t\n\t\t\t);\n\t\t}\n\n\t\treturn Hinta;\n\t}\n\n\ttoggleWrapper() {\n\t\tif (hasWindow) {\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\t...this.state,\n\t\t\t\t\twrapperOpen: !this.state.wrapperOpen,\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tconst body = document.body || document.documentElement;\n\n\t\t\t\t\tif (this.state.wrapperOpen) {\n\t\t\t\t\t\tbody.classList.add(\"search-open\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody.classList.remove(\"search-open\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tlimit(event: KeyboardEvent, max: number = 5) {\n\t\tconst target = event.target as HTMLInputElement;\n\n\t\tif (target.value.length >= max) {\n\t\t\ttarget.value = target.value.substr(0, max);\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tconst { init } = this.props;\n\t\tif (init && typeof init === \"function\") {\n\t\t\tinit();\n\t\t}\n\n\t\tif (hasWindow) {\n\t\t\tconst body = document.body || document.documentElement;\n\t\t\tbody.classList.add(\"is-searchbar-page\");\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tif (hasWindow) {\n\t\t\tconst body = document.body || document.documentElement;\n\t\t\tbody.classList.remove(\"is-searchbar-page\", \"search-open\");\n\t\t}\n\t}\n\n\trender() {\n\t\tconst { addAddresses, addSelection, apartmentSearch, setRental, itemsWithSelections } = this.props;\n\n\t\tconst { rental, selections, constraints, addresses } = apartmentSearch;\n\n\t\tconst {\n\t\t\tconditions: selectableConditions,\n\t\t\tfeatures: selectableFeatures,\n\t\t\thouseTypes: selectableHouseTypes,\n\t\t\tnewConstruction: selectableNewConstruction,\n\t\t\trooms: selectableRooms,\n\t\t\tvalueListing: selectableValueListing,\n\t\t} = selections;\n\n\t\tconst { min, max, minArea, maxArea, areaType } = constraints;\n\t\tlet selectableAreaTypes = selections.areaTypes || defaultSelectableAreaTypes;\n\t\tfor (let selectAreaType of selectableAreaTypes) {\n\t\t\tif (selectAreaType.value === areaType) {\n\t\t\t\tselectAreaType.selected = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst { wrapperOpen } = this.state;\n\n\t\tconst roomRangeText = this.getRoomRangeText(selectableRooms);\n\t\tconst houseTypeText = this.getTypesTitle(selectableHouseTypes);\n\n\t\tconst {\n\t\t\trooms: hasSelectedRooms,\n\t\t\thouseTypes: hasSelectedHouseTypes,\n\t\t\tprice: hasSelectedPrices,\n\t\t\tarea: hasSelectedAreas,\n\t\t\tareaType: hasSelectedAreaType,\n\t\t\tconditions,\n\t\t\tfeatures,\n\t\t\tnewConstruction,\n\t\t\tvalueListing,\n\t\t\tyear,\n\t\t} = itemsWithSelections;\n\n\t\tconst hasOtherSearchTerms = newConstruction || conditions || features || year || valueListing;\n\t\tconst hasMainSearchTerms = hasSelectedRooms || hasSelectedHouseTypes || hasSelectedPrices || hasSelectedAreas || hasSelectedAreaType;\n\n\t\tconst shouldShowSearchWatchButton = !!addresses && addresses.length > 0;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tHae kohdenumerolla\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tHuoneluku\n\t\t\t\t\t\t\t\t\t addSelection(\"rooms\", room)}\n\t\t\t\t\t\t\t\t\t\tselections={selectableRooms}\n\t\t\t\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tAsuntotyyppi\n\t\t\t\t\t\t\t\t\t addSelection(\"houseTypes\", type)}\n\t\t\t\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{({ toggleDd }) => (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t this.handleInputChange(f, v)} />\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{rental ? (\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\t\t\t\tselectableAreaTypes.forEach(s => {s.selected = (s === selection)});\n\t\t\t\t\t\t\t\t\t\t\t\tthis.handleInputChange(\"areaType\", selection.value || \"living\");\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tselections={selectableAreaTypes}\n\t\t\t\t\t\t\t\t\t\t\tsingle={true}\n\t\t\t\t\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t this.handleInputChange(f, v)} />\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t this.handleInputChange(f, v)} />\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tUudiskohteet\n\t\t\t\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\t\t\t\taddSelection(\"newConstruction\", selection, true);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tselections={selectableNewConstruction}\n\t\t\t\t\t\t\t\t\t\t\tsingle={true}\n\t\t\t\t\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tArvokohteet\n\t\t\t\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\t\t\t\taddSelection(\"valueListing\", selection, true);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tselections={selectableValueListing}\n\t\t\t\t\t\t\t\t\t\t\tsingle={true}\n\t\t\t\t\t\t\t\t\t\t\tuseRedux={true}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tKunto\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tKunto\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tOminaisuudet\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tTyhjennä hakuehdot\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tTee hakuvahti valituilla ehdoilla\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{wrapperOpen ? \"Sulje hakuehdot\" : \"Lisää hakuehtoja\"}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\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
\n\t\t\t\t\n\t\t\t
\n\t\t);\n\t}\n}\n\nconst ApartmentSearchBarContainer = () => {\n\treturn (\n\t\t\n\t\t\t{({ ...props }) => }\n\t\t\n\t);\n};\n\nexport default ApartmentSearchBarContainer;\n","import styled from \"styled-components\";\nimport { color, lineHeight, media } from \"@utils/style-utils\";\n\nexport const DescriptionContainer = styled.div.attrs(() => ({\n\tclassName: \"description\",\n}))`\n\t/* margin-bottom: 65px; */\n\t/* padding-top: 12rem; */\n\ttext-align: left;\n`;\n\nexport const H1 = styled.h1`\n\tcolor: ${color(\"grey\", 1)};\n\tfont-size: 24px;\n\tfont-weight: 500;\n\tline-height: normal;\n\tmargin: 0 0 30px;\n\n\tspan {\n\t\tcolor: ${color(\"greenBright\", 1)};\n\t}\n`;\n\nexport const Description = styled.p`\n\tcolor: ${color(\"grey\", 1)};\n\tfont-size: 17px;\n\tfont-weight: normal;\n\tline-height: ${lineHeight(17, 25)};\n`;\n\nexport const ValueListingDescription = styled.div`\n\talign-items: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 20px;\n\tjustify-content: flex-start;\n\tmargin-bottom: 40px;\n\n\timg {\n\t\tmax-height: 128px;\n\t}\n\n\t${media.smd`\n\t\tflex-direction: row;\n\t`};\n`;\n","import React from \"react\";\n\nimport { DescriptionContainer, H1, Description, ValueListingDescription } from \"./styles\";\nimport { useSelector } from \"react-redux\";\nimport { getApartmentSearch } from \"@redux/apartment-search/apartment-search.selectors\";\nimport { hasWindow, getAssetUrl } from \"@utils\";\n\ninterface IProps {\n\tcount?: number;\n\tdata: {\n\t\tisSearchPage?: boolean;\n\t\tcity?: string;\n\t\tgeothermalHeating?: boolean;\n\t\tgroupType?: string;\n\t\tnoDynamicH1?: boolean;\n\t\trental?: boolean;\n\t\turlCity?: string;\n\t\turlDistrict?: string;\n\t\turlRent?: string;\n\t\turlType?: string;\n\t\ttype?: string;\n\t\trent?: string;\n\t\tpageH1?: string;\n\t\tpageSearchDesc?: string;\n\t\tpageSearchInfo?: string;\n\t\tseniorHousing?: boolean;\n\t\tvalueListing?: boolean;\n\t};\n\thouseTypes?: any;\n\tsearched?: boolean;\n\trental?: boolean;\n\n\t[ key: string ]: any;\n}\n\nconst getAddressValues = addresses => {\n\treturn addresses\n\t\t.filter(address => address && address.value)\n\t\t.map(address => address.value)\n\t\t.join(\" + \");\n};\n\nconst SearchResultDescription = (props: IProps) => {\n\ttry {\n\t\tconst { count, data, searched, rental, houseTypes, ...restProps } = props;\n\t\tconst { noDynamicH1 = false, pageH1, pageSearchInfo } = data;\n\t\tconst { matches, addresses, isLoading } = useSelector(getApartmentSearch);\n\n\t\t// Dynamic title\n\t\tlet dynamicH1 = pageH1;\n\t\tif (searched) {\n\t\t\tif (noDynamicH1) {\n\t\t\t\tdynamicH1 = (rental ? \"Vuokrattavat \" : \"Myytävät \") + dynamicH1;\n\t\t\t\tif (hasWindow) {\n\t\t\t\t\tdocument.title = dynamicH1 + ' - Kiinteistömaailma';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (rental) {\n\t\t\t\t\tdynamicH1 = \"Vuokrattavat\";\n\t\t\t\t} else {\n\t\t\t\t\tdynamicH1 = \"Myytävät\";\n\t\t\t\t}\n\n\t\t\t\tconst selectedHousetypes = (Array.isArray(houseTypes) && houseTypes.filter(type => type.selected)) || [];\n\n\t\t\t\tif (selectedHousetypes.length === 1) {\n\t\t\t\t\tdynamicH1 += \" \" + selectedHousetypes[ 0 ].title;\n\t\t\t\t}\n\n\t\t\t\tif (selectedHousetypes.length === 0 || selectedHousetypes.length > 1) {\n\t\t\t\t\tdynamicH1 += \" asunnot\";\n\t\t\t\t}\n\n\t\t\t\tif (addresses && addresses.length > 0 && addresses.length <= 3) {\n\t\t\t\t\tdynamicH1 += ` ${getAddressValues(addresses)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{dynamicH1 && (\n\t\t\t\t\t

\n\t\t\t\t\t\t{dynamicH1} {matches > 0 && !isLoading && ({matches})}\n\t\t\t\t\t

\n\t\t\t\t)}\n\t\t\t\t{data.valueListing && \n\t\t\t\t\t{pageSearchInfo}\n\t\t\t\t\t\"\"\n\t\t\t\t}\n\t\t\t\t{!data.valueListing && <>\n\t\t\t\t\t{searched && noDynamicH1 && pageSearchInfo && {rental\n\t\t\t\t\t\t? pageSearchInfo.replace(\"myytävät\", \"vuokrattavat\")\n\t\t\t\t\t\t: pageSearchInfo}\n\t\t\t\t\t}\n\t\t\t\t\t{!searched && pageSearchInfo && {pageSearchInfo}}\n\t\t\t\t}\n\t\t\t
\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport default SearchResultDescription;\n","import React, { memo, useEffect, useRef, useState } from \"react\";\nimport { IApplicationState } from \"@redux\";\nimport { connect, useDispatch } from \"react-redux\";\n\nimport { IApartmentSearch } from \"@redux/apartment-search\";\nimport { IDocument } from \"@redux/document\";\n\nimport SearchBar from \"@components/Search/ApartmentSearchBar\";\nimport SearchResultDescription from \"@pages/SearchPage/SearchResultDescription\";\nimport ApartmentBlock from \"@components/ApartmentBlock\";\nimport { Container } from \"@components/Grid\";\n\nimport {\n\tApartmentsWrapper,\n\tContactFormContainer,\n\tLoadMore,\n\tResultsHeader,\n\tSearchLoader,\n\tSearchPageContactArea,\n\tSearchPageContactIngress,\n\tSearchPageContactTitle,\n\tSearchPageWrapper,\n\tSortContainer,\n} from \"./styles\";\nimport { ISelection, selectableSorting } from \"@utils/apartment-search/selections\";\nimport Text from \"wake-react-components/text\";\nimport { hasWindow, wake } from \"@utils\";\n\n/* using this as a sorting dropdown */\nimport DropdownSelect from \"@components/HousetypeDropdown\";\nimport AreaNavigation from \"@components/AreaNavigation\";\n\nimport {\n\tsagaAddSort,\n\tsagaGetInitialProperties,\n\tsagaGetPropertiesForLandingPage,\n\tsagaLoadMore,\n\tsagaSetRental,\n} from \"@redux/apartment-search/apartment-search.actions\";\n\nimport { FontAwesomeIcon as FaIcon } from \"@fortawesome/react-fontawesome\";\nimport isEmpty from \"lodash-es/isEmpty\";\nimport ContactFormLarge from \"@components/Form/ContactFormLarge\";\nimport Editor from \"wake-react-components/editor\";\n\ninterface IProps {\n\tapartmentSearch: IApartmentSearch;\n\tdoc: IDocument;\n\taddSort?: (sort: { type: string; order: string }) => void;\n\tloadMore?: () => void;\n\tgetProperties?: () => void;\n\tsetRental?: (state: boolean) => void;\n}\n\nconst SearchPage = (props: IProps) => {\n\tconst {\n\t\tdoc: { contactTitle, hasContactForm, searchData, searchProperties, searchResultLimit, parameterString },\n\t\tapartmentSearch,\n\t\taddSort,\n\t} = props;\n\tif (searchData.seniorHousing) {\n\t\tapartmentSearch.query.seniorHousing = true;\n\t\tapartmentSearch.searched = true;\n\t\tapartmentSearch.selections.features.map((feature: ISelection) => {\n\t\t\tif (feature.value === \"seniorHousing\") {\n\t\t\t\tfeature.selected = true;\n\t\t\t\tfeature.disabled = true;\n\t\t\t}\n\t\t});\n\t\t// ensure value listing is not disabled\n\t\tapartmentSearch.selections.valueListing.map((option: ISelection) => {\n\t\t\toption.disabled = false;\n\t\t});\n\t\t// ensure geothermal heating is not disabled\n\t\tapartmentSearch.selections.features.map((feature: ISelection) => {\n\t\t\tif (feature.value === 'geothermalHeating') {\n\t\t\t\tfeature.disabled = false;\n\t\t\t}\n\t\t});\n\t} else if (searchData.geothermalHeating) {\n\t\tapartmentSearch.query.geothermalHeating = true;\n\t\tapartmentSearch.searched = true;\n\t\tapartmentSearch.selections.features.map((feature: ISelection, index) => {\n\t\t\tif (feature.value === 'geothermalHeating') {\n\t\t\t\tfeature.selected = true;\n\t\t\t\tfeature.disabled = true;\n\t\t\t}\n\t\t});\n\t\t// ensure value listing is not disabled\n\t\tapartmentSearch.selections.valueListing.map((option: ISelection) => {\n\t\t\toption.disabled = false;\n\t\t});\n\t\t// ensure senior housing is not disabled\n\t\tapartmentSearch.selections.features.map((feature: ISelection) => {\n\t\t\tif (feature.value === 'seniorHousing') {\n\t\t\t\tfeature.disabled = false;\n\t\t\t}\n\t\t});\n\t} else if (searchData.valueListing) {\n\t\tapartmentSearch.query.valueListing = true;\n\t\tapartmentSearch.searched = true;\n\t\tapartmentSearch.selections.valueListing.map((option: ISelection) => {\n\t\t\toption.disabled = true;\n\t\t});\n\t\tapartmentSearch.selections.valueListing[0].selected = true;\n\n\t\t// ensure geothermal heating or senior housing is not disabled\n\t\tapartmentSearch.selections.features.map((feature: ISelection, index) => {\n\t\t\tif (['geothermalHeating', 'seniorHousing'].includes(feature.value)) {\n\t\t\t\tfeature.disabled = false;\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// ensure geothermal heating or senior housing is not disabled in normal searches\n\t\tapartmentSearch.selections.features.map((feature: ISelection, index) => {\n\t\t\tif (['geothermalHeating', 'seniorHousing'].includes(feature.value)) {\n\t\t\t\tfeature.disabled = false;\n\t\t\t}\n\t\t});\n\t\t// ensure value listing is not disabled in normal searches\n\t\tapartmentSearch.selections.valueListing.map((option: ISelection) => {\n\t\t\toption.disabled = false;\n\t\t});\n\t}\n\tconst { isLoading, matches, results, searched, rental, selections } = apartmentSearch;\n\tconst [ignoredFirstSort, setIgnoredFirstSort] = useState(false);\n\tconst [searchedWithSearchData, setSearchedWithSearchData] = useState(false);\n\tconst initialSort = apartmentSearch.sort + (apartmentSearch.sortOrder ? \".\" + apartmentSearch.sortOrder : \"\");\n\tconst { houseTypes } = selections;\n\tconst dispatch = useDispatch();\n\tconst apartmentsWrapperRef = useRef(null);\n\n\tconst setSort = ([sort]) => {\n\t\tif (!ignoredFirstSort) {\n\t\t\tsetIgnoredFirstSort(true);\n\t\t\treturn;\n\t\t}\n\t\tconst { value } = sort;\n\t\tconst [type, order] = value.split(\".\");\n\n\t\tif (typeof addSort === \"function\") {\n\t\t\taddSort({ type, order });\n\t\t}\n\t};\n\n\tconst loadMoreProperties = () => {\n\t\tprops.loadMore();\n\t};\n\n\tconst handlePropertyClick = (event: MouseEvent | TouchEvent) => {\n\t\ttry {\n\t\t\tconst key = event.currentTarget && (event.currentTarget as HTMLElement).dataset.key;\n\t\t\tif (hasWindow) {\n\t\t\t\tsessionStorage.setItem(\"kmLastClickedProperty\", key);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tif (hasWindow && (!parameterString || !searched) && !wake.loading && searchData.isSearchPage) {\n\t\t\tif (searchResultLimit) {\n\t\t\t\tlocalStorage.setItem(\"kmSearchLimit\", searchResultLimit);\n\t\t\t}\n\t\t\tprops.getProperties();\n\t\t}\n\t}, [parameterString]);\n\n\tuseEffect(() => {\n\t\tif (!wake.loading && !isEmpty(searchData) && parameterString) {\n\t\t\tdispatch(sagaGetPropertiesForLandingPage(searchData));\n\t\t\tsetSearchedWithSearchData(true);\n\t\t}\n\t}, [searchData, parameterString]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{!searched && }\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{!searchedWithSearchData &&\n\t\t\t\t\t\t!searched &&\n\t\t\t\t\t\tsearchProperties &&\n\t\t\t\t\t\tsearchProperties.map((property: IProperty) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t))}\n\t\t\t\t\t{(searchedWithSearchData || searched) &&\n\t\t\t\t\t\tresults.length > 0 &&\n\t\t\t\t\t\tresults.map((property: IProperty) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t))}\n\t\t\t\t\t{searched && results.length <= 0 && !isLoading && (\n\t\t\t\t\t\t

Valitsemillasi hakuehdoilla ei löytynyt kohteita

\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t\t{matches > results.length && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t{hasContactForm && \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\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\n\t\t\t}\n\n\t\t\t{isLoading && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t
\n\t);\n};\n\nconst mapStateToProps = (state: IApplicationState) => ({\n\tapartmentSearch: state.apartmentSearch,\n\tdoc: state.document,\n});\n\nconst mapDispatchToProps = {\n\taddSort: sagaAddSort,\n\tgetProperties: sagaGetInitialProperties,\n\tloadMore: sagaLoadMore,\n\tsetRental: sagaSetRental,\n};\n\nexport default memo(\n\tconnect(\n\t\tmapStateToProps,\n\t\tmapDispatchToProps\n\t)(SearchPage)\n);\n"],"sourceRoot":""}