@feltmaps/js-sdk
Version:
An SDK for Felt maps
2 lines (1 loc) • 3.84 kB
JavaScript
function r(e,m){return({handler:n,options:i})=>{let s=new MessageChannel,o=crypto.randomUUID();return e.postMessage({type:"felt.addListener",event:i?{eventName:m,id:o,options:i}:{eventName:m,id:o}},"*",[s.port2]),s.port1.onmessage=a=>{n(a.data)},()=>{s.port1.onmessage=null,s.port1.close(),s.port2.close(),e.postMessage({type:"felt.removeListener",id:o},"*")}}}function t(e,m){return n=>{let i=new MessageChannel;return e.postMessage({type:m,params:n},"*",[i.port2]),new Promise((s,o)=>{i.port1.onmessage=a=>{a.data&&"__error__"in a.data?o(new Error(a.data.__error__)):s(a.data),i.port1.close(),i.port2.close()}})}}var g=e=>({getElement:t(e,"getElement"),getElementGeometry:t(e,"getElementGeometry"),getElements:t(e,"getElements"),setElementGroupVisibility:t(e,"setElementGroupVisibility"),getElementGroup:t(e,"getElementGroup"),getElementGroups:t(e,"getElementGroups"),onElementChange:r(e,"onElementChange"),onElementGroupChange:r(e,"onElementGroupChange")});var u=e=>({onPointerClick:r(e,"onPointerClick"),onPointerMove:r(e,"onPointerMove")});var C=e=>({getLayer:t(e,"getLayer"),getLayers:t(e,"getLayers"),setLayerVisibility:t(e,"setLayerVisibility"),setLayerStyle:t(e,"setLayerStyle"),onLayerChange:r(e,"onLayerChange"),getLayerGroup:t(e,"getLayerGroup"),getLayerGroups:t(e,"getLayerGroups"),setLayerGroupVisibility:t(e,"setLayerGroupVisibility"),onLayerGroupChange:r(e,"onLayerGroupChange"),getLegendItem:t(e,"getLegendItem"),getLegendItems:t(e,"getLegendItems"),setLegendItemVisibility:t(e,"setLegendItemVisibility"),onLegendItemChange:r(e,"onLegendItemChange"),getLayerFilters:t(e,"getLayerFilters"),setLayerFilters:t(e,"setLayerFilters"),getRenderedFeatures:t(e,"getRenderedFeatures")});var h=e=>({onSelectionChange:r(e,"onSelectionChange"),getSelection:t(e,"getSelection"),selectFeature:t(e,"selectFeature"),clearSelection:t(e,"clearSelection")});var L=e=>({updateUiControls:t(e,"updateUiControls"),setOnMapInteractionsUi:t(e,"setOnMapInteractionsUi")});var v=e=>({getViewport:t(e,"getViewport"),setViewport:t(e,"setViewport"),fitViewportToBounds:t(e,"fitViewportToBounds"),onViewportMove:r(e,"onViewportMove"),onViewportMoveEnd:r(e,"onViewportMoveEnd"),onMapIdle:r(e,"onMapIdle")});function E(e){return{iframe:null,...v(e),...L(e),...C(e),...g(e),...h(e),...u(e)}}var P={embed(e,m,n){let i={uiControls:{showLegend:!0,cooperativeGestures:!0,fullScreenButton:!0,geolocation:!1,zoomControls:!0,scaleBar:!0},initialViewport:void 0,origin:"https://felt.com"},s=n?.origin??i.origin,o=new URL(`${s}/embed/map/${m}`),a={showLegend:"legend",cooperativeGestures:"cooperativeGestures",fullScreenButton:"link",geolocation:"geolocation",zoomControls:"zoomControls",scaleBar:"scaleBar"},y={...i.uiControls,...n?.uiControls};for(let[p,d]of F(y))d!=null&&o.searchParams.set(a[p],d?"1":"0");if(n?.token&&o.searchParams.set("token",n.token),n?.initialViewport){let p=n.initialViewport;o.searchParams.set("loc",`${p.center.latitude},${p.center.longitude},${p.zoom}z`)}let c=e.tagName==="IFRAME",l=c?e:e.ownerDocument.createElement("iframe");return l.src=o.toString(),c||(l.style.width="100%",l.style.height="100%",l.style.border="none",l.style.margin="0",e.appendChild(l)),l.referrerPolicy="strict-origin-when-cross-origin",new Promise((p,d)=>{l.addEventListener("load",()=>{l.contentWindow==null?d(new Error("Failed to load Felt map")):p(l.contentWindow)},{once:!0})}).then(P.connect).then(p=>(Object.defineProperties(p,{iframe:{value:l,writable:!1,configurable:!1}}),p))},connect(e){let m=E(e);return new Promise((n,i)=>{let s=setTimeout(()=>{i(new Error("Failed to load Felt map")),clearInterval(a)},5e3),o=new MessageChannel,a=setInterval(()=>{e.postMessage({type:"felt.ready"},"*",[o.port2])},100);o.port1.onmessage=y=>{y.data===!0&&(clearInterval(a),clearTimeout(s),o.port1.close(),o.port2.close(),n(m))}})}},F=Object.entries;export{P as Felt};