import React, { FormEvent } from 'react' import {MdFileUpload} from 'react-icons/md' import {MdAddCircleOutline} from 'react-icons/md' import FileReaderInput, { Result } from 'react-file-reader-input' import ModalLoading from './ModalLoading' import Modal from './Modal' import InputButton from './InputButton' import InputUrl from './InputUrl' import style from '../libs/style' import publicStyles from '../config/styles.json' type PublicStyleProps = { url: string thumbnailUrl: string title: string onSelect(...args: unknown[]): unknown }; class PublicStyle extends React.Component { render() { return
this.props.onSelect(this.props.url)} >
{this.props.title}
} } type ModalOpenProps = { isOpen: boolean onOpenToggle(...args: unknown[]): unknown onStyleOpen(...args: unknown[]): unknown }; type ModalOpenState = { styleUrl: string error?: string | null activeRequest?: any activeRequestUrl?: string | null }; export default class ModalOpen extends React.Component { constructor(props: ModalOpenProps) { super(props); this.state = { styleUrl: "" }; } clearError() { this.setState({ error: null }) } onCancelActiveRequest(e: Event) { // 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: string) => { this.clearError(); let canceled: boolean = false; 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 }) } onSubmitUrl = (e: FormEvent) => { e.preventDefault(); this.onStyleSelect(this.state.styleUrl); } onUpload = (_: any, files: Result[]) => { const [, 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 as string) } catch(err) { this.setState({ error: (err as Error).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 = (url: string) => { this.setState({ styleUrl: url, }); } 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.

Upload

Load from URL

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

Load from URL

Gallery Styles

Open one of the publicly available styles to start from.

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