{"version":3,"file":"manager-BAzt0CFV.js","sources":["../../../app/assets/javascripts/app/map/mode/modes.ts","../../../app/assets/javascripts/app/map/mode/track.ts","../../../app/assets/javascripts/app/map/mode/manager.ts"],"sourcesContent":["\n\n/* eslint-disable no-unused-vars */\nenum MODES {\n map = \"map\",\n list = \"list\",\n card = \"card\",\n unknown = \"unknown\",\n}\n/* eslint-enable no-unused-vars */\n\nexport {\n MODES as MapModes,\n}\n","\nimport { EventEmitter } from \"events\"\nimport u from \"umbrellajs\"\n\nimport PageView from \"app/tracking/google/page_view\"\nimport PageInstance from \"app/page_instance/index\"\n\n\n// Just using existing element, no other special reason for choosing it\n// But don't change once setup, GTM related\nconst getDataContainerElement = () => {\n return u(\"#app-data-container\")\n}\n/* eslint-disable no-unused-vars */\nenum CurrentModeTrackingValues {\n MAP = \"map\",\n LIST = \"list\",\n CARD = \"hybrid\",\n}\n/* eslint-enable no-unused-vars */\nconst CurrentModeTracking = {\n ATTR_NAME: \"current-listing-search-page-map-or-list-mode\",\n\n ATTR_VALUES: CurrentModeTrackingValues,\n}\n\n\nconst ee = new EventEmitter()\n\nee.on(\"card_mode\", () => {\n PageView.track(track_path(\"/mode/card\"))\n\n setCurrentModeAttrForTracking(CurrentModeTracking.ATTR_VALUES.CARD)\n})\n\nee.on(\"map_mode\", () => {\n PageView.track(track_path(\"/mode/map\"))\n\n setCurrentModeAttrForTracking(CurrentModeTracking.ATTR_VALUES.MAP)\n})\n\nee.on(\"list_mode\", () => {\n PageView.track(track_path(\"/mode/list\"))\n\n setCurrentModeAttrForTracking(CurrentModeTracking.ATTR_VALUES.LIST)\n})\n\n\n// region Implementation Details\nfunction track_path(mode_path: string) {\n const type_path = PageInstance.isRentalPage() ?\n \"/pages/city-listing-search-pages-for-rent\" :\n \"/pages/city-listing-search-pages-for-sale\"\n\n return [\n \"/fake-path\",\n \"/apps/spacious-web-app\",\n type_path,\n mode_path,\n ].join(\"\")\n}\n\nfunction setCurrentModeAttrForTracking(val: CurrentModeTrackingValues): void {\n const $data_container_el = getDataContainerElement()\n\n $data_container_el.attr(CurrentModeTracking.ATTR_NAME, val)\n}\n// endregion Implementation Details\n\n\nexport default ee\n","\nimport u from \"umbrellajs\"\nimport Cookies from \"plugins/cookies-js\"\nimport { EventEmitter } from \"events\"\n\nimport DataRetriever from \"app/data_retriever\"\n\nimport { MapModes as MODES } from \"./modes\"\nimport track from \"./track\"\n\n\n// from app/controllers/concerns/shared/controller_mixins/with_listing_search_page_map_or_list_mode.rb\nconst Cookie_key = \"current_listing_search_page_map_or_list_mode\"\n/* eslint-disable no-unused-vars */\nenum HTML_MAP_MODE_CLASS {\n ACTIVATED = \"map-enabled\",\n ALLOWED = \"map-allowed\",\n}\nenum HTML_CARD_MODE_CLASS {\n ACTIVATED = \"card-enabled\",\n}\n/* eslint-enable no-unused-vars */\nconst $html = u(\"html\")\nconst $body = u(\"body\")\n\n\n// region `load` options\n\ninterface LoadOptions {\n trigger_list_mode_data_load: boolean,\n}\ntype InputLoadOptions = Partial\nconst DEFAULT_LOAD_OPTIONS: LoadOptions = {\n trigger_list_mode_data_load: true,\n}\n\n// endregion `load` options\n\n// region `toListMode` options\n\ninterface ListModeOptions {\n trigger_data_load: boolean,\n}\ntype InputListModeOptions = Partial\nconst DEFAULT_LIST_MODE_OPTIONS: ListModeOptions = {\n trigger_data_load: true,\n}\n\n// endregion `toListMode` options\n\n\nclass MapModeClass extends EventEmitter {\n private readonly default_option: MODES\n private mode: MODES\n\n constructor() {\n super()\n\n this.default_option = DataRetriever.hasClass(HTML_MAP_MODE_CLASS.ACTIVATED) ? MODES.card : MODES.list\n this.mode = this.default_option\n }\n\n public load(options: InputLoadOptions = {}){\n const merged_options: LoadOptions = Object.assign({}, DEFAULT_LOAD_OPTIONS, options)\n\n if ( DataRetriever.hasClass(HTML_MAP_MODE_CLASS.ALLOWED) ){\n if (this.getRememberedMode() === MODES.card){\n this.toCardMode()\n }\n else {\n this.toListMode({\n trigger_data_load: merged_options.trigger_list_mode_data_load,\n })\n }\n }\n else {\n this.toListMode({\n trigger_data_load: merged_options.trigger_list_mode_data_load,\n })\n }\n }\n public getShouldPersistChangedValue(){\n return DataRetriever.get(\"listing-search-page-map-or-list-mode-memory-enabled\") || null\n }\n public getMapOrCardModeActivated(){\n return [MODES.map, MODES.card].includes(this.getCurrentMode())\n }\n public getListModeActivated(){\n return [MODES.list].includes(this.getCurrentMode())\n }\n public getCurrentMode(){\n return this.getRememberedMode()\n }\n public getRememberedMode(): MODES {\n if ( ! Cookies.enabled){\n return this.default_option\n }\n\n const value = Cookies.get(Cookie_key)\n if ( !Object.values(MODES).includes(value) ){\n return this.default_option\n }\n\n // Deprecated value transition\n if ( value === MODES.map ){ return MODES.card }\n\n return value as MODES\n }\n public toListMode(options: InputListModeOptions = {}){\n const merged_options: ListModeOptions = Object.assign({}, DEFAULT_LIST_MODE_OPTIONS, options);\n\n // `body` might also have class names set on server side\n // So need to handle it when removing\n [$html, $body].forEach((u_el) => {\n u_el.removeClass(HTML_MAP_MODE_CLASS.ACTIVATED)\n u_el.removeClass(HTML_CARD_MODE_CLASS.ACTIVATED)\n })\n this.setMode(MODES.list)\n if (merged_options.trigger_data_load) {\n this.emit(\"list_mode\")\n }\n track.emit(\"list_mode\")\n this.emit(\"mode_change\")\n }\n public toCardMode(){\n [$html, $body].forEach((u_el) => {\n u_el.addClass(HTML_MAP_MODE_CLASS.ACTIVATED)\n u_el.addClass(HTML_CARD_MODE_CLASS.ACTIVATED)\n })\n this.setMode(MODES.card)\n this.emit(\"card_mode\")\n track.emit(\"card_mode\")\n this.emit(\"mode_change\")\n\n // Fix/workaround visual bug when mode switched after scrolled-down in list mode\n window.scrollTo(0, 0)\n }\n public setMode(mode: MODES){\n if (! Cookies.enabled) { return }\n // Sometimes we want to disable it\n if (! this.getShouldPersistChangedValue()){ return }\n // Reject invalid value\n if (! Object.values(MODES).includes(mode)) { return }\n\n this.mode = mode\n Cookies.set(Cookie_key, mode, {\n // expire in 1 week\n expires: 7 * 24 * 60 * 60,\n })\n }\n}\n\n\nconst MapModeSingleton = new MapModeClass()\n\nexport {\n MapModeSingleton,\n}\nexport default MapModeSingleton\n"],"names":["MODES","getDataContainerElement","u","CurrentModeTrackingValues","CurrentModeTracking","ee","EventEmitter","PageView","track_path","setCurrentModeAttrForTracking","mode_path","PageInstance","val","Cookie_key","$html","$body","DEFAULT_LOAD_OPTIONS","DEFAULT_LIST_MODE_OPTIONS","MapModeClass","DataRetriever","options","merged_options","Cookies","value","u_el","track","mode","MapModeSingleton"],"mappings":"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"}