84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
import React from 'react';
|
|
import { LOCAL_STORAGE_KEY, getDefaultState } from '../constants/defaults.js';
|
|
|
|
export const useAppState = () => {
|
|
const [appState, setAppState] = React.useState(getDefaultState);
|
|
const [isLoaded, setIsLoaded] = React.useState(false);
|
|
|
|
React.useEffect(() => {
|
|
try {
|
|
const savedState = window.localStorage.getItem(LOCAL_STORAGE_KEY);
|
|
if (savedState) {
|
|
const parsedState = JSON.parse(savedState);
|
|
const defaults = getDefaultState();
|
|
setAppState({
|
|
...defaults,
|
|
...parsedState,
|
|
pkParams: {...defaults.pkParams, ...parsedState.pkParams},
|
|
uiSettings: {...defaults.uiSettings, ...parsedState.uiSettings},
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error("Failed to load state", error);
|
|
}
|
|
setIsLoaded(true);
|
|
}, []);
|
|
|
|
React.useEffect(() => {
|
|
if (isLoaded) {
|
|
try {
|
|
const stateToSave = {
|
|
pkParams: appState.pkParams,
|
|
doses: appState.doses,
|
|
steadyStateConfig: appState.steadyStateConfig,
|
|
therapeuticRange: appState.therapeuticRange,
|
|
doseIncrement: appState.doseIncrement,
|
|
uiSettings: appState.uiSettings,
|
|
};
|
|
window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(stateToSave));
|
|
} catch (error) {
|
|
console.error("Failed to save state", error);
|
|
}
|
|
}
|
|
}, [appState, isLoaded]);
|
|
|
|
const updateState = (key, value) => {
|
|
setAppState(prev => ({ ...prev, [key]: value }));
|
|
};
|
|
|
|
const updateNestedState = (parentKey, childKey, value) => {
|
|
setAppState(prev => ({
|
|
...prev,
|
|
[parentKey]: { ...prev[parentKey], [childKey]: value }
|
|
}));
|
|
};
|
|
|
|
const updateUiSetting = (key, value) => {
|
|
const newUiSettings = { ...appState.uiSettings, [key]: value };
|
|
if (key === 'simulationDays') {
|
|
const simDaysNum = parseInt(value, 10) || 1;
|
|
const dispDaysNum = parseInt(newUiSettings.displayedDays, 10) || 1;
|
|
if (dispDaysNum > simDaysNum) {
|
|
newUiSettings.displayedDays = String(simDaysNum);
|
|
}
|
|
}
|
|
setAppState(prev => ({ ...prev, uiSettings: newUiSettings }));
|
|
};
|
|
|
|
const handleReset = () => {
|
|
if (window.confirm("Bist du sicher, dass du alle Einstellungen auf die Standardwerte zurücksetzen möchtest? Dies kann nicht rückgängig gemacht werden.")) {
|
|
window.localStorage.removeItem(LOCAL_STORAGE_KEY);
|
|
window.location.reload();
|
|
}
|
|
};
|
|
|
|
return {
|
|
appState,
|
|
isLoaded,
|
|
updateState,
|
|
updateNestedState,
|
|
updateUiSetting,
|
|
handleReset
|
|
};
|
|
};
|