Skip to content

Commit

Permalink
fix: enable extract and set user settings manually (#629)
Browse files Browse the repository at this point in the history
  • Loading branch information
artemmufazalov authored Jan 10, 2024
1 parent 359e0a2 commit 5eecd58
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 16 deletions.
18 changes: 7 additions & 11 deletions src/services/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export type SettingsObject = Record<string, unknown>;
const USE_LOCAL_STORAGE_FOR_SETTINGS_KEY = 'useLocalStorageForSettings';

/** User settings keys and their default values */
const DEFAULT_USER_SETTINGS: SettingsObject = {
export const DEFAULT_USER_SETTINGS: SettingsObject = {
[THEME_KEY]: 'system',
[LANGUAGE_KEY]: undefined,
[INVERTED_DISKS_KEY]: false,
Expand Down Expand Up @@ -59,20 +59,13 @@ class SettingsManager {
}
}

/**
* User settings - settings stored in LS or external store
*/
getUserSettings() {
return this.extractSettingsFromLS();
}

/**
* Returns parsed settings value.
* If value cannot be parsed, returns initially stored string.
* If there is no value, return default value
*/
readUserSettingsValue(key: string, defaultValue?: unknown) {
return this.readValueFromLS(key) ?? defaultValue ?? DEFAULT_USER_SETTINGS[key];
return this.readValueFromLS(key) ?? defaultValue;
}

/**
Expand All @@ -82,8 +75,11 @@ class SettingsManager {
return this.setValueToLS(key, value);
}

private extractSettingsFromLS = () => {
return Object.entries(DEFAULT_USER_SETTINGS).reduce<SettingsObject>((acc, [key, value]) => {
/**
* Extract values by provided settings object
*/
extractSettingsFromLS = (settings: SettingsObject) => {
return Object.entries(settings).reduce<SettingsObject>((acc, [key, value]) => {
acc[key] = this.readUserSettingsValue(key, value);
return acc;
}, {});
Expand Down
19 changes: 16 additions & 3 deletions src/store/reducers/settings/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type {Reducer} from 'redux';
import type {ThunkAction} from 'redux-thunk';

import '../../../services/api';
import {settingsManager} from '../../../services/settings';
import {DEFAULT_USER_SETTINGS, SettingsObject, settingsManager} from '../../../services/settings';

import type {RootState} from '..';
import type {
Expand All @@ -15,13 +15,14 @@ import type {

const CHANGE_PROBLEM_FILTER = 'settings/CHANGE_PROBLEM_FILTER';
export const SET_SETTING_VALUE = 'settings/SET_VALUE';
export const SET_USER_SETTINGS = 'settings/SET_USER_SETTINGS';

export const ProblemFilterValues = {
ALL: 'All',
PROBLEMS: 'With problems',
} as const;

const userSettings = settingsManager.getUserSettings();
const userSettings = settingsManager.extractSettingsFromLS(DEFAULT_USER_SETTINGS);
const systemSettings = window.systemSettings || {};

export const initialState = {
Expand Down Expand Up @@ -49,7 +50,15 @@ const settings: Reducer<SettingsState, SettingsAction> = (state = initialState,
userSettings: newSettings,
};
}

case SET_USER_SETTINGS: {
return {
...state,
userSettings: {
...state.userSettings,
...action.data,
},
};
}
default:
return state;
}
Expand All @@ -66,6 +75,10 @@ export const setSettingValue = (
};
};

export const setUserSettings = (data: SettingsObject) => {
return {type: SET_USER_SETTINGS, data} as const;
};

export const getSettingValue = (state: SettingsRootStateSlice, name: string) => {
return state.settings.userSettings[name];
};
Expand Down
7 changes: 5 additions & 2 deletions src/store/reducers/settings/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type {ValueOf} from '../../../types/common';
import type {SettingsObject} from '../../../services/settings';
import {changeFilter, ProblemFilterValues, SET_SETTING_VALUE} from './settings';
import {changeFilter, setUserSettings, ProblemFilterValues, SET_SETTING_VALUE} from './settings';

export type ProblemFilterValue = ValueOf<typeof ProblemFilterValues>;

Expand All @@ -15,7 +15,10 @@ export type SetSettingValueAction = {
data: {name: string; value: unknown};
};

export type SettingsAction = ReturnType<typeof changeFilter> | SetSettingValueAction;
export type SettingsAction =
| ReturnType<typeof changeFilter>
| ReturnType<typeof setUserSettings>
| SetSettingValueAction;

export interface SettingsRootStateSlice {
settings: SettingsState;
Expand Down

0 comments on commit 5eecd58

Please sign in to comment.