Neue Seite um Betriebe zu überwachen

This commit is contained in:
2025-11-10 17:22:26 +01:00
parent 49dec43c1e
commit 69a588e6f1
7 changed files with 458 additions and 24 deletions

View File

@@ -0,0 +1,87 @@
import { useCallback, useEffect, useState } from 'react';
const PREFERENCES_ENDPOINT = '/api/user/preferences';
const LOCATION_ENDPOINT = '/api/user/preferences/location';
const useUserPreferences = ({ authorizedFetch, sessionToken }) => {
const [preferences, setPreferences] = useState(null);
const [loading, setLoading] = useState(false);
const [saving, setSaving] = useState(false);
const [error, setError] = useState('');
const loadPreferences = useCallback(async () => {
if (!sessionToken || !authorizedFetch) {
setPreferences(null);
return;
}
setLoading(true);
setError('');
try {
const response = await authorizedFetch(PREFERENCES_ENDPOINT);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
setPreferences(data);
} catch (err) {
setError(`Einstellungen konnten nicht geladen werden: ${err.message}`);
} finally {
setLoading(false);
}
}, [authorizedFetch, sessionToken]);
const updateLocation = useCallback(
async (coords) => {
if (!sessionToken || !authorizedFetch) {
return false;
}
setSaving(true);
setError('');
try {
const payload =
coords && typeof coords.lat === 'number' && typeof coords.lon === 'number'
? { lat: coords.lat, lon: coords.lon }
: { lat: null, lon: null };
const response = await authorizedFetch(LOCATION_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
setPreferences((prev) => ({
...(prev || {}),
location: data.location || null
}));
return true;
} catch (err) {
setError(`Standort konnte nicht aktualisiert werden: ${err.message}`);
return false;
} finally {
setSaving(false);
}
},
[authorizedFetch, sessionToken]
);
useEffect(() => {
if (sessionToken) {
loadPreferences();
} else {
setPreferences(null);
}
}, [sessionToken, loadPreferences]);
return {
preferences,
loading,
saving,
error,
loadPreferences,
updateLocation
};
};
export default useUserPreferences;