import React from 'react' import PropTypes from 'prop-types' import LoadingModal from './LoadingModal' import Modal from './Modal' import Button from '../Button' import FileReaderInput from 'react-file-reader-input' import request from 'request' import FileUploadIcon from 'react-icons/lib/md/file-upload' import AddIcon from 'react-icons/lib/md/add-circle-outline' import style from '../../libs/style.js' import publicStyles from '../../config/styles.json' class PublicStyle extends React.Component { static propTypes = { url: PropTypes.string.isRequired, thumbnailUrl: PropTypes.string.isRequired, title: PropTypes.string.isRequired, onSelect: PropTypes.func.isRequired, } render() { return
} } class OpenModal extends React.Component { static propTypes = { isOpen: PropTypes.bool.isRequired, onOpenToggle: PropTypes.func.isRequired, onStyleOpen: PropTypes.func.isRequired, } constructor(props) { super(props); this.state = {}; } clearError() { this.setState({ error: null }) } onCancelActiveRequest(e) { // Else the click propagates to the underlying modal if(e) e.stopPropagation(); if(this.state.activeRequest) { this.state.activeRequest.abort(); this.setState({ activeRequest: null, activeRequestUrl: null }); } } onStyleSelect(styleUrl) { this.clearError(); const reqOpts = { url: styleUrl, withCredentials: false, } const activeRequest = request(reqOpts, (error, response, body) => { this.setState({ activeRequest: null, activeRequestUrl: null }); if (!error && response.statusCode == 200) { const mapStyle = style.ensureStyleValidity(JSON.parse(body)) console.log('Loaded style ', mapStyle.id) this.props.onStyleOpen(mapStyle) this.onOpenToggle() } else { console.warn('Could not open the style URL', styleUrl) } }) this.setState({ activeRequest: activeRequest, activeRequestUrl: reqOpts.url }) } onOpenUrl() { const url = this.styleUrlElement.value; this.onStyleSelect(url); } onUpload(_, files) { const [e, file] = files[0]; const reader = new FileReader(); this.clearError(); reader.readAsText(file, "UTF-8"); reader.onload = e => { let mapStyle; try { mapStyle = JSON.parse(e.target.result) } catch(err) { this.setState({ error: err.toString() }); return; } mapStyle = style.ensureStyleValidity(mapStyle) this.props.onStyleOpen(mapStyle); this.onOpenToggle(); } reader.onerror = e => console.log(e.target); } onOpenToggle() { this.clearError(); this.props.onOpenToggle(); } render() { const styleOptions = publicStyles.map(style => { return }) let errorElement; if(this.state.error) { errorElement = (
{this.state.error} this.clearError()} className="maputnik-modal-error-close">×
); } return this.onOpenToggle()} title={'Open Style'} > {errorElement}

Upload Style

Upload a JSON style from your computer.

Load from URL

Load from a URL. Note that the URL must have CORS enabled.

this.styleUrlElement = input} className="maputnik-input" placeholder="Enter URL..."/>

Gallery Styles

Open one of the publicly available styles to start from.

{styleOptions}
this.onCancelActiveRequest(e)} message={"Loading: "+this.state.activeRequestUrl} />
} } export default OpenModal