From cabb500189f027bc64d6b62bde9cf017efa4c0d4 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 20 Sep 2018 14:57:42 +1200 Subject: Div icon as marker --- modern/src/MainMap.js | 12 +++--- modern/src/leaflet/DivIcon.js | 99 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 modern/src/leaflet/DivIcon.js diff --git a/modern/src/MainMap.js b/modern/src/MainMap.js index 7655aee..fab1777 100644 --- a/modern/src/MainMap.js +++ b/modern/src/MainMap.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import { Map, TileLayer, Marker, Popup } from 'react-leaflet'; import { connect } from 'react-redux' +import DivIcon from './leaflet/DivIcon'; const mapStateToProps = state => ({ positions: state.positions @@ -17,11 +18,12 @@ class MainMap extends Component { const position = [this.state.lat, this.state.lng] const markers = this.props.positions.map(position => - - - A pretty CSS3 popup.
Easily customizable. -
-
+ + + TEST + + ); return ( diff --git a/modern/src/leaflet/DivIcon.js b/modern/src/leaflet/DivIcon.js new file mode 100644 index 0000000..6673c56 --- /dev/null +++ b/modern/src/leaflet/DivIcon.js @@ -0,0 +1,99 @@ +import React, {Component} from 'react'; +import {render} from 'react-dom'; +import {DivIcon, marker} from 'leaflet'; +import {MapLayer, withLeaflet} from 'react-leaflet'; +import PropTypes from 'prop-types'; + +function createContextProvider(context) { + class ContextProvider extends Component { + getChildContext() { + return context; + } + + render() { + return this.props.children; + } + } + + ContextProvider.childContextTypes = {}; + Object.keys(context).forEach(key => { + ContextProvider.childContextTypes[key] = PropTypes.any; + }); + return ContextProvider; +} + +export class Divicon extends MapLayer { + static propTypes = { + opacity: PropTypes.number, + zIndexOffset: PropTypes.number, + } + + static childContextTypes = { + popupContainer: PropTypes.object, + } + + getChildContext() { + return { + popupContainer: this.leafletElement, + } + } + + // See https://github.com/PaulLeCam/react-leaflet/issues/275 + createLeafletElement(newProps) { + const {map: _map, layerContainer: _lc, position, ...props} = newProps; + this.icon = new DivIcon(props); + return marker(position, {icon: this.icon, ...props}); + } + + updateLeafletElement(fromProps, toProps) { + if (toProps.position !== fromProps.position) { + this.leafletElement.setLatLng(toProps.position); + } + if (toProps.zIndexOffset !== fromProps.zIndexOffset) { + this.leafletElement.setZIndexOffset(toProps.zIndexOffset); + } + if (toProps.opacity !== fromProps.opacity) { + this.leafletElement.setOpacity(toProps.opacity); + } + if (toProps.draggable !== fromProps.draggable) { + if (toProps.draggable) { + this.leafletElement.dragging.enable(); + } + else { + this.leafletElement.dragging.disable(); + } + } + } + + componentDidMount() { + super.componentDidMount(); + this.renderComponent(); + } + + componentDidUpdate(fromProps) { + this.renderComponent(); + this.updateLeafletElement(fromProps, this.props); + } + + renderComponent = () => { + const ContextProvider = createContextProvider({...this.context, ...this.getChildContext()}); + const container = this.leafletElement._icon; + const component = ( + + {this.props.children} + + ); + if (container) { + render( + component, + container + ); + } + } + + render() { + return null; + } +} + +export default withLeaflet(Divicon) -- cgit v1.2.3