Update sources if they change

This commit is contained in:
Lukas Martinelli 2016-12-29 15:22:47 +01:00
parent bf5131cadd
commit 29cfb58a56
7 changed files with 46 additions and 13 deletions

View file

@ -24,6 +24,7 @@
"file-saver": "^1.3.2", "file-saver": "^1.3.2",
"lodash.capitalize": "^4.2.1", "lodash.capitalize": "^4.2.1",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"lodash.isequal": "^4.4.0",
"lodash.throttle": "^4.1.1", "lodash.throttle": "^4.1.1",
"lodash.topairs": "^4.3.0", "lodash.topairs": "^4.3.0",
"mapbox-gl": "^0.29.0", "mapbox-gl": "^0.29.0",

View file

@ -20,9 +20,9 @@ import LayerWatcher from '../libs/layerwatcher'
export default class App extends React.Component { export default class App extends React.Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.layerWatcher = new LayerWatcher()
this.styleStore = new ApiStyleStore() this.styleStore = new ApiStyleStore()
this.revisionStore = new RevisionStore() this.revisionStore = new RevisionStore()
this.styleStore.supported(isSupported => { this.styleStore.supported(isSupported => {
if(!isSupported) { if(!isSupported) {
console.log('Falling back to local storage for storing styles') console.log('Falling back to local storage for storing styles')
@ -34,7 +34,14 @@ export default class App extends React.Component {
this.state = { this.state = {
mapStyle: style.emptyStyle, mapStyle: style.emptyStyle,
selectedLayerIndex: 0, selectedLayerIndex: 0,
sources: {},
vectorLayers: {},
} }
this.layerWatcher = new LayerWatcher({
onSourcesChange: v => this.setState({ sources: v }),
onVectorLayersChange: v => this.setState({ vectorLayers: v })
})
} }
componentDidMount() { componentDidMount() {
@ -146,7 +153,7 @@ export default class App extends React.Component {
if(renderer === 'ol3') { if(renderer === 'ol3') {
return <OpenLayers3Map {...mapProps} /> return <OpenLayers3Map {...mapProps} />
} else if(renderer === 'inspection') { } else if(renderer === 'inspection') {
return <InspectionMap {...mapProps} sources={this.layerWatcher.sources} /> return <InspectionMap {...mapProps} sources={this.state.sources} />
} else { } else {
return <MapboxGlMap {...mapProps} /> return <MapboxGlMap {...mapProps} />
} }
@ -164,7 +171,7 @@ export default class App extends React.Component {
const toolbar = <Toolbar const toolbar = <Toolbar
mapStyle={this.state.mapStyle} mapStyle={this.state.mapStyle}
sources={this.layerWatcher.sources} sources={this.state.sources}
onStyleChanged={this.onStyleChanged.bind(this)} onStyleChanged={this.onStyleChanged.bind(this)}
onStyleOpen={this.onStyleChanged.bind(this)} onStyleOpen={this.onStyleChanged.bind(this)}
onStyleDownload={this.onStyleDownload.bind(this)} onStyleDownload={this.onStyleDownload.bind(this)}
@ -179,8 +186,8 @@ export default class App extends React.Component {
const layerEditor = selectedLayer ? <LayerEditor const layerEditor = selectedLayer ? <LayerEditor
layer={selectedLayer} layer={selectedLayer}
sources={this.layerWatcher.sources} sources={this.state.sources}
vectorLayers={this.layerWatcher.vectorLayers} vectorLayers={this.state.vectorLayers}
highlightLayer={metadata['maputnik:highlighted_layer'] ? true : false} highlightLayer={metadata['maputnik:highlighted_layer'] ? true : false}
onLayerChanged={this.onLayerChanged.bind(this)} onLayerChanged={this.onLayerChanged.bind(this)}
onLayerIdChange={this.onLayerIdChange.bind(this)} onLayerIdChange={this.onLayerIdChange.bind(this)}

View file

@ -45,7 +45,6 @@ export default class SpecField extends React.Component {
name: this.props.fieldName, name: this.props.fieldName,
onChange: newValue => this.props.onChange(this.props.fieldName, newValue) onChange: newValue => this.props.onChange(this.props.fieldName, newValue)
} }
console.log(this.props.fieldName, this.props.fieldSpec.type)
switch(this.props.fieldSpec.type) { switch(this.props.fieldSpec.type) {
case 'number': return ( case 'number': return (
<NumberInput <NumberInput

View file

@ -169,7 +169,6 @@ export default class LayerEditor extends React.Component {
} }
render() { render() {
console.log(this.props)
const layerType = this.props.layer.type const layerType = this.props.layer.type
const layoutGroups = layout[layerType].groups.filter(group => { const layoutGroups = layout[layerType].groups.filter(group => {
return !(this.props.layer.type === 'background' && group.type === 'source') return !(this.props.layer.type === 'background' && group.type === 'source')

View file

@ -24,16 +24,26 @@ class AddModal extends React.Component {
constructor(props) { constructor(props) {
super(props) super(props)
console.log('sources', this.props.sources)
this.state = { this.state = {
type: 'fill', type: 'fill',
id: '', id: '',
//source: Object.keys(this.props.sources)[0], }
//'source-layer': this.props.sources[0][0]
if(props.sources.length > 0) {
this.state.source = Object.keys(this.props.sources)[0]
} }
} }
componentWillReceiveProps(nextProps) {
const sourceIds = Object.keys(nextProps.sources)
if(!this.state.source && sourceIds.length > 0) {
this.setState({
source: sourceIds[0],
})
}
}
render() { render() {
return <Modal return <Modal
isOpen={this.props.isOpen} isOpen={this.props.isOpen}

View file

@ -1,9 +1,13 @@
import throttle from 'lodash.throttle' import throttle from 'lodash.throttle'
import isEqual from 'lodash.isequal'
/** Listens to map events to build up a store of available vector /** Listens to map events to build up a store of available vector
* layers contained in the tiles */ * layers contained in the tiles */
export default class LayerWatcher { export default class LayerWatcher {
constructor() { constructor(opts = {}) {
this.onSourcesChange = opts.onSourcesChange || (() => {})
this.onVectorLayersChange = opts.onVectorLayersChange || (() => {})
this._sources = {} this._sources = {}
this._vectorLayers = {} this._vectorLayers = {}
@ -14,15 +18,24 @@ export default class LayerWatcher {
} }
analyzeMap(map) { analyzeMap(map) {
const previousSources = { ...this._sources }
Object.keys(map.style.sourceCaches).forEach(sourceId => { Object.keys(map.style.sourceCaches).forEach(sourceId => {
//NOTE: This heavily depends on the internal API of Mapbox GL //NOTE: This heavily depends on the internal API of Mapbox GL
//so this breaks between Mapbox GL JS releases //so this breaks between Mapbox GL JS releases
this._sources[sourceId] = map.style.sourceCaches[sourceId]._source.vectorLayerIds this._sources[sourceId] = map.style.sourceCaches[sourceId]._source.vectorLayerIds
}) })
if(!isEqual(previousSources, this._sources)) {
this.onSourcesChange(this._sources)
}
this.throttledAnalyzeVectorLayerFields(map) this.throttledAnalyzeVectorLayerFields(map)
} }
analyzeVectorLayerFields(map) { analyzeVectorLayerFields(map) {
const previousVectorLayers = { ...this._vectorLayers }
Object.keys(this._sources).forEach(sourceId => { Object.keys(this._sources).forEach(sourceId => {
this._sources[sourceId].forEach(vectorLayerId => { this._sources[sourceId].forEach(vectorLayerId => {
const knownProperties = this._vectorLayers[vectorLayerId] || {} const knownProperties = this._vectorLayers[vectorLayerId] || {}
@ -38,6 +51,11 @@ export default class LayerWatcher {
this._vectorLayers[vectorLayerId] = knownProperties this._vectorLayers[vectorLayerId] = knownProperties
}) })
}) })
if(!isEqual(previousVectorLayers, this._vectorLayers)) {
this.onVectorLayersChange(this._vectorLayers)
}
} }
/** Access all known sources and their vector tile ids */ /** Access all known sources and their vector tile ids */

View file

@ -30,7 +30,6 @@ function ensureHasNoRefs(style) {
...style, ...style,
layers: derefLayers(style.layers) layers: derefLayers(style.layers)
} }
console.log(derefedStyle)
return derefedStyle return derefedStyle
} }