aboutsummaryrefslogtreecommitdiff
path: root/modern/src/map
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2022-05-21 09:49:26 -0700
committerAnton Tananaev <anton@traccar.org>2022-05-21 09:49:26 -0700
commit7e96816f94314dcdf071eeee6e74a95bcace329f (patch)
tree21938fcdbe6e8b7a651308555af77c49dc59e1c2 /modern/src/map
parent79dd42f0bdeef6d9f6331c0ec8301b2631a9cb90 (diff)
downloadtrackermap-web-7e96816f94314dcdf071eeee6e74a95bcace329f.tar.gz
trackermap-web-7e96816f94314dcdf071eeee6e74a95bcace329f.tar.bz2
trackermap-web-7e96816f94314dcdf071eeee6e74a95bcace329f.zip
Implement API error handling
Diffstat (limited to 'modern/src/map')
-rw-r--r--modern/src/map/GeofenceEditMap.js69
1 files changed, 45 insertions, 24 deletions
diff --git a/modern/src/map/GeofenceEditMap.js b/modern/src/map/GeofenceEditMap.js
index 2eb86321..0d7950a2 100644
--- a/modern/src/map/GeofenceEditMap.js
+++ b/modern/src/map/GeofenceEditMap.js
@@ -2,13 +2,14 @@ import 'mapbox-gl/dist/mapbox-gl.css';
import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css';
import MapboxDraw from '@mapbox/mapbox-gl-draw';
import theme from '@mapbox/mapbox-gl-draw/src/lib/theme';
-import { useCallback, useEffect } from 'react';
+import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom';
import { map } from './core/Map';
import { geofenceToFeature, geometryToArea } from './core/mapUtil';
-import { geofencesActions } from '../store';
+import { errorsActions, geofencesActions } from '../store';
+import { useCatchCallback } from '../reactHelper';
const draw = new MapboxDraw({
displayControlsDefault: false,
@@ -39,10 +40,12 @@ const GeofenceEditMap = () => {
const geofences = useSelector((state) => state.geofences.items);
- const refreshGeofences = useCallback(async () => {
+ const refreshGeofences = useCatchCallback(async () => {
const response = await fetch('/api/geofences');
if (response.ok) {
dispatch(geofencesActions.refresh(await response.json()));
+ } else {
+ throw Error(await response.text());
}
}, [dispatch]);
@@ -58,33 +61,45 @@ const GeofenceEditMap = () => {
const feature = event.features[0];
const newItem = { name: '', area: geometryToArea(feature.geometry) };
draw.delete(feature.id);
- const response = await fetch('/api/geofences', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(newItem),
- });
- if (response.ok) {
- const item = await response.json();
- history.push(`/settings/geofence/${item.id}`);
+ try {
+ const response = await fetch('/api/geofences', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(newItem),
+ });
+ if (response.ok) {
+ const item = await response.json();
+ history.push(`/settings/geofence/${item.id}`);
+ } else {
+ throw Error(await response.text());
+ }
+ } catch (error) {
+ dispatch(errorsActions.push(error.message));
}
};
map.on('draw.create', listener);
return () => map.off('draw.create', listener);
- }, [history]);
+ }, [dispatch, history]);
useEffect(() => {
const listener = async (event) => {
const feature = event.features[0];
- const response = await fetch(`/api/geofences/${feature.id}`, { method: 'DELETE' });
- if (response.ok) {
- refreshGeofences();
+ try {
+ const response = await fetch(`/api/geofences/${feature.id}`, { method: 'DELETE' });
+ if (response.ok) {
+ refreshGeofences();
+ } else {
+ throw Error(await response.text());
+ }
+ } catch (error) {
+ dispatch(errorsActions.push(error.message));
}
};
map.on('draw.delete', listener);
return () => map.off('draw.delete', listener);
- }, [refreshGeofences]);
+ }, [dispatch, refreshGeofences]);
useEffect(() => {
const listener = async (event) => {
@@ -92,20 +107,26 @@ const GeofenceEditMap = () => {
const item = Object.values(geofences).find((i) => i.id === feature.id);
if (item) {
const updatedItem = { ...item, area: geometryToArea(feature.geometry) };
- const response = await fetch(`/api/geofences/${feature.id}`, {
- method: 'PUT',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(updatedItem),
- });
- if (response.ok) {
- refreshGeofences();
+ try {
+ const response = await fetch(`/api/geofences/${feature.id}`, {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(updatedItem),
+ });
+ if (response.ok) {
+ refreshGeofences();
+ } else {
+ throw Error(await response.text());
+ }
+ } catch (error) {
+ dispatch(errorsActions.push(error.message));
}
}
};
map.on('draw.update', listener);
return () => map.off('draw.update', listener);
- }, [geofences, refreshGeofences]);
+ }, [dispatch, geofences, refreshGeofences]);
useEffect(() => {
draw.deleteAll();