/* COPYRIGHT Esri - https://js.arcgis.com/5.1.0/LICENSE.txt */
import{__decorate as p}from"tslib";import{createTask as e}from"../core/asyncUtils.js";import t from"../core/Error.js";import{generatorFlat as o,generatorFromPromises as s}from"../core/generatorUtils.js";import has from"../core/has.js";import i from"../core/Logger.js";import{allSettledValues as r,throwIfAborted as u,wrapAbortWithTimeout as n}from"../core/promiseUtils.js";import{watch as a,syncAndInitial as h,whenOnce as c}from"../core/reactiveUtils.js";import{property as l,subclass as m}from"../core/accessorSupport/decorators.js";import{addPopup as d,openPopupWithViewClick as f,isPopup as g,isPopupElement as w,openPopupWithOptions as y,closePopup as P}from"./popupAdapter.js";import{ViewEventPriorities as E}from"./input/InputManager.js";const _=_=>{const T=_;let j=class extends T{constructor(...p){super(...p),this._popupSetupTask=null,this.popupEnabled=!0,this.popup={}}initialize(){this.addHandles([a(()=>[this.ui,this.popup,this.popupElement],([p,e,t],o)=>{const[s,i,r]=o??[];d(this,[p,e,t],[s,i,r])},h),this.on("click",p=>{this.popup&&this.popupEnabled&&("mouse"!==p.pointerType||0===p.button)&&f(this,p)},E.WIDGET)]),c(()=>this.ready&&this.popupEnabled&&!this.updating).then(()=>import("../widgets/Popup.js"))}destroy(){this.destroyed||this.closePopup()}get popup(){return this._get("popup")}set popup(p){this._set("popup",p)}async openPopup(p){if(g(this.popup))return this.popup.open(p);if(this.popupElement&&w(this.popupElement))this.popupElement.open(p).catch(()=>{});else try{if(await this.setupPopup(),!this.popup)return void i.getLogger(this).error(new t("view:null-popup","Popup is null and can't be opened"));y(this,p)}catch{}}closePopup(){this._popupSetupTask?.abort(),P(this.popup,this.popupElement)}async*fetchPopupFeatures(p,e){await this.when();const t=await this._getPopupHits(p,e),i=this._popupHitsToFeatures(p,t.hits,e);yield*o(s(i,e),e)}async fetchPopupFeaturesLegacy(p,e){await this.when();const t=await this._getPopupHits(p,e),o=this._popupHitsToFeatures(p,t.hits,e);return{pendingFeatures:o,allGraphicsPromise:r(o).then(p=>p.filter(p=>!!p).flat()),location:t.location}}async setupPopup(){if(this._popupSetupTask?.abort(),this.popup&&!g(this.popup))return this._popupSetupTask=e(async p=>{if(!this.popupEnabled||!w(this.popupElement))if(this.dependencies.popup&&"function"==typeof this.dependencies.popup)await this.dependencies.popup(),u(p),customElements.get("arcgis-popup")||i.getLogger(this).error(new t("view:undefined-popup-element","`arcgis-popup` custom element is undefined and can't be opened")),this.popupElement=document.createElement("arcgis-popup");else{const{default:e}=await import("../widgets/Popup.js");if(u(p),!this.popup||g(this.popup))return;const t=this.popup;if("open"in t||"close"in t){const{open:p,close:o,...s}=t;this.popup=new e({...s})}else this.popup=new e(t)}}),this._popupSetupTask.promise}_popupHitsToFeatures(p,e,t){const o=[],s=[];let i=!1;const r=n(t,has("popup-view-fetch-timeout")??V),u=p=>{const e=new v(p);return s.push(e),o.push(e.promise),e},a=p=>{const e=s.at(-1);return e&&e.layerView===p&&!i?e:u(p)};for(const n of e)if("graphic"in n){a(n.layerView).graphics.push(n.graphic),i=!1}else o.push(n.layerView.fetchPopupFeaturesAtTarget(p,n.geometry,r)),i=!0;return s.forEach(p=>p.resolve(r)),o}async _getPopupHits(p,e){const{hits:t,location:o}=await this.popupHitTest(p);u(e);const s=[];for(const i of t)if("graphic"in i){if(this._isValidPopupGraphic(i.graphic,e)){const p=this._isFeaturePatchingLayerView(i.layerView)?i.layerView:void 0;s.push({graphic:i.graphic,layerView:p})}}else s.push({geometry:i.geometry,layerView:i.layerView});return{hits:s,location:o}}_isValidPopupGraphic(p,e){return p&&!!p.getEffectivePopupTemplate(e?.defaultPopupTemplateEnabled)}_isFeaturePatchingLayerView(p){return!p||(!("layer"in p)||!p.suspended)&&"patchFeaturesForPopup"in p}};return p([l()],j.prototype,"popup",null),p([l()],j.prototype,"popupElement",void 0),p([l()],j.prototype,"popupEnabled",void 0),j=p([m("esri.views.PopupView")],j),j};class v{constructor(p){this.layerView=p,this._resolver=Promise.withResolvers(),this.graphics=[]}get promise(){return this._resolver.promise}resolve(p){const{layerView:e,graphics:t,_resolver:o}=this;if(!e)return o.resolve(t),o.promise;let s;return e.patchFeaturesForPopup(t,p).catch(p=>(s=p,null)).then(p=>{p?o.resolve(p):o.reject(s)}),o.promise}}const V=5e3;export{_ as PopupView};
