import React from 'react' import GlSpec from 'mapbox-gl-style-spec/reference/latest.js' import Modal from './Modal' import Button from '../Button' import InputBlock from '../inputs/InputBlock' import StringInput from '../inputs/StringInput' import SelectInput from '../inputs/SelectInput' import SourceTypeEditor from '../sources/SourceTypeEditor' import style from '../../libs/style' import { deleteSource, addSource, changeSource } from '../../libs/source' import publicSources from '../../config/tilesets.json' import AddIcon from 'react-icons/lib/md/add-circle-outline' import DeleteIcon from 'react-icons/lib/md/delete' class PublicSource extends React.Component { static propTypes = { id: React.PropTypes.string.isRequired, type: React.PropTypes.string.isRequired, title: React.PropTypes.string.isRequired, onSelect: React.PropTypes.func.isRequired, } render() { return
} } function editorMode(source) { if(source.type === 'raster') { if(source.tiles) return 'tilexyz_raster' return 'tilejson_raster' } if(source.type === 'vector') { if(source.tiles) return 'tilexyz_vector' return 'tilejson_vector' } if(source.type === 'geojson') return ' geojson' return null } class ActiveSourceTypeEditor extends React.Component { static propTypes = { sourceId: React.PropTypes.string.isRequired, source: React.PropTypes.object.isRequired, onDelete: React.PropTypes.func.isRequired, onChange: React.PropTypes.func.isRequired, } render() { const inputProps = { } return
#{this.props.sourceId}
} } class AddSource extends React.Component { static propTypes = { onAdd: React.PropTypes.func.isRequired, } constructor(props) { super(props) this.state = { mode: 'tilejson', sourceId: style.generateId(), source: this.defaultSource('tilejson'), } } defaultSource(mode) { const source = (this.state || {}).source || {} switch(mode) { case 'geojson': return { type: 'geojson', data: source.data || 'http://localhost:3000/geojson.json' } case 'tilejson_vector': return { type: 'vector', url: source.url || 'http://localhost:3000/tilejson.json' } case 'tilexyz_vector': return { type: 'vector', tiles: source.tiles || ['http://localhost:3000/{x}/{y}/{z}.pbf'], minZoom: source.minzoom || 0, maxZoom: source.maxzoom || 14 } case 'tilejson_raster': return { type: 'raster', url: source.url || 'http://localhost:3000/tilejson.json' } case 'tilexyz_raster': return { type: 'raster', tiles: source.tiles || ['http://localhost:3000/{x}/{y}/{z}.pbf'], minzoom: source.minzoom || 0, maxzoom: source.maxzoom || 14 } default: return {} } } render() { return
this.setState({ sourceId: v})} /> this.setState({mode: mode, source: this.defaultSource(mode)})} value={this.state.mode} /> this.setState({ source: src })} mode={this.state.mode} source={this.state.source} />
} } class SourcesModal extends React.Component { static propTypes = { mapStyle: React.PropTypes.object.isRequired, isOpen: React.PropTypes.bool.isRequired, onOpenToggle: React.PropTypes.func.isRequired, onStyleChanged: React.PropTypes.func.isRequired, } stripTitle(source) { const strippedSource = {...source} delete strippedSource['title'] return strippedSource } render() { const mapStyle = this.props.mapStyle const activeSources = Object.keys(mapStyle.sources).map(sourceId => { const source = mapStyle.sources[sourceId] return this.props.onStyleChanged(changeSource(mapStyle, sourceId, src))} onDelete={() => this.props.onStyleChanged(deleteSource(mapStyle, sourceId))} /> }) const tilesetOptions = Object.keys(publicSources).filter(sourceId => !(sourceId in mapStyle.sources)).map(sourceId => { const source = publicSources[sourceId] return this.props.onStyleChanged(addSource(mapStyle, sourceId, this.stripTitle(source)))} /> }) const inputProps = { } return

Active Sources

{activeSources}

Add New Source

Add a new source to your style. You can only choose the source type and id at creation time!

this.props.onStyleChanged(addSource(mapStyle, sourceId, source))} />

Choose Public Source

Add one of the publicly availble sources to your style.

{tilesetOptions}
} } export default SourcesModal