aboutsummaryrefslogtreecommitdiff
path: root/src/map/MapGeofence.js
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2024-04-06 09:22:10 -0700
committerAnton Tananaev <anton@traccar.org>2024-04-06 09:22:10 -0700
commitf418231b6b2f5e030a0d2dcc390c314602b1f740 (patch)
tree10326adf3792bc2697e06bb5f2b8ef2a8f7e55fe /src/map/MapGeofence.js
parentb392a4af78e01c8e0f50aad5468e9583675b24be (diff)
downloadtrackermap-web-f418231b6b2f5e030a0d2dcc390c314602b1f740.tar.gz
trackermap-web-f418231b6b2f5e030a0d2dcc390c314602b1f740.tar.bz2
trackermap-web-f418231b6b2f5e030a0d2dcc390c314602b1f740.zip
Move modern to the top
Diffstat (limited to 'src/map/MapGeofence.js')
-rw-r--r--src/map/MapGeofence.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/map/MapGeofence.js b/src/map/MapGeofence.js
new file mode 100644
index 00000000..73b32724
--- /dev/null
+++ b/src/map/MapGeofence.js
@@ -0,0 +1,94 @@
+import { useId, useEffect } from 'react';
+import { useSelector } from 'react-redux';
+import { useTheme } from '@mui/styles';
+import { map } from './core/MapView';
+import { findFonts, geofenceToFeature } from './core/mapUtil';
+import { useAttributePreference } from '../common/util/preferences';
+
+const MapGeofence = () => {
+ const id = useId();
+
+ const theme = useTheme();
+
+ const mapGeofences = useAttributePreference('mapGeofences', true);
+
+ const geofences = useSelector((state) => state.geofences.items);
+
+ useEffect(() => {
+ if (mapGeofences) {
+ map.addSource(id, {
+ type: 'geojson',
+ data: {
+ type: 'FeatureCollection',
+ features: [],
+ },
+ });
+ map.addLayer({
+ source: id,
+ id: 'geofences-fill',
+ type: 'fill',
+ filter: [
+ 'all',
+ ['==', '$type', 'Polygon'],
+ ],
+ paint: {
+ 'fill-color': ['get', 'color'],
+ 'fill-outline-color': ['get', 'color'],
+ 'fill-opacity': 0.1,
+ },
+ });
+ map.addLayer({
+ source: id,
+ id: 'geofences-line',
+ type: 'line',
+ paint: {
+ 'line-color': ['get', 'color'],
+ 'line-width': 2,
+ },
+ });
+ map.addLayer({
+ source: id,
+ id: 'geofences-title',
+ type: 'symbol',
+ layout: {
+ 'text-field': '{name}',
+ 'text-font': findFonts(map),
+ 'text-size': 12,
+ },
+ paint: {
+ 'text-halo-color': 'white',
+ 'text-halo-width': 1,
+ },
+ });
+
+ return () => {
+ if (map.getLayer('geofences-fill')) {
+ map.removeLayer('geofences-fill');
+ }
+ if (map.getLayer('geofences-line')) {
+ map.removeLayer('geofences-line');
+ }
+ if (map.getLayer('geofences-title')) {
+ map.removeLayer('geofences-title');
+ }
+ if (map.getSource(id)) {
+ map.removeSource(id);
+ }
+ };
+ }
+ return () => {};
+ }, [mapGeofences]);
+
+ useEffect(() => {
+ if (mapGeofences) {
+ map.getSource(id)?.setData({
+ type: 'FeatureCollection',
+ features: Object.values(geofences).map((geofence) => geofenceToFeature(theme, geofence)),
+ });
+ }
+ }, [mapGeofences, geofences]);
+
+ return null;
+};
+
+export default MapGeofence;