{"version":3,"file":"js/8458-73cbfa5e6912280b5b49-v10.js","mappings":"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","sources":["webpack:///./app/javascript/legacy/lib/ComponentLoader.js","webpack:///./app/javascript/legacy/lib/Cookies.js","webpack:///./app/javascript/legacy/lib/EstatelyEvents.js","webpack:///./app/javascript/legacy/lib/ModalFocus.js","webpack:///./app/javascript/legacy/lib/lazy-loading.js","webpack:///./app/javascript/legacy/lib/redirect-to-signup-url.js","webpack:///./app/javascript/legacy/views/global/AjaxLoadedContent.js","webpack:///./app/javascript/legacy/views/global/ClearableInput.js","webpack:///./app/javascript/legacy/views/global/NativeShareButton.js","webpack:///./app/javascript/legacy/views/global/SearchAutoComplete.js","webpack:///./app/javascript/legacy/views/global/SearchForm.js","webpack:///./app/javascript/legacy/pages/DefaultPage.js","webpack:///./app/javascript/legacy/views/listings/Accordion.js","webpack:///./app/javascript/legacy/views/global/Header.js","webpack:///./app/javascript/legacy/views/global/Notifications.js","webpack:///./app/javascript/legacy/views/global/SaveSearch.js","webpack:///./app/javascript/legacy/views/global/SaveSearchButton.js","webpack:///./app/javascript/legacy/views/global/SaveSearchForm.js","webpack:///./app/javascript/legacy/views/global/TimeSinceDate.js","webpack:///./app/javascript/lib/GoogleAnalytics/GAReporter.js","webpack:///./app/javascript/lib/polyfills/requestIdleCallback.js"],"sourcesContent":["export default class ComponentLoader {\n static childComponents = []\n\n static register() {\n this.mount()\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.initialize())\n } else {\n this.initialize()\n }\n\n this.childComponents.forEach(component => component.register())\n }\n\n // Can be called immediately, before document is fully loaded\n static mount() {}\n\n // Called on document ready\n static initialize() {}\n}\n","import JSCookies from 'js-cookie'\n\nconst Cookies = {\n get(name) {\n const value = JSCookies.get(name)\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n },\n\n set(name, value, { maxAge, ...opts } = {}) {\n return JSCookies.set(name, JSON.stringify(value), {\n ...opts,\n 'Max-Age': maxAge?.toString(),\n })\n },\n\n remove: JSCookies.remove,\n}\n\nexport default Cookies\n","// These are used as custom jQuery events, and follow jQuery event conventions:\n// See: https://learn.jquery.com/events/introduction-to-custom-events/#naming-custom-events\n// See: https://api.jquery.com/event.namespace/\n\n// IMPORTANT: Use `:` as a prefix to avoid triggering actual DOM events\n\nconst EstatelyEvents = {\n AJAX_CONTENT: {\n LOADED: ':loaded.estately.ajax-content',\n },\n\n SAVE_SEARCH: {\n REQUEST: ':request.estately.save-search',\n SUCCESS: ':success.estately.save-search',\n ERROR: ':error.estately.save-search',\n },\n\n STATE_CHANGE: {\n SHOWING_REQUEST: ':state-change.estately.showing-requested',\n LOGIN: ':state-change.estately.logged-in',\n PROPERTY_SAVE: ':state-change.estately.property-saved',\n },\n\n USER: {\n WILL_INTERACT: ':will-interact.estately.user', // Used for lazy-loading content\n },\n}\n\nexport default EstatelyEvents\n","import $ from 'legacy/vendor/jquery.custom'\n\n// NOTE: We have to capture keyboard focus within the modal when a modal is opened for\n// accessibility reasons. Issue: 22210\nexport default class ModalFocus {\n static captureTabEvent() {\n const focusableElements = 'button, a, input, select, textarea'\n\n $('.modal').keydown((e) => {\n if (!(e.key === 'Tab')) {\n return\n }\n\n const $target = $(e.target)\n // We have to find the closest modal because there can be multiple modals on one page.\n const $closest = $target.closest('.modal')\n\n const $focusableContent = $closest.find(focusableElements).not(':hidden,[tabindex=-1]')\n const firstFocusableElement = $focusableContent[0]\n const lastFocusableElement = $focusableContent[$focusableContent.length - 1]\n\n if (e.target === firstFocusableElement) {\n // Shift + Tabbing up on first element, will move focus to last element.\n if (e.shiftKey) {\n e.preventDefault()\n $(lastFocusableElement).focus()\n } else if (firstFocusableElement === lastFocusableElement) {\n // Tabbing on first element when there is no other focusable element will\n // re-focus on the first element.\n e.preventDefault()\n $(firstFocusableElement).focus()\n }\n } else if ((e.target === lastFocusableElement) && !e.shiftKey) {\n // Tabbing on last element will move focus to the first element.\n e.preventDefault()\n $(firstFocusableElement).focus()\n }\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nexport function onceInView(selector, callback) {\n $(selector).each((_i, el) => {\n if (el.matches('.lazyloading, .lazyloaded')) return void callback(el)\n\n // Sanity check: Ensure the element is being lazy-loaded\n if (global.ENV === DEVELOPMENT && !el.matches('.js-lazyload')) {\n console.error(el)\n throw new Error(`\n ${selector} is missing required .js-lazyload class.\n You may want to add .lazyload-with-placeholder too\n (unless you want ${selector} to fade-in when lazy-loaded)\n `)\n }\n\n $(el).one('lazybeforeunveil', (event) => {\n callback(event.target)\n })\n })\n}\n\nexport function lazyLoadWhenInView(selector, importer) {\n onceInView(selector, async () => {\n const { default: Component } = await importer()\n Component.lazyLoad()\n })\n}\n","// TODO: Merge with /lib/redirect-to-signup-url.js\nexport default function redirectToSignupUrl(signupType) {\n const signupPath = document.getElementById('signup-header-link').href\n window.location.assign(`${signupPath}&signup_type=${signupType}`)\n}\n","import $ from 'legacy/vendor/jquery.custom'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport { onceInView } from 'legacy/lib/lazy-loading'\n\nexport default class AjaxLoadedContent extends ComponentLoader {\n static initialize() {\n onceInView('[data-ajax-load-url]', this.onLazyLoad)\n }\n\n static onLazyLoad = (el) => {\n const $el = $(el)\n\n const url = el.dataset.ajaxLoadUrl\n delete el.dataset.ajaxLoadUrl // eslint-disable-line no-param-reassign\n\n // Replace $el’s HTML with the response from `url`\n $el.load(url, (newContent) => {\n $el.trigger(EstatelyEvents.AJAX_CONTENT.LOADED, [newContent])\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class ClearableInput extends ComponentLoader {\n static initialize() {\n document\n .querySelectorAll('.js-clearable-input')\n .forEach(clearable => new ClearableInput(clearable))\n }\n\n constructor(clearable) {\n super()\n\n this.$clearable = $(clearable)\n this.$clearBtn = this.$clearable.siblings('.js-clear-input-btn')\n\n this.render()\n\n this.$clearBtn.on('click', this.onClear)\n this.$clearable.on('input', this.render)\n }\n\n render = () => {\n const valuePresent = !!this.$clearable.val()\n this.$clearable.toggleClass('clearable', valuePresent)\n this.$clearBtn.toggleClass('hidden', !valuePresent)\n }\n\n onClear = (event) => {\n event.preventDefault()\n this.$clearable.val('').trigger('input').focus()\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\nimport GAReporter from 'lib/GoogleAnalytics/GAReporter'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class NativeShareButton extends ComponentLoader {\n static mount() {\n if (navigator.share) $(document).on('click', '.gtm-native-share-sheet', this.onClick)\n }\n\n static initialize() {\n if (!navigator.share) $('.gtm-native-share-sheet').remove()\n }\n\n static onClick = async (event) => {\n event.preventDefault()\n\n const data = event.currentTarget.dataset\n const url = data.url || document.querySelector('link[rel=canonical]').href || window.location.href\n\n await navigator.share({ text: data.text, url })\n GAReporter.pushEventToGTM({ event: 'share' })\n }\n}\n","import { oneLineTrim } from 'common-tags'\nimport $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class SearchAutoComplete extends ComponentLoader {\n static SETTINGS = {\n source: '/search_suggestions',\n minLength: 2,\n appendTo: '.js-search-suggestions',\n\n select: (event, ui) => {\n if (ui.item) {\n event.target.value = ui.item.value // eslint-disable-line no-param-reassign\n } else {\n // A blank item is the eula agreement link and we want to trigger a click event.\n $('#eula-agreement a').trigger('click')\n return\n }\n\n // Submit the form unless we’re in the search filters modal\n if (!event.target.closest('#js-mobile-search-filters')) {\n $('#search-form').submit()\n }\n },\n focus: (event, ui) => {\n if (ui.item) {\n $(event.target).attr('aria-activedescendant', ui.item.id)\n } else {\n // If no active item is present, the focus is on the eula_agreement link.\n $(event.target).attr('aria-activedescendant', 'eula-agreement')\n }\n },\n close: (event) => {\n if (event) {\n const $target = $(event.target)\n\n $target.attr('aria-expanded', 'false')\n $target.removeAttr('aria-activedescendant')\n }\n },\n }\n\n // NOTE: jQuery UI sets `this` to the jQuery UI Autocomplete object\n /* eslint-disable no-underscore-dangle, no-param-reassign, max-len */\n static OVERRIDES = {\n _renderItem(ul, item) {\n item.value = `${item.suggestion}, ${item.state_abbreviation}`\n item.label = oneLineTrim`\n \n ${item.suggestion}\n ${item.state_abbreviation}\n \n `\n\n return $(`
  • `)\n .data('item.autocomplete', item)\n .append(item.label)\n .appendTo(ul)\n },\n\n _renderMenu(ul, items) {\n ul.attr('role', 'listbox')\n\n const $listId = ul.attr('id')\n $('#search-location').attr('aria-controls', $listId)\n $('.js-search-autocomplete').attr('aria-expanded', 'true')\n\n items.forEach(item => this._renderItemData(ul, item))\n // Show EULA agreement compliance\n ul.prepend(\n $(oneLineTrim`\n
  • \n \n By searching, I agree to the license agreement\n \n
  • \n `).on('click', (event) => {\n event.stopPropagation()\n window.location.href = '/eula_agreement'\n }),\n )\n },\n }\n /* eslint-enable */\n\n static initialize() {\n document\n .querySelectorAll('.js-search-autocomplete')\n .forEach((input) => {\n $(input).one('focus', this.onUserWillInteract)\n $(input).on('blur', this.onBlur)\n })\n }\n\n static onUserWillInteract = async (event) => {\n const { default: Autocomplete } = await import('packs/lazy/Autocomplete')\n\n new Autocomplete(event.currentTarget, this.SETTINGS, this.OVERRIDES).render()\n\n this.moveLiveRegion()\n }\n\n // NOTE: aria-live element is added dynamically so we need to find the element in the document object.\n // By default the aria-live tag is appended to the bottom of the page. We want to move this closer to the search field.\n static moveLiveRegion = () => {\n $('.js-search-results-count').append($(document)\n .find(\"[aria-live='assertive'][aria-relevant='additions']\")\n .addClass('sr-only'))\n }\n\n static onBlur = () => {\n $(document).find(\"[aria-live='assertive'][aria-relevant='additions']\").empty()\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class SearchForm extends ComponentLoader {\n static initialize() {\n $('#search-form').on('submit', this.onSubmit)\n }\n\n static onSubmit = (event) => {\n event.preventDefault()\n\n const searchPath = window.estately.data.is_mobile ? 'search' : 'map'\n const params = new URLSearchParams(new FormData(event.target))\n\n window.location = `/${searchPath}?${params}`\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\nimport GAReporter from 'lib/GoogleAnalytics/GAReporter'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport ModalFocus from 'legacy/lib/ModalFocus'\n\nimport AjaxLoadedContent from 'legacy/views/global/AjaxLoadedContent'\nimport ClearableInput from 'legacy/views/global/ClearableInput'\nimport Header from 'legacy/views/global/Header'\nimport NativeShareButton from 'legacy/views/global/NativeShareButton'\nimport Notifications from 'legacy/views/global/Notifications'\nimport SaveSearch from 'legacy/views/global/SaveSearch'\nimport SaveSearchButton from 'legacy/views/global/SaveSearchButton'\nimport SaveSearchForm from 'legacy/views/global/SaveSearchForm'\nimport SearchAutoComplete from 'legacy/views/global/SearchAutoComplete'\nimport SearchForm from 'legacy/views/global/SearchForm'\nimport TimeSinceDate from 'legacy/views/global/TimeSinceDate'\n\nexport default class DefaultPage extends ComponentLoader {\n static childComponents = [\n AjaxLoadedContent,\n ClearableInput,\n Header,\n NativeShareButton,\n Notifications,\n SaveSearch,\n SaveSearchButton,\n SaveSearchForm,\n SearchAutoComplete,\n SearchForm,\n TimeSinceDate,\n\n // Lower Priority\n GAReporter,\n ]\n\n static mount() {\n // HACK: Leak variables into global namespace\n window.$ = $\n window.jQuery = $\n }\n\n static initialize() {\n ModalFocus.captureTabEvent()\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class Accordion extends ComponentLoader {\n static mount() {\n $('.js-accordion').click((event) => {\n this.onToggle(event)\n })\n }\n\n static onToggle(event) {\n if (!event.currentTarget.matches('.js-accordion')) return\n\n const accordion = event.currentTarget\n const panel = accordion.getAttribute('aria-controls')\n\n const $accordionBody = $(`#${panel}`)\n\n const isExpanded = accordion.getAttribute('aria-expanded') === 'true'\n\n if (isExpanded) {\n $accordionBody.addClass('hidden')\n accordion.setAttribute('aria-expanded', 'false')\n } else {\n $accordionBody.removeClass('hidden')\n accordion.setAttribute('aria-expanded', 'true')\n }\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport Accordion from 'legacy/views/listings/Accordion'\nimport Cookies from 'legacy/lib/Cookies'\n\nexport default class Header extends ComponentLoader {\n static mount() {\n $(document).on(EstatelyEvents.STATE_CHANGE.LOGIN, this.onLogin)\n Accordion.mount()\n }\n\n static initialize() {\n $('.js-show-search-bar').on('click', this.onSearchBarToggleClick)\n $('.special-dropdown-links, .accordian-item').on('click', this.onSitewideHeaderNavigationClick)\n $('.modal-sidebar').on('click', '[data-toggle=\"modal\"]', this.onSidebarNestedModalClick)\n\n // The logout item in the sidebar is a form (rather than a link, like the other items). As a result,\n // only the text itself is clickable. This event handler makes the entire list item clickable.\n $('.logout-item').on('click', this.onLogoutItemClick)\n }\n\n static onLogin = () => {\n const $headerNavContent = $('#js-header-nav .modal-content')\n\n $headerNavContent.load(`/account/header_nav?return_to=${window.location.pathname}`, (newContent) => {\n $headerNavContent.trigger(EstatelyEvents.AJAX_CONTENT.LOADED, [newContent])\n })\n }\n\n static onSearchBarToggleClick = () => {\n const $headerSearch = $('.header-search')\n const toggleOpen = !$headerSearch.is(':visible')\n\n $headerSearch.toggleClass('header-search-open', toggleOpen)\n\n if (toggleOpen) {\n $headerSearch.find('#search-location').focus()\n\n // Close the search if you click anywhere else on the page\n $(window).on('click.header-search', (event) => {\n const isHeaderSearchClick = $(event.target).closest('.header-search,.js-show-search-bar,.ui-autocomplete').length\n\n if (!isHeaderSearchClick) this.onSearchBarToggleClick()\n })\n } else {\n $(window).off('click.header-search')\n }\n }\n\n static onSidebarNestedModalClick = (event) => {\n const $sidebar = $(event.delegateTarget)\n\n if (!$sidebar.hasClass('fade')) return\n\n $sidebar.removeClass('fade')\n $sidebar.modal('hide').on('hidden.bs.modal', () => $sidebar.addClass('fade'))\n }\n\n static onLogoutItemClick = (event) => {\n localStorage.removeItem('first-time-login-timestamp')\n $(event.target).submit()\n }\n\n static onSitewideHeaderNavigationClick = (event) => {\n const cityNameCookie = Cookies.get('city_name')\n const cityName = cityNameCookie.split('/')[1].replaceAll('_', ' ')\n\n $(event.currentTarget).find('.special-dropdown-menu-link, .accordion-link').each((_, link) => {\n const currentPrefix = $(link).data('linkPrefix')\n if (!currentPrefix) return\n\n $(link).text((_index, text) => text.replace(currentPrefix, cityName))\n $(link).data('linkPrefix', cityName)\n\n const currentHref = $(link).attr('href')\n const newHref = currentHref.replace(/^\\/[^/]+\\/[^/]+/, `/${cityNameCookie}`)\n\n $(link).attr('href', newHref)\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nexport default class Notifications extends ComponentLoader {\n static initialize() {\n this.$notificationsBtn = $('[data-toggle=\"modal\"][data-target=\"#js-notifications-center\"]')\n this.$notifications = $('#js-notifications-center')\n this.$unreadCircle = this.$notificationsBtn.find('.js-notifications-circle')\n this.notificationsUrl = this.$notifications.data('url')\n\n this.lazyUpdateNotifications()\n\n $(document).on(EstatelyEvents.STATE_CHANGE.LOGIN, () => this.lazyUpdateNotifications())\n\n this.$notificationsBtn.on('mouseover click', () => {\n this.$notificationsBtn.trigger(EstatelyEvents.USER.WILL_INTERACT)\n })\n\n this.$notifications\n .on(EstatelyEvents.SAVE_SEARCH.SUCCESS, () => this.onSaveSearchFromNotifications())\n .on('show.bs.modal', () => this.onOpen())\n .on('click', '.notifications-list .notification .listing-card', (event) => {\n window.location.href = event.currentTarget.dataset.path\n })\n }\n\n static onSaveSearchFromNotifications() {\n this.$notifications.modal('hide')\n }\n\n static lazyUpdateNotifications() {\n // Delay fetching the unread count (we already render from cached sessionStorage in _header.html.haml)\n requestIdleCallback(() => this.updateUnreadCount())\n\n this.$notificationsBtn.one(EstatelyEvents.USER.WILL_INTERACT, () => this.fetchNotifications())\n }\n\n static fetchNotifications = async () => {\n const content = await $.get(this.notificationsUrl)\n requestAnimationFrame(() => {\n $('.js-notifications-content')\n .addClass('fade')\n .html(content)\n .trigger(EstatelyEvents.AJAX_CONTENT.LOADED, [content])\n .addClass('in')\n })\n }\n\n static onOpen = async () => {\n if (window.estately.data.is_user_logged_in) await $.post('/notifications/viewed')\n\n this.renderUnreadCircle(0) // clear unread\n }\n\n static async updateUnreadCount() {\n if (!window.estately.data.is_user_logged_in) return\n\n const { unread } = await $.get('/notifications/count')\n\n this.renderUnreadCircle(unread)\n }\n\n static renderUnreadCircle(count) {\n requestAnimationFrame(() => {\n sessionStorage.setItem('notifications-unread-count', count || '')\n if (count === 0) {\n this.$unreadCircle.hide()\n } else {\n this.$unreadCircle.show()\n }\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport Cookies from 'legacy/lib/Cookies'\nimport redirectToSignupUrl from 'legacy/lib/redirect-to-signup-url'\n\nexport default class SaveSearch extends ComponentLoader {\n // This cookie name needs to match google tag manager variable \"save-search-cookies\"\n static COOKIE = 'save-search'\n\n static mount() {\n $(document)\n .on(EstatelyEvents.STATE_CHANGE.LOGIN, this.onLogin)\n .on(EstatelyEvents.SAVE_SEARCH.REQUEST, this.onRequest)\n .on(EstatelyEvents.SAVE_SEARCH.SUCCESS, this.onSuccess)\n\n this.restoreSaveSearchFromCookie()\n }\n\n static onLogin = () => {\n $('.save-search-from-listing-cta').remove()\n }\n\n static onRequest = (event) => {\n const requestingElement = event.target\n const formData = this.normalizeSaveSearchData(requestingElement)\n\n if (!window.estately.data.is_user_logged_in && !formData.has('email')) {\n this.authenticateFirst(formData)\n } else {\n this.save(requestingElement, formData)\n }\n }\n\n static onSuccess = async (event, modalContent, requestingElement) => {\n Cookies.remove(this.COOKIE)\n\n // Force a refresh of logged-in content (even if already logged in)\n window.estately.data.is_user_logged_in = true\n $(event.target).trigger(EstatelyEvents.STATE_CHANGE.LOGIN)\n\n const { default: SaveSearchConfirmationModal } = await this.modalImport\n SaveSearchConfirmationModal.lazyLoad(modalContent, requestingElement)\n }\n\n static async save(element, formData) {\n try {\n this.modalImport = this.modalImport || import('packs/lazy/SaveSearchConfirmationModal')\n\n const modalContent = await $.ajax({\n type: 'POST',\n url: '/saved_searches/create',\n data: formData,\n\n // These need to be disabled since we’re using a FormData() object\n processData: false,\n contentType: false,\n })\n\n $(element).trigger(EstatelyEvents.SAVE_SEARCH.SUCCESS, [modalContent, element])\n } catch (error) {\n $(element).trigger(EstatelyEvents.SAVE_SEARCH.ERROR, [error])\n }\n }\n\n static normalizeSaveSearchData(target) {\n const data = new FormData(target.tagName === 'FORM' ? target : undefined)\n\n if (!data.has('bookmark')) {\n const canonicalURL = document.querySelector('link[rel=\"canonical\"]').href\n data.append('bookmark', canonicalURL)\n }\n\n return data\n }\n\n static authenticateFirst(formData) {\n Cookies.set(this.COOKIE, Object.fromEntries(formData), { maxAge: 3600 })\n\n return redirectToSignupUrl('save_search_from_area')\n }\n\n static restoreSaveSearchFromCookie() {\n if (!window.estately.data.is_user_logged_in) return\n\n const savedSearchParams = Cookies.get(this.COOKIE)\n if (!savedSearchParams) return\n\n // Convert cookie data to a FormData object\n const formData = new FormData()\n Object.entries(savedSearchParams).forEach(([key, val]) => {\n formData.append(key, val)\n })\n\n this.save(document, formData)\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nexport default class SaveSearchButton extends ComponentLoader {\n static mount() {\n $(document).on('click', '.gtm-save-search-btn', (event) => {\n event.preventDefault()\n $(event.currentTarget).trigger(EstatelyEvents.SAVE_SEARCH.REQUEST)\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nexport default class SaveSearchForm extends ComponentLoader {\n static mount() {\n $(document).on('submit', '.gtm-save-search-form', this.onSubmit)\n $(document).on(EstatelyEvents.SAVE_SEARCH.ERROR, '.gtm-save-search-form', this.onError)\n }\n\n static onSubmit(event) {\n event.preventDefault()\n const $form = $(event.currentTarget)\n\n $form.find('.show-error').text('').addClass('hide') // Clear errors\n $form.trigger(EstatelyEvents.SAVE_SEARCH.REQUEST)\n }\n\n static onError(event, error) {\n const $form = $(event.currentTarget)\n\n $form.find('.show-error')\n .append($(error.responseText).html())\n .removeClass('hide')\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\n\nconst seconds = ms => Math.floor(ms / 1000)\nconst minutes = ms => Math.floor(ms / 60000)\nconst hours = ms => Math.floor(ms / 3600000)\nconst days = ms => Math.floor(ms / 86400000)\n\nconst pluralize = (count, singular) => `${count} ${singular}${count === 1 ? '' : 's'}`\n\nexport function timeSinceDate(date) {\n const ms = new Date().valueOf() - date.valueOf()\n\n switch (true) {\n case (days(ms) > 0): return pluralize(days(ms), 'day')\n case (hours(ms) > 0): return pluralize(hours(ms), 'hour')\n case (minutes(ms) > 0): return pluralize(minutes(ms), 'minute')\n default: return pluralize(seconds(ms), 'second')\n }\n}\n\nexport default class TimeSinceDate extends ComponentLoader {\n static mount() {\n $(document).on(EstatelyEvents.AJAX_CONTENT.LOADED, (event) => {\n const newContent = event.currentTarget\n this.initialize(newContent)\n })\n }\n\n static initialize(root = document) {\n root.querySelectorAll('.js-time-since-today').forEach((timestamp) => {\n const iso8601 = timestamp.dataset.listingCreatedAt.trim()\n const date = new Date(iso8601)\n\n /* eslint-disable no-param-reassign */\n timestamp.textContent = timeSinceDate(date)\n timestamp.title = date.toLocaleString()\n /* eslint-enable */\n })\n }\n}\n","import ComponentLoader from 'legacy/lib/ComponentLoader'\n\nexport default class GAReporter extends ComponentLoader {\n static initialize() {\n if (SERVER_SIDE) return\n const analytics = window.estately.analytics\n analytics.gtm_data_layer.forEach(event => this.pushEventToGTM(event))\n }\n\n // Pushes events to google tag manager\n static pushEventToGTM(dataLayer) {\n if ('event' in dataLayer) {\n window.dataLayer = window.dataLayer || []\n window.dataLayer.push(dataLayer)\n }\n }\n}\n","/*!\n * Copyright 2015 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing\n * permissions and limitations under the License.\n */\n\n/*\n * @see https://developers.google.com/web/updates/2015/08/using-requestidlecallback\n */\n\n// TODO: We can delete this entire file once Safari support improves\n// See https://caniuse.com/requestidlecallback\n\n// TODO: Replace with `globalThis` when browser support improves\n// See https://caniuse.com/mdn-javascript_builtins_globalthis\nconst windowOrGlobal = global || window\n\nexport const requestIdleCallback = windowOrGlobal.requestIdleCallback || (\n callback => setTimeout(\n () => {\n const start = performance.now()\n\n callback({\n didTimeout: false,\n timeRemaining: () => Math.max(0, 50 - (performance.now() - start)),\n })\n },\n 1,\n )\n)\n\nexport const cancelIdleCallback = windowOrGlobal.requestIdleCallback || (\n id => clearTimeout(id)\n)\n\nexport default requestIdleCallback\n"],"names":["ComponentLoader","register","this","mount","document","readyState","addEventListener","initialize","childComponents","forEach","component","get","name","value","JSCookies","JSON","parse","set","maxAge","opts","arguments","length","undefined","stringify","toString","remove","AJAX_CONTENT","LOADED","SAVE_SEARCH","REQUEST","SUCCESS","ERROR","STATE_CHANGE","SHOWING_REQUEST","LOGIN","PROPERTY_SAVE","USER","WILL_INTERACT","ModalFocus","captureTabEvent","$","keydown","e","key","$focusableContent","target","closest","find","not","firstFocusableElement","lastFocusableElement","shiftKey","preventDefault","focus","onceInView","selector","callback","each","_i","el","matches","one","event","lazyLoadWhenInView","importer","async","default","Component","lazyLoad","redirectToSignupUrl","signupType","signupPath","getElementById","href","window","location","assign","AjaxLoadedContent","onLazyLoad","$el","url","dataset","ajaxLoadUrl","load","newContent","trigger","EstatelyEvents","ClearableInput","querySelectorAll","clearable","constructor","super","_defineProperty","valuePresent","$clearable","val","toggleClass","$clearBtn","siblings","render","on","onClear","NativeShareButton","navigator","share","onClick","data","currentTarget","querySelector","text","GAReporter","pushEventToGTM","SearchAutoComplete","input","onUserWillInteract","onBlur","_SearchAutoComplete","source","minLength","appendTo","select","ui","item","submit","attr","id","close","$target","removeAttr","_renderItem","ul","suggestion","state_abbreviation","label","oneLineTrim","append","_renderMenu","items","$listId","_renderItemData","prepend","stopPropagation","Autocomplete","SETTINGS","OVERRIDES","moveLiveRegion","addClass","empty","SearchForm","onSubmit","searchPath","estately","is_mobile","params","URLSearchParams","FormData","DefaultPage","jQuery","Header","Notifications","SaveSearch","SaveSearchButton","SaveSearchForm","TimeSinceDate","Accordion","click","onToggle","accordion","panel","getAttribute","$accordionBody","setAttribute","removeClass","onLogin","onSearchBarToggleClick","onSitewideHeaderNavigationClick","onSidebarNestedModalClick","onLogoutItemClick","_Header","$headerNavContent","pathname","$headerSearch","toggleOpen","is","off","$sidebar","delegateTarget","hasClass","modal","localStorage","removeItem","cityNameCookie","Cookies","cityName","split","replaceAll","_","link","currentPrefix","_index","replace","newHref","$notificationsBtn","$notifications","$unreadCircle","notificationsUrl","lazyUpdateNotifications","onSaveSearchFromNotifications","onOpen","path","requestIdleCallback","updateUnreadCount","fetchNotifications","is_user_logged_in","unread","renderUnreadCircle","count","requestAnimationFrame","sessionStorage","setItem","hide","show","_Notifications","content","html","post","onRequest","onSuccess","restoreSaveSearchFromCookie","save","element","formData","modalImport","modalContent","ajax","type","processData","contentType","error","normalizeSaveSearchData","tagName","has","canonicalURL","authenticateFirst","COOKIE","Object","fromEntries","savedSearchParams","entries","_ref","_SaveSearch","requestingElement","SaveSearchConfirmationModal","onError","$form","responseText","seconds","ms","Math","floor","minutes","hours","days","pluralize","singular","timeSinceDate","date","Date","valueOf","timestamp","iso8601","listingCreatedAt","trim","textContent","title","toLocaleString","analytics","gtm_data_layer","dataLayer","push","windowOrGlobal","global","setTimeout","start","performance","now","didTimeout","timeRemaining","max"],"sourceRoot":""}