{"version":3,"file":"manager-44cq2OBZ.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<LoadOptions>\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<ListModeOptions>\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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"}