Skip to content

Commit 7455ef9

Browse files
test store sync
1 parent e8d01e2 commit 7455ef9

File tree

4 files changed

+71
-33
lines changed

4 files changed

+71
-33
lines changed

src/store/reducers/settings/api.ts

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import type {
66
SetSingleSettingParams,
77
Setting,
88
} from '../../../types/api/settings';
9-
import type {AppDispatch} from '../../defaultStore';
9+
import type {AppDispatch, RootState} from '../../defaultStore';
1010
import {api} from '../api';
1111

1212
import type {SettingKey} from './constants';
1313
import {DEFAULT_USER_SETTINGS, SETTINGS_OPTIONS} from './constants';
14+
import {getSettingValue, setSettingValue} from './settings';
1415
import {parseSettingValue, readSettingValueFromLS, setSettingValueToLS} from './utils';
1516

1617
export const settingsApi = api.injectEndpoints({
@@ -51,7 +52,8 @@ export const settingsApi = api.injectEndpoints({
5152
if (SETTINGS_OPTIONS[name]?.preventSyncWithLS) {
5253
const savedValue = readSettingValueFromLS(name);
5354
const value = savedValue ?? DEFAULT_USER_SETTINGS[name as SettingKey];
54-
dispatch(settingsApi.util.upsertQueryData('setting', {name}, value));
55+
// dispatch(settingsApi.util.upsertQueryData('setting', {name}, value));
56+
dispatch(setSettingValue(name, value));
5557
}
5658

5759
if (!user) {
@@ -74,7 +76,8 @@ export const settingsApi = api.injectEndpoints({
7476
setSettingValueToLS(name, data.value);
7577

7678
const parsedValue = parseSettingValue(data.value);
77-
dispatch(settingsApi.util.upsertQueryData('setting', {name}, parsedValue));
79+
dispatch(setSettingValue(name, parsedValue));
80+
// dispatch(settingsApi.util.upsertQueryData('setting', {name}, parsedValue));
7881
}
7982

8083
return {data: data};
@@ -109,21 +112,31 @@ export const settingsApi = api.injectEndpoints({
109112
return {error};
110113
}
111114
},
112-
async onQueryStarted(args, {dispatch, queryFulfilled}) {
115+
async onQueryStarted(args, {dispatch, queryFulfilled, getState}) {
113116
const {name, value} = args;
114117

118+
if (!name) {
119+
return;
120+
}
121+
122+
const prev = getSettingValue(getState() as RootState, name);
123+
// console.log({prev, state: getState(), name});
124+
125+
dispatch(setSettingValue(name, value));
126+
115127
// Optimistically update existing cache entry
116-
const patchResult = dispatch(
117-
settingsApi.util.updateQueryData('setting', {name}, () => {
118-
return value;
119-
}),
120-
);
128+
// const patchResult = dispatch(
129+
// settingsApi.util.updateQueryData('setting', {name}, () => {
130+
// return value;
131+
// }),
132+
// );
121133

122134
try {
123135
await queryFulfilled;
124136
setSettingValueToLS(name, value);
125137
} catch {
126-
patchResult.undo();
138+
// patchResult.undo();
139+
dispatch(setSettingValue(name, prev));
127140
}
128141
},
129142
}),
@@ -170,13 +183,15 @@ export const settingsApi = api.injectEndpoints({
170183
setSettingValueToLS(settingName, data.value);
171184

172185
const parsedValue = parseSettingValue(settingData.value);
173-
dispatch(
174-
settingsApi.util.upsertQueryData(
175-
'setting',
176-
{name: settingName},
177-
parsedValue,
178-
),
179-
);
186+
dispatch(setSettingValue(settingName, parsedValue));
187+
188+
// dispatch(
189+
// settingsApi.util.upsertQueryData(
190+
// 'setting',
191+
// {name: settingName},
192+
// parsedValue,
193+
// ),
194+
// );
180195
}
181196
});
182197

src/store/reducers/settings/settings.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type {Store} from '@reduxjs/toolkit';
2-
import {createSlice} from '@reduxjs/toolkit';
2+
import {createSelector, createSlice} from '@reduxjs/toolkit';
3+
import {isNil} from 'lodash';
34

4-
// import {settingsManager} from '../../../services/settings';
55
import {parseJson} from '../../../utils/utils';
6-
import type {AppDispatch} from '../../defaultStore';
6+
import type {AppDispatch, RootState} from '../../defaultStore';
77

8-
import {DEFAULT_USER_SETTINGS} from './constants';
8+
import type {SettingKey} from './constants';
9+
import {DEFAULT_USER_SETTINGS, SETTINGS_OPTIONS} from './constants';
910
import type {SettingsState} from './types';
11+
import {readSettingValueFromLS} from './utils';
1012

1113
export const initialState: SettingsState = {
1214
userSettings: {},
@@ -21,18 +23,36 @@ const settingsSlice = createSlice({
2123
state.userSettings[action.payload.name] = action.payload.value;
2224
}),
2325
}),
24-
selectors: {
25-
getSettingValue: (state, name?: string) => {
26-
if (!name) {
27-
return undefined;
28-
}
29-
30-
return state.userSettings[name];
31-
},
32-
},
3326
});
3427

35-
export const {getSettingValue} = settingsSlice.selectors;
28+
export const getSettingValue = createSelector(
29+
(state: RootState) => state.settings.userSettings,
30+
(_state: RootState, name?: string) => name,
31+
(userSettings, name) => {
32+
if (!name) {
33+
return undefined;
34+
}
35+
36+
const storeValue = userSettings[name];
37+
38+
if (!isNil(storeValue)) {
39+
return storeValue;
40+
}
41+
42+
const defaultValue = DEFAULT_USER_SETTINGS[name as SettingKey] as unknown;
43+
44+
// Do not load LS value from always sync values.
45+
// In case there is no settings service
46+
// Such setting will be loaded from LS with getSingleSetting
47+
if (SETTINGS_OPTIONS[name]?.preventSyncWithLS) {
48+
return defaultValue;
49+
}
50+
51+
const savedValue = readSettingValueFromLS(name);
52+
53+
return savedValue;
54+
},
55+
);
3656

3757
export const setSettingValue = (name: string | undefined, value: unknown) => {
3858
return (dispatch: AppDispatch) => {

src/store/reducers/settings/useSetting.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {selectID, selectUser} from '../authentication/authentication';
99

1010
import {settingsApi} from './api';
1111
import {SETTINGS_OPTIONS} from './constants';
12+
import {getSettingValue} from './settings';
1213

1314
type SaveSettingValue<T> = (value: T | undefined) => void;
1415

@@ -21,7 +22,9 @@ export function useSetting<T>(
2122
name?: string,
2223
{debounceTime = 0}: UseSettingOptions = {},
2324
): {value: T | undefined; saveValue: SaveSettingValue<T>; isLoading: boolean} {
24-
const {data: settingValue} = settingsApi.useSettingQuery({name});
25+
// const {data: settingValue} = settingsApi.useSettingQuery({name});
26+
27+
const settingValue = useTypedSelector((state) => getSettingValue(state, name) as T | undefined);
2528

2629
const preventSyncWithLS = Boolean(name && SETTINGS_OPTIONS[name]?.preventSyncWithLS);
2730

src/uiFactory/uiFactory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const uiFactoryBase: UIFactory = {
2121
hasAccess: true,
2222
useDatabaseId: false,
2323
// useMetaSettings: true,
24-
// useMetaSettings: false,
24+
useMetaSettings: false,
2525
};
2626

2727
export function configureUIFactory<H extends string, T extends string = string>(

0 commit comments

Comments
 (0)