{"version":3,"sources":["file:///webpack/bootstrap","file:///D:\\projects\\myglobe-rous\\myglobe-library\\node_modules\\@myglobe\\core\\dist\\Map\\layers lazy /^\\.\\/.*$/ groupOptions: {} namespace object","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Map/IconClusterLayer.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Global/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/reducers/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/reducers/Data/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/reducers/Global/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/reducers/Map/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/store/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Layout/LayoutConfig.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/utils/useLocalStorage.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/utils/useThemeMode.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/selectors/Map/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Loading.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Sprite/IconManager.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Sprite/Spritesheet.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/CellFormatters/ImageFormatter.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/CellEditors/ImageEditor.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/Save/Save.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/FieldEditor/Field.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/FieldEditor/FieldEditor.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/RowEditor.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Admin.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Admin/UserToolbar/UserToolbar.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Layout/AdminLayout.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/StoriesList.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/StoryEditor/PanelEditor.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/StoryEditor/StoryEditor.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/Stories.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/DatasetList.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/Datasets.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/TopMenu.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/LayerList.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/Layers.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/Dashboard.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/StyleUtils.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Cesium/CesiumContainer.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Map/MapContainer.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Icon/Icon.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/ActionButton/ActionButton.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Header/Header.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Sidebar.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Menu/Menu.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Menu/DynamicMenu.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Page/Page.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/Popup.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/containers/StyledContainer.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Layout/ComponentResolver.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Layout/MainLayout.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Layout/Layout.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/serviceWorker/sw.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/index.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Popup/Popup.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/auth0/auth0.jsx","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Data/Mapping.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Data/Datasets.js","file:///external \"Cesium\"","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/hooks/usePrevious.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Data/index.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/types/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/selectors/Data/index.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/styles/theme.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/hooks/useMedia.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/Map/layers/IconClusterLayer.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/src/types/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Map/index.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/components/Map/TempMap.js","file:///D:/projects/myglobe-rous/myglobe-library/packages/myglobe-core/dist/Branding/MyGlobeIcon.js","file:///D:/projects/myglobe-rous/myglobe-library/apps/rous/src/actions/Data/Content.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","jsonpArray","window","oldJsonpFunction","slice","map","webpackAsyncContext","req","then","code","id","keys","defaultProps","iconAtlas","async","iconMapping","sizeScale","min","pickable","billboard","sizeUnits","sizeMinPixels","sizeMaxPixels","Number","MAX_SAFE_INTEGER","alphaCutoff","max","transitions","fontFamily","getPosition","x","position","getIcon","icon","getColor","getSize","getAngle","getPixelOffset","getTextAnchor","getAlignmentBaseline","IconClusterLayer","changeFlags","somethingChanged","props","oldProps","rebuildIndex","dataChanged","index","Supercluster","maxZoom","radius","load","geometry","coordinates","properties","this","setState","z","Math","floor","context","viewport","zoom","state","getClusters","info","pickedObject","cluster","objects","getLeaves","cluster_id","f","getText","IconLayer","getSubLayerProps","size","point_count","TextLayer","CompositeLayer","layerName","windowResize","width","height","dispatch","payload","reducers","combineReducers","Data","globe","uuid","title","config","mobile","desktop","navigation","align","header","logo","loading","datasets","pages","stories","panels","states","layers","media","byId","byHash","uploads","action","DataActions","FETCH_DATASETS","FETCH_DATASETS_FAILURE","FETCH_DATASETS_SUCCESS","UPDATE_DATASET","UPDATE_DATASET_FAILURE","UPDATE_DATASET_SUCCESS","UPLOAD_MEDIA","UPLOAD_MEDIA_SUCCESS","UPLOAD_MEDIA_FAILURE","UPDATE_DODGY_VISLAYERS","forEach","Id","FETCH_LAYERS","FETCH_LAYERS_FAILURE","FETCH_LAYERS_SUCCESS","FETCH_STATES","FETCH_STATES_FAILURE","FETCH_STATES_SUCCESS","UPDATE_VISSTATES","UPDATE_VISSTATES_SUCCESS","UPDATE_VISSTATES_FAILURE","FETCH_PAGES","FETCH_PAGES_FAILURE","FETCH_PAGES_SUCCESS","FETCH_STORIES","FETCH_STORIES_FAILURE","FETCH_STORIES_SUCCESS","CREATE_STORY","CREATE_STORY_SUCCESS","UPDATE_STORY","UPDATE_STORY_SUCCESS","FETCH_PANELS","FETCH_PANELS_FAILURE","FETCH_PANELS_SUCCESS","CREATE_PANEL","CREATE_PANEL_SUCCESS","UPDATE_PANEL","UPDATE_PANEL_SUCCESS","UPDATE_PANEL_ORDER","UPDATE_PANEL_ORDER_FAILURE","UPDATE_PANEL_ORDER_SUCCESS","newPanelHash","updatedPanel","DELETE_PANEL","DELETE_PANEL_FAILURE","DELETE_PANEL_SUCCESS","panelId","newPanelIds","panelIdIndex","indexOf","PANEL_ACTION_FAILURE","datasetID","itemID","dataset","updatedDataset","update","$set","hashes","ids","row","Global","screen","innerWidth","innerHeight","menu","Map","style","classes","viewState","jsonConfig","constants","MapController","require","views","enumerations","COORDINATE_SYSTEM","GL","layerClasses","loadedLayers","deckLayers","mapboxLayers","markers","mapStyle","spriteJSON","spriteImage","mapboxToken","mapboxUserId","baseMapStyle","MapActions","deckConfig","updatedMapView","newDeckLayers","newMapboxLayers","newMarkers","middlewareArr","createDebounce","createPromise","thunk","middleware","applyMiddleware","createStore","LayoutConfig","propValue","componentName","location","propFullName","layoutConfig","isNullOrUndefined","values","LayoutTypes","includes","GRID","AlignmentTypes","useLocalStorage","initialValue","useState","item","localStorage","getItem","JSON","parse","storedValue","setStoredValue","valueToStore","Function","setItem","stringify","useDarkMode","enabledState","setEnabledState","enabled","useMedia","useEffect","element","body","classList","add","remove","getMapLoadingStatus","store","checkState","PropTypes","arrayOf","string","isRequired","getViewState","getActiveLayers","createSelector","getLayersById","getLayersByHash","getDatasetsById","getDatasetsByHash","activeLayerIds","layerIds","layerHash","datasetIds","datasetHash","layerData","activeLayerId","layer","endpointData","endpoint","filter","toLowerCase","VisEngineTypes","MAPBOX","DECKGL","useStyles","baseConfig","makeStyles","paper","backgroundColor","transition","opacity","objectFit","pointerEvents","content","overflow","padding","margin","overlay","display","flexAlign","justifyContent","alignItems","close","right","top","color","loadingIcon","passiveLoader","textAlign","bottom","zIndex","fontSize","paddingBottom","bar","background","Loading","isLoading","useTheme","useRef","isMapLoading","isManual","open","setOpen","handleClose","Dialog","fullScreen","onClick","aria-labelledby","keepMounted","transitionDuration","enter","exit","DialogContent","className","IconButton","aria-label","alt","propTypes","bool","connect","getLoadingStatusV2","getLoading","PassiveLoader","LinearProgress","variant","noop","DEFAULT_TEXTURE_PARAMETERS","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_LINEAR","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","getIconId","url","onUpdate","_loadOptions","_getIcon","_texture","_externalTexture","_mapping","_pendingCount","_autoPacking","_xOffset","_yOffset","_rowHeight","_buffer","_canvasWidth","_canvasHeight","loadOptions","autoPacking","_updateIconAtlas","_canvas","_updateAutoPacking","Texture2D","setParameters","gl","parameters","icons","maxHeight","maxWidth","xVal","yVal","resolution","y","image","_loadIconsFromImages","images","canvas2D","ctx","getContext","imageData","drawImage","link","toBlob","blob","href","URL","createObjectURL","click","parentNode","removeChild","WidthProvider","Responsive","root","left","border","minHeight","cell","backgroundSize","backgroundPosition","backgroundRepeat","overlayBtn","ImageFormatter","clsx","backgroundImage","flexDirection","dropzone","borderWidth","borderRadius","imgPreview","buttonCont","forwardRef","ref","refFileInput","refImgPreview","isUploading","setIsUploading","imgPreviewUrl","setImgPreviewUrl","isMediaLoading","useSelector","filename","file","setFile","useDispatch","onDrop","useCallback","acceptedFiles","useDropzone","accept","noClick","getRootProps","getInputProps","isDragActive","inputRef","uploadFile","uploadMedia","cancel","onCommit","handleUpdate","useImperativeHandle","getInputNode","current","getValue","column","isSelectOpen","DialogTitle","CircularProgress","multiple","Button","disabled","theme","button","boxShadow","palette","secondary","main","actions","actionButton","marginTop","Save","isSaved","isOpen","isDialogOpen","onSave","onSaveAs","dialogOpen","setDialogOpen","setName","fabClasses","classNames","SpeedDialIcon","openIcon","handleOpen","handleDialogClose","onClose","TextField","autoFocus","label","onChange","fullWidth","DialogActions","SpeedDial","ariaLabel","fab","direction","onBlur","onFocus","onMouseEnter","onMouseLeave","SpeedDialAction","tooltipTitle","tooltipPlacement","tooltipOpen","func","SavedIcon","SvgIcon","fillRule","clipRule","SaveAsIcon","FieldTypes","STRING","LATITUDE","LONGITUDE","INTEGER","HTML","MEDIA","FieldParams","helperText","parser","parseInt","parseFloat","input","common","black","white","contentFrame","underline","Field","currentValue","setCurrentValue","isError","setIsError","focus","handleKeyDown","keyCode","FormHelperTextProps","InputProps","notchedOutline","InputLabelProps","newValue","isValid","isInteger","validate","onKeyDown","oneOf","oneOfType","number","displayName","FieldEditor","otherProps","columnKey","FormControl","table","tableRow","control","fontWeight","lastUpdated","marginRight","addRowDialog","addRowButton","RowEditor","authState","setDataChanged","rows","setRows","prevRows","usePrevious","cols","setCols","Set","selectedRows","setSelectedRows","gridRef","setLoading","cellUpdate","rowUpdateEvt","rowInd","fromRow","updated","updatedRows","saveData","_id","updateDataset","rowIdx","formatter","editor","a","React","editable","unshift","SelectColumn","handleAddRowDialog","emptyRow","reduce","scrollToRow","handleDeleteRow","args","Typography","Date","toLocaleDateString","weekday","year","month","day","rowKey","columns","rowHeight","onRowsUpdate","onSelectedRowsChange","startIcon","loadingContainer","user","Admin","useAuth0","isAuthenticated","logout","loginWithRedirect","getTokenSilently","count","query","token","fetch","headers","Authorization","method","response","json","responseData","myId","globereq","Paper","Skeleton","animation","LoginIcon","LogoutIcon","UserToolbar","Chip","avatar","Avatar","nickname","picture","Divider","orientation","flexItem","AdminLayout","memo","rootClasses","Breadcrumbs","Link","types","whyDidYouRender","StoriesList","selectedID","nextProps","evt","handleSelect","handleDelete","items","updatedStories","story","Display","storyItems","ListItem","handleListSelect","slug","selected","ListItemText","primary","ListItemSecondaryAction","handleEdit","List","dense","disablePadding","container","lineHeight","Component","withStyles","paddingTop","editToggle","panel","text","stateEditor","jsonEditor","flex","ckEditor","PanelEditor","storyId","panelCount","onCancel","onPanelChange","createPanel","updatePanel","updateMapState","setContent","setPanel","setViewState","curMapView","visLayers","jsonEditorRef","editorConfig","plugins","processor","GFMDataProcessor","editing","view","Essentials","Heading","Paragraph","Bold","Italic","Underline","Strikethrough","Image","ImageToolbar","ImageResize","Code","Subscript","Superscript","Base64UploadAdapter","toolbar","language","handleValue","stateName","required","ClassicEditor","onInit","getData","JsonEditor","modes","visibleVisLayers","Visible","newView","set","Pagination","page","shape","getGlobe","bindActionCreators","assign","StoryEditor","updatePanelOrder","createStory","updateStory","deletePanel","setStory","setPanels","callback","confirm","setConfirm","isSubscribed","SortableList","onSortEnd","oldIndex","newIndex","sortedArr","useDragHandle","hideSortableGhost","panelsCount","onConfirm","ConfirmationDialog","DragHandle","SortableHandle","SortableItem","SortableElement","pos","divider","disableGutters","Toolbar","SortableContainer","array","getLoadingStatusSelector","getActivePanels","Stories","filteredList","datasetTitle","deletingID","editStory","find","deleteStory","Grid","spacing","justify","xs","dataList","handleNewStory","handleExit","getStoriesFlatMap","deets","paddingLeft","uploadSuccess","DatasetList","isInputChecked","handleToggle","loadClicked","deleteClicked","updatedLayers","datasetItems","Title","handleLoad","Datasets","CmsActions","setError","changeAppState","APP_STATES","VISUALISATION","uploader","deleting","handleDeleteClose","valid","substr","lastIndexOf","dismissError","editedFile","split","FS","handleLoadDataset","deleteDataset","updatedList","search","fetching","fetchingModels","fetchingModelTypes","fetched","handleLoadClicked","handleDeleteClick","TopMenuDiv","styled","div","TopMenu","handleMenuClick","alignSelf","marginLeft","minWidth","handleStyle","styleChange","handleSave","isDocked","handleFlyTo","Visibility","blue","VisibilityOff","Name","TextareaAutosize","rowsMin","rowsMax","Filename","Changed","layerItems","LayerList","vis","persist","handleSorted","callToAction","fill","Layers","filterTabs","prevProps","filterList","isChecked","handleLayerToggle","GlobeActions","flyToLocation","deleteLayer","newAppState","Order","str","gridContainer","gridOverride","enabledActions","VisContainer","section","dragContainer","fakeHidden","visibility","transform","transformOrigin","minimising","appbar","toolbarTitle","flexWrap","toolbarActions","tabs","hidden","moveCursor","cursor","docker","undocker","Dashboard","dash","globeName","docked","setDocked","minimised","setMinimised","setMinimising","maximising","setMaximising","setPos","oldPos","setOldPos","screenW","screenH","screenDimensions","setScreenDimensions","animating","setAnimating","datasetsComp","setDatasetsComp","visLayersComp","setVisLayersComp","storiesComp","setStoriesComp","appState","setAppState","setVisLayers","setDatasets","loginWithPopup","updateWindowDimensions","addEventListener","handleDeleteVisLayer","handleDeleteDataset","handleDeleteStory","handleSaveStory","clientWidth","handle","bounds","onStop","elevation","AppBar","returnTo","protocol","host","Tabs","Tab","Cesium","defaultAccessToken","heightReferenceLookup","HeightReference","acc","verticalOriginLookup","VerticalOrigin","horizontalOriginLookup","HorizontalOrigin","labelStyleLookup","LabelStyle","styleVisLayer","styles","viewer","visLayerName","dataSources","getByName","styleJSON","styleExpression","_documentPacket","stylePolygon","styleBillboard","stylePolyline","styleLabel","font","outlineColor","outlineWidth","fillColor","nearFarScalar","heightReference","disableDepthTestDistance","horizontalOrigin","verticalOrigin","labelCluster","styleExp","CesiumDataSourceStyle","scaleByDistance","unpack","toString","labelStyle","labelText","labelOutlineWidth","labelOutlineColor","Color","idx","labelColor","show","nearFarScalarArray","entities","entity","evaluate","evaluateColor","pack","Cartesian3","fromDegreesArrayHeights","removeListener","pixelRange","minimumClusterSize","clustering","clusterEvent","clusteredEntities","BillboardGraphics","BOTTOM","scale","CLAMP_TO_GROUND","eyeOffset","customStyle","clampToGround","lineWidth","polyline","material","polygon","arcType","ArcType","GEODESIC","perPositionHeight","saveCZML","CZML","version","polygonGraphics","hierarchy","positions","holes","billboardGraphics","polylineGraphics","labelGraphics","Cartographic","fromCartesian","clock","currentTime","czmlItem","description","cartographicDegrees","toDegrees","longitude","latitude","carto","flat","Infinity","solidColor","rgba","NearFarScalar","Blob","credits","CesiumContainer","sortedArray","setSortedArray","childRef","match","useReactRouter","localViewState","handleViewState","updateMapViewState","params","category","vl","v","sort","b","aIndex","findIndex","bIndex","updateDodgyVislayers","defaultState","updateMapStateById","resp","datasetArray","visArray","reverse","CesiumComponent","onLayersUpdated","lyrs","onViewUpdate","options","cesiumContainer","cancelList","sortDatasets","sorted","ds","dsIdx","raise","lower","contains","dataSource","handleCameraChange","currentView","destination","camera","heading","pitch","roll","stopFlyTo","scene","cancelFlight","newViewer","WMTSImagery","format","transparent","tileMatrixSetID","credit","imageryLayers","colorToAlpha","fromBytes","colorToAlphaThreshold","selectedEntityChanged","selectedEntity","postProcessStages","fxaa","frustum","near","preloadAncestors","fromDate","multiplier","light","intensity","enableLighting","dynamicAtmosphereLighting","dynamicAtmosphereLightingFromSun","maximumScreenSpaceError","logarithmicDepthBuffer","depthTestAgainstTerrain","canvas","imageRendering","setView","percentageChanged","changed","_suspendTerrainAdjustment","SCENE3D","_adjustHeightForTerrain","screenSpaceEventHandler","setInputAction","RIGHT_CLICK","eventHelper","errorEvent","statusCode","preloadAncestores","removeAll","tileLoadProgressEvent","LEFT_DOWN","RIGHT_DOWN","MIDDLE_DOWN","frameState","creditDisplay","addDefaultCredit","duration","flyTo","maximumHeight","loadedVisLayers","newVisLayers","visLayer","lyr","getProperty","styleDetails","colorArray","_url","getStyle","setDefaultStyle","evaluatePromises","fullscreenElement","baseLayerPicker","fullscreenButton","geocoder","homeButton","imageryProvider","mapId","accessToken","infoBox","sceneModePicker","scene3DOnly","selectionIndicator","timeline","navigationHelpButton","navigationInstructionsInitiallyVisible","projectionPicker","fullscreen","resolutionScale","shadows","terrainExaggeration","terrainProvider","requestVertexNormals","requestWaterMask","terrainShadows","ENABLED","useBrowserRecommendedResolution","contextOptions","requestWebgl2","webgl","alpha","antialias","preserveDrawingBuffer","failIfMajorPerformanceCaveat","depth","stencil","getDefaultState","getStatesByHash","getLoadingStatus","getAllLoadingStatuses","fetchPanels","fetchStates","MapContainer","resetMapState","ui","String","parseFunction","exec","replace","onViewStateUpdate","mapbox","deck","bearing","contrastText","IconComponent","colour","Icon","btoa","IconHandler","activeIcon","activeColour","isActive","iconClasses","ActionTypes","HISTORY","ActionButton","uri","history","defaultIcon","handleClick","Fab","default","active","activeStyles","subtitle","Header","Sidebar","children","isVisible","LEFT","RIGHT","TOP","node","isExpanded","TabMenu","lazy","ListMenu","TimelineMenu","Menu","MenuTypes","LIST","fallback","TAB","TIMELINE","path","nav","DynamicMenu","routeParam","baseURL","dataItem","Slide","in","mountOnEnter","unmountOnExit","menuItems","isConfigLoading","fetchStories","Story","PageTypes","STATIC","STORY","collapseWorkaroundContainer","transitionProperty","collapseWorkaroundWrapper","collapseWorkaroundEntered","collapseWorkaroundHidden","closeButton","Page","pageConfig","isExpandable","pageTypes","storyProps","getPage","getPageTypes","fetchPages","video","Popup","videoTimer","URLSearchParams","resolveCallbacks","callbacks","disableBackdropClick","controls","onTouchStart","paused","play","pause","loop","redirect","mediaType","StyledContainer","parseHtml","htmlParser","isValidNode","renderers","paragraph","source","escapeHtml","astPlugins","Components","Array","isArray","generateKey","getTime","resolveComponents","components","componentConfig","resolveComponent","componentKey","childrenConfig","childConfig","componentProps","component","GridLayout","LayeredLayout","MainLayout","loadedComponents","setComponents","schema","historyListener","gtagUAs","gtag","pathname","listenerDisconnect","listen","navigator","userAgent","NavigationTypes","Layout","darkMode","MyGlobeTheme","getTheme","Main","routeProps","ThemeProvider","Helmet","exact","from","to","getGlobeTitle","getGlobeConfig","getGlobeTheme","getError","isLocalhost","Boolean","hostname","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","resize","subdomain","fetchGlobe","app","getElementById","ReactDOM","render","domain","client_id","redirect_uri","audience","onRedirectCallback","replaceState","targetUrl","process","origin","status","ready","unregister","reload","checkValidServiceWorker","imageContainer","coords","contact","summary","gutterBottom","_initOptions","DEFAULT_REDIRECT_CALLBACK","Auth0Context","createContext","useContext","getAuth0Client","client","createAuth0Client","Auth0Provider","initOptions","setIsAuthenticated","setUser","auth0Client","setAuth0","popupOpen","setPopupOpen","handleRedirectCallback","getUser","Provider","getIdTokenClaims","getTokenWithPopup","fetchLayers","layerIDs","getState","fetchLayerIDs","LoadingTypes","SEQUENTIAL","currentLayerIds","loadedLayerIDs","callAPI","datasetMap","formattedData","mappify","indexes","missingDatasetUUIDs","getMissingIds","getUnloadedIds","fetchDatasets","addData","deckLayerClasses","updateDeckLayerClasses","stateIDs","fetchStateIds","currentStateIds","getStatesById","loadedStateIDs","layerMap","obj","formattedObj","nodes","layerNode","missingLayerUUIDs","registerLoaders","Tiles3DLoader","CSVLoader","ZipLoader","datasetIDs","fetchDatasetIDs","currentDatasetIDs","loadedDatasetIDs","fetchEndpointData","retrievedData","getEndpointsData","endpoints","loader","_selectLoader","callEditCSV","callUploadMedia","_typeof","iterator","constructor","_react","cache","_getRequireWildcardCache","has","newObj","hasPropertyDescriptor","getOwnPropertyDescriptor","desc","_interopRequireWildcard","_propTypes","WeakMap","prev","any","FETCH_INIT","FETCH_GLOBE","FETCH_GLOBE_FAILURE","FETCH_GLOBE_SUCCESS","ADD_DATA_ITEM","ADD_DATA_HASHMAP","ADD_DATA_ARRAY","keyIndex","keyPrefixes","variables","callAPISecurely","FormData","append","incomingData","globeData","globes","defaultStateUUID","pageUUIDs","storyUUIDs","typography","fontFamilies","rootFontFamilies","typographyKey","typographyItem","elementFontFamilies","families","fontWeights","join","WebFont","google","getFontsFromTheme","Mapping","Content","VisualisationTypes","ImageLayer","PointLayer","LineLayer","PolygonLayer","ChartTypes","LayerTypes","GeoTypes","DatasetTypes","LAYERED","INLINE","API","FILE","GEO","NIVO","AMCHARTS","deckgl","aggregationLayers","geoLayers","custom","BAR","PIE","LINE","AREA","RADAR","BULK","ACTIVE","statuses","loadingKeys","loadingValues","every","some","datasetName","incomingIds","incomingId","globeConfig","themeConfig","createMuiTheme","getLayersHashByType","createCachedSelector","layerId","_store_","getDeckLayer","deckLayersHash","datasetsHash","deckLayer","datasetId","statesHash","flatMap","stateId","stateHash","getActiveStates","storyID","stateIds","getPagesByHash","pageId","pageHash","pageIds","getStoriesByHash","storiesHash","getStory","storyHash","getPanelsById","getPanelsByHash","storySlug","panelIds","panelsHash","remToPx","rem","getComputedStyle","getPropertyValue","pxToRem","px","toPrecision","colourMap","matches","colours","matchColours","_interopRequireDefault","_createMuiTheme","_blue","_cyan","_red","_teal","getPalette","dark","hint","lightDivider","unsaved","saved","appBar","arguments","htmlFontSize","h1","fontStyle","textTransform","h2","h3","h4","h5","h6","body1","letterSpacing","caption","overrides","MuiFormControl","MuiInput","MuiInputBase","MuiTab","MuiListItem","gutters","paddingRight","MuiListItemText","marginBottom","MuiListItemIcon","_default","_slicedToArray","arr","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","next","done","_iterableToArrayLimit","minLen","_arrayLikeToArray","test","_unsupportedIterableToArray","TypeError","_nonIterableRest","len","arr2","queries","defaultValue","mediaQueryLists","q","matchMedia","_useState2","setValue","mql","handler","addListener","_core","_layers","_supercluster","_classCallCheck","instance","Constructor","_defineProperties","descriptor","configurable","writable","_possibleConstructorReturn","self","ReferenceError","_assertThisInitialized","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","_getPrototypeOf","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","_CompositeLayer","subClass","superClass","_inherits","Derived","protoProps","staticProps","_super","Super","NewTarget","_ref","_ref2","_ref3","_this$props","concat","UPDATE_DECK_LAYER_CLASSES","UPDATE_DECK_LAYER_CLASSES_FAILURE","UPDATE_DECK_LAYER_CLASSES_SUCCESS","UPDATE_MAP_CONFIG","UPDATE_MAP_CONFIG_FAILURE","UPDATE_MAP_CONFIG_SUCCESS","UPDATE_MAP_VIEW_STATE","UPDATE_MAP_STYLES","UPDATE_MAP_STYLES_FAILURE","UPDATE_MAP_STYLES_SUCCESS","UPDATE_LAYER_CLASSES","UPDATE_MAP_LAYERS","UPDATE_MAP_LAYERS_FAILURE","UPDATE_MAP_LAYERS_SUCCESS","UPDATE_MAP_STATE_FAILURE","UPDATE_MAP_TILES_LOADED","layerClass","updateMapConfig","updateMapLayers","mapStyleId","mapstyle","axios","getMapState","JSON_CONFIGURATION","resetButton","branding","touchAction","jsonConverter","JSONConverter","configuration","TRANSITION_SETTINGS","transitionEasing","transitionInterpolator","FlyToInterpolator","transitionInterruption","TRANSITION_EVENTS","IGNORE","MapComponent","deckJsonConverterConfig","onReset","mapboxContainer","deckContainer","setMapbox","useDeck","setGL","previousMapStyle","styleLoaded","setStyleLoaded","deckProps","setDeckProps","prevDeckLayers","popup","setPopup","tooltip","handleLayers","metadata","setLayoutProperty","formatDeckConfig","dP","onTransitionStart","handleResetButton","onContextMenu","preventDefault","ContextProvider","MapContext","MapView","onViewStateChange","interactionState","oldViewState","project","anchor","onWebGLInitialized","pointerObj","blendFunc","SRC_ALPHA","ONE","ONE_MINUS_DST_ALPHA","blendEquation","FUNC_ADD","lat","lng","dynamicPosition","sortByDepth","closeOnClick","Markers","renderChildren","attributionControl","mapboxApiAccessToken","onLoad","mapboxInstance","getMap","addControl","AttributionControl","compact","ScaleControl","unit","on","reuseMaps","dragToRotate","Tooltip","elementType","useMapbox","mapboxRef","currentRef","deckRef","deckInstance","marker","captureDrag","offsetLeft","offsetTop","log10","openPopup","alng","alat","deckLayerConfigs","eval","convert","_classnames","userSelect","textRendering","textShadow","circle","trademark","MyGlobeIcon","brandingClasses","circleClasses","ADD_STORY","DELETE_STORY","DELETE_STORY_SUCCESS","DELETE_STORY_FAILURE","UPDATE_VISSTATE","UPDATE_VISSTATE_SUCCESS","UPDATE_VISSTATE_FAILURE","FETCH_DODGY_VISLAYERS","fetchPageUUIDs","fetchStoryUUIDs","panelUUIDs","missingPanels","fetchPanelIds","currentPanelIds","loadedPanelUUIDs","stateMap","viewStateId","missingStateUUIDs","globeId","updateStoryById","deletedStoryUUID","deleteStoryById","deletedPanelUUID","updatePanelById","deletePanelById","updateVisState","visState","updateVisStateById","visLayerArray"],"mappings":"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","file":"main.08b6d6c03f98fe0166cc.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".\" + {\"2\":\"aebca8d933263a52352e\",\"3\":\"e9bf4cf828e3d2c28aa7\",\"4\":\"1fe9da2f7a72783e7239\",\"5\":\"f48748da3ec72038de9a\",\"6\":\"ae32f94702c564576c3e\",\"7\":\"b028641da9b202d6ab5e\",\"8\":\"21931fc2b849c195e07b\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1006,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","var map = {\n\t\"./IconClusterLayer\": 658,\n\t\"./IconClusterLayer.js\": 658\n};\n\nfunction webpackAsyncContext(req) {\n\treturn Promise.resolve().then(function() {\n\t\tif(!__webpack_require__.o(map, req)) {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t}\n\n\t\tvar id = map[req];\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 1467;\nmodule.exports = webpackAsyncContext;","import {CompositeLayer} from '@deck.gl/core';\r\nimport {IconLayer, TextLayer} from '@deck.gl/layers';\r\nimport Supercluster from 'supercluster';\r\n\r\nconst DEFAULT_COLOR = [0, 0, 0, 255];\r\n\r\nconst defaultProps = {\r\n iconAtlas: {type: 'object', value: null, async: true},\r\n iconMapping: {type: 'object', value: {}, async: true},\r\n sizeScale: {type: 'number', value: 1, min: 0},\r\n pickable: true,\r\n billboard: true,\r\n sizeUnits: 'pixels',\r\n sizeMinPixels: {type: 'number', min: 0, value: 0}, // min point radius in pixels\r\n sizeMaxPixels: {type: 'number', min: 0, value: Number.MAX_SAFE_INTEGER}, // max point radius in pixels\r\n alphaCutoff: {type: 'number', value: 0.05, min: 0, max: 1},\r\n transitions: {type: 'object', value: {\r\n \"getColors\": {\r\n \"duration\": 300,\r\n \"easing\": t=>((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2,\r\n \"enter\": value => [value[0], value[1], value[2], 0]\r\n }\r\n }},\r\n fontFamily: {type: 'string', value: 'Source Sans Pro, monospace'},\r\n\r\n getPosition: {type: 'accessor', value: x => x.position},\r\n getIcon: {type: 'accessor', value: x => x.icon},\r\n getColor: {type: 'accessor', value: DEFAULT_COLOR},\r\n getSize: {type: 'accessor', value: 1},\r\n getAngle: {type: 'accessor', value: 0},\r\n getPixelOffset: {type: 'accessor', value: [0, 32]},\r\n\r\n getTextAnchor: {type: 'accessor', value: 'middle'},\r\n getAlignmentBaseline: {type: 'accessor', value: 'center'}\r\n};\r\n\r\nfunction getIconName(size) {\r\n if (size === 0) {\r\n return '';\r\n }\r\n if (size < 10) {\r\n return `marker-${size}`;\r\n }\r\n if (size < 100) {\r\n return `marker-${Math.floor(size / 10)}0`;\r\n }\r\n return 'marker-100';\r\n}\r\n\r\nfunction getIconSize(size) {\r\n return Math.min(100, size) / 100 + 1;\r\n}\r\n\r\nexport default class IconClusterLayer extends CompositeLayer {\r\n shouldUpdateState({changeFlags}) {\r\n return changeFlags.somethingChanged;\r\n }\r\n\r\n updateState({props, oldProps, changeFlags}) {\r\n const rebuildIndex = changeFlags.dataChanged || props.sizeScale !== oldProps.sizeScale;\r\n\r\n if (rebuildIndex) {\r\n const index = new Supercluster({maxZoom: 16, radius: props.sizeScale});\r\n index.load(\r\n props.data.map(d => ({\r\n geometry: {coordinates: props.getPosition(d)},\r\n properties: d\r\n }))\r\n );\r\n this.setState({index});\r\n }\r\n\r\n const z = Math.floor(this.context.viewport.zoom);\r\n if (rebuildIndex || z !== this.state.z) {\r\n this.setState({\r\n data: this.state.index.getClusters([-180, -85, 180, 85], z),\r\n z\r\n });\r\n }\r\n }\r\n\r\n getPickingInfo({info, mode}) {\r\n const pickedObject = info.object && info.object.properties;\r\n if (pickedObject) {\r\n if (pickedObject.cluster && mode !== 'hover') {\r\n info.objects = this.state.index\r\n .getLeaves(pickedObject.cluster_id, 25)\r\n .map(f => f.properties);\r\n }\r\n info.object = pickedObject;\r\n }\r\n return info;\r\n }\r\n\r\n renderLayers() {\r\n const {data} = this.state;\r\n const {\r\n iconAtlas,\r\n iconMapping,\r\n sizeScale,\r\n getIcon,\r\n getColor,\r\n getSize,\r\n getText,\r\n getPixelOffset,\r\n getTextAnchor,\r\n getAlignmentBaseline,\r\n transitions,\r\n fontFamily\r\n } = this.props;\r\n const iconLayer = new IconLayer(\r\n this.getSubLayerProps({\r\n id: 'icon',\r\n data,\r\n iconAtlas,\r\n iconMapping,\r\n sizeScale,\r\n getColor,\r\n getPosition: d => d.geometry.coordinates,\r\n getIcon,//getIconName(d.properties.cluster ? d.properties.point_count : 1),\r\n getSize: d => getIconSize(d.properties.cluster ? d.properties.point_count : getSize),\r\n transitions\r\n })\r\n );\r\n const textLayer = new TextLayer(\r\n this.getSubLayerProps({\r\n id: 'text',\r\n data,\r\n getText,\r\n getSize,\r\n getColor,\r\n getTextAnchor,\r\n getAlignmentBaseline,\r\n getPosition: d => d.geometry.coordinates,\r\n getPixelOffset,\r\n transitions,\r\n fontFamily\r\n })\r\n );\r\n return [iconLayer, textLayer];\r\n }\r\n}\r\n\r\nIconClusterLayer.layerName = 'IconClusterLayer';\r\nIconClusterLayer.defaultProps = defaultProps;","\r\n/* ================================================================ */\r\n// GLOBAL ACTIONS | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\nexport const UPDATE_SCREEN = 'UPDATE_SCREEN';\r\n\r\nexport const FETCH_PAGES = 'FETCH_PAGES';\r\nexport const FETCHED_PAGES = 'FETCHED_PAGES';\r\n\r\nexport const FETCH_MENU = 'FETCH_MENU';\r\nexport const FETCHED_MENU = 'FETCHED_MENU';\r\n/* ========================================== */\r\n/**\r\n * Window Resize\r\n * -------------\r\n * Updates screen width and height\r\n */\r\n/* ========================================== */\r\nexport function windowResize(width, height) {\r\n return (dispatch) => {\r\n const screen = {width: width, height: height};\r\n dispatch({type: UPDATE_SCREEN, payload: screen});\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Fetch Pages\r\n * -----------\r\n * Retrieves all pages in the pages\r\n * collection and saves the response data to state\r\n */\r\n/* ========================================== */\r\n/*export function fetchPages() {\r\n return (dispatch) => {\r\n dispatch({type: FETCH_PAGES});\r\n FirebaseDB.getCollection('pages')\r\n .then(snapshot=>{\r\n var dataPromises = [];\r\n snapshot.forEach(doc=>{\r\n dataPromises.push(new Promise(resolve=>{\r\n const pageData = doc.data();\r\n resolve(pageData);\r\n }));\r\n });\r\n Promise.all(dataPromises)\r\n .then(res=>{\r\n dispatch({type: FETCHED_PAGES, payload: res});\r\n })\r\n .catch(error=>console.log(error));\r\n })\r\n .catch(error=>console.log(error));\r\n };\r\n}*/\r\n/* ========================================== */\r\n/**\r\n * Fetch Menu\r\n * ----------\r\n * Queries the pages collection for main menu item\r\n * pages identified by \"mainMenuItem\" fields which are \r\n * true in value, and saves the response array to state\r\n */\r\n/* ========================================== */\r\n/*export function fetchMenu() {\r\n return (dispatch) => {\r\n dispatch({type: FETCH_MENU});\r\n //FirebaseDB.queryData('pages', {field: 'mainMenuItem', operator: '==', argument: true})\r\n FirebaseDB.getCollection('pages', {field:'mainMenuItem', order:'asc'})\r\n .then(snapshot=>{\r\n var dataPromises = [];\r\n snapshot.forEach(doc=>{\r\n dataPromises.push(new Promise(resolve=>{\r\n const data = doc.data();\r\n console.log(data);\r\n resolve({label: data.title, path: data.path});\r\n }));\r\n });\r\n Promise.all(dataPromises)\r\n .then(res=>{\r\n dispatch({type: FETCHED_MENU, payload: res});\r\n })\r\n .catch(error=>console.log(error));\r\n });\r\n \r\n };\r\n}*/\r\n","/* ================================================================ */\r\n// Reducers | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport { combineReducers } from 'redux';\r\nimport Data from './Data';\r\nimport Global from './Global';\r\nimport Map from './Map';\r\n/* ========================================== */\r\n// Reducer Combiner\r\n/* ========================================== */\r\nconst reducers = combineReducers({\r\n Data,\r\n Global,\r\n Map\r\n});\r\n/* ========================================== */\r\n// Exports\r\n/* ========================================== */\r\nexport default reducers;","/* ================================================================ */\r\n// DATA REDUCER | Data/index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\n//import update from \"react-addons-update\";\r\nimport update from 'immutability-helper';\r\nimport * as DataActions from '../../actions/Data';\r\n/* ========================================== */\r\n// Reducer\r\n/* ========================================== */\r\nexport default function reducer(\r\n state = {\r\n globe: {\r\n uuid: 'demo',\r\n title: '',\r\n config: {\r\n mobile: null,\r\n desktop: null,\r\n navigation: {\r\n type: 'inline',\r\n align: 'left',\r\n header: {logo: '/assets/myglobe.png'}\r\n }\r\n }\r\n },\r\n // Loading State\r\n loading: {\r\n globe: true,\r\n datasets: true,\r\n pages: true,\r\n stories: true,\r\n panels: true,\r\n states: true,\r\n layers: true,\r\n media:false,\r\n },\r\n // Datasets Data\r\n datasets: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n // Page Data\r\n pages: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n // Map Data\r\n layers: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n states: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n // Story Data\r\n stories: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n panels: {\r\n byId: [],\r\n byHash: {}\r\n },\r\n uploads: {\r\n code: 200,\r\n name:'',\r\n error:undefined\r\n },\r\n }, action) {\r\n switch (action.type) {\r\n\r\n /* ======================== */\r\n // FETCH ALL\r\n /* ======================== */\r\n case DataActions.FETCH_INIT: {\r\n return {\r\n ...state,\r\n loading: {\r\n globe: true,\r\n pages: true,\r\n stories: true,\r\n panels: true,\r\n states: true,\r\n layers: true,\r\n media:false\r\n }\r\n };\r\n }\r\n /* ======================== */\r\n // GLOBE CONFIG\r\n /* ======================== */\r\n case DataActions.FETCH_GLOBE: { return {...state, loading: {...state.loading, globe: true}}; }\r\n case DataActions.FETCH_GLOBE_FAILURE: { return {...state, error: action.error, loading: {...state.loading, globe: false}}; }\r\n case DataActions.FETCH_GLOBE_SUCCESS: { return {...state, globe: action.payload, loading: {...state.loading, globe: false}}; }\r\n /* ======================== */\r\n // DATA - DATASETS\r\n /* ======================== */\r\n case DataActions.Datasets.FETCH_DATASETS: { return {...state, loading: {...state.loading, datasets: true}}; }\r\n case DataActions.Datasets.FETCH_DATASETS_FAILURE: { return {...state, error: action.error, loading: {...state.loading, datasets: false}}; }\r\n case DataActions.Datasets.FETCH_DATASETS_SUCCESS: { return {...state, loading: {...state.loading, datasets: false}}; }\r\n case DataActions.Datasets.UPDATE_DATASET: { return {...state, loading: {...state.loading, datasets: true}}; }\r\n case DataActions.Datasets.UPDATE_DATASET_FAILURE: { return {...state, error: action.error, loading: {...state.loading, datasets: false}}; }\r\n case DataActions.Datasets.UPDATE_DATASET_SUCCESS: { return {...state, loading: {...state.loading, datasets: false}}; }\r\n case DataActions.Datasets.UPLOAD_MEDIA: { return {...state, loading: {...state.loading, media: true}, uploads: {code:action.payload,name:'',error:undefined}}; };\r\n case DataActions.Datasets.UPLOAD_MEDIA_SUCCESS: { return {...state, loading: {...state.loading, media: false}, uploads: {code:200,name:action.payload,error:undefined}}; };\r\n case DataActions.Datasets.UPLOAD_MEDIA_FAILURE: { return {...state, loading: {...state.loading, media: false}, uploads: {code:action.payload,name:'',error:action.error}}; };\r\n\r\n // case DataActions.Datasets.UPDATE_DODGY_VISLAYERS: { \r\n // console.log(\"~~~~\",action.payload); \r\n // var byId = []; action.payload.forEach(x=>{byId[x.Id]=x} ); \r\n // return {...state, \r\n // loading: {...state.loading, layers: false},\r\n // layers: {...state.layers, \r\n // byId: [...state.layers.byId, byId]\r\n // }\r\n // }; }\r\n case DataActions.Content.UPDATE_DODGY_VISLAYERS: {\r\n let layers = [];\r\n action.payload.forEach(l=>layers[l.Id] = l);\r\n return {\r\n ...state,\r\n layers: { \r\n byId: layers\r\n },\r\n loading: {\r\n ...state.loading,\r\n layers: false\r\n }\r\n }; }\r\n\r\n /* ======================== */\r\n // MAPPING - LAYERS\r\n /* ======================== */\r\n case DataActions.Mapping.FETCH_LAYERS: { return {...state, loading: {...state.loading, layers: true}}; }\r\n case DataActions.Mapping.FETCH_LAYERS_FAILURE: { return {...state, error: action.error, loading: {...state.loading, layers: false}}; }\r\n case DataActions.Mapping.FETCH_LAYERS_SUCCESS: { return {...state, loading: {...state.loading, layers: false}}; } \r\n /* ======================== */\r\n // MAPPING - STATES\r\n /* ======================== */\r\n case DataActions.Mapping.FETCH_STATES: { return {...state, loading: {...state.loading, states: true}}; }\r\n case DataActions.Mapping.FETCH_STATES_FAILURE: { return {...state, error: action.error, loading: {...state.loading, states: false}}; }\r\n case DataActions.Mapping.FETCH_STATES_SUCCESS: { return {...state, loading: {...state.loading, states: false}}; }\r\n case DataActions.Mapping.UPDATE_VISSTATES: { return {...state, loading: {...state.loading, states: false}}; }\r\n case DataActions.Mapping.UPDATE_VISSTATES_SUCCESS: { return {...state, loading: {...state.loading, states: false}}; }\r\n case DataActions.Mapping.UPDATE_VISSTATES_FAILURE: { return {...state, loading: {...state.loading, states: false}}; }\r\n /* ======================== */\r\n // CONTENT - PAGES\r\n /* ======================== */\r\n case DataActions.Content.FETCH_PAGES: { return {...state, loading: {...state.loading, pages: true}}; }\r\n case DataActions.Content.FETCH_PAGES_FAILURE: { return {...state, error: action.error, loading: {...state.loading, pages: false}}; }\r\n case DataActions.Content.FETCH_PAGES_SUCCESS: { return {...state, loading: {...state.loading, pages: false}}; }\r\n /* ======================== */\r\n // CONTENT - STORIES\r\n /* ======================== */\r\n case DataActions.Content.FETCH_STORIES: { return {...state, loading: {...state.loading, stories: true}}; }\r\n case DataActions.Content.FETCH_STORIES_FAILURE: { return {...state, error: action.error, loading: {...state.loading, stories: false}}; }\r\n case DataActions.Content.FETCH_STORIES_SUCCESS: { return {...state, loading: {...state.loading, stories: false}}; }\r\n case DataActions.Content.CREATE_STORY: { return {...state, loading: {...state.loading, stories: true}}; }\r\n case DataActions.Content.CREATE_STORY_SUCCESS: { \r\n return {\r\n ...state,\r\n stories: {\r\n byHash: {\r\n ...state.stories.byHash,\r\n [action.payload.uuid]: {\r\n ...action.payload\r\n }\r\n },\r\n byId: [...state.stories.byId, action.stories.uuid]\r\n },\r\n loading: {\r\n ...state.loading,\r\n stories: false\r\n }\r\n }; \r\n }\r\n case DataActions.Content.UPDATE_STORY: { return {...state, loading: {...state.loading, stories: true}}; }\r\n case DataActions.Content.UPDATE_STORY_SUCCESS: {\r\n console.log(action.payload);\r\n return {\r\n ...state,\r\n stories: {\r\n ...state.stories,\r\n byHash: {\r\n ...state.stories.byHash,\r\n [action.payload.uuid]: {\r\n ...state.stories.byHash[action.payload.uuid],\r\n ...action.payload\r\n }\r\n }\r\n },\r\n loading: {\r\n ...state.loading,\r\n stories: false\r\n }\r\n };\r\n }\r\n /* ======================== */\r\n // CONTENT - PANELS\r\n /* ======================== */\r\n case DataActions.Content.FETCH_PANELS: { return {...state, loading: {...state.loading, panels: true}}; }\r\n case DataActions.Content.FETCH_PANELS_FAILURE: { return {...state, error: action.error }; }\r\n case DataActions.Content.FETCH_PANELS_SUCCESS: { return {...state, loading: {...state.loading, panels: false}}; }\r\n case DataActions.Content.CREATE_PANEL: { return {...state, loading: {...state.loading, panels: true}}; }\r\n case DataActions.Content.CREATE_PANEL_SUCCESS: {\r\n return {\r\n ...state,\r\n panels: {\r\n byHash: {\r\n ...state.panels.byHash,\r\n [action.payload.uuid]: {\r\n ...action.payload\r\n }\r\n },\r\n byId: [...state.panels.byId, action.payload.uuid]\r\n },\r\n loading: {\r\n ...state.loading,\r\n panels: false\r\n }\r\n }; }\r\n case DataActions.Content.UPDATE_PANEL: { return {...state, loading: {...state.loading, panels: true}}; }\r\n case DataActions.Content.UPDATE_PANEL_SUCCESS: {\r\n console.log(action.payload);\r\n return {\r\n ...state,\r\n panels: {\r\n ...state.panels,\r\n byHash: {\r\n ...state.panels.byHash,\r\n [action.payload.uuid]: {\r\n ...state.panels.byHash[action.payload.uuid],\r\n ...action.payload\r\n }\r\n }\r\n },\r\n loading: {\r\n ...state.loading,\r\n panels: false\r\n }\r\n };\r\n }\r\n case DataActions.Content.UPDATE_PANEL_ORDER: { return {...state, loading: {...state.loading, panels: true}}; }\r\n case DataActions.Content.UPDATE_PANEL_ORDER_FAILURE: { return {...state, error: action.payload, loading: {...state.loading, panels: false}}; }\r\n case DataActions.Content.UPDATE_PANEL_ORDER_SUCCESS: {\r\n let newPanelHash = {...state.panels.byHash};\r\n action.payload.forEach(updatedPanel=>newPanelHash[updatedPanel.uuid] = {...newPanelHash[updatedPanel.uuid], ...updatedPanel});\r\n return {\r\n ...state,\r\n panels: {\r\n ...state.panels,\r\n byHash: newPanelHash\r\n },\r\n loading: {\r\n ...state.loading,\r\n panels: false\r\n }\r\n };\r\n }\r\n case DataActions.Content.DELETE_PANEL: { return {...state, loading: {...state.loading, panels: true}}; }\r\n case DataActions.Content.DELETE_PANEL_FAILURE: { return {...state, error: action.payload, loading: {...state.loading, panels: false}}; }\r\n case DataActions.Content.DELETE_PANEL_SUCCESS: { \r\n //TODO: move this to generic data operator\r\n // Remove panel by id from both duplicated ids array and hashmap\r\n let panelId = action.payload;\r\n let newPanelIds = [...state.panels.byId];\r\n let newPanelHash = {...state.panels.byHash};\r\n let panelIdIndex = newPanelIds.indexOf(panelId);\r\n // Remove panelId from ids array if exists\r\n if(panelIdIndex > -1) {\r\n newPanelIds.splice(panelIdIndex, 1);\r\n }\r\n // Remove panel from panel hash if exists\r\n if (Object.prototype.hasOwnProperty.call(newPanelHash, panelId)) { \r\n delete newPanelHash[panelId];\r\n } \r\n return {\r\n ...state,\r\n panels: {\r\n byId: newPanelIds,\r\n byHash: newPanelHash\r\n },\r\n loading: {\r\n ...state.loading, \r\n panels: false\r\n }\r\n }; \r\n }\r\n case DataActions.Content.PANEL_ACTION_FAILURE: { return {...state, error: action.error }; }\r\n /* ======================== */\r\n // GENERIC - ADD DATA\r\n /* ======================== */\r\n case DataActions.ADD_DATA_ITEM: {\r\n const {datasetID, itemID, payload} = action;\r\n // Get Dataset from state\r\n const dataset = state[datasetID];\r\n // Do not override existing data items (use UPDATE_DATA_ITEM)\r\n //if(dataset.byHash.hasOwnProperty(itemID))\r\n if(Object.prototype.hasOwnProperty.call(dataset.byHash, itemID))\r\n return state;\r\n const updatedDataset = update(state[datasetID], {\r\n byId: {$set: [\r\n ...state[datasetID].byId,\r\n itemID\r\n ]},\r\n byHash: {$set: {\r\n ...state[datasetID].byHash,\r\n [itemID]: payload\r\n }}\r\n });\r\n return {...state, [datasetID]: updatedDataset};\r\n }\r\n case DataActions.ADD_DATA_ARRAY: {\r\n const {datasetID, payload} = action;\r\n // Process payload array\r\n var hashes = {};\r\n const ids = payload.map(row=>{\r\n const {id, data} = row;\r\n hashes[id] = data;\r\n return id;\r\n });\r\n const updatedDataset = update(state[datasetID], {\r\n byId: {$set: [\r\n ...state[datasetID].byId,\r\n ...ids\r\n ]},\r\n byHash: {$set: {\r\n ...state[datasetID].byHash,\r\n ...hashes\r\n }}\r\n });\r\n return {...state, [datasetID]: updatedDataset};\r\n }\r\n case DataActions.ADD_DATA_HASHMAP: {\r\n const {datasetID, payload} = action;\r\n // Process payload array\r\n const ids = Object.keys(payload);\r\n const updatedDataset = update(state[datasetID], {\r\n byId: {$set: [\r\n ...state[datasetID].byId,\r\n ...ids\r\n ]},\r\n byHash: {$set: {\r\n ...state[datasetID].byHash,\r\n ...payload\r\n }}\r\n });\r\n return {...state, [datasetID]: updatedDataset};\r\n }\r\n default: { return state; }\r\n }\r\n}","/* ================================================================ */\r\n// GLOBAL REDUCER | Global/index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\n//import update from \"react-addons-update\";\r\nimport * as GlobalActions from '../../actions/Global';\r\nexport default function reducer(\r\n state = {\r\n screen: {\r\n width: window.innerWidth, \r\n height: window.innerHeight\r\n },\r\n loading: false,\r\n pages: [],\r\n menu: []\r\n }, action) {\r\n switch (action.type) {\r\n /* ======================== */\r\n // SCREEN\r\n /* ======================== */\r\n case GlobalActions.UPDATE_SCREEN: { return {...state, screen: action.payload}; }\r\n /* ======================== */\r\n // PAGES\r\n /* ======================== */\r\n //case GlobalActions.FETCH_PAGES: { return {...state, loading: false}; }\r\n //case GlobalActions.FETCHED_PAGES: { return {...state, pages: action.payload, loading: false}; }\r\n /* ======================== */\r\n // MAIN MENU\r\n /* ======================== */\r\n //case GlobalActions.FETCH_MENU: { return {...state, loading: true}; }\r\n //case GlobalActions.FETCHED_MENU: { return {...state, menu: action.payload, loading: false}; }\r\n }\r\n return state;\r\n}","/* ================================================================ */\r\n// MAP REDUCER | Map/index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\n//import update from \"react-addons-update\";\r\n//import {FlyToInterpolator} from 'deck.gl';\r\nimport * as MapActions from '../../actions/Map';\r\nimport {MapController, COORDINATE_SYSTEM} from '@deck.gl/core';\r\nimport GL from '@luma.gl/constants';\r\n/* ========================================== */\r\n// Reducer\r\n/* ========================================== */\r\nexport default function reducer(\r\n state = {\r\n // Loading State\r\n loading: {\r\n map: true,\r\n style: true,\r\n layers: true,\r\n classes: false\r\n },\r\n // Current State\r\n state: 'default',\r\n // Mapping Types\r\n type: 'deckgl',\r\n // View State\r\n viewState: {\r\n \"destination\": {\r\n \"x\": -5002965.10882716,\r\n \"y\": 2519368.2360078953,\r\n \"z\": -3083740.637290964\r\n },\r\n \"duration\": 10,\r\n \"orientation\": {\r\n \"heading\": 1.1542992823390623,\r\n \"pitch\": -0.5273718484770713,\r\n \"roll\": 6.280199761841466\r\n }\r\n },\r\n // JSON Config\r\n jsonConfig: {\r\n //classes: Object.assign({}, require('@deck.gl/layers'), require('@deck.gl/aggregation-layers')),\r\n constants: {\r\n MapController\r\n },\r\n // a map of all layers that should be exposes as JSONLayers\r\n layers: {...require('@deck.gl/layers')},\r\n // Any non-standard views\r\n views: {},\r\n // Enumerations that should be available to JSON parser\r\n // Will be resolved as `.`\r\n enumerations: {\r\n COORDINATE_SYSTEM,\r\n GL\r\n }\r\n },\r\n // Layer Classes\r\n layerClasses: {\r\n ...require('@deck.gl/layers'),\r\n IconClusterLayer: require('@myglobe/core/dist/Map/layers/IconClusterLayer').default\r\n },\r\n /*loadedLayers: {\r\n deckLayers: [],\r\n mapboxLayers: [],\r\n markers: []\r\n },\r\n // Loaded Layers\r\n deckLayers: [],*/\r\n loadedLayers: [\r\n /*'shipping',\r\n 'field-compression-stations',\r\n 'water-treatment',\r\n 'central-processing',\r\n 'export-pipeline',\r\n 'collection-header',\r\n 'gea-members',\r\n 'gladstone-lga',\r\n 'gladstone-port',\r\n 'qclng-plant',\r\n 'qgc-pl',\r\n 'qsc_extracted_data',\r\n 'gladstone-land-use'*/\r\n ],\r\n\r\n // Loaded Layer Objects\r\n deckLayers: [],\r\n mapboxLayers: [],\r\n markers: [],\r\n // Current Layer Ids\r\n layers: [],\r\n // Style\r\n mapStyle: null,\r\n spriteJSON: [],\r\n spriteImage: [],\r\n // Map Base Config\r\n mapboxToken: null,\r\n mapboxUserId: 'ifeviser',\r\n baseMapStyle: null\r\n\r\n }, action) {\r\n switch (action.type) {\r\n /* ======================== */\r\n // DECKGL CONFIG\r\n /* ======================== */\r\n case MapActions.UPDATE_DECK_LAYER_CLASSES: { return {...state, loading: {...state.loading, deckConfig: true}}; }\r\n case MapActions.UPDATE_DECK_LAYER_CLASSES_SUCCESS: { return {...state, layerClasses: {...state.layerClasses, ...action.payload}, loading: {...state.loading, deckConfig: false}}; }\r\n case MapActions.UPDATE_DECK_LAYER_CLASSES_FAILURE: { return {...state, error: action.error, loading: {...state.loading, deckConfig: false}}; }\r\n /* ======================== */\r\n // CONFIG\r\n /* ======================== */\r\n case MapActions.UPDATE_MAP_CONFIG: { return {...state, loading: {...state.loading, map: true}}; }\r\n case MapActions.UPDATE_MAP_CONFIG_SUCCESS: {\r\n const {mapboxUserId, mapboxToken} = action.payload;\r\n return {...state, mapboxUserId, mapboxToken, loading: {...state.loading, map: false}};\r\n }\r\n case MapActions.UPDATE_MAP_CONFIG_FAILURE: { return {...state, error: action.error, loading: {...state.loading, map: false}}; }\r\n case MapActions.UPDATE_MAP_TILES_LOADED: { return {...state, loading: {...state.loading, map: false}}};\r\n /* ======================== */\r\n // VIEW STATE\r\n /* ======================== */\r\n case MapActions.UPDATE_MAP_VIEW_STATE: {\r\n // Default to existing state parameters on unused keys\r\n\r\n let updatedMapView = {...state.viewState};\r\n Object.keys(action.payload).forEach(key=>updatedMapView[key] = action.payload[key]);\r\n return {...state, viewState: updatedMapView};\r\n }\r\n /* ======================== */\r\n // MAP STYLES\r\n /* ======================== */\r\n case MapActions.UPDATE_MAP_STYLES: { return {...state, loading: {...state.loading, style: true }}; }\r\n case MapActions.UPDATE_MAP_STYLES_SUCCESS: { return {...state, mapStyle: action.payload.style, spriteJSON: action.payload.spriteJSON, spriteImage: action.payload.spriteImage, loading: {...state.loading, style: false }}; }\r\n case MapActions.UPDATE_MAP_STYLES_FAILURE: { return {...state, error: action.error, loading: {...state.loading, style: false }}; }\r\n /* ======================== */\r\n // VIS LAYERS\r\n /* ======================== */\r\n case MapActions.UPDATE_MAP_LAYERS: { return {...state, loading: {...state.loading, layers: true}}; }\r\n case MapActions.UPDATE_MAP_LAYERS_SUCCESS: {\r\n // Get current layers\r\n const layers = action.payload.layers || [];\r\n\r\n // Check for new layers\r\n if(action.payload.deckLayers || action.payload.mapboxLayers || action.payload.markers) {\r\n // New layers\r\n const newDeckLayers = action.payload.deckLayers || [];\r\n const newMapboxLayers = action.payload.mapboxLayers || [];\r\n const newMarkers = action.payload.markers || [];\r\n\r\n // Merge new layers into loaded layers\r\n const deckLayers = [...state.deckLayers, ...newDeckLayers];\r\n const mapboxLayers = [...state.mapboxLayers, ...newMapboxLayers];\r\n const markers = [...state.markers, ...newMarkers];\r\n\r\n // Update current layers and loaded layers\r\n return {...state, layers, deckLayers, mapboxLayers, markers, loading: {...state.loading, layers: false}};\r\n\r\n } else {\r\n // Update current layers\r\n return {...state, layers, loading: {...state.loading, layers: false}};\r\n }\r\n }\r\n case MapActions.UPDATE_MAP_LAYERS_FAILURE: { return {...state, error: action.error, loading: {...state.loading, layers: false}}; }\r\n /* ======================== */\r\n // MAP STATE FAILURE\r\n /* ======================== */\r\n case MapActions.UPDATE_MAP_STATE_FAILURE: {return {...state, error: action.error}; }\r\n /* ======================== */\r\n // LAYER CLASSES\r\n /* ======================== */\r\n case MapActions.UPDATE_LAYER_CLASSES: {return {...state, layerClasses: {...state.layerClasses, ...action.payload}, loading: {...state.loading, classes: false}}; }\r\n }\r\n return state;\r\n}","/* ================================================================ */\r\n// STORE | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport { applyMiddleware, createStore } from 'redux';\r\nimport {createLogger} from 'redux-logger';\r\nimport thunk from 'redux-thunk';\r\nimport { createPromise } from 'redux-promise-middleware';\r\nimport createDebounce from 'redux-debounced';\r\nimport reducers from '../reducers';\r\n/* ========================================== */\r\n// Middleware\r\n/* ========================================== */\r\nlet middlewareArr = [createDebounce(), createPromise(), thunk];\r\n/*const reduxLogger = createLogger({\r\n level: 'console'\r\n});*/\r\nif(process.env.NODE_ENV !== 'production') {\r\n const mylogger = new createLogger({\r\n predicate: (getState, action) => !action.type.includes('UPDATE_MAP_VIEW_STATE')\r\n });\r\n\r\n middlewareArr = [...middlewareArr, mylogger];\r\n}\r\nconst middleware = applyMiddleware(...middlewareArr);\r\n/* ========================================== */\r\n// Exports\r\n/* ========================================== */\r\nexport function configureStore(initialState = {}) {\r\n const store = createStore(\r\n reducers,\r\n initialState,\r\n applyMiddleware(thunk)\r\n );\r\n store.asyncReducers = {};\r\n return store;\r\n}\r\nexport default createStore(reducers, middleware);\r\n\r\n/*\r\nexport function injectAsyncReducer(store, name, asyncReducer) {\r\n store.asyncReducers[name] = asyncReducer;\r\n store.replaceReducer(createReducer(store.asyncReducers));\r\n}\r\n\r\n/*\r\nimport { createStore } from 'redux';\r\nimport createReducer from './reducers';\r\n\r\nexport default function configureStore(initialState) {\r\n const store = createStore(createReducer(), initialState);\r\n store.asyncReducers = {};\r\n return store;\r\n}\r\n\r\nexport function injectAsyncReducer(store, name, asyncReducer) {\r\n store.asyncReducers[name] = asyncReducer;\r\n store.replaceReducer(createReducer(store.asyncReducers));\r\n}*/","/* ================================================================ */\r\n// LAYOUT CONFIG VALIDATION | LayoutConfig.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport {LayoutTypes, AlignmentTypes} from '@myglobe/core/dist/types';\r\nimport { isNullOrUndefined } from 'util';\r\n/* ========================================== */\r\n/**\r\n * Layout Config Validator\r\n * -----------------------\r\n * Validates layout configuration against layout types and alignment\r\n * settings\r\n *\r\n * @param {*} propValue\r\n * @param {*} key\r\n * @param {*} componentName\r\n * @param {*} location\r\n * @param {*} propFullName\r\n */\r\nfunction LayoutConfig(propValue, key, componentName, location, propFullName) {\r\n // Check Layout config\r\n const layoutConfig = propValue[key];\r\n if(!isNullOrUndefined(layoutConfig)) {\r\n if (\r\n // Invalid object check\r\n (typeof layoutConfig !== 'object') ||\r\n // Missing prop 'type' check\r\n !Object.prototype.hasOwnProperty.call(layoutConfig, 'type') ||\r\n // Invalid Layout Type\r\n !Object.values(LayoutTypes).includes(layoutConfig.type) ||\r\n // Invalid Grid Layout config check\r\n (layoutConfig.type === LayoutTypes.GRID &&\r\n (\r\n !Object.prototype.hasOwnProperty.call(layoutConfig, 'align')\r\n || !Object.values(AlignmentTypes).includes(layoutConfig.align)\r\n )\r\n )\r\n ) {\r\n // Invalid Layout Configuration\r\n console.debug('LayoutConfig | ', 'LayoutConfig invalid - ', 'layoutConfig:', layoutConfig);\r\n return new Error(`Invalid prop ${propFullName} passed to ${componentName}. Expected a valid layout configuratiom.`);\r\n }\r\n }\r\n};\r\nexport default LayoutConfig;","import React, {useState} from 'react';\r\n// Hook\r\nfunction useLocalStorage(key, initialValue) {\r\n // State to store our value\r\n // Pass initial state function to useState so logic is only executed once\r\n const [storedValue, setStoredValue] = useState(() => {\r\n try {\r\n // Get from local storage by key\r\n const item = window.localStorage.getItem(key);\r\n // Parse stored json or if none return initialValue\r\n return item ? JSON.parse(item) : initialValue;\r\n } catch (error) {\r\n // If error also return initialValue\r\n console.log(error);\r\n return initialValue;\r\n }\r\n });\r\n \r\n // Return a wrapped version of useState's setter function that ...\r\n // ... persists the new value to localStorage.\r\n const setValue = value => {\r\n try {\r\n // Allow value to be a function so we have same API as useState\r\n const valueToStore =\r\n value instanceof Function ? value(storedValue) : value;\r\n // Save state\r\n setStoredValue(valueToStore);\r\n // Save to local storage\r\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\r\n } catch (error) {\r\n // A more advanced implementation would handle the error case\r\n console.log(error);\r\n }\r\n };\r\n \r\n return [storedValue, setValue];\r\n }\r\n\r\nexport default useLocalStorage;","/* ================================================================ */\r\n// USE THEME MODE | useThemeMode.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useEffect} from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Local Components\r\nimport useMedia from '@myglobe/core/dist/hooks/useMedia';\r\nimport useLocalStorage from './useLocalStorage';\r\n\r\n/**\r\n * Use Theme Mode\r\n * --------------\r\n * Handles theme mode\r\n *\r\n * @return {[type]} [return description]\r\n */\r\n/*\r\nfunction useThemeMode() {\r\n // Use our useLocalStorage hook to persist state through a page refresh.\r\n // Read the recipe for this hook to learn more: usehooks.com/useLocalStorage\r\n const [enabledState, setEnabledState] = useLocalStorage('dark-mode-enabled');\r\n\r\n // See if user has set a browser or OS preference for dark mode.\r\n // The usePrefersDarkMode hook composes a useMedia hook (see code below).\r\n const prefersDarkMode = usePrefersDarkMode();\r\n\r\n // If enabledState is defined use it, otherwise fallback to prefersDarkMode.\r\n // This allows user to override OS level setting on our website.\r\n const enabled =\r\n typeof enabledState !== 'undefined' ? enabledState : prefersDarkMode;\r\n\r\n // Fire off effect that add/removes dark mode class\r\n useEffect(\r\n () => {\r\n const className = 'dark-mode';\r\n const element = window.document.body;\r\n if (enabled) {\r\n element.classList.add(className);\r\n } else {\r\n element.classList.remove(className);\r\n }\r\n },\r\n [enabled] // Only re-call effect when value changes\r\n );\r\n\r\n // Return enabled state and setter\r\n return [enabled, setEnabledState];\r\n}*/\r\n\r\n\r\n// Hook\r\nexport default function useDarkMode() {\r\n // Use our useLocalStorage hook to persist state through a page refresh.\r\n // Read the recipe for this hook to learn more: usehooks.com/useLocalStorage\r\n const [enabledState, setEnabledState] = useLocalStorage('dark-mode-enabled');\r\n\r\n // See if user has set a browser or OS preference for dark mode.\r\n // The usePrefersDarkMode hook composes a useMedia hook (see code below).\r\n const prefersDarkMode = usePrefersDarkMode();\r\n\r\n // If enabledState is defined use it, otherwise fallback to prefersDarkMode.\r\n // This allows user to override OS level setting on our website.\r\n const enabled = typeof enabledState !== 'undefined' ? enabledState : true;//prefersDarkMode;\r\n\r\n // Fire off effect that add/removes dark mode class\r\n useEffect(\r\n () => {\r\n const className = 'dark-mode';\r\n const element = window.document.body;\r\n if (enabled) {\r\n element.classList.add(className);\r\n } else {\r\n element.classList.remove(className);\r\n }\r\n },\r\n [enabled] // Only re-call effect when value changes\r\n );\r\n\r\n // Return enabled state and setter\r\n return [enabled, setEnabledState];\r\n}\r\n\r\n// Compose our useMedia hook to detect dark mode preference.\r\n// The API for useMedia looks a bit weird, but that's because ...\r\n// ... it was designed to support multiple media queries and return values.\r\n// Thanks to hook composition we can hide away that extra complexity!\r\n// Read the recipe for useMedia to learn more: usehooks.com/useMedia\r\nfunction usePrefersDarkMode() {\r\n return useMedia(['(prefers-color-scheme: dark)'], [true], false);\r\n}","/* ================================================================ */\r\n// MAP SELECTORS | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport createCachedSelector from 're-reselect';\r\nimport {createSelector} from 'reselect';\r\nimport PropTypes from 'prop-types';\r\nimport {isNullOrUndefined} from 'util';\r\n//import isEqual from 'lodash.isEqual';\r\n// Theme Setup\r\nimport {getTheme} from '@myglobe/core/dist/styles/theme';\r\nimport createMuiTheme from '@material-ui/core/styles/createMuiTheme';\r\nimport { VisEngineTypes, LayerTypes } from '@myglobe/core/dist/types';\r\n// Selectors\r\nimport {getLayersById, getLayersByHash, getDatasetsById, getDatasetsByHash} from '../Data';\r\n/* ========================================== */\r\n// LOADING\r\n/* ========================================== */\r\n/**\r\n * Get Loading Status\r\n * ------------------\r\n * Determines current loading state either\r\n * by all keys within in the loading state\r\n * or according to a given specific loading key\r\n *\r\n * @param {object} store reducer store\r\n * @param {string} checkState loading key to check\r\n */\r\nexport const getMapLoadingStatus = (store, checkState) => (checkState && store.Map.loading[checkState] !== null) ? store.Map.loading[checkState] : Object.values(store.Map.loading).includes(true);\r\nexport const getMapLoadingStatusSelector = statuses => {\r\n return createSelector(\r\n store=>store.Map.loading,\r\n (loading)=>{\r\n const loadingKeys = Object.keys(loading);\r\n const loadingValues = Object.values(loading);\r\n // Check all statuses exist\r\n if(statuses.every(status=>loadingKeys.includes(status))) {\r\n // Get combined loading state of all requested statuses\r\n // > Loading state is true if one status is found to be loading\r\n return statuses.some(status=>loading[status] === true);\r\n } else {\r\n // Universal loading (all loading statues)\r\n return loadingValues.includes(true);\r\n }\r\n }\r\n );\r\n};\r\ngetMapLoadingStatusSelector.propTypes = {\r\n statuses: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\nexport const getMapStyleURL = store => typeof store.Map.mapStyle === 'string' ? store.Map.mapStyle : store.Map.mapStyle.url;\r\n/* ========================================== */\r\n// MAP\r\n/* ========================================== */\r\n/**\r\n * Get View State\r\n * --------------\r\n * Get current map view state\r\n *\r\n * @param {object} store\r\n */\r\nexport const getViewState = store => store.Map.viewState;\r\n/* ========================================== */\r\n// LAYERS\r\n/* ========================================== */\r\n/**\r\n * Get Active Layers\r\n * -----------------\r\n * Returns current layer ids loaded on the map\r\n *\r\n * @param {object} store reducer store\r\n */\r\nexport const getActiveLayerIds = store => store.Map.layers;\r\nexport const getActiveLayers = createSelector(\r\n getActiveLayerIds,\r\n getLayersById,\r\n getLayersByHash,\r\n getDatasetsById,\r\n getDatasetsByHash,\r\n (activeLayerIds, layerIds, layerHash, datasetIds, datasetHash) => {\r\n const layerData = activeLayerIds.map(activeLayerId=>{\r\n if(layerIds.includes(activeLayerId)) {\r\n let layer = layerHash[activeLayerId];\r\n let {dataset} = layer;\r\n if(dataset && datasetIds.includes(dataset)) {\r\n layer.config.data = datasetHash[dataset].endpointData || datasetHash[dataset].endpoint;\r\n }\r\n return layer;\r\n }\r\n });\r\n const mapboxLayers = layerData.filter(layer=>layer && layer.type.toLowerCase() === VisEngineTypes.MAPBOX);\r\n const deckLayers = layerData.filter(layer=>layer && layer.type.toLowerCase() === VisEngineTypes.DECKGL);\r\n console.debug('Map (Selector) | ', 'getActiveLayers -', 'activeLayerIds:', activeLayerIds, 'mapboxLayers:', mapboxLayers, 'deckLayers:', deckLayers);\r\n return {mapboxLayers, deckLayers};\r\n }\r\n)/*(\r\n (_store_, activeLayerIds)=>{console.log(activeLayerIds); return activeLayerIds.join(':');}\r\n)*/;\r\n\r\n\r\n/* ========================================== */\r\n// JSON DeckGL Configuration\r\n/* ========================================== */\r\nexport const getBaseJSONConfig = store => store.Map.jsonConfig;\r\nexport const getLayerClasses = store => store.Map.layerClasses;\r\nexport const getJSONConfig = createSelector(\r\n getBaseJSONConfig,\r\n getLayerClasses,\r\n (baseConfig, layerClasses) => {\r\n // Merge base configuration with currently loaded layers\r\n const jsonConfig = {\r\n ...baseConfig,\r\n layers: {...baseConfig.layers, ...layerClasses}\r\n };\r\n console.debug('Map (Selector) |', 'getJSONConfig -', 'layerClasses:', layerClasses, 'baseConfig:', baseConfig, 'outputConfig:', jsonConfig);\r\n return jsonConfig;\r\n }\r\n);\r\n\r\n/*\r\n\r\nconst getExternalLayerClasses = async (layers) => {\r\n //const layerIDs = [...new Set(Object.values(payload).map(state=>state.layers).flat())];\r\n const classes = Array.from(new Set(layers.map(layer=>{\r\n /*if(LayerTypes.deckgl.layers.includes(layer.type))\r\n return import('@deckgl/layers');\r\n */\r\n /*\r\n const type = layer.type;\r\n if(LayerTypes.deckgl.aggregationLayers.includes(type))\r\n import('@deck.gl/aggregation-layers').then(module=>{return module});\r\n if(LayerTypes.deckgl.geoLayers.includes(type))\r\n return import('@deck.gl/geo-layers').then(module=>{return module});\r\n if(LayerTypes.deckgl.custom.includes(type)) {\r\n // Attempt fetch of custom layer\r\n try {\r\n return require(`@myglobe/core/dist/Map/layers/${type}`).define;\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n return null;\r\n })));\r\n\r\n console.log(classes);\r\n return classes;\r\n};\r\nconst types = [...LayerTypes.deckgl.layers, ...LayerTypes.deckgl.aggregationLayers, ...LayerTypes.deckgl.geoLayers, ...LayerTypes.deckgl.custom];\r\ngetLayerClasses.propTypes = {\r\n layers: PropTypes.arrayOf(PropTypes.shape({\r\n type: PropTypes.oneOf(types)\r\n }))\r\n};*/","/* ================================================================ */\r\n// LOADING OVERLAY COMPONENT | Loading.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect, useRef} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {connect} from 'react-redux';\r\n//import hexToRgba from 'hex-to-rgba';\r\n// MaterialUI Components\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n//import Fade from '@material-ui/core/Fade';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\n// MaterialUI Style\r\nimport useTheme from '@material-ui/styles/useTheme';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// MaterialUI Icons\r\nimport CloseIcon from '@material-ui/icons/Close';\r\n// Assets\r\nimport {MyGlobeLoading} from '../assets/svgs';\r\nimport {getLoadingStatusV2} from '../selectors/Data';\r\nimport {getMapLoadingStatus} from '../selectors/Map';\r\n\r\n\r\n//import lottie from 'lottie-web';\r\n//const animationData = {\"v\":\"5.6.6\",\"fr\":30,\"ip\":0,\"op\":150,\"w\":190,\"h\":170,\"nm\":\"myGlobeLoader\",\"ddd\":0,\"assets\":[],\"fonts\":{\"list\":[{\"fName\":\"OpenSans-Bold\",\"fFamily\":\"Open Sans\",\"fStyle\":\"Bold\",\"ascent\":75.9994506835938}]},\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"eyes\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"t\":44,\"s\":[0]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.271],\"y\":[0]},\"t\":54,\"s\":[100]},{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":94,\"s\":[100]},{\"t\":104,\"s\":[0]}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[88.748,88.005,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[92.748,102.505,0],\"ix\":1},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,1]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0]},\"t\":63,\"s\":[100,100,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,1]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0]},\"t\":71.5,\"s\":[100,30,100]},{\"t\":80,\"s\":[100,100,100]}],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[18,18],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.003921568627,0.160784313725,0.258823529412,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[117.886,102.505],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false},{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[18,18],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.003921568627,0.160784313725,0.258823529412,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[67.61,102.505],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 2\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":2,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":150,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":5,\"nm\":\".....................................................................................................................................................................................................................................................................................................................................................................................................\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[96,93,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[295.497,-0.77,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"hasMask\":true,\"masksProperties\":[{\"inv\":false,\"mode\":\"n\",\"pt\":{\"a\":0,\"k\":{\"i\":[[0,0],[38.016,0],[0,-38.016],[-38.016,0],[0,38.016],[0,0],[0,0]],\"o\":[[0,-38.016],[-38.016,0],[0,38.016],[38.016,0],[0,0],[0,0],[0,0]],\"v\":[[354.932,2.19],[286.097,-66.645],[217.262,2.19],[286.097,71.025],[354.932,2.19],[354.932,-50.258],[373.738,-69.065]],\"c\":false},\"ix\":1},\"o\":{\"a\":0,\"k\":100,\"ix\":3},\"x\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Mask 1\"}],\"t\":{\"d\":{\"k\":[{\"s\":{\"s\":159.300003051758,\"f\":\"OpenSans-Bold\",\"t\":\".....................................................................................................................................................................................................................................................................................................................................................................................................\",\"j\":0,\"tr\":-277,\"lh\":191.160003662109,\"ls\":0,\"fc\":[0.004,0.161,0.259]},\"t\":0}]},\"p\":{\"m\":0,\"f\":{\"a\":0,\"k\":-18.448,\"ix\":5},\"l\":{\"a\":0,\"k\":0,\"ix\":6},\"a\":0,\"p\":0,\"r\":0},\"m\":{\"g\":1,\"a\":{\"a\":0,\"k\":[0,0],\"ix\":2}},\"a\":[{\"nm\":\"Animator 1\",\"s\":{\"t\":0,\"xe\":{\"a\":0,\"k\":0,\"ix\":7},\"ne\":{\"a\":0,\"k\":0,\"ix\":8},\"a\":{\"a\":0,\"k\":100,\"ix\":4},\"b\":1,\"rn\":0,\"sh\":3,\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":2,\"s\":[100]},{\"i\":{\"x\":[0.665],\"y\":[1]},\"o\":{\"x\":[0.331],\"y\":[0]},\"t\":60,\"s\":[3]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.334],\"y\":[0]},\"t\":84,\"s\":[2.6]},{\"t\":143,\"s\":[100]}],\"ix\":1},\"r\":1},\"a\":{\"o\":{\"a\":0,\"k\":0,\"ix\":9}}}]},\"ip\":0,\"op\":150,\"st\":0,\"bm\":0}],\"markers\":[],\"chars\":[{\"ch\":\".\",\"size\":159.300003051758,\"style\":\"Bold\",\"w\":28.52,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-1.498,-1.448],[-2.734,0],[-1.498,1.481],[0,2.572],[1.481,1.433],[2.702,0],[1.465,-1.399],[0,-2.734]],\"o\":[[1.497,1.448],[2.669,0],[1.497,-1.481],[0,-2.669],[-1.482,-1.432],[-2.8,0],[-1.465,1.4],[0,2.637]],\"v\":[[7.959,-0.854],[14.307,1.318],[20.557,-0.903],[22.803,-6.982],[20.581,-13.135],[14.307,-15.283],[7.91,-13.184],[5.713,-6.982]],\"c\":true},\"ix\":2},\"nm\":\".\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\".\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Open Sans\"}]};\r\n\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(/*theme => (*/{\r\n paper: {\r\n backgroundColor: 'rgba(35,35,45, 0.8)',//'#23232d',\r\n //backgroundColor: hexToRgba(theme.palette.background.paper, '0.9'),\r\n transition: 'all 500ms ease-in-out'\r\n },\r\n logo: {\r\n opacity: 1,\r\n width: '50%',\r\n height: '50%',\r\n objectFit: 'contain',\r\n pointerEvents: 'none',\r\n transition: 'all 500ms ease-in-out'\r\n },\r\n content: {\r\n overflow: 'hidden',\r\n position: 'relative',\r\n width: '100%',\r\n height: 'calc(100% - 5em)',\r\n padding: 0,\r\n margin: 0,\r\n '&:first-child': {\r\n padding: 0\r\n }\r\n },\r\n overlay: {\r\n height: '100%',\r\n display: 'flex',\r\n flexAlign:'center',\r\n justifyContent:'center',\r\n alignItems: 'center'\r\n },\r\n close: {\r\n position: 'absolute',\r\n right: '1em',\r\n top: '1em',\r\n color: '#FAFAFA'//theme.palette.text.primary\r\n },\r\n loadingIcon: {\r\n backgroundColor: 'white',\r\n height: '20em',\r\n width: '20em'\r\n },\r\n // Passive Loader\r\n passiveLoader: {\r\n position:'absolute',\r\n textAlign:'center',\r\n bottom:0,\r\n width:'100%',\r\n color: '#FAFAFA',//theme.palette.text.primary,\r\n zIndex: '200',\r\n fontSize:'.9rem',\r\n '& p':{\r\n paddingBottom:'1em',\r\n }\r\n },\r\n bar: {\r\n background:'none'\r\n }\r\n});//);\r\n/* ========================================== */\r\n/**\r\n * Loading Overlay\r\n * --------------\r\n * Displays a static loading overlay\r\n *\r\n * @param {object} props component props\r\n * @param {bool} props.isLoading current loading status\r\n * @param {bool} props.isManual manual close\r\n */\r\n/* ========================================== */\r\nconst Loading = (props) => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const loadingRef = useRef(null);\r\n const {\r\n isLoading,\r\n isMapLoading,\r\n isManual\r\n } = props;\r\n const [open, setOpen] = useState(true);\r\n /* ======================== */\r\n // EFFECTS\r\n /* ======================== */\r\n /*useEffect(()=>{\r\n lottie.loadAnimation({\r\n container: loadingRef.current,\r\n renderer: 'svg',\r\n loop: true,\r\n autoplay: true,\r\n animationData: animationData\r\n });\r\n }, [loadingRef]);*/\r\n /**\r\n * Automatic Closing on loaded\r\n */\r\n useEffect(() => {\r\n if(!isManual && !isLoading && !isMapLoading && open)\r\n handleClose();\r\n }, [isLoading, isMapLoading, open, isManual]);\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /**\r\n * Handle Close\r\n * ------------\r\n * Sets open state of dialog box to\r\n * false\r\n */\r\n function handleClose() {\r\n setOpen(false);\r\n }\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n /*const Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n });*/\r\n \r\n return (\r\n \r\n \r\n
\r\n {isManual && !isLoading && !isMapLoading &&\r\n \r\n \r\n \r\n }\r\n {//
\r\n }\r\n {'MyGlobe\r\n
\r\n \r\n {(!isManual || (isLoading || isMapLoading)) && = 600)?'Loading Data':''} />}\r\n \r\n );\r\n};\r\nLoading.propTypes = {\r\n isLoading: PropTypes.bool.isRequired,\r\n isMapLoading: PropTypes.bool.isRequired,\r\n isManual: PropTypes.bool\r\n};\r\nLoading.defaultProps = {\r\n isManual: false\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\n//export default Loading;\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = store => {\r\n const getLoading = getLoadingStatusV2('globe');\r\n return {\r\n isLoading: getLoading(store),\r\n isMapLoading:getMapLoadingStatus(store,'map')\r\n };\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps)(Loading);//(React.memo(Layout, areEqual));\r\n\r\n\r\nconst PassiveLoader = ({classes, message}) =>

{message}

;\r\nPassiveLoader.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n message: PropTypes.string\r\n};\r\nPassiveLoader.defaultProps = {\r\n message: ''\r\n};","/* global document */\r\nimport GL from '@luma.gl/constants';\r\nimport {Texture2D, copyToTexture, cloneTextureFrom} from '@luma.gl/core';\r\nimport {ImageLoader} from '@loaders.gl/images';\r\nimport {load} from '@loaders.gl/core';\r\nimport {createIterable, log} from '@deck.gl/core';\r\nimport {instrumentGLContext} from '@luma.gl/webgl';\r\n\r\nconst DEFAULT_CANVAS_WIDTH = 1024;\r\nconst DEFAULT_BUFFER = 4;\r\n\r\nconst noop = () => {};\r\n\r\nconst DEFAULT_TEXTURE_PARAMETERS = {\r\n [GL.TEXTURE_MIN_FILTER]: GL.LINEAR_MIPMAP_LINEAR,\r\n // GL.LINEAR is the default value but explicitly set it here\r\n [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,\r\n // for texture boundary artifact\r\n [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE,\r\n [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE\r\n};\r\n\r\nfunction nextPowOfTwo(number) {\r\n return Math.pow(2, Math.ceil(Math.log2(number)));\r\n}\r\n\r\n// update comment to create a new texture and copy original data.\r\nfunction resizeImage(ctx, imageData, width, height) {\r\n const {naturalWidth, naturalHeight} = imageData;\r\n if (width === naturalWidth && height === naturalHeight) {\r\n return imageData;\r\n }\r\n\r\n ctx.canvas.height = height;\r\n ctx.canvas.width = width;\r\n\r\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n\r\n // image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight\r\n ctx.drawImage(imageData, 0, 0, naturalWidth, naturalHeight, 0, 0, width, height);\r\n\r\n return ctx.canvas;\r\n}\r\n\r\nfunction getIconId(icon) {\r\n return icon && (icon.id || icon.url);\r\n}\r\n\r\n// resize texture without losing original data\r\nfunction resizeTexture(gl, texture, width, height) {\r\n const oldWidth = texture.width;\r\n const oldHeight = texture.height;\r\n\r\n const newTexture = cloneTextureFrom(texture, {width, height});\r\n copyToTexture(texture, newTexture, {\r\n targetY: 0,\r\n width: oldWidth,\r\n height: oldHeight\r\n });\r\n\r\n texture.delete();\r\n return newTexture;\r\n}\r\n\r\n// traverse icons in a row of icon atlas\r\n// extend each icon with left-top coordinates\r\nfunction buildRowMapping(mapping, columns, yOffset) {\r\n for (let i = 0; i < columns.length; i++) {\r\n const {icon, xOffset} = columns[i];\r\n const id = getIconId(icon);\r\n mapping[id] = Object.assign({}, icon, {\r\n x: xOffset,\r\n y: yOffset\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Generate coordinate mapping to retrieve icon left-top position from an icon atlas\r\n * @param icons {Array} list of icons, each icon requires url, width, height\r\n * @param buffer {Number} add buffer to the right and bottom side of the image\r\n * @param xOffset {Number} right position of last icon in old mapping\r\n * @param yOffset {Number} top position in last icon in old mapping\r\n * @param rowHeight {Number} rowHeight of the last icon's row\r\n * @param canvasWidth {Number} max width of canvas\r\n * @param mapping {object} old mapping\r\n * @returns {{mapping: {'/icon/1': {url, width, height, ...}},, canvasHeight: {Number}}}\r\n */\r\nexport function buildMapping({\r\n icons,\r\n buffer,\r\n mapping = {},\r\n xOffset = 0,\r\n yOffset = 0,\r\n rowHeight = 0,\r\n canvasWidth\r\n}) {\r\n let columns = [];\r\n // Strategy to layout all the icons into a texture:\r\n // traverse the icons sequentially, layout the icons from left to right, top to bottom\r\n // when the sum of the icons width is equal or larger than canvasWidth,\r\n // move to next row starting from total height so far plus max height of the icons in previous row\r\n // row width is equal to canvasWidth\r\n // row height is decided by the max height of the icons in that row\r\n // mapping coordinates of each icon is its left-top position in the texture\r\n for (let i = 0; i < icons.length; i++) {\r\n const icon = icons[i];\r\n const id = getIconId(icon);\r\n\r\n if (!mapping[id]) {\r\n const {height, width} = icon.image;\r\n // fill one row\r\n if (xOffset + width + buffer > canvasWidth) {\r\n buildRowMapping(mapping, columns, yOffset);\r\n\r\n xOffset = 0;\r\n yOffset = rowHeight + yOffset + buffer;\r\n rowHeight = 0;\r\n columns = [];\r\n }\r\n\r\n columns.push({\r\n icon,\r\n xOffset\r\n });\r\n\r\n xOffset = xOffset + width + buffer;\r\n rowHeight = Math.max(rowHeight, height);\r\n }\r\n }\r\n\r\n if (columns.length > 0) {\r\n buildRowMapping(mapping, columns, yOffset);\r\n }\r\n\r\n return {\r\n mapping,\r\n rowHeight,\r\n xOffset,\r\n yOffset,\r\n canvasWidth,\r\n canvasHeight: nextPowOfTwo(rowHeight + yOffset + buffer)\r\n };\r\n}\r\n\r\n// extract icons from data\r\n// return icons should be unique, and not cached or cached but url changed\r\nexport function getDiffIcons(data, getIcon, cachedIcons) {\r\n /*if (!data || !getIcon) {\r\n return null;\r\n }*/\r\n\r\n cachedIcons = cachedIcons || {};\r\n const icons = {};\r\n const {iterable, objectInfo} = createIterable(data);\r\n \r\n for (const object of iterable) {\r\n objectInfo.index++;\r\n const icon = object; //objectInfo.data[objectInfo.index]//getIcon(object, objectInfo);\r\n const id = getIconId(icon);\r\n\r\n if (!icon) {\r\n throw new Error('Icon is missing.');\r\n }\r\n\r\n //if (!icon.url) {\r\n // throw new Error('Icon url is missing.');\r\n //}\r\n\r\n if (!icons[id] && (!cachedIcons[id])) { // || icon.url !== cachedIcons[id].url)) {\r\n icons[id] = icon;\r\n }\r\n }\r\n return icons;\r\n}\r\n\r\nexport default class IconManager {\r\n constructor(\r\n //gl,\r\n {\r\n onUpdate = noop // notify IconLayer when icon texture update\r\n }\r\n ) {\r\n //this._canvas = document.createElement(\"canvas\");\r\n //this.gl = this._canvas.getContext('webgl');\r\n this.onUpdate = onUpdate;\r\n\r\n // load options used for loading images\r\n this._loadOptions = null;\r\n this._getIcon = null;\r\n\r\n this._texture = null;\r\n this._externalTexture = null;\r\n this._mapping = {};\r\n // count of pending requests to fetch icons\r\n this._pendingCount = 0;\r\n\r\n this._autoPacking = false;\r\n\r\n // internal props used when autoPacking applied\r\n // right position of last icon\r\n this._xOffset = 0;\r\n // top position of last icon\r\n this._yOffset = 0;\r\n this._rowHeight = 0;\r\n this._buffer = DEFAULT_BUFFER;\r\n this._canvasWidth = DEFAULT_CANVAS_WIDTH;\r\n this._canvasHeight = 0;\r\n //this._canvas = null;\r\n }\r\n\r\n finalize() {\r\n if (this._texture) {\r\n this._texture.delete();\r\n }\r\n }\r\n\r\n getTexture() {\r\n return this._texture || this._externalTexture;\r\n }\r\n\r\n getIconMapping(icon) {\r\n const id = this._autoPacking ? getIconId(icon) : icon;\r\n return this._mapping[id] || {};\r\n }\r\n\r\n setProps({loadOptions, autoPacking, iconAtlas, iconMapping, data, getIcon}) {\r\n if (loadOptions) {\r\n this._loadOptions = loadOptions;\r\n }\r\n\r\n if (autoPacking !== undefined) {\r\n this._autoPacking = autoPacking;\r\n }\r\n\r\n if (getIcon) {\r\n this._getIcon = getIcon;\r\n }\r\n\r\n if (iconMapping) {\r\n this._mapping = iconMapping;\r\n }\r\n\r\n if (iconAtlas) {\r\n this._updateIconAtlas(iconAtlas);\r\n }\r\n\r\n if (this._autoPacking && (data || getIcon) && typeof document !== 'undefined') {\r\n this._canvas = this._canvas || document.createElement('canvas');\r\n\r\n this._updateAutoPacking(data);\r\n }\r\n }\r\n\r\n get isLoaded() {\r\n return this._pendingCount === 0;\r\n }\r\n\r\n _updateIconAtlas(iconAtlas) {\r\n if (this._texture) {\r\n this._texture.delete();\r\n this._texture = null;\r\n }\r\n if (iconAtlas instanceof Texture2D) {\r\n iconAtlas.setParameters(DEFAULT_TEXTURE_PARAMETERS);\r\n\r\n this._externalTexture = iconAtlas;\r\n this.onUpdate();\r\n } else if (iconAtlas) {\r\n // Browser object: Image, ImageData, HTMLCanvasElement, ImageBitmap\r\n this._texture = new Texture2D(this.gl, {\r\n data: iconAtlas,\r\n parameters: DEFAULT_TEXTURE_PARAMETERS\r\n });\r\n this.onUpdate();\r\n }\r\n }\r\n\r\n _updateAutoPacking(data) {\r\n const icons = data;//Object.values(getDiffIcons(data, this._getIcon, this._mapping) || {});\r\n let maxHeight = 0;\r\n let maxWidth = 0;\r\n let xVal = 0;\r\n let yVal = 0;\r\n for (var icon of icons) {\r\n xVal = icon.x * icon.resolution;\r\n yVal = icon.y * icon.resolution;\r\n if ((xVal + icon.image.width) > maxWidth)\r\n maxWidth = xVal + icon.image.width;\r\n if ((yVal + icon.image.height) > maxHeight)\r\n maxHeight = yVal + icon.image.height;\r\n \r\n }\r\n if (icons.length > 0) {\r\n this._canvasWidth = maxWidth;\r\n this._canvasHeight = maxHeight;\r\n\r\n this.onUpdate();\r\n\r\n // load images\r\n this._loadIconsFromImages(icons);\r\n }\r\n }\r\n\r\n _loadIconsFromImages(images) {\r\n let canvas2D = document.createElement('canvas');\r\n canvas2D.width = this._canvasWidth;\r\n canvas2D.height = this._canvasHeight;\r\n document.body.appendChild(canvas2D);\r\n const ctx = canvas2D.getContext('2d');\r\n for (const image of images) {\r\n const imageData = image.image;\r\n let {x, y} = image;\r\n x = x * image.resolution;\r\n y = y * image.resolution;\r\n const {width, height} = image.image; //this._mapping[id];\r\n //const data = resizeImage(ctx, imageData, width, height);\r\n ctx.drawImage(imageData, x, y, width, height);\r\n\r\n this.onUpdate();\r\n }\r\n var link = document.createElement(\"a\");\r\n //link.download = \"image.png\";\r\n link.target=\"_blank\";\r\n canvas2D.toBlob(function(blob){\r\n link.href = URL.createObjectURL(blob);\r\n link.click();\r\n console.log(blob);\r\n console.log(link.href); // this line should be here\r\n },'image/png'); \r\n canvas2D.parentNode.removeChild(canvas2D);\r\n }\r\n}","/* ================================================================ */\r\n// SIDEBAR CONTAINER | Sidebar.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\n//import 'url-search-params-polyfill';\r\n// Hooks\r\nimport useReactRouter from 'use-react-router';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n\r\nimport './gridUtils.js';\r\nimport { WidthProvider, Responsive } from \"react-grid-layout\";\r\nconst ResponsiveReactGridLayout = WidthProvider(Responsive);\r\nimport IconManager from './IconManager';\r\n\r\nimport 'react-resizable/css/styles.css';\r\nimport 'react-grid-layout/css/styles.css';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n position:'absolute',\r\n top:'10px',\r\n left:'10px',\r\n height:'720px',\r\n width:'1280px',\r\n border:'1px solid black',\r\n background:'#fff',\r\n zIndex:'2',\r\n }\r\n}));\r\n\r\nconst Spritesheet = (props) => {\r\n const classes = useStyles();\r\n const imageUploader = React.useRef(null);\r\n\r\n const [items, setItems] = useState([]);\r\n const [elements, setElements] = useState(null);\r\n const [newCounter, setCounter] = useState(items.length);\r\n const [resolution, setResolution] = useState(32);\r\n\r\n const iconManager = new IconManager({onUpdate: () => _onUpdate()});//, {onUpdate: () => this._onUpdate()})\r\n\r\n function _onUpdate() {\r\n //console.log(\"update\");\r\n }\r\n\r\n useEffect(() => {\r\n setElements(_.map(items, el => createElement(el)));\r\n },[items]);\r\n\r\n const handleImageUpload = e => {\r\n const [file] = e.target.files;\r\n if (file) {\r\n const reader = new FileReader();\r\n \r\n reader.onload = e => {\r\n var image = new Image();\r\n image.src = e.target.result;\r\n image.onload = function() {\r\n onAddItem(this);\r\n };\r\n \r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n e.target.value = null;\r\n };\r\n\r\n let cols = { lg: (1282/resolution) }\r\n\r\n const createElement = (el) => {\r\n const removeStyle = {\r\n position: \"absolute\",\r\n right: \"2px\",\r\n top: 0,\r\n cursor: \"pointer\"\r\n };\r\n const i = el.i;\r\n return (\r\n
\r\n {}\r\n \r\n x\r\n \r\n
\r\n );\r\n }\r\n function onRemoveItem (i) {\r\n setItems(items => items.filter( (item) => item.i != i));\r\n }\r\n\r\n function onAddItem(image) {\r\n /*eslint no-console: 0*/\r\n console.log(\"adding\", \"n\" + newCounter);\r\n // Add a new item. It must have a unique key!\r\n setItems(items => [...items, { \r\n i: \"n\" + newCounter,\r\n id: \"n\" + newCounter,\r\n x: 0,//(items.length * 2) % (cols.lg || 12),\r\n y: 0, // puts it at the bottom\r\n w: (image.width/resolution),\r\n h: (image.height/resolution),\r\n src: image.src,\r\n image: image,\r\n resolution: resolution\r\n }])\r\n // Increment the counter to ensure key is always unique.\r\n setCounter(newCounter => newCounter + 1)\r\n }\r\n\r\n function onItemResize(e) {\r\n setItems(items => items.map( (item,idx) => {\r\n e[idx].src = item.src;\r\n item.image.width = e[idx].w * resolution;\r\n item.image.height = e[idx].h * resolution;\r\n e[idx].image = item.image;\r\n e[idx].id = item.id;\r\n e[idx].resolution = item.resolution;\r\n return e[idx];\r\n }));\r\n }\r\n\r\n const onLayoutChange = (e) => {\r\n setItems(items => items.map( (item,idx) => {\r\n e[idx].src = item.src;\r\n item.image.width = e[idx].w * resolution;\r\n item.image.height = e[idx].h * resolution;\r\n e[idx].image = item.image;\r\n e[idx].id = item.id;\r\n e[idx].resolution = item.resolution;\r\n e[idx].x = e[idx].x < 0 ? 0 : e[idx].x;\r\n e[idx].y = e[idx].y < 0 ? 0 : e[idx].y;\r\n return e[idx];\r\n }));\r\n }\r\n\r\n const onBreakpointChange = (breakpoint, cols) => {\r\n breakpoint = breakpoint;\r\n cols = cols;\r\n }\r\n\r\n const handleAtlasCreation = () => {\r\n iconManager._updateAutoPacking(items);\r\n }\r\n\r\n return (\r\n \r\n
\r\n {/* */}\r\n {
\r\n \r\n \r\n \r\n {elements}\r\n \r\n
}\r\n
\r\n );\r\n};\r\n\r\nexport default Spritesheet;\r\n/*\r\n[0, 1, 2, 3, 4].map(function(i, key, list) {\r\n return {\r\n i: i.toString(),\r\n x: i * 2,\r\n y: 0,\r\n w: 2,\r\n h: 2,\r\n src: 'https://www.fixyourbrowser.com/wp-content/uploads/2019/08/Android-Logo.png'\r\n };*/","import React from 'react';\r\nimport clsx from 'clsx';\r\nimport classNames from 'classnames';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport { IconButton } from '@material-ui/core';\r\nimport { useCallback } from 'react';\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n minHeight:'3em',\r\n },\r\n cell: {\r\n height:'3em',\r\n backgroundSize:'contain',\r\n backgroundPosition:'center',\r\n backgroundRepeat:'no-repeat',\r\n textAlign:'right',\r\n },\r\n overlayBtn:{\r\n opacity:'.5',\r\n transition:'opacity .2s ease-in-out',\r\n '&:hover':{\r\n opacity:'1',\r\n }\r\n }\r\n}));\r\n\r\nexport function ImageFormatter({ value, cell, row }) {\r\n // const editClick = useCallback(()=>{\r\n // console.log('editing image for',row, cell);\r\n // });\r\n const classes = useStyles();\r\n return (\r\n
\r\n
\r\n {/* \r\n \r\n */}\r\n
\r\n
\r\n );\r\n}","import React, {forwardRef, useRef, useImperativeHandle, useState, useEffect, useCallback} from 'react';\r\nimport { CircularProgress, Dialog, Button,DialogTitle } from '@material-ui/core';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport {useDropzone} from 'react-dropzone';\r\n// Actions\r\nimport {uploadMedia} from '../../../actions/Data/Datasets';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root:{ \r\n width:'300px',\r\n display:'flex',\r\n flexDirection:'column',\r\n // alignItems:'center',\r\n // padding:'1em',\r\n },\r\n dropzone:{\r\n textAlign:'center',\r\n display:'flex', \r\n alignItems:'center',\r\n flexDirection:'column',\r\n justifyContent:'space-around',\r\n border:'2px dashed',\r\n height:'100px',\r\n transition: 'border .24s ease-in-out',\r\n borderWidth: 2,\r\n borderRadius: 2,\r\n },\r\n imgPreview:{\r\n objectFit: 'contain',\r\n maxWidth:'300px',\r\n },\r\n buttonCont:{\r\n display:'flex', \r\n justifyContent:'space-between',\r\n }\r\n}));\r\n\r\n\r\n\r\nconst ImageEditor = (props,ref)=>{\r\n console.log(props.type);//media\r\n const refFileInput = useRef();\r\n const refA = useRef();\r\n const refImgPreview = useRef();\r\n const classes = useStyles();\r\n const [isUploading,setIsUploading] = useState(false);\r\n const [imgPreviewUrl,setImgPreviewUrl] = useState('https://gea2.myglobe.app/uploads/gea/media/'+props.value);\r\n const isMediaLoading = useSelector(state => state.Data.loading.media);\r\n const error = useSelector(state => state.Data.uploads.error);\r\n const filename = useSelector(state => state.Data.uploads.name);\r\n const [file,setFile] = useState(null);\r\n const dispatch = useDispatch();\r\n const onDrop = useCallback(acceptedFiles => { \r\n setImgPreviewUrl(window.URL.createObjectURL(acceptedFiles[0]));\r\n setFile(acceptedFiles[0]);\r\n }); \r\n const {getRootProps, getInputProps, isDragActive, inputRef, open} = useDropzone({accept: 'image/*',onDrop,noClick:true});\r\n \r\n const uploadFile = useCallback(()=>{\r\n console.log(inputRef, file);\r\n if(file) {\r\n setIsUploading(true);\r\n dispatch(uploadMedia(file)); \r\n }\r\n });\r\n const cancel = useCallback(()=>{\r\n props.onCommit && props.onCommit();\r\n });\r\n\r\n useEffect(()=>{\r\n if(isUploading && !isMediaLoading && error){\r\n setIsUploading(false);\r\n } else if(isUploading && !isMediaLoading && filename) {\r\n setIsUploading(false); \r\n handleUpdate();\r\n props.onCommit && props.onCommit();\r\n }\r\n },[isMediaLoading, error, filename, isUploading, props]);\r\n\r\n useImperativeHandle(ref, () => ({\r\n getInputNode() {\r\n return inputRef.current;\r\n },\r\n getValue() {\r\n if(filename && !error && !isMediaLoading) \r\n return {[props.column.key]:filename};\r\n else\r\n return {[props.column.key]:props.value};\r\n },\r\n isSelectOpen() {\r\n return false;\r\n }\r\n }), [inputRef, filename, error, isMediaLoading, props.column.key, props.value]);\r\n\r\n const handleUpdate = () => {\r\n if(props.onUpdate && filename && !error && !isMediaLoading) \r\n return filename;\r\n else\r\n return props.value;\r\n };\r\n\r\n return( \r\n \r\n Upload new image\r\n
\r\n {error&&
Error: {error}
}\r\n {isUploading&&

uploading
}\r\n {!isUploading&& \r\n <>\r\n \r\n
\r\n {isDragActive ?\r\n

Drop the files here ...

:\r\n

Drag 'n' drop files here

}\r\n

OR

\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default forwardRef(ImageEditor);","/* ================================================================ */\r\n// SAVE COMPONENT | Save.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Material UI\r\nimport Button from '@material-ui/core/Button';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport SpeedDial from '@material-ui/lab/SpeedDial';\r\nimport SpeedDialIcon from '@material-ui/lab/SpeedDialIcon';\r\nimport SpeedDialAction from '@material-ui/lab/SpeedDialAction';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport SaveIcon from '@material-ui/icons/Save';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position:'relative',\r\n //width: '2.5rem',\r\n alignItems: 'flex-start'\r\n },\r\n button: {\r\n width: '2.5rem',\r\n height: '2.5rem',\r\n borderRadius: 0,\r\n boxShadow: 'none',\r\n '&.saved': {\r\n color: \"#333\",//theme.palette.action.saved.contrastText,\r\n backgroundColor: \"#fff\" //theme.palette.action.saved.main\r\n },\r\n '&.unsaved': {\r\n color: \"#f00\", //theme.palette.secondary.contrastText,\r\n backgroundColor: theme.palette.secondary.main\r\n }\r\n },\r\n actions: {\r\n position: 'absolute',\r\n top: '100%',\r\n margin: '0 !important',\r\n padding: '0 !important'\r\n },\r\n actionButton: {\r\n color: \"#333\",//theme.palette.secondary.contrastText,\r\n background: theme.palette.secondary.main,\r\n borderRadius: '0.5rem',\r\n margin: 0,\r\n marginTop: 8\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Save Component\r\n * --------------\r\n * Save options menu for map state editing.\r\n * Displays icon and colour according to map editing\r\n * state (unsaved changes, already saved, etc)\r\n *\r\n * @component\r\n * @param {object} props component properties\r\n * @param {boolean} props.isSaved saved state of map\r\n * @param {boolean} props.isOpen initial menu open state\r\n * @param {boolean} props.isDialogOpen initial dialog open state\r\n * @param {string} props.filename loaded map state title\r\n * @param {function} props.onSave save trigger callback\r\n * @param {function} props.onSaveAs new save trigger callback with title\r\n */\r\nconst Save = ({\r\n filename,\r\n isSaved,\r\n isOpen,\r\n isDialogOpen,\r\n onSave,\r\n onSaveAs\r\n}) => {\r\n /* ======================== */\r\n // PROPS\r\n /* ======================== */\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(isOpen);\r\n const [dialogOpen, setDialogOpen] = useState(isDialogOpen);\r\n const [name, setName] = useState(filename);\r\n const fabClasses = classNames(\r\n classes.button,\r\n {\r\n 'unsaved': !isSaved,\r\n 'saved': isSaved\r\n }\r\n );\r\n const icon = isSaved ? } icon={} /> : } />;\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /**\r\n * Handle Open\r\n * -----------\r\n * Triggers opened state of options menu\r\n */\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n /**\r\n * Handle Close\r\n * ------------\r\n * Triggers closed state of options menu\r\n */\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n /**\r\n * Handle Toggle\r\n * -------------\r\n * Toggles open state of options menu\r\n */\r\n const handleToggle = () => {\r\n setOpen(!open);\r\n };\r\n /**\r\n * Handle Save\r\n * -----------\r\n * Triggers save action\r\n */\r\n const handleSave = () => {\r\n // Trigger save\r\n if(onSave) {\r\n onSave();\r\n }\r\n };\r\n /**\r\n * Handle Save As\r\n * --------------\r\n * closed state of options menu\r\n */\r\n const handleSaveAs = () => {\r\n // Trigger save\r\n if(onSaveAs) {\r\n onSaveAs(name);\r\n }\r\n handleDialogClose();\r\n }\r\n const handleSaveDialog = () => {\r\n setDialogOpen(true);\r\n };\r\n const handleDialogClose = () => {\r\n setDialogOpen(false);\r\n };\r\n const handleTitleChange = (event) => {\r\n const value = event.target.value;\r\n setName(value);\r\n };\r\n return (\r\n
\r\n \r\n Save As\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n tooltipTitle=\"Save\"\r\n tooltipPlacement=\"bottom\"\r\n tooltipOpen\r\n onClick={handleSave}\r\n disabled={isSaved}\r\n />\r\n }\r\n tooltipTitle=\"Save As\"\r\n tooltipPlacement=\"bottom\"\r\n tooltipOpen\r\n onClick={handleSaveDialog}\r\n />\r\n \r\n
\r\n );\r\n};\r\nSave.propTypes = {\r\n isSaved: PropTypes.bool.isRequired,\r\n isOpen: PropTypes.bool,\r\n isDialogOpen: PropTypes.bool,\r\n filename: PropTypes.string,\r\n // FUNCTIONS\r\n onSave: PropTypes.func,\r\n onSaveAs: PropTypes.func\r\n};\r\nSave.defaultProps = {\r\n isOpen: false,\r\n isDialogOpen: false,\r\n filename: ''\r\n};\r\nconst SavedIcon = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nconst SaveAsIcon = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Save;","/* ================================================================ */\r\n// FIELD COMPONENT | Field.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useCallback, forwardRef} from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Material UI\r\nimport TextField from '@material-ui/core/TextField';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n/* ========================================== */\r\n// Constants\r\n/* ========================================== */\r\nconst FieldTypes = {\r\n STRING: 'string',\r\n LATITUDE: 'lat',\r\n LONGITUDE: 'lon',\r\n INTEGER: 'int',\r\n URL: 'url',\r\n HTML: 'html',\r\n MEDIA: 'media'\r\n};\r\nconst FieldParams = {\r\n [FieldTypes.INTEGER]: {\r\n helperText: 'Enter a valid number',\r\n type: 'number',\r\n parser: parseInt,\r\n },\r\n [FieldTypes.LATITUDE]: {\r\n helperText: 'Enter a valid longitude between -90 and 90',\r\n type: 'number',\r\n parser: parseFloat,\r\n min: -90,\r\n max: 90\r\n },\r\n [FieldTypes.LONGITUDE]: {\r\n helperText: 'Enter a valid longitude between -180 and 180',\r\n type: 'number',\r\n parser: parseFloat,\r\n min: -180,\r\n max: 180\r\n },\r\n [FieldTypes.URL]: {\r\n helperText: 'Enter a valid url',\r\n type: 'url'\r\n },\r\n [FieldTypes.HTML]: {\r\n helperText: 'Enter valid HTML or Markdown',\r\n type: 'text'\r\n }\r\n};\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n fontSize: '1rem',\r\n //background: hexToRgba(theme.palette.background.paper, 0.9),\r\n //width: 'calc(100% + 7em)',\r\n width: '100%',\r\n margin: 0,\r\n '&.overflow': {\r\n width: 'calc(100% + 7em)'\r\n }\r\n },\r\n input: {\r\n position: 'relative',\r\n top: 0,\r\n color: theme.palette.common.black,\r\n background: theme.palette.common.white, \r\n border: `0.05em ${theme.palette.background.contentFrame} solid`,\r\n borderRadius: '0 1em 1em 1em'\r\n },\r\n underline: {\r\n borderRadius: '0 1em 1em 1em'\r\n },\r\n label: {\r\n backgroundColor: theme.palette.common.white,\r\n color: theme.palette.common.black\r\n },\r\n helperText: {\r\n width: '100%',\r\n fontSize: '0.9rem',\r\n color: theme.palette.common.black,\r\n backgroundColor: theme.palette.common.white\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Field Component\r\n * ---------------\r\n * Handles editable text field and validation\r\n * for given field type\r\n * \r\n * @param {object} props component props\r\n * @param {string} props.label field label\r\n * @param {string} props.helperText helper text\r\n * @param {string} props.type field type\r\n * @param {any} props.value field value\r\n * @param {func} props.onChange callback on field change\r\n * @param {func} props.onUpdate callback on field blur / submit\r\n */\r\nexport const Field = ({\r\n label,\r\n helperText,\r\n type,\r\n value,\r\n onChange,\r\n onUpdate\r\n}, ref) => {\r\n const classes = useStyles();\r\n const [currentValue, setCurrentValue] = useState(value);\r\n const [isError, setIsError] = useState(false);\r\n /* ========================================== */\r\n /**\r\n * Validate\r\n * --------\r\n * Checks value for given type\r\n * is a valid entry\r\n * \r\n * @param {string} type \r\n * @param {any} value data value\r\n */\r\n const validate = (type, value) => {\r\n switch(type) {\r\n case FieldTypes.LONGITUDE:\r\n // Longitude Validation\r\n return (value >= FieldParams[FieldTypes.LONGITUDE].min && value <= FieldParams[FieldTypes.LONGITUDE].max);\r\n case FieldTypes.LATITUDE:\r\n // Latitude Validation\r\n return (value >= FieldParams[FieldTypes.LATITUDE].min && value <= FieldParams[FieldTypes.LATITUDE].max);\r\n case FieldTypes.INTEGER:\r\n return Number.isInteger(value);\r\n default:\r\n return true;\r\n }\r\n };\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /**\r\n * Handle Change\r\n * -------------\r\n * Parse and check new value by type\r\n * and return in callback\r\n * \r\n * @param {Event.onChange} event onChange event\r\n */\r\n const handleChange = (event) => {\r\n try {\r\n const newValue = FieldParams[type]?.parser ? FieldParams[type].parser(event.target.value) : event.target.value;\r\n //setCurrentValue(newValue);\r\n console.log(newValue);\r\n const isValid = validate(type, newValue);\r\n setCurrentValue(newValue);\r\n isValid && onChange && onChange(newValue);\r\n setIsError(!isValid);\r\n } catch (e) {\r\n console.log(e);\r\n setIsError(true);\r\n }\r\n };\r\n const handleUpdate = useCallback((event) => {\r\n console.log(event, isError, currentValue);\r\n if(isError) {\r\n ref.current.focus();\r\n } else onUpdate && onUpdate(currentValue);\r\n }, [isError, currentValue]);\r\n const handleKeyDown = useCallback((event) => {\r\n if(event.keyCode === 13) { // ENTER\r\n console.log(event, isError, currentValue);\r\n if(isError) {\r\n ref.current.focus();\r\n } else onUpdate && onUpdate(currentValue);\r\n }\r\n }, [isError, currentValue]);\r\n console.log('FIELD', label, type, value, isError);\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return (\r\n \r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nField.propTypes = {\r\n label: PropTypes.string.isRequired,\r\n helperText: PropTypes.string,\r\n type: PropTypes.oneOf(Object.values(FieldTypes)).isRequired,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),\r\n onChange: PropTypes.func.isRequired,\r\n onUpdate: PropTypes.func.isRequired\r\n};\r\nField.propTypes = {\r\n type: 'string',\r\n value: ''\r\n};\r\nField.displayName = 'Field';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default forwardRef(Field);","/* ================================================================ */\r\n// CELL FIELD EDITOR COMPONENT | CellEditor.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useImperativeHandle, useRef, forwardRef} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Material UI\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Local Components\r\nimport Field from './Field';\r\n/* ========================================== */\r\n// Constants\r\n/* ========================================== */\r\nconst FieldTypes = {\r\n STRING: 'string',\r\n LATITUDE: 'lat',\r\n LONGITUDE: 'lon',\r\n INTEGER: 'int',\r\n URL: 'url',\r\n HTML: 'html',\r\n MEDIA: 'media'\r\n};\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n fontSize: '1rem',\r\n margin: 0,\r\n position: 'relative'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Cell Editor\r\n * -----------\r\n * Form wrapper for generic single cell field editing\r\n * \r\n *\r\n * @component\r\n * @param {object} props component props\r\n * @param {string} props.label field label\r\n * @param {string} props.type field type\r\n * @param {string} props.value field value\r\n * @param {func} props.onCommit react data grid commit func\r\n * @param {object} props.otherProps additional props\r\n */\r\nconst FieldEditor = ({\r\n label,\r\n type,\r\n value,\r\n onCommit,\r\n ...otherProps\r\n}, ref) => {\r\n const classes = useStyles();\r\n const inputRef = useRef();\r\n const columnKey = otherProps?.column?.key;\r\n const [currentValue, setCurrentValue] = useState(value);\r\n useImperativeHandle(ref, () => ({\r\n getInputNode() { \r\n return inputRef.current; \r\n },\r\n getValue() {\r\n return {[columnKey]: currentValue};\r\n }\r\n }), [inputRef, currentValue, columnKey]);\r\n const handleChange = (newValue) => {\r\n console.log(newValue);\r\n //setCurrentValue(newValue);\r\n };\r\n const handleUpdate = (newValue) => {\r\n console.log(newValue);\r\n setCurrentValue(newValue);\r\n //onCommit && onCommit();\r\n };\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nFieldEditor.propTypes = {\r\n label: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(Object.values(FieldTypes)).isRequired,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]).isRequired,\r\n onCommit: PropTypes.func,\r\n otherProps: PropTypes.object\r\n};\r\nFieldEditor.displayName = 'FieldEditor';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default forwardRef(FieldEditor);","/* ================================================================ */\r\n// ROW EDITOR | RowEditor.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect, useCallback, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Hooks\r\nimport useReactRouter from 'use-react-router';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n// Material UI\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport usePrevious from '@myglobe/core/dist/hooks/usePrevious';\r\n// React Grid editor\r\nimport { AutoSizer } from 'react-virtualized';\r\nimport ReactDataGrid, {SelectColumn, DataGridHandle, CalculatedColumn } from 'react-data-grid';\r\nimport 'react-data-grid/dist/react-data-grid.css';\r\nimport { ImageFormatter } from '../Admin/CellFormatters/ImageFormatter';\r\nimport ImageEditor from '../Admin/CellEditors/ImageEditor';\r\nimport {isNullOrUndefined} from 'util';\r\n// Actions\r\nimport {updateDataset} from '../../actions/Data/Datasets';\r\n// Local Components\r\nimport Save from '../Admin/Save';\r\nimport FieldEditor from '../Admin/FieldEditor';\r\nimport Field from '../Admin/FieldEditor/Field';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n //minHeight:'400px',\r\n width: '100%',\r\n height: '70vh',\r\n },\r\n table: {\r\n color: theme.palette.common.black,\r\n height: '70vh',\r\n //minWidth: 650,\r\n },\r\n tableRow: {\r\n height: '1em',\r\n overflow: 'hidden'\r\n },\r\n control: {\r\n justifyContent: 'space-between',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n width: '100%'\r\n },\r\n filename: {\r\n fontSize: '1.1rem',\r\n fontWeight: 'bold'\r\n },\r\n lastUpdated: {\r\n fontSize: '1rem',\r\n marginRight: '1rem'\r\n },\r\n addRowDialog: {\r\n width: '75%',\r\n height: '50vh',\r\n },\r\n buttonCont:{\r\n display:'flex',\r\n\r\n },\r\n addRowButton: {\r\n marginTop:'.5em',\r\n // width: '7em'\r\n }\r\n}));\r\n\r\nfunction createData(name, calories, fat, carbs, protein) {\r\n return { name, calories, fat, carbs, protein };\r\n}\r\nconst RowEditor = (props) => {\r\n const classes = useStyles();\r\n const [authState, setAuthState] = useState(props.authState);\r\n const [datasetID, setDatasetID] = useState(props.datasetID);\r\n const data = useSelector(state => state.Data.datasets.byHash[datasetID]);\r\n const dispatch = useDispatch();\r\n const [dataChanged, setDataChanged] = useState(false);\r\n const [rows, setRows] = useState(null);\r\n const prevRows = usePrevious(rows);\r\n const [cols, setCols] = useState(null); \r\n const [selectedRows, setSelectedRows] = useState(() => new Set());\r\n const gridRef = useRef();\r\n const [loading, setLoading] = useState(false);\r\n const [addRowOpen, setAddRowOpen] = useState(false);\r\n\r\n const cellUpdate = (rowUpdateEvt)=>{\r\n const rowInd=rowUpdateEvt.fromRow, update = rowUpdateEvt.updated;\r\n const updatedRows = [...rows];\r\n updatedRows[rowInd] = {...updatedRows[rowInd],...update};\r\n setRows(updatedRows);\r\n setDataChanged(true);\r\n };\r\n const saveData = useCallback(()=>{\r\n console.log('save data',props);\r\n setLoading(true);\r\n let rowsForUpload = [...rows];\r\n rowsForUpload.forEach(x=>delete x._id);\r\n dispatch(updateDataset(data.endpoint,rows));\r\n \r\n //maybe dont bother sending up?\r\n //props.handleDataUpload(rows);\r\n });\r\n const handleRowClick = useCallback((rowIdx, row, column) => {\r\n //if (column.key === 'title') {\r\n // console.log('here',rowIdx, row, column);\r\n // gridRef.current?.selectCell({ rowIdx, idx: column.idx }, true);\r\n //}\r\n }, []);\r\n \r\n useEffect(()=>{\r\n console.log('DATA CHANGE',data);\r\n if(data&&data.config) {\r\n let c = Object.keys(data.config).map((key)=>{\r\n let formatter;\r\n let editor = null;\r\n switch(data.config[key]){\r\n case 'media':\r\n formatter= ({row,a}) => ;\r\n editor = React.forwardRef((props, ref) => { return ;});\r\n break;\r\n default:\r\n formatter= ({row}) => row[key];\r\n editor = React.forwardRef((props, ref) => { return ;});\r\n break;\r\n }\r\n return {\r\n key,\r\n name:key,\r\n editable:true,\r\n ... (formatter && {formatter}),\r\n ... (editor && {editor}),\r\n type: data.config[key]\r\n };\r\n });\r\n c.unshift({key:\"_id\",\r\n name:\"ID\",\r\n editable:false});\r\n c.unshift(SelectColumn); \r\n\r\n setCols(c);\r\n }\r\n if(data&&data.endpointData){\r\n data.endpointData.forEach((x,i)=>x._id=i);\r\n setRows(data.endpointData);\r\n }\r\n\r\n },[data]); \r\n /**\r\n * Open Add Row Dialog\r\n * -------------------\r\n * Opens add row dialog form\r\n */\r\n const handleAddRowDialog = () => {\r\n //Open Dialog\r\n //setAddRowOpen(true);\r\n const emptyRow = cols?.reduce((map, value) => {\r\n const key = value['key'];\r\n map[key] = '';\r\n return map;\r\n }, {});\r\n emptyRow._id = rows.length; \r\n setRows([...rows,emptyRow]);\r\n };\r\n // scroll to end if new row added\r\n useEffect(()=>{\r\n if(rows && prevRows && prevRows.length < rows.length)\r\n gridRef.current.scrollToRow(rows.length);\r\n },[rows]);\r\n const handleAddRow = (newRow) => {\r\n //const index = rows.length;\r\n const updatedRows = [...rows, newRow];\r\n setRows(updatedRows);\r\n setAddRowOpen(false);\r\n };\r\n // const handleCancelAddRow = () => {\r\n // setAddRowOpen(false);\r\n // };\r\n const handleDeleteRow = useCallback((args) =>{ \r\n //open confirm dialog\r\n setRows(rows.filter(x=>![...selectedRows].includes(x._id) ));\r\n setSelectedRows(() => new Set());//selectedRows.clear();\r\n });\r\n \r\n return (\r\n
\r\n {data &&\r\n
\r\n \r\n {data.name}\r\n {`Last Updated ${new Date(data.lastUpdated).toLocaleDateString('en-GB', {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'})}`}\r\n
\r\n }\r\n {rows!=null&&cols!=null&& \r\n \r\n {({ width, height }) => (\r\n
\r\n \r\n
\r\n }\r\n >\r\n Add Row\r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n }\r\n {/* */}\r\n
\r\n );\r\n};\r\nexport default RowEditor;\r\n\r\n/* ========================================== */\r\n/**\r\n * Add Row Dialog\r\n * --------------\r\n * New row field editor form\r\n * \r\n * @param {object} props component props\r\n * @param {bool} props.isOpen dialog open state\r\n * @param {array} props.column datagrid columns\r\n * @param {func} props.onSubmit form submit callback\r\n * @param {func} props.onCancel form cancel callback \r\n */\r\nconst AddRowDialog = ({\r\n isOpen,\r\n columns,\r\n // Functions\r\n onSubmit,\r\n onCancel\r\n}) => {\r\n const classes = useStyles();\r\n const [row, setRow] = useState([]);\r\n const formGridRef = useRef();\r\n useEffect(()=>{\r\n // Init empty row\r\n const emptyRow = columns?.reduce((map, value) => {\r\n const key = value['key'];\r\n map[key] = '';\r\n return map;\r\n }, {});\r\n console.log(emptyRow);\r\n setRow([emptyRow]);\r\n }, [columns]);\r\n const handleValueUpdate = (key, value) => {\r\n setRow({...row, [key]: value});\r\n };\r\n const handleComplete = () => {\r\n onSubmit && onSubmit(row);\r\n };\r\n const handleClose = () => {\r\n onCancel && onCancel();\r\n }; \r\n const cellUpdate = (rowUpdateEvt)=>{\r\n const rowInd=rowUpdateEvt.fromRow, update = rowUpdateEvt.updated;\r\n const updatedRows = [...row];\r\n updatedRows[rowInd] = {...updatedRows[rowInd],...update};\r\n setRow(updatedRows);\r\n };\r\n \r\n return (\r\n \r\n New Row\r\n \r\n \r\n Add a new row to the dataset\r\n \r\n {row!=null&&columns!=null&&\r\n \r\n {({ width, height }) => (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n }\r\n {/*columns?.filter(col=>!isNullOrUndefined(col.name) && col.name.length !== 0).map(col=>\r\n col.type === 'media' ?\r\n handleValueUpdate(col.key, value)} />\r\n : \r\n handleValueUpdate(col.key, value)}\r\n />\r\n )*/} \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\nAddRowDialog.propTypes= {\r\n isOpen: PropTypes.bool.isRequired,\r\n columns: PropTypes.arrayOf(PropTypes.object),\r\n onSubmit: PropTypes.func,\r\n onCancel: PropTypes.func\r\n};","/* ================================================================ */\r\n// ADMIN CONTAINER | Sidebar.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect, useCallback, useRef} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n//import 'url-search-params-polyfill';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n// Hooks\r\nimport useReactRouter from 'use-react-router';\r\n// Material UI\r\nimport Paper from '@material-ui/core/Paper';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Auth0\r\nimport { useAuth0 } from '../auth0/auth0';\r\n// Components\r\nimport RowEditor from '../components/Admin/RowEditor';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n margin: '2em',\r\n marginTop: '4em',\r\n height: 'calc(100vh - 8em)'\r\n // position:'absolute',\r\n // top:'10px',\r\n // left:'10px',\r\n // // height:'100px',\r\n // // width:'200px',\r\n // border:'1px solid black',\r\n // background:'#fff',\r\n // zIndex:'2',\r\n },\r\n loadingContainer: {\r\n },\r\n user: {\r\n padding: '1em',\r\n width: '10em'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Admin Component\r\n * ---------------\r\n * Admin Edit Modal (To be continued)\r\n *\r\n * @component\r\n * @param {object} props component properties\r\n */\r\nconst Admin = (props) => {\r\n const { isAuthenticated, loginWithRedirect, logout, getTokenSilently,loading,user } = useAuth0();\r\n const count = useSelector(state => state.Data.count);\r\n const classes = useStyles();\r\n const [loaded, setLoaded] = useState(false);\r\n // const rootClasses = classNames(classes.root, {\r\n // 'expanded': true\r\n // });\r\n // useEffect(()=>{\r\n // /* ======================== */\r\n // // COMPONENT UPDATE\r\n // /* ======================== */\r\n // if(category && page && !popup)\r\n // setExpanded(true);\r\n // else\r\n // setExpanded(false);\r\n // }, [category, popup, page]);\r\n\r\n\r\n\r\n // const callAPI = async ()=>{\r\n // try {\r\n // var token = await getTokenSilently();\r\n // console.log(token);\r\n // const response = await fetch(\"http://localhost:3000/graphql\", {\r\n // headers: {\r\n // Authorization: `Bearer ${token}`,\r\n // \"Content-Type\":\"application/json\",\r\n // },\r\n // method: \"POST\",\r\n // body: JSON.stringify({query: \"{\\n allUsers {\\n edges {\\n node {\\n id\\n }\\n }\\n }\\n}\\n\",\"variables\": null})\r\n // });\r\n // const responseData = await response.json();\r\n // console.log(responseData);\r\n // } catch(e) {\r\n // console.error(e);\r\n // }\r\n // }\r\n // if (loading || !user) {\r\n // return
Loading...
;\r\n // }\r\n const callApi = useCallback(async (/*user*/) => {\r\n //let query = `{accountIdByEmail(e: \"${user.email}\")}`;\r\n let query = '{myId}';\r\n try {\r\n var token = await getTokenSilently();\r\n console.log(token);\r\n const response = await fetch('https://api.myglobe.app/graphql', {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-Type':'multipart/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({query})\r\n });\r\n const responseData = await response.json();\r\n console.log('data',responseData.data.myId);\r\n if(responseData.data.myId==null)\r\n console.error('Error: no valid globe user found');\r\n let accId = responseData.data.myId;\r\n // FETCH GLOBES\r\n // query = `{allGlobes(condition: {account: \"${accId}\"}) {\r\n // edges {\r\n // node {\r\n // id\r\n // pagesByGlobeId {\r\n // nodes {\r\n // content\r\n // name\r\n // slug\r\n // style\r\n // type\r\n // nodeId\r\n // }\r\n // pageInfo {\r\n // startCursor\r\n // endCursor\r\n // }\r\n // }\r\n // visLayersByGlobeId {\r\n // nodes {\r\n // config\r\n // lastUpdated\r\n // name\r\n // stateLayersByLayerId {\r\n // nodes {\r\n // layerId\r\n // nodeId\r\n // stateId\r\n // }\r\n // }\r\n // }\r\n // }\r\n // }\r\n // }\r\n // }}`;\r\n // query = `{\r\n // a: jwtEnvVar(v: \"jwt.claims.user_email\"),\r\n // b: jwtEnvVar(v: \"jwt.claims.user_id\"),\r\n // }`;\r\n const globereq = await fetch('https://api.myglobe.app/graphql', {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-Type':'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({query})\r\n });\r\n const globeResponseData = await globereq.json();\r\n console.log(globeResponseData);\r\n } catch(e) {\r\n console.error(e);\r\n }\r\n }, [getTokenSilently]);\r\n\r\n useEffect(()=>{\r\n console.log('isAuthenticated',isAuthenticated/*,user*/);\r\n //console.log(prevAuth.current,isAuthenticated);\r\n // if(isAuthenticated)\r\n // callApi();\r\n //user&&callApi(user);\r\n }, [isAuthenticated /*user*/]);\r\n return (\r\n \r\n {(loading) &&\r\n
\r\n \r\n \r\n
\r\n }\r\n { isAuthenticated && }\r\n {/* {isAuthenticated && } */} \r\n {isAuthenticated&&user&&

{user.name}

}\r\n {isAuthenticated && }\r\n
\r\n );\r\n};\r\n\r\nexport default Admin;","/* ================================================================ */\r\n// USER TOOLBAR COMPONENT | UserToolbar.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Material UI\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Button from '@material-ui/core/Button';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Auth0\r\nimport { useAuth0 } from '../../../auth0/auth0';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n zIndex: 10000,\r\n display: 'flex',\r\n position: 'fixed',\r\n top: 0,\r\n right: '2em',\r\n height: '4em',\r\n },\r\n user: {\r\n margin: '1em'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * User Toolbar\r\n * ------------\r\n * Login/Logout and current user display\r\n *\r\n * @component\r\n * @param {object} props component properties\r\n */\r\nconst UserToolbar = (props) => {\r\n const classes = useStyles();\r\n const {isAuthenticated, loginWithRedirect, logout, loading, user} = useAuth0();\r\n const handleProfileClick = () => {\r\n console.log(user);\r\n };\r\n return !loading && (\r\n \r\n {console.log(user)}\r\n {isAuthenticated && user &&\r\n
\r\n }\r\n label={user.name}\r\n color=\"primary\"\r\n onClick={handleProfileClick}\r\n variant=\"outlined\"\r\n />\r\n
\r\n }\r\n \r\n {!isAuthenticated ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n );\r\n};\r\nconst LoginIcon = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nconst LogoutIcon = (props) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default UserToolbar;","/* ================================================================ */\r\n// ADMIN LAYOUT CONTAINER | AdminLayout.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Auth0\r\nimport { useAuth0 } from '../../auth0/auth0';\r\n// MaterialUI\r\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\r\nimport Link from '@material-ui/core/Link';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Constants\r\nimport {LayoutTypes} from '@myglobe/core/dist/types';\r\n// Validators\r\n//import LayoutConfig from './LayoutConfig';\r\n// Local Components\r\nimport Admin from '../../containers/Admin';\r\nimport UserToolbar from '../../components/Admin/UserToolbar';\r\n// MyGlobe Library\r\n// Hooks\r\n//import useMedia from '@myglobe/core/dist/hooks/useMedia';\r\n// > ASYNC\r\n//const Drawer = React.lazy(()=>import('@myglobe/core/dist/Layout/Drawer'));\r\n//const GridLayout = React.lazy(()=>import('@myglobe/core/dist/Layout/Grid'));\r\n//const LayeredLayout = React.lazy(()=>import('@myglobe/core/dist/Layout/Layered'));\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(({\r\n 'body': {\r\n transition: 'all 0.25s linear'\r\n },\r\n root: {\r\n // overflow: 'hidden',\r\n // position: 'relative',\r\n // width: '100%',\r\n // height: '100vh',\r\n // display: 'flex',\r\n //background:'pink',\r\n // transition: 'all 500ms cubic-bezier(0.215, 0.610, 0.355, 1.000)',\r\n },\r\n navigation: {\r\n\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Admin Layout\r\n * ------------\r\n * Admin dashboard layout\r\n *\r\n * @param {object} props component props\r\n */\r\nconst AdminLayout = React.memo((props) => {\r\n const classes = useStyles();\r\n const rootClasses = classNames(classes.root);\r\n return (\r\n
\r\n \r\n \r\n Home\r\n \r\n \r\n Admin\r\n \r\n Datasets\r\n \r\n \r\n \r\n
\r\n );\r\n});\r\n/* ========================================== */\r\n// Props\r\n/* ========================================== */\r\nAdminLayout.propTypes = {\r\n isLoading: PropTypes.bool.isRequired,\r\n theme: PropTypes.object\r\n};\r\nAdminLayout.types = LayoutTypes;\r\nAdminLayout.displayName = 'AdminLayout';\r\nAdminLayout.whyDidYouRender = true;\r\n/* ========================================== */\r\n// Exports\r\n/* ========================================== */\r\nexport default AdminLayout;","import React from 'react';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport DownloadIcon from '@material-ui/icons/GetApp';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\n\r\nconst styles = theme => ({\r\n selected: {\r\n background: theme.palette.primary[100]\r\n },\r\n container: {\r\n overflow: 'auto',\r\n maxHeight: 300,\r\n paddingTop: '10px'\r\n },\r\n});\r\n\r\nclass StoriesList extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n const { classes } = props;\r\n this.state = { stories: [], selectedID: null };\r\n }\r\n componentDidMount() {\r\n this.setState({ stories: this.props.stories });\r\n }\r\n componentWillReceiveProps(nextProps) {\r\n this.setState({ stories: nextProps.stories });\r\n }\r\n handleListSelect(id, evt) {\r\n if (this.props.handleSelect)\r\n this.props.handleSelect(id);\r\n this.setState({ selectedID: id });\r\n }\r\n handleEdit(id, evt) {\r\n if(this.props.handleSelect)\r\n this.props.handleSelect(id);\r\n this.setState({selectedID: id});\r\n }\r\n handleDelete(id, evt) {\r\n if(this.props.handleDelete)\r\n this.props.handleDelete(id);\r\n this.setState({selectedID: id});\r\n }\r\n\r\n render() {\r\n let items = this.state.stories;\r\n const { classes } = this.props;\r\n let updatedStories = items.map(story=>{\r\n story.Display = true;\r\n return story;\r\n });\r\n let storyItems = null;\r\n if (updatedStories) {\r\n storyItems = updatedStories.map((item) =>\r\n (item.Display) &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n if (storyItems.length!=0) {\r\n return (\r\n \r\n {storyItems}\r\n \r\n );\r\n } else {\r\n return (\r\n
\r\n No stories\r\n
\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(StoriesList);","/* ================================================================ */\r\n// PANEL EDITOR COMPONENT | PanelEditor.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes, { string } from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport { useSelector } from 'react-redux'\r\n// Material UI\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Pagination from '@material-ui/lab/Pagination';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport CameraIcon from '@material-ui/icons/CameraAlt';\r\nimport { Paper } from '@material-ui/core';\r\n// Actions\r\nimport { updatePanel, createPanel } from '../../actions/Data/Content';\r\nimport { updateMapState } from '../../actions/Map';\r\n// Selectors\r\nimport { getGlobe } from '../../selectors/Data';\r\n// CKEditor\r\nimport CKEditor from '@ckeditor/ckeditor5-react';\r\nimport Image from '@ckeditor/ckeditor5-image/src/image';\r\nimport ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar';\r\nimport ImageResize from '@ckeditor/ckeditor5-image/src/imageresize';\r\nimport ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';\r\nimport Heading from '@ckeditor/ckeditor5-heading/src/heading';\r\nimport Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';\r\nimport Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';\r\nimport Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';\r\nimport Underline from '@ckeditor/ckeditor5-basic-styles/src/underline';\r\nimport Strikethrough from '@ckeditor/ckeditor5-basic-styles/src/strikethrough';\r\nimport Code from '@ckeditor/ckeditor5-basic-styles/src/code';\r\nimport Subscript from '@ckeditor/ckeditor5-basic-styles/src/subscript';\r\nimport Superscript from '@ckeditor/ckeditor5-basic-styles/src/superscript';\r\nimport Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';\r\nimport Base64UploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter';\r\nimport GFMDataProcessor from '@ckeditor/ckeditor5-markdown-gfm/src/gfmdataprocessor';\r\n// Hooks\r\nimport usePrevious from '@myglobe/core/dist/hooks/usePrevious';\r\n// JSON Editor\r\nimport { JsonEditor as JsonEditor } from 'jsoneditor-react';\r\nimport 'jsoneditor-react/es/editor.min.css';\r\nimport { isNullOrUndefined } from 'util';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n //position: 'relative',\r\n overflow: 'hidden',\r\n width: '100%',\r\n //height: '100%',\r\n //display: 'flex'\r\n },\r\n editToggle: {\r\n position: 'absolute',\r\n right: '-1em',\r\n top: '3em'\r\n },\r\n // === Panel Classes ===\r\n panel: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n color: theme.palette.text.primary,\r\n width: '100%',\r\n height: '100%',\r\n borderRadius: 0\r\n },\r\n editor: {\r\n color: theme.palette.common.black,\r\n color:'#FFF',\r\n position:'fixed',\r\n left:'60%',\r\n top:'15%',\r\n width:'35vw',\r\n zIndex:1000,\r\n },\r\n stateEditor: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n },\r\n jsonEditor: {\r\n flex:'1 1 0',\r\n background:\"#FFF\",\r\n },\r\n ckEditor:{\r\n color:'#000 !important',\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Panel Editor\r\n * ------------\r\n * Interface for editing slugs, titles and content\r\n * of a given panel\r\n *\r\n * @param {object} props component properties\r\n * @param {number} index page index\r\n * @param {boolean} isOpen open status\r\n * @param {object} panel panel data\r\n *\r\n * @param {object} globe globe config\r\n * @param {string} storyId parent story id\r\n *\r\n * @param {func} onChange content change callback\r\n * @param {func} onUpdate content update callback\r\n * @param {func} onSave save all panel states to store\r\n *\r\n * @param {func} createPanel creates a new panel in panels store\r\n * @param {func} updatePanel updates existing panel in panels store\r\n */\r\nconst PanelEditor = (props) => {\r\n const classes = useStyles();\r\n const {\r\n index,\r\n globe,\r\n storyId,\r\n panelCount,\r\n isOpen,\r\n onChange,\r\n onUpdate,\r\n onCancel,\r\n onSave,\r\n onPanelChange,\r\n createPanel,\r\n updatePanel,\r\n updateMapState\r\n } = props;\r\n const [content, setContent] = useState(props.panel?.content);\r\n const [panel, setPanel] = useState(props.panel); \r\n const [viewState, setViewState] = useState(props.panel.viewState);\r\n const curMapView = useSelector(state => state.Map.viewState);\r\n const visLayers = useSelector(state => state.Data.layers.byId);\r\n const jsonEditorRef = useRef();\r\n // Simple plugin which loads the data processor.\r\n function Markdown( editor ) {\r\n editor.data.processor = new GFMDataProcessor( editor.editing.view.document );\r\n }\r\n\r\n /*useEffect(() => {\r\n\r\n }, [index]);*/\r\n\r\n const editorConfig = {\r\n plugins: [\r\n Markdown,\r\n Essentials,\r\n Heading,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strikethrough,\r\n Image,\r\n ImageToolbar,\r\n ImageResize,\r\n Code,\r\n Subscript,\r\n Superscript,\r\n Base64UploadAdapter\r\n ],\r\n toolbar: {\r\n items: [\r\n 'heading',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'link',\r\n 'bulletedList',\r\n 'numberedList',\r\n 'blockQuote',\r\n 'undo',\r\n 'redo',\r\n 'upload'\r\n ]\r\n },\r\n image: {\r\n toolbar: [\r\n 'imageStyle:full',\r\n 'imageStyle:side',\r\n '|',\r\n 'imageTextAlternative'\r\n ]\r\n },\r\n language: 'en',/*,\r\n autosave: {\r\n waitingTime: 5000, // in ms\r\n save(editor) {\r\n return onUpdate(editor.getData());\r\n }\r\n },\r\n */\r\n };\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Panel Change\r\n * -------------------\r\n *\r\n */\r\n const handlePanelChange = (event, value) => {\r\n // Get panel in value range\r\n onPanelChange && onPanelChange(value);\r\n };\r\n const handleCancel = () => {\r\n onCancel && onCancel();\r\n };\r\n const handleJsonChange = (evt) => {\r\n console.log(evt);\r\n setViewState(JSON.stringify(evt));\r\n };\r\n const handleCaptureState = ()=>{\r\n let visibleVisLayers = [];\r\n Object.keys(visLayers).forEach(x=>{\r\n if(visLayers[x].Visible)\r\n visibleVisLayers.push(x);\r\n });\r\n const newView = {...curMapView, ...{visLayers:visibleVisLayers}};\r\n jsonEditorRef.current.jsonEditor.set(newView);\r\n setViewState(JSON.stringify(newView));\r\n };\r\n useEffect(()=>{\r\n if(typeof(viewState)==\"string\") {\r\n console.log('here');\r\n updateMapState({viewState: JSON.parse(viewState)});\r\n }\r\n console.log('viewstate change', viewState);\r\n },[viewState]);\r\n /* ========================================== */\r\n /**\r\n * Handle Save\r\n * -----------\r\n * Update a panel with new data\r\n */\r\n const handleSave = () => {\r\n onSave && onSave(index, panel);\r\n \r\n isNullOrUndefined(panel.uuid) ? createPanel(panel, storyId, globe.uuid) : updatePanel(panel, globe.name,viewState)\r\n };\r\n const handleValue = (event) => {\r\n const value = event.target.value;\r\n const stateName = event.target.name;\r\n setPanel({\r\n ...panel,\r\n [stateName]: value\r\n });\r\n }\r\n \r\n /* ========================================== */\r\n /**\r\n * Handle Content Change\r\n * ---------------------\r\n * Update content state\r\n *\r\n * @param {object} editor ckeditor\r\n */\r\n function handleContentChange(event, editor) {\r\n const data = editor.getData();\r\n // OnChange Callback\r\n onChange && onChange(data);\r\n setContent(data);\r\n console.log(data);\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Content Update\r\n * ---------------------\r\n * Send updated content to callback function and\r\n * save the current panel content to the panel state\r\n *\r\n * @param {object} editor ckeditor\r\n */\r\n function handleContentUpdate(event, editor) {\r\n const data = editor.getData();\r\n onUpdate && onUpdate(data);\r\n // Update panel state with active content\r\n setPanel({\r\n ...panel,\r\n content\r\n });\r\n }\r\n return (\r\n
\r\n \r\n Panel Editor | {panel.title}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {\r\n // You can store the \"editor\" and use when it is needed.\r\n console.log('Editor is ready to use!', editor);\r\n }}\r\n onChange={handleContentChange}\r\n onBlur={handleContentUpdate}\r\n onFocus={(event, editor) => {\r\n console.log('Focus.', editor);\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n

ViewState: {props.panel?.state}

\r\n
\r\n
\r\n {typeof(viewState)==\"string\"&&}
\r\n \r\n
\r\n
\r\n
\r\n \r\n {panelCount && }\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nPanelEditor.propTypes = {\r\n index: PropTypes.number,\r\n panelCount: PropTypes.number,\r\n isOpen: PropTypes.bool.isRequired,\r\n globe: PropTypes.object.isRequired,\r\n storyId: PropTypes.string.isRequired,\r\n panel: PropTypes.shape({\r\n title: PropTypes.string,\r\n slug: PropTypes.string,\r\n content: PropTypes.string\r\n }),\r\n // Callbacks\r\n onChange: PropTypes.func,\r\n onUpdate: PropTypes.func,\r\n onCancel: PropTypes.func,\r\n onSave: PropTypes.func,\r\n // Functions\r\n createPanel: PropTypes.func.isRequired,\r\n updatePanel: PropTypes.func.isRequired\r\n};\r\nPanelEditor.displayName = 'PanelEditor';\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = (store) => {\r\n return {\r\n globe: getGlobe(store),\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({ updatePanel, createPanel, updateMapState, dispatch }), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PanelEditor);","/* ================================================================ */\r\n// STORY EDITOR COMPONENT | StoryEditor.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\n// Actions\r\nimport {updatePanelOrder, deletePanel, createStory, updateStory} from '../../actions/Data/Content';\r\n// Selectors\r\nimport {getLoadingStatusSelector, getActivePanels, getGlobe} from '../../selectors/Data';\r\n// Sortable list\r\nimport { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';\r\n// Material UI\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\n\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport ReorderIcon from '@material-ui/icons/Reorder';\r\n// Hooks\r\nimport usePrevious from '@myglobe/core/dist/hooks/usePrevious';\r\n// Local Components\r\nimport PanelEditor from './PanelEditor';\r\nimport {isNullOrUndefined} from 'util';\r\nimport { Paper } from '@material-ui/core';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n //position: 'relative',\r\n overflow: 'hidden',\r\n width: '100%',\r\n //height: '100%',\r\n //display: 'flex'\r\n },\r\n editToggle: {\r\n position: 'absolute',\r\n right: '-1em',\r\n top: '3em'\r\n },\r\n // === Panel Classes ===\r\n panel: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n color: theme.palette.text.primary,\r\n width: '100%',\r\n height: '100%',\r\n borderRadius: 0\r\n },\r\n editor: {\r\n color: theme.palette.common.black,\r\n color:'#FFF',\r\n position:'absolute',\r\n left:'50%',\r\n top:'10%',\r\n width:'25vw',\r\n minHeight:'50vw',\r\n overflowY:'scroll'\r\n },\r\n\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Story Editor\r\n * ------------\r\n * Interface for editing slugs, titles and panel order\r\n * of a story\r\n *\r\n * @param {object} props component properties\r\n * @param {object} globe globe state\r\n * @param {object} story story data\r\n * @param {object} panels story panels data\r\n * @param {boolean} isOpen open status\r\n * @param {boolean} isLoading is loading status\r\n * Functions\r\n * @param {func} onSave save all panel states to store\r\n * @param {func} onCancel cancel update callback\r\n * \r\n * @param {func} updateStory update story\r\n * @param {func} createStory create story\r\n * @param {func} updatePanelOrder bulk panel order update to store\r\n * @param {func} deletePanel delete panel by panelId\r\n */\r\nconst StoryEditor = (props) => {\r\n const classes = useStyles();\r\n const {\r\n isOpen,\r\n isLoading,\r\n globe,\r\n onSave,\r\n onCancel,\r\n updatePanelOrder,\r\n createStory,\r\n updateStory,\r\n deletePanel\r\n } = props;\r\n const [story, setStory] = useState(props.story);\r\n const [panels, setPanels] = useState(props.panels);\r\n const [panel, setPanel] = useState(null);\r\n const [confirm, setConfirm] = useState({open: false, callback: ()=>{}});\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n isSubscribed && setPanels(props.panels);\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [props.panels]);\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Save\r\n * -----------\r\n * Send the updated story data to parent via callback\r\n * Save story data to reducer\r\n */\r\n const handleSave = () => {\r\n if(onSave) onSave(story);\r\n if(isNullOrUndefined(story.uuid))\r\n createStory(story, globe.uuid);\r\n else {\r\n updateStory(story, globe.name);\r\n updatePanelOrder && updatePanelOrder(panels);\r\n }\r\n };\r\n const handleCancel = () => {\r\n onCancel && onCancel();\r\n };\r\n /**\r\n * Handle Panel Edit\r\n * -----------------\r\n * Toggles panel editor for given panel\r\n * index\r\n * @param {number} index panel index\r\n */\r\n const handlePanelEdit = (index) => {\r\n setPanel(panels[index]);\r\n };\r\n /**\r\n * Handle Panel Edit Cancel\r\n * ------------------------\r\n * Cancel panel editor edits without\r\n * saving\r\n */\r\n const handlePanelEditCancel = () => {\r\n setPanel(null);\r\n };\r\n const handlePanelEditSave = () => {\r\n setPanel(null);\r\n };\r\n /**\r\n * Handle Panel Delete\r\n * -------------------\r\n * Triggers the deletion process of the panel\r\n * via a dialog with the delete panel action callback\r\n *\r\n * @param {string} uuid deleting panel's uuid\r\n */\r\n const handlePanelDelete = (uuid) => {\r\n setConfirm({\r\n open: true,\r\n callback: ()=>deletePanel(uuid, story.uuid)\r\n });\r\n };\r\n /**\r\n * Handle Panel Add\r\n * ----------------\r\n * Toggles a blank panel in the panel editor\r\n */\r\n const handlePanelAdd = () => {\r\n setPanel({\r\n position: panels.length,\r\n slug: '',\r\n title: 'New Panel',\r\n content: '',\r\n viewState: {}\r\n });\r\n };\r\n const handleConfirmCancel = () => {\r\n setConfirm({open: false, callback: ()=>{}});\r\n };\r\n const handleConfirm = () => {\r\n confirm.callback();\r\n setConfirm({open: false, callback: ()=>{}});\r\n };\r\n /* ========================================== */\r\n /**\r\n * Handle Value\r\n * ------------\r\n * Update the text value of the story data\r\n * corresponding to the field name\r\n *\r\n * @param {*} event\r\n */\r\n const handleValue = (event) => {\r\n const value = event.target.value;\r\n const stateName = event.target.name;\r\n setStory({\r\n ...story,\r\n [stateName]: value\r\n });\r\n };\r\n\r\n const handleSort = ({oldIndex, newIndex}) => {\r\n let sortedArr = panels.slice();\r\n sortedArr.splice(newIndex, 0, sortedArr.splice(oldIndex, 1)[0]);\r\n sortedArr.forEach((item, i)=>item.position = i);\r\n console.log(sortedArr);\r\n setPanels(sortedArr);\r\n //setPanels(sortedArr);\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n {isLoading ?\r\n \r\n
\r\n \r\n
\r\n
\r\n : (\r\n <>\r\n \r\n Story Editor | {story.title}\r\n \r\n \r\n \r\n {panels.length > 0 ?\r\n \r\n : No Panels to Display}\r\n {story.uuid &&\r\n \r\n }\r\n {panel &&\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nconst ConfirmationDialog = ({\r\n isOpen,\r\n onCancel,\r\n onConfirm\r\n}) => {\r\n const classes = useStyles();\r\n /*const [open, setOpen] = useState(isOpen);\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n isSubscribed && setOpen(isOpen);\r\n return () => {\r\n isSubscribed = false; \r\n };\r\n }, [isOpen]);*/\r\n function handleCancel() {\r\n onCancel && onCancel();\r\n }\r\n function handleConfirm() {\r\n onConfirm && onConfirm();\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nConfirmationDialog.propTypes = {\r\n isOpen: PropTypes.bool.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n onConfirm: PropTypes.func.isRequired\r\n};\r\n\r\nconst DragHandle = SortableHandle((classes) => (\r\n \r\n \r\n \r\n));\r\nconst SortableItem = SortableElement(({\r\n item,\r\n pos,\r\n classes,\r\n handleEdit,\r\n handleDelete\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n handleEdit(pos)}\r\n >\r\n \r\n \r\n handleDelete(item.uuid)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\nconst SortableList = SortableContainer(({\r\n items,\r\n classes,\r\n handleEdit,\r\n handleDelete\r\n}) => (\r\n \r\n {items.map((value, index) => {\r\n console.log(value, index);\r\n return (\r\n \r\n );\r\n })}\r\n \r\n));\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nStoryEditor.propTypes = {\r\n isOpen: PropTypes.bool.isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n globe: PropTypes.object.isRequired,\r\n story: PropTypes.shape({\r\n uuid: PropTypes.string,\r\n title: PropTypes.string,\r\n slug: PropTypes.string,\r\n panels: PropTypes.array\r\n }),\r\n panels: PropTypes.arrayOf(PropTypes.shape({\r\n uuid: PropTypes.string,\r\n title: PropTypes.string,\r\n slug: PropTypes.string,\r\n position: PropTypes.number,\r\n content: PropTypes.string\r\n })),\r\n // Functions\r\n onChange: PropTypes.func,\r\n onUpdate: PropTypes.func,\r\n onSave: PropTypes.func,\r\n onCancel: PropTypes.func,\r\n createStory: PropTypes.func,\r\n updateStory: PropTypes.func,\r\n updatePanelOrder: PropTypes.func,\r\n deletePanel: PropTypes.func\r\n};\r\nStoryEditor.displayName = 'StoryEditor';\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = (store, props) => { \r\n const getLoading = getLoadingStatusSelector(['stories', 'globe', 'panels']);\r\n return {\r\n isLoading: getLoading(store),\r\n globe: getGlobe(store),\r\n panels: getActivePanels(store, props.story.slug),\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({updatePanelOrder, deletePanel, createStory, updateStory, dispatch}), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(StoryEditor);","import React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from 'redux';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport Button from '@material-ui/core/Button';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport LinearProgress from '@material-ui/core/LinearProgress';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Icon from '@material-ui/core/Icon';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport SearchBar from 'material-ui-search-bar';\r\nimport WarningIcon from '@material-ui/icons/Warning';\r\nimport {isNullOrUndefined} from 'util';\r\nimport StoriesList from './StoriesList';\r\nimport StoryEditor from '../../containers/StoryEditor';\r\n// Actions\r\nimport { deleteStory } from '../../actions/Data/Content';\r\n\r\nimport {getLoadingStatusSelector, getStoriesFlatMap} from '../../selectors/Data';\r\n//import DatasetList from '../components/DatasetList';\r\n//import Uploader from '../components/Uploader';\r\n\r\nimport * as FS from 'file-saver';\r\n\r\nconst styles = theme => ({\r\n root: {\r\n position: 'absolute',\r\n backgroundColor: theme.palette.secondary.main,\r\n width: '100%',\r\n height: '100%',\r\n margin: 0,\r\n padding: 0,\r\n overflow: 'hidden'\r\n },\r\n dataList: {\r\n maxHeight: '10rem',\r\n overflow: 'auto'\r\n },\r\n deets: {\r\n fontSize: '.75rem',\r\n },\r\n error: {\r\n color: '#F44336',\r\n display: 'flex',\r\n fontSize: '.75em',\r\n alignItems: 'center',\r\n '& div': {\r\n paddingLeft: '.75em',\r\n }\r\n },\r\n uploadSuccess: {\r\n animation: 'fadeIn 2s forwards',\r\n textAlign: 'center',\r\n color: '#4CAF50',\r\n fontWeight: 500,\r\n fontSize: '.8em',\r\n },\r\n '@keyframes fadeIn': {\r\n 'from': { opacity: 0 },\r\n 'to': { opacity: 1 },\r\n }\r\n});\r\n\r\nclass Stories extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n //const { classes } = props;\r\n this.classes = withStyles();\r\n this.state = { filteredList: [], \r\n datasetTitle: \"\", \r\n dialogOpen: false, \r\n deletingID: null,\r\n editStory: null\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n //console.log(this.state.filteredList);\r\n }\r\n\r\n /*\r\n componentDidMount() {\r\n \r\n /*if (this.props.datasets == null && !this.props.fetching) {\r\n this.props.dispatch(CmsActions.requestDatasets(this.props.userId));\r\n } else *//*if (this.state.filteredList != this.props.stories) {\r\n this.setState({ filteredList: this.props.stories });\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n this.setState({ filteredList: nextProps.stories });\r\n }*/\r\n handleSelect(id) {\r\n var story = this.props.stories.find(x => x.uuid === id);\r\n /*let metaObj = dataset.Meta;\r\n console.log(metaObj);*/\r\n console.log(story);\r\n this.setState({editStory: story});\r\n }\r\n handleDelete(id) {\r\n var story = this.props.stories.find(x => x.uuid === id);\r\n /*let metaObj = dataset.Meta;\r\n console.log(metaObj);*/\r\n console.log(story,this);\r\n this.props.deleteStory(id);\r\n //this.setState({editStory: story});\r\n }\r\n handleExit(){\r\n this.setState({editStory: null});\r\n }\r\n handleNewStory() {\r\n this.setState({editStory: {\r\n title: 'New Story',\r\n slug: 'new-story',\r\n panels: []\r\n }});\r\n }\r\n render() {\r\n return (\r\n <>\r\n \r\n \r\n

My Stories

\r\n
\r\n \r\n {/* console.log('onRequestSearch')}\r\n style={{\r\n margin: '0 auto',\r\n maxWidth: '100%',\r\n fontSize: '0.875rem',\r\n margin: 'auto 0.875rem',\r\n height: '2rem',\r\n iconButtonSearch: {\r\n style: {\r\n height: '2.25rem'\r\n }\r\n },\r\n iconButtonClose: {\r\n style: {\r\n height: '2.25rem'\r\n }\r\n }\r\n }}\r\n />*/}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {this.state.editStory&&\r\n }\r\n \r\n );\r\n }\r\n}\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = store => {\r\n const getLoading = getLoadingStatusSelector(['stories']);\r\n return {\r\n isLoading: getLoading(store),\r\n stories: getStoriesFlatMap(store)\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({deleteStory, dispatch}), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(Stories));","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport {\r\n Switch,\r\n IconButton,\r\n List, \r\n ListItem, \r\n ListItemText, \r\n ListItemSecondaryAction\r\n} from '@material-ui/core';\r\nimport DownloadIcon from '@material-ui/icons/GetApp';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\n\r\nconst styles = theme => ({\r\n selected: {\r\n background: theme.palette.primary[100]\r\n },\r\n container: {\r\n overflow: 'auto',\r\n maxHeight: 300,\r\n paddingTop: '10px'\r\n },\r\n});\r\n\r\nclass DatasetList extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n const { classes } = props;\r\n this.state = { datasets: [], selectedID: null };\r\n }\r\n componentDidMount() {\r\n this.setState({ datasets: this.props.datasets });\r\n }\r\n componentWillReceiveProps(nextProps) {\r\n this.setState({ datasets: nextProps.datasets });\r\n }\r\n handleToggle(id, evt, isInputChecked) {\r\n if (this.props.handleToggle)\r\n this.props.handleToggle(id, isInputChecked);\r\n }\r\n handleLoad(id, evt) {\r\n if (this.props.loadClicked)\r\n this.props.loadClicked(id);\r\n }\r\n handleDelete(id, evt) {\r\n if (this.props.deleteClicked)\r\n this.props.deleteClicked(id);\r\n }\r\n handleListSelect(id, evt) {\r\n if (this.props.handleSelect)\r\n this.props.handleSelect(id);\r\n this.setState({ selectedID: id });\r\n }\r\n\r\n render() {\r\n let items = this.state.datasets;\r\n const { classes } = this.props;\r\n let updatedLayers = items.map(dataset=>{\r\n dataset.Display = true;\r\n return dataset;\r\n })\r\n let datasetItems = null;\r\n if (updatedLayers) {\r\n datasetItems = updatedLayers.map((item) =>\r\n (item.Display)&&\r\n \r\n \r\n \r\n \r\n \r\n {\r\n \r\n \r\n \r\n }\r\n \r\n \r\n );\r\n }\r\n if (datasetItems.length!=0) {\r\n return (\r\n \r\n {datasetItems}\r\n \r\n )\r\n } else {\r\n return
No datasets
\r\n }\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DatasetList)","import React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from 'redux';\r\n\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport {\r\n Button,\r\n CircularProgress, LinearProgress,\r\n Dialog, DialogActions, DialogTitle,\r\n Divider,\r\n Grid,\r\n Icon,\r\n TextField\r\n} from '@material-ui/core';\r\nimport SearchBar from 'material-ui-search-bar';\r\nimport WarningIcon from '@material-ui/icons/Warning';\r\n\r\nimport DatasetList from './DatasetList'\r\n//import DatasetList from '../components/DatasetList';\r\n//import Uploader from '../components/Uploader';\r\n\r\nimport * as FS from 'file-saver';\r\n\r\nconst styles = theme => ({\r\n root: {\r\n position: 'absolute',\r\n backgroundColor: theme.palette.secondary.main,\r\n width: '100%',\r\n height: '100%',\r\n margin: 0,\r\n padding: 0,\r\n overflow: 'hidden'\r\n },\r\n dataList: {\r\n maxHeight: '10rem',\r\n overflow: 'auto'\r\n },\r\n deets: {\r\n fontSize: '.75rem',\r\n },\r\n error: {\r\n color: '#F44336',\r\n display: 'flex',\r\n fontSize: '.75em',\r\n alignItems: 'center',\r\n '& div': {\r\n paddingLeft: '.75em',\r\n }\r\n },\r\n uploadSuccess: {\r\n animation: 'fadeIn 2s forwards',\r\n textAlign: 'center',\r\n color: '#4CAF50',\r\n fontWeight: 500,\r\n fontSize: '.8em',\r\n },\r\n '@keyframes fadeIn': {\r\n 'from': { opacity: 0 },\r\n 'to': { opacity: 1 },\r\n }\r\n});\r\n\r\nexport default class Datasets extends React.Component {\r\n \r\n\r\n constructor(props) {\r\n super(props);\r\n //const { classes } = props;\r\n this.classes = withStyles();\r\n this.state = { filteredList: [], \r\n datasetTitle: \"\", dialogOpen: false, deletingID: null,\r\n };\r\n this.uploader = null;\r\n }\r\n componentWillMount() {\r\n //console.log(this.state.filteredList);\r\n }\r\n componentDidMount() {\r\n \r\n /*if (this.props.datasets == null && !this.props.fetching) {\r\n this.props.dispatch(CmsActions.requestDatasets(this.props.userId));\r\n } else */if (this.state.filteredList != this.props.datasets) {\r\n this.setState({ filteredList: this.props.datasets });\r\n }\r\n }\r\n\r\n componentWillReceiveProps(nextProps) {\r\n if (nextProps.deleting == false) {\r\n this.handleDeleteClose();\r\n }\r\n\r\n //if (this.props.fetching && !nextProps.fetching) {\r\n // this.props.dispatch(CmsActions.requestVisLayers(this.props.userId));\r\n //}\r\n\r\n this.setState({ filteredList: nextProps.datasets });\r\n }\r\n handleTextFieldChange(evt) {\r\n this.setState({\r\n datasetTitle: evt.target.value\r\n });\r\n }\r\n handleGotFile(type, filename) {\r\n this.setState({ type, valid: true, datasetTitle:filename.substr(0, filename.lastIndexOf('.')) || filename});\r\n }\r\n handleCancelFile() {\r\n this.props.dispatch(CmsActions.dismissError());\r\n this.setState({ type: null, valid: false, uploadSuccess: false, editedFile: false });\r\n }\r\n handleUploadClick(evt) {\r\n console.log(this.uploader.state.file);\r\n //this.props.dispatch(CmsActions.uploadDataset(this.props.userId, this.state.datasetTitle, this.uploader.state.file));\r\n }\r\n handleEditClick(evt) {\r\n console.log('yo');\r\n console.log(this.uploader.state.file)\r\n //this.props.dispatch(GlobeActions.uploadSitesFile(this.uploader.state.file));\r\n //this.props.dispatch(CmsActions.uploadDataset(this.props.userId, \"SitesCSV\", this.uploader.state.file));\r\n //this.props.dispatch(CmsActions.uploadDataset(this.props.userId, this.state.datasetTitle, this.uploader.state.file));\r\n }\r\n\r\n handleSelect(id) {\r\n var dataset = this.state.filteredList.find(x => x.Id === id);\r\n /*let metaObj = dataset.Meta;\r\n console.log(metaObj);*/\r\n console.log(dataset);\r\n //TODO: push this into some kind of meta rendering component based on all fields, \r\n // maybe converting known types/fields etc? yuck \r\n /*let metaStr = \"\";\r\n metaStr += \"Filetype: \" + dataset.Type + \"

\";\r\n if (metaObj.date_created)\r\n metaStr += \"Date: \" + metaObj.date_created + \"
\";\r\n \r\n this.setState({ metadata: { __html: metaStr } });*/\r\n //this.props.handleSelect(dataset);\r\n }\r\n handleDownloadEditedFile() {\r\n var blob = this.uploader.state.file;\r\n console.log(blob);\r\n var filename = blob.name.split('.csv')[0] + \"_edited\" + \".csv\";\r\n FS.saveAs(blob,filename);\r\n }\r\n handleLoadClicked(id) {\r\n var dataset = this.props.datasets.find( f=> f.Id == id);\r\n console.log('load clicked');\r\n this.props.handleLoadDataset(dataset);\r\n //this.props.dispatch(GeoserverActions.downloadDataset(dataset));\r\n }\r\n handleDeleteClick(id) {\r\n this.props.handleDelete(id);\r\n //this.setState({ dialogOpen: true, deletingID: id });\r\n }\r\n handleDeleteConfirm(evt) {\r\n this.props.dispatch(CmsActions.deleteDataset(this.state.deletingID));\r\n }\r\n handleDeleteClose() {\r\n this.setState({ dialogOpen: false, deletingID: null });\r\n }\r\n handleReset(evt) {\r\n //this.uploader.resetUpload();\r\n this.setState({ uploadSuccess: false, datasetTitle: \"\", disabled: false, });\r\n }\r\n setError = (err) => {\r\n this.props.dispatch(CmsActions.setError(err));\r\n }\r\n filterDatasetList(evt) {\r\n let updatedList = this.props.datasets;\r\n updatedList = updatedList.filter(function (item) {\r\n return item.Title.toLowerCase().search(\r\n evt.toLowerCase()) !== -1;\r\n });\r\n this.setState({ filteredList: updatedList });\r\n }\r\n handleMakeVisClick = (evt) => {\r\n //TODO: Change app state to Vis\r\n this.props.dispatch(CmsActions.changeAppState(CmsActions.APP_STATES.VISUALISATION));\r\n }\r\n render() {\r\n const { fetching, fetchingModels, fetchingModelTypes, fetched, datasets = [] } = this.props;\r\n return (\r\n <>\r\n \r\n \r\n

My Datasets

\r\n
\r\n \r\n {/* console.log('onRequestSearch')}\r\n style={{\r\n margin: '0 auto',\r\n maxWidth: '100%',\r\n fontSize: '0.875rem',\r\n margin: 'auto 0.875rem',\r\n height: '2rem',\r\n iconButtonSearch: {\r\n style: {\r\n height: '2.25rem'\r\n }\r\n },\r\n iconButtonClose: {\r\n style: {\r\n height: '2.25rem'\r\n }\r\n }\r\n }}\r\n />*/}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {\r\n /*\r\n {\"Are you sure you want to delete this dataset?\"}\r\n \r\n \r\n \r\n \r\n {this.state.deleting ? : null}\r\n */\r\n }\r\n \r\n );\r\n }\r\n}\r\n/*\r\nconst mapStateToProps = (store) => {\r\n return {\r\n visTypes: store.cmsReducers.visTypes,\r\n userId: store.cmsReducers.userId,\r\n fetched: store.cmsReducers.fetched,\r\n fetching: store.cmsReducers.fetchingDatasets,\r\n datasets: store.cmsReducers.datasets,\r\n fetchingModels:store.cmsReducers.fetchingModels,\r\n fetchingModelTypes: store.cmsReducers.fetchingModelTypes,\r\n modelTypes: store.cmsReducers.modelTypes,\r\n models:store.cmsReducers.models,\r\n running: store.cmsReducers.running,\r\n submitting: store.cmsReducers.uploading,\r\n uploadSuccessId: store.cmsReducers.uploadSuccessId,\r\n uploadError: store.cmsReducers.error,\r\n deleting: store.cmsReducers.deleting,\r\n processedSitesFile: store.GlobeReducers.processedSitesFile,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n actions: bindActionCreators(Object.assign({}, CmsActions, GeoserverActions, GlobeActions), dispatch)\r\n});*/\r\n//module.exports = connect(mapStateToProps)(withStyles(styles)(Datasets));\r\n//module.exports = (withStyles(styles)(Datasets));","import React from \"react\";\r\nimport styled from 'styled-components';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport {\r\n Icon,\r\n Button\r\n} from '@material-ui/core';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\n//import MyGlobeIcon from './MyGlobeIcon';\r\n\r\nconst TopMenuDiv = styled.div`\r\n position:absolute;\r\n top:0;\r\n right:0;\r\n z-index:999;\r\n display: flex;\r\n color:#FFF;\r\n`;\r\nconst styles = theme => ({\r\n flex: {\r\n flex:1,\r\n alignSelf:'center',\r\n background:theme.palette.primary[700],\r\n borderRadius:0,\r\n marginLeft:'1rem',\r\n minWidth: \"1rem\",\r\n minHeight: \"1rem\",\r\n width: \"3rem\",\r\n height: \"3rem\"\r\n },\r\n icon: {\r\n color: theme.palette.common.white\r\n }\r\n});\r\n\r\nclass TopMenu extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n const { classes } = props;\r\n }\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n \r\n {/**/}\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TopMenu);","import React from 'react';\r\nimport { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';\r\nimport Draggable from 'react-draggable';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport {\r\n IconButton,\r\n List, ListItem, ListItemText, ListItemSecondaryAction,\r\n Toolbar, TextareaAutosize\r\n} from '@material-ui/core';\r\nimport {\r\n Delete as DeleteIcon,\r\n Reorder as ReorderIcon,\r\n GpsFixed as LocationIcon,\r\n Visibility as VisibilityIcon,\r\n VisibilityOff as VisibilityOffIcon,\r\n GetApp as DownloadIcon\r\n} from '@material-ui/icons';\r\n\r\nimport Save from '../Admin/Save';\r\n\r\nconst styles = theme => ({\r\n container: {\r\n overflow: 'auto',\r\n maxHeight: 300,\r\n },\r\n blue: {\r\n fill: theme.palette.primary[700],\r\n },\r\n button: {\r\n //fontSize:'1rem',\r\n //height:'auto',\r\n },\r\n toolbar: {\r\n minHeight: 'auto',\r\n },\r\n enabled: {\r\n //color:'#333'\r\n },\r\n disabled: {\r\n opacity: 0.5,\r\n },\r\n callToAction: {\r\n minHeight: '100px',\r\n color:'#e0e0e0',\r\n lineHeight:'200px',\r\n textAlign:'center',\r\n }\r\n});\r\n\r\n// TODO: figure out a better way to do this - seperate files or cleanup?\r\n\r\nconst DragHandle = SortableHandle((classes) => \r\n \r\n);\r\nconst SortableItem = SortableElement(({ item, classes, handleToggle, handleStyle, styleChange, handleDelete, handleSave, handleFlyTo, isDocked }) =>\r\n \r\n \r\n {item.Visible ? : }\r\n \r\n \r\n \r\n {item.Visible &&\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {/*\r\n \r\n */}\r\n \r\n } \r\n {\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n);\r\nconst SortableList = SortableContainer(({ items, classes, layerItems, handleToggle, handleDelete, handleFlyTo, handleStyle, styleChange, handleSave, isDocked }) => {\r\n // Update Prediction Layers with Display Property\r\n let updatedLayers = items.map(layer=>{\r\n layer.Display = true;\r\n return layer;\r\n })\r\n items = updatedLayers;\r\n return (\r\n \r\n {items.map((value, index) => (\r\n (value.Display)&&\r\n ))}\r\n \r\n );\r\n});\r\n\r\nclass LayerList extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { visLayers: [] };\r\n }\r\n handleToggle(id, isInputChecked, item, evt) {\r\n if (this.props.handleToggle)\r\n this.props.handleToggle(id, !isInputChecked);\r\n }\r\n componentDidMount() {\r\n this.setState({ visLayers: this.props.visLayers });\r\n }\r\n componentWillReceiveProps(nextProps) {\r\n this.setState({ visLayers: nextProps.visLayers });\r\n }\r\n handleFlyTo(id,evt) {\r\n if (this.props.handleFlyTo)\r\n this.props.handleFlyTo(id);\r\n }\r\n handleDelete(id,evt) {\r\n if(this.props.handleDelete)\r\n this.props.handleDelete(id);\r\n }\r\n handleStyle(id,evt) {\r\n var vis = this.state.visLayers.find(x => x.Id === id);\r\n if(this.props.handleStyle)\r\n this.props.handleStyle(id,vis.style);\r\n }\r\n handleSave(id,filename,evt) { \r\n if(this.props.handleSave)\r\n this.props.handleSave(id,filename);\r\n this.setState(state => {\r\n const visLayers = state.visLayers.map((item) => {\r\n if (item.Id === id) {\r\n item.Changed = false;\r\n item.Filename = filename;\r\n } \r\n return item;\r\n });\r\n \r\n return {\r\n visLayers,\r\n };\r\n });\r\n }\r\n styleChange(id, evt) {\r\n evt.persist();\r\n var vis = this.state.visLayers.find(x => x.Id === id);\r\n var style = vis.style;\r\n vis.style = evt.target.value;\r\n if (style != vis.style) {\r\n this.setState(state => {\r\n const visLayers = state.visLayers.map((item) => {\r\n if (item.Id === id) {\r\n item.Changed = true;\r\n item.style = vis.style;\r\n } \r\n return item;\r\n });\r\n return {\r\n visLayers,\r\n };\r\n });\r\n }\r\n }\r\n onSortEnd({oldIndex, newIndex}) {\r\n // this.setState({\r\n // visLayers: arrayMove(this.state.visLayers, oldIndex, newIndex),\r\n // });\r\n // let newOrder = this.state.visLayers\r\n if(this.props.handleSorted)\r\n this.props.handleSorted(oldIndex,newIndex);\r\n }\r\n render() {\r\n let items = this.state.visLayers;// && this.state.visLayers.sort(x => x.order);\r\n let layerItems = null;\r\n if (items.length == 0)\r\n return
No visualisations to display
;\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(LayerList)","import React from \"react\";\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from 'redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport {\r\n Button,\r\n CircularProgress,\r\n Dialog, DialogActions, DialogTitle,\r\n Grid,\r\n Tab,\r\n Tabs\r\n} from '@material-ui/core';\r\nimport SearchBar from 'material-ui-search-bar';\r\n\r\n//import * as CmsActions from '../actions/CmsActions';\r\n//import * as GlobeActions from '../actions/GlobeActions';\r\nimport LayerList from './LayerList';\r\n\r\nconst styles = theme => ({\r\n gridContainer: {\r\n alignItems: 'center',\r\n },\r\n tabs: {\r\n margin: '0 auto',\r\n maxWidth: '100%',\r\n fontSize: '0.75rem',\r\n margin: 'auto 0.875rem',\r\n height: '2rem',\r\n '& button': {\r\n minWidth: \"2rem\",\r\n }\r\n },\r\n gridOverride: {\r\n maxWidth: \"none\",\r\n flexBasis: \"auto\"\r\n }\r\n});\r\n\r\nexport default class Layers extends React.Component {\r\n static propTypes = {\r\n enabledActions: PropTypes.arrayOf(PropTypes.string)\r\n }\r\n static defaultProps = {\r\n enabledActions: [\"\"]\r\n }\r\n constructor(props) {\r\n super(props);\r\n this.classes = withStyles();\r\n this.state = { filterTabs: \"*\", filteredList: [], deletingID: null };\r\n }\r\n componentWillMount() {\r\n\r\n }\r\n componentDidMount() {\r\n /*if (this.props.visLayers == null && !this.props.fetching) {\r\n this.props.dispatch(CmsActions.requestVisLayers(this.props.userId));\r\n } else */if (this.state.filteredList.length != this.props.visLayers) {\r\n this.setState({ filteredList: this.props.visLayers });\r\n \r\n }\r\n }\r\n /*componentWillReceiveProps(nextProps) {\r\n if (nextProps.deleting == false) {\r\n this.handleDeleteClose();\r\n }\r\n \r\n this.setState({ filteredList: nextProps.visLayers });\r\n }*/\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.deleting && this.props.deleting == false) {\r\n this.handleDeleteClose();\r\n }\r\n if (prevProps.visLayers != this.props.visLayers) {\r\n //console.log(this.state.filterTabs);\r\n this.filterList(this.state.filterTabs);\r\n }\r\n \r\n }\r\n handleLayerToggle(id, isChecked) {\r\n this.props.handleLayerToggle(id, isChecked);\r\n //this.props.dispatch(CmsActions.toggleLayer(this.props.userId, id, isChecked));\r\n }\r\n handleFlyTo(id) {\r\n this.props.dispatch(GlobeActions.flyToLocation(id));\r\n }\r\n\r\n handleDelete(id) {\r\n this.props.handleDelete(id);\r\n //this.setState({ dialogOpen: true, deletingID: id });\r\n }\r\n handleDeleteConfirm(evt) {\r\n this.props.dispatch(CmsActions.deleteLayer(this.state.deletingID));\r\n }\r\n handleDeleteClose() {\r\n this.setState({ dialogOpen: false, deletingID: null });\r\n }\r\n handleCallToAction(newAppState) {\r\n this.props.dispatch(CmsActions.changeAppState(newAppState));\r\n }\r\n handleStyle(id,style) {\r\n this.props.handleStyle(id,style);\r\n }\r\n handleSave(id,filename) {\r\n this.props.handleSave(id,filename);\r\n }\r\n handleSorted(oldIndex, newIndex) {\r\n // copy array for immutability\r\n let sortedArr = this.state.filteredList.slice();\r\n // re-order to match UI\r\n sortedArr.splice(newIndex, 0, sortedArr.splice(oldIndex, 1)[0]);\r\n for (var i = 0; i < sortedArr.length; i++) {\r\n sortedArr[i].Order = i; //updated the order\r\n }\r\n // tell state the order prop changed\r\n this.setState({ filteredList: sortedArr });\r\n // tell server to update the order\r\n this.props.handleSorted(sortedArr);\r\n //this.props.dispatch(CmsActions.reorderLayer(this.props.userId, this.props.visLayers));\r\n }\r\n filterList(str) {\r\n let filterTabs = str;\r\n if(str === '*') {\r\n this.setState({ filterTabs: filterTabs, filteredList: this.props.visLayers });\r\n return;\r\n }\r\n let updatedList = this.props.visLayers;\r\n updatedList = updatedList.filter(function (item) {\r\n return item.Name.toLowerCase().search(\r\n str.toLowerCase()) == -1;\r\n });\r\n this.setState({ filterTabs: filterTabs, filteredList: updatedList });\r\n }\r\n render() {\r\n const { fetching, fetched, visLayers } = this.props;\r\n return (\r\n
\r\n \r\n \r\n

myGlobe Layers

\r\n
\r\n \r\n {fetching ?\r\n \r\n : \r\n }\r\n \r\n {\r\n /*\r\n !fetching && this.props.visLayers && this.props.visLayers.length == 0 ?\r\n \r\n To get started \r\n \r\n then \r\n \r\n : null\r\n */\r\n }\r\n
\r\n {/*\r\n {\"Are you sure you want to delete this layer?\"}\r\n \r\n \r\n \r\n \r\n {this.state.deleting ? : null}\r\n \r\n */}\r\n
\r\n );\r\n }\r\n}\r\n\r\n/*const mapStateToProps = (store) => {\r\n return {\r\n userId: store.cmsReducers.userId,\r\n fetched: store.cmsReducers.fetched,\r\n fetching: store.cmsReducers.fetchingVisLayers,\r\n visLayers: store.cmsReducers.visLayers,\r\n deleting: store.cmsReducers.deleting,\r\n running: store.cmsReducers.running\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n actions: bindActionCreators(CmsActions, dispatch)\r\n});\r\nmodule.exports = connect(mapStateToProps)(withStyles(styles)(Layers));*/\r\n","import React, {useEffect, useRef, useState} from \"react\";\r\nimport Draggable from 'react-draggable';\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from 'redux';\r\n// Auth0\r\nimport { useAuth0 } from '../../auth0/auth0';\r\nimport styled from 'styled-components';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport makeStyles from '@material-ui/core/styles/makeStyles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Icon from '@material-ui/core/Icon';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Launch from '@material-ui/icons/Launch';\r\nimport LoginIcon from \"@material-ui/icons/ExitToApp\";\r\n//import * as CmsActions from '../actions/CmsActions';\r\nimport Stories from './Stories.jsx';\r\nimport Datasets from \"./Datasets.jsx\";\r\nimport TopMenu from \"./TopMenu.jsx\";\r\n//import Models from \"../containers/Models.jsx\";\r\n//import MyGlobeIcon from '../components/MyGlobeIcon';\r\nimport Layers from \"./Layers.jsx\";\r\n\r\n//import Visualisation from \"../containers/Visualisation.jsx\";\r\n//import ActionFooter from \"../containers/ActionFooter.jsx\";\r\n\r\nconst VisContainer = styled.section`\r\n padding:1.5rem;\r\n h2 {\r\n font-size:1.25rem;\r\n font-weight:500;\r\n }\r\n`;\r\nconst dockAnimTime = 200;\r\nconst minimAnimTime = 200;\r\n//const styles = theme => ({\r\nconst useStyles = makeStyles(theme => ({\r\n dragContainer: {\r\n zIndex: 70,\r\n position: 'absolute',\r\n width: '40rem',\r\n height: 'auto',\r\n '&.docked': {\r\n overflow: \"hidden\",\r\n width: '27rem',\r\n fontSize: '.75rem',\r\n },\r\n '&.animating': {\r\n transition: 'transform ease-in ' + dockAnimTime + 'ms',//TODO: improve anims to look nicer with width change\r\n },\r\n '&.minimising': {\r\n transition: 'transform ease-out ' + minimAnimTime + 'ms',\r\n }\r\n },\r\n fakeHidden: {\r\n visibility:'hidden',\r\n height: 0,\r\n },\r\n paper: {\r\n opacity:1,\r\n transform:'scale(1)',\r\n transition:'all '+minimAnimTime+'ms ease-out',\r\n transformOrigin:'top right',\r\n },\r\n minimising: {\r\n opacity:0,\r\n transform:'scale(.2)',\r\n transition:'all '+minimAnimTime+'ms ease-out',\r\n transformOrigin:'top right',\r\n },\r\n appbar: {\r\n background: theme.palette.primary[700],\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n toolbarTitle: {\r\n display: \"flex\",\r\n flex: \"50%\",\r\n flexDirection: \"column\",\r\n flexWrap: \"wrap\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-start\"\r\n },\r\n toolbarActions: {\r\n display: \"flex\",\r\n flex: \"50%\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\"\r\n },\r\n tabs: {\r\n background: theme.palette.primary[500],\r\n },\r\n hidden: {\r\n display:'none'\r\n },\r\n moveCursor: {\r\n cursor: 'move',\r\n },\r\n docker: {\r\n transform: 'rotate(90deg)',\r\n color: '#FFF',\r\n display: \"flex\",\r\n textAlign: \"right\",\r\n },\r\n undocker: {\r\n transform: 'rotate(-90deg)',\r\n color: '#FFF',\r\n display: \"flex\",\r\n textAlign: \"right\",\r\n },\r\n user: {\r\n color: theme.palette.common.black,\r\n background: theme.palette.common.white,\r\n fontWeight: \"bold\"\r\n }\r\n}));\r\n\r\nconst Dashboard = (props) => {\r\n\r\n const dash = useRef(null);\r\n\r\n const classes = useStyles();\r\n const [globeName, setGlobeName] = useState(\"Dashboard\");\r\n const [docked, setDocked] = useState(false);\r\n const [minimised, setMinimised] = useState(false);\r\n const [minimising, setMinimising] = useState(false);\r\n const [maximising, setMaximising] = useState(false);\r\n const [pos, setPos] = useState({ x: 0, y: 0 });\r\n const [oldPos, setOldPos] = useState({ x: 0, y: 0});\r\n const [screenDimensions, setScreenDimensions] = useState({screenW: 0, screenH: 0});\r\n const [animating, setAnimating] = useState(false);\r\n const [datasetsComp, setDatasetsComp] = useState(null);\r\n const [visLayersComp, setVisLayersComp] = useState(null);\r\n const [storiesComp, setStoriesComp] = useState(null);\r\n const [appState, setAppState] = useState(\"VISLAYERS\");\r\n const [visLayers, setVisLayers] = useState(props.visLayers);\r\n const [datasets, setDatasets] = useState(props.datasets);\r\n const { isAuthenticated, loginWithPopup, loginWithRedirect, logout, loading, user } = useAuth0();\r\n const handleLogout = () => {\r\n logout({ returnTo: window.location.protocol + '//' + window.location.host });\r\n };\r\n\r\n useEffect(()=>{\r\n updateWindowDimensions();\r\n window.addEventListener('resize', updateWindowDimensions);\r\n }, []);\r\n\r\n /*componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateWindowDimensions);\r\n }*/\r\n\r\n useEffect(() => {\r\n setVisLayers(props.visLayers);\r\n setDatasets(props.datasets);\r\n setVisLayersComp();\r\n setDatasetsComp();\r\n setStoriesComp()\r\n }, [props.visLayers, props.datasets])\r\n\r\n //TODO: Move this to the store so entire app can use?\r\n function updateWindowDimensions () {\r\n setScreenDimensions({screenW: window.innerWidth, screenH: window.innerHeight})\r\n }\r\n\r\n function handleChange (evt, value) {\r\n setAppState(value);\r\n //this.props.dispatch(CmsActions.changeAppState(value));\r\n };\r\n\r\n function toggleMenu (evt, value) {\r\n if(!minimising && !maximising) {\r\n if(!minimised) {\r\n setOldPos({ x: pos.x, y: pos.y });\r\n setPos({ x: screenDimensions.screenW - dash.current.clientWidth, y: 0});\r\n setMinimising(true);\r\n //this.setState({ oldPos:{x:this.state.pos.x,y:this.state.pos.y}, pos: { x: this.state.screenW - this.dash.clientWidth, y: 0 }, minimising:true });\r\n setTimeout(() => {\r\n setMinimised(true);\r\n setMinimising(false);\r\n }, minimAnimTime);\r\n } else {\r\n setMinimised(false);\r\n setMaximising(true);\r\n setPos({ x: oldPos.x, y: oldPos.y })\r\n //this.setState({ minimised: false, maximising:true, pos: {x:this.state.oldPos.x,y:this.state.oldPos.y} });\r\n setTimeout(() => {\r\n setMinimised(false);\r\n setMaximising(false);\r\n //this.setState({ minimised: false, maximising:false });\r\n }, minimAnimTime);\r\n }\r\n }\r\n };\r\n function handleDocking() {\r\n //^lol\r\n if (!animating) {\r\n setAnimating(true);\r\n setTimeout(() => {\r\n setAnimating(false);\r\n }, dockAnimTime);\r\n setDocked(!docked);\r\n /*this.setState({ docked: !this.state.docked }, () => {\r\n if (this.state.docked && this.props.appState !== CmsActions.APP_STATES.LAYERS)\r\n this.props.dispatch(CmsActions.changeAppState(CmsActions.APP_STATES.LAYERS));\r\n if (this.state.docked) {\r\n this.setState({ oldPos:{x:this.state.pos.x,y:this.state.pos.y}, pos: { x: this.state.screenW - this.dash.clientWidth, y: this.state.screenH - this.dash.clientHeight } });\r\n } else {\r\n //this.setState({ oldPos:{x:this.state.pos.x,y:this.state.pos.y} });\r\n this.setState({ pos: {x:this.state.oldPos.x,y:this.state.oldPos.y} });\r\n }\r\n });*/\r\n\r\n }\r\n }\r\n function handleDragStop (evt, pos) {\r\n const { x, y } = pos;\r\n setPos({ x, y })\r\n //this.setState({ pos: { x, y } });\r\n }\r\n\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n {globeName}\r\n \r\n {/* */}\r\n {isAuthenticated && user &&
\r\n }\r\n label={user.name}/>\r\n \r\n \r\n
}\r\n {!isAuthenticated&&}\r\n
\r\n\r\n {isAuthenticated && user && \r\n \r\n \r\n \r\n }\r\n
\r\n \r\n {isAuthenticated && user ? <>
{visLayersComp}
\r\n
{datasetsComp}
\r\n
{storiesComp}
\r\n {\r\n //
{this.state.vislayersComp}
\r\n //
{this.state.modelsComp}
\r\n }\r\n :

Please log in to begin

}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\n/*const mapStateToProps = (store) => {\r\n return {\r\n loggedIn: store.cmsReducers.loggedIn,\r\n authenticating: store.cmsReducers.authenticating,\r\n globeName: store.cmsReducers.globeName,\r\n username: store.cmsReducers.username,\r\n appState: store.cmsReducers.appState,\r\n\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n actions: bindActionCreators(CmsActions, dispatch)\r\n});\r\nmodule.exports = connect(mapStateToProps)(withStyles(styles)(Dashboard));*/\r\nexport default Dashboard;","import * as FS from 'file-saver';\r\nimport { \r\n HeightReference, LabelStyle, Color, VerticalOrigin, HorizontalOrigin, NearFarScalar, \r\n Cartesian3, Cartographic, ArcType, Math, Cesium3DTileStyle as CesiumDataSourceStyle, BillboardGraphics\r\n} from 'cesium'; \r\n\r\nimport * as Cesium from 'cesium';\r\nCesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI4ZGU0YWFlNC0yNzhmLTQ1ODktOWYyMy03MTQ0NDI3MjBiNTUiLCJpZCI6MTU1MDEsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1NjgwOTU2MDB9.lx6MdiuOH_dSwYAaQ6G9bgakecWQGxBbQ19TFQPxLEY'\r\n\r\nvar heightReferenceLookup = Object.keys(HeightReference).reduce(function(acc, key) {\r\n return acc[HeightReference[key]] = key, acc;\r\n}, {});\r\nvar verticalOriginLookup = Object.keys(VerticalOrigin).reduce(function(acc, key) {\r\n return acc[VerticalOrigin[key]] = key, acc;\r\n}, {});\r\nvar horizontalOriginLookup = Object.keys(HorizontalOrigin).reduce(function(acc, key) {\r\n return acc[HorizontalOrigin[key]] = key, acc;\r\n}, {});\r\nvar labelStyleLookup = Object.keys(LabelStyle).reduce(function(acc, key) {\r\n return acc[LabelStyle[key]] = key, acc;\r\n}, {});\r\n\r\nexport function setDefaultStyle(dataSource) {\r\n\r\n var entity = dataSource.entities.values[0];\r\n dataSource._documentPacket = {};\r\n if (entity.polygon) {\r\n return JSON.stringify({\r\n name: dataSource.name,\r\n type: \"polygon\",\r\n color: [255, 0, 0, 255],\r\n heightReference: \"CLAMP_TO_GROUND\"\r\n })\r\n }\r\n else if (entity.billboard) {\r\n var type = dataSource.entities.values.length === 1 ? \"billboard\" : \"billboardCollection\";\r\n return JSON.stringify({\r\n name: dataSource.name, \r\n type, \r\n image: \"https://myglobe.app/uploads/rous/media/icons/Marker_WTP.svg\", \r\n nearFarScalar: [ 10000.0, 0.4, 100000.0, 0.3 ],\r\n heightReference: \"CLAMP_TO_GROUND\",\r\n verticalOrigin: \"BOTTOM\", \r\n disableDepthTestDistance: 0.0,\r\n position: type === \"billboard\" ? [\r\n 153.343519,\r\n -28.62693,\r\n 0\r\n ] : undefined\r\n });\r\n }\r\n else if (entity.polyline) {\r\n return JSON.stringify({\r\n name: dataSource.name,\r\n type: \"polyline\",\r\n color: [255, 0, 0, 255],\r\n clampToGround: true,\r\n width: 5,\r\n })\r\n }\r\n else\r\n return \"\"; \r\n}\r\n\r\n/**\r\n * Function: visLayer style update\r\n * ------------------------\r\n * Handles incoming view state prop transitions\r\n * and layer updates\r\n */\r\nexport function styleVisLayer(styles, viewer, dataset = null) {\r\n console.log(styles);\r\n if (styles) {\r\n var name = styles.visLayerName;\r\n if (dataset === null)\r\n dataset = viewer.current.dataSources.getByName(name)[0];\r\n if (dataset) {\r\n let {type, name, styleExpression} = styles.styleJSON;\r\n dataset._documentPacket = {styleExpression};\r\n dataset.name = name;\r\n switch (type) {\r\n case \"polygon\": { stylePolygon(styles.styleJSON, dataset) } break;\r\n case \"billboardCollection\":\r\n case \"billboard\": { styleBillboard(styles.styleJSON, dataset)} break;\r\n case \"polyline\": { stylePolyline(styles.styleJSON, dataset)} break;\r\n case \"label\":\r\n case \"labelCollection\": { styleLabel(styles.styleJSON, dataset)} break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function styleLabel(styles, dataset) {\r\n \r\n let { text, font, outlineColor, outlineWidth, fillColor,\r\n style, styleExpression,\r\n nearFarScalar, heightReference, disableDepthTestDistance, \r\n horizontalOrigin, verticalOrigin, position, labelCluster } = styles;\r\n var styleExp = new CesiumDataSourceStyle(styleExpression); \r\n if (!styleExp.scaleByDistance ) styleExp.scaleByDistance = nearFarScalar && 'vec4'+Cesium.Cartesian4.unpack(nearFarScalar).toString();\r\n if (!styleExp.disableDepthTestDistance) styleExp.disableDepthTestDistance = disableDepthTestDistance;\r\n if (!styleExp.verticalOrigin) styleExp.verticalOrigin = VerticalOrigin[verticalOrigin];\r\n if (!styleExp.horizontalOrigin) styleExp.horizontalOrigin = HorizontalOrigin[horizontalOrigin];\r\n if (!styleExp.labelStyle) styleExp.labelStyle = LabelStyle[style];\r\n if (!styleExp.labelText) styleExp.labelText = text;\r\n if (!styleExp.font) styleExp.font = `'${font}'`;\r\n if (!styleExp.labelOutlineWidth) styleExp.labelOutlineWidth = outlineWidth;\r\n if (!styleExp.labelOutlineColor) styleExp.labelOutlineColor = outlineColor && 'rgba'+Color.unpack(outlineColor.map((i,idx) => idx === outlineColor.length - 1 ? i / 255 : i)).toString();\r\n if (!styleExp.labelColor) styleExp.labelColor = fillColor && 'rgba'+Color.unpack(fillColor.map((i,idx) => idx === fillColor.length - 1 ? i / 255 : i)).toString();\r\n if (!styleExp.show) styleExp.show = true;\r\n var nearFarScalarArray = [];\r\n \r\n dataset?.entities?.values.forEach( (entity) => {\r\n if (!entity.label) { entity.label = new Cesium.LabelGraphics(); if (entity.billboard) entity.billboard = undefined; }\r\n if (heightReference) entity.label.heightReference = HeightReference[heightReference];\r\n if (styleExp.disableDepthTestDistance) entity.label.disableDepthTestDistance = styleExp.disableDepthTestDistance.evaluate(entity);\r\n if (styleExp.labelText) entity.label.text = styleExp.labelText.evaluate(entity);\r\n if (styleExp.font) entity.label.font = styleExp.font.evaluate(entity);\r\n if (styleExp.labelColor) entity.label.fillColor = styleExp.labelColor.evaluateColor(entity);\r\n if (styleExp.labelOutlineColor) entity.label.outlineColor = styleExp.labelOutlineColor.evaluateColor(entity);\r\n if (styleExp.labelOutlineWidth) entity.label.outlineWidth = styleExp.labelOutlineWidth.evaluate(entity);\r\n if (styleExp.labelStyle) entity.label.style = styleExp.labelStyle.evaluate(entity);\r\n if (styleExp.horizontalOrigin) entity.label.horizontalOrigin = styleExp.horizontalOrigin.evaluate(entity);\r\n if (styleExp.verticalOrigin) entity.label.verticalOrigin = styleExp.verticalOrigin.evaluate(entity);\r\n if (styleExp.scaleByDistance) entity.label.scaleByDistance = Cesium.NearFarScalar.unpack(Cesium.Cartesian4.pack(styleExp.scaleByDistance.evaluate(entity),nearFarScalarArray));\r\n if (position) entity.position = Cartesian3.fromDegreesArrayHeights(position)[0];\r\n if (styleExp.show) entity.label.show = styleExp.show.evaluate(entity);\r\n })\r\n if (labelCluster) {\r\n console.log(labelCluster);\r\n var pixelRange = labelCluster.pixelRange || 5;\r\n var minimumClusterSize = labelCluster.minimumClusterSize || 2;\r\n \r\n dataset.clustering.enabled = true;\r\n dataset.clustering.pixelRange = pixelRange;\r\n dataset.clustering.minimumClusterSize = minimumClusterSize;\r\n var removeListener;\r\n\r\n function customStyle() {\r\n if (Cesium.defined(removeListener)) {\r\n removeListener();\r\n removeListener = undefined;\r\n } else {\r\n removeListener = dataset.clustering.clusterEvent.addEventListener(\r\n function (clusteredEntities, cluster) {\r\n cluster.label.show = false;\r\n if (!cluster.billboard) cluster.billboard = new BillboardGraphics();\r\n cluster.billboard.show = true;\r\n cluster.billboard.id = cluster.label.id;\r\n cluster.billboard.verticalOrigin = VerticalOrigin.BOTTOM; \r\n cluster.billboard.image = labelCluster.image;\r\n cluster.billboard.scale = labelCluster.scale || 1;\r\n cluster.billboard.heightReference = HeightReference.CLAMP_TO_GROUND\r\n cluster.billboard.eyeOffset = new Cartesian3(0.0, 0.0, -1000.0);\r\n }\r\n );\r\n }\r\n \r\n // force a re-cluster with the new styling\r\n var pixelRange = dataset.clustering.pixelRange;\r\n dataset.clustering.pixelRange = 0;\r\n dataset.clustering.pixelRange = pixelRange;\r\n }\r\n customStyle();\r\n }\r\n }\r\n\r\n function stylePolyline(style, dataset) {\r\n const {color, width, clampToGround, styleExpression} = style;\r\n var style = new CesiumDataSourceStyle(styleExpression);\r\n if (!style.color) style.color = 'rgba'+Color.unpack(color.map((i,idx) => idx === color.length - 1 ? i / 255 : i)).toString();\r\n if (!style.lineWidth) style.lineWidth = width;\r\n if (!style.show) style.show = true;\r\n dataset?.entities?.values.forEach( (entity) => {\r\n if (style.color) entity.polyline.material = style.color.evaluateColor(entity);\r\n if (clampToGround) entity.polyline.clampToGround = clampToGround;\r\n if (style.lineWidth) entity.polyline.width = style.lineWidth.evaluate(entity);\r\n if (style.show) entity.polyline.show = style.show.evaluate(entity);\r\n })\r\n }\r\n\r\n function stylePolygon(style, dataset) {\r\n const {color, heightReference, styleExpression} = style;\r\n var style = new CesiumDataSourceStyle(styleExpression);\r\n if (!style.color) style.color = 'rgba'+Color.unpack(color.map((i,idx) => idx === color.length - 1 ? i / 255 : i)).toString(); \r\n if (!style.show) style.show = true;\r\n dataset?.entities?.values.forEach( (entity) => {\r\n entity.polygon.arcType = ArcType.GEODESIC; \r\n if (style.color) entity.polygon.material = style.color.evaluateColor(entity);\r\n if (heightReference) entity.polygon.heightReference = HeightReference[heightReference];\r\n if (HeightReference[heightReference] === HeightReference.CLAMP_TO_GROUND) entity.polygon.height = undefined;\r\n if (HeightReference[heightReference] === HeightReference.CLAMP_TO_GROUND) entity.polygon.perPositionHeight = undefined;\r\n if (style.show) entity.polygon.show = style.show.evaluate(entity);\r\n })\r\n }\r\n\r\n function styleBillboard(style, dataset) {\r\n let {image, nearFarScalar, heightReference, disableDepthTestDistance, verticalOrigin, position, styleExpression} = style;\r\n var style = new CesiumDataSourceStyle(styleExpression);\r\n if (!style.image) style.image = `'${image}'`;\r\n if (!style.scaleByDistance ) style.scaleByDistance = 'vec4'+Cesium.Cartesian4.unpack(nearFarScalar).toString();\r\n if (!style.disableDepthTestDistance) style.disableDepthTestDistance = disableDepthTestDistance;\r\n if (!style.verticalOrigin) style.verticalOrigin = VerticalOrigin[verticalOrigin];\r\n if (!style.show) style.show = true;\r\n var nearFarScalarArray = [];\r\n dataset?.entities?.values.forEach( (entity) => {\r\n if (!entity.billboard) { entity.billboard = new Cesium.BillboardGraphics(); entity.label = null }\r\n if (style.image) entity.billboard.image = style.image.evaluate(entity);\r\n if (style.scaleByDistance) entity.billboard.scaleByDistance = Cesium.NearFarScalar.unpack(Cesium.Cartesian4.pack(style.scaleByDistance.evaluate(entity),nearFarScalarArray));\r\n if (style.disableDepthTestDistance) entity.billboard.disableDepthTestDistance = style.disableDepthTestDistance.evaluate(entity);\r\n if (verticalOrigin) entity.billboard.verticalOrigin = style.verticalOrigin.evaluate(entity);\r\n if (heightReference) entity.billboard.heightReference = HeightReference[heightReference];\r\n if (position) entity.position = Cartesian3.fromDegreesArrayHeights(position)[0];\r\n if (style.show) entity.billboard.show = style.show.evaluate(entity);\r\n })\r\n }\r\n\r\nexport function getStyle(dataset, viewer) {\r\n var entity = dataset.entities.values[0];\r\n var styleExpression = dataset?._documentPacket?.styleExpression;\r\n if (entity.polygon) {\r\n var colorArray = [];\r\n return { name: dataset.name, style: JSON.stringify({\r\n styleExpression: styleExpression,\r\n name: dataset.name,\r\n type: \"polygon\",\r\n heightReference: heightReferenceLookup[entity.polygon.heightReference.getValue()],\r\n color: Color.pack(entity.polygon.material.color.getValue(),colorArray).map( c => c * 255.0)\r\n })};\r\n }\r\n if (entity.billboard) {\r\n var type = dataset.entities.values.length === 1 ? \"billboard\" : \"billboardCollection\";\r\n let position = entity.position && Cartographic.fromCartesian(entity.position.getValue(viewer.current.clock.currentTime))\r\n var nearFarScalarArray = [];\r\n return { name: dataset.name, style: JSON.stringify({\r\n styleExpression: styleExpression,\r\n name: dataset.name,\r\n type,\r\n image: entity.billboard.image.getValue()._url,\r\n nearFarScalar: NearFarScalar.pack(entity.billboard.scaleByDistance.getValue(),nearFarScalarArray),\r\n heightReference: heightReferenceLookup[entity.billboard.heightReference.getValue()],\r\n disableDepthTestDistance: entity.billboard.disableDepthTestDistance.getValue(),\r\n verticalOrigin: verticalOriginLookup[entity.billboard.verticalOrigin.getValue()],\r\n position: type === \"billboard\" ? [\r\n Math.toDegrees(position.longitude),\r\n Math.toDegrees(position.latitude),\r\n position.height\r\n ] : undefined\r\n })}\r\n }\r\n if (entity.label) {\r\n var type = dataset.entities.values.length === 1 ? \"label\" : \"labelCollection\";\r\n let position = entity.position && Cartographic.fromCartesian(entity.position.getValue(viewer.current.clock.currentTime))\r\n var nearFarScalarArray = [];\r\n var fillColorArray = [];\r\n var outlineColorArray = [];\r\n return { name: dataset.name, style: JSON.stringify({\r\n styleExpression: styleExpression,\r\n name: dataset.name,\r\n type,\r\n heightReference: entity.label.heightReference && heightReferenceLookup[entity.label.heightReference.getValue()],\r\n disableDepthTestDistance: entity.label.disableDepthTestDistance && entity.label.disableDepthTestDistance.getValue(),\r\n text: entity.label.text && type === \"label\" ? entity.label.text.getValue() : undefined,\r\n font: entity.label.font && entity.label.font.getValue(),\r\n fillColor: entity.label.fillColor && Color.pack(entity.label.fillColor.getValue(),fillColorArray).map( c => c * 255.0),\r\n outlineColor: entity.label.outlineColor && Color.pack(entity.label.outlineColor.getValue(),outlineColorArray).map( c => c * 255.0),\r\n outlineWidth: entity.label.outlineWidth && entity.label.outlineWidth.getValue(),\r\n style: entity.label.style && labelStyleLookup[entity.label.style.getValue()],\r\n horizontalOrigin: entity.label.horizontalOrigin && horizontalOriginLookup[entity.label.horizontalOrigin.getValue()],\r\n disableDepthTestDistance: entity.label.disableDepthTestDistance && entity.label.disableDepthTestDistance.getValue(),\r\n\t\t\t nearFarScalar: entity.label.scaleByDistance && NearFarScalar.pack(entity.label.scaleByDistance.getValue(),nearFarScalarArray),\r\n verticalOrigin: entity.label.verticalOrigin && verticalOriginLookup[entity.label.verticalOrigin.getValue()],\r\n position: position && type === \"label\" ? [\r\n Math.toDegrees(position.longitude),\r\n Math.toDegrees(position.latitude),\r\n position.height\r\n ] : undefined\r\n })}\r\n }\r\n if (entity.polyline) {\r\n var colorArray = [];\r\n return { name: dataset.name, style: JSON.stringify({\r\n styleExpression: styleExpression,\r\n name: dataset.name,\r\n type: \"polyline\",\r\n clampToGround: entity.polyline.clampToGround.getValue(),\r\n color: Color.pack(entity.polyline.material.color.getValue(),colorArray).map( c => c * 255.0),\r\n width: entity.polyline.width.getValue()\r\n })};\r\n }\r\n }\r\n\r\nexport function saveCZML(vis,filename,viewer) {\r\n var dataset = viewer.current.dataSources.getByName(vis.Name)[0];\r\n console.log(dataset);\r\n var CZML = [\r\n {\r\n id: 'document',\r\n name: vis.Name,\r\n version: \"1.0\",\r\n styleExpression: dataset?._documentPacket?.styleExpression\r\n }\r\n ];\r\n dataset?.entities?.values.forEach( (entity) => {\r\n let position = entity.position && Cartographic.fromCartesian(entity.position.getValue(viewer.current.clock.currentTime))\r\n var czmlItem = {\r\n id: entity.id,\r\n name: entity.name,\r\n description: entity.description.getValue(),\r\n properties: entity.properties && entity.properties.getValue(viewer.current.clock.currentTime), // czml needs entity.properties.geojsonProps.getValue()\r\n position: position && { cartographicDegrees: [Math.toDegrees(position.longitude),Math.toDegrees(position.latitude),position.height]},\r\n };\r\n if (entity.polygon) {\r\n czmlItem.polygon = convertPolygon(entity.polygon);\r\n }\r\n if (entity.billboard) {\r\n czmlItem.billboard = convertBillboard(entity.billboard);\r\n }\r\n if (entity.polyline) {\r\n czmlItem.polyline = convertPolyline(entity.polyline);\r\n }\r\n if (entity.label) {\r\n czmlItem.label = convertLabel(entity.label);\r\n }\r\n CZML.push(czmlItem);\r\n });\r\n console.log(CZML);\r\n console.log(JSON.stringify(CZML,null,\"\\t\"));\r\n var blob = new Blob([JSON.stringify(CZML,null,\"\\t\")], {type: \"application/json;charset=utf-8\"});\r\n FS.saveAs(blob, filename);\r\n }\r\n\r\n function convertLabel(labelGraphics) {\r\n let nearFarScalarArray = [];\r\n let outlineColorArray = [];\r\n let fillColorArray = [];\r\n return {\r\n heightReference: labelGraphics.heightReference && heightReferenceLookup[labelGraphics.heightReference.getValue()],\r\n scaleByDistance: labelGraphics.scaleByDistance && { nearFarScalar: NearFarScalar.pack(labelGraphics.scaleByDistance.getValue(), nearFarScalarArray) },\r\n disableDepthTestDistance: labelGraphics.disableDepthTestDistance && labelGraphics.disableDepthTestDistance.getValue(),\r\n horizontalOrigin: labelGraphics.horizontalOrigin && horizontalOriginLookup[labelGraphics.horizontalOrigin.getValue()],\r\n verticalOrigin: labelGraphics.verticalOrigin && verticalOriginLookup[labelGraphics.verticalOrigin.getValue()],\r\n outlineColor: labelGraphics.outlineColor && {\r\n rgba: Color.pack(labelGraphics.outlineColor.getValue(),outlineColorArray).map(c => c * 255.0)\r\n },\r\n fillColor: labelGraphics.fillColor && {\r\n rgba: Color.pack(labelGraphics.fillColor.getValue(),fillColorArray).map(c => c * 255.0)\r\n },\r\n text: labelGraphics.text && labelGraphics.text.getValue(),\r\n font: labelGraphics.font && labelGraphics.font.getValue(),\r\n outlineWidth: labelGraphics.outlineWidth && labelGraphics.outlineWidth.getValue(),\r\n style: labelGraphics.style && labelStyleLookup[labelGraphics.style.getValue()],\r\n show: labelGraphics.show.getValue()\r\n }\r\n }\r\n\r\n function convertPolyline(polylineGraphics) {\r\n let colorArray = [];\r\n var positions = { \r\n cartographicDegrees: polylineGraphics.positions.getValue().map( (p) => {\r\n let carto = Cartographic.fromCartesian(p);\r\n return [Math.toDegrees(carto.longitude),Math.toDegrees(carto.latitude),carto.height]\r\n }).flat(Infinity)\r\n };\r\n return {\r\n positions: positions,\r\n clampToGround: polylineGraphics.clampToGround.getValue(),\r\n width: polylineGraphics.width.getValue(),\r\n material : {\r\n solidColor : {\r\n color : {\r\n rgba: Color.pack(polylineGraphics.material.color.getValue(),colorArray).map(c => c * 255.0)\r\n }\r\n }\r\n },\r\n show: polylineGraphics.show.getValue()\r\n };\r\n }\r\n\r\n function convertBillboard(billboardGraphics) {\r\n let nearFarScalarArray = [];\r\n\r\n return {\r\n heightReference: heightReferenceLookup[billboardGraphics.heightReference.getValue()],\r\n image: billboardGraphics.image.getValue(),\r\n scaleByDistance: { nearFarScalar: NearFarScalar.pack(billboardGraphics.scaleByDistance.getValue(), nearFarScalarArray) },\r\n disableDepthTestDistance: billboardGraphics.disableDepthTestDistance && billboardGraphics.disableDepthTestDistance.getValue(),\r\n verticalOrigin: verticalOriginLookup[billboardGraphics.verticalOrigin.getValue()],\r\n show: billboardGraphics.show.getValue()\r\n }\r\n }\r\n\r\n function convertPolygon(polygonGraphics){\r\n let colorArray = [];\r\n var hierarchy = polygonGraphics.hierarchy.getValue();\r\n var positions = { \r\n cartographicDegrees: hierarchy.positions.map( (p) => {\r\n let carto = Cartographic.fromCartesian(p);\r\n return [Math.toDegrees(carto.longitude),Math.toDegrees(carto.latitude),carto.height]\r\n }).flat(Infinity)\r\n };\r\n var holes = { cartographicDegrees: hierarchy.holes.map( (p) => {\r\n return p.positions.map( (pos) => {\r\n let carto = Cartographic.fromCartesian(pos);\r\n return [Math.toDegrees(carto.longitude),Math.toDegrees(carto.latitude),carto.height]\r\n }).flat(Infinity);\r\n }) };\r\n return {\r\n positions: positions,\r\n heightReference: heightReferenceLookup[polygonGraphics.heightReference.getValue()],\r\n holes: holes,\r\n material : {\r\n solidColor : {\r\n color : {\r\n rgba: Color.pack(polygonGraphics.material.color.getValue(),colorArray).map(c => c * 255.0)\r\n }\r\n }\r\n },\r\n show: polygonGraphics.show.getValue()\r\n };\r\n }","/* ================================================================ */\r\n// CESIUM CONTAINER | CesiumContainer.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useEffect, useRef, useState, useImperativeHandle, forwardRef, useCallback} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {connect, useDispatch} from 'react-redux';\r\nimport {bindActionCreators} from 'redux';\r\nimport * as Cesium from 'cesium';\r\nimport useReactRouter from 'use-react-router';\r\nimport { isNullOrUndefined } from 'util';\r\n// Actions\r\nimport { updateMapViewState, updateMapStateById } from '../../actions/Map';\r\nimport { fetchStates } from '../../actions/Data/Mapping';\r\nimport { fetchPanels, updateDodgyVislayers } from '../../actions/Data/Content';\r\n// Selectors\r\nimport {getStatesByHash, getLoadingStatus, getDefaultState} from '../../selectors/Data';\r\nimport {getViewState, getMapLoadingStatus, getActiveLayers} from '../../selectors/Map';\r\n//import 'cesium/Build/Cesium/Widgets/widgets.css';\r\nimport makeStyles from '@material-ui/core/styles/makeStyles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dashboard from './Dashboard';\r\n//import CzmlDataSource from './CZMLDataSource';\r\nimport { styleVisLayer, getStyle, setDefaultStyle, saveCZML } from './StyleUtils';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'relative',\r\n backgroundColor: theme.palette.secondary.main,\r\n width: '100%',\r\n height: '100%',\r\n margin: 0,\r\n padding: 0,\r\n overflow: 'hidden'\r\n },\r\n loadingContainer: {\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n },\r\n button: {\r\n position: 'absolute'\r\n },\r\n credits: {\r\n position: 'absolute',\r\n right: 0,\r\n bottom: 0,\r\n padding: '1em',\r\n width: '15vw',\r\n height: '3em',\r\n display: 'flex',\r\n zIndex: 1,\r\n justifyContent: 'space-between',\r\n '& img': {\r\n objectFit: 'contain',\r\n width: '50%'\r\n }\r\n }\r\n}));\r\nconst home = {\r\n \"destination\": {\r\n \"x\": -5002965.10882716,\r\n \"y\": 2519368.2360078953,\r\n \"z\": -3083740.637290964\r\n },\r\n \"duration\": 10,\r\n \"orientation\": {\r\n \"heading\": 1.1542992823390623,\r\n \"pitch\": -0.5273718484770713,\r\n \"roll\": 6.280199761841466\r\n }\r\n};\r\nconst flyto = {\r\n \"destination\": {\r\n \"x\": -5005722.567225711,\r\n \"y\": 2521175.9809504044,\r\n \"z\": -3040682.6595210237\r\n },\r\n \"duration\": 40,\r\n \"orientation\": {\r\n \"heading\": 2.26209360947846,\r\n \"pitch\": -0.6571416700228601,\r\n \"roll\": 6.280436854687304\r\n }\r\n};\r\n\r\n/* ========================================== */\r\n/**\r\n * Cesium Container\r\n * ----------------\r\n * Container for Cesium component\r\n * linked to the MapReducer\r\n *\r\n * @param {object} props component props\r\n */\r\nconst CesiumContainer = (props) => {\r\n // THIS CONTAINER SHOULD FETCH CESIUM CONFIG, ION TOKEN,\r\n // AND MAP STATES\r\n const {\r\n viewState\r\n } = props;\r\n const classes = useStyles();\r\n const [datasets, setDatasets] = useState([]);\r\n const [visLayers, setVisLayers] = useState([]);\r\n const [sortedArray, setSortedArray] = useState([]);\r\n const childRef = useRef();\r\n const dispatch = useDispatch();\r\n const {match} = useReactRouter();\r\n const [localViewState, setViewState] = useState([]);\r\n\r\n useEffect(() => {\r\n if (match.params.category && match.params.category!=\"admin\" && props.viewState.visLayers && props.viewState.visLayers !== localViewState) {\r\n setViewState(props.viewState.visLayers);\r\n var vl = props.viewState.visLayers.map( (Id) => {\r\n var split = Id.split('/');\r\n var Name = split[split.length-1]; \r\n return { style: \"\", Name, Filename: Name, Id, Display: true, Visible: true, type: \"CZML\" }; \r\n });\r\n //setSortedArray(vl.map( s => s.Name).reverse());\r\n setVisLayers(vl); \r\n }\r\n else if (props.viewState.visLayers && props.viewState.visLayers !== localViewState) {\r\n setViewState(props.viewState.visLayers);\r\n var vl = visLayers.map( (v) => {\r\n if (props.viewState.visLayers.includes(v.Id)) \r\n v.Visible = true;\r\n else\r\n v.Visible = false;\r\n return v;\r\n })\r\n vl.sort( (a,b) => {\r\n var aIndex = props.viewState.visLayers.findIndex( f => f === a.Id);\r\n var bIndex = props.viewState.visLayers.findIndex( f => f === b.Id);\r\n if (aIndex !== -1 && bIndex !== -1)\r\n return aIndex - bIndex;\r\n else if (aIndex !== -1)\r\n return -1;\r\n else if (bIndex !== -1)\r\n return 1;\r\n else\r\n return 0;\r\n })\r\n //handleSorted(vl);\r\n //setSortedArray(vl.map( s => s.Name).reverse());\r\n setVisLayers(vl);\r\n }\r\n }, [props.viewState, visLayers])\r\n\r\n useEffect(() => {\r\n dispatch(updateDodgyVislayers(visLayers));\r\n }, [visLayers])\r\n\r\n useEffect(()=>{\r\n //console.debug(`${CesiumContainer.displayName} | `, 'componentDidUpdate - ', 'layerData:', props.layerData);\r\n if(!props.isLoading) {\r\n // > Load State from DB (if not already loaded)\r\n //this.props.fetchStates([defaultState]);\r\n // > Apply state to map\r\n //const defaultState = this.props.states.byHash//byId.find(state=>state.id === defaultStateID);\r\n const defaultState = props.defaultState || 'default';\r\n props.updateMapStateById(defaultState);\r\n }\r\n }, [props.isLoading]);\r\n\r\n function triggerFlyTo() {\r\n setViewState(flyto);\r\n }\r\n\r\n function triggerHome() {\r\n handleViewState(home);\r\n }\r\n\r\n /* ========================================== */\r\n /**\r\n * Handle View State\r\n * -----------------\r\n * Sends view state update to MapReducer\r\n *\r\n * @param {object} viewState current view state\r\n */\r\n /* ========================================== */\r\n function handleViewState(viewState) {\r\n if(props.updateMapViewState) {\r\n //console.debug(`${CesiumComponent.displayName} | `, 'handleViewState -', 'viewState:', viewState);\r\n props.updateMapViewState(viewState);\r\n }\r\n }\r\n\r\n function handleLoadDataset(dataset) {\r\n console.log(\"LOADING:\", dataset);\r\n var Filename = dataset.Name.split('.')[0]+\".czml\";\r\n setVisLayers([{...dataset, Filename, Visible: true, type: 'data'}, ...visLayers ]);\r\n }\r\n\r\n function handleSave(id,filename) {\r\n var vis = visLayers.find( v => v.Id === id);\r\n childRef.current.saveCZML(vis,filename);\r\n }\r\n\r\n function handleStyle(id, style) {\r\n var vis = visLayers.find( v=> v.Id === id);\r\n var styleJSON = JSON.parse(style);\r\n if (vis) {\r\n childRef.current.styleVisLayer({visLayerName: vis.Name, styleJSON});\r\n vis.Name = styleJSON.name;\r\n setVisLayers(\r\n visLayers.map((v) => {\r\n return v.Id === id ? vis : v\r\n })\r\n )\r\n }\r\n\r\n }\r\n\r\n function handleLayerToggle(id, isChecked) {\r\n setVisLayers(visLayers.map( v => {\r\n if (v.Id === id)\r\n v.Visible = !v.Visible;\r\n return v;\r\n }));\r\n }\r\n\r\n function handleDeleteDataset(id) {\r\n setDatasets(datasets.filter(v => v.Id !== id));\r\n }\r\n\r\n function handleDeleteVisLayer(id) {\r\n setVisLayers(visLayers.filter(v => v.Id !== id));\r\n }\r\n\r\n function handleSorted(sortedArr) {\r\n //setVisLayers(sortedArr);\r\n setSortedArray(sortedArr.map( s => s.Name).reverse());\r\n setVisLayers(sortedArr);\r\n }\r\n\r\n function handleLayersUpdated(lyrs) {\r\n if (lyrs !== visLayers)\r\n setVisLayers(lyrs);\r\n }\r\n\r\n useEffect( () => {\r\n var geojsonUrl = 'https://api.myglobe.app/rousuploads?path=geojson';\r\n var czmlUrl = 'https://api.myglobe.app/rousuploads?path=czml';\r\n fetch(geojsonUrl) // Call the fetch function passing the url of the API as a parameter\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n var datasetArray = data.map( (Id) => {\r\n var split = Id.split('/');\r\n var Name = split[split.length-1];\r\n var Title = Name.split('.')[0];\r\n var Id = 'https://rous.myglobe.app'+Id;\r\n return { Title, Name, Id, Display: true };\r\n });\r\n setDatasets(datasetArray);\r\n })\r\n .catch(function(e) {\r\n //TODO #benjob\r\n console.log(\"ERROR retrieving datasets:\", e);\r\n });\r\n const {category} = match.params; \r\n if (category==\"admin\") {\r\n fetch(czmlUrl) // Call the fetch function passing the url of the API as a parameter\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n var visArray = data.map( (Id) => {\r\n var split = Id.split('/');\r\n var Name = split[split.length-1];\r\n var Title = Name.split('.')[0];\r\n var Id = 'https://myglobe.app'+Id;\r\n return { style: \"\", Name, Filename: Name, Id, Display: true, Visible: false, type: \"CZML\" }; \r\n });\r\n dispatch(updateDodgyVislayers(visArray));\r\n setSortedArray(visArray.map( s => s.Name).reverse());\r\n setVisLayers(visArray);\r\n })\r\n .catch(function(e) {\r\n //TODO #benjob\r\n console.log(\"ERROR retrieving datasets:\", e);\r\n });\r\n }\r\n //setVisLayers([{style: \"\", Name: \"Pin Template\", Id: \"/assets/czml/pin_template.czml\", Display: true, Visible: true, type: \"CZML\"}]);\r\n \r\n //props.updateMapViewState(home);\r\n }, [])\r\n\r\n return (\r\n
\r\n {\r\n //isNullOrUndefined(match.params.category) && \r\n match.params.category==\"admin\"&&\r\n \r\n } \r\n \r\n {\r\n //\r\n //\r\n }\r\n
\r\n );\r\n};\r\nCesiumContainer.displayName = 'CesiumContainer';\r\nconst CesiumComponent = forwardRef((props, ref) => {\r\n const classes = useStyles();\r\n const {options, onViewUpdate, onLayersUpdated} = props;\r\n const cesiumContainer = useRef(null);\r\n const viewer = useRef(null);\r\n const [viewState, setViewState] = useState(props.viewState);\r\n const [visLayers,setVisLayers] = useState(props.visLayers);\r\n const previousVisLayers = usePrevious(visLayers);\r\n const cancelList = useRef([]);\r\n const {match} = useReactRouter();\r\n\r\n function usePrevious(value) {\r\n // The ref object is a generic container whose current property is mutable ...\r\n // ... and can hold any value, similar to an instance property on a class\r\n const ref = useRef();\r\n \r\n // Store current value in ref\r\n useEffect(() => {\r\n ref.current = value;\r\n }, [value]); // Only re-run if value changes\r\n \r\n // Return previous value (happens before update in useEffect above)\r\n return ref.current;\r\n }\r\n\r\n useImperativeHandle(ref, () => ({\r\n\r\n saveCZML(id,filename) {\r\n saveCZML(id,filename,viewer);\r\n },\r\n styleVisLayer(styles) {\r\n styleVisLayer(styles,viewer);\r\n }\r\n\r\n }));\r\n /* ========================================== */\r\n /**\r\n * Effect: Init Cesium Viewer\r\n * --------------------------\r\n * Setup Cesium settings and viewer\r\n */\r\n useEffect(()=>{\r\n if(cesiumContainer.current) {\r\n //Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjNGQ2ODIxYS03ZDdkLTRiZTctYmQwOC0yMDZlNzc2ODUxODEiLCJpZCI6Mjc4LCJpYXQiOjE1MjUyMTYyNzJ9.KcxEOT5W2jacewSbDmtAc8q6_3IagO5-XZYUTANDwMI';\r\n const newViewer = new Cesium.Viewer(cesiumContainer.current, {\r\n ...options\r\n });\r\n\r\n /*const imageryProvider = new Cesium.UrlTemplateImageryProvider({\r\n url: \"http://131.181.47.39:8080/slippy/aerial50cm/{z}/{x}/{y}.png\"\r\n });/*\r\n const WMSImageryProvider = new Cesium.WebMapServiceImageryProvider({\r\n url : 'https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Base_Map/MapServer/WMSServer?version=1.3.0&service=WMS',\r\n layers : '0',\r\n tileHeight: 256,\r\n tileWidth: 256,\r\n maximumLevel: 18,\r\n parameters : {\r\n transparent : true,\r\n tiled : true,\r\n format : 'image/png'\r\n }\r\n });\r\n //newViewer.scene.imageryLayers.add(new Cesium.ImageryLayer(WMSImageryProvider, { minimumTerrainLevel: 0 }));\r\n //newViewer.scene.imageryLayers.addImageryProvider(WMSImageryProvider);*/\r\n var WMTSImagery = new Cesium.WebMapTileServiceImageryProvider({\r\n url : 'https://maps1.six.nsw.gov.au/arcgis/rest/services/sixmaps/LPI_Imagery_Best/MapServer/WMTS/',\r\n layer : 'Best_WebM_Footprint',\r\n style : 'default',\r\n format : 'image/png',\r\n parameters: {\r\n transparent : 'true',\r\n },\r\n tileMatrixSetID : 'default028mm',\r\n // tileMatrixLabels : ['default028mm:0', 'default028mm:1', 'default028mm:2' ...],\r\n //maximumLevel: 19,\r\n credit : new Cesium.Credit('DFSI Spatial Services NSW')\r\n });\r\n \r\n var layer = new Cesium.ImageryLayer(WMTSImagery);//,{minimumTerrainLevel:11});\r\n newViewer.scene.imageryLayers.add(layer);\r\n layer.colorToAlpha = Cesium.Color.fromBytes(255,255,255);\r\n layer.colorToAlphaThreshold = 0.05;\r\n //newViewer.scene.imageryLayers.add(new Cesium.ImageryLayer(imageryProvider,{maximumTerrainLevel:12}));\r\n\r\n if (match.params.category !== 'admin') {\r\n newViewer.selectedEntityChanged.addEventListener((entity) =>{\r\n newViewer.selectedEntity = undefined;\r\n });\r\n }\r\n\r\n newViewer.scene.postProcessStages.fxaa.enabled = true;\r\n //newViewer.scene.screenSpaceCameraController._minimumZoomRate = 200;\r\n //newViewer.scene.screenSpaceCameraController._maximumZoomRate = 65000;\r\n newViewer.camera.frustum.near = 0.01;\r\n //newViewer.scene.globe.preloadSiblings = true;\r\n newViewer.scene.globe.preloadAncestors = true;\r\n //newViewer.scene.globe.tileCacheSize = 100000;\r\n newViewer.clock.currentTime = Cesium.JulianDate.fromDate(new Date(2020,7,3,12,0,0,0));\r\n newViewer.clock.multiplier = 1;\r\n newViewer.scene.light = new Cesium.SunLight({color: Cesium.Color.fromBytes(203, 212, 180), intensity: 5.0});\r\n\r\n newViewer.scene.globe.enableLighting = true;\r\n newViewer.scene.globe.dynamicAtmosphereLighting = true;\r\n newViewer.scene.globe.dynamicAtmosphereLightingFromSun = true;\r\n newViewer.scene.globe.maximumScreenSpaceError = 2.0;\r\n newViewer.scene.logarithmicDepthBuffer = false;\r\n newViewer.scene.globe.depthTestAgainstTerrain = false;\r\n\r\n newViewer.canvas.style.imageRendering = \"auto\";\r\n newViewer.camera.setView(props.viewState);\r\n\r\n newViewer.camera.percentageChanged = 0.01;\r\n newViewer.camera.changed.addEventListener(handleCameraChange);\r\n newViewer.camera.changed.addEventListener(function() {\r\n if (viewer.current.camera._suspendTerrainAdjustment && viewer.current.scene.mode === Cesium.SceneMode.SCENE3D) {\r\n viewer.current.camera._suspendTerrainAdjustment = false;\r\n viewer.current.camera._adjustHeightForTerrain();\r\n }\r\n });\r\n newViewer.screenSpaceEventHandler.setInputAction((e) => {\r\n logCamera();\r\n }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);\r\n\r\n var eventHelper = new Cesium.EventHelper();\r\n\r\n eventHelper.add(WMTSImagery.errorEvent, (err) => {\r\n console.log(err);\r\n if (err.error.statusCode === 500) {\r\n viewer.current.scene.globe.preloadAncestores = false;\r\n viewer.current.scene.imageryLayers.remove(layer);\r\n props.dispatch({type: 'UPDATE_MAP_TILES_LOADED'});\r\n console.log(\"ERROR LOADING HIGH RESOLUTION IMAGERY - SHOW GLOBE\");\r\n eventHelper.removeAll();\r\n }\r\n })\r\n\r\n eventHelper.add(newViewer.scene.globe.tileLoadProgressEvent, (data) => {\r\n if (data === 0) {\r\n //done loading data\r\n //viewer.current.scene.globe.preloadSiblings = false;\r\n viewer.current.scene.globe.preloadAncestores = false;\r\n props.dispatch({type: 'UPDATE_MAP_TILES_LOADED'});\r\n console.log(\"FINISHED LOADING TILES\");\r\n eventHelper.removeAll();\r\n }\r\n });\r\n\r\n function stopFlyTo() {\r\n viewer.current.scene.camera.cancelFlight();\r\n }\r\n\r\n newViewer.screenSpaceEventHandler.setInputAction(stopFlyTo, Cesium.ScreenSpaceEventType.LEFT_DOWN);\r\n newViewer.screenSpaceEventHandler.setInputAction(stopFlyTo, Cesium.ScreenSpaceEventType.RIGHT_DOWN);\r\n newViewer.screenSpaceEventHandler.setInputAction(stopFlyTo, Cesium.ScreenSpaceEventType.MIDDLE_DOWN);\r\n newViewer.scene.frameState.creditDisplay.addDefaultCredit(new Cesium.Credit(' '),true);\r\n newViewer.scene.frameState.creditDisplay.addDefaultCredit(new Cesium.Credit('ROUS COUNTY COUNCIL 2020 © ALL RIGHTS RESERVED'),true);\r\n newViewer.scene.frameState.creditDisplay.addDefaultCredit(new Cesium.Credit('TERMS OF USE'),true);\r\n newViewer.scene.frameState.creditDisplay.addDefaultCredit(new Cesium.Credit('PRIVACY POLICY'),true);\r\n viewer.current = newViewer;\r\n }\r\n }, []); \r\n /* ========================================== */\r\n /**\r\n * Effect: Map State Update\r\n * ------------------------\r\n * Handles incoming view state prop transitions\r\n * and layer updates\r\n */\r\n useEffect(()=>{\r\n /* ======================== */\r\n // COMPONENT UPDATE\r\n /* ======================== */\r\n if(props.viewState && (\r\n props.viewState?.destination?.x !== viewState.destination?.x\r\n || props.viewState?.destination?.y !== viewState.destination?.y\r\n || props.viewState?.destination?.z !== viewState.destination?.z\r\n || props.viewState?.orientation?.heading !== viewState.orientation?.heading\r\n || props.viewState?.orientation?.pitch !== viewState.orientation?.pitch\r\n || props.viewState?.orientation?.roll !== viewState.orientation?.roll\r\n || props.viewState?.orientation?.direction !== viewState.orientation?.direction)\r\n ) {\r\n //console.debug(`${CesiumComponent.displayName} | `, 'Update(viewState) -', 'props.viewState (new):', props.viewState, 'viewState (old):', viewState);\r\n\r\n const newView = {\r\n ...viewState,\r\n ...props.viewState,\r\n //... (orientation && {orientation})\r\n };\r\n\r\n setViewState(newView);\r\n\r\n if(props.viewState.duration)\r\n viewer.current.camera.flyTo({...newView,\r\n maximumHeight: 500\r\n });\r\n else\r\n viewer.current.camera.setView(newView);\r\n }\r\n }, [props.viewState]);\r\n\r\n function sortDatasets(sorted) {\r\n //console.log(\"SORTED:\", sorted);\r\n for (var i = 0; i < sorted.length; i++) {\r\n var ds = viewer.current.dataSources.getByName(sorted[i])[0];\r\n if (!ds)\r\n break;\r\n var dsIdx = viewer.current.dataSources.indexOf(ds);\r\n while (i !== dsIdx) {\r\n if (i > dsIdx)\r\n viewer.current.dataSources.raise(ds);\r\n else\r\n viewer.current.dataSources.lower(ds);\r\n dsIdx = viewer.current.dataSources.indexOf(ds);\r\n }\r\n //console.log(ds,dsIdx,sorted[i],i); \r\n }\r\n //console.log(viewer.current.dataSources);\r\n }\r\n\r\n useEffect( () =>{\r\n if (viewer.current && props.sortedArray.length === viewer.current.dataSources.length)\r\n sortDatasets(props.sortedArray); \r\n },[props.sortedArray])\r\n\r\n /* ========================================== */\r\n /**\r\n * Effect: Vis Layer Update\r\n * ------------------------\r\n * Handles incoming view state prop transitions\r\n * and layer updates\r\n */\r\n useEffect(()=>{ \r\n \r\n if(viewer.current && props.visLayers !== visLayers) {\r\n var promises = [];\r\n setVisLayers(props.visLayers);\r\n // Unload datasets not in new prop\r\n var loadedVisLayers = visLayers.map( v => v.Id);\r\n var newVisLayers = props.visLayers.map( v => v.Id);\r\n visLayers.filter(visLayer=>!newVisLayers.includes(visLayer.Id)).forEach(visLayer=>{\r\n var lyr = viewer.current.dataSources.getByName(visLayer.Name)[0];\r\n if (lyr)\r\n viewer.current.dataSources.remove(lyr);\r\n else\r\n cancelList.current = [...cancelList.current, visLayer.Name];\r\n });\r\n // Load datasets not in current state\r\n \r\n props.visLayers.filter(visLayer=>!loadedVisLayers.includes(visLayer.Id)).forEach(visLayer=>{\r\n if (visLayer.type===\"CZML\") {\r\n promises.push(Cesium.CzmlDataSource.load(visLayer.Id).then((lyr) => {\r\n lyr.entities.values.forEach( entity => \r\n entity.getProperty = function(name) {\r\n return entity.properties.getValue(viewer.current.clock.currentTime)[name];\r\n })\r\n lyr.name = visLayer.Name;\r\n var styleDetails = getStyle(lyr,viewer);\r\n if (styleDetails)\r\n {\r\n //visLayer.Name = styleDetails.name;\r\n visLayer.style = styleDetails.style;\r\n }\r\n //if (visLayer.Visible)\r\n // lyr.show = true;\r\n //else\r\n lyr.show = false;\r\n viewer.current.dataSources.add(lyr);\r\n return lyr;\r\n }));\r\n\r\n } else {\r\n promises.push(Cesium.GeoJsonDataSource.load(visLayer.Id).then((lyr) => {\r\n lyr.entities.values.forEach( entity => \r\n entity.getProperty = function(name) {\r\n return entity.properties.getValue(viewer.current.clock.currentTime)[name];\r\n })\r\n visLayer.Name = lyr.name;\r\n visLayer.style = setDefaultStyle(lyr);\r\n styleVisLayer({visLayerName: visLayer.Name, styleJSON: JSON.parse(visLayer.style)},viewer,lyr);\r\n viewer.current.dataSources.add(lyr);\r\n return lyr;\r\n }));\r\n }\r\n });\r\n evaluatePromises(promises);\r\n }\r\n }, [props.visLayers]);\r\n\r\n async function evaluatePromises(promises) {\r\n var data = await Promise.all(promises);\r\n \r\n data = data.filter( (d) => {\r\n if (cancelList.current.includes(d.name)) {\r\n if (viewer.current.dataSources.contains(d))\r\n viewer.current.dataSources.remove(d);\r\n cancelList.current = cancelList.current.filter( f => f !== d.name);\r\n return false;\r\n }\r\n return true;\r\n })\r\n sortDatasets(props.visLayers.map(m => m.Name).reverse());\r\n var visLayers = props.visLayers.map( m => {\r\n if (!m.Visible)\r\n {\r\n var dataSource = viewer.current.dataSources.getByName(m.Name);\r\n if (dataSource.length > 0)\r\n dataSource[0].show = false;\r\n }\r\n else\r\n {\r\n var dataSource = viewer.current.dataSources.getByName(m.Name);\r\n if (dataSource.length > 0)\r\n dataSource[0].show = true;\r\n }\r\n return m;\r\n })\r\n //setVisLayers(visLayers); \r\n //onLayersUpdated && onLayersUpdated(visLayers);\r\n }\r\n\r\n /* ========================================== */\r\n /**\r\n * Effect: Map State Update\r\n * ------------------------\r\n * Handles incoming view state prop transitions\r\n * and layer updates\r\n */\r\n\r\n function handleCameraChange(event) {\r\n /* \r\n if(viewer.current.camera.position.x > -4000000) viewer.current.camera.position.x = -4000000;\r\n else if(viewer.current.camera.position.x < -6500000) viewer.current.camera.position.x = -6500000;\r\n else if(viewer.current.camera.position.y < 2500000) viewer.current.camera.position.y = 2500000;\r\n if(viewer.current.camera.position.y > 3000000) viewer.current.camera.position.y = 3000000;\r\n \r\n else if(viewer.current.camera.position.z > -3000000) viewer.current.camera.position.z = -3000000;\r\n if(viewer.current.camera.position.z < -6000000) viewer.current.camera.position.z = -6000000;\r\n\r\n if(viewer.current.camera.positionCartographic.height < 250) {\r\n const newDest = Cesium.Cartesian3.fromRadians(\r\n viewer.current.camera.positionCartographic.longitude,\r\n viewer.current.camera.positionCartographic.latitude,\r\n 250\r\n );\r\n viewer.current.camera.position = newDest;\r\n }*/\r\n\r\n const currentView = {\r\n destination: {\r\n x: viewer.current.camera.position.x,\r\n y: viewer.current.camera.position.y,\r\n z: viewer.current.camera.position.z\r\n },\r\n orientation: {\r\n heading: viewer.current.camera.heading,\r\n pitch: viewer.current.camera.pitch,\r\n roll: viewer.current.camera.roll\r\n }\r\n }; \r\n //console.debug(`${CesiumComponent.displayName} | `, 'handleCameraChange -', 'currentView:', currentView);\r\n setViewState(currentView);\r\n onViewUpdate && onViewUpdate(currentView);\r\n }\r\n\r\n function logCamera() {\r\n console.log(JSON.stringify({\r\n destination: Cesium.Cartographic.toCartesian(viewer.current.camera.positionCartographic),\r\n duration: 10,\r\n orientation: {\r\n heading: viewer.current.camera.heading,\r\n pitch: viewer.current.camera.pitch,\r\n roll: viewer.current.camera.roll\r\n }\r\n },null,'\\t'));\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \"ROUS\r\n \"Future\r\n
\r\n
\r\n \r\n );\r\n});\r\n\r\nCesiumComponent.propTypes = {\r\n visLayers: PropTypes.arrayOf(PropTypes.object),\r\n options: PropTypes.object,\r\n onViewUpdate: PropTypes.func\r\n};\r\nCesiumComponent.defaultProps = {\r\n options: {\r\n fullscreenElement: 'cesiumContainer',\r\n animation: false,\r\n baseLayerPicker: false,\r\n fullscreenButton: false,\r\n geocoder: false,\r\n homeButton: false,\r\n imageryProvider:new Cesium.MapboxImageryProvider({\r\n mapId: 'mapbox.satellite',\r\n accessToken: 'pk.eyJ1IjoiaWZldmlzZXIiLCJhIjoiY2tjZWFxbm16MDM5bjJ3bWdwOWttcWl3YSJ9.87MELnyNMU8ew9NLh-swwQ'\r\n }),\r\n infoBox: true,\r\n sceneModePicker: false,\r\n scene3DOnly: true,\r\n selectionIndicator: false,\r\n timeline: false,\r\n navigationHelpButton: false,\r\n navigationInstructionsInitiallyVisible: false,\r\n projectionPicker: false,\r\n fullscreen: true,\r\n resolutionScale: 1.0,//window.devicePixelRatio,\r\n shadows: false,\r\n terrainExaggeration: 1,\r\n terrainProvider: Cesium.createWorldTerrain({\r\n requestVertexNormals: true,\r\n requestWaterMask: true\r\n }),\r\n terrainShadows: Cesium.ShadowMode.ENABLED,\r\n useBrowserRecommendedResolution: false,\r\n //useDefaultRenderLoop: false,\r\n contextOptions:{\r\n requestWebgl2: false,\r\n webgl: {\r\n alpha: false,\r\n antialias: true,\r\n preserveDrawingBuffer: false,\r\n failIfMajorPerformanceCaveat: false,\r\n depth: true,\r\n stencil: true\r\n },\r\n },\r\n }\r\n};\r\n\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = store => {\r\n const getAllLoadingStatuses = (store) => {return getLoadingStatus(store, 'globe') || getMapLoadingStatus(store, 'map');};\r\n return {\r\n defaultState: getDefaultState(store),\r\n viewState: getViewState(store),\r\n\r\n layerData: getActiveLayers(store),\r\n layers: store.Map.layers,\r\n\r\n states: getStatesByHash(store),\r\n isLoading: getAllLoadingStatuses(store)\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({updateMapViewState, updateMapStateById, fetchPanels, fetchStates, dispatch}), dispatch);\r\n};\r\nCesiumComponent.displayName = 'Cesium';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CesiumContainer);","/* ================================================================ */\r\n// MAP CONTAINER | Map.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {Component} from 'react';\r\nimport {connect} from 'react-redux';\r\nimport {bindActionCreators} from 'redux';\r\nimport PropTypes from 'prop-types';\r\n// Styles\r\nimport 'mapbox-gl/dist/mapbox-gl.css';\r\n// Material UI\r\nimport withStyles from '@material-ui/styles/withStyles';\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\n// Actions\r\nimport { updateMapViewState, updateMapStateById } from '../../actions/Map';\r\nimport { fetchStates } from '../../actions/Data/Mapping';\r\nimport { fetchPanels } from '../../actions/Data/Content';\r\n// Selectors\r\nimport {getStatesByHash, getLoadingStatus, getDefaultState} from '../../selectors/Data';\r\nimport {getViewState, getMapLoadingStatus, getActiveLayers, getJSONConfig} from '../../selectors/Map';\r\n// Library Components\r\nimport Map from './TempMap';//*/'@myglobe/core/dist/Map';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst styles = theme => ({\r\n root: {\r\n position: 'relative',\r\n backgroundColor: theme.palette.secondary.main,\r\n width: '100%',\r\n height: '100%'\r\n },\r\n loadingContainer: {\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n }\r\n});\r\n/* ========================================== */\r\n/**\r\n * Map Container\r\n * -------------\r\n * Container for deck and mapbox map component\r\n * linked to the MapReducer\r\n *\r\n * @param {object} props component properties\r\n * @param {object} props.classes style classes\r\n * @param {bool} props.isLoading loading status\r\n * @param {string} props.defaultState default state id\r\n * @param {string} props.mapboxToken mapbox token\r\n * @param {object} props.mapStyle mapStyle uri or object containing uri\r\n * @param {string} props.baseMapStyle base map style uri\r\n * @param {object} props.viewState incoming view state from reducer\r\n * @param {array} props.markers incoming marker elements from reducer\r\n * @param {array} props.layers incoming layers from reducer\r\n * @param {object} props.layerData incoming deck and mapbox layer data\r\n *\r\n * @param {func} props.fetchStates fetch state action\r\n * @param {func} props.updateMapViewState update map viewstate action\r\n * @param {func} props.updateMapStateById update map state by id\r\n * @param {func} props.resetMapState resets map state to default\r\n */\r\nclass MapContainer extends Component {\r\n /* ======================== */\r\n // CONSTRUCTOR\r\n /* ======================== */\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n ui: null\r\n /*deckLayers: [],\r\n mapboxLayers: [],\r\n markers: []*/\r\n };\r\n\r\n // String extension to parse string variable to executable Javascript function\r\n if (typeof String.prototype.parseFunction != 'function') {\r\n String.prototype.parseFunction = function () {\r\n var funcReg = /function *\\(([^()]*)\\)[ \\n\\t]*{(.*)}/gmi;\r\n var match = funcReg.exec(this.replace(/\\n/g, ' '));\r\n\r\n if(match) {\r\n return new Function(match[1].split(','), match[2]);\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n }\r\n shouldComponentUpdate(prevProps) {\r\n return (prevProps.layerData.deckLayers !== this.props.layerData.deckLayers\r\n || prevProps.layerData.mapboxLayers !== this.props.layerData.mapboxLayers\r\n || prevProps.markers !== this.props.markers\r\n || prevProps.viewState !== this.props.viewState\r\n || prevProps.mapStyle !== this.props.mapStyle\r\n || prevProps.isLoading !== this.props.isLoading\r\n );\r\n }\r\n componentDidMount() {\r\n // UI Building\r\n /*\r\n document.getElementById('deckgl-wrapper').addEventListener('contextmenu', evt => evt.preventDefault());\r\n this.buildUI();\r\n */\r\n\r\n // Fetch default map state\r\n /*const globeConfig = this.props.globeConfig;\r\n const defaultStateID = (globeConfig.visState && globeConfig.visState.id) ? globeConfig.visState.id : 'default';\r\n\r\n // > Load State from DB (if not already loaded)\r\n this.props.fetchStates([defaultStateID]);\r\n // > Apply state to map\r\n const defaultState = this.props.states.byHash//byId.find(state=>state.id === defaultStateID);\r\n this.props.updateMapState(defaultState);\r\n*/\r\n //this.loadLayers(this.props.layers);\r\n }\r\n componentDidUpdate(prevProps) {\r\n console.debug(`${MapContainer.displayName} | `, 'componentDidUpdate - ', 'layerData:', this.props.layerData);\r\n if(!this.props.isLoading && prevProps.isLoading !== this.props.isLoading) {\r\n // > Load State from DB (if not already loaded)\r\n //this.props.fetchStates([defaultState]);\r\n // > Apply state to map\r\n //const defaultState = this.props.states.byHash//byId.find(state=>state.id === defaultStateID);\r\n const defaultState = this.props.defaultState || 'default';\r\n this.props.updateMapStateById(defaultState);\r\n }\r\n /*if(prevProps.layers !== this.props.layers) {\r\n this.loadLayers(this.props.layers);\r\n }*/\r\n }\r\n /* ========================================== */\r\n /**\r\n * Load Layers\r\n * -----------\r\n * Filters current layers from deck, mapbox,\r\n * and marker loaded layer arrays in the Map state\r\n * and sets to state\r\n */\r\n /* ========================================== */\r\n /*loadLayers = (layers) => {\r\n\r\n const deckLayers = this.props.deckLayers.filter(deckLayer=>{\r\n return layers.some(element=>element.id === deckLayer.props.data[0].id);\r\n });\r\n const mapboxLayers = this.props.mapboxLayers.filter(mapboxLayer=>{\r\n return layers.some(element=>element.id === mapboxLayer.id);\r\n });\r\n const markers = this.props.markers.filter(marker=>{\r\n return layers.some(element=>element.id === marker.id);\r\n });\r\n\r\n\r\n // Get Layers from Loaded Layers\r\n /*layers.forEach(layer=>{\r\n // TODO: Use a proper enum for map visTypes\r\n if(layer.visType === 'deckgl') {\r\n // Get Deck Layer from loaded deckLayers\r\n //deckLayers.push(this.props.loadedLayers[layer.id]);\r\n const deckLayer = this.props.deckLayers.find(dLayer=>dLayer.props.data[0].id === layer.id);\r\n if(deckLayer) {\r\n deckLayers.push(deckLayer);\r\n }\r\n } else if(layer.visType === 'mapbox') {\r\n // Get Mapbox Layer from loaded mapboxLayers\r\n //mapboxLayers.push(this.props.loadedLayers[layer.id]);\r\n const mapboxLayer = this.props.mapboxLayers.find(mLayer=>mLayer.id === layer.id);\r\n if(mapboxLayer) {\r\n mapboxLayers.push(mapboxLayer);\r\n }\r\n } else {\r\n // Get Marker Layer from loaded markers\r\n //markers.push(this.props.loadedLayers[layer.id]);\r\n const marker = this.props.markers.find(markLayer=>markLayer.id === layer.id);\r\n if(marker) {\r\n markers.push(marker);\r\n }\r\n }\r\n });*/\r\n /*\r\n console.debug(`${MapContainer.displayName} | `, 'loadLayers - ', 'deckLayers:', deckLayers, 'mapboxLayers:', mapboxLayers, 'markers:', markers);\r\n\r\n // Set layer arrays to state\r\n this.setState({deckLayers, mapboxLayers, markers});\r\n }*/\r\n\r\n /* ========================================== */\r\n /**\r\n * Build UI\r\n * --------\r\n * Creates map ui components from config\r\n * (I think this should be a layout container job)\r\n */\r\n /* ========================================== */\r\n /*buildUI() {\r\n if (this.props.globeConfig.navigation.type == 'sidepanel') {\r\n this.setState({\r\n ui: \r\n });\r\n }\r\n } */\r\n /* ========================================== */\r\n /**\r\n * Handle View State\r\n * -----------------\r\n * Sends view state update to MapReducer\r\n *\r\n * @param {object} viewState current view state\r\n */\r\n /* ========================================== */\r\n handleViewState = (viewState) => {\r\n if(this.props.updateMapViewState) {\r\n console.debug(`${MapContainer.displayName} | `, 'handleViewState -', 'viewState:', viewState);\r\n this.props.updateMapViewState(viewState);\r\n }\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Load\r\n * -----------\r\n * Loads map state\r\n */\r\n /* ========================================== */\r\n handleLoad = () => {\r\n console.debug(`${MapContainer.displayName} | `, 'handleLoad');\r\n if(this.props.updateMapStateById) {\r\n const defaultState = this.props.defaultState || 'default';\r\n //this.props.fetchStates(['default']);\r\n //const state = this.props.states['default'] || null;//this.props.states.find(state=>state.id === 'gladstone-overview');\r\n console.debug(`${MapContainer.displayName} | `, 'handleLoad - ', 'defaultState:', defaultState);\r\n this.props.updateMapStateById(defaultState);\r\n }\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Reset\r\n * -----------\r\n * Triggers map state reset\r\n */\r\n /* ========================================== */\r\n handleReset = () => {\r\n if(this.props.resetMapState) {\r\n this.props.resetMapState();\r\n }\r\n }\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n render() {\r\n //console.debug(`${MapContainer.displayName} | `, 'render - ', 'layerData:', this.props.layerData, 'markers:', this.props.markers);\r\n const classes = this.props.classes;\r\n const {deckLayers, mapboxLayers} = this.props.layerData;\r\n if(this.props.isLoading)\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n else\r\n return (\r\n
\r\n \r\n {(mapbox, deck)=>{\r\n //console.debug(`${MapContainer.displayName} | `, 'render - ', 'mapbox:', mapbox, 'deck:', deck, 'ui:', this.state.ui);\r\n return this.state.ui;\r\n }}\r\n \r\n
\r\n );\r\n }\r\n}\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nMapContainer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }).isRequired,\r\n defaultState: PropTypes.string,\r\n mapboxToken: PropTypes.string.isRequired,\r\n mapStyle: PropTypes.oneOfType([PropTypes.string, PropTypes.shape({url: PropTypes.string.isRequired})]).isRequired,\r\n baseMapStyle: PropTypes.string.isRequired,\r\n viewState: PropTypes.shape({\r\n longitude: PropTypes.number.isRequired,\r\n latitude: PropTypes.number.isRequired,\r\n zoom: PropTypes.number.isRequired,\r\n pitch: PropTypes.number.isRequired,\r\n bearing: PropTypes.number.isRequired\r\n }),\r\n //deckLayers: PropTypes.arrayOf(PropTypes.object),\r\n //mapboxLayers: PropTypes.arrayOf(PropTypes.object),\r\n markers: PropTypes.arrayOf(PropTypes.object),\r\n layers: PropTypes.arrayOf(PropTypes.string),\r\n layerData: PropTypes.shape({\r\n deckLayers: PropTypes.arrayOf(PropTypes.object),\r\n mapboxLayers: PropTypes.arrayOf(PropTypes.object)\r\n }),\r\n // Functions\r\n fetchStates: PropTypes.func.isRequired,\r\n updateMapViewState: PropTypes.func.isRequired,\r\n updateMapStateById: PropTypes.func.isRequired,\r\n resetMapState: PropTypes.func\r\n};\r\nMapContainer.displayName = 'MapContainer';\r\nMapContainer.whyDidYouRender = true;\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = store => {\r\n const getAllLoadingStatuses = (store) => {return getLoadingStatus(store, 'globe') || getMapLoadingStatus(store, 'map');};\r\n //const getDeckLayers = getLayersHashByType('deck');\r\n //const getLayers = getActiveLayers(store)\r\n //console.log(getAllLoadingStatuses(store));\r\n return {\r\n defaultState: getDefaultState(store),\r\n screen: store.Global.screen,\r\n viewState: getViewState(store),//store.Map.viewState,\r\n //jsonConfig: getJSONConfig(store),\r\n mapStyle: store.Map.mapStyle,\r\n spriteJSON: store.Map.spriteJSON,\r\n spriteImage: store.Map.spriteImage,\r\n baseMapStyle: store.Map.baseMapStyle,\r\n mapboxToken: store.Map.mapboxToken,\r\n //deckLayers: store.Map.deckLayers,\r\n //loadedLayers: store.Map.loadedLayers,\r\n layerData: getActiveLayers(store),\r\n //mapboxLayers: store.Map.mapboxLayers,\r\n markers: store.Map.markers,\r\n layers: store.Map.layers,\r\n //deckLayers: getDeckLayers(store),\r\n states: getStatesByHash(store),\r\n isLoading: getAllLoadingStatuses(store)\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({updateMapViewState, updateMapStateById, /*resetMapState,*/ fetchPanels, fetchStates,/*updateMapStyle, resetMap,*/ dispatch}), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(MapContainer));","/* ================================================================ */\r\n// ICON COMPONENT | Icon.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Material UI\r\nimport Icon from '@material-ui/core/Icon';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n zIndex: 10,\r\n backgroundColor: theme.palette.secondary.contrastText,\r\n color: theme.palette.secondary.main,\r\n width: '3.5rem',\r\n height: '3.5rem'\r\n },\r\n icon: {\r\n\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Icon Component\r\n * --------------\r\n * Outputs icon by type\r\n *\r\n * @param {string} props.label label for alt and aria tags\r\n * @param {string | element} props.icon default icon\r\n * @param {string} props.colour material ui colour\r\n * @param {object} props.styles style overrides\r\n */\r\nconst IconComponent = ({label, icon, colour, classes, styles}) => {\r\n //const classes = useStyles();\r\n if(typeof icon === 'string')\r\n // Resolve Material UI Icon\r\n return {icon};\r\n else\r\n // Resolve SVG Icon\r\n return (\r\n \r\n );\r\n}\r\n/* ========================================== */\r\n/**\r\n * Icon\r\n * ----\r\n * Dynamic icon outputting an image or predefined\r\n * material ui icon according to specified icon parameters\r\n *\r\n * @param {object} props component props\r\n * @param {string | element} props.icon default icon\r\n * @param {string | element} props.activeIcon icon for active state\r\n * @param {string} props.colour material ui colour\r\n * @param {string} props.activeColour material ui 'active' colour\r\n * @param {bool} props.isActive active state\r\n * @param {object} props.styles style overrides\r\n * @param {string} props.label label for alt and aria tags\r\n */\r\nconst IconHandler = React.memo(({\r\n label,\r\n icon,\r\n activeIcon,\r\n colour,\r\n activeColour,\r\n isActive,\r\n styles\r\n}) => {\r\n const classes = useStyles();\r\n const iconClasses = classNames(classes.icon, {\r\n 'isActive': isActive\r\n });\r\n return (\r\n \r\n );\r\n}, areEqual);\r\nIconHandler.propTypes = {\r\n label: PropTypes.string.isRequired,\r\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired,\r\n activeIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\r\n colour: PropTypes.string,\r\n activeColour: PropTypes.string,\r\n isActive: PropTypes.bool,\r\n styles: PropTypes.object\r\n};\r\nIconHandler.defaultProps = {\r\n icon: 'close',\r\n styles: {},\r\n colour: 'primary',\r\n activeColour: 'secondary',\r\n isActive: false\r\n};\r\nIconHandler.displayName = 'IconHandler';\r\nfunction areEqual(prevProps, nextProps) {\r\n const isEqual = prevProps.isActive === nextProps.isActive ||\r\n prevProps.colour === nextProps.colour;\r\n console.debug(`${IconHandler.displayName} | `, 'Prop Check -', 'prevProps:', prevProps, 'nextProps:', nextProps, 'isEqual:', isEqual);\r\n return isEqual;\r\n}\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default IconHandler;","/* ================================================================ */\r\n// BUTTON COMPONENT | Button.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useCallback} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport useReactRouter from 'use-react-router';\r\n// Material UI\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Icon from '../../components/Icon';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n/* ========================================== */\r\n// Constants\r\n/* ========================================== */\r\nconst ActionTypes = {\r\n HISTORY: 'history'\r\n};\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n zIndex: 10,\r\n backgroundColor: theme.palette.secondary.contrastText,\r\n color: theme.palette.secondary.main,\r\n width: '3.5rem',\r\n height: '3.5rem'\r\n },\r\n icon: {\r\n\r\n }\r\n}));\r\n// TODO: change action param to specific type formats with required values (history type, ui reducer type)\r\n/* ========================================== */\r\n/**\r\n * Action Button\r\n * -------------\r\n * Floating action button which triggers an action\r\n * according to specified parameters\r\n *\r\n * @param {object} props component props\r\n * @param {string} props.label button label\r\n * @param {string} props.colour button icon colour\r\n * @param {string | object} props.icon button icon\r\n * @param {string | element} props.activeIcon button active state icon\r\n * @param {string} props.action action type \r\n * @param {string} props.uri action uri\r\n * @param {object} props.styles style overrides\r\n */\r\nconst ActionButton = ({\r\n label,\r\n icon,\r\n action,\r\n uri,\r\n styles\r\n}) => {\r\n const classes = useStyles();\r\n const {history} = useReactRouter();\r\n const defaultIcon = (typeof icon === 'object') ? icon.default : icon;\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Click\r\n * ------------\r\n * Triggers button's action\r\n *\r\n * @param {string} action action type\r\n * @param {string} uri history action uri\r\n */\r\n const handleClick = useCallback(\r\n () => {\r\n console.debug(`${ActionButton.displayName} | `, `handleClick | ${action}`);\r\n history.push(uri);\r\n },\r\n [action, uri],\r\n );\r\n /*\r\n const ButtonIcon = () => (typeof icon === 'string') ?\r\n {icon}\r\n : (\r\n \r\n );\r\n */\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nActionButton.propTypes = {\r\n label: PropTypes.string.isRequired,\r\n // Icon Props\r\n icon: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.shape({\r\n default: PropTypes.string.isRequired,\r\n active: PropTypes.string,\r\n colour: PropTypes.string,\r\n activeColour: PropTypes.string,\r\n styles: PropTypes.object,\r\n activeStyles: PropTypes.object\r\n })\r\n ]).isRequired,\r\n action: PropTypes.oneOf(Object.values(ActionTypes)),\r\n uri: PropTypes.string,\r\n styles: PropTypes.object\r\n};\r\nActionButton.defaultProps = {\r\n icon: 'close',\r\n action: ActionTypes.HISTORY,\r\n uri: '/',\r\n styles: {}\r\n};\r\nActionButton.displayName = 'ActionButton';\r\nActionButton.ActionTypes = ActionTypes;\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default ActionButton;","/* ================================================================ */\r\n// HEADER COMPONENT | Header.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Material UI\r\nimport Typography from '@material-ui/core/Typography';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n header: {\r\n height: '12em',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n container: {\r\n padding: '1rem 2rem',\r\n height: 'calc(100% - 2rem)',\r\n width: 'calc(100% - 4rem)'\r\n },\r\n logo: {\r\n objectFit: 'contain',\r\n width: '100%',\r\n height: '100%'\r\n },\r\n title: {\r\n '& span': {\r\n color: theme.palette.primary.main\r\n }\r\n },\r\n subtitle: {}\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Header\r\n * ------\r\n * Header output with provided branding\r\n *\r\n * @param {object} props component props\r\n * @param {string} props.logo logo uri\r\n * @param {string} props.title title\r\n * @param {string} props.subtitle subtitle\r\n * @param {object} props.styles style overrides\r\n */\r\n/* ========================================== */\r\nconst Header = ({logo, title, subtitle, styles}) => {\r\n const classes = useStyles();\r\n //const Logo = logo ? \"Logo\" : {title}\r\n return (\r\n
\r\n
\r\n \"Logo\"\r\n {title &&\r\n {title}\r\n }\r\n {subtitle &&\r\n {subtitle}\r\n }\r\n
\r\n
\r\n );\r\n};\r\nHeader.propTypes = {\r\n logo: PropTypes.string,\r\n title: PropTypes.string,\r\n subtitle: PropTypes.string,\r\n styles: PropTypes.object\r\n};\r\nHeader.defaultProps = {\r\n logo: '/assets/logo.png',\r\n styles: {}\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Header;","/* ================================================================ */\r\n// SIDEBAR CONTAINER | Sidebar.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Constants\r\nimport {AlignmentTypes} from '@myglobe/core/dist/types';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n left: 0,\r\n zIndex: 1,\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n transition: 'width 500ms cubic-bezier(0.215, 0.610, 0.355, 1.000)',\r\n background: theme.palette.background.default,\r\n '&.alignRight': {\r\n flexDirection: 'row-reverse'\r\n },\r\n '&.alignTop': {\r\n flexDirection: 'column'\r\n },\r\n '&.alignBottom': {\r\n flexDirection: 'column-reverse'\r\n }\r\n },\r\n navigation: {\r\n height: '100%',\r\n //width: '18em',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '&.fullSize': {\r\n width: '100%'\r\n }\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Sidebar\r\n * -------\r\n * Menu and story panel with expansion handling\r\n *\r\n * @param {boolean} isExpanded initial expanded state\r\n */\r\n/* ========================================== */\r\nconst Sidebar = (props) => {\r\n const classes = useStyles();\r\n const {children, logo, align, slug, isVisible} = props;\r\n console.log(slug)\r\n /*const {isAuthenticated, loginWithRedirect, logout, getTokenSilently} = useAuth0();\r\n const callAPI = async ()=>{\r\n try {\r\n var token = await getTokenSilently();\r\n console.debug('TOKEN', token);\r\n const response = await fetch('http://localhost:3000/graphql', {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-Type':'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({query: '{\\n allUsers {\\n edges {\\n node {\\n id\\n }\\n }\\n }\\n}\\n','variables': null})\r\n });\r\n const responseData = await response.json();\r\n console.debug(responseData);\r\n } catch(e) {\r\n console.error(e);\r\n }\r\n };\r\n */\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n const rootClasses = classNames(classes.root, {\r\n 'alignLeft': align === AlignmentTypes.LEFT,\r\n 'alignRight': align === AlignmentTypes.RIGHT,\r\n 'alignTop': align === AlignmentTypes.TOP,\r\n //'expanded': expanded\r\n });\r\n //const slideDirection = (align === AlignmentTypes.LEFT || align === AlignmentTypes.RIGHT) ? align : align === AlignmentTypes.TOP ? 'down' : 'up';\r\n console.debug(`${Sidebar.displayName} | `, 'Render -', 'props:', props, 'logo:', logo, 'align:', align);\r\n return (\r\n \r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nSidebar.propTypes = {\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n children: PropTypes.oneOfType([\r\n PropTypes.arrayOf(PropTypes.node),\r\n PropTypes.node\r\n ]),\r\n slug: PropTypes.string,\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes)),\r\n isExpanded: PropTypes.bool\r\n};\r\nSidebar.defaultProps = {\r\n isExpanded: false\r\n};\r\nSidebar.displayName = 'Sidebar';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Sidebar;","/* ================================================================ */\r\n// MENU CONTAINER | Menu.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {Suspense} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\n// Library Components\r\nimport {MenuTypes} from '@myglobe/core/dist/types';\r\nconst TabMenu = React.lazy(()=>import('@myglobe/core/dist/Menu/TabMenu'));\r\nconst ListMenu = React.lazy(()=>import('@myglobe/core/dist/Menu/ListMenu'));\r\nconst TimelineMenu = React.lazy(()=>import('@myglobe/core/dist/Menu/TimelineMenu'));\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n // TODO: revert this stuff to a more flexible menu\r\n '&.list': {\r\n height: 'calc(100% - 12em)',\r\n maxHeight: 'calc(100vh - 12em)'\r\n }\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Menu Container\r\n * --------------\r\n * Outputs menu according to given type and\r\n * menu items\r\n *\r\n * @param {object} props component props\r\n * @param {object} props.styles style overrides\r\n * @param {object} props.type menu layout type\r\n * @param {array} props.items menu item config array\r\n */\r\n/* ========================================== */\r\nconst Menu = (props) => {\r\n const classes = useStyles();\r\n const {type, items, styles, ...otherProps} = props;\r\n const rootClasses = classNames(\r\n classes.root,\r\n {\r\n 'list': type === MenuTypes.LIST\r\n }\r\n );\r\n const MenuOutput = ({type}) => {\r\n {switch(type) {\r\n case MenuTypes.TAB:\r\n return ;\r\n case MenuTypes.LIST:\r\n return ;\r\n case MenuTypes.TIMELINE:\r\n return ;\r\n default:\r\n return ;\r\n }}\r\n };\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return (\r\n
\r\n }>\r\n \r\n \r\n
\r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nMenu.propTypes = {\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n styles: PropTypes.object,\r\n type: PropTypes.oneOf(Object.values(MenuTypes)),\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n icon: PropTypes.string,\r\n path: PropTypes.string.isRequired,\r\n styles: PropTypes.object,\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n icon: PropTypes.string,\r\n path: PropTypes.string.isRequired,\r\n styles: PropTypes.object\r\n }))\r\n }))\r\n};\r\nMenu.defaultProps = {\r\n styles: {},\r\n items: []\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Menu;","/* ================================================================ */\r\n// MENU CONTAINER | Menu.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Redux\r\nimport { connect, useSelector } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\n// Actions\r\nimport { fetchStories } from '../../actions/Data/Content';\r\nimport { updateMapState } from '../../actions/Map';\r\n// Selectors\r\nimport { getActivePanels, getLoadingStatus, getLoadingStatusSelector, getStoriesFlatMap } from '../../selectors/Data';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport Slide from '@material-ui/core/Slide';\r\n// Library Components\r\nimport {MenuTypes} from '@myglobe/core/dist/types';\r\nimport Menu from './Menu';\r\nimport useReactRouter from 'use-react-router';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n\r\n },\r\n nav: {\r\n position: 'absolute',\r\n zIndex: 1,\r\n left: '100%',\r\n top: 'calc(100% - 16rem)',\r\n width: '38vw'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Dynamic Menu Container\r\n * ----------------------\r\n * Wrapper for redux state-driven menu populated\r\n * by provided index\r\n *\r\n * @param {object} props component props\r\n * @param {object} props.styles menu style overrides\r\n * @param {string} props.type menu layout type \r\n * @param {string} props.index menu index for selector\r\n * @param {string} props.icon default fallback icon\r\n * @param {string} props.routeParam route parameter to listen for\r\n */\r\nconst DynamicMenu = ({\r\n type,\r\n index,\r\n ...otherProps\r\n}) => {\r\n const classes = useStyles();\r\n const {match} = useReactRouter();\r\n const slug = otherProps.routeParam ? match.params[otherProps.routeParam] : baseURL;\r\n const items = useSelector(\r\n state=>{\r\n let data = [];\r\n switch(index) {\r\n case 'panels':\r\n data = getActivePanels(state, slug) || [];\r\n break;\r\n case 'stories':\r\n data = getStoriesFlatMap(state) || [];\r\n return data.map(dataItem=>{\r\n return {\r\n title: dataItem.title, \r\n icon: 'trip_origin',\r\n slug: dataItem.slug,\r\n path: `/${slug}`\r\n };\r\n });\r\n default:\r\n data = getActivePanels(state, slug) || [];\r\n }\r\n return data.map(dataItem => {\r\n return {\r\n title: dataItem.title,\r\n icon: 'trip_origin',\r\n slug: dataItem.slug,\r\n path: `${slug}/${dataItem.slug}`\r\n };\r\n });\r\n }/*, (newItems, prevItems)=>newItems\r\n .filter(\r\n ({path})=>prevItems\r\n .some(prevItem=>prevItem.path === path)\r\n ).length === 0*/\r\n );\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nDynamicMenu.propTypes = {\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n styles: PropTypes.object,\r\n type: PropTypes.oneOf(Object.values(MenuTypes)),\r\n index: PropTypes.string.isRequired,\r\n icon: PropTypes.string,\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n icon: PropTypes.string,\r\n path: PropTypes.string.isRequired,\r\n styles: PropTypes.object,\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n icon: PropTypes.string,\r\n path: PropTypes.string.isRequired,\r\n styles: PropTypes.object\r\n }))\r\n })),\r\n routeParam: PropTypes.string,\r\n /*,\r\n menuItems: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n slug: PropTypes.string.isRequired\r\n }))*/\r\n};\r\nDynamicMenu.defaultProps = {\r\n styles: {},\r\n items: [],\r\n menuItems: []\r\n};\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = (store, props) =>{\r\n const getLoading = getLoadingStatusSelector(['stories', 'globe', 'panels', 'states']);\r\n //const getMenu = getMenuItems(props.index, props.slug);\r\n //menuItems: getMenu(store)//getMenuItems(store, props.index, props.slug)\r\n return {\r\n isLoading: getLoading(store),\r\n isConfigLoading: getLoadingStatus(store, 'globe'),\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({fetchStories, updateMapState, dispatch}), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(DynamicMenu);//(React.memo(Story, areEqual));","/* ================================================================ */\r\n// PAGE CONTAINER | Page.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useEffect, useRef, Suspense} from 'react';\r\nimport PropTypes, { arrayOf } from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { bindActionCreators } from 'redux';\r\nimport classNames from 'classnames';\r\n// Actions\r\nimport { fetchPages } from '../../actions/Data/Content';\r\n// Selectors\r\nimport { getPage, getPageTypes, getLoadingStatus } from '../../selectors/Data';\r\n// Hooks\r\nimport useReactRouter from 'use-react-router';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Icon from '@material-ui/core/Icon';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\n// Constants\r\nimport {AlignmentTypes, NavigationTypes, MenuTypes} from '@myglobe/core/dist/types';\r\n// > Async\r\nconst Story = React.lazy(()=>import('./Story'));\r\n/* ========================================== */\r\n// Constants\r\n/* ========================================== */\r\nconst PageTypes = {\r\n STATIC: 'static',\r\n STORY: 'story'\r\n};\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n collapseWorkaroundContainer: {\r\n width: '0px',\r\n // Override stupid mui element style prop\r\n height: '100% !important',\r\n transitionProperty: 'width'\r\n },\r\n collapseWorkaroundWrapper: {\r\n height: 'inherit'\r\n },\r\n collapseWorkaroundEntered: {\r\n width: '100%'\r\n },\r\n collapseWorkaroundHidden: {\r\n width: '0px'\r\n },\r\n root: {\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n transition: 'width 500ms cubic-bezier(0.215, 0.610, 0.355, 1.000)',\r\n //background: theme.palette.background.default\r\n },\r\n closeButton: {\r\n zIndex: 10,\r\n backgroundColor: theme.palette.secondary.contrastText,\r\n color: theme.palette.secondary.main,\r\n position: 'absolute',\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n right: '-2.25rem',\r\n top: '50%'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Page\r\n * ----\r\n * Page container for static and story pages\r\n *\r\n * @param {object} props component properties\r\n * @param {string} props.align alignment setting <'left' | 'right' | 'top' | 'bottom'>\r\n * @param {string} props.slug router match param value\r\n * @param {object} props.pageConfig page data retrieved from store\r\n * @param {boolean} isVisible initial expanded state\r\n */\r\nconst Page = (props) => {\r\n const classes = useStyles();\r\n const {\r\n align,\r\n slug,\r\n isVisible,\r\n isExpandable,\r\n pageConfig,\r\n pageTypes,\r\n children,\r\n storyProps,\r\n ...others\r\n } = props;\r\n const {history} = useReactRouter();\r\n //const {category, page} = match.params;\r\n // Handle story component loading if detect type\r\n // Get page data\r\n const type = pageConfig?.type.toLowerCase() || PageTypes.STATIC;\r\n const content = pageConfig?.content || '';\r\n const style = pageConfig?.style || {};\r\n // Get page from slug map of category\r\n //const currentPage = (category) ? slugMap[category] : slugMap['home'];\r\n //const visible = !isExpandable || isExpandable && isVisible;\r\n console.log('PAGE CHILDREN',children)\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n const slideDirection = (align === AlignmentTypes.LEFT || align === AlignmentTypes.RIGHT) ? align : align === AlignmentTypes.TOP ? 'down' : 'up';\r\n console.debug(`${Page.displayName} | `, 'Render -', others, 'slug:', slug, 'pageConfig:', pageConfig, 'pageTypes:', pageTypes, 'type:', type, 'slideDirection:', slideDirection);\r\n return (\r\n /**/\r\n
\r\n {/*visible && (\r\n }>\r\n \r\n \r\n )*/}\r\n }>\r\n {pageTypes.includes(PageTypes.STORY) && }\r\n {/*\r\n
\r\n */}\r\n {children}\r\n \r\n
\r\n //\r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nPage.propTypes = {\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes)),\r\n slug: PropTypes.string,\r\n pageConfig: PropTypes.shape({\r\n uuid: PropTypes.string.isRequired,\r\n slug: PropTypes.string.isRequired,\r\n name: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(Object.values(PageTypes)).isRequired,\r\n content: PropTypes.string,\r\n style: PropTypes.object\r\n }),\r\n pageTypes: PropTypes.arrayOf(PropTypes.oneOf(Object.values(PageTypes))),\r\n isVisible: PropTypes.bool,\r\n isExpandable: PropTypes.bool\r\n};\r\nPage.defaultProps = {\r\n align: AlignmentTypes.LEFT,\r\n slug: '',\r\n isVisible: false,\r\n isExpandable: false\r\n};\r\nPage.displayName = 'Page';\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = (store, props) =>{\r\n //const getActivePage = getPage(props.category);\r\n return {\r\n isLoading: getLoadingStatus(store, 'pages'),\r\n pageConfig: getPage(store, props.slug),\r\n pageTypes: getPageTypes(store)\r\n };\r\n};\r\nconst mapDispatchToProps = dispatch => {\r\n return bindActionCreators(Object.assign({fetchPages, dispatch}), dispatch);\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Page);\r\n/*export default connect(mapStateToProps, mapDispatchToProps)(React.memo(Page, areEqual));\r\n\r\nfunction areEqual(prevProps, nextProps) {\r\n console.log('PAGE CHECK', prevProps, nextProps);\r\n return (\r\n !isNullOrUndefined(prevProps.page) &&\r\n !isNullOrUndefined(nextProps.page) &&\r\n prevProps.page.id === nextProps.page.id &&\r\n prevProps.category === nextProps.category\r\n );\r\n}*/","/* ================================================================ */\r\n// POPUP COMPONENT | Popup.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useRef, useEffect, useCallback} from 'react';\r\nimport useReactRouter from 'use-react-router';\r\nimport PropTypes from 'prop-types';\r\nimport { isNullOrUndefined } from 'util';\r\n// Material UI\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Icon from '@material-ui/core/Icon';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n zIndex: 10,\r\n //position: 'absolute',\r\n backgroundColor: theme.palette.background.default,\r\n //right: '3rem',\r\n //top: '5rem',\r\n //width: '75%',\r\n //maxWidth: '75%',\r\n overflow: 'initial'\r\n },\r\n video: {\r\n width: '100%',\r\n height: '100%'\r\n },\r\n image: {\r\n objectFit: 'contain',\r\n width: '100%',\r\n height: '100%'\r\n },\r\n loadingContainer: {\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n },\r\n closeButton: {\r\n zIndex: 10,\r\n backgroundColor: theme.palette.secondary.contrastText,\r\n color: theme.palette.secondary.main,\r\n position: 'absolute',\r\n width: '3.5rem',\r\n height: '3.5rem',\r\n left: '-1.25rem',\r\n top: '-1.25rem'\r\n }\r\n}));\r\n// TODO: IMPLEMENT MEDIA SRC GET IN POPUP WRAPPER\r\n/* ========================================== */\r\n/**\r\n * Video Popup\r\n * -----------\r\n * Outputs a fullscreen dialog for video media\r\n * display\r\n *\r\n * @param {object} classes style classes\r\n * @param {string} content html content\r\n */\r\n/* ========================================== */\r\nconst Popup = ({type, onClose, ...props}) => {\r\n const videoTimer = useRef();\r\n const video = useRef();\r\n const [open, setOpen] = useState(false);\r\n const classes = useStyles();\r\n const {history} = useReactRouter();\r\n const query = new URLSearchParams(location.search);\r\n const media = query.get('media') || null;\r\n useEffect(() => {\r\n console.debug(`${Popup.displayName} | `, 'url query:', query);\r\n setOpen(!isNullOrUndefined(media));\r\n }, [media]);\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Close\r\n * ------------\r\n * Triggers closing functions and\r\n * sets open state to false\r\n *\r\n * @param {object} onClose onClose callback schema\r\n */\r\n const handleClose = useCallback(()=>{\r\n // Execute all listed callbacks\r\n resolveCallbacks(onClose).forEach(callback=>callback());\r\n setOpen(false);\r\n }, [onClose, resolveCallbacks]);\r\n /* ========================================== */\r\n /**\r\n * Handle Video\r\n * ------------\r\n * Toggles video play/pause on a timer delay\r\n */\r\n function handleVideo() {\r\n if(videoTimer.current) {\r\n clearTimeout(videoTimer.current);\r\n }\r\n videoTimer.current = setTimeout(()=>{\r\n video.current.paused ? video.current.play() : video.current.pause();\r\n }, 100);\r\n }\r\n /* ========================================== */\r\n /**\r\n * Resolve Callbacks\r\n * -----------------\r\n * Resolve listed callback key and parameters with\r\n * existing callback function\r\n *\r\n * @param {object} callbacks callback schema for function\r\n */\r\n const resolveCallbacks = useCallback((callbacks)=>{\r\n return Object.keys(callbacks).map(key=>{\r\n switch(key) {\r\n case 'redirect':\r\n return history.push(callbacks[key]);\r\n default:\r\n return ()=>console.warn(`No callback found for ${key}`);\r\n }\r\n });\r\n }, [history]);\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return (\r\n \r\n {type === 'video' ?\r\n \r\n \r\n \r\n : \r\n \"popup-content\"\r\n }\r\n \r\n close\r\n \r\n \r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nPopup.propTypes = {\r\n category: PropTypes.string.isRequired,\r\n media: PropTypes.string,\r\n type: PropTypes.oneOf(['video', 'image']),\r\n content: PropTypes.string,\r\n onClose: PropTypes.shape({\r\n redirect: PropTypes.string\r\n })\r\n};\r\nPopup.defaultProps = {\r\n media: '',\r\n mediaType: 'video',\r\n content: ''\r\n};\r\nPopup.displayName = 'Popup';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Popup;","/* ================================================================ */\r\n// STYLED CONTAINER | StyledContainer.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport useReactRouter from 'use-react-router';\r\nimport PropTypes from 'prop-types';\r\n// Material UI\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Markdown\r\nimport Markdown from 'react-markdown';\r\nimport htmlParser from 'react-markdown/plugins/html-parser';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'absolute',\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.background.default,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n '& img': {\r\n objectFit: 'cover',\r\n width: '100%',\r\n height: '100%'\r\n }\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Styled Container\r\n * ----------------\r\n * Outputs html/markdown content within a styled\r\n * div element\r\n *\r\n * @param {object} props component props\r\n * @param {string} content html content\r\n * @param {object} styles component styles\r\n */\r\nconst StyledContainer = ({styles, content}) => {\r\n const classes = useStyles();\r\n const parseHtml = htmlParser({\r\n isValidNode: node => node.type !== 'script',\r\n //processingInstructions: [/* ... */]\r\n });\r\n const renderParagraph = ({children}) => {\r\n if(children && children[0]\r\n && children.length === 1\r\n && children[0].props\r\n && children[0].props.src)\r\n return children;\r\n return

{children}

;\r\n };\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nStyledContainer.propTypes = {\r\n styles: PropTypes.object,\r\n content: PropTypes.string\r\n};\r\nStyledContainer.defaultProps = {\r\n styles: {},\r\n content: ''\r\n};\r\nStyledContainer.displayName = 'StyledContainer';\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default StyledContainer;","/* ================================================================ */\r\n// COMPONENT RESOLVER | ComponentResolver.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Constants\r\nimport { AlignmentTypes } from '@myglobe/core/dist/types';\r\n// Local Components\r\nimport CesiumContainer from '../../components/Cesium/CesiumContainer';\r\nimport MapContainer from '../../components/Map/MapContainer';\r\nimport ActionButton from '../../components/ActionButton';\r\nimport Header from '../../components/Header';\r\nimport Sidebar from '../../containers/Sidebar';\r\nimport {default as StaticMenu, DynamicMenu} from '../../containers/Menu';\r\nimport Page from '../../containers/Page';\r\nimport Popup from '../../containers/Popup';\r\nimport StyledContainer from '../../containers/StyledContainer';\r\n/* ========================================== */\r\n// Helpers\r\n/* ========================================== */\r\nconst ActionButtonConstructor = (props) => ;\r\nconst HeaderConstructor = (props) =>
;\r\nconst SidebarConstructor = (props) => ;\r\nconst PageConstructor = (props) => ;\r\nconst PopupConstructor = (props) => ;\r\nconst MapConstructor = (props) => ;\r\nconst CesiumConstructor = (props) => ;\r\nconst StyledContainerConstructor = (props) => ;\r\n// TODO: Resolve menu via dynamic or static according to item type\r\nconst MenuConstructor = (props) => {\r\n console.log('MenuConst', props);\r\n if(Array.isArray(props.items))\r\n return ;\r\n else\r\n return ;\r\n};\r\nconst Components = {\r\n 'Sidebar': SidebarConstructor,\r\n 'Page': PageConstructor,\r\n 'Popup': PopupConstructor,\r\n 'Map': MapConstructor,\r\n 'Cesium': CesiumConstructor,\r\n 'Menu': MenuConstructor,\r\n 'Header': HeaderConstructor,\r\n 'StyledContainer': StyledContainerConstructor,\r\n 'ActionButton': ActionButtonConstructor\r\n};\r\n/* ========================================== */\r\n/**\r\n * Generate Key\r\n * ------------\r\n * Creates a key from the given name\r\n * and milliseconds since epoch\r\n * @param {*} name\r\n */\r\nfunction generateKey(name) {\r\n return `${ name }_${ new Date().getTime() }`;\r\n}\r\n/* ========================================== */\r\n/**\r\n * Resolve Components\r\n * ------------------\r\n * Resolves a component corresponding to the\r\n * schema's components configuration and returns this\r\n * as an array\r\n *\r\n * @param {array} components array of component configs\r\n */\r\nfunction resolveComponents(components = []) {\r\n return components.map(componentConfig=>{\r\n // Get component from map\r\n const {name, children, ...props} = componentConfig;\r\n // Resolve component\r\n const resolveComponent = (componentKey, childrenConfig = [], props) => {\r\n try {\r\n console.log(componentKey);\r\n console.log(Components[componentKey]);\r\n const children = childrenConfig.map(childConfig=>{\r\n const {name, children, ...props} = childConfig;\r\n return resolveComponent(name, children, props);\r\n });\r\n const componentProps = {...props, key: generateKey(componentKey), children};\r\n console.debug('Layout > ComponentResolver | ', 'resolveComponents - ', 'componentProps:', componentProps);\r\n const component = Components[componentKey](componentProps);\r\n console.log(component);\r\n return component;\r\n } catch (e) {\r\n console.warn(`Invalid Component in schema ${componentConfig}: ${e}`);\r\n return null;\r\n }\r\n };\r\n return resolveComponent(name, children, props);\r\n });\r\n}\r\nresolveComponents.propTypes = {\r\n components: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.oneOf(Object.keys(Components)),\r\n style: PropTypes.object,\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes)),\r\n children: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.oneOf(Object.keys(Components)),\r\n style: PropTypes.object,\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes))\r\n }))\r\n }))\r\n};\r\nexport default resolveComponents;","/* ================================================================ */\r\n// MAIN LAYOUT CONTAINER | MainLayout.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {Suspense, useState, useEffect} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport useReactRouter from 'use-react-router';\r\n// MaterialUI\r\nimport Skeleton from '@material-ui/lab/Skeleton';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\n// Constants\r\nimport {LayoutTypes, AlignmentTypes, NavigationTypes, MenuTypes} from '@myglobe/core/dist/types';\r\n// Validators\r\nimport LayoutConfig from './LayoutConfig';\r\n// Component Resolver\r\nimport resolveComponents from './ComponentResolver';\r\n// MyGlobe Library\r\n// Hooks\r\nimport useMedia from '@myglobe/core/dist/hooks/useMedia';\r\nimport useLocalStorage from '../../utils/useLocalStorage';\r\n// > ASYNC\r\n//const Drawer = React.lazy(()=>import('@myglobe/core/dist/Layout/Drawer'));\r\nconst GridLayout = React.lazy(()=>import('@myglobe/core/dist/Layout/Grid'));\r\nconst LayeredLayout = React.lazy(()=>import('@myglobe/core/dist/Layout/Layered'));\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(({\r\n 'body': {\r\n transition: 'all 0.25s linear'\r\n },\r\n root: {\r\n overflow: 'hidden',\r\n position: 'relative',\r\n width: '100%',\r\n height: '100vh',\r\n display: 'flex',\r\n transition: 'all 500ms cubic-bezier(0.215, 0.610, 0.355, 1.000)',\r\n },\r\n error: {\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n }\r\n}));\r\n\r\n/* ========================================== */\r\n/**\r\n * Main Layout\r\n * -----------\r\n * Main application layout\r\n *\r\n * @param {object} props component props\r\n */\r\nconst MainLayout = React.memo((props) => {\r\n const classes = useStyles();\r\n const {title, config, isLoading, isError, error} = props;\r\n const {desktop, mobile} = config;\r\n const [loadedComponents, setComponents] = useState([]);\r\n //(min-width: 960px)\r\n const schema = useMedia(['(min-width: 740px)', '(min-width: 0px)'], [desktop, mobile], desktop);\r\n \r\n const [disabledIntro, setDisableIntroduction] = useLocalStorage('introduction-disabled');\r\n \r\n // maybe needs to be moved into core?\r\n const {history} = useReactRouter();\r\n \r\n\r\n useEffect(() => {\r\n var listenerDisconnect = history.listen(historyListener);\r\n return () => {\r\n listenerDisconnect();\r\n }\r\n },[])\r\n\r\n function historyListener (location, action) {\r\n // location is an object like window.location\r\n gtagUAs.forEach(x=>{\r\n console.log('config', x, {'page_path': location.pathname});\r\n window.gtag('config', x, {'page_path': location.pathname}); \r\n });\r\n };\r\n\r\n // Winter check\r\n if(window.navigator.userAgent.toLowerCase().indexOf('edge')>-1) {\r\n return
\r\n Error\r\n Please upgrade your Edge to the latest which runs on chromium.\r\n
\r\n }\r\n\r\n\r\n\r\n useEffect(()=>{\r\n console.debug(`${MainLayout.displayName} | `, '(update) handleSchema -', 'schema:', schema);\r\n const components = schema && resolveComponents(schema.components);\r\n console.log(components);\r\n components && setComponents(components);\r\n }, [schema]);\r\n\r\n const rootClasses = classNames(classes.root);\r\n return (\r\n
\r\n }>\r\n {isError ?\r\n
\r\n Unable to load globe {title}\r\n Error: {error.message}\r\n
\r\n : (\r\n schema.type === LayoutTypes.GRID ? (\r\n \r\n {loadedComponents}\r\n {/*\r\n \r\n \r\n {//\r\n */}\r\n \r\n ) : (\r\n \r\n {/*}\r\n \r\n */}\r\n {loadedComponents}\r\n \r\n )\r\n )}\r\n
\r\n
\r\n );\r\n});\r\n/* ========================================== */\r\n// Props\r\n/* ========================================== */\r\nMainLayout.propTypes = {\r\n config: PropTypes.shape({\r\n logo: PropTypes.string,\r\n mobile: LayoutConfig,\r\n desktop: LayoutConfig,\r\n navigation: PropTypes.shape({\r\n type: PropTypes.oneOf(Object.values(NavigationTypes)),\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes)),\r\n props: PropTypes.object,\r\n menu: PropTypes.shape({\r\n type: PropTypes.oneOf(Object.values(MenuTypes)),\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n position: PropTypes.number,\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n position: PropTypes.number,\r\n }))\r\n }))\r\n })\r\n })\r\n }),\r\n isLoading: PropTypes.bool.isRequired,\r\n theme: PropTypes.object\r\n};\r\n/*\r\nMainLayout.defaultProps = {\r\n config: {\r\n logo: '/assets/logo.png',\r\n /*mobile: {\r\n type: LayoutTypes.LAYERED,\r\n align: AlignmentTypes.BOTTOM\r\n },\r\n desktop: {\r\n type: LayoutTypes.GRID,\r\n align: AlignmentTypes.LEFT\r\n },\r\n navigation: {\r\n type: NavigationTypes.INLINE,\r\n align: AlignmentTypes.TOP,\r\n menu: []\r\n }\r\n }\r\n};*/\r\nMainLayout.types = LayoutTypes;\r\nMainLayout.displayName = 'MainLayout';\r\nMainLayout.whyDidYouRender = true;\r\n\r\nconst Introduction = ({isOpen}) => {\r\n return (\r\n \r\n \r\n \r\n Securing Water Supply for our Region\r\n \r\n \r\n Welcome to the Future Water Project 2060 visualisation tool. The purpose of this visualisation tool is \r\n to provide the user with a snapshot of FWP 2060’s main key elements and to gain a better \r\n understanding of some of the major challenges in securing our region’s future water supply needs.\r\n \r\n HOW TO USE THE FWP2060 VISUAL TOOL\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n/* ========================================== */\r\n// Exports\r\n/* ========================================== */\r\nexport default MainLayout;","/* ================================================================ */\r\n// LAYOUT CONTAINER | Layout.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport { Helmet } from 'react-helmet';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport {connect} from 'react-redux';\r\nimport {getLoadingStatusV2, getGlobeTitle, getGlobeConfig, getGlobeTheme, getError} from '../../selectors/Data';\r\nimport { BrowserRouter, Route, Switch, Redirect} from 'react-router-dom';\r\n//import { createBrowserHistory } from 'history';\r\n// Util\r\nimport {isNullOrUndefined} from 'util';\r\n// Auth0\r\nimport { useAuth0 } from '../../auth0/auth0';\r\n// MaterialUI\r\nimport Fab from '@material-ui/core/Fab';\r\nimport ThemeProvider from '@material-ui/styles/ThemeProvider';\r\nimport DarkModeIcon from '@material-ui/icons/Brightness4';\r\n// Constants\r\nimport {LayoutTypes, AlignmentTypes, NavigationTypes, MenuTypes} from '@myglobe/core/dist/types';\r\n// Validator\r\nimport LayoutConfig from './LayoutConfig';\r\nimport useDarkMode from '../../utils/useThemeMode';\r\n// Local Components\r\nimport Loading from '../../containers/Loading';\r\nimport Spritesheet from '../../containers/Sprite/Spritesheet';\r\nimport AdminLayout from './AdminLayout';\r\nimport MainLayout from './MainLayout';\r\n\r\n// Assets\r\nimport {getTheme} from '@myglobe/core/dist/styles/theme';\r\n\r\n//const history = createBrowserHistory();\r\n// TODO: fetch base theme from state via mode parameter\r\n//const location = history.location;\r\n\r\n/* ========================================== */\r\n/**\r\n * Layout\r\n * ------\r\n * App layout\r\n *\r\n * @param {object} props component props\r\n * @param {string} props.title globe title\r\n * @param {object} props.config layout config\r\n * @param {object} props.theme globe theme\r\n * @param {boolean} props.isLoading loading status\r\n */\r\n/* ========================================== */\r\nconst Layout = ({title, config, theme, isLoading, error}) => {\r\n const [darkMode, setDarkMode] = useDarkMode();\r\n const MyGlobeTheme = getTheme(darkMode ? 'dark' : 'light');\r\n //const useForceUpdate = () => useState()[1];\r\n //const MainLayout = useLayout(type, {});\r\n //const forceUpdate = useForceUpdate();\r\n /* ======================== */\r\n // COMPONENT MOUNT\r\n /* ======================== */\r\n /*useEffect(()=>{\r\n /* ========================================== */\r\n /**\r\n * Update Component Event Handler\r\n * ------------------------------\r\n * Forces updating on layout component\r\n * (used for print media changes)\r\n *\r\n * @param {Event} event\r\n */\r\n /*function updateComponent(event) {\r\n ReactDOM.flushSync(() => {\r\n event.matches;\r\n forceUpdate();\r\n });\r\n }\r\n window.matchMedia('print').addListener(updateComponent);\r\n /* ======================== */\r\n // UNMOUNT\r\n /* ======================== */\r\n /* return () => {\r\n window.matchMedia('print').removeListener(updateComponent);\r\n };\r\n }, [forceUpdate]);\r\n */\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n function toggleDarkMode() {\r\n setDarkMode(!darkMode);\r\n }\r\n /* ========================================== */\r\n /**\r\n * Toggle Full Screen\r\n * ------------------\r\n * Changes window to full screen mode\r\n */\r\n function toggleFullScreen() {\r\n var doc = window.document;\r\n var docEl = doc.documentElement;\r\n\r\n var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;\r\n var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;\r\n\r\n if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {\r\n requestFullScreen.call(docEl);\r\n this.resize();\r\n }\r\n else {\r\n cancelFullScreen.call(doc);\r\n }\r\n }\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n console.debug(`${Layout.displayName} | `, 'render - ', 'theme:', MyGlobeTheme);\r\n const Admin = (routeProps) => ;\r\n const Main = (routeProps) => !isLoading && (\r\n \r\n \r\n \r\n );/*, (prevProps, nextProps) => {\r\n return prevProps.isLoading === nextProps.isLoading && config\r\n });*/\r\n const SpritesheetC = (routeProps) => (\r\n
\r\n \r\n
\r\n );\r\n return (\r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n {/*\r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n/* ========================================== */\r\n// Props\r\n/* ========================================== */\r\nLayout.propTypes = {\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n title: PropTypes.string.isRequired,\r\n config: PropTypes.shape({\r\n logo: PropTypes.string,\r\n mobile: LayoutConfig,\r\n desktop: LayoutConfig,\r\n navigation: PropTypes.shape({\r\n type: PropTypes.oneOf(Object.values(NavigationTypes)),\r\n align: PropTypes.oneOf(Object.values(AlignmentTypes)),\r\n props: PropTypes.object,\r\n menu: PropTypes.shape({\r\n type: PropTypes.oneOf(Object.values(MenuTypes)),\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n position: PropTypes.number,\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n title: PropTypes.string.isRequired,\r\n path: PropTypes.string.isRequired,\r\n position: PropTypes.number,\r\n }))\r\n }))\r\n })\r\n })\r\n }),\r\n isLoading: PropTypes.bool.isRequired,\r\n theme: PropTypes.object\r\n};\r\nLayout.types = LayoutTypes;\r\nLayout.displayName = 'Layout';\r\nLayout.whyDidYouRender = true;\r\n/* ========================================== */\r\n// Redux\r\n/* ========================================== */\r\nconst mapStateToProps = store => {\r\n const getLoading = getLoadingStatusV2('globe');\r\n return {\r\n title: getGlobeTitle(store),\r\n config: getGlobeConfig(store),\r\n theme: getGlobeTheme(store),\r\n isLoading: getLoading(store),\r\n error: getError(store)\r\n };\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default connect(mapStateToProps)(Layout);//(React.memo(Layout, areEqual));\r\nfunction areEqual(prevProps, nextProps) {\r\n const isEqual = prevProps.isLoading === nextProps.isLoading;\r\n console.debug(`${Layout.displayName} | `, 'Prop Check -', 'prevProps:', prevProps, 'nextProps:', nextProps, 'isEqual:', isEqual);\r\n return isEqual;\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 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\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://goo.gl/SC7cgQ'\r\n );\r\n });\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","/* ================================================================ */\r\n// Index | index.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// IMPORTS\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\n// Store\r\nimport store from './store';\r\n// Actions\r\nimport { windowResize } from './actions/Global';\r\nimport { fetchInit, fetchGlobe } from './actions/Data';\r\n// Local Components\r\nimport Layout from './components/Layout';\r\n// Log Rocket\r\nimport LogRocket from 'logrocket';\r\n// Service Worker\r\nimport * as serviceWorker from './serviceWorker/sw.js';\r\n// Auth0\r\nimport { Auth0Provider } from './auth0/auth0.jsx';\r\nimport config from './auth0/config.json';\r\n/* ========================================== */\r\n// FUNCTIONS\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * onRedirectCallback\r\n * ------------------\r\n * Routes user to the right place after login\r\n * @param {*} appState\r\n */\r\nconst onRedirectCallback = appState => {\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n appState && appState.targetUrl ? appState.targetUrl : window.location.pathname\r\n );\r\n};\r\n/* ========================================== */\r\n/**\r\n * Resize\r\n * ------\r\n * Triggers width and height state update with\r\n * current window inner width and inner height values\r\n */\r\nfunction resize() {\r\n store.dispatch(windowResize(window.innerWidth, window.innerHeight));\r\n}\r\n/* ========================================== */\r\n// WINDOW EVENTS\r\n/* ========================================== */\r\nvar timeout = false;\r\nvar delay = 250;\r\n/* ======================== */\r\n// USER AGENT CHECK\r\n/* ======================== */\r\nif(window.navigator.userAgent.match('Android')) {\r\n /* ========================================== */\r\n /**\r\n * Window Orientation Change\r\n * -------------------------\r\n * Triggers resize on device orientation change\r\n */\r\n window.addEventListener('orientationchange', ()=>{\r\n store.dispatch(windowResize(window.innerWidth, window.innerHeight));\r\n });\r\n} else {\r\n /* ========================================== */\r\n /**\r\n * Window Resize\r\n * -------------\r\n * Triggers resize function with a timeout delay\r\n * for debouncing\r\n */\r\n window.addEventListener('resize', () => {\r\n // clear the timeout\r\n clearTimeout(timeout);\r\n // start timing for event \"completion\"\r\n timeout = setTimeout(resize, delay);\r\n });\r\n}\r\n/* ========================================== */\r\n/**\r\n * Window Load\r\n * -----------\r\n * Triggers window resize on initial load of the\r\n * window to update window width and height states\r\n */\r\nwindow.addEventListener('load', () => {\r\n // LogRocket\r\n //if(process.env.NODE_ENV === 'production')\r\n // LogRocket.init('nozm8c/myglobe');\r\n store.dispatch(windowResize(window.innerWidth, window.innerHeight));\r\n const subdomain = window.location.host.split('.')[1] ? window.location.host.split('.')[0] : false;\r\n console.log('subdomain', subdomain);\r\n console.log('subdomain', window.location.host);\r\n if(/*process.env.NODE_ENV === 'production' &&*/ subdomain && subdomain!=\"131\")\r\n store.dispatch(fetchGlobe(subdomain));\r\n else\r\n store.dispatch(fetchGlobe('rous'));\r\n});\r\n/* ========================================== */\r\n// RENDER\r\n/* ========================================== */\r\nconst app = document.getElementById('app');\r\nReactDOM.render(\r\n //\r\n \r\n \r\n \r\n \r\n \r\n //\r\n , app\r\n);\r\nserviceWorker.register();","/* ================================================================ */\r\n// POPUP COMPONENT | Popup.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// MaterialUI Components\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Typography from '@material-ui/core/Typography';\r\n// MaterialUI Style\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport { isNullOrUndefined } from 'util';\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n // === POPUP CONTAINER ROOT STYLES ===\r\n root: {\r\n zIndex: 10,\r\n //position: 'absolute',\r\n border: `0.05em solid ${theme.palette.primary.light}`,\r\n backgroundColor: theme.palette.background.default,\r\n //top: 0,\r\n //left: 0,\r\n padding: '1em 2em',\r\n width: '20em',\r\n height: 'auto'//'25em',\r\n },\r\n imageContainer: {\r\n margin: '1rem auto',\r\n width: '80%',\r\n height: '33%'\r\n },\r\n image: {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain'\r\n }\r\n}));\r\n/* ========================================== */\r\n/**\r\n * Popup Component\r\n * ---------------\r\n * Map popup visualisation component\r\n *\r\n/* ========================================== */\r\nfunction Popup(props) {\r\n const classes = useStyles();\r\n const {coords, content} = props;\r\n const {title, image, contact, summary} = content;\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n // Main render\r\n if(props.coords)\r\n return (\r\n \r\n {title}\r\n {!isNullOrUndefined(image) && image.length > 0 &&\r\n
\r\n {`${title}_image`}\r\n
\r\n }\r\n {!isNullOrUndefined(contact) && contact.length > 0 &&\r\n {contact}\r\n }\r\n {summary}\r\n
\r\n );\r\n else return null;\r\n}\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nPopup.propTypes = {\r\n title: PropTypes.string,\r\n coords: PropTypes.shape({\r\n x: PropTypes.number.isRequired,\r\n y: PropTypes.number.isRequired\r\n }),\r\n content: PropTypes.shape({\r\n title: PropTypes.string,\r\n image: PropTypes.string,\r\n summary: PropTypes.string\r\n })\r\n};\r\nPopup.defaultProps = {\r\n content: []\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default Popup;\r\n","/*\r\n track client outside of the Auth0Provider \r\n to try fix concurrent rendering incompatibility\r\n re-rending hook because jwt token in client changes (maybe)\r\n*/\r\nimport React, { useState, useEffect, useContext } from 'react'\r\nimport createAuth0Client from '@auth0/auth0-spa-js'\r\n\r\nconst DEFAULT_REDIRECT_CALLBACK = () =>\r\n window.history.replaceState({}, document.title, window.location.pathname)\r\n\r\nexport const Auth0Context = React.createContext()\r\nexport const useAuth0 = () => useContext(Auth0Context)\r\n\r\nlet _initOptions\r\n\r\nconst getAuth0Client = () => {\r\n return new Promise(async (resolve, reject) => {\r\n let client\r\n if (!client) {\r\n try {\r\n client = await createAuth0Client(_initOptions)\r\n resolve(client)\r\n } catch (e) {\r\n reject(new Error('getAuth0Client Error', e))\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport const getTokenSilently = async (...p) => {\r\n const client = await getAuth0Client()\r\n return await client.getTokenSilently(...p)\r\n}\r\nexport const Auth0Provider = ({\r\n children,\r\n onRedirectCallback = DEFAULT_REDIRECT_CALLBACK,\r\n ...initOptions\r\n}) => {\r\n const [isAuthenticated, setIsAuthenticated] = useState()\r\n const [user, setUser] = useState()\r\n const [auth0Client, setAuth0] = useState()\r\n const [loading, setLoading] = useState(true)\r\n const [popupOpen, setPopupOpen] = useState(false)\r\n\r\n useEffect(() => {\r\n const initAuth0 = async () => {\r\n console.log('init auth');\r\n _initOptions = initOptions\r\n const client = await getAuth0Client(initOptions)\r\n setAuth0(client)\r\n if (window.location.search.includes('code=')) {\r\n const {\r\n appState\r\n } = await client.handleRedirectCallback()\r\n onRedirectCallback(appState)\r\n }\r\n const isAuthenticated = await client.isAuthenticated()\r\n setIsAuthenticated(isAuthenticated)\r\n\r\n if (isAuthenticated) {\r\n const user = await client.getUser()\r\n setUser(user)\r\n }\r\n\r\n setLoading(false)\r\n }\r\n initAuth0()\r\n // eslint-disable-next-line\r\n }, [])\r\n\r\n const loginWithPopup = async (params = {}) => {\r\n setPopupOpen(true)\r\n try {\r\n await auth0Client.loginWithPopup(params)\r\n } catch (error) {\r\n console.error(error)\r\n } finally {\r\n setPopupOpen(false)\r\n }\r\n const user = await auth0Client.getUser()\r\n setUser(user)\r\n setIsAuthenticated(true)\r\n }\r\n\r\n const handleRedirectCallback = async () => {\r\n setLoading(true)\r\n await auth0Client.handleRedirectCallback()\r\n const user = await auth0Client.getUser()\r\n setLoading(false)\r\n setIsAuthenticated(true)\r\n setUser(user)\r\n }\r\n return (\r\n auth0Client.getIdTokenClaims(...p),\r\n loginWithRedirect: (...p) => auth0Client.loginWithRedirect(...p),\r\n getTokenWithPopup: (...p) => auth0Client.getTokenWithPopup(...p),\r\n getTokenSilently: (...p) => auth0Client.getTokenSilently(...p),\r\n logout: (...p) => auth0Client.logout(...p)\r\n }}\r\n >\r\n {children}\r\n \r\n )\r\n}","/* ================================================================ */\r\n// DATA ACTIONS - Mapping | Mapping.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport 'dotenv/config';\r\nimport PropTypes from 'prop-types';\r\n// Constants\r\nimport {LoadingTypes, VisEngineTypes} from '@myglobe/core/dist/types';\r\nimport {getMissingIds, getLayersById, getStatesById} from '../../selectors/Data';\r\n// Auth\r\n//import { Auth0Context } from '../../react-auth0-wrapper';\r\n// Data Action Helpers\r\nimport {indexes, callAPI, addData, mappify} from '.';\r\nimport {fetchDatasets} from './Datasets';\r\nimport {updateDeckLayerClasses} from '../Map';\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\nexport const FETCH_LAYERS = 'FETCH_LAYERS';\r\nexport const FETCH_LAYERS_FAILURE = 'FETCH_LAYERS_FAILURE';\r\nexport const FETCH_LAYERS_SUCCESS = 'FETCH_LAYERS_SUCCESS';\r\nexport const FETCH_STATES = 'FETCH_STATES';\r\nexport const FETCH_STATES_FAILURE = 'FETCH_STATES_FAILURE';\r\nexport const FETCH_STATES_SUCCESS = 'FETCH_STATES_SUCCESS';\r\n\r\n/*\r\nString.prototype.parseFunction = function () {\r\n var funcReg = /function *\\(([^()]*)\\)[ \\n\\t]*{(.*)}/gmi;\r\n var match = funcReg.exec(this.replace(/\\n/g, ' '));\r\n if(match) {\r\n return new Function(match[1].split(','), match[2]);\r\n }\r\n return null;\r\n};\r\n*/\r\n/* ========================================== */\r\n// Action Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Fetch Layers\r\n * ------------\r\n * Fetches given layer Ids according to load mode\r\n * either from comparisons against the current state\r\n * or a simple bulk update\r\n *\r\n * @param {array} layerIDs\r\n */\r\nexport function fetchLayers(layerIDs) {\r\n return(dispatch, getState) => {\r\n dispatch({type: FETCH_LAYERS});\r\n\r\n var fetchLayerIDs = layerIDs;\r\n // Check loading mode\r\n if(process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Check for already loaded layers\r\n const currentLayerIds = getLayersById(getState());\r\n // Check all layer ids are present in loaded layers\r\n const loadedLayerIDs = layerIDs.filter(id=>currentLayerIds.includes(id));\r\n // Find missing layers and set specific fetch request ids\r\n fetchLayerIDs = layerIDs.filter(id=>!loadedLayerIDs.includes(id));\r\n }\r\n\r\n // External Endpoint Fetch\r\n if(fetchLayerIDs.length > 0) {\r\n let query = '{';\r\n fetchLayerIDs.forEach((id, i)=>query += `layer${i}: visLayerById(id: \"${id}\") {\r\n uuid: id\r\n name\r\n type\r\n config\r\n globeId\r\n dataset: datasetByDatasetId {\r\n id\r\n name\r\n }\r\n lastUpdated\r\n }\\n`);\r\n query+='}';\r\n\r\n return callAPI(query)\r\n .then(response=>{\r\n const {data} = response;\r\n let datasetMap = {};\r\n const formattedData = Object.values(data).map(layer=>{\r\n let dataset = layer.dataset;\r\n if(dataset) {\r\n datasetMap[dataset.name] = dataset.id;\r\n dataset = dataset.name;\r\n }\r\n const config = layer.config || null;\r\n // Fix functions\r\n /*Object.keys(config).forEach(key=>{\r\n const value = config[key];\r\n if (/(\\w+\\s?=>[^\\n]+)|(function\\([\\w\\s\\,]+\\)\\s?\\{[^\\n]+\\})/.test(value))\r\n config[key] = eval(`(${value})`);\r\n });*/\r\n const formattedLayer = {\r\n ...layer,\r\n dataset,\r\n config\r\n };\r\n return formattedLayer;\r\n });\r\n const payload = mappify(indexes.layer, formattedData);\r\n\r\n // Get all dataset IDs\r\n const datasetIds = [...new Set(Object.values(payload).map(state=>state.dataset))];\r\n // Find missing datasets\r\n const getUnloadedIds = getMissingIds('datasets', datasetIds);\r\n const missingDatasets = getUnloadedIds(getState());\r\n const missingDatasetUUIDs = missingDatasets.map(id=>datasetMap[id]);\r\n console.debug('Data > Mapping (Actions) | ', 'fetchLayers -', 'missingDatasets:', missingDatasets, 'missingDatasetUUIDs:', missingDatasetUUIDs);\r\n // Fetch missing datasets if required\r\n if (missingDatasetUUIDs.length > 0)\r\n dispatch(fetchDatasets(missingDatasetUUIDs));\r\n\r\n // Add new layers to data state\r\n dispatch(addData('layers', payload));\r\n\r\n // Get deck layers and process required layer class types\r\n const deckLayerClasses = formattedData.filter(layer=>layer.type === VisEngineTypes.DECKGL).map(layer=>layer.config?.type);\r\n console.debug('Data > Mapping (Actions) | ', 'fetchLayers -', 'formattedData:', formattedData, 'deckLayerClasses:', deckLayerClasses);\r\n if(deckLayerClasses.length > 0)\r\n dispatch(updateDeckLayerClasses(deckLayerClasses));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({type: FETCH_LAYERS_SUCCESS});\r\n })\r\n .catch(error=>{\r\n console.warn(error);\r\n dispatch({type: FETCH_LAYERS_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchLayers.propTypes = {\r\n layerIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Fetch States\r\n * ------------\r\n * Checks the Data state for preloaded states\r\n * matching the provided stateIDs argument\r\n * and loads any missing states from the DB\r\n *\r\n * @param {array} stateIDs\r\n */\r\nexport function fetchStates(stateIDs) {\r\n return(dispatch, getState) => {\r\n dispatch({type: FETCH_STATES, states: stateIDs});\r\n\r\n var fetchStateIds = stateIDs;\r\n // Check loading mode\r\n if(process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Get current state ids\r\n const currentStateIds = getStatesById(getState());\r\n // Check all state ids are present in loaded states\r\n const loadedStateIDs = stateIDs.filter(id=>currentStateIds.includes(id));\r\n // Remaining States Check\r\n fetchStateIds = stateIDs.filter(id=>!loadedStateIDs.includes(id));\r\n }\r\n\r\n // External Endpoint Fetch\r\n if(fetchStateIds.length > 0) {\r\n let query = '{';\r\n fetchStateIds.forEach((id, i)=>query += `state${i}: visState(id: \"${id}\") {\r\n uuid: id\r\n name\r\n mapStyle\r\n viewState\r\n layers: stateLayersByStateId {\r\n nodes {\r\n layer {\r\n id\r\n name\r\n }\r\n }\r\n }\r\n }\\n`);\r\n query+='}';\r\n\r\n return callAPI(query)\r\n .then(response=>{\r\n const {data} = response;\r\n let layerMap = {};\r\n const payload = Object.values(data).reduce((map, obj) => {\r\n // Format object layer names into simple array structure\r\n console.debug('Data > Mapping (Actions) | ', 'fetchStates -', 'obj.layers:', obj.layers);\r\n const formattedObj = {\r\n ...obj,\r\n //viewState: JSON.parse(obj.viewState),\r\n layers: obj.layers.nodes.map(layerNode=>{\r\n const index = layerNode.layer[indexes.layer];\r\n // Store UUID of layer to layer index in map\r\n layerMap[index] = layerNode.layer.id;\r\n return index;\r\n })\r\n };\r\n map[obj.name] = formattedObj;\r\n return map;\r\n }, {});\r\n\r\n // Get all layers used in states as flat set\r\n const layerIDs = [...new Set(Object.values(payload).map(state=>state.layers).flat())];\r\n // Get missing layer indexes from current state\r\n const getUnloadedIds = getMissingIds('layers', layerIDs);\r\n const missingLayers = getUnloadedIds(getState());\r\n // Get missing layer uuids for fetch and fetch layers from api\r\n const missingLayerUUIDs = missingLayers.map(id=>layerMap[id]);\r\n console.debug('MISSING LAYERS', missingLayers, missingLayerUUIDs);\r\n if (missingLayerUUIDs.length > 0)\r\n dispatch(fetchLayers(missingLayerUUIDs));\r\n\r\n dispatch(addData('states', payload));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({type: FETCH_STATES_SUCCESS});\r\n })\r\n .catch(error=>{\r\n console.warn(error);\r\n dispatch({type: FETCH_STATES_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchStates.propTypes = {\r\n stateIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};","/* ================================================================ */\r\n// DATA ACTIONS - Datasets | Datasets.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport 'dotenv/config';\r\nimport PropTypes from 'prop-types';\r\n// LoadersGL\r\nimport {registerLoaders, _selectLoader, load} from '@loaders.gl/core';\r\nimport {Tiles3DLoader} from '@loaders.gl/3d-tiles';\r\nimport {CSVLoader} from '@loaders.gl/csv';\r\nimport {ZipLoader} from '@loaders.gl/zip';\r\n// Selectors\r\nimport {getDatasetsById} from '../../selectors/Data';\r\n// Helpers\r\nimport {callAPI, callEditCSV, callUploadMedia, addData, mappify} from '.';\r\n// Constants\r\nimport {LoadingTypes, DatasetTypes} from '@myglobe/core/dist/types';\r\nregisterLoaders([Tiles3DLoader, CSVLoader, ZipLoader]);\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\n// > Datasets Data\r\nexport const FETCH_DATASETS = 'FETCH_DATASETS';\r\nexport const FETCH_DATASETS_FAILURE = 'FETCH_DATASETS_FAILURE';\r\nexport const FETCH_DATASETS_SUCCESS = 'FETCH_DATASETS_SUCCESS';\r\n\r\nexport const UPDATE_DATASET = 'UDATE_DATASET';\r\nexport const UPDATE_DATASET_FAILURE = 'UDATE_DATASET_FAILURE';\r\nexport const UPDATE_DATASET_SUCCESS = 'UDATE_DATASET_SUCCESS';\r\n\r\nexport const UPLOAD_MEDIA = 'UPLOAD_MEDIA';\r\nexport const UPLOAD_MEDIA_FAILURE = 'UPLOAD_MEDIA_FAILURE';\r\nexport const UPLOAD_MEDIA_SUCCESS = 'UPLOAD_MEDIA_SUCCESS';\r\n/* ========================================== */\r\n// Action Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Fetch Datasets\r\n * --------------\r\n * Retrieves datasets by uuid from the myglobe api\r\n * \r\n * @param {array} datasetIDs dataset uuids to fetch \r\n */\r\nexport function fetchDatasets(datasetIDs) {\r\n return (dispatch, getState) => {\r\n dispatch({type: FETCH_DATASETS});\r\n var fetchDatasetIDs = datasetIDs;\r\n // Check loading mode\r\n if(process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Check for already loaded layers \r\n const currentDatasetIDs = getDatasetsById(getState());\r\n // Check all layer ids are present in loaded layers\r\n const loadedDatasetIDs = datasetIDs.filter(id=>currentDatasetIDs.includes(id));\r\n // Find missing layers and set specific fetch request ids\r\n fetchDatasetIDs = datasetIDs.filter(id=>(id && !loadedDatasetIDs.includes(id)));\r\n console.debug('Data > Datasets (Actions) | ', 'fetchDatasets -', 'currentDatasetIDs:', currentDatasetIDs, 'loadedDatasetIDs:', loadedDatasetIDs, 'datasetsToFetch:', fetchDatasetIDs);\r\n }\r\n // External Endpoint Fetch\r\n if(fetchDatasetIDs.length > 0) {\r\n let query = '{';\r\n fetchDatasetIDs.forEach((id, i)=>query += `dataset${i}: datasetById(id: \"${id}\") {\r\n id\r\n name\r\n type\r\n endpoint\r\n geoId\r\n lastUpdated\r\n config\r\n }\\n`);\r\n query+='}';\r\n \r\n return callAPI(query)\r\n .then(response=>{\r\n const {data} = response;\r\n console.debug('Data > Datasets (Actions) | ', 'fetchDatasets -', 'response data:', data); \r\n // Get all datasets with endpoint data resolved\r\n const formattedData = Promise.all(Object.values(data).map(async item => {\r\n console.debug('Data > Datasets (Actions) | ', 'fetchDatasets -', 'data item:', item);\r\n const endpointData = await fetchEndpointData(item.endpoint);\r\n const config = JSON.parse(item.config);\r\n return {\r\n ...item,\r\n endpointData,\r\n config\r\n };\r\n }));\r\n // Add datasets to hashmap after all datasets have been retrieved\r\n formattedData.then(retrievedData=>{\r\n const payload = mappify('name', retrievedData);\r\n dispatch(addData('datasets', payload));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({type: FETCH_DATASETS_SUCCESS});\r\n });\r\n })\r\n .catch(error=>{\r\n console.warn('Data > Datasets (Actions) | ', 'fetchDatasets -', error);\r\n dispatch({type: FETCH_DATASETS_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchDatasets.propTypes = {\r\n datasetIds: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Get Endpoints Data\r\n * ------------------\r\n * Retrieves all data for a given \r\n * array of dataset endpoints\r\n * \r\n * @param {array} endpoints endpoint urls \r\n */\r\nexport async function getEndpointsData(endpoints) {\r\n return Promise.all(endpoints.map(async endpoint=>await fetchEndpointData(endpoint)));\r\n}\r\ngetEndpointsData.propTypes = {\r\n endpoints: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Fetch Endpoint Data\r\n * -------------------\r\n * Handles loader selection according to endpoint filetype\r\n * and returns the data \r\n * \r\n * @param {string} endpoint url endpoint to external or internal files\r\n */\r\nexport async function fetchEndpointData(endpoint) {\r\n // Select appropriate loader according to endpoint file type\r\n const loader = _selectLoader(null, endpoint);\r\n const endpointData = await load(endpoint, loader);\r\n return endpointData;\r\n}\r\nfetchEndpointData.propTypes = {\r\n endpoint: PropTypes.string.isRequired\r\n};\r\n\r\n/* ========================================== */\r\n/**\r\n * Upload Dataset\r\n * -------------------\r\n * Send the endpoint and\r\n * and the modified data\r\n * \r\n * @param {string} datasetID url endpoint to external or internal files\r\n * @param {array} dataset the modified dataset\r\n */\r\nexport function updateDataset(endpoint, dataset) {\r\n // Select appropriate loader according to endpoint file type\r\n // const loader = _selectLoader(null, endpoint);\r\n // const endpointData = await load(endpoint, loader);\r\n // return endpointData;\r\n console.log(\"Updating\",dataset);\r\n // convert back to csv\r\n\r\n // const query = \r\n // return callAPI(query)\r\n // .then(response=>{\r\n // const dataSuccess = await ();\r\n return (dispatch, getState) => {\r\n dispatch({type: UPDATE_DATASET});\r\n return callEditCSV({dataset,endpoint}).then(response=>{console.log(response);})\r\n .then(response=>{\r\n console.log(response);\r\n dispatch({type: UPDATE_DATASET_SUCCESS});\r\n });\r\n }\r\n //return callEditCSV({dataset,endpoint}).then(response=>{console.log(response);});\r\n}\r\nupdateDataset.propTypes = {\r\n datasetID: PropTypes.string.isRequired,\r\n dataset: PropTypes.array.isRequired,\r\n};\r\n\r\n/* ========================================== */\r\n/**\r\n * Upload Image\r\n * -------------------\r\n * Send the file and get back the\r\n * path & file data\r\n * \r\n * @param {File} file url endpoint to external or internal files\r\n */\r\nexport function uploadMedia(file) {\r\n // Select appropriate loader according to endpoint file type\r\n // const loader = _selectLoader(null, endpoint);\r\n // const endpointData = await load(endpoint, loader);\r\n // return endpointData;\r\n console.log(\"uploading\",file);\r\n // convert back to csv\r\n\r\n // const query = \r\n // return callAPI(query)\r\n // .then(response=>{\r\n // const dataSuccess = await ();\r\n return (dispatch, getState) => {\r\n dispatch({type: UPLOAD_MEDIA});\r\n return callUploadMedia(file)\r\n .then(response=>{\r\n console.log('trigger here',response);\r\n if(response.status!=200) {\r\n console.log(response)\r\n //temp\r\n //dispatch({type: UPLOAD_MEDIA_SUCCESS, payload:'foo.jpg'});\r\n dispatch({type: UPLOAD_MEDIA_FAILURE, error:response.error, payload:response.status });\r\n } else { \r\n dispatch({type: UPLOAD_MEDIA_SUCCESS, payload:response.data.name});\r\n }\r\n })\r\n .catch(error=>{\r\n console.warn('Data > Datasets (Actions) | ', 'uploadMedia -', error);\r\n dispatch({type: UPLOAD_MEDIA_FAILURE, error, payload:500 });\r\n });;\r\n }\r\n //return callEditCSV({dataset,endpoint}).then(response=>{console.log(response);});\r\n}\r\nuploadMedia.propTypes = {\r\n file: PropTypes.object.isRequired\r\n};","module.exports = Cesium;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = usePrevious;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction usePrevious(value) {\n var prev = (0, _react.useRef)(null);\n (0, _react.useEffect)(function () {\n prev.current = value;\n });\n return prev.current;\n}\n\nusePrevious.propTypes = {\n value: _propTypes[\"default\"].any\n};\nusePrevious[\"default\"] = {\n value: null\n};","/* ================================================================ */\r\n// DATA ACTIONS | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport 'dotenv/config';\r\nimport PropTypes from 'prop-types';\r\nimport axios from 'axios';\r\nimport WebFont from 'webfontloader';\r\n// Auth0\r\nimport { getTokenSilently } from '../../auth0/auth0';\r\n// Constants\r\nimport { LoadingTypes, VisualisationTypes, PolygonLayer, LineLayer, PointLayer, ImageLayer } from '@myglobe/core/dist/types';\r\nimport { updateMapConfig } from '../Map';\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\n// ----- EXTERNAL STATE ACTIONS -----\r\n// > Story Data\r\nimport * as Content from './Content';\r\nexport { Content };\r\n// > Mapping Data\r\nimport * as Mapping from './Mapping';\r\nexport { Mapping };\r\n// > Dataset Data\r\nimport * as Datasets from './Datasets';\r\nexport { Datasets };\r\n// ----- FETCH DATASETS -----\r\n// > First Fetch (Globe and All)\r\nexport const FETCH_INIT = 'FETCH_INIT';\r\nexport const FETCH_INIT_FAILURE = 'FETCH_INIT_FAILURE';\r\nexport const FETCH_INIT_SUCCESS = 'FETCH_INIT_SUCCESS';\r\n// > Globe Config Data\r\nexport const FETCH_GLOBE = 'FETCH_GLOBE';\r\nexport const FETCH_GLOBE_FAILURE = 'FETCH_GLOBE_FAILURE';\r\nexport const FETCH_GLOBE_SUCCESS = 'FETCH_GLOBE_SUCCESS';\r\n// ----- MUTATE DATASETS -----\r\nexport const ADD_DATA_ITEM = 'ADD_DATA_ITEM';\r\nexport const ADD_DATA_HASHMAP = 'ADD_DATA_HASHMAP';\r\nexport const ADD_DATA_ARRAY = 'ADD_DATA_ARRAY';\r\nexport const UPDATE_DATA_ITEM = 'UPDATE_DATA_ITEM';\r\nexport const REMOVE_DATA_ITEM = 'REMOVE_DATA_ITEM';\r\n/* ========================================== */\r\n// Data Indexes\r\n/* ========================================== */\r\nexport const indexes = {\r\n layer: 'name',\r\n state: 'name',\r\n page: 'slug',\r\n story: 'slug',\r\n panel: 'slug',\r\n datasets: 'name'\r\n};\r\n/* ========================================== */\r\n// Helper Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Mappify\r\n * -------\r\n * Transforms node array into a map by\r\n * indexing with the given key index\r\n *\r\n * @param {string} keyIndex index id to use as map key\r\n * @param {array} array array to convert\r\n * @param {array} keyPrefixes additional keys to prefix key id with\r\n */\r\nexport function mappify(keyIndex, array, keyPrefixes) {\r\n console.debug('Data (Actions) | ', 'mappify -', 'keyIndex:', keyIndex, 'array:', array, 'keyPrefixes', keyPrefixes);\r\n return array.reduce((map, obj, index) => {\r\n // Format object layer names into simple array structure\r\n const key = keyPrefixes && keyPrefixes[index] ? `${keyPrefixes[index]}:${obj[keyIndex]}` : obj[keyIndex];\r\n map[key] = obj;\r\n return map;\r\n }, {});\r\n}\r\n/* ========================================== */\r\n// API Functions\r\n/* ========================================== */\r\n//const { getTokenSilently } = useAuth0();\r\n/*\r\n\r\n { props => /* custom components */ /*}\r\n*/\r\nexport const callAPI = async (query, variables) => {\r\n try {\r\n //var token = await this.getTokenSilently();\r\n const response = await fetch(process.env.LOCAL_API + '/graphql' || 'https://api.myglobe.app/graphql', {\r\n headers: {\r\n //Authorization: `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({ query: query, variables })\r\n });\r\n console.debug('Data (Actions) | ', 'callAPI - ', 'responseData:', responseData);\r\n const responseData = await response.json();\r\n return responseData;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n};\r\nexport const callAPISecurely = async (query, variables) => {\r\n var token = await getTokenSilently();\r\n try {\r\n const response = await fetch(process.env.LOCAL_API + '/graphql' || 'https://api.myglobe.app/graphql', {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({ query, variables })\r\n });\r\n console.debug('Data (Actions) | ', 'callAPISecurely - ', 'responseData:', responseData);\r\n const responseData = await response.json();\r\n return responseData;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n};\r\n// temp - move to postgraphile using custom schema plugins\r\nexport const callEditCSV = async (query) => {\r\n try {\r\n //var token = await this.getTokenSilently();\r\n const response = await fetch(process.env.LOCAL_API + '/editcsv' || 'https://api.myglobe.app/editcsv', {\r\n headers: {\r\n //Authorization: `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify(query)\r\n });\r\n console.debug('Data (Actions) | ', 'callEditCSV - ', 'responseData:', responseData);\r\n const responseData = await response.json();\r\n return responseData;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n};\r\n\r\nexport const callUploadMedia = async (file) => {\r\n console.log('calluploadmedia');\r\n\r\n //var token = await this.getTokenSilently();\r\n try {\r\n var data = new FormData();\r\n data.append('file', file);\r\n const response = await fetch(process.env.LOCAL_API + '/uploadmedia' || 'https://api.myglobe.app/uploadmedia', {\r\n headers: {\r\n //Authorization: `Bearer ${token}`,\r\n },\r\n method: 'POST',\r\n body: data\r\n });\r\n const responseData = await response.json();\r\n return { ...responseData, ...{ status: response.status } };\r\n } catch (err) {\r\n return err;\r\n }\r\n\r\n};\r\n/* ========================================== */\r\n// DATASET Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Add Data\r\n * --------\r\n * Inserts data in either a bulk array format or\r\n * single data item to a given dataset's state\r\n *\r\n * @param {string} datasetID dataset's state id\r\n * @param {array || object} incomingData array or data item\r\n */\r\nexport function addData(datasetID, incomingData) {\r\n return (dispatch) => {\r\n if (Array.isArray(incomingData)) {\r\n // Incoming Data = [{},{},...]\r\n dispatch({ type: ADD_DATA_ARRAY, datasetID, payload: incomingData });\r\n } else if (typeof incomingData === 'object' && Object.keys(incomingData).includes('id')) {\r\n // Incoming Data = {id: '', data:{}|[]}\r\n // NOTE: single insertions do not override existing data and will return the same state (use UPDATE_DATA_ITEM)\r\n dispatch({ type: ADD_DATA_ITEM, datasetID, itemID: incomingData.id, payload: incomingData });\r\n } else if (typeof incomingData === 'object') {\r\n // Incoming Data = {[id]:{},[id2]:{},...}\r\n // NOTE: bulk insertions override data that currently exists\r\n dispatch({ type: ADD_DATA_HASHMAP, datasetID, payload: incomingData });\r\n }\r\n };\r\n}\r\naddData.propTypes = {\r\n datasetID: PropTypes.string.isRequired,\r\n incomingData: PropTypes.oneOf([\r\n PropTypes.object,\r\n PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n data: PropTypes.oneOf([PropTypes.object, PropTypes.array]).isRequired\r\n }),\r\n PropTypes.arrayOf(\r\n PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n data: PropTypes.arrayOf(PropTypes.oneOf([PropTypes.object, PropTypes.array])).isRequired\r\n })\r\n )\r\n ]).isRequired\r\n};\r\n/* ========================================== */\r\n// FETCH Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Fetch Init\r\n * ----------\r\n * Fetches all globe data on first load\r\n *\r\n * @param {string} globeName globe name identifier\r\n */\r\nexport function fetchInit(globeName) {\r\n return (dispatch) => {\r\n dispatch({ type: FETCH_INIT });\r\n // First fetch for globe query\r\n const query = `{\r\n globes(condition: {name: \"${globeName}\"}, first: 1) {\r\n nodes {\r\n id\r\n defaultState\r\n mapboxToken\r\n lastUpdated\r\n config\r\n name\r\n title\r\n pages {\r\n nodes {\r\n uuid: id\r\n name\r\n slug\r\n type\r\n content\r\n style\r\n }\r\n }\r\n datasets {\r\n nodes {\r\n uuid: id\r\n name\r\n type\r\n endpoint\r\n geoId\r\n }\r\n }\r\n stories {\r\n nodes {\r\n uuid: id\r\n slug\r\n title\r\n storyPanels {\r\n nodes {\r\n panel {\r\n slug\r\n uuid: id\r\n position\r\n sections\r\n state {\r\n name\r\n }\r\n title\r\n type\r\n interactions\r\n background\r\n }\r\n }\r\n }\r\n }\r\n }\r\n visStates {\r\n nodes {\r\n uuid: id\r\n name\r\n mapStyle\r\n viewState\r\n layers: stateLayersByStateId {\r\n nodes {\r\n layer {\r\n name\r\n }\r\n }\r\n }\r\n }\r\n }\r\n visLayers {\r\n nodes {\r\n name\r\n type\r\n uuid: id\r\n lastUpdated\r\n dataset {\r\n name\r\n }\r\n }\r\n }\r\n email\r\n account: accountByAccount {\r\n mapboxToken\r\n mapboxId \r\n }\r\n }\r\n }\r\n }`;\r\n\r\n return callAPI(query)\r\n .then(response => {\r\n const { data } = response;\r\n const globeData = data.globes.nodes[0];\r\n\r\n // Get Globe Data\r\n const globePayload = {\r\n uuid: globeData.id,\r\n defaultState: globeData.defaultState,\r\n mapboxToken: globeData.mapboxToken,\r\n mapboxUserId: globeData.owner.mapboxUserId,\r\n owner: globeData.owner.name,\r\n config: globeData.config,\r\n name: globeData.name,\r\n title: globeData.title,\r\n lastUpdated: globeData.lastUpdated\r\n };\r\n\r\n const testStateIds = globeData.states.nodes.map(stateNode => stateNode.uuid);\r\n dispatch(Mapping.fetchStates(testStateIds));\r\n\r\n dispatch(updateMapConfig(globePayload));\r\n dispatch({ type: FETCH_GLOBE_SUCCESS, payload: globePayload });\r\n\r\n // Get Globe Pages\r\n const pages = globeData.pages.nodes;\r\n const pagesPayload = mappify(indexes['page'], Object.values(pages));\r\n dispatch(addData('pages', pagesPayload));\r\n dispatch({ type: Content.FETCH_PAGES_SUCCESS });\r\n\r\n // Get Globe Datasets\r\n const getDatasets = Promise.all(globeData.datasets.nodes.map(async datasetNode => {\r\n const { uuid, name, type, endpoint, geoId, lastUpdated } = datasetNode;\r\n console.debug('Data (Actions) | ', 'fetchInit -', 'datasetNode:', datasetNode);\r\n // Fetch Dataset Endpoint Data\r\n const endpointData = await Datasets.fetchEndpointData(endpoint);\r\n return { uuid, name, type, endpoint, geoId, lastUpdated, endpointData };\r\n }) || []);\r\n getDatasets.then(datasets => {\r\n console.debug('Data (Actions) | ', 'fetchInit -', 'datasets:', datasets);\r\n const datasetsPayload = mappify(indexes['datasets'], Object.values(datasets));\r\n dispatch(addData('datasets', datasetsPayload));\r\n dispatch({ type: Datasets.FETCH_DATASETS_SUCCESS });\r\n });\r\n\r\n // Get Globe Stories\r\n const stories = globeData.stories.nodes.map(storyNode => {\r\n const { uuid, slug, title } = storyNode;\r\n // Get array of panel slugs\r\n const panels = storyNode.panels.nodes.map(panelNode => `${storyNode.slug}:${panelNode.panel.slug}`);\r\n return { uuid, slug, title, panels };\r\n });\r\n const storiesPayload = mappify(indexes['story'], Object.values(stories));\r\n dispatch(addData('stories', storiesPayload));\r\n dispatch({ type: Content.FETCH_STORIES_SUCCESS, payload: storiesPayload });\r\n\r\n // Get Globe Panels\r\n let panelStorySlugs = [];\r\n const panels = globeData.stories.nodes.map(storyNode => storyNode.panels.nodes.map(panel => {\r\n // Add Story Slug to panel sequence\r\n panelStorySlugs.push(storyNode.slug);\r\n return {\r\n ...panel.panel,\r\n state: panel.panel.state.name,\r\n sections: panel.panel.sections\r\n };\r\n })).flat();\r\n const panelsPayload = mappify(indexes['panel'], panels, Object.values(panelStorySlugs));\r\n dispatch(addData('panels', panelsPayload));\r\n dispatch({ type: Content.FETCH_PANELS_SUCCESS });\r\n\r\n // Get Globe States\r\n const states = globeData.states.nodes.map(stateNode => {\r\n const { uuid, name, mapStyle } = stateNode;\r\n // Get array of layer names\r\n const layers = stateNode.layers.nodes.map(layer => {\r\n return layer.layer.name;\r\n });\r\n return { uuid, name, mapStyle, layers };\r\n });\r\n const statesPayload = mappify(indexes['state'], Object.values(states));\r\n dispatch(addData('states', statesPayload));\r\n dispatch({ type: Mapping.FETCH_STATES_SUCCESS });\r\n\r\n // Get Globe Layers\r\n const layers = globeData.layers.nodes.map(layerNode => {\r\n const { uuid, name, type, style, lastUpdated } = layerNode;\r\n const dataset = layerNode.dataset ? layerNode.dataset.name : null;\r\n return { uuid, name, type, style, lastUpdated, dataset };\r\n });\r\n const layersPayload = mappify(indexes['layer'], Object.values(layers));\r\n dispatch(addData('layers', layersPayload));\r\n dispatch({ type: Mapping.FETCH_LAYERS_SUCCESS });\r\n })\r\n .catch(error => {\r\n console.warn(error);\r\n dispatch({ type: FETCH_INIT_FAILURE, error });\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Fetch Globe\r\n * -----------\r\n * Retrieves the globe instance config and default\r\n * state\r\n *\r\n * @param {string} globeName globe uri name (subdomain)\r\n */\r\nexport function fetchGlobe(globeName) {\r\n console.log(globeName);\r\n return (dispatch) => {\r\n dispatch({ type: FETCH_GLOBE });\r\n // Fetch Globe\r\n const query = `{\r\n globes(condition: {name: \"${globeName}\"}, first: 1) {\r\n nodes {\r\n uuid: id\r\n defaultState: visStates(condition: {name: \"default\"}, first: 1) {\r\n nodes {\r\n uuid: id\r\n name\r\n }\r\n }\r\n mapboxToken\r\n lastUpdated\r\n config\r\n name\r\n title\r\n pages {\r\n nodes {\r\n uuid: id\r\n }\r\n }\r\n stories {\r\n nodes {\r\n uuid: id\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n return callAPI(query)\r\n .then(response => {\r\n const { data } = response;\r\n const globeData = data.globes.nodes[0];\r\n const defaultStateUUID = globeData.defaultState.nodes.map(node => node.uuid);\r\n const pageUUIDs = globeData.pages.nodes.map(node => node.uuid);\r\n const storyUUIDs = globeData.stories.nodes.map(node => node.uuid);\r\n const payload = {\r\n ...globeData,\r\n defaultState: globeData.defaultState.nodes[0].name,\r\n //config: JSON.parse(globeData.config)\r\n };\r\n if (payload.config.theme) {\r\n // Get WebFonts\r\n getFontsFromTheme(payload.config.theme);\r\n }\r\n dispatch(Mapping.fetchStates(defaultStateUUID));\r\n dispatch(Content.fetchPages(pageUUIDs));\r\n dispatch(Content.fetchStories(storyUUIDs));\r\n dispatch({ type: FETCH_GLOBE_SUCCESS, payload });\r\n })\r\n .catch(error => {\r\n console.warn(error);\r\n dispatch({ type: FETCH_GLOBE_FAILURE, error });\r\n });\r\n };\r\n}\r\nfunction getFontsFromTheme(theme) {\r\n const typography = theme.typography || {};\r\n let fontFamilies = {};\r\n let rootFontFamilies = typography.fontFamily?.match(/\\w[\\w\\s-]+/g);\r\n let fontWeight = typography.fontWeight || 'normal';\r\n rootFontFamilies?.forEach(fontFamily => {\r\n if (Object.prototype.hasOwnProperty.call(fontFamilies, fontFamily)) {\r\n fontFamilies[fontFamily].add(fontWeight);\r\n } else {\r\n fontFamilies[fontFamily] = new Set().add(fontWeight);\r\n }\r\n });\r\n Object.keys(typography).forEach(typographyKey => {\r\n let typographyItem = typography[typographyKey];\r\n if (typeof typographyItem === 'object' && typography[typographyKey].fontFamily) {\r\n console.debug('Data (Actions) | ', 'getFontsFromTheme -', 'typographyKey:', typographyKey, 'fontFamily:', typography[typographyKey].fontFamily);\r\n let elementFontFamilies = typography[typographyKey].fontFamily.match(/\\w[\\w\\s-]+/g);\r\n //let fontFamily = typography[typographyKey].fontFamily;\r\n let fontWeight = typography[typographyKey].fontWeight || 'normal';\r\n elementFontFamilies.forEach(fontFamily => {\r\n if (Object.prototype.hasOwnProperty.call(fontFamilies, fontFamily)) {\r\n fontFamilies[fontFamily].add(fontWeight);\r\n } else {\r\n fontFamilies[fontFamily] = new Set().add(fontWeight);\r\n }\r\n });\r\n }\r\n });\r\n const families = Object.keys(fontFamilies).map(fontFamily => {\r\n const fontWeights = Array.from(fontFamilies[fontFamily]).join(',');\r\n return `${fontFamily}:${fontWeights}`;\r\n });\r\n console.debug('Data (Actions) | ', 'getFontsFromTheme -', 'families:', families);\r\n WebFont.load({\r\n google: {\r\n families\r\n }\r\n });\r\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.VisualisationTypes = exports.ImageLayer = exports.PointLayer = exports.LineLayer = exports.PolygonLayer = exports.LoadingTypes = exports.ChartTypes = exports.LayerTypes = exports.VisEngineTypes = exports.GeoTypes = exports.DatasetTypes = exports.PageTypes = exports.MenuTypes = exports.NavigationTypes = exports.AlignmentTypes = exports.LayoutTypes = void 0;\nvar LayoutTypes = {\n GRID: 'grid',\n LAYERED: 'layered'\n};\nexports.LayoutTypes = LayoutTypes;\nvar AlignmentTypes = {\n LEFT: 'left',\n RIGHT: 'right',\n TOP: 'top',\n BOTTOM: 'bottom'\n};\nexports.AlignmentTypes = AlignmentTypes;\nvar NavigationTypes = {\n INLINE: 'inline',\n LAYERED: 'layered'\n};\nexports.NavigationTypes = NavigationTypes;\nvar MenuTypes = {\n TAB: 'tab',\n LIST: 'list',\n TIMELINE: 'timeline'\n};\nexports.MenuTypes = MenuTypes;\nvar PageTypes = {\n STATIC: 'static',\n STORY: 'story'\n};\nexports.PageTypes = PageTypes;\nvar DatasetTypes = {\n API: 'api',\n FILE: 'file',\n JSON: 'json',\n GEO: 'geo'\n};\nexports.DatasetTypes = DatasetTypes;\nvar GeoTypes = {};\nexports.GeoTypes = GeoTypes;\nvar VisEngineTypes = {\n MAPBOX: 'mapbox',\n DECKGL: 'deckgl',\n NIVO: 'nivo',\n AMCHARTS: 'amcharts'\n};\nexports.VisEngineTypes = VisEngineTypes;\nvar LayerTypes = {\n deckgl: {\n layers: ['ArcLayer', 'BitmapLayer', 'ColumnLayer', 'GeoJsonLayer', 'GridCellLayer', 'IconLayer', 'LineLayer', 'PathLayer', 'PointCloudLayer', 'PolygonLayer', 'ScatterplotLayer', 'SolidPolygonLayer', 'TextLayer'],\n aggregationLayers: ['ContourLayer', 'GridLayer', 'GPUGridLayer', 'CPUGridLayer', 'HexagonLayer', 'ScreenGridLayer', 'HeatmapLayer'],\n geoLayers: ['GreatCircleLayer', 'H3ClusterLayer', 'H3HexagonLayer', 'S2Layer', 'TileLayer', 'TripsLayer', 'TerrainLayer', 'MVTLayer'],\n custom: ['IconClusterLayer']\n }\n};\nexports.LayerTypes = LayerTypes;\nvar ChartTypes = {\n BAR: 'bar',\n PIE: 'pie',\n LINE: 'line',\n AREA: 'area',\n RADAR: 'radar'\n};\nexports.ChartTypes = ChartTypes;\nvar LoadingTypes = {\n BULK: 'init',\n SEQUENTIAL: 'sequential',\n ACTIVE: 'active'\n};\nexports.LoadingTypes = LoadingTypes;\nvar PolygonLayer = {\n 'type': 'polygonLayer',\n 'requiredColumns': ['geojson'],\n 'attributes': ['color', 'opacity', 'extruded']\n};\nexports.PolygonLayer = PolygonLayer;\nvar LineLayer = {\n 'type': 'lineLayer',\n 'requiredColumns': ['lat0', 'lng0', 'lat1', 'lng1'],\n 'attributes': ['color', 'opacity', 'strokewidth']\n};\nexports.LineLayer = LineLayer;\nvar PointLayer = {\n 'type': 'lineLayer',\n 'requiredColumns': ['lat', 'lng'],\n 'optionalColumns': ['altitude'],\n 'attributes': ['color', 'opacity', 'radius']\n};\nexports.PointLayer = PointLayer;\nvar ImageLayer = {\n 'type': 'imageLayer',\n 'requiredColumns': ['lat', 'lng', 'icon'],\n 'attributes': ['size']\n};\nexports.ImageLayer = ImageLayer;\nvar VisualisationTypes = [PolygonLayer, LineLayer, PointLayer, ImageLayer];\nexports.VisualisationTypes = VisualisationTypes;","/* ================================================================ */\r\n// DATA SELECTORS | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport createCachedSelector from 're-reselect';\r\nimport {createSelector} from 'reselect';\r\nimport PropTypes from 'prop-types';\r\n//import isEqual from 'lodash.isEqual';\r\n// Theme Setup\r\nimport {getTheme} from '@myglobe/core/dist/styles/theme';\r\nimport createMuiTheme from '@material-ui/core/styles/createMuiTheme';\r\n// Types\r\nimport {VisEngineTypes, PageTypes} from '@myglobe/core/dist/types';\r\nimport { isNullOrUndefined } from 'util';\r\n/* ========================================== */\r\n// LOADING\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Get Loading Status\r\n * ------------------\r\n * Determines current loading state either\r\n * by all keys within in the loading state\r\n * or according to a given specific loading key\r\n *\r\n * @param {object} store reducer store\r\n * @param {string} checkState loading key to check\r\n */\r\nexport const getLoadingStatusV2 = (checkState) => {\r\n return createSelector(\r\n store => store.Data.loading,\r\n (loading) => {\r\n return (checkState && !isNullOrUndefined(loading[checkState])) ? loading[checkState] : Object.values(loading).includes(true);\r\n }\r\n );\r\n};\r\nexport const getLoadingStatus = (store, checkState) => (checkState && store.Data.loading[checkState] !== null) ? store.Data.loading[checkState] : Object.values(store.Data.loading).includes(true);\r\nexport const getLoadingStatusSelector = statuses => {\r\n return createSelector(\r\n store=>store.Data.loading,\r\n (loading)=>{\r\n const loadingKeys = Object.keys(loading);\r\n const loadingValues = Object.values(loading);\r\n // Check all statuses exist\r\n if(statuses.every(status=>loadingKeys.includes(status))) {\r\n // Get combined loading state of all requested statuses\r\n // > Loading state is true if one status is found to be loading\r\n return statuses.some(status=>loading[status] === true);\r\n } else {\r\n // Universal loading (all loading statues)\r\n return loadingValues.includes(true);\r\n }\r\n }\r\n );\r\n};\r\ngetLoadingStatusSelector.propTypes = {\r\n statuses: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n// GENERIC\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Find Missing Ids\r\n * ----------------\r\n * Checks for existing ids within\r\n * a given dataset and returns an array of missing ids\r\n *\r\n * @param {object} dataset reducer state variable\r\n * @param {array} ids ids to check\r\n *\r\n * @return {array} array of missing ids\r\n */\r\nexport const getMissingIds = (datasetName, incomingIds) => {\r\n return createSelector(\r\n store=>store.Data[datasetName],\r\n //getLoadingStatusSelector([datasetName]),\r\n (dataset, /*isLoading*/) => {\r\n if(/*!isLoading && */dataset) {\r\n const datasetIds = dataset.byId;\r\n const missingIds = incomingIds.filter(incomingId=>!datasetIds.includes(incomingId));\r\n console.debug('Data (Selector) | ', 'getMissingIDs -', 'datasetIds:', datasetIds, 'incomingIds:', incomingIds, 'missingIds:', missingIds);\r\n return missingIds;\r\n } else return [];\r\n }\r\n );\r\n};\r\ngetMissingIds.propTypes = {\r\n datasetName: PropTypes.oneOf(['globe', 'pages', 'stories', 'panels', 'states', 'layers']).isRequired,\r\n incomingIds: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Find Missing Ids\r\n * ----------------\r\n * Checks for existing ids within\r\n * a given dataset and returns an array of related missing uuids\r\n *\r\n * @param {string} datasetName reducer state variable name in\r\n * generic dataset storage format\r\n * @param {object} incomingIds ids to search in map format of\r\n * `dataset index to database uuid {: uuid}\r\n * @return {array} array of missing uuids according to identified missing indexes\r\n */\r\nexport const getMissingUUIDs = (datasetName, incomingIds) => {\r\n return createSelector(\r\n store=>store.Data[datasetName],\r\n //getLoadingStatusSelector([datasetName]),\r\n (dataset, /*isLoading*/) => {\r\n if(/*!isLoading && */dataset) {\r\n // Dataset Ids (will be array if initialised, otherwise uninitialised state empty array fallback will trigger all missing values)\r\n const datasetIds = dataset.byId || [];\r\n const missingIds = Object.keys(incomingIds).filter(incomingId=>!datasetIds.includes(incomingId));\r\n const missingUUIDs = missingIds.map(id=>incomingIds[id]);\r\n console.debug('Data (Selector) | ', 'getMissingUUIDs -', 'datasetIds:', datasetIds, 'incomingIds:', incomingIds, 'missingIds:', missingIds, 'missingUUIDs:', missingUUIDs);\r\n return missingUUIDs;\r\n } else return [];\r\n }\r\n );\r\n};\r\ngetMissingUUIDs.propTypes = {\r\n datasetName: PropTypes.oneOf(['globe', 'pages', 'stories', 'panels', 'states', 'layers']).isRequired,\r\n incomingIds: PropTypes.object.isRequired//arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n// GLOBE\r\n/* ========================================== */\r\nexport const getGlobe = store => store.Data.globe;\r\nexport const getGlobeName = store => store.Data.globe.name;\r\nexport const getGlobeTitle = store => store.Data.globe.title;\r\nexport const getGlobeConfig = store => store.Data.globe.config;\r\nexport const getGlobeTheme = createSelector(\r\n getGlobeConfig,\r\n (globeConfig) => {\r\n const theme = globeConfig.theme || {};\r\n const type = (theme.type) ? theme.type : 'dark';\r\n const baseTheme = getTheme(type);\r\n const themeConfig = {...baseTheme, ...theme};\r\n return createMuiTheme(themeConfig);\r\n }\r\n);\r\nexport const getError = store => store.Data.error;\r\nexport const getDefaultState = store => store.Data.globe.defaultState;\r\n/* ========================================== */\r\n// DATASETS\r\n/* ========================================== */\r\nexport const getDatasetsById = store => store.Data.datasets.byId;\r\nexport const getDatasetsByHash = store => store.Data.datasets.byHash;\r\nexport const getDataset = (id) => {\r\n return createSelector(\r\n getDatasetsByHash,\r\n (datasetHash) => {\r\n return datasetHash[id] || null;\r\n }\r\n );\r\n};\r\n/* ========================================== */\r\n// LAYERS\r\n/* ========================================== */\r\nexport const getLayersById = store => store.Data.layers.byId;\r\nexport const getLayersByHash = store => store.Data.layers.byHash;\r\nexport const getLayersIdsByType = type => {\r\n return createSelector(\r\n getLayersById,\r\n getLayersByHash,\r\n (layerIds, layerHash) => {\r\n return layerIds.filter(layerId=>layerHash[layerId].type.toLowerCase() === type);\r\n }\r\n );\r\n};\r\ngetLayersIdsByType.propTypes = {\r\n type: PropTypes.oneOf(Object.values(VisEngineTypes))\r\n};\r\nexport const getLayersHashByType = type => {\r\n return createCachedSelector(\r\n getLayersById,\r\n getLayersByHash,\r\n (layerIds, layerHash) => {\r\n let layers = [];\r\n layerIds.forEach(layerId=>{\r\n if(layerHash[layerId].type.toLowerCase() === type)\r\n layers.push(layerHash[layerId]);\r\n });\r\n return layers;\r\n }\r\n )(\r\n (store, type)=>type\r\n );\r\n};\r\ngetLayersHashByType.propTypes = {\r\n type: PropTypes.oneOf(Object.values(VisEngineTypes))\r\n};\r\nexport const getFilteredLayers = layers => {\r\n return createSelector(\r\n getLayersById,\r\n getLayersByHash,\r\n (layerIds, layerHash)=>{\r\n const filteredLayers = layerIds.filter(layerId => layers.includes(layerId)).map(layerId=>layerHash[layerId]);\r\n return filteredLayers;\r\n }\r\n );\r\n};\r\n/* ========================================== */\r\n/**\r\n * Get Layer Id\r\n * ------------\r\n * Get layer id from existing list of ids\r\n * @param {string} id layer id to check\r\n */\r\nexport const getLayerId = (store, id) => store.Data.layers.byId.includes(id) ? id : null;\r\n/* ========================================== */\r\n/**\r\n * Get Layer\r\n * ---------\r\n * Retrieves layer has from a valid layer ID\r\n * @param {string} layerId layer id\r\n */\r\nexport const getLayer = createCachedSelector(\r\n getLayerId,\r\n getLayersByHash,\r\n getLoadingStatusSelector(['layers']),\r\n (layerId, layerHash, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getLayer -', 'layerId:', layerId, 'layerHash:', layerHash, 'isLoading:', isLoading);\r\n // Return corresponding layer hash according to existing layer id and loading status\r\n return (!isLoading && layerId) ? layerHash[layerId] : null;\r\n }\r\n)(\r\n (_store_, layerId)=>layerId\r\n);\r\ngetLayer.propTypes = {\r\n layerId: PropTypes.string.isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Get Deck Layer\r\n * --------------\r\n * Constructs a single layer json configuration based on\r\n * the provided layer id\r\n *\r\n * @param {string} layerId\r\n */\r\nexport const getDeckLayer = (layerId) => {\r\n return createSelector(\r\n getLayersHashByType('deckgl'),\r\n getDatasetsByHash,\r\n (deckLayersHash, datasetsHash) => {\r\n // Get Deck layer from deck layer only hash\r\n const deckLayer = deckLayersHash[layerId];\r\n if(deckLayer) {\r\n // Get json config and convert functions from string to function\r\n let config = deckLayer.config;\r\n const datasetId = deckLayer.dataset;\r\n // Get dataset endpoint data or endpoint fallback\r\n const data = (datasetsHash[datasetId]) ? datasetsHash[datasetId].endpointData || datasetsHash[datasetId].endpoint : null;\r\n config.data = data;\r\n return config;\r\n } else {\r\n return null;\r\n }\r\n }\r\n );\r\n};\r\ngetDeckLayer.propTypes = {\r\n layerId: PropTypes.string.isRequired,\r\n datasetId: PropTypes.string,\r\n};\r\nexport const getDeckLayers = (layers) => {\r\n return createSelector(\r\n layers.map(layerId=>getDeckLayer(layerId)),\r\n (deckLayers)=>deckLayers\r\n );\r\n};\r\n/*\r\nexport const getDeckConfig = (layers) => {\r\n return createSelector(\r\n layers.map(layer=>getDeckLayer(layer.id, layer.datasetId);\r\n )\r\n}\r\n*/\r\n/* ========================================== */\r\n// STATES\r\n/* ========================================== */\r\nexport const getStatesById = store => store.Data.states.byId;\r\nexport const getStatesByHash = store => store.Data.states.byHash;\r\nexport const getStatesFlatMap = createSelector(\r\n getStatesByHash,\r\n (statesHash) => {\r\n const flatMap = Object.values(statesHash).flatMap(x=>x);\r\n return flatMap;\r\n }\r\n);\r\n/* ========================================== */\r\n/**\r\n * Get State Id\r\n * ------------\r\n * Get state id from existing list of ids\r\n * @param {string} id state id to check\r\n */\r\nexport const getStateId = (store, id) => store.Data.states.byId.includes(id) ? id : null;\r\n/* ========================================== */\r\n/**\r\n * Get State\r\n * ---------\r\n * Retrieves a state from Data reducer\r\n * according to a given id\r\n *\r\n * @param {string} stateId id of state\r\n *\r\n * @returns {object} state object or null\r\n */\r\nexport const getState = createCachedSelector(\r\n getStateId,\r\n getStatesByHash,\r\n getLoadingStatusSelector(['states']),\r\n (stateId, stateHash, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getState -', 'stateId:', stateId, 'stateHash:', stateHash, 'isLoading:', isLoading);\r\n // Return corresponding state hash according to existing state id and loading status\r\n return (!isLoading && stateId) ? stateHash[stateId] : null;\r\n }\r\n)(\r\n (_store_, stateId)=>{console.log(stateId); return stateId;}\r\n);\r\n/*export const getState = stateId => {\r\n return createSelector(\r\n getStatesById,\r\n getStatesByHash,\r\n getLoadingStatusSelector(['states']),\r\n (stateIds, stateHash, isLoading) => {\r\n if(isLoading) {\r\n return null;\r\n } else if(stateIds.includes(stateId)) {\r\n return stateHash[stateId];\r\n } else {\r\n return null;\r\n }\r\n }\r\n );\r\n};*/\r\ngetState.propTypes = {\r\n stateId: PropTypes.string.isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Get Active States\r\n * -----------------\r\n * Retrieves the current active states deduced from\r\n * active panels of a given story ID (slug)\r\n *\r\n * @param {string} storyID story slug\r\n */\r\nexport const getActiveStates = createCachedSelector(\r\n (store, storyID)=>getActivePanels(store, storyID),\r\n getStatesById,\r\n getStatesByHash,\r\n getLoadingStatusSelector(['panels', 'states']),\r\n (panels, stateIds, stateHash, isLoading) => {\r\n if(isLoading) {\r\n return [];\r\n } else if(panels) {\r\n const states = panels.filter(panel=>stateIds.includes(panel.state)).map(panel=>stateHash[panel.state]);\r\n console.debug('getActiveStates', states);\r\n return states;\r\n } else {\r\n return [];\r\n }\r\n }\r\n)(\r\n (_store_, storyId)=>`${storyId}_states`\r\n);\r\ngetActiveStates.propTypes = {\r\n storyID: PropTypes.string.isRequired\r\n};\r\n/* ========================================== */\r\n// PAGES\r\n/* ========================================== */\r\nexport const getPagesById = store => store.Data.pages.byId;\r\nexport const getPagesByHash = store => store.Data.pages.byHash;\r\nexport const getPageId = (store, id) => store.Data.pages.byId.includes(id) ? id : null;\r\nexport const getPage = createCachedSelector(\r\n getPageId,\r\n getPagesByHash,\r\n getLoadingStatusSelector(['pages']),\r\n (pageId, pageHash, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getPage -', 'pageId:', pageId, 'pageHash:', pageHash, 'isLoading:', isLoading);\r\n // Return corresponding page hash to pageId if loaded and id present\r\n return (!isLoading && pageId) ? pageHash[pageId] : null;\r\n }\r\n)(\r\n (_store_, pageId)=>pageId\r\n);\r\ngetPage.propTypes = {\r\n pageId: PropTypes.string.isRequired\r\n};\r\nexport const getPageTypes = createSelector(\r\n getPagesById,\r\n getPagesByHash,\r\n (pageIds, pageHash) => {\r\n const pageTypes = [...new Set(pageIds.map(pageId=>pageHash[pageId].type.toLowerCase()))];\r\n console.debug('Data (Selector) | ', 'getPageTypes -', 'pageTypes:', pageTypes);\r\n return pageTypes;\r\n }\r\n);\r\n/*\r\nexport const getPageType = createCachedSelector(\r\n (store, pageId) => getPage(store, pageId),\r\n (page) => {\r\n console.debug('Data (Selector) | ', 'getPageType -', 'page:', page);\r\n // Return corresponding page hash to pageId if loaded and id present\r\n return (page) ? page.type : PageTypes.STATIC;\r\n }\r\n)(\r\n (_store_, pageId)=>pageId\r\n);\r\ngetPageType.propTypes = {\r\n pageId: PropTypes.string.isRequired\r\n};\r\n*/\r\n/* ========================================== */\r\n// MENU\r\n/* ========================================== */\r\n/**\r\n * Get Menu Items\r\n * --------------\r\n * Populates dynamic array of menu items\r\n * according to menuIndex and id for index specific selector\r\n *\r\n * @param {string} dataIndex data selector index\r\n * @param {string} slug slug for data selector\r\n */\r\n/*\r\nexport const getMenuItems = (dataIndex, slug) => {\r\n return createSelector(\r\n (store) => {console.log(dataIndex, slug); return dataIndex === 'panels' ? getActivePanels(store, slug) : [];},\r\n getLoadingStatusSelector([dataIndex]),\r\n (data, isLoading)=>{\r\n console.debug('Data (Selector) | ', 'getMenuItems -', 'data:', data, 'isLoading:', isLoading);\r\n const items = data.map(dataItem => {\r\n return {\r\n title: dataItem.title,\r\n icon: 'trip_origin',\r\n slug: dataItem.slug,\r\n path: `${dataItem.slug}/${dataItem.slug}`\r\n };\r\n });\r\n // Return corresponding menu items to menuIndex and if loaded and id present\r\n return (!isLoading && data) ? items : null;\r\n }\r\n );\r\n};\r\ngetMenuItems.propTypes = {\r\n dataIndex: PropTypes.string.isRequired,\r\n slug: PropTypes.string\r\n};\r\n/*\r\nexport const getMenuItems = createCachedSelector(\r\n // TODO: improve menu index selection function via helper\r\n //(menuIndex, id)=>[menuIndex, id, props],\r\n //(store, dataIndex, slug) => {return dataIndex === 'panels' ? getActivePanels(store, slug) : null},\r\n (_store_, slug)=>getActivePanels(_store_, slug),\r\n getLoadingStatusSelector(['panels', 'stories']),\r\n (data, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getMenuItems -', 'data:', data, 'isLoading:', isLoading);\r\n if(isLoading)\r\n return [];\r\n else {\r\n const items = data.map(dataItem => {\r\n return {\r\n title: dataItem.title,\r\n slug: dataItem.slug\r\n };\r\n });\r\n return items;\r\n }\r\n // Return corresponding menu items to menuIndex and if loaded and id present\r\n }\r\n)(\r\n (_store_, dataIndex, slug)=>`${dataIndex}:${slug}`\r\n);*/\r\n/* ========================================== */\r\n// STORIES\r\n/* ========================================== */\r\nexport const getStoriesById = store => store.Data.stories.byId;\r\nexport const getStoriesByHash = store => store.Data.stories.byHash;\r\nexport const getStoriesFlatMap = createSelector(\r\n getStoriesByHash,\r\n (storiesHash) => {\r\n const flatMap = Object.values(storiesHash).flatMap(x=>x);\r\n return flatMap;\r\n }\r\n);\r\nexport const getStoryId = (store, id) => store.Data.stories.byId.includes(id) ? id : null;\r\n/* ========================================== */\r\n/**\r\n * Get Story\r\n * ---------\r\n * Returns a stored story object from state\r\n * according to the specified storyId or a null\r\n * if it doesn't exist or the data is loading\r\n *\r\n * @param {string} storyId story id\r\n */\r\nexport const getStory = createCachedSelector(\r\n getStoryId,\r\n getStoriesByHash,\r\n getLoadingStatusSelector(['stories']),\r\n (storyId, storyHash, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getStory -', 'storyId:', storyId, 'storyHash:', storyHash, 'isLoading:', isLoading);\r\n // Return corresponding story hash to storyId if loaded and id present\r\n return (!isLoading && storyId) ? storyHash[storyId] : null;\r\n }\r\n)(\r\n (_store_, storyId)=>storyId\r\n);\r\ngetStory.propTypes = {\r\n storyId: PropTypes.string.isRequired\r\n};\r\n/* ========================================== */\r\n// PANELS\r\n/* ========================================== */\r\nexport const getPanelsById = store => store.Data.panels.byId;\r\nexport const getPanelsByHash = store => store.Data.panels.byHash;\r\n/* ========================================== */\r\n/**\r\n * Get Panel By Slug\r\n * -----------------\r\n * Finds a panel by a given slug\r\n * string and returns the panel object\r\n * or null\r\n *\r\n * @param {string} slug panel slug to search for\r\n * @returns {object || null} panel object\r\n */\r\nexport const getPanelBySlug = slug => {\r\n return createSelector(\r\n getPanelsById,\r\n getPanelsByHash,\r\n getLoadingStatusSelector(['panels']),\r\n (panelIds, panelHash, isLoading) => {\r\n if(isLoading) {\r\n return null;\r\n }\r\n const panelId = panelIds.some(id=>id.includes(slug));\r\n return panelHash[panelId] || null;\r\n }\r\n );\r\n};\r\ngetPanelBySlug.propTypes = {\r\n slug: PropTypes.string.isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Get Active Panels\r\n * -----------------\r\n * Retrieves loaded panels for the given\r\n * story\r\n *\r\n * @param {object} storySlug story slug string\r\n * @returns {array} active story panels\r\n */\r\nexport const getActivePanels = createCachedSelector(\r\n (store, storySlug)=>{return storySlug?getStory(store, storySlug):null;},\r\n getPanelsById,\r\n getPanelsByHash,\r\n getLoadingStatusSelector(['stories', 'panels']),\r\n (story, panelIds, panelsHash, isLoading) => {\r\n console.debug('Data (Selector) | ', 'getActivePanels (Params) -', 'story:', story, 'panelIds:', panelIds, 'panelsHash:', panelsHash, 'isLoading:', isLoading);\r\n if(isLoading) {\r\n return [];\r\n } else if(story) {\r\n // Filter, sort, and output existing panels\r\n const storyPanels = story.panels.filter(panelId=>panelIds.includes(panelId))\r\n .sort((a,b)=>panelsHash[a].position > panelsHash[b].position ? 1 : -1)\r\n .map(panelId=>panelsHash[panelId]);\r\n console.debug('Data (Selector) | ', 'getActivePanels (Return) -', 'storyPanels:', storyPanels);\r\n return storyPanels;\r\n } else {\r\n return [];\r\n }\r\n }\r\n)(\r\n (_store_, storySlug)=>`${storySlug}_panels`\r\n);\r\ngetActivePanels.propTypes = {\r\n storySlug: PropTypes.string.isRequired\r\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.remToPx = remToPx;\nexports.pxToRem = pxToRem;\nexports.colourMap = colourMap;\nexports.getTheme = getTheme;\nexports[\"default\"] = void 0;\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _createMuiTheme = _interopRequireDefault(require(\"@material-ui/core/styles/createMuiTheme\"));\n\nvar _blue = _interopRequireDefault(require(\"@material-ui/core/colors/blue\"));\n\nvar _cyan = _interopRequireDefault(require(\"@material-ui/core/colors/cyan\"));\n\nvar _orange = _interopRequireDefault(require(\"@material-ui/core/colors/orange\"));\n\nvar _red = _interopRequireDefault(require(\"@material-ui/core/colors/red\"));\n\nvar _teal = _interopRequireDefault(require(\"@material-ui/core/colors/teal\"));\n\nrequire(\"typeface-montserrat\");\n\nrequire(\"typeface-open-sans\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction remToPx(rem) {\n return parseFloat(window.getComputedStyle(document.body).getPropertyValue('font-size')) * parseFloat(rem);\n}\n\nfunction pxToRem(px) {\n return px / parseFloat(parseInt(window.getComputedStyle(document.body).getPropertyValue('font-size')).toPrecision(4));\n}\n\nfunction colourMap(id, index, matches, colours) {\n console.log(\"COLOUR IND\", index);\n\n if (matches) {\n if (Object.keys(matches).includes(id)) {\n return matches[id];\n } else {\n var matchColours = Object.values(matches);\n var availableColours = colours.filter(function (element) {\n return !matchColours.includes(element);\n });\n console.log('AVAIL COLOURS', availableColours);\n return availableColours[index];\n }\n } else {\n return colours[index];\n }\n}\n\nfunction getPalette(mode) {\n var palette = mode === 'light' ? {\n type: 'light',\n primary: _blue[\"default\"],\n secondary: {\n light: '#837c7e',\n main: '#565052',\n dark: '#2d282a',\n contrastText: '#fafafa'\n },\n error: _red[\"default\"],\n text: {\n primary: 'rgba(45, 45, 45, 0.87)',\n secondary: 'rgba(250, 250, 250, 0.87)',\n disabled: 'rgba(45, 45, 45, 0.38)',\n hint: 'rgba(45, 45, 45, 0.66)',\n icon: 'rgba(45, 45, 45, 0.66)',\n divider: _blue[\"default\"][300],\n lightDivider: 'rgba(0, 0, 0, 0.075)'\n },\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n unsaved: '#E7E732',\n saved: {\n main: _teal[\"default\"][500],\n contrastText: 'white'\n }\n },\n background: {\n \"default\": '#fafafa',\n paper: '#fff',\n appBar: '#f5f5f5',\n contentFrame: '#eeeeee'\n }\n } : {\n type: 'dark',\n primary: _cyan[\"default\"],\n secondary: {\n light: '#837c7e',\n main: '#565052',\n dark: '#2d282a',\n contrastText: '#fafafa'\n },\n error: _red[\"default\"],\n text: {\n primary: 'rgba(250, 250, 250, 0.87)',\n secondary: 'rgba(250, 250, 250, 0.87)',\n disabled: 'rgba(45, 45, 45, 0.38)',\n hint: 'rgba(45, 45, 45, 0.66)',\n icon: 'rgba(45, 45, 45, 0.66)',\n divider: _blue[\"default\"][300],\n lightDivider: 'rgba(0, 0, 0, 0.075)'\n },\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n unsaved: '#E7E732',\n saved: {\n main: _teal[\"default\"][500],\n contrastText: 'white'\n }\n },\n background: {\n \"default\": '#1f1f1f',\n paper: '#2d2d2d',\n appBar: '#2d2d2d',\n contentFrame: '#575757'\n }\n };\n return palette;\n}\n\nfunction getTheme() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'light';\n var palette = getPalette(mode);\n var theme = (0, _createMuiTheme[\"default\"])({\n name: 'MyGlobeTheme',\n direction: 'ltr',\n spacing: 16,\n palette: palette,\n typography: {\n htmlFontSize: 16,\n fontSize: 14,\n fontFamily: '\"Open Sans\", sans-serif',\n h1: {\n fontSize: '3rem',\n fontFamily: '\"Montserrat\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal',\n textTransform: 'uppercase'\n },\n h2: {\n fontSize: '2rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal'\n },\n h3: {\n fontSize: '1.5rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal'\n },\n h4: {\n fontSize: '1.5rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'normal',\n fontStyle: 'normal'\n },\n h5: {\n fontSize: '1.25rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'normal',\n fontStyle: 'normal'\n },\n h6: {\n fontSize: '1.1rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'normal',\n fontStyle: 'normal'\n },\n body1: {\n fontSize: '1rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'normal',\n fontStyle: 'normal'\n },\n button: {\n fontSize: '1rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '0.08rem'\n },\n caption: {\n fontSize: '1rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '0.08rem'\n }\n }\n });\n theme.overrides = {\n MuiFormControl: {\n root: {\n height: '100%'\n }\n },\n MuiInput: {\n root: {\n height: '100%'\n }\n },\n MuiInputBase: {\n input: {\n height: '2.5em',\n padding: 0\n }\n },\n MuiTab: {\n root: {\n fontSize: '1rem',\n fontFamily: '\"Open Sans\", sans-serif',\n fontWeight: 'bold',\n fontStyle: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '0.08rem'\n }\n },\n MuiListItem: {\n gutters: {\n paddingLeft: 0,\n paddingRight: 0\n }\n },\n MuiListItemText: {\n root: {\n marginTop: '0.25rem',\n marginBottom: '0.25rem'\n }\n },\n MuiListItemIcon: {\n root: {\n minWidth: '2rem'\n }\n }\n };\n return theme;\n}\n\ngetTheme.propTypes = {\n mode: _propTypes[\"default\"].oneOf(['light', 'dark'])\n};\ngetTheme.defaultProps = {\n mode: 'light'\n};\nvar defaultTheme = getTheme();\nvar _default = defaultTheme;\nexports[\"default\"] = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = useMedia;\n\nvar _react = require(\"react\");\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(n); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction useMedia(queries, values, defaultValue) {\n var mediaQueryLists = queries.map(function (q) {\n return window.matchMedia(q);\n });\n\n var _useState = (0, _react.useState)(defaultValue),\n _useState2 = _slicedToArray(_useState, 2),\n value = _useState2[0],\n setValue = _useState2[1];\n\n (0, _react.useEffect)(function () {\n setValue(getValue);\n }, [values, defaultValue, getValue]);\n var getValue = (0, _react.useCallback)(function () {\n var index = mediaQueryLists.findIndex(function (mql) {\n return mql.matches;\n });\n console.log(\"\".concat(useMedia.displayName, \" | \"), 'getValue -', 'index:', index, 'queries:', queries, 'values:', values, 'defaultValue:', defaultValue);\n return typeof values[index] !== 'undefined' ? values[index] : defaultValue;\n }, [values]);\n (0, _react.useEffect)(function () {\n var handler = function handler() {\n return setValue(getValue);\n };\n\n mediaQueryLists.forEach(function (mql) {\n return mql.addListener(handler);\n });\n return function () {\n return mediaQueryLists.forEach(function (mql) {\n return mql.removeListener(handler);\n });\n };\n }, []);\n return value;\n}\n\nuseMedia.propTypes = {\n queries: _propTypes[\"default\"].arrayOf(_propTypes[\"default\"].string).isRequired,\n values: _propTypes[\"default\"].arrayOf(_propTypes[\"default\"].any).isRequired,\n defaultValue: _propTypes[\"default\"].any.isRequired\n};\nuseMedia.displayName = 'useMedia';","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _layers = require(\"@deck.gl/layers\");\n\nvar _supercluster = _interopRequireDefault(require(\"supercluster\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction getIconName(size) {\n if (size === 0) {\n return '';\n }\n\n if (size < 10) {\n return \"marker-\".concat(size);\n }\n\n if (size < 100) {\n return \"marker-\".concat(Math.floor(size / 10), \"0\");\n }\n\n return 'marker-100';\n}\n\nfunction getIconSize(size) {\n return Math.min(100, size) / 100 + 1;\n}\n\nvar IconClusterLayer = function (_CompositeLayer) {\n _inherits(IconClusterLayer, _CompositeLayer);\n\n var _super = _createSuper(IconClusterLayer);\n\n function IconClusterLayer() {\n _classCallCheck(this, IconClusterLayer);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(IconClusterLayer, [{\n key: \"shouldUpdateState\",\n value: function shouldUpdateState(_ref) {\n var changeFlags = _ref.changeFlags;\n return changeFlags.somethingChanged;\n }\n }, {\n key: \"updateState\",\n value: function updateState(_ref2) {\n var props = _ref2.props,\n oldProps = _ref2.oldProps,\n changeFlags = _ref2.changeFlags;\n var rebuildIndex = changeFlags.dataChanged || props.sizeScale !== oldProps.sizeScale;\n\n if (rebuildIndex) {\n var index = new _supercluster[\"default\"]({\n maxZoom: 16,\n radius: props.sizeScale\n });\n index.load(props.data.map(function (d) {\n return {\n geometry: {\n coordinates: props.getPosition(d)\n },\n properties: d\n };\n }));\n this.setState({\n index: index\n });\n }\n\n var z = Math.floor(this.context.viewport.zoom);\n\n if (rebuildIndex || z !== this.state.z) {\n this.setState({\n data: this.state.index.getClusters([-180, -85, 180, 85], z),\n z: z\n });\n }\n }\n }, {\n key: \"getPickingInfo\",\n value: function getPickingInfo(_ref3) {\n var info = _ref3.info,\n mode = _ref3.mode;\n var pickedObject = info.object && info.object.properties;\n\n if (pickedObject) {\n if (pickedObject.cluster && mode !== 'hover') {\n info.objects = this.state.index.getLeaves(pickedObject.cluster_id, 25).map(function (f) {\n return f.properties;\n });\n }\n\n info.object = pickedObject;\n }\n\n return info;\n }\n }, {\n key: \"renderLayers\",\n value: function renderLayers() {\n var data = this.state.data;\n var _this$props = this.props,\n iconAtlas = _this$props.iconAtlas,\n iconMapping = _this$props.iconMapping,\n sizeScale = _this$props.sizeScale;\n return new _layers.IconLayer(this.getSubLayerProps({\n id: 'icon',\n data: data,\n iconAtlas: iconAtlas,\n iconMapping: iconMapping,\n sizeScale: sizeScale,\n getPosition: function getPosition(d) {\n return d.geometry.coordinates;\n },\n getIcon: function getIcon(d) {\n return getIconName(d.properties.cluster ? d.properties.point_count : 1);\n },\n getSize: function getSize(d) {\n return getIconSize(d.properties.cluster ? d.properties.point_count : 1);\n }\n }));\n }\n }]);\n\n return IconClusterLayer;\n}(_core.CompositeLayer);\n\nexports[\"default\"] = IconClusterLayer;","/* ======================== */\r\n// Layout Types\r\n/* ======================== */\r\nexport const LayoutTypes = {\r\n GRID: 'grid',\r\n LAYERED: 'layered'\r\n};\r\n/* ======================== */\r\n// Alignment Types\r\n/* ======================== */\r\nexport const AlignmentTypes = {\r\n LEFT: 'left',\r\n RIGHT: 'right',\r\n TOP: 'top',\r\n BOTTOM: 'bottom'\r\n};\r\n/* ======================== */\r\n// Sidebar Types\r\n/* ======================== */\r\nexport const NavigationTypes = {\r\n INLINE: 'inline',\r\n LAYERED: 'layered'\r\n};\r\n/* ======================== */\r\n// Menu Types\r\n/* ======================== */\r\nexport const MenuTypes = {\r\n TAB: 'tab',\r\n LIST: 'list',\r\n TIMELINE: 'timeline'\r\n};\r\n/* ======================== */\r\n// Page Types\r\n/* ======================== */\r\nexport const PageTypes = {\r\n STATIC: 'static',\r\n STORY: 'story'\r\n};\r\n/* ======================== */\r\n// Dataset Types\r\n/* ======================== */\r\nexport const DatasetTypes = {\r\n API: 'api',\r\n FILE: 'file',\r\n JSON: 'json',\r\n GEO: 'geo'\r\n};\r\nexport const GeoTypes = {\r\n\r\n};\r\n/* ======================== */\r\n// Visualisation Types\r\n/* ======================== */\r\nexport const VisEngineTypes = {\r\n MAPBOX: 'mapbox',\r\n DECKGL: 'deckgl',\r\n NIVO: 'nivo',\r\n AMCHARTS: 'amcharts'\r\n};\r\nexport const LayerTypes = {\r\n deckgl: {\r\n layers: [\r\n // Core Layers\r\n 'ArcLayer',\r\n 'BitmapLayer',\r\n 'ColumnLayer',\r\n 'GeoJsonLayer',\r\n 'GridCellLayer',\r\n 'IconLayer',\r\n 'LineLayer',\r\n 'PathLayer',\r\n 'PointCloudLayer',\r\n 'PolygonLayer',\r\n 'ScatterplotLayer',\r\n 'SolidPolygonLayer',\r\n 'TextLayer'\r\n ],\r\n aggregationLayers: [\r\n // Aggregation Layers\r\n 'ContourLayer',\r\n 'GridLayer',\r\n 'GPUGridLayer',\r\n 'CPUGridLayer',\r\n 'HexagonLayer',\r\n 'ScreenGridLayer',\r\n 'HeatmapLayer'\r\n ],\r\n geoLayers: [\r\n // Geo Layers\r\n 'GreatCircleLayer',\r\n 'H3ClusterLayer',\r\n 'H3HexagonLayer',\r\n 'S2Layer',\r\n 'TileLayer',\r\n 'TripsLayer',\r\n 'TerrainLayer',\r\n 'MVTLayer'\r\n ],\r\n custom: [\r\n 'IconClusterLayer'\r\n ]\r\n /*layers: {\r\n // Core Layers\r\n ArcLayer: 'ArcLayer',\r\n BitmapLayer: 'BitmapLayer',\r\n ColumnLayer: 'ColumnLayer',\r\n GeoJsonLayer: 'GeoJsonLayer',\r\n GridCellLayer: 'GridCellLayer',\r\n IconLayer: 'IconLayer',\r\n LineLayer: 'LineLayer',\r\n PathLayer: 'PathLayer',\r\n PointCloudLayer: 'PointCloudLayer',\r\n PolygonLayer: 'PolygonLayer',\r\n ScatterplotLayer: 'ScatterplotLayer',\r\n SolidPolygonLayer: 'SolidPolygonLayer',\r\n TextLayer: 'TextLayer'\r\n },\r\n aggregationLayers: {\r\n // Aggregation Layers\r\n ContourLayer: 'ContourLayer',\r\n GridLayer: 'GridLayer',\r\n GPUGridLayer: 'GPUGridLayer',\r\n CPUGridLayer: 'CPUGridLayer',\r\n HexagonLayer: 'HexagonLayer',\r\n ScreenGridLayer: 'ScreenGridLayer',\r\n HeatmapLayer: 'HeatmapLayer',\r\n },\r\n geoLayers: {\r\n // Geo Layers\r\n GreatCircleLayer: 'GreatCircleLayer',\r\n H3ClusterLayer: 'H3ClusterLayer',\r\n H3HexagonLayer: 'H3HexagonLayer',\r\n S2Layer: 'S2Layer',\r\n TileLayer: 'TileLayer',\r\n TripsLayer: 'TripsLayer',\r\n TerrainLayer: 'TerrainLayer',\r\n MVTLayer: 'MVTLayer'\r\n },\r\n custom: {\r\n IconClusterLayer: 'IconClusterLayer'\r\n }*/\r\n },\r\n}\r\nexport const ChartTypes = {\r\n BAR: 'bar',\r\n PIE: 'pie',\r\n LINE: 'line',\r\n AREA: 'area',\r\n RADAR: 'radar'\r\n};\r\n/* ======================== */\r\n// Data Loading Types\r\n/* ======================== */\r\nexport const LoadingTypes = {\r\n BULK: 'init',\r\n SEQUENTIAL: 'sequential',\r\n ACTIVE: 'active'\r\n};\r\nexport const PolygonLayer = {\r\n 'type': 'polygonLayer',\r\n 'requiredColumns': ['geojson'],\r\n 'attributes': ['color', 'opacity', 'extruded']\r\n};\r\nexport const LineLayer = {\r\n 'type': 'lineLayer',\r\n 'requiredColumns': ['lat0','lng0','lat1','lng1'],\r\n 'attributes': ['color', 'opacity', 'strokewidth']\r\n};\r\nexport const PointLayer = {\r\n 'type': 'lineLayer',\r\n 'requiredColumns': ['lat','lng'],\r\n 'optionalColumns': ['altitude'],\r\n 'attributes': ['color', 'opacity', 'radius']\r\n};\r\nexport const ImageLayer = {\r\n 'type': 'imageLayer',\r\n 'requiredColumns': ['lat','lng','icon'],\r\n 'attributes': ['size']\r\n};\r\nexport const VisualisationTypes = [\r\n PolygonLayer,\r\n LineLayer,\r\n PointLayer,\r\n ImageLayer\r\n];\r\n/*\r\ninterface Config {\r\n\r\n}*/","/* ================================================================ */\r\n// MAP ACTIONS | index.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport axios from 'axios';\r\nimport { VisEngineTypes, LayerTypes } from '@myglobe/core/src/types';\r\nimport {getState as getMapState, getLayer} from '../../selectors/Data';\r\nimport {buildLayers} from '../../utils/vis-builder';\r\nimport {isNullOrUndefined} from 'util';\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\n// DeckGL\r\nexport const UPDATE_DECK_LAYER_CLASSES = 'UPDATE_DECK_LAYER_CLASSES';\r\nexport const UPDATE_DECK_LAYER_CLASSES_FAILURE = 'UPDATE_DECK_LAYER_CLASSES_FAILURE';\r\nexport const UPDATE_DECK_LAYER_CLASSES_SUCCESS = 'UPDATE_DECK_LAYER_CLASSES_SUCCESS';\r\n// Base Config\r\nexport const UPDATE_MAP_CONFIG = 'UPDATE_MAP_CONFIG';\r\nexport const UPDATE_MAP_CONFIG_FAILURE = 'UPDATE_MAP_CONFIG_FAILURE';\r\nexport const UPDATE_MAP_CONFIG_SUCCESS = 'UPDATE_MAP_CONFIG_SUCCESS';\r\n// ViewState\r\nexport const UPDATE_MAP_VIEW_STATE = 'UPDATE_MAP_VIEW_STATE';\r\n// Style\r\nexport const UPDATE_MAP_STYLES = 'UPDATE_MAP_STYLES';\r\nexport const UPDATE_MAP_STYLES_FAILURE = 'UPDATE_MAP_STYLES_FAILURE';\r\nexport const UPDATE_MAP_STYLES_SUCCESS = 'UPDATE_MAP_STYLES_SUCCESS';\r\n// Layer Classes\r\nexport const UPDATE_LAYER_CLASSES = 'UPDATE_LAYER_CLASSES';\r\n// Layers\r\nexport const UPDATE_MAP_LAYERS = 'UPDATE_MAP_LAYERS';\r\nexport const UPDATE_MAP_LAYERS_FAILURE = 'UPDATE_MAP_LAYERS_FAILURE';\r\nexport const UPDATE_MAP_LAYERS_SUCCESS = 'UPDATE_MAP_LAYERS_SUCCESS';\r\n// MapState (contains viewstate, style, layers)\r\nexport const UPDATE_MAP_STATE_FAILURE = 'UPDATE_MAP_STATE_FAILURE';\r\n\r\nexport const UPDATE_MAP_TILES_LOADED = 'UPDATE_MAP_TILES_LOADED';\r\n\r\n\r\nexport function updateDeckLayerClasses(layers) {\r\n return (dispatch) => {\r\n dispatch({type: UPDATE_DECK_LAYER_CLASSES});\r\n // Get set of missing imports\r\n new Promise((resolve,reject)=>{\r\n try {\r\n const layerClasses = Array.from(new Set(layers.map(layer=>{\r\n const type = layer.type;\r\n if(LayerTypes.deckgl.layers.includes(type))\r\n return import('@deck.gl/aggregation-layers').then(module=>{return module});\r\n if(LayerTypes.deckgl.aggregationLayers.includes(type))\r\n return import('@deck.gl/aggregation-layers').then(module=>{return module});\r\n if(LayerTypes.deckgl.geoLayers.includes(type))\r\n return import('@deck.gl/geo-layers').then(module=>{return module});\r\n if(LayerTypes.deckgl.custom.includes(type)) {\r\n // Attempt fetch of custom layer\r\n try {\r\n return import(`@myglobe/core/dist/Map/layers/${type}`).then(module=>{return module.default});\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n return null;\r\n }))).filter(layerClass=>!isNullOrUndefined(layerClass));\r\n resolve(layerClasses);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n })\r\n .then(layerClasses=>dispatch({ type: UPDATE_DECK_LAYER_CLASSES_SUCCESS, payload: layerClasses }))\r\n .catch(error=>dispatch({type: UPDATE_DECK_LAYER_CLASSES_FAILURE, error, payload: 'deck layer classes import error'}));\r\n }\r\n};\r\n/* ========================================== */\r\n/**\r\n * Update Map Config\r\n * -----------------\r\n * Updates the mapbox user id and\r\n * mapbox access token for style and mapbox api queries\r\n *\r\n * @param {object} globeConfig incoming globe config\r\n */\r\n/* ========================================== */\r\nexport function updateMapConfig(globeConfig) {\r\n return (dispatch) => {\r\n dispatch({type: UPDATE_MAP_CONFIG});\r\n // Extract Map Config Updates\r\n const {mapboxUserId, mapboxToken} = globeConfig;\r\n if(mapboxToken && mapboxUserId) dispatch({type: UPDATE_MAP_CONFIG_SUCCESS, payload: {mapboxUserId, mapboxToken}});\r\n else dispatch({type: UPDATE_MAP_CONFIG_FAILURE, error: 'mapboxUserId or mapboxToken not provided'});\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Update Map View\r\n * ---------------\r\n * Updates the map's viewState with the new\r\n * viewState object\r\n *\r\n * @param {object} viewState map's view state\r\n */\r\n/* ========================================== */\r\nexport function updateMapViewState(viewState) {\r\n return (dispatch) => {\r\n /*if(viewState.destination) {\r\n if(viewState.destination.x < -4700000) viewState.destination.x = -4700000;\r\n else if(viewState.destination.x > -5090000) viewState.destination.x = -5090000;\r\n if(viewState.destination.y > 3050000) viewState.destination.y = 3050000;\r\n else if(viewState.destination.y < 2900000) viewState.destination.y = 2900000;\r\n }*/\r\n dispatch({type: UPDATE_MAP_VIEW_STATE, payload: viewState});\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Update Map Style\r\n * ----------------\r\n * Updates the map's mapbox style\r\n *\r\n * @param {string} mapStyle map style string\r\n */\r\n/* ========================================== */\r\n/*export function updateMapStyle(mapStyle) {\r\n return (dispatch) => {\r\n dispatch({type: UPDATE_MAP_STYLE, payload: mapStyle});\r\n };\r\n}*/\r\nexport function updateMapStyle(styles) {\r\n return (dispatch, getState) => {\r\n const {mapboxUserId, mapboxToken} = getState().Map;\r\n dispatch({type: UPDATE_MAP_STYLES});\r\n axios.get(`https://api.mapbox.com/styles/v1/${mapboxUserId}/${styles}?fresh=true&access_token=${mapboxToken}`).then( (result) => {\r\n console.debug(result);\r\n axios.get(`https://api.mapbox.com/styles/v1/${mapboxUserId}/${styles}/sprite?fresh=true&access_token=${mapboxToken}`).then((spriteJSON) => {\r\n dispatch({type: UPDATE_MAP_STYLES_SUCCESS, payload: { style: result.data, spriteJSON: spriteJSON.data, spriteImage: `https://api.mapbox.com/styles/v1/${mapboxUserId}/${styles}/sprite.png?fresh=true&access_token=${mapboxToken}` }});\r\n }).catch((error) => {\r\n dispatch({ type: UPDATE_MAP_STYLES_FAILURE, error, payload: 'spriteJSON error' });\r\n });\r\n }).catch((error) => {\r\n dispatch({ type: UPDATE_MAP_STYLES_FAILURE, error, payload: 'style error' });\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Update Map Layers\r\n * -----------------\r\n * Updates the map's current vis layers\r\n *\r\n * @param {object} layers vis layers\r\n */\r\n/* ========================================== */\r\nexport function updateMapLayers(layers) {\r\n return (dispatch) => {\r\n dispatch({type: UPDATE_MAP_LAYERS});\r\n console.debug('Map (Actions) | ', 'updateMapLayers -', 'layers:', layers);\r\n try {\r\n dispatch({type: UPDATE_MAP_LAYERS_SUCCESS, payload: {layers} });\r\n } catch (e) {\r\n dispatch({type: UPDATE_MAP_LAYERS_FAILURE, error: e, payload: 'buildLayers error'});\r\n }\r\n }\r\n}\r\n/*\r\n// This update format does not function correctly in its current form\r\n// TODO: revisit this form of layer update and see if vis builder is still required in any form\r\nexport function updateMapLayers(layers) {\r\n return (dispatch, getState) => {\r\n // Get pre-loaded layers from MapReducer\r\n dispatch({type: UPDATE_MAP_LAYERS});\r\n const store = getState();\r\n const layerConfigs = layers.map(layerId=>getLayer(store, layerId));\r\n const {deckLayers, mapboxLayers, markers} = getState().Map;\r\n //const newLoadedLayers = Array.from(new Set([...loadedLayers, ...layers]));\r\n //dispatch({type: UPDATE_MAP_LAYERS, payload: {mapboxLayers: layers, loadedLayers: newLoadedLayers}});\r\n\r\n var currentDeckLayers = [];\r\n var currentMapboxLayers = [];\r\n var currentMarkers = [];\r\n\r\n // TODO: figure out why the hell layers are just ids here without type context\r\n\r\n // Construct incoming layers\r\n const unloadedLayers = layerConfigs.filter(layer=>{\r\n console.debug('Map (Actions) | ', 'updateMapLayers (Build Layers) -', 'unloadedLayer:', layer);\r\n // Handle filter according to mapping engine\r\n\r\n // Search current deck layers for layer\r\n /*const deckLayer = deckLayers.find(dLayer=>dLayer.props.data[0].id === layer.id);\r\n if(deckLayer) {\r\n // Existing layer found, add to current deck layer array and filter out\r\n currentDeckLayers.push(deckLayer);\r\n return false;\r\n }\r\n const mapboxLayer = mapboxLayers.find(mLayer=>mLayer.id === layer.id);\r\n if(mapboxLayer) {\r\n // Existing layer found, add to current mapbox layer array and filter out\r\n currentMapboxLayers.push(mapboxLayer);\r\n return false;\r\n }\r\n // Marker\r\n const marker = markers.find(mark=>mark.id === layer.id);\r\n if(marker) {\r\n // Add marker to current markers\r\n currentMarkers.push(marker);\r\n return false;\r\n }\r\n return true;\r\n //return !markers.some(marker=>marker.id === layer.id);\r\n */\r\n\r\n /*\r\n switch(layer.type) {\r\n case VisEngineTypes.DECKGL: {\r\n // Search current deck layers for layer\r\n const deckLayer = deckLayers.find(dLayer=>dLayer.props.data[0].id === layer.id);\r\n if(deckLayer) {\r\n // Existing layer found, add to current deck layer array and filter out\r\n currentDeckLayers.push(deckLayer);\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n case VisEngineTypes.MAPBOX: {\r\n const mapboxLayer = mapboxLayers.find(mLayer=>mLayer.id === layer.id);\r\n if(mapboxLayer) {\r\n // Existing layer found, add to current mapbox layer array and filter out\r\n currentMapboxLayers.push(mapboxLayer);\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n default: {\r\n // Marker\r\n const marker = markers.find(mark=>mark.id === layer.id);\r\n if(marker) {\r\n // Add marker to current markers\r\n currentMarkers.push(marker);\r\n return false;\r\n } else {\r\n // No marker found for corresponding id (unloaded marker)\r\n return true;\r\n }//return !markers.some(marker=>marker.id === layer.id);\r\n }\r\n }\r\n });\r\n\r\n try {\r\n // Check for unloaded layers\r\n if(unloadedLayers.length > 0) {\r\n // Build new layers\r\n buildLayers(unloadedLayers).then(newLayers=>{\r\n console.debug('Map (Actions) | ', 'updateMapLayers (Build Layers) -', 'unloadedLayers:', unloadedLayers, 'newLayers:', newLayers);\r\n /*if(newLayers.deckLayers) {\r\n currentDeckLayers = [...currentDeckLayers, ...newLayers.deckLayers];\r\n }\r\n if(newLayers.mapboxLayers) {\r\n currentMapboxLayers = [...currentMapboxLayers, ...newLayers.mapboxLayers];\r\n }\r\n if(newLayers.markers) {\r\n currentMarkers = [...currentMarkers, ...newLayers.markers];\r\n }*/\r\n // Send new layers and current layer ids to reducer\r\n\r\n /*\r\n const payload = {layers, ...newLayers};\r\n dispatch({type: UPDATE_MAP_LAYERS_SUCCESS, payload }); //deckLayers: currentDeckLayers, mapboxLayers: currentMapboxLayers, markers: currentMarkers}});\r\n });\r\n } else {\r\n // Send current layer ids to reducer\r\n dispatch({type: UPDATE_MAP_LAYERS_SUCCESS, payload: {layers} }); //deckLayers: currentDeckLayers, mapboxLayers: currentMapboxLayers, markers: currentMarkers}});\r\n }\r\n } catch (e) {\r\n dispatch({type: UPDATE_MAP_LAYERS_FAILURE, error: e, payload: 'buildLayers error'});\r\n }\r\n };\r\n}\r\n*/\r\n/* ========================================== */\r\n/**\r\n * Update Map State\r\n * ----------------\r\n * Updates the entire map's state according to\r\n * the keys given in the state argument via the\r\n * predefined update actions\r\n *\r\n * @param {object} state\r\n */\r\nexport function updateMapState(state) {\r\n return (dispatch, getState) => {\r\n if(state) {\r\n // Check Layers\r\n if(state.layers && state.layers.length > 0) {\r\n\r\n // Get layers from DataReducer\r\n const {layers} = getState().Data;\r\n\r\n // Filter out map layers specified by state layers (layerIDs) array\r\n // NOTE: this prevents null layer values from returning\r\n const currentLayers = layers.byId.filter(layer=>state.layers.some(element=>element === layer));//.map(layerID=>layers.byHash[layerID]);\r\n console.debug('Map (Actions) | ', 'updateMapState (handle layers) -', 'state layers:', state.layers, 'currentLayers:', currentLayers);\r\n // Update map layers via action\r\n dispatch(updateMapLayers(currentLayers));\r\n }\r\n if(!isNullOrUndefined(state.mapStyle)) {\r\n // TODO: Fix array vs single mapstyle query problem\r\n // Update map style via action\r\n const {mapStyle} = getState().Map;\r\n console.debug('Map (Actions) | ', 'updateMapState (handle mapStyle) -', 'currentMapStyle:', mapStyle, 'nextMapStyle:', state.mapStyle);\r\n const mapStyleId = typeof mapstyle === 'string' ? mapStyle : mapStyle?.id;\r\n if(state.mapStyle[0] !== mapStyleId)\r\n dispatch(updateMapStyle(state.mapStyle));\r\n }\r\n if(state.viewState) {\r\n // Update map view state via action\r\n dispatch(updateMapViewState(state.viewState));\r\n //dispatch({type: UPDATE_VIEW_STATE, payload: state.viewState});\r\n }\r\n } else {\r\n dispatch({type: UPDATE_MAP_STATE_FAILURE, error: new Error('null state'), payload: 'null state error'});\r\n }\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * Update Map State By Id\r\n * ----------------------\r\n * Retrieves map state by id via selector\r\n * and handles map state updating through existing\r\n * updateMapState action according to the state's keys\r\n *\r\n * @param {string} stateId state name identifier\r\n */\r\nexport function updateMapStateById(stateId) {\r\n return (dispatch) => {\r\n const state = getMapState(stateId);\r\n dispatch(updateMapState(state));\r\n }\r\n}","/* ================================================================ */\r\n// MAP CONTAINER | Map.jsx\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport React, {useState, useRef, useEffect, useCallback} from 'react';\r\nimport PropTypes from 'prop-types';\r\n// Styles\r\nimport 'mapbox-gl/dist/mapbox-gl.css';\r\n// Configuration\r\n//import JSON_CONFIGURATION from '@myglobe/core/dist/Map/configuration';\r\n// Lodash\r\nimport {isEqual} from 'lodash';\r\n// DeckGL\r\nimport DeckGL, {\r\n View,\r\n MapView,\r\n FirstPersonView,\r\n MapController,\r\n FlyToInterpolator,\r\n TRANSITION_EVENTS,\r\n COORDINATE_SYSTEM\r\n} from 'deck.gl';\r\nimport GL from '@luma.gl/constants';\r\n//import DeckGL, {FlyToInterpolator, TRANSITION_EVENTS} from '@deck.gl/react';\r\nimport {MapboxLayer} from '@deck.gl/mapbox';\r\nimport {JSONConverter} from '@deck.gl/json';\r\n// React-Map-GL\r\nimport {\r\n Marker,\r\n StaticMap,\r\n Popup,\r\n _MapContext as MapContext\r\n} from 'react-map-gl';\r\nimport {AttributionControl, ScaleControl} from 'mapbox-gl';\r\n// Material UI\r\nimport IconButton from '@material-ui/core/Button';\r\nimport ResetIcon from '@material-ui/icons/SettingsBackupRestore';\r\nimport makeStyles from '@material-ui/styles/makeStyles';\r\nimport useTheme from '@material-ui/styles/useTheme';\r\n// Hooks\r\nimport usePrevious from '@myglobe/core/dist/hooks/usePrevious';\r\n// Local Component\r\nimport MyGlobeIcon from '@myglobe/core/dist/Branding/MyGlobeIcon';\r\nimport PopupHTML from '../Popup';\r\n\r\nimport {registerLoaders, _selectLoader, load} from '@loaders.gl/core';\r\nimport {CSVLoader} from '@loaders.gl/csv';\r\n\r\nregisterLoaders([CSVLoader]);\r\nconst JSON_CONFIGURATION = {\r\n //classes: Object.assign({}, require('@deck.gl/layers'), require('@deck.gl/aggregation-layers')),\r\n MapController,\r\n // a map of all layers that should be exposes as JSONLayers\r\n layers: {...require('@deck.gl/layers'), IconClusterLayer: require('./IconClusterLayer').default},\r\n // Any non-standard views\r\n views: {},\r\n // Enumerations that should be available to JSON parser\r\n // Will be resolved as `.`\r\n enumerations: {\r\n COORDINATE_SYSTEM,\r\n GL\r\n }\r\n};\r\nconsole.log('JSONCONFIG', JSON_CONFIGURATION);\r\n/* ========================================== */\r\n// Style Settings\r\n/* ========================================== */\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'relative',\r\n backgroundColor: theme.palette.secondary.main,\r\n width: '100%',\r\n height: '100%'\r\n },\r\n resetButton: {\r\n position: 'absolute',\r\n right: '4em',\r\n bottom: '1em'\r\n },\r\n branding: {\r\n position: 'absolute',\r\n touchAction: 'none',\r\n zIndex: 1,\r\n right: '1rem',\r\n top: '1rem'\r\n }\r\n}));\r\n/* ========================================== */\r\n// String Extension\r\n/* ========================================== */\r\nString.prototype.parseFunction = function () {\r\n var funcReg = /function *\\(([^()]*)\\)[ \\n\\t]*{(.*)}/gmi;\r\n var match = funcReg.exec(this.replace(/\\n/g, ' '));\r\n if(match) {\r\n return new Function(match[1].split(','), match[2]);\r\n }\r\n return null;\r\n};\r\nconst jsonConverter = new JSONConverter({configuration: JSON_CONFIGURATION});\r\nconsole.log('jsonConverter', jsonConverter)\r\n//TODO: Get these from map state OR globe config\r\nconst TRANSITION_SETTINGS = {\r\n transitionDuration: 2000,\r\n transitionEasing: x=>1-(1-x)*(1-x),\r\n transitionInterpolator: new FlyToInterpolator(),\r\n transitionInterruption: TRANSITION_EVENTS.IGNORE,\r\n};\r\n/* ========================================== */\r\n/**\r\n * Map Component\r\n * -------------\r\n * Component for output of deck and mapbox\r\n * components with given vis layers and state\r\n *\r\n * @param {object} screen screen width and height\r\n * @param {string} mapboxToken mapbox api token\r\n * @param {string} mapStyle mapbox style uri\r\n * @param {object} viewState map's current viewState\r\n * @param {array} layers myglobe vis layers array\r\n * @param {function} onViewStateUpdate view state update callback\r\n * @param {function} onReset map state reset callback\r\n */\r\nconst MapComponent = (props) => {\r\n /* ======================== */\r\n // PROPS\r\n /* ======================== */\r\n const {\r\n // TODO: remove?\r\n //spriteJSON,\r\n //spriteImage,\r\n deckJsonConverterConfig,\r\n\r\n // MAP PROPS\r\n mapboxToken,\r\n mapStyle,\r\n\r\n // DECK PROPS\r\n deckLayers,\r\n\r\n // FUNCTIONS\r\n onViewStateUpdate,\r\n onReset,\r\n } = props;\r\n\r\n // JSON Converter\r\n //const [jsonConverter, setJsonConverter] = useState(new JSONConverter({configuration: deckJsonConverterConfig}));\r\n\r\n // Styles\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n\r\n // Map Containers\r\n const mapboxContainer = useRef(null);\r\n const deckContainer = useRef(null);\r\n\r\n // Map Instances\r\n const [mapbox, setMapbox] = useState(null);\r\n const deck = useDeck(deckContainer);\r\n const [gl, setGL] = useState(null);\r\n\r\n // Map Style\r\n // TODO: remove?\r\n //const [currentMapStyle, setMapStyle] = useState(mapStyle);\r\n const previousMapStyle = usePrevious(mapStyle);\r\n const [styleLoaded, setStyleLoaded] = useState(false);\r\n\r\n // Map ViewState\r\n const [viewState, setViewState] = useState(props.viewState);\r\n\r\n // DeckGL\r\n // Deck Props\r\n const [deckProps, setDeckProps] = useState({});\r\n const prevDeckLayers = usePrevious(deckLayers);\r\n //const [deckLayers, setDeckLayers] = useState([]);\r\n\r\n // Mapbox\r\n // Potentially use redux/selector for these\r\n //const [mapboxLayers, setMapboxLayers] = useState(props.mapboxLayers);\r\n const previousMapboxLayers = usePrevious(props.mapboxLayers);\r\n\r\n // Map UI\r\n const [popup, setPopup] = useState(null);\r\n const [tooltip, setTooltip] = useState(null);\r\n const [markers, setMarkers] = useState(null);\r\n //const [ui, setUI] = useState(null);\r\n\r\n /* ======================== */\r\n // EFFECTS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Effect: DeckGL Configuration Update\r\n * -----------------------------------\r\n * Creates a new deckgl JSONConverter using a provided\r\n * converter configuration\r\n */\r\n /*useEffect(()=>{\r\n console.debug(`${MapComponent.displayName} | `, 'Effect:Update (jsonConverter) -', 'deckJsonConverterConfig:', deckJsonConverterConfig);\r\n const newConverter = new JSONConverter({configuration: deckJsonConverterConfig});\r\n setJsonConverter(newConverter);\r\n }, [deckJsonConverterConfig]);*/\r\n /* ========================================== */\r\n /**\r\n * Effect: Deck Layer Update\r\n * -------------------------\r\n * Creates new deck props json configuration\r\n * based on the incoming deckLayers prop\r\n */\r\n useEffect(()=>{\r\n console.debug(`${MapComponent.displayName} | `, 'Effect:Update (deckLayers) -', 'prevDeckLayers', prevDeckLayers, 'deckLayers:', deckLayers);\r\n let isSubscribed = true;\r\n // Only update decklayers when mismatch between incoming props and state\r\n if(deck.current/* && !isEqual(prevDeckLayers, deckLayers)*/) {\r\n console.debug(`${MapComponent.displayName} | `, 'Effect:Update (deckLayers) -', 'deckLayers changed');\r\n formatDeckConfig(deckLayers, /*jsonConverter,*/ viewState, setViewState, setPopup).then(dP=>{\r\n console.debug(`${MapComponent.displayName} | `, 'Effect:Update (deckLayers) -', 'deckProps:', dP);\r\n isSubscribed && setDeckProps(dP);\r\n });\r\n }\r\n return () => isSubscribed = false;\r\n }, [deck, prevDeckLayers, deckLayers/*, props.viewState*/]);\r\n\r\n // ATTEMPT AT REBUILDING LAYERS FOR IN LAYER FUNCTION VIEWSTATE CONTEXT\r\n /*useEffect(()=>{\r\n if(deck) {\r\n console.log(deck);\r\n console.log(viewState);\r\n const layers = deck.current.layerManager?.lastRenderedLayers.map(layer=>new layer.constructor(layer.props));\r\n console.log(layers);\r\n if(layers?.length > 0) {\r\n const dP = {\r\n ...deckProps,\r\n layers\r\n };\r\n console.log(dP);\r\n setDeckProps(dP);\r\n }\r\n }\r\n }, [deck, viewState, deckProps]);*/\r\n\r\n /* ========================================== */\r\n /**\r\n * Effect: Map State Update\r\n * ------------------------\r\n * Handles incoming view state prop transitions\r\n * and layer updates\r\n */\r\n useEffect(()=>{\r\n /* ======================== */\r\n // COMPONENT UPDATE\r\n /* ======================== */\r\n if(props.viewState.longitude !== viewState.longitude\r\n || props.viewState.latitude !== viewState.latitude\r\n || props.viewState.zoom !== viewState.zoom\r\n || props.viewState.bearing !== viewState.bearing\r\n || props.viewState.pitch !== viewState.pitch) {\r\n\r\n console.debug(`${MapComponent.displayName} | `, 'Update(viewState) -', 'props.viewState (new):', props.viewState, 'viewState (old):', viewState);\r\n\r\n setViewState({\r\n ...viewState,\r\n ...props.viewState,\r\n ...TRANSITION_SETTINGS,\r\n onTransitionStart: handleLayers\r\n });\r\n //onViewStateUpdate(props.viewState);\r\n }\r\n\r\n // Layers Update\r\n /*if(deckLayers !== props.deckLayers || mapboxLayers !== props.mapboxLayers) {\r\n setDeckLayers(props.deckLayers);\r\n //handleMapboxLayers(props.mapboxLayers);\r\n }*/\r\n\r\n if (styleLoaded&&mapStyle && previousMapStyle && mapStyle.id != previousMapStyle.id) {\r\n console.debug(`${MapComponent.displayName} | `, 'Update(mapStyle) -', 'mapstyle:', mapStyle, 'previousMapStyle:', previousMapStyle);\r\n handleLayers();\r\n }\r\n\r\n /*if(previousMapboxLayers !== mapboxLayers) {\r\n handleLayers();\r\n }*/\r\n }, [mapbox, deck, props.viewState, props.mapboxLayers, props.mapStyle]);\r\n\r\n\r\n /* ========================================== */\r\n /**\r\n * Handle Layers\r\n * -------------\r\n * Toggles mapbox layer visibility according\r\n * to the list loaded style layers and provided\r\n * mapbox layers for the current map state\r\n */\r\n function handleLayers() {\r\n setPopup(null);\r\n if(mapbox) {\r\n // Hide non-base mapbox layers\r\n const loadedStyleLayers = (props.mapStyle.layers) ? props.mapStyle.layers.filter(layer=>!layer.metadata).map(layer=>layer.id) : [];\r\n console.debug(`${MapComponent.displayName} | `, 'Handle Layers (mapboxLayers) -', 'Incoming mapboxLayers', props.mapboxLayers, 'Loaded styleLayers:', loadedStyleLayers);\r\n // Hide Loaded Layers\r\n loadedStyleLayers.forEach(layer=>mapbox.setLayoutProperty(layer,'visibility','none'));\r\n props.mapboxLayers.forEach(layer=>mapbox.setLayoutProperty(layer.name,'visibility','visible'));\r\n }\r\n }\r\n /* ======================== */\r\n // HELPERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle WebGL Context\r\n * --------------------\r\n * Stores webgl instance created from deckgl to\r\n * use for mapbox static map\r\n *\r\n * @param {object} gl webgl instance\r\n */\r\n function handleWebGLInit(gl) {\r\n // DeckGL and mapbox will both draw into this WebGL context\r\n console.debug(`${MapComponent.displayName} | `, 'handleWebGLInit -', 'gl:', gl);\r\n setGL(gl);\r\n }\r\n /* ======================== */\r\n // LOAD HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Load\r\n * -----------\r\n * Handles the initial load of the interactive\r\n * map component (mapbox) and sets the default controls\r\n * and layers\r\n */\r\n function handleLoad() {\r\n if(mapboxContainer.current) {\r\n const mapboxInstance = mapboxContainer.current.getMap();\r\n mapboxInstance.addControl(new AttributionControl({compact: true}), 'bottom-right');\r\n mapboxInstance.addControl(new ScaleControl({unit: 'metric'}), 'bottom-right');\r\n mapboxInstance.on('styledata', ()=>{\r\n setStyleLoaded(true);\r\n });\r\n //mapboxInstance.on('click', handleClick);\r\n console.debug(`${MapComponent.displayName} | `, 'handleLoad -', 'mapbox:', mapboxInstance);\r\n setMapbox(mapboxInstance);\r\n }\r\n }\r\n /* ======================== */\r\n // LAYER HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Mapbox Layers\r\n * --------------------\r\n * Updates mapbox layers with the new specified layers\r\n * via the mapbox api and mapboxLayers state\r\n *\r\n * @param {array} layers new mapbox layers to apply\r\n */\r\n /*function handleMapboxLayers(layers) {\r\n if(mapbox) {\r\n // Mapbox layer Ids\r\n var mapboxLayerIDs = [];\r\n // Remove already loaded mapbox layers from mapbox\r\n mapboxLayers.map(layer=>{\r\n if (mapbox.getLayer(layer))\r\n mapbox.removeLayer(layer);\r\n if (mapbox.getSource(layer))\r\n mapbox.removeSource(layer);\r\n });\r\n\r\n // Add new layers to mapbox\r\n layers.map( layer => {\r\n mapboxLayerIDs.push(layer.id);\r\n mapbox.addLayer(layer, layer.id);\r\n });\r\n // Store loaded mapbox layer ids\r\n setMapboxLayers(mapboxLayerIDs);\r\n }\r\n }*/\r\n /* ======================== */\r\n // EVENT HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle View Update\r\n * ------------------\r\n * Determines viewState change from map component\r\n * callback props\r\n *\r\n * @param {object} states bundled states including\r\n * interaction state, old view state, and current view state\r\n */\r\n function handleViewUpdate({viewState, interactionState, oldViewState}) {\r\n //console.debug(`${MapComponent.displayName} | `, 'handleViewUpdate -', 'viewState:', viewState, 'interactionState:', interactionState, 'oldViewState:', oldViewState);\r\n // Set view state\r\n setViewState(viewState);\r\n // Update active popup\r\n if(popup) {\r\n const coords = mapbox?mapbox.project(popup.anchor):null;\r\n setPopup({...popup, coords});\r\n }\r\n if(oldViewState && !Object.values(interactionState).includes(true)) {\r\n // Check for last view state and all interactions are complete\r\n if(Object.keys(viewState).map(key=>oldViewState[key] === viewState[key]).includes(false)) {\r\n // Update detected\r\n if(onViewStateUpdate)\r\n onViewStateUpdate(viewState);\r\n }\r\n }\r\n return viewState;\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Hover\r\n * ------------\r\n * Handles layer's hover interaction event\r\n *\r\n * @param {object} obj deck object calling hover\r\n */\r\n /*function handleHover(obj) {\r\n if (obj) {\r\n var message = '';\r\n if (obj.sourceLayer) {\r\n for (var i = 0; i < this.deckProps.layers[0].props.data.length; i++) {\r\n if (this.deckProps.layers[0].props.data[i].id == obj.sourceLayer.id){\r\n if (this.deckProps.layers[0].props.data[i].onHover) {\r\n var func = this.deckProps.layers[0].props.data[i].onHover.parseFunction();\r\n message = func(obj);\r\n }\r\n }\r\n }\r\n } else {\r\n // No function message defined\r\n message = '';\r\n }\r\n\r\n // Set tooltip at coord\r\n let x = obj.x;\r\n let y = obj.y;\r\n setTooltip({\r\n message,\r\n x,\r\n y\r\n });\r\n } else {\r\n if (tooltip) {\r\n // Remove tooltip\r\n setTooltip(null);\r\n }\r\n }\r\n }*/\r\n /* ========================================== */\r\n /**\r\n * Handle Click\r\n * ------------\r\n * Handles map click event\r\n *\r\n * @param {object} object clicked object data\r\n * @param {event} event scroll wheel event\r\n */\r\n function handleClick(pointerObj, e) {\r\n console.debug(`${MapComponent.displayName} | `, 'handleClick -', 'pointerObj:', pointerObj);\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Popup Close\r\n * ------------------\r\n * Closes popup by removing the popup state\r\n */\r\n function handlePopupClose() {\r\n if(deck) {\r\n // Close open popup\r\n if(popup)\r\n setPopup(null);\r\n }\r\n }\r\n /* ========================================== */\r\n /**\r\n * Handle Reset Button\r\n * -------------------\r\n * Triggers onReset property function\r\n */\r\n const handleResetButton = useCallback(() => {\r\n onReset();\r\n }, [onReset]);\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Render Base UI\r\n * --------------\r\n * Renders branding and base map control buttons\r\n */\r\n function renderUI() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n }\r\n /* ========================================== */\r\n /**\r\n * Render Children\r\n * ---------------\r\n * Exposes mapbox and deck instances to a\r\n * child function wrapper\r\n */\r\n function renderChildren() {\r\n if (typeof props.children === 'function') {\r\n return (\r\n
\r\n {props.children(mapbox, deck.current)}\r\n
\r\n );\r\n }\r\n }\r\n return (\r\n <>\r\n event.preventDefault()}\r\n >\r\n \r\n {popup && (\r\n \r\n \r\n
\r\n )}\r\n \r\n { renderChildren() }\r\n \r\n \r\n \r\n {//\r\n }\r\n \r\n \r\n
\r\n { renderUI() }\r\n \r\n );\r\n};\r\n/* ======================== */\r\n// PROPS\r\n/* ======================== */\r\nMapComponent.propTypes = {\r\n children: PropTypes.oneOfType([\r\n PropTypes.elementType,\r\n PropTypes.func\r\n ]),\r\n screen: PropTypes.shape({\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired\r\n }),\r\n // Map Props\r\n mapboxToken: PropTypes.string.isRequired,\r\n mapStyle: PropTypes.string.isRequired,\r\n viewState: PropTypes.shape({\r\n longitude: PropTypes.number.isRequired,\r\n latitude: PropTypes.number.isRequired,\r\n zoom: PropTypes.number.isRequired,\r\n pitch: PropTypes.number.isRequired,\r\n bearing: PropTypes.number.isRequired\r\n }),\r\n // Vis Layers\r\n deckLayers: PropTypes.arrayOf(PropTypes.object),\r\n deckJsonConverterConfig: PropTypes.arrayOf(PropTypes.object),\r\n //mapboxLayers: PropTypes.arrayOf(PropTypes.object),\r\n mapboxLayers: PropTypes.arrayOf(PropTypes.string),\r\n markers: PropTypes.arrayOf(PropTypes.object),\r\n spriteJSON: PropTypes.object,\r\n // Functions\r\n onViewStateUpdate: PropTypes.func,\r\n onReset: PropTypes.func\r\n};\r\nMapComponent.defaultProps = {\r\n deckLayers: [],\r\n mapboxLayers: [],\r\n markers: []\r\n};\r\nMapComponent.displayName = 'MapComponent';\r\n/* ======================== */\r\n// HOOKS\r\n/* ======================== */\r\n/* ========================================== */\r\n/**\r\n * Use Mapbox\r\n * ----------\r\n * Gets mapbox instance from mapbox component\r\n * reference\r\n *\r\n * @param {reference} mapboxRef reference to mapbox component\r\n */\r\nconst useMapbox = (mapboxRef) => {\r\n const mapboxInstance = useRef(null);\r\n const currentRef = mapboxRef.current;\r\n useEffect(()=>{\r\n if(currentRef)\r\n mapboxInstance.current = mapboxRef.current.getMap();\r\n }, [mapboxRef, currentRef]);\r\n return mapboxInstance;\r\n};\r\n/* ========================================== */\r\n/**\r\n * Use Deck\r\n * ---------\r\n * Gets deckgl instance from deck component\r\n *\r\n * @param {reference} deckRef reference to deckgl component\r\n */\r\nconst useDeck = (deckRef) => {\r\n const deckInstance = useRef(null);\r\n useEffect(()=>{\r\n if(deckRef.current)\r\n deckInstance.current = deckRef.current.deck;\r\n }, [deckRef]);\r\n return deckInstance;\r\n};\r\n\r\n/* ========================================== */\r\n/**\r\n * Markers\r\n * -------\r\n * Renders map markers\r\n *\r\n * @param {array} markers markers data\r\n */\r\nconst Markers = ({markers}) => {\r\n /* ======================== */\r\n // PROPS\r\n /* ======================== */\r\n //const classes = useStyles();\r\n /* ======================== */\r\n // HANDLERS\r\n /* ======================== */\r\n /* ========================================== */\r\n /**\r\n * Handle Click\r\n * ------------\r\n * Outputs data for marker click\r\n * @param {object} data marker data prop\r\n */\r\n function handleClick(data) {\r\n console.debug(`${Markers.displayName} | `, 'handleClick -', 'data:', data);\r\n }\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return markers && markers.data.map((marker, index) => {\r\n // create a DOM element for the marker\r\n return (\r\n \r\n \r\n \r\n );\r\n });\r\n};\r\n/* ========================================== */\r\n/**\r\n * Tooltip\r\n * -------\r\n * Renders map tooltip\r\n */\r\nconst Tooltip = (props) => {\r\n //const classes = useStyles();\r\n const {tooltip} = props;\r\n /* ======================== */\r\n // RENDER\r\n /* ======================== */\r\n return tooltip && tooltip.message && (\r\n \r\n { tooltip.message }\r\n
\r\n );\r\n};\r\n/* ========================================== */\r\n// Export\r\n/* ========================================== */\r\nexport default MapComponent;\r\n/*export default React.memo(MapComponent, areEqual);\r\nfunction areEqual(prevProps, nextProps) {\r\n return (\r\n prevProps.mapStyle === nextProps.mapStyle &&\r\n !prevProps.mapboxLayers.some((layer, i)=>layer !== nextProps.mapboxLayers[i]) &&\r\n !prevProps.loadedLayers.some((layer, i)=>layer !== nextProps.loadedLayers[i]) &&\r\n !prevProps.deckLayers.some((layer, i)=>layer !== nextProps.deckLayers[i]) &&\r\n JSON.stringify(prevProps.viewState) === JSON.stringify(nextProps.viewState)\r\n );\r\n}*/\r\n/* ========================================== */\r\n/**\r\n * Format Deck Config\r\n * ------------------\r\n * Transforms deck configuration from json format\r\n * including resolving any functions with current\r\n * map component functions\r\n * @param {array} deckLayers deck layers\r\n * @param {object} viewState current map view state\r\n * @param {func} setPopup sets current popup UIs\r\n */\r\nconst formatDeckConfig = (\r\n deckLayers,\r\n //jsonConverter,\r\n // eslint-disable-next-line no-unused-vars\r\n viewState,\r\n // eslint-disable-next-line no-unused-vars\r\n setViewState,\r\n setPopup\r\n) => new Promise((resolve, reject) => {\r\n try {\r\n // eslint-disable-next-line no-unused-vars\r\n const zoom = (viewState, lng, lat) => {\r\n setViewState({...viewState, longitude: lng, latitude: lat, zoom: (viewState.zoom + (4*Math.log10(viewState.zoom))), ...TRANSITION_SETTINGS});\r\n };\r\n // eslint-disable-next-line no-unused-vars\r\n const openPopup = (x, y, alng, alat, title, image, contact, summary) => {\r\n setPopup({\r\n coords:{x, y},\r\n //anchor: [alat,alng]\r\n anchor:{ lng: alng, lat: alat},\r\n content:{title, image, contact, summary}\r\n });\r\n };\r\n\r\n const deckLayerConfigs = deckLayers.map(deckLayer=>{\r\n let config = {};\r\n Object.keys(deckLayer.config).forEach(key=>{\r\n const value = deckLayer.config[key];\r\n //if(key !== 'updateTriggers') {\r\n config[key] = (/(\\w+\\s?=>[^\\n]+)|(function\\([\\w\\s\\,]+\\)\\s?\\{[^\\n]+\\})/.test(value)) ? eval(`(${value})`) : value;\r\n /*} else {\r\n let updateTriggers = {};\r\n Object.keys(value).forEach(triggerKey=>{\r\n updateTriggers[triggerKey] = value[triggerKey].map(val=>eval(`(${val})`));\r\n });\r\n config['updateTriggers'] = updateTriggers;\r\n }*/\r\n });\r\n\r\n // Parse interaction handler functions\r\n /*Object.keys(deckLayer.config).filter(key=>(/on\\w+/).test(key)).forEach(key=>{\r\n const value = deckLayer.config[key];\r\n if(value && typeof value === 'object') {\r\n const handlerFunction = d => Object.keys(value).map(funcName=>functionLibrary[funcName](value[funcName]))\r\n config[key] = handlerFunction;//functionLibrary[value]\r\n }\r\n })*/\r\n console.debug(`${MapComponent.displayName} | `, 'formatDeckConfig -', 'config:', config);\r\n return config;\r\n });\r\n\r\n // Resolve DeckProps\r\n const dP = jsonConverter.convert({\r\n controller: 'MapController',\r\n //mapStyle: typeof mapStyle === 'string' ? mapStyle : `mapbox://styles/ifeviser/${mapStyle.id}`,\r\n layers: [...deckLayerConfigs]\r\n });\r\n console.debug(`${MapComponent.displayName} | `, 'formatDeckConfig -', 'deckProps:', dP);\r\n resolve(dP);\r\n\r\n } catch (e) {\r\n console.error(`${MapComponent.displayName} | `, 'formatDeckConfig -', e);\r\n reject(e);\r\n }\r\n});","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nvar _makeStyles = _interopRequireDefault(require(\"@material-ui/styles/makeStyles\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar useStyles = (0, _makeStyles[\"default\"])(function (theme) {\n return {\n root: {\n userSelect: 'none',\n touchAction: 'none',\n pointerEvents: 'none',\n opacity: 0.75,\n fontFamily: '\"Montserrat\", sans-serif',\n fontWeight: 'bold',\n fontSize: '1.25em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'right',\n alignSelf: 'flex-end',\n marginTop: 0,\n textRendering: 'optimizeLegibility',\n '&.dark': {\n color: theme.palette.common.black,\n textShadow: \"0.05em 0.05em 0 rgba(255,255,255,0.8), \\n -0.05em -0.05em 0 rgba(255,255,255,0.8), \\n 0.05em -0.05em 0 rgba(255,255,255,0.8), \\n -0.05em 0.05em 0 rgba(255,255,255,0.8),\\n 0.05em 0.05em 0 rgba(255,255,255,0.8)\\n \"\n },\n '&.light': {\n color: theme.palette.common.white,\n textShadow: \"0.05em 0.1em 0.15em rgba(0,0,0,0.5), \\n -0.05em -0.05em 0.1em rgba(0,0,0,0.5), \\n 0.05em -0.05em 0.1em rgba(0,0,0,0.5), \\n -0.05em 0.05em 0.1em rgba(0,0,0,0.25), \\n 0.05em 0.05em 0.5em rgba(0,0,0,0.2)\"\n }\n },\n circle: {\n width: '1.5em',\n height: '1.5em',\n borderRadius: '1.5em',\n marginRight: '0.1em',\n '&.dark': {\n backgroundColor: theme.palette.common.black\n },\n '&.light': {\n backgroundColor: theme.palette.common.white\n },\n boxShadow: \"rgba(0, 0, 0, 0.5) 0 0.1em 0.1em 0, \\n rgba(0, 0, 0, 0.25) 0 0.05em 0.05em 0, \\n rgba(0, 0, 0, 0.2) 0 0.05em 0.05em -0.05em\"\n },\n trademark: {\n fontFamily: '\\'Open Sans\\', sans-serif',\n fontWeight: 'bold',\n fontSize: '0.5em',\n color: 'inherit',\n alignSelf: 'flex-start'\n }\n };\n});\n\nvar MyGlobeIcon = function MyGlobeIcon(_ref) {\n var type = _ref.type;\n var classes = useStyles();\n var brandingClasses = (0, _classnames[\"default\"])(classes.root, {\n 'light': type === 'light',\n 'dark': type === 'dark'\n });\n var circleClasses = (0, _classnames[\"default\"])(classes.circle, {\n 'light': type === 'light',\n 'dark': type === 'dark'\n });\n return _react[\"default\"].createElement(\"div\", {\n className: brandingClasses\n }, _react[\"default\"].createElement(\"div\", {\n className: circleClasses\n }), _react[\"default\"].createElement(\"span\", null, \"MYGLOBE\"), _react[\"default\"].createElement(\"span\", {\n className: classes.trademark\n }, \"TM\"));\n};\n\nMyGlobeIcon.propTypes = {\n type: _propTypes[\"default\"].oneOf(['light', 'dark'])\n};\nMyGlobeIcon.defaultProps = {\n type: 'light'\n};\nvar _default = MyGlobeIcon;\nexports[\"default\"] = _default;","/* ================================================================ */\r\n// DATA ACTIONS - Content | Content.js\r\n/* ================================================================ */\r\n/* ========================================== */\r\n// Imports\r\n/* ========================================== */\r\nimport 'dotenv/config';\r\nimport PropTypes from 'prop-types';\r\n// Constants\r\nimport { LoadingTypes } from '@myglobe/core/dist/types';\r\nimport { getMissingIds, getPagesById, getStoriesById, getPanelsById } from '../../selectors/Data';\r\n// Data Action Helpers\r\nimport { callAPI, callAPISecurely, addData, mappify } from '.';\r\nimport { fetchStates } from './Mapping';\r\n/* ========================================== */\r\n// Actions\r\n/* ========================================== */\r\n// > Page Data\r\nexport const FETCH_PAGES = 'FETCH_PAGES';\r\nexport const FETCH_PAGES_FAILURE = 'FETCH_PAGES_FAILURE';\r\nexport const FETCH_PAGES_SUCCESS = 'FETCH_PAGES_SUCCESS';\r\n// > Story Data\r\nexport const FETCH_STORIES = 'FETCH_STORIES';\r\nexport const FETCH_STORIES_FAILURE = 'FETCH_STORIES_FAILURE';\r\nexport const FETCH_STORIES_SUCCESS = 'FETCH_STORIES_SUCCESS';\r\nexport const CREATE_STORY = 'CREATE_STORY';\r\nexport const CREATE_STORY_SUCCESS = 'CREATE_STORY_SUCCESS';\r\nexport const UPDATE_STORY = 'UPDATE_STORY';\r\nexport const UPDATE_STORY_SUCCESS = 'UPDATE_STORY_SUCCESS';\r\nexport const ADD_STORY = 'ADD_STORY';\r\nexport const DELETE_STORY = 'DELETE_STORY';\r\nexport const DELETE_STORY_SUCCESS = 'DELETE_STORY_SUCCESS';\r\nexport const DELETE_STORY_FAILURE = 'DELETE_STORY_FAILURE';\r\n// > Panel Data\r\nexport const FETCH_PANELS = 'FETCH_PANELS';\r\nexport const FETCH_PANELS_FAILURE = 'FETCH_PANELS_FAILURE';\r\nexport const FETCH_PANELS_SUCCESS = 'FETCH_PANELS_SUCCESS';\r\nexport const CREATE_PANEL = 'CREATE_PANEL';\r\nexport const CREATE_PANEL_SUCCESS = 'CREATE_PANEL_SUCCESS';\r\nexport const DELETE_PANEL = 'DELETE_PANEL';\r\nexport const DELETE_PANEL_FAILURE = 'DELETE_PANEL_FAILURE';\r\nexport const DELETE_PANEL_SUCCESS = 'DELETE_PANEL_SUCCESS';\r\nexport const UPDATE_PANEL = 'UPDATE_PANEL';\r\nexport const UPDATE_PANEL_SUCCESS = 'UPDATE_PANEL_SUCCESS';\r\nexport const UPDATE_PANEL_ORDER = 'UPDATE_PANEL_ORDER';\r\nexport const UPDATE_PANEL_ORDER_FAILURE = 'UPDATE_PANEL_ORDER_FAILURE';\r\nexport const UPDATE_PANEL_ORDER_SUCCESS = 'UPDATE_PANEL_ORDER_SUCCESS';\r\nexport const PANEL_ACTION_FAILURE = 'PANEL_ACTION_FAILURE';//see if one fail will suffice\r\n// > State data\r\nexport const UPDATE_VISSTATE = 'UPDATE_VISSTATE';\r\nexport const UPDATE_VISSTATE_SUCCESS = 'UPDATE_VISSTATE_SUCCESS';\r\nexport const UPDATE_VISSTATE_FAILURE = 'UPDATE_VISSTATE_SUCCESS';\r\n// > Vis Layers\r\nexport const FETCH_DODGY_VISLAYERS = 'FETCH_DODGY_VISLAYERS';\r\nexport const UPDATE_DODGY_VISLAYERS = 'UPDATE_DODGY_VISLAYERS';\r\n\r\n\r\n\r\n/* ========================================== */\r\n// Action Functions\r\n/* ========================================== */\r\n/* ========================================== */\r\n/**\r\n * Fetch Pages\r\n * -----------\r\n * Fetches pages from db according to specified\r\n * page ids\r\n * @param {array} pageUUIDs\r\n */\r\nexport function fetchPages(pageUUIDs) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: FETCH_PAGES, pages: pageUUIDs });\r\n\r\n var fetchPageUUIDs = pageUUIDs;\r\n // Check loading mode\r\n /*if(process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Get current story ids\r\n const currentPageIds = getPagesByUUID(getState());\r\n // Check all story ids are present in loaded stories\r\n const loadedPageUUIDs = pageUUIDs.filter(uuid=>currentPageIds.includes(uuid));\r\n // Remaining stories check\r\n fetchPageUUIDs = pageUUIDs.filter(uuid=>!loadedPageUUIDs.includes(uuid));\r\n }*/\r\n\r\n // External Endpoint Fetch\r\n if (fetchPageUUIDs.length > 0) {\r\n let query = '{';\r\n fetchPageUUIDs.forEach((uuid, i) => query += `page${i}: page(id: \"${uuid}\") {\r\n uuid: id\r\n name\r\n slug\r\n type\r\n content\r\n style\r\n globeId\r\n }\\n`);\r\n query += '}';\r\n\r\n return callAPI(query)\r\n .then(response => {\r\n const { data } = response;\r\n // Format page data to array\r\n const formattedData = Object.values(data).map(d => ({ ...d, type: d.type.toLowerCase() }));\r\n // Convert to page slug id map\r\n const payload = mappify('slug', formattedData);\r\n dispatch(addData('pages', payload));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({ type: FETCH_PAGES_SUCCESS });\r\n })\r\n .catch(error => {\r\n console.warn(error);\r\n dispatch({ type: FETCH_PAGES_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchPages.propTypes = {\r\n pageUUIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Fetch Stories\r\n * -------------\r\n * Fetches stories from db according to specified\r\n * story ids\r\n *\r\n * @param {array} storyUUIDs story uuids\r\n */\r\nexport function fetchStories(storyUUIDs) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: FETCH_STORIES, stories: storyUUIDs });\r\n\r\n var fetchStoryUUIDs = storyUUIDs;\r\n // Check loading mode\r\n //TODO: Convert from slug id to uuid via selector here\r\n /*if(process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Get current story ids\r\n const currentStoryUUIDs = getStoriesById(getState());\r\n // Check all story ids are present in loaded stories\r\n const loadedStoryUUIDs = storyUUIDs.filter(uuid=>currentStoryUUIDs.includes(uuid));\r\n // Remaining stories check\r\n fetchStoryUUIDs = storyUUIDs.filter(uuid=>!loadedStoryUUIDs.includes(uuid));\r\n }*/\r\n\r\n // External Endpoint Fetch\r\n if (fetchStoryUUIDs.length > 0) {\r\n let query = '{';\r\n fetchStoryUUIDs.forEach((uuid, i) => query += `story${i}: story(id: \"${uuid}\") {\r\n uuid: id\r\n title\r\n slug\r\n panels: storyPanels {\r\n nodes {\r\n panelId\r\n }\r\n }\r\n order\r\n globeId\r\n }\\n`);\r\n query += '}';\r\n\r\n return callAPI(query)\r\n .then(response => {\r\n const { data } = response;\r\n // Format story data with panels id array\r\n const formattedData = Object.values(data).map(story => {\r\n const formattedItem = {\r\n ...story,\r\n panels: story.panels.nodes.map(node => node.panelId)\r\n };\r\n return formattedItem;\r\n });\r\n // Convert to story id map\r\n const payload = mappify('slug', formattedData);\r\n // Get all panel ids in stories as a flat set\r\n const panelUUIDs = [...new Set(Object.values(payload).map(story => story.panels).flat())];\r\n const getUnloadedIds = getMissingIds('panels', panelUUIDs);\r\n const missingPanels = getUnloadedIds(getState());\r\n if (missingPanels.length > 0)\r\n dispatch(fetchPanels(missingPanels));\r\n\r\n dispatch(addData('stories', payload));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({ type: FETCH_STORIES_SUCCESS });\r\n })\r\n .catch(error => {\r\n console.warn(error);\r\n dispatch({ type: FETCH_STORIES_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchStories.propTypes = {\r\n panelUUIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * Fetch Panels\r\n * ------------\r\n * Retrieves panels from a given\r\n * story subcollection and saves to state\r\n *\r\n * @param {array} panelIDs list of panel ids\r\n */\r\nexport function fetchPanels(panelUUIDs) {\r\n return (dispatch, getState) => {\r\n //const db = getState().Data.config;\r\n dispatch({ type: FETCH_PANELS });\r\n\r\n var fetchPanelIds = panelUUIDs;\r\n // Check loading mode\r\n if (process.env.DATA_LOAD_MODE === LoadingTypes.SEQUENTIAL) {\r\n // Get current panel ids\r\n const currentPanelIds = getPanelsById(getState());\r\n // Check all panel ids are present in loaded panels\r\n const loadedPanelUUIDs = panelUUIDs.filter(uuid => currentPanelIds.includes(uuid));\r\n // Remaining panels check\r\n fetchPanelIds = panelUUIDs.filter(uuid => !loadedPanelUUIDs.includes(uuid));\r\n }\r\n\r\n if (fetchPanelIds.length > 0) {\r\n // External Endpoint Fetch\r\n let query = '{';\r\n fetchPanelIds.forEach((uuid, i) => query += `panel${i}: panel(id: \"${uuid}\") {\r\n uuid: id\r\n slug\r\n title\r\n type\r\n background\r\n sections\r\n content\r\n position\r\n config\r\n state {\r\n uuid: id\r\n name\r\n viewState\r\n id\r\n }\r\n interactions\r\n styles\r\n }\\n`);\r\n query += '}';\r\n\r\n return callAPI(query)\r\n .then(response => {\r\n const { data } = response;\r\n console.log(\"###\",data);\r\n let stateMap = {};\r\n const payload = Object.values(data).reduce((map, obj) => {\r\n map[obj.uuid] = {\r\n ...obj,\r\n state: obj.state.name,\r\n viewState: obj.state.viewState,\r\n viewStateId: obj.state.id,\r\n //config: JSON.parse(obj.config) || null,\r\n //sections: JSON.parse(obj.sections),\r\n //styles: JSON.parse(obj.styles) || null\r\n };\r\n stateMap[obj.state.name] = obj.state.uuid;\r\n return map;\r\n }, {});\r\n\r\n // Find and retrieve missing states\r\n const stateIds = [...new Set(Object.values(payload).map(story => story.state))];\r\n const getUnloadedIds = getMissingIds('states', stateIds);\r\n const missingStates = getUnloadedIds(getState());\r\n const missingStateUUIDs = missingStates.map(uuid => stateMap[uuid]);\r\n console.debug('Data > Content (Actions) | ', 'fetchPanels -', 'missingStates:', missingStates, 'missingStateUUIDs:', missingStateUUIDs);\r\n if (missingStateUUIDs.length > 0)\r\n dispatch(fetchStates(missingStateUUIDs));\r\n\r\n dispatch(addData('panels', payload));\r\n // TODO: ASYNC SUCCESS HANDLING\r\n dispatch({ type: FETCH_PANELS_SUCCESS });\r\n })\r\n .catch(error => {\r\n console.warn('Data > Content (Actions) | ', 'fetchPanels -', error);\r\n dispatch({ type: FETCH_PANELS_FAILURE, error });\r\n });\r\n }\r\n };\r\n}\r\nfetchPanels.propTypes = {\r\n panelUUIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n};\r\n/* ========================================== */\r\n/**\r\n * CREATE Story\r\n * ------------\r\n * CREATE story and return its id\r\n *\r\n *\r\n * @param {object} story the story object with title slug but no panels\r\n */\r\nexport function createStory(story, globeId) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: CREATE_STORY });\r\n console.log(globeId);\r\n //potentially make these props dynamic if needed\r\n let query = `mutation CreateStoryMutation($globeId:UUID!, $title:String, $slug:String!) {\r\n __typename\r\n createStory(input: {\r\n title: $title,\r\n slug: $slug\r\n }) {\r\n story {\r\n uuid: id\r\n title\r\n slug\r\n panels\r\n }\r\n }\r\n }`;\r\n let variables = {\r\n \"title\": story.title,\r\n \"slug\": story.slug,\r\n globeId\r\n };\r\n return callAPISecurely(query, variables).then(response => {\r\n console.log(response);\r\n let story = response.data.createStory.story;\r\n dispatch({ type: CREATE_STORY_SUCCESS, payload: story });\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * UPDATE Story\r\n * ------------\r\n * Updates story by UUID & Globe Name\r\n *\r\n *\r\n * @param {object} story the story object with title slug panels props\r\n */\r\nexport function updateStory(story, globeName) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: UPDATE_STORY });\r\n //potentially make these props dynamic if needed\r\n let query = `mutation UpdateStory($id: UUID!, $title:String, $slug:String) {\r\n updateStoryById(input: {storyPatch: {title: $title, slug: $slug}, id: $id}) {\r\n story {\r\n uuid: id\r\n title\r\n slug\r\n }\r\n }}`;\r\n // could maybe just use the panel object here rather than assigning?\r\n let variables = {\r\n \"id\": story.uuid,\r\n \"title\": story.title,\r\n \"slug\": story.slug\r\n };\r\n return /*callAPISecurely(query, variables)*/callAPISecurely(query, variables).then(response => {\r\n let story = response.data.updateStoryById.story;\r\n dispatch({ type: UPDATE_STORY_SUCCESS, payload: story });\r\n });\r\n }\r\n}\r\n/* ========================================== */\r\n/**\r\n * DELETE Story\r\n * ------------\r\n * Delete story and associated panels\r\n *\r\n *\r\n * @param {uuid} panelId the panel ID\r\n * @param {uuid} storyId the story ID\r\n */\r\nexport function deleteStory(storyId) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: DELETE_STORY });\r\n console.log(storyId);\r\n let query = `mutation DeleteStoryMutation($storyId: UUID!) { \r\n deletePanelsByStory(input: {deletedStoryId: $storyId}) {\r\n clientMutationId\r\n }\r\n deleteStoryById(input: {id: $storyId}) {\r\n clientMutationId\r\n story {\r\n id\r\n }\r\n }\r\n }`;\r\n let variables = {\r\n storyId\r\n };\r\n return callAPISecurely(query, variables).then(response => {\r\n console.log(response);\r\n const deletedStoryUUID = response.data.deleteStoryById?.story?.id;\r\n if(deletedPanelUUID)\r\n dispatch({ type: DELETE_STORY_SUCCESS, payload: deletedStoryUUID });\r\n else \r\n dispatch({type: DELETE_STORY_FAILURE, payload: response.error});\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * UPDATE Panel\r\n * ------------\r\n * Updates panel by UUID & Globe Name\r\n *\r\n *\r\n * @param {object} panel the panel object with title slug content props\r\n */\r\nexport function updatePanel(panel, globeName,viewState) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: UPDATE_PANEL });\r\n console.log(\"###PANEL\",panel,viewState);\r\n //potentially make these props dynamic if needed\r\n let query = `mutation UpdatePanel($id: UUID!, $title:String, $slug:String, $content:String, $viewStateId:UUID!, $viewState:JSON) {\r\n updatePanelById(input: {panelPatch: {title: $title, slug: $slug, content: $content,\r\n visStateToStateId: {updateById: {visStatePatch: {viewState: $viewState}, id: $viewStateId}}},\r\n id: $id}) {\r\n panel {\r\n uuid: id\r\n title\r\n slug\r\n content\r\n position\r\n }\r\n }}`;\r\n let variables = {\r\n \"id\": panel.uuid,\r\n \"title\": panel.title,\r\n \"slug\": panel.slug,\r\n \"position\": panel.position,\r\n \"content\": panel.content,\r\n \"viewState\":viewState,\r\n \"viewStateId\":panel.viewStateId\r\n };\r\n return /*callAPISecurely(query, variables)*/callAPISecurely(query, variables).then(response => {\r\n let { panel } = response.data.updatePanelById;\r\n dispatch({ type: UPDATE_PANEL_SUCCESS, payload: panel });\r\n });\r\n }\r\n}\r\n/* ========================================== */\r\n/**\r\n * REORDER Panels\r\n * ------------\r\n * Reorder panels\r\n *\r\n *\r\n * @param {object} panels the array of panels requiring updating {@param id, @param position}\r\n */\r\nexport function updatePanelOrder(panels) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: UPDATE_PANEL_ORDER });\r\n console.log(panels);\r\n let query = 'mutation ReorderPanelsMutation{';\r\n panels.forEach((panel, i)=>query += `post${i+1}: updatePanelById(input:{panelPatch:{position:${panel.position}} id:\"${panel.uuid}\"}) {\r\n panel {\r\n uuid: id\r\n title\r\n slug\r\n content\r\n position\r\n }\r\n }\\n`);\r\n query+='}';\r\n console.log(query);\r\n return /*callAPISecurely(query)*/callAPISecurely(query).then(response => {\r\n console.log(response);\r\n if(response.error)\r\n dispatch({type: UPDATE_PANEL_ORDER_FAILURE, payload: response.error});\r\n else {\r\n const panels = Object.keys(response.data).map(key=>response.data[key].panel);\r\n dispatch({ type: UPDATE_PANEL_ORDER_SUCCESS, payload: panels });\r\n }\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * CREATE Panel\r\n * ------------\r\n * CREATE panel return its id\r\n *\r\n *\r\n * @param {object} panel the panel object with title slug content props\r\n */\r\nexport function createPanel(panel, storyId, globeId) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: CREATE_PANEL });\r\n console.log(panel, storyId, globeId);\r\n //potentially make these props dynamic if needed\r\n let query = `mutation CreatePanelMutation($storyId:UUID!, $globeId:UUID!, $title:String, $slug:String!, $content:String, $position:Int) {\r\n __typename\r\n createPanel(input: {\r\n panel: {storyPanelsUsingId: {\r\n create: {storyId: $storyId}\r\n },\r\n content: $content,\r\n slug: $slug,\r\n title: $title,\r\n position: $position,\r\n visStateToStateId: {\r\n create: {\r\n name: $slug, \r\n viewState: \"{}\",\r\n globeId: $globeId\r\n }\r\n }\r\n }\r\n }) {\r\n panel {\r\n uuid: id\r\n title\r\n slug\r\n content\r\n position\r\n }\r\n }\r\n }`;\r\n let variables = {\r\n \"title\": panel.title,\r\n \"slug\": panel.slug,\r\n \"content\": panel.content,\r\n \"position\": panel.position,\r\n globeId,\r\n storyId\r\n };\r\n return callAPISecurely(query, variables).then(response => {\r\n console.log(response);\r\n let panel = response.data.createPanel.panel;\r\n dispatch({ type: CREATE_PANEL_SUCCESS, payload: panel });\r\n });\r\n };\r\n}\r\n/* ========================================== */\r\n/**\r\n * DELETE Panel\r\n * ------------\r\n * Delete panel and associated story relationship\r\n *\r\n *\r\n * @param {uuid} panelId the panel ID\r\n * @param {uuid} storyId the story ID\r\n */\r\nexport function deletePanel(panelId, storyId) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: DELETE_PANEL });\r\n let query = `mutation DeletePanelMutation($storyId: UUID!, $panelId: UUID!) {\r\n deleteStoryPanelByStoryIdAndPanelId(input: {storyId: $storyId, panelId: $panelId}) {\r\n clientMutationId\r\n deletedStoryPanelId\r\n }\r\n deletePanelById(input: {id: $panelId}) {\r\n clientMutationId\r\n deletedPanelId\r\n panel {\r\n uuid: id\r\n }\r\n }\r\n }`;\r\n let variables = {\r\n panelId,\r\n storyId\r\n };\r\n return callAPISecurely(query, variables).then(response => {\r\n console.log(response);\r\n const deletedPanelUUID = response.data.deletePanelById?.panel?.uuid;\r\n if(deletedPanelUUID)\r\n dispatch({ type: DELETE_PANEL_SUCCESS, payload: deletedPanelUUID });\r\n else \r\n dispatch({type: DELETE_PANEL_FAILURE, payload: response.error});\r\n });\r\n };\r\n}\r\n\r\n\r\n/* ========================================== */\r\n/**\r\n * UPDATE VisState\r\n * ------------\r\n * Updates panel by UUID & Globe Name\r\n *\r\n *\r\n * @param {object} panel the panel object with title slug content props\r\n */\r\nexport function updateVisState(visState) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: UPDATE_VISSTATE });\r\n //potentially make these props dynamic if needed\r\n let query = `mutation updateVisStateById($UpdateVisStateByIdInput: UpdateVisStateByIdInput!) {\r\n __typename\r\n updateVisStateById(input: $UpdateVisStateByIdInput) {\r\n clientMutationId\r\n visState {\r\n id\r\n globeId\r\n mapStyle\r\n name\r\n nodeId\r\n viewState\r\n }\r\n } \r\n }`;\r\n // could maybe just use the panel object here rather than assigning?\r\n let variables = {\r\n \"UpdateVisStateByIdInput\": {\r\n \"visStatePatch\": visState, \r\n \"id\":visState.id\r\n }\r\n };\r\n return /*callAPISecurely(query, variables)*/callAPISecurely(query, variables).then(response => {\r\n let { visState } = response.data.updateVisStateById;\r\n dispatch({ type: UPDATE_VISSTATE_SUCCESS, payload: visState });\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Fetch Vis Layers\r\n * -----------\r\n * Fetches vislayers from db according to specified\r\n * vis layer ids\r\n * @param {array} vislayerUUIDs\r\n */\r\n\r\n /* TODO: REMOVE DODGY ENDPOINTS AND MAKE A DB CALL */\r\n// export function fetchVisLayers() {\r\n// return (dispatch, getState) => {\r\n// dispatch({ type: FETCH_VISLAYERS });\r\n\r\n// var geojsonUrl = 'https://api.myglobe.app/rousuploads?path=geojson';\r\n// var czmlUrl = 'https://api.myglobe.app/rousuploads?path=czml';\r\n// fetch(geojsonUrl) // Call the fetch function passing the url of the API as a parameter\r\n// .then((resp) => resp.json())\r\n// .then((data) => {\r\n// var datasetArray = data.map( (Id) => {\r\n// var split = Id.split('/');\r\n// var Name = split[split.length-1];\r\n// var Title = Name.split('.')[0];\r\n// var Id = 'https://rous.myglobe.app'+Id;\r\n// return { Title, Name, Id, Display: true };\r\n// });\r\n// setDatasets(datasetArray);\r\n// })\r\n// .catch(function(e) {\r\n// //TODO #benjob\r\n// console.log(\"ERROR retrieving datasets:\", e);\r\n// });\r\n\r\n// fetch(czmlUrl) // Call the fetch function passing the url of the API as a parameter\r\n// .then((resp) => resp.json())\r\n// .then((data) => {\r\n// var visArray = data.map( (Id) => {\r\n// var split = Id.split('/');\r\n// var Name = split[split.length-1];\r\n// var Title = Name.split('.')[0];\r\n// var Id = 'https://myglobe.app'+Id;\r\n// return { style: \"\", Name, Filename: Name, Id, Display: true, Visible: false, type: \"CZML\" }; \r\n// });\r\n// setVisLayers(visArray);\r\n// })\r\n// .catch(function(e) {\r\n// //TODO #benjob\r\n// console.log(\"ERROR retrieving datasets:\", e);\r\n// });\r\n \r\n// };\r\n// }\r\n// fetchPages.propTypes = {\r\n// pageUUIDs: PropTypes.arrayOf(PropTypes.string).isRequired\r\n// };\r\n\r\nexport function updateDodgyVislayers(visLayerArray) {\r\n return (dispatch, getState) => {\r\n dispatch({ type: UPDATE_DODGY_VISLAYERS, payload:visLayerArray });\r\n }\r\n}"],"sourceRoot":""}