2022-05-08 20:55:05 +03:00

62 lines
1.9 KiB
TypeScript

/* eslint-disable object-curly-newline */
/* eslint-disable import/no-cycle */
import type { Elements, ElementsTypes } from 'Components/Calculation/config/map';
import { getValueName } from 'Components/Calculation/config/map';
import { makeAutoObservable } from 'mobx';
import RootStore from '../../root';
import type { CalculationValues, Values, ValuesTypes } from './types';
export default class ValuesStore {
root: RootStore;
#values: CalculationValues = {};
constructor(rootStore: RootStore) {
makeAutoObservable(this);
this.root = rootStore;
}
hydrate = (initialValues: CalculationValues) => {
this.#values = initialValues;
};
getValue<V extends Values>(valueName: V) {
return this.#values[valueName];
}
getValueByElement<E extends Elements>(elementName: E) {
const valueName = getValueName(elementName);
return this.getValue(valueName) as ElementsTypes[E] | undefined;
}
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: ValuesTypes[V]) {
this.#values[valueName] = value;
}
setValueOfElement<E extends Elements>(elementName: E, value: ElementsTypes[E]) {
const valueName = getValueName(elementName);
this.setValue(valueName, value);
}
setValues(values: CalculationValues, settings: { replace?: boolean }) {
if (settings?.replace) this.#values = values;
this.#values = Object.assign(this.#values, values);
}
clearValue(valueName: Values) {
this.setValue(valueName, null);
}
clearValueOfElement(elementName: Elements) {
const valueName = getValueName(elementName);
this.clearValue(valueName);
}
}