Skip to content

Commit

Permalink
split MapRoutePath
Browse files Browse the repository at this point in the history
  • Loading branch information
jcardus committed Jun 30, 2024
1 parent 02a7e05 commit 870ef74
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 54 deletions.
92 changes: 92 additions & 0 deletions src/map/MapRouteCoordinates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { useTheme } from '@mui/styles';
import { useId, useEffect } from 'react';
import { useSelector } from 'react-redux';
import { map } from './core/MapView';

const MapRouteCoordinates = ({ name, coordinates, deviceId }) => {
const id = useId();

const theme = useTheme();

const reportColor = useSelector((state) => {
const attributes = state.devices.items[deviceId]?.attributes;
if (attributes) {
const color = attributes['web.reportColor'];
if (color) {
return color;
}
}
return theme.palette.geometry.main;
});

useEffect(() => {
map.addSource(id, {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [],
},
},
});
map.addLayer({
source: id,
id: `${id}-line`,
type: 'line',
layout: {
'line-join': 'round',
'line-cap': 'round',
},
paint: {
'line-color': ['get', 'color'],
'line-width': 2,
},
});
if (name) {
map.addLayer({
source: id,
id: `${id}-title`,
type: 'symbol',
layout: {
'text-field': '{name}',
'text-size': 12,
},
paint: {
'text-halo-color': 'white',
'text-halo-width': 1,
},
});
}

return () => {
if (map.getLayer(`${id}-title`)) {
map.removeLayer(`${id}-title`);
}
if (map.getLayer(`${id}-line`)) {
map.removeLayer(`${id}-line`);
}
if (map.getSource(id)) {
map.removeSource(id);
}
};
}, []);

useEffect(() => {
map.getSource(id)?.setData({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates,
},
properties: {
name,
color: reportColor,
},
});
}, [theme, coordinates]);

return null;
};

export default MapRouteCoordinates;
75 changes: 23 additions & 52 deletions src/map/MapRoutePath.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,13 @@
import { useTheme } from '@mui/styles';
import { useId, useEffect } from 'react';
import { useSelector } from 'react-redux';
import { map } from './core/MapView';
import { getSpeedColor } from '../common/util/colors';

Check warning on line 4 in src/map/MapRoutePath.js

View workflow job for this annotation

GitHub Actions / build

Unable to resolve path to module '../common/util/colors'

Check failure on line 4 in src/map/MapRoutePath.js

View workflow job for this annotation

GitHub Actions / build

Missing file extension for "../common/util/colors"

const MapRoutePath = ({ name, positions, coordinates }) => {
const MapRoutePath = ({ name, positions }) => {
const id = useId();

const theme = useTheme();

const reportColor = useSelector((state) => {
const position = positions?.find(() => true);
if (position) {
const attributes = state.devices.items[position.deviceId]?.attributes;
if (attributes) {
const color = attributes['web.reportColor'];
if (color) {
return color;
}
}
}
return theme.palette.geometry.main;
});

useEffect(() => {
map.addSource(id, {
type: 'geojson',
Expand Down Expand Up @@ -77,50 +62,36 @@ const MapRoutePath = ({ name, positions, coordinates }) => {
}, []);

useEffect(() => {
if (!coordinates) {
coordinates = positions.map((item) => [item.longitude, item.latitude]);
const speeds = positions.map((item) => item.speed);
const maxSpeed = speeds.reduce((a, b) => Math.max(a, b), -Infinity);
const features = [];
for (let i = 0; i < coordinates.length - 1; i += 1) {
features.push({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [coordinates[i], coordinates[i + 1]],
},
properties: {
color: getSpeedColor(
theme.palette.success.main,
theme.palette.warning.main,
theme.palette.error.main,
speeds[i + 1],
maxSpeed,
),
},
});
}
map.getSource(id)?.setData({
type: 'FeatureCollection',
features,
properties: {
name,
},
});
} else {
map.getSource(id)?.setData({
const coordinates = positions.map((item) => [item.longitude, item.latitude]);
const speeds = positions.map((item) => item.speed);
const maxSpeed = speeds.reduce((a, b) => Math.max(a, b), -Infinity);
const features = [];
for (let i = 0; i < coordinates.length - 1; i += 1) {
features.push({
type: 'Feature',
geometry: {
type: 'LineString',
coordinates,
coordinates: [coordinates[i], coordinates[i + 1]],
},
properties: {
name,
color: reportColor,
color: getSpeedColor(
theme.palette.success.main,
theme.palette.warning.main,
theme.palette.error.main,
speeds[i + 1],
maxSpeed,
),
},
});
}
}, [theme, positions, coordinates, reportColor]);
map.getSource(id)?.setData({
type: 'FeatureCollection',
features,
properties: {
name,
},
});
}, [theme, positions]);

return null;
};
Expand Down
5 changes: 3 additions & 2 deletions src/reports/CombinedReportPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import PageLayout from '../common/components/PageLayout';
import ReportsMenu from './components/ReportsMenu';
import { useCatch } from '../reactHelper';
import MapView from '../map/core/MapView';
import MapRoutePath from '../map/MapRoutePath';
import useReportStyles from './common/useReportStyles';
import TableShimmer from '../common/components/TableShimmer';
import MapCamera from '../map/MapCamera';
import MapGeofence from '../map/MapGeofence';
import { formatTime } from '../common/util/formatter';
import { prefixString } from '../common/util/stringUtils';
import MapMarkers from '../map/MapMarkers';
import MapRouteCoordinates from '../map/MapRouteCoordinates';

const CombinedReportPage = () => {
const classes = useReportStyles();
Expand Down Expand Up @@ -60,10 +60,11 @@ const CombinedReportPage = () => {
<MapView>
<MapGeofence />
{items.map((item) => (
<MapRoutePath
<MapRouteCoordinates
key={item.deviceId}
name={devices[item.deviceId].name}
coordinates={item.route}
deviceId={item.deviceId}
/>
))}
<MapMarkers markers={createMarkers()} />
Expand Down

0 comments on commit 870ef74

Please sign in to comment.