Neue Seite um Betriebe zu überwachen
This commit is contained in:
87
src/hooks/useUserPreferences.js
Normal file
87
src/hooks/useUserPreferences.js
Normal 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;
|
||||
Reference in New Issue
Block a user