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 {MdFileUpload} from 'react-icons/md' import {MdAddCircleOutline} from 'react-icons/md' 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 = { styleUrl: "" }; } 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(); let canceled; const activeRequest = fetch(styleUrl, { mode: 'cors', credentials: "same-origin" }) .then(function(response) { return response.json(); }) .then((body) => { if(canceled) { return; } this.setState({ activeRequest: null, activeRequestUrl: null }); const mapStyle = style.ensureStyleValidity(body) console.log('Loaded style ', mapStyle.id) this.props.onStyleOpen(mapStyle) this.onOpenToggle() }) .catch((err) => { this.setState({ error: `Failed to load: '${styleUrl}'`, activeRequest: null, activeRequestUrl: null }); console.error(err); console.warn('Could not open the style URL', styleUrl) }) this.setState({ activeRequest: { abort: function() { canceled = true; } }, activeRequestUrl: styleUrl }) } 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.setState({ styleUrl: "" }); this.clearError(); this.props.onOpenToggle(); } onChangeUrl = () => { this.setState({ styleUrl: this.styleUrlElement.value }); } 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..." value={this.state.styleUrl} onChange={this.onChangeUrl} />

Gallery Styles

Open one of the publicly available styles to start from.

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