64 lines
1.7 KiB
TypeScript

/* eslint-disable object-curly-newline */
import defaultValues from 'config/default-values';
import { makeAutoObservable } from 'mobx';
import type RootStore from '../../root';
import type { CalculationValues, Values } from './types';
export default class ValuesStore {
root: RootStore;
values: CalculationValues = defaultValues;
constructor(rootStore: RootStore) {
makeAutoObservable(this);
this.root = rootStore;
}
hydrate = (initialValues: CalculationValues) => {
this.values = initialValues;
};
getValue<V extends Values>(valueName: V) {
return this.values[valueName];
}
getValues<V extends Values>(valuesNames: readonly V[]) {
return valuesNames.reduce((values, valueName) => {
// eslint-disable-next-line no-param-reassign
values[valueName] = this.getValue(valueName);
return values;
}, {} as Pick<CalculationValues, typeof valuesNames[number]>);
}
setValue = <V extends Values>(valueName: V, value: CalculationValues[V]) => {
this.values[valueName] = value;
};
setValues = (
values: Partial<CalculationValues>,
settings?: { reset: boolean; exclude: Values[] }
) => {
if (settings?.reset) {
this.resetValues(
(Object.keys(defaultValues) as Values[]).filter(
(valueName) => !settings?.exclude.includes(valueName)
)
);
}
(Object.keys(values) as Values[]).forEach((valueName) => {
this.setValue(valueName, values[valueName]!);
});
};
resetValue = (valueName: Values) => {
this.setValue(valueName, defaultValues[valueName]);
};
resetValues = (valuesNames: readonly Values[]) => {
valuesNames.forEach((valueName) => {
this.resetValue(valueName);
});
};
}