{"version":3,"sources":["components/Layout.js","components/ItemPin.js","components/Map.js","App.js","registerServiceWorker.js","index.js"],"names":["Layout","Container","id","this","props","children","Component","displayName","name","pinStyle","cursor","fill","stroke","colors","ItemPin","getColor","bind","rate","size","onClick","color","opacity","style","width","height","display","justifyContent","alignItems","viewBox","d","textAlign","position","bottom","fontWeight","PureComponent","styles","clusterMarker","borderRadius","backgroundColor","border","marker","searchButtonOpenStyle","top","left","background","padding","borderTopLeftRadius","borderTopRightRadius","borderTop","borderLeft","borderRight","zIndex","searchButtonClosedStyle","searchResultsDivStyle","borderBottomLeftRadius","borderBottomRightRadius","borderBottom","maxHeight","overflowY","searchInputStyle","fontSize","outline","Map","ReactMapboxGl","accessToken","process","SpoteeMap","coordinates","pointCount","getLeaves","key","toString","clusterClick","zoom","state","map","transform","_zoom","filter","setState","popup","undefined","centered","searching","flyTo","center","curve","maxDuration","essential","itemClick","item","geometry","mapMoveEnd","Math","abs","_center","lng","lat","onMapActionEnd","event","items","popupInfo","universeId","match","params","suggestions","timeout","getItems","then","result","offset","properties","title","fetch","response","json","data","console","log","filteredItems","toLowerCase","includes","geojson","type","features","longitude","latitude","renderPopup","searchInputWidth","searchInputPadding","searchCloseVisibility","resultDivDisplay","searchButtonStyle","openSearchButtonColor","clearSearchButtonColor","suggestionContent","length","margin","fontStyle","className","data-item","containerStyle","onMoveEnd","onDblClick","onDragEnd","onTouchEnd","onStyleLoad","ClusterMarkerFactory","feature","data-feature","score","ref","input","searchInput","value","onChange","e","target","focus","right","visibility","App","exact","path","component","window","location","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","error","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","URL","origin","addEventListener","status","headers","get","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"ySAGaA,EAAb,iLAIQ,OACI,6BACI,kBAACC,EAAA,EAAD,CAAWC,GAAG,OACTC,KAAKC,MAAMC,eAPhC,GAA4BC,aAAfN,EACFO,YAAcP,EAAOQ,K,6CCE1BC,EAAW,CACbC,OAAQ,UACRC,KAAM,OACNC,OAAQ,QAINC,EAAS,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,WAElDC,E,YACjB,aAAe,IAAD,8BACV,+CACKC,SAAW,EAAKA,SAASC,KAAd,gBAFN,E,sEAKLC,GACL,OAAKA,EAGEJ,EAAOI,GAbA,S,+BAgBR,IAAD,EAC8Bd,KAAKC,MADnC,IACCc,YADD,MACQ,GADR,EACYC,EADZ,EACYA,QAASF,EADrB,EACqBA,KACpBG,EAAQjB,KAAKY,SAASE,GACxBI,EAAU,EAOd,OALKJ,GAAgB,GAARA,IACTI,EAAU,GACVJ,EAAO,IAIP,yBACIK,MAAO,CACHC,MAAO,GACPC,OAAQ,GACRC,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZjB,OAAQ,WAEZS,QAASA,GACT,yBACIK,OAAQN,EACRU,QAAQ,YACRN,MAAK,eACEb,EADF,CAEDE,KAAK,GAAD,OAAKS,GACTC,QAAQ,GAAD,OAAKA,MAGhB,0BAAMQ,EAxDhB,6QA0DM,yBACIP,MAAO,CACHC,MAAO,OACPO,UAAW,SACXC,SAAU,WACVC,OAAQ,MACRZ,MAAO,QACPa,WAAY,SACZhB,Q,GArDaiB,iBCN/BC,EAAS,CACXC,cAAe,CACXb,MAAO,GACPC,OAAQ,GACRa,aAAc,MACdC,gBAAiB,UACjBb,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZP,MAAO,QACPmB,OAAQ,oBACR7B,OAAQ,WAEZ8B,OAAQ,CACJjB,MAAO,GACPC,OAAQ,GACRa,aAAc,MACdC,gBAAiB,UACjBb,QAAS,OACTC,eAAgB,SAChBC,WAAY,SACZY,OAAQ,sBAIVE,EAAwB,CAC1BV,SAAU,WACVW,IAAK,OACLC,KAAM,OACNC,WAAY,YACZC,QAAS,OACTpB,QAAS,eACTqB,oBAAqB,OACrBC,qBAAsB,OACtBC,UAAW,+BACXC,WAAY,+BACZC,YAAa,+BACbC,OAAQ,MAGNC,EAA0B,CAC5BrB,SAAU,WACVW,IAAK,OACLC,KAAM,OACNC,WAAY,YACZC,QAAS,OACTpB,QAAS,eACTY,aAAc,OACdE,OAAQ,+BACRY,OAAQ,MAGNE,EAAwB,CAC1BV,KAAM,OACNC,WAAY,YACZC,QAAS,cACTpB,QAAS,eACT6B,uBAAwB,OACxBC,wBAAyB,OACzBC,aAAc,+BACdP,WAAY,+BACZC,YAAa,+BACbC,OAAQ,KACRpB,SAAU,WACVW,IAAK,OACLnB,MAAO,QACPkC,UAAW,oBACXC,UAAW,QAGTC,EAAmB,CACrBf,WAAY,YACZpB,OAAQ,OACRa,aAAc,OACdjB,MAAO,UACPmB,OAAQ,+BACRqB,SAAU,OACVC,QAAS,QAGPC,EAAMC,YAAc,CACtBC,YAAaC,qGAGJC,EAAb,YACI,WAAY9D,GAAQ,IAAD,8BACf,4CAAMA,KAoBVgC,cAAgB,SAAC+B,EAAaC,EAAYC,GACtC,OACI,kBAAC,IAAD,CACIC,IAAKH,EAAYI,WACjBJ,YAAaA,EACb7C,MAAOa,EAAOC,cACdjB,QAAS,EAAKqD,aAAaxD,KAAlB,eAA6BmD,EAAaC,EAAYC,IAE/D,6BAAMD,KA7BC,EAiCnBI,aAAe,SAACL,EAAaC,EAAYC,GACrC,IAAII,EAAO,EAAKC,MAAMC,IAAIC,UAAUC,MAAQ,EAClB,KAAtB,EAAKH,MAAMI,OACX,EAAKC,SAAS,CAAEC,WAAOC,EAAWC,UAAU,EAAOC,WAAW,IAE9D,EAAKJ,SAAS,CAAEC,WAAOC,EAAWC,UAAU,IAChD,EAAKR,MAAMC,IAAIS,MAAM,CAAEC,OAAQlB,EAAamB,MAAO,EAAGb,KAAMA,EAAMc,YAAa,IAAMC,WAAW,KAvCjF,EA0CnBC,UAAY,SAACC,GACJ,EAAKhB,MAAMQ,UAAY,EAAKR,MAAMM,OAASU,IAClB,KAAtB,EAAKhB,MAAMI,OACX,EAAKC,SAAS,CAAEC,MAAOU,EAAMR,UAAU,EAAMC,WAAW,IAExD,EAAKJ,SAAS,CAAEC,MAAOU,EAAMR,UAAU,IAC3C,EAAKR,MAAMC,IAAIS,MAAM,CAAEC,OAAQK,EAAKC,SAASxB,YAAamB,MAAO,EAAGC,YAAa,IAAMC,WAAW,MAhDvF,EAoDnBI,WAAa,SAACjB,IACNkB,KAAKC,IAAI,EAAKpB,MAAMC,IAAIC,UAAUmB,QAAQC,IAAM,EAAKtB,MAAMW,OAAOW,KAAO,MACtEH,KAAKC,IAAI,EAAKpB,MAAMC,IAAIC,UAAUmB,QAAQE,IAAM,EAAKvB,MAAMW,OAAOY,KAAO,QAClD,KAAtB,EAAKvB,MAAMI,OACX,EAAKC,SAAS,CAAEN,KAAM,CAACE,EAAIC,UAAUC,OAAQQ,OAAQV,EAAIC,UAAUmB,QAASZ,WAAW,IAEvF,EAAKJ,SAAS,CAAEN,KAAM,CAACE,EAAIC,UAAUC,OAAQQ,OAAQV,EAAIC,UAAUmB,YA1D5D,EA8DnBG,eAAiB,SAACvB,EAAKwB,IACf,EAAKzB,MAAMM,OAAS,EAAKN,MAAMS,aACL,KAAtB,EAAKT,MAAMI,OACX,EAAKC,SAAS,CAAEC,WAAOC,EAAWC,UAAU,EAAOC,WAAW,IAE9D,EAAKJ,SAAS,CAAEC,WAAOC,EAAWC,UAAU,MAjEpD,EAAKR,MAAQ,CACTD,KAAM,CAAC,GACPY,OAAQ,CAAEW,IAAK,EAAGC,IAAK,GACvBG,MAAO,GACPC,UAAW,KACXC,WAAY,EAAKlG,MAAMmG,MAAMC,OAAOtG,GACpCiF,WAAW,EACXsB,YAAa,GACb3B,OAAQ,IAGZ,EAAK4B,QAAU,EACf,EAAKR,eAAiB,EAAKA,eAAelF,KAApB,gBAdP,EADvB,iFAkByB,IAAD,OAChBb,KAAKwG,WAAWC,MAAK,SAAAC,GAAM,OAAI,EAAK9B,SAAS,CAAEqB,MAAOS,SAnB9D,oCAyEQ,IAAI7B,EAAQ7E,KAAKuE,MAAMM,MAEvB,OACIA,GACI,kBAAC,IAAD,CACIb,YAAa,CAACa,EAAMW,SAASxB,YAAY,GAAIa,EAAMW,SAASxB,YAAY,IACxE2C,OAAQ,CACJ,cAAe,CAAC,IAAK,IAAK,OAAU,CAAC,GAAI,IAAK,eAAgB,EAAE,IAAK,MAEzE,4BAAK9B,EAAM+B,WAAWC,UAlF1C,8IAyFmCC,MAAM,iBAAD,OAAkB9G,KAAKuE,MAAM4B,cAzFrE,cAyFkBY,EAzFlB,0BA0F+BA,EAASC,QA1FxC,cA0FkBC,EA1FlB,yBA2FmBA,GA3FnB,yCA6FYC,QAAQC,IAAR,MA7FZ,kBA8FmB,IA9FnB,0FAkGc,IAAD,OACDxC,EAAS3E,KAAKuE,MAAMI,OACpByC,EAAgBpH,KAAKuE,MAAM0B,MAAMtB,QAAO,SAAUY,GAClD,OAAOA,EAAKsB,MAAMQ,cAAcC,SAAS3C,EAAO0C,kBAEhDf,EAAoC,KAAtBtG,KAAKuE,MAAMI,OAAgByC,EAAgB,GACzDG,EAAU,CACVC,KAAM,oBACNC,SAAUL,EAAc5C,KAAI,SAAAe,GACxB,MAAO,CACHxF,GAAIwF,EAAKxF,GACTyH,KAAM,UACNZ,WAAYrB,EACZC,SAAU,CACNgC,KAAM,QACNxD,YAAa,CAACuB,EAAKmC,UAAWnC,EAAKoC,gBAO/C9C,GADAyB,EAAoC,KAAtBtG,KAAKuE,MAAMI,OAAgB4C,EAAQE,SAAW,GACpDzH,KAAK4H,eACbC,EAAmB7H,KAAKuE,MAAMS,UAAY,QAAU,OACpD8C,EAAqB9H,KAAKuE,MAAMS,UAAY,gBAAkB,aAC9D+C,EAAwB/H,KAAKuE,MAAMS,UAAY,UAAY,WAC3DgD,EAAmBhI,KAAKuE,MAAMS,UAAY,QAAU,OACpDiD,EAAoBjI,KAAKuE,MAAMS,UAAY1C,EAAwBW,EACnEiF,EAAwBlI,KAAKuE,MAAMS,UAAY,kBAAoB,qBACnEmD,EAA+C,KAAtBnI,KAAKuE,MAAMI,OAAgB,kBAAoB,qBAExEyD,EAAoB,KAaxB,OAXIA,EADuB,IAAvB9B,EAAY+B,OACS,0BAAMlH,MAAO,CAAEmH,OAAQ,SAAUC,UAAW,WAA5C,qBAEA,wBAAIC,UAAU,uCAC9BlC,EAAY9B,KAAI,SAACe,EAAMpB,GAAP,OACb,wBAAIqE,UAAU,gCAAgCC,YAAWlD,EAAKqB,WAAYzC,IAAKoB,EAAKqB,WAAW7G,GAAIiB,QAAS,EAAKsE,UAAUzE,KAAK,EAAM0E,IAClI,8BAAOA,EAAKqB,WAAWC,YAOnC,oCACI,kBAAClD,EAAD,CACIuB,OAAQlF,KAAKuE,MAAMW,OACnBZ,KAAMtE,KAAKuE,MAAMD,KACjBnD,MAAM,qCACNuH,eAAgB,CACZrH,OAAQ,OACRD,MAAO,QAEXuH,UAAW3I,KAAKyF,WAChBzE,QAAShB,KAAK+F,eACd6C,WAAY5I,KAAK+F,eACjB8C,UAAW7I,KAAK+F,eAChB+C,WAAY9I,KAAK+F,eACjBgD,YAAa,SAAAvE,GAAG,OAAI,EAAKI,SAAS,CAAEJ,IAAKA,MACzC,kBAAC,IAAD,CAASwE,qBAAsBhJ,KAAKiC,eAC/BsF,EAAQE,SAASjD,KAAI,SAACyE,EAAS9E,GAAV,OAClB,kBAAC,IAAD,CAAQA,IAAKA,EAAKH,YAAaiF,EAAQzD,SAASxB,YAAakF,eAAcD,GACvE,kBAAC,EAAD,CAASlI,KAAM,GAAIC,QAAS,EAAKsE,UAAUzE,KAAK,EAAMoI,GAAUnI,KAAMmI,EAAQrC,WAAWuC,aAKpGtE,EAED,kBAAC,IAAD,MAEA,yBACI1D,MAAO8G,GACP,2BAAOT,KAAK,OACR4B,IAAK,SAACC,GAAY,EAAKC,YAAcD,GACrCE,MAAO5E,EACP6E,SAAU,SAACC,GAAQ,EAAK7E,SAAS,CAAED,OAAQ8E,EAAEC,OAAOH,MAAO1E,WAAOC,EAAWC,UAAU,KACvF5D,MAAK,eACEqC,EADF,CAEDpC,MAAOyG,EACPnF,QAASoF,MAEjB,yBAAK1G,MAAM,KAAKC,OAAO,KAAKI,QAAQ,YAChCT,QAAS,WACA,EAAKuD,MAAMS,YACZ,EAAKJ,SAAS,CAAEC,WAAOC,EAAWC,UAAU,EAAOC,WAAW,IAC9D,EAAKsE,YAAYK,UAGzBxI,MAAO,CACHS,SAAU,WACVY,KAAM,OACND,IAAK,SAET,0BAAM/B,KAAM0H,EAAuBxG,EAxRlC,oZA0RL,yBAAKN,MAAM,KAAKC,OAAO,KAAKI,QAAQ,YAChCT,QAAS,WACD,EAAKuD,MAAMS,YACX,EAAKJ,SAAS,CAAEC,WAAOC,EAAWC,UAAU,EAAOJ,OAAQ,GAAI2B,YAAa,KAC5E,EAAKgD,YAAYK,UAGzBxI,MAAO,CACHS,SAAU,WACVgI,MAAO,MACPrH,IAAK,OACLsH,WAAY9B,IAEhB,0BAAMvH,KAAM2H,EAAwBzG,EAtSlC,woBAySV,yBACIP,MAAK,eACE+B,EADF,CAED5B,QAAS0G,KAEZI,SAxNzB,GAA+BjI,aCtFV2J,G,uLAIb,OACI,kBAAC,EAAD,KACI,kBAAC,IAAD,CAAOC,OAAK,EAACC,KAAK,IAAIC,UAAW,kBAAMC,OAAOC,SAAW,2BACzD,kBAAC,IAAD,CAAOH,KAAK,OAAOC,UAAWlG,S,GAPb5D,cAAZ2J,EACV1J,YAAc0J,EAAIzJ,KCE7B,IAAM+J,EAAcC,QACW,cAA7BH,OAAOC,SAASG,UAEa,UAA7BJ,OAAOC,SAASG,UAEhBJ,OAAOC,SAASG,SAASlE,MACvB,2DA6BJ,SAASmE,EAAiBC,GACxBC,UAAUC,cACPC,SAASH,GACT/D,MAAK,SAAAmE,GACJA,EAAaC,cAAgB,WAC3B,IAAMC,EAAmBF,EAAaG,WACtCD,EAAiBE,cAAgB,WACA,cAA3BF,EAAiBvG,QACfkG,UAAUC,cAAcO,WAK1B/D,QAAQC,IAAI,6CAKZD,QAAQC,IAAI,4CAMrB+D,OAAM,SAAAC,GACLjE,QAAQiE,MAAM,4CAA6CA,MC/DjE,IAAMC,EAAUC,SAASC,qBAAqB,QAAQ,GAAGC,aAAa,QAChEC,EAAcH,SAASI,eAAe,QAE5CC,IAASC,OACP,kBAAC,IAAD,CAAeC,SAAUR,GACvB,kBAAC,EAAD,OAEFI,GDMa,WACb,GAA6C,kBAAmBf,UAAW,CAGzE,GADkB,IAAIoB,IAAI/H,GAAwBoG,OAAOC,UAC3C2B,SAAW5B,OAAOC,SAAS2B,OAIvC,OAGF5B,OAAO6B,iBAAiB,QAAQ,WAC9B,IAAMvB,EAAK,UAAM1G,GAAN,sBAEPsG,EAwCV,SAAkCI,GAEhC1D,MAAM0D,GACH/D,MAAK,SAAAM,GAGkB,MAApBA,EAASiF,SACuD,IAAhEjF,EAASkF,QAAQC,IAAI,gBAAgBC,QAAQ,cAG7C1B,UAAUC,cAAc0B,MAAM3F,MAAK,SAAAmE,GACjCA,EAAayB,aAAa5F,MAAK,WAC7ByD,OAAOC,SAASmC,eAKpB/B,EAAgBC,MAGnBU,OAAM,WACLhE,QAAQC,IACN,oEA5DAoF,CAAwB/B,GAGxBD,EAAgBC,OCvBxBgC,K","file":"static/js/main.d5f214ac.chunk.js","sourcesContent":["import React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n\r\n //render() {\r\n // return (\r\n //
\r\n // \r\n // {this.props.children}\r\n // \r\n //
\r\n // );\r\n //}\r\n}\r\n","import React, { PureComponent } from 'react';\r\n\r\nconst ICON = `M20.2,15.7L20.2,15.7c1.1-1.6,1.8-3.6,1.8-5.7c0-5.6-4.5-10-10-10S2,4.5,2,10c0,2,0.6,3.9,1.6,5.4c0,0.1,0.1,0.2,0.2,0.3\r\n c0,0,0.1,0.1,0.1,0.2c0.2,0.3,0.4,0.6,0.7,0.9c2.6,3.1,7.4,7.6,7.4,7.6s4.8-4.5,7.4-7.5c0.2-0.3,0.5-0.6,0.7-0.9\r\n C20.1,15.8,20.2,15.8,20.2,15.7z`;\r\n\r\nconst pinStyle = {\r\n cursor: 'pointer',\r\n fill: '#fff',\r\n stroke: 'none'\r\n};\r\n\r\nconst notRatedColor = '#fff'\r\nconst colors = ['#6f42c1', '#17a2b8', '#20c997', '#ffc107', '#fd7e14', '#dc3545'];\r\n\r\nexport default class ItemPin extends PureComponent {\r\n constructor() {\r\n super();\r\n this.getColor = this.getColor.bind(this);\r\n }\r\n\r\n getColor(rate) {\r\n if (!rate)\r\n return notRatedColor;\r\n\r\n return colors[rate];\r\n }\r\n\r\n render() {\r\n var { size = 24, onClick, rate } = this.props;\r\n const color = this.getColor(rate);\r\n var opacity = 1;\r\n\r\n if (!rate || rate == 0) {\r\n opacity = .5;\r\n rate = '';\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {rate}\r\n \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport ReactMapboxGl, { Control, ZoomControl, Marker, Popup, Cluster } from 'react-mapbox-gl';\r\nimport ItemPin from './ItemPin';\r\n\r\nconst TOKEN = 'pk.eyJ1IjoicGlhZnBhbXBoaWxlIiwiYSI6ImNrM3hrcTlscDB4cGEzbHBkMGp0NHdoYnMifQ.QlnFjai6_Y2oYc0_547Ghw'; // Set your mapbox token here\r\n\r\nconst openSearchButtonPath = 'M19.129,18.164l-4.518-4.52c1.152-1.373,1.852-3.143,1.852-5.077c0-4.361-3.535-7.896-7.896-7.896c-4.361,0-7.896,3.535-7.896,7.896s3.535,7.896,7.896,7.896c1.934,0,3.705-0.698,5.078-1.853l4.52,4.519c0.266,0.268,0.699,0.268,0.965,0C19.396,18.863,19.396,18.431,19.129,18.164z M8.567,15.028c-3.568,0-6.461-2.893-6.461-6.461s2.893-6.461,6.461-6.461c3.568,0,6.46,2.893,6.46,6.461S12.135,15.028,8.567,15.028z';\r\nconst clearSearchButtonPath = 'M10.185,1.417c-4.741,0-8.583,3.842-8.583,8.583c0,4.74,3.842,8.582,8.583,8.582S18.768,14.74,18.768,10C18.768,5.259,14.926,1.417,10.185,1.417 M10.185,17.68c-4.235,0-7.679-3.445-7.679-7.68c0-4.235,3.444-7.679,7.679-7.679S17.864,5.765,17.864,10C17.864,14.234,14.42,17.68,10.185,17.68 M10.824,10l2.842-2.844c0.178-0.176,0.178-0.46,0-0.637c-0.177-0.178-0.461-0.178-0.637,0l-2.844,2.841L7.341,6.52c-0.176-0.178-0.46-0.178-0.637,0c-0.178,0.176-0.178,0.461,0,0.637L9.546,10l-2.841,2.844c-0.178,0.176-0.178,0.461,0,0.637c0.178,0.178,0.459,0.178,0.637,0l2.844-2.841l2.844,2.841c0.178,0.178,0.459,0.178,0.637,0c0.178-0.176,0.178-0.461,0-0.637L10.824,10z';\r\n\r\nconst styles = {\r\n clusterMarker: {\r\n width: 30,\r\n height: 30,\r\n borderRadius: '50%',\r\n backgroundColor: '#51D5A0',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n color: 'white',\r\n border: '2px solid #56C498',\r\n cursor: 'pointer'\r\n },\r\n marker: {\r\n width: 30,\r\n height: 30,\r\n borderRadius: '50%',\r\n backgroundColor: '#E0E0E0',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n border: '2px solid #C9C9C9'\r\n }\r\n};\r\n\r\nconst searchButtonOpenStyle = {\r\n position: 'absolute',\r\n top: '10px',\r\n left: '10px',\r\n background: '#FFFFFFAA',\r\n padding: '10px',\r\n display: 'inline-block',\r\n borderTopLeftRadius: '28px',\r\n borderTopRightRadius: '28px',\r\n borderTop: '1px solid rgba(0, 0, 0, 0.3)',\r\n borderLeft: '1px solid rgba(0, 0, 0, 0.3)',\r\n borderRight: '1px solid rgba(0, 0, 0, 0.3)',\r\n zIndex: '10'\r\n};\r\n\r\nconst searchButtonClosedStyle = {\r\n position: 'absolute',\r\n top: '10px',\r\n left: '10px',\r\n background: '#FFFFFFAA',\r\n padding: '10px',\r\n display: 'inline-block',\r\n borderRadius: '28px',\r\n border: '1px solid rgba(0, 0, 0, 0.3)',\r\n zIndex: '10'\r\n};\r\n\r\nconst searchResultsDivStyle = {\r\n left: '10px',\r\n background: '#FFFFFFAA',\r\n padding: '0 10px 10px',\r\n display: 'inline-block',\r\n borderBottomLeftRadius: '28px',\r\n borderBottomRightRadius: '28px',\r\n borderBottom: '1px solid rgba(0, 0, 0, 0.3)',\r\n borderLeft: '1px solid rgba(0, 0, 0, 0.3)',\r\n borderRight: '1px solid rgba(0, 0, 0, 0.3)',\r\n zIndex: '10',\r\n position: 'absolute',\r\n top: '61px',\r\n width: '322px',\r\n maxHeight: 'calc(100% - 80px)',\r\n overflowY: 'auto'\r\n};\r\n\r\nconst searchInputStyle = {\r\n background: '#FFFFFFAA',\r\n height: '30px',\r\n borderRadius: '15px',\r\n color: '#4C4C4C',\r\n border: '1px solid rgba(0, 0, 0, 0.3)',\r\n fontSize: '14px',\r\n outline: 'none'\r\n};\r\n\r\nconst Map = ReactMapboxGl({\r\n accessToken: process.env.REACT_APP_MAP_TOKEN\r\n});\r\n\r\nexport class SpoteeMap extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n zoom: [2],\r\n center: { lng: 0, lat: 0 },\r\n items: [],\r\n popupInfo: null,\r\n universeId: this.props.match.params.id,\r\n searching: false,\r\n suggestions: [],\r\n filter: ''\r\n };\r\n\r\n this.timeout = 0;\r\n this.onMapActionEnd = this.onMapActionEnd.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.getItems().then(result => this.setState({ items: result }));\r\n }\r\n\r\n clusterMarker = (coordinates, pointCount, getLeaves) => {\r\n return (\r\n \r\n
{pointCount}
\r\n );\r\n };\r\n\r\n clusterClick = (coordinates, pointCount, getLeaves) => {\r\n var zoom = this.state.map.transform._zoom + 1;\r\n if (this.state.filter === '')\r\n this.setState({ popup: undefined, centered: false, searching: false });\r\n else\r\n this.setState({ popup: undefined, centered: false });\r\n this.state.map.flyTo({ center: coordinates, curve: 1, zoom: zoom, maxDuration: 1000, essential: true });\r\n };\r\n\r\n itemClick = (item) => {\r\n if (!this.state.centered || this.state.popup != item) {\r\n if (this.state.filter === '')\r\n this.setState({ popup: item, centered: true, searching: false });\r\n else\r\n this.setState({ popup: item, centered: true });\r\n this.state.map.flyTo({ center: item.geometry.coordinates, curve: 1, maxDuration: 1000, essential: true });\r\n }\r\n };\r\n\r\n mapMoveEnd = (map) => {\r\n if (Math.abs(this.state.map.transform._center.lng - this.state.center.lng) > .00001\r\n || Math.abs(this.state.map.transform._center.lat - this.state.center.lat) > .00001) {\r\n if (this.state.filter === '')\r\n this.setState({ zoom: [map.transform._zoom], center: map.transform._center, searching: false });\r\n else\r\n this.setState({ zoom: [map.transform._zoom], center: map.transform._center });\r\n }\r\n };\r\n\r\n onMapActionEnd = (map, event) => {\r\n if (this.state.popup || this.state.searching) {\r\n if (this.state.filter === '')\r\n this.setState({ popup: undefined, centered: false, searching: false });\r\n else\r\n this.setState({ popup: undefined, centered: false });\r\n }\r\n };\r\n\r\n renderPopup() {\r\n var popup = this.state.popup;\r\n\r\n return (\r\n popup && (\r\n \r\n

{popup.properties.title}

\r\n \r\n )\r\n );\r\n }\r\n async getItems() {\r\n try {\r\n const response = await fetch(`item?universe=${this.state.universeId}`);\r\n const data = await response.json();\r\n return data;\r\n } catch (error) {\r\n console.log(error);\r\n return [];\r\n }\r\n }\r\n\r\n render() {\r\n var filter = this.state.filter;\r\n var filteredItems = this.state.items.filter(function (item) {\r\n return item.title.toLowerCase().includes(filter.toLowerCase());\r\n });\r\n var suggestions = this.state.filter !== '' ? filteredItems : [];\r\n var geojson = {\r\n type: \"FeatureCollection\",\r\n features: filteredItems.map(item => {\r\n return {\r\n id: item.id,\r\n type: \"Feature\",\r\n properties: item,\r\n geometry: {\r\n type: \"Point\",\r\n coordinates: [item.longitude, item.latitude]\r\n }\r\n };\r\n })\r\n };\r\n\r\n var suggestions = this.state.filter !== '' ? geojson.features : [];\r\n var popup = this.renderPopup();\r\n var searchInputWidth = this.state.searching ? '300px' : '30px';\r\n var searchInputPadding = this.state.searching ? '0 10px 0 30px' : '0 0 0 30px';\r\n var searchCloseVisibility = this.state.searching ? 'visible' : 'collapse';\r\n var resultDivDisplay = this.state.searching ? 'block' : 'none';\r\n var searchButtonStyle = this.state.searching ? searchButtonOpenStyle : searchButtonClosedStyle;\r\n var openSearchButtonColor = this.state.searching ? 'rgb(76, 76, 76)' : 'rgba(0, 0, 0, 0.3)';\r\n var clearSearchButtonColor = this.state.filter !== '' ? 'rgb(76, 76, 76)' : 'rgba(0, 0, 0, 0.3)';\r\n\r\n var suggestionContent = null;\r\n if (suggestions.length === 0) {\r\n suggestionContent = (Aucun résultat);\r\n } else {\r\n suggestionContent = (
    \r\n {suggestions.map((item, key) => (\r\n
  • \r\n {item.properties.title}\r\n
  • \r\n ))}\r\n
);\r\n }\r\n\r\n return (\r\n <>\r\n this.setState({ map: map })}>\r\n \r\n {geojson.features.map((feature, key) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n\r\n {popup}\r\n\r\n \r\n\r\n \r\n { this.searchInput = input; }}\r\n value={filter}\r\n onChange={(e) => { this.setState({ filter: e.target.value, popup: undefined, centered: false }) }}\r\n style={{\r\n ...searchInputStyle,\r\n width: searchInputWidth,\r\n padding: searchInputPadding\r\n }} />\r\n {\r\n if (!this.state.searching) {\r\n this.setState({ popup: undefined, centered: false, searching: true });\r\n this.searchInput.focus();\r\n }\r\n }}\r\n style={{\r\n position: 'absolute',\r\n left: '15px',\r\n top: '15px'\r\n }}>\r\n \r\n \r\n {\r\n if (this.state.searching) {\r\n this.setState({ popup: undefined, centered: false, filter: '', suggestions: [] });\r\n this.searchInput.focus();\r\n }\r\n }}\r\n style={{\r\n position: 'absolute',\r\n right: '5px',\r\n top: '15px',\r\n visibility: searchCloseVisibility\r\n }}>\r\n \r\n \r\n \r\n \r\n {suggestionContent}\r\n \r\n \r\n \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport { SpoteeMap } from './components/Map';\r\n\r\nimport './custom.css'\r\n\r\nexport default class App extends Component {\r\n static displayName = App.name;\r\n\r\n render() {\r\n return (\r\n \r\n window.location = 'http://www.spotee.net'} />\r\n \r\n \r\n );\r\n }\r\n}\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n\r\n"],"sourceRoot":""}