/* global L Counter */ /* eslint-disable import/no-absolute-path */ /* eslint-disable react/jsx-indent-props */ /* eslint-disable react/jsx-indent */ import React from 'react'; import PropTypes from 'prop-types'; import { Row, Col, Checkbox } from 'react-bootstrap'; import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; import { withTracker } from 'meteor/react-meteor-data'; import { Trans, translate } from 'react-i18next'; import { Map, TileLayer } from 'react-leaflet'; import LGeo from 'leaflet-geodesy'; import _ from 'lodash'; import 'leaflet/dist/leaflet.css'; import 'leaflet-graphicscale/dist/Leaflet.GraphicScale.min.css'; import 'leaflet-graphicscale/dist/Leaflet.GraphicScale.min.js'; import 'leaflet-sleep/Leaflet.Sleep.js'; import geolocation from '/imports/startup/client/geolocation'; import CenterInMyPosition from '/imports/ui/components/CenterInMyPosition/CenterInMyPosition'; import FireList from '/imports/ui/components/Maps/FireList'; import { unify } from '/imports/ui/components/Maps/Utils'; import Loading from '/imports/ui/components/Loading/Loading'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import FireAlertsCollection from '/imports/api/FireAlerts/FireAlerts'; import UserSubsToFiresCollection from '/imports/api/Subscriptions/Subscriptions'; import './FiresMap.scss'; const MAXZOOM = 6; const DEF_LAT = 35.159028; const DEF_LNG = -46.738057; const DEFAULT_VIEWPORT = { center: [DEF_LAT, DEF_LNG], // a point in the sea zoom: 8 }; const zoom = new ReactiveVar(8); const lat = new ReactiveVar(DEF_LAT); const lng = new ReactiveVar(DEF_LNG); const height = new ReactiveVar(400); const width = new ReactiveVar(400); class FiresMap extends React.Component { constructor(props) { super(props); this.state = { viewport: DEFAULT_VIEWPORT, modified: false, useMarkers: false, showSubsUnion: true }; this.unionGroup = new L.LayerGroup(); const self = this; // viewportchange // https://stackoverflow.com/questions/23123138/perform-debounce-in-react-js this.debounceView = _.debounce((viewport) => { self.handleViewportChange(viewport); }, 2000); this.onViewportChanged = this.onViewportChanged.bind(this); } componentDidMount() { height.set(this.divElement.clientHeight); width.set(this.divElement.clientWidth); this.addScale(); } onViewportChanged(viewport) { this.debounceView(viewport); } onClickReset() { // console.log("onclick"); // this.setState({ viewport: DEFAULT_VIEWPORT }) } getMap() { return this.fireMap.leafletElement; } handleViewportChange(viewport) { console.log(`Viewport changed: ${JSON.stringify(viewport)}`); zoom.set(viewport.zoom); lat.set(viewport.center[0]); lng.set(viewport.center[1]); this.setState({ viewport, modified: true }); /* this.state.viewport = viewport; * this.state.modified = true; */ if (this.props.subsready && this.fireMap) { this.showSubsUnion(this.state.showSubsUnion); } } centerOnUserLocation(viewport) { this.handleViewportChange(viewport); } useMarkers(use) { /* this.setState({ userMarkers: use });*/ this.state.useMarkers = use; // this.forceUpdate(); } showSubsUnion(show) { // this.setState({ showSubsUnion: show }); this.state.showSubsUnion = show; const map = this.getMap(); // http://leafletjs.com/reference-1.2.0.html#layergroup const self = this; if (this.union) { map.removeLayer(this.union); } if (show) { // http://leafletjs.com/reference-1.2.0.html#path const copts = { parts: 144 }; UserSubsToFiresCollection.find().forEach((subs) => { const circle = LGeo.circle([subs.lat, subs.lon], subs.distance * 1000, copts); circle.addTo(self.unionGroup); }); this.union = unify(self.unionGroup.getLayers()); this.union.setStyle({ color: '#145A32', fillColor: 'green', fillOpacity: 0.1 }); this.union.addTo(map); } } addScale() { // https://www.npmjs.com/package/leaflet-graphicscale const map = this.getMap(); const options = { fill: 'fill', showSubunits: true }; L.control.graphicScale([options]).addTo(map); } render() { this.state.viewport = !this.state.modified && this.props.viewport && Array.isArray(this.props.viewport.center)? this.props.viewport: this.state.viewport; if (this.props.subsready && this.fireMap) { // Show union of users this.showSubsUnion(this.state.showSubsUnion); } return ( /* Large number of markers: https://stackoverflow.com/questions/43015854/large-dataset-of-markers-or-dots-in-leaflet/43019740#43019740 */
{ this.props.activefires.length === 0 ?
(*)