{"version":3,"file":"google_street_view-DITloDAc.js","sources":["../../../app/assets/javascripts/concepts/listings/pictures_and_map_browser/with_toggle/google_street_view.ts"],"sourcesContent":["\nimport $ from \"jquery\"\nimport Promise from \"plugins/bluebird\"\nimport isBlankStr from \"underscore.string/isBlank\"\n\nimport DomIdGenerator from \"app/utils/dom_id_generator\"\n\nimport GoogleMaps_asyncLoad from \"app/google-maps/index\"\n\nimport SwitchMode from \"components/widgets/switch_mode\"\nimport DataRetriever from \"app/data_retriever\"\n\nimport Notifier from \"app/notifier\"\nimport {\n captureException,\n} from \"app/error_reporting\"\n\nimport I18n from \"plugins/i18n-js\"\n\n\nconst RejectionReasons = {\n FAILURE_CASE_HANDLED: \"FAILURE_CASE_HANDLED\",\n}\n\n\nlet _retained_panoramas_per_dom_id = {} as {\n [key: string]: google.maps.StreetViewPanorama\n}\n\n\ninterface InputSelector {\n main?: string | JQuery,\n switch?: string,\n street_view?: string,\n}\n\ninterface Selector {\n main: string | JQuery,\n switch: string,\n street_view: string,\n}\n\nconst default_selector: Selector = {\n main: \".cell--listings--pictures-and-map-browser--with-toggle\",\n switch: \".cell--listings--pictures-and-map-browser--with-toggle__switch--street-view\",\n street_view: \".cell--listings--pictures-and-map-browser--with-toggle__content-for-mode-street .js-google-street-view\",\n}\n\n\nconst init = (selector?: InputSelector) => {\n const sele: Selector = Object.assign({}, default_selector, selector)\n if (DataRetriever.get(\"current-location-country-code-is-china\")) { return }\n\n const $el = $(sele.main)\n\n $el.each((_idx, el_in_each) => {\n const $el_in_each = $(el_in_each)\n const $switch = $el_in_each.find(sele.switch)\n const $street_view_box = $el_in_each.find(sele.street_view)\n const street_view_box = $street_view_box[0]\n\n let dom_id = street_view_box.id\n if (isBlankStr(street_view_box.id)) {\n dom_id = DomIdGenerator.generateNewId()\n street_view_box.setAttribute(\"id\", dom_id)\n }\n\n $switch\n .on(\"click\", () => {\n // The mode switching won't be done immediately\n // So we subscribe to the event instead\n //\n // Don't use `setTimeout`\n SwitchMode.once(\"switch_mode:mode_switched\", () => {\n // Only create street view object when visible\n if (! $street_view_box.is(\":visible\")) { return }\n\n const existing_panorama = _retained_panoramas_per_dom_id[dom_id]\n\n const panorama_promise: Promise = Promise.resolve()\n .then(() => {\n if (existing_panorama != null) {\n return existing_panorama\n }\n\n return GoogleMaps_asyncLoad()\n .then((google_maps) => {\n // # `getAttribute` is used instead of `dataset` for better compatibility\n // # Both return string\n const lat = street_view_box.getAttribute(\"data-lat\")\n const lng = street_view_box.getAttribute(\"data-lng\")\n if (typeof lat !== \"string\") { throw new Error(\"lat is not string\") }\n if (typeof lng !== \"string\") { throw new Error(\"lng is not string\") }\n\n const lat_num = parseFloat(lat)\n const lng_num = parseFloat(lng)\n\n const latlng_obj = new google_maps.LatLng(lat_num, lng_num)\n\n const sv = new google_maps.StreetViewService()\n\n return new Promise((resolve, reject) => {\n // Default is 50m\n sv.getPanorama({location: latlng_obj, radius: 50}, (data, status) => {\n const location_pano = (data == null || data.location == null) ? null : data.location.pano\n if (location_pano == null) {\n Notifier.showError(I18n.t(\"js.app.street_view.errors.street_view_unavailable_at_this_location\"))\n reject(RejectionReasons.FAILURE_CASE_HANDLED)\n return\n }\n\n // eslint-disable-next-line no-undef\n if (status === google_maps.StreetViewStatus.OK) {\n const new_panorama = new google_maps.StreetViewPanorama(\n street_view_box,\n )\n new_panorama.setPano(location_pano)\n new_panorama.setPov({\n heading: 0,\n pitch: 0,\n })\n\n _retained_panoramas_per_dom_id[dom_id] = new_panorama\n\n // return new_panorama\n return new_panorama\n }\n else {\n Notifier.showError(I18n.t(\"js.app.street_view.errors.street_view_unavailable_at_this_location\"))\n reject(RejectionReasons.FAILURE_CASE_HANDLED)\n }\n })\n })\n })\n })\n\n panorama_promise.then((panorama) => {\n panorama.setVisible(true)\n })\n .catch((reason_or_error) => {\n if (reason_or_error === RejectionReasons.FAILURE_CASE_HANDLED) {\n return\n }\n\n captureException(reason_or_error)\n })\n .done()\n })\n })\n })\n}\n\n// # Call this function to avoid memory leak\n// # panorama objects are kept on initialization on purpose\n// # We need to remove those objects manually\n// # You have to call this function, otherwise there will be memory leak.\nconst removeAllPanoramas = () => {\n _retained_panoramas_per_dom_id = {}\n}\n\nconst _setAllPanoramaVisible = () => {\n Object.values(_retained_panoramas_per_dom_id).forEach((panorama) => {\n panorama.setVisible(true)\n })\n}\n\nconst onLoad = () => {\n SwitchMode.on(\"switch_mode:mode_switched\", () => {\n _setAllPanoramaVisible()\n })\n}\n\nexport default {\n init,\n removeAllPanoramas,\n onLoad,\n}\n\n\n\n\n\n\n\n\n\n"],"names":["RejectionReasons","_retained_panoramas_per_dom_id","default_selector","init","selector","sele","DataRetriever","$","_idx","el_in_each","$el_in_each","$switch","$street_view_box","street_view_box","dom_id","isBlankStr","DomIdGenerator","SwitchMode","existing_panorama","Promise","GoogleMaps_asyncLoad","google_maps","lat","lng","lat_num","lng_num","latlng_obj","sv","resolve","reject","data","status","location_pano","Notifier","I18n","new_panorama","panorama","reason_or_error","captureException","removeAllPanoramas","_setAllPanoramaVisible","onLoad","Listings_PicturesAndMapBrowser_WithToggle_GoogleStreetView"],"mappings":"+XAoBA,MAAMA,EAAmB,CACvB,qBAAsB,sBACxB,EAGA,IAAIC,EAAiC,CAAC,EAiBtC,MAAMC,EAA6B,CACjC,KAAc,yDACd,OAAc,8EACd,YAAc,wGAChB,EAGMC,EAAQC,GAA6B,CACzC,MAAMC,EAAiB,OAAO,OAAO,CAAA,EAAIH,EAAkBE,CAAQ,EAC/D,GAAAE,EAAc,IAAI,wCAAwC,EAAK,OAEvDC,EAAEF,EAAK,IAAI,EAEnB,KAAK,CAACG,EAAMC,IAAe,CACvB,MAAAC,EAAcH,EAAEE,CAAU,EAC1BE,EAAUD,EAAY,KAAKL,EAAK,MAAM,EACtCO,EAAmBF,EAAY,KAAKL,EAAK,WAAW,EACpDQ,EAAkBD,EAAiB,CAAC,EAE1C,IAAIE,EAASD,EAAgB,GACzBE,EAAWF,EAAgB,EAAE,IAC/BC,EAASE,EAAe,cAAc,EACtBH,EAAA,aAAa,KAAMC,CAAM,GAI1CH,EAAA,GAAG,QAAS,IAAM,CAKNM,EAAA,KAAK,4BAA6B,IAAM,CAEjD,GAAI,CAAEL,EAAiB,GAAG,UAAU,EAAK,OAEnC,MAAAM,EAAoBjB,EAA+Ba,CAAM,EAEGK,EAAQ,QAAQ,EACjF,KAAK,IACAD,GAAqB,KAChBA,EAGFE,EAAqB,EAC3B,KAAMC,GAAgB,CAGf,MAAAC,EAAMT,EAAgB,aAAa,UAAU,EAC7CU,EAAMV,EAAgB,aAAa,UAAU,EAC/C,GAAA,OAAOS,GAAQ,SAAkB,MAAA,IAAI,MAAM,mBAAmB,EAC9D,GAAA,OAAOC,GAAQ,SAAkB,MAAA,IAAI,MAAM,mBAAmB,EAE5D,MAAAC,EAAU,WAAWF,CAAG,EACxBG,EAAU,WAAWF,CAAG,EAExBG,EAAa,IAAIL,EAAY,OAAOG,EAASC,CAAO,EAEpDE,EAAK,IAAIN,EAAY,kBAE3B,OAAO,IAAIF,EAAQ,CAACS,EAASC,IAAW,CAEnCF,EAAA,YAAY,CAAC,SAAUD,EAAY,OAAQ,EAAE,EAAG,CAACI,EAAMC,IAAW,CAC7D,MAAAC,EAAiBF,GAAQ,MAAQA,EAAK,UAAY,KAAQ,KAAOA,EAAK,SAAS,KACrF,GAAIE,GAAiB,KAAM,CACzBC,EAAS,UAAUC,EAAK,EAAE,oEAAoE,CAAC,EAC/FL,EAAO7B,EAAiB,oBAAoB,EAC5C,MAAA,CAIE,GAAA+B,IAAWV,EAAY,iBAAiB,GAAI,CACxC,MAAAc,EAAe,IAAId,EAAY,mBACnCR,CACF,EACA,OAAAsB,EAAa,QAAQH,CAAa,EAClCG,EAAa,OAAO,CAClB,QAAU,EACV,MAAU,CAAA,CACX,EAEDlC,EAA+Ba,CAAM,EAAIqB,EAGlCA,CAAA,MAGPF,EAAS,UAAUC,EAAK,EAAE,oEAAoE,CAAC,EAC/FL,EAAO7B,EAAiB,oBAAoB,CAC9C,CACD,CAAA,CACF,CAAA,CACF,CACF,EAEgB,KAAMoC,GAAa,CAClCA,EAAS,WAAW,EAAI,CAAA,CACzB,EACA,MAAOC,GAAoB,CACtBA,IAAoBrC,EAAiB,sBAIzCsC,EAAiBD,CAAe,CACjC,CAAA,EACA,KAAK,CAAA,CACP,CAAA,CACF,CAAA,CACF,CACH,EAMME,EAAqB,IAAM,CAC/BtC,EAAiC,CAAC,CACpC,EAEOuC,EAAyB,IAAM,CACpC,OAAO,OAAOvC,CAA8B,EAAE,QAASmC,GAAa,CAClEA,EAAS,WAAW,EAAI,CAAA,CACzB,CACH,EAEMK,EAAS,IAAM,CACRxB,EAAA,GAAG,4BAA6B,IAAM,CACxBuB,EAAA,CAAA,CACxB,CACH,EAEeE,EAAA,CACb,KAAAvC,EACA,mBAAAoC,EACA,OAAAE,CACF"}