Skip to content

Commit e8d01e2

Browse files
test pseudo query
1 parent ac7c341 commit e8d01e2

File tree

9 files changed

+125
-94
lines changed

9 files changed

+125
-94
lines changed

src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {getInfoTabLinks} from '../../../../utils/additionalProps';
1919
import {TENANT_DEFAULT_TITLE} from '../../../../utils/constants';
2020
import {useAutoRefreshInterval, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks';
2121
import {useClusterNameFromQuery} from '../../../../utils/hooks/useDatabaseFromQuery';
22+
import {canShowTenantMonitoringTab} from '../../../../utils/monitoringVisibility';
2223
import {useTenantPage} from '../../TenantNavigation/useTenantNavigation';
2324
import {mapDatabaseTypeToDBName} from '../../utils/schema';
2425

src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {EPathType, TEvDescribeSchemeResult} from '../../../../types/api/sch
2020
import {valueIsDefined} from '../../../../utils';
2121
import {useTypedDispatch, useTypedSelector} from '../../../../utils/hooks';
2222
import {getConfirmation} from '../../../../utils/hooks/withConfirmation/useChangeInputWithConfirmation';
23+
import {canShowTenantMonitoringTab} from '../../../../utils/monitoringVisibility';
2324
import {useTenantPage} from '../../TenantNavigation/useTenantNavigation';
2425
import {getSchemaControls} from '../../utils/controls';
2526
import {

src/containers/Tenant/utils/schemaActions.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
} from '../../../store/reducers/tenant/constants';
1313
import {setDiagnosticsTab, setQueryTab} from '../../../store/reducers/tenant/tenant';
1414
import type {TenantPage} from '../../../store/reducers/tenant/types';
15+
import type {IQueryResult} from '../../../types/store/query';
1516
import createToast from '../../../utils/createToast';
1617
import {insertSnippetToEditor} from '../../../utils/monaco/insertSnippet';
1718
import {transformPath} from '../ObjectSummary/transformPath';

src/containers/UserSettings/settings.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type {IconProps} from '@gravity-ui/uikit';
33
import {createNextState} from '@reduxjs/toolkit';
44

55
import {codeAssistBackend} from '../../store';
6-
import {DEFAULT_USER_SETTINGS, SETTING_KEYS} from '../../store/reducers/settings/constants';
6+
import {SETTING_KEYS} from '../../store/reducers/settings/constants';
77
import {AclSyntax, OLD_BACKEND_CLUSTER_NAMES, PAGE_IDS, SECTION_IDS} from '../../utils/constants';
88
import {Lang} from '../../utils/i18n';
99

@@ -66,7 +66,6 @@ export const languageSetting: SettingProps = {
6666
title: i18n('settings.language.title'),
6767
type: 'radio',
6868
options: languageOptions,
69-
defaultValue: DEFAULT_USER_SETTINGS[SETTING_KEYS.LANGUAGE],
7069
onValueUpdate: () => {
7170
window.location.reload();
7271
},

src/services/api/index.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,18 @@ export class YdbEmbeddedAPI {
4444

4545
meta?: MetaAPI;
4646
metaSettings?: MetaSettingsAPI;
47-
metaSettings?: MetaSettingsAPI;
4847
codeAssist?: CodeAssistAPI;
4948

5049
constructor({
5150
webVersion = false,
5251
withCredentials = false,
5352
singleClusterMode = true,
54-
// proxyMeta = false,
55-
proxyMeta = true,
53+
proxyMeta = false,
54+
// proxyMeta = true,
5655
csrfTokenGetter = () => undefined,
5756
defaults = {},
58-
// useRelativePath = false,
59-
useRelativePath = true,
57+
useRelativePath = false,
58+
// useRelativePath = true,
6059
}: YdbEmbeddedAPIProps) {
6160
const axiosParams: AxiosWrapperOptions = {config: {withCredentials, ...defaults}};
6261
const baseApiParams = {singleClusterMode, proxyMeta, useRelativePath};

src/store/reducers/authentication/authentication.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ export const slice = createSlice({
3434
state.id = UserID;
3535

3636
// TODO: test, remove after
37-
state.user = 'root';
38-
state.id = 'root';
37+
// state.user = 'root';
38+
// state.id = 'root';
3939
// TODO: test, remove after
4040

4141
// If ydb version supports this feature,

src/store/reducers/settings/api.ts

Lines changed: 74 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {api} from '../api';
1111

1212
import type {SettingKey} from './constants';
1313
import {DEFAULT_USER_SETTINGS, SETTINGS_OPTIONS} from './constants';
14-
import {readSettingValueFromLS} from './utils';
14+
import {parseSettingValue, readSettingValueFromLS, setSettingValueToLS} from './utils';
1515

1616
export const settingsApi = api.injectEndpoints({
1717
endpoints: (builder) => ({
@@ -23,7 +23,7 @@ export const settingsApi = api.injectEndpoints({
2323
return {data: undefined};
2424
}
2525

26-
const defaultValue = DEFAULT_USER_SETTINGS[name as SettingKey];
26+
const defaultValue = DEFAULT_USER_SETTINGS[name as SettingKey] as unknown;
2727

2828
// Do not load LS value from always sync values.
2929
// In case there is no settings service
@@ -34,14 +34,31 @@ export const settingsApi = api.injectEndpoints({
3434

3535
const savedValue = readSettingValueFromLS(name);
3636

37-
return {data: savedValue ?? defaultValue};
37+
const data = (savedValue ?? defaultValue) as unknown;
38+
39+
return {data};
3840
},
3941
}),
4042
getSingleSetting: builder.query({
41-
queryFn: async ({name, user}: GetSingleSettingParams, baseApi) => {
43+
queryFn: async ({name, user}: Partial<GetSingleSettingParams>, baseApi) => {
4244
try {
43-
if (!window.api.metaSettings) {
44-
throw new Error('MetaSettings API is not available');
45+
if (!name) {
46+
throw new Error('Setting name is not provided');
47+
}
48+
const dispatch = baseApi.dispatch as AppDispatch;
49+
50+
if (!window.api.metaSettings || !user) {
51+
if (SETTINGS_OPTIONS[name]?.preventSyncWithLS) {
52+
const savedValue = readSettingValueFromLS(name);
53+
const value = savedValue ?? DEFAULT_USER_SETTINGS[name as SettingKey];
54+
dispatch(settingsApi.util.upsertQueryData('setting', {name}, value));
55+
}
56+
57+
if (!user) {
58+
throw new Error('User is not provided');
59+
} else {
60+
throw new Error('MetaSettings API is not available');
61+
}
4562
}
4663
const data = await window.api.metaSettings.getSingleSetting({
4764
name,
@@ -50,25 +67,38 @@ export const settingsApi = api.injectEndpoints({
5067
preventBatching: SETTINGS_OPTIONS[name]?.preventBatching,
5168
});
5269

53-
const dispatch = baseApi.dispatch as AppDispatch;
70+
if (isNil(data.value)) {
71+
// Try to sync local value if there is no backend value
72+
syncLocalValueToMetaIfNoData(data, dispatch);
73+
} else {
74+
setSettingValueToLS(name, data.value);
5475

55-
// Try to sync local value if there is no backend value
56-
syncLocalValueToMetaIfNoData(data, dispatch);
76+
const parsedValue = parseSettingValue(data.value);
77+
dispatch(settingsApi.util.upsertQueryData('setting', {name}, parsedValue));
78+
}
5779

58-
return {data};
80+
return {data: data};
5981
} catch (error) {
6082
return {error};
6183
}
6284
},
6385
}),
6486
setSingleSetting: builder.mutation({
65-
queryFn: async (params: SetSingleSettingParams) => {
87+
queryFn: async ({name, user, value}: Partial<SetSingleSettingParams>) => {
6688
try {
67-
if (!window.api.metaSettings) {
68-
throw new Error('MetaSettings API is not available');
89+
if (!name || isNil(value)) {
90+
throw new Error('Setting name is not provided');
91+
}
92+
if (!window.api.metaSettings || !user) {
93+
// throw new Error('MetaSettings API is not available');
94+
return {data: undefined};
6995
}
7096

71-
const data = await window.api.metaSettings.setSingleSetting(params);
97+
const data = await window.api.metaSettings.setSingleSetting({
98+
name,
99+
user,
100+
value,
101+
});
72102

73103
if (data.status !== 'SUCCESS') {
74104
throw new Error('Setting status is not SUCCESS');
@@ -80,25 +110,30 @@ export const settingsApi = api.injectEndpoints({
80110
}
81111
},
82112
async onQueryStarted(args, {dispatch, queryFulfilled}) {
83-
const {name, user, value} = args;
113+
const {name, value} = args;
84114

85115
// Optimistically update existing cache entry
86116
const patchResult = dispatch(
87-
settingsApi.util.updateQueryData('getSingleSetting', {name, user}, (draft) => {
88-
return {...draft, name, user, value};
117+
settingsApi.util.updateQueryData('setting', {name}, () => {
118+
return value;
89119
}),
90120
);
121+
91122
try {
92123
await queryFulfilled;
124+
setSettingValueToLS(name, value);
93125
} catch {
94126
patchResult.undo();
95127
}
96128
},
97129
}),
98130
getSettings: builder.query({
99-
queryFn: async ({name, user}: GetSettingsParams, baseApi) => {
131+
queryFn: async ({name, user}: Partial<GetSettingsParams>, baseApi) => {
100132
try {
101-
if (!window.api.metaSettings) {
133+
if (!name) {
134+
throw new Error('Settings names are not provided');
135+
}
136+
if (!window.api.metaSettings || !user) {
102137
throw new Error('MetaSettings API is not available');
103138
}
104139
const data = await window.api.metaSettings.getSettings({name, user});
@@ -123,13 +158,26 @@ export const settingsApi = api.injectEndpoints({
123158
newValue,
124159
),
125160
).then(() => {
126-
// Try to sync local value if there is no backend value
127-
// Do it after upsert if finished to ensure proper values update order
128-
// 1. New entry added to cache with nil value
129-
// 2. Positive entry update - local storage value replace nil in cache
130-
// 3.1. Set is successful, local value in cache
131-
// 3.2. Set is not successful, cache value reverted to previous nil
132-
syncLocalValueToMetaIfNoData(settingData, dispatch);
161+
if (isNil(settingData.value)) {
162+
// Try to sync local value if there is no backend value
163+
// Do it after upsert if finished to ensure proper values update order
164+
// 1. New entry added to cache with nil value
165+
// 2. Positive entry update - local storage value replace nil in cache
166+
// 3.1. Set is successful, local value in cache
167+
// 3.2. Set is not successful, cache value reverted to previous nil
168+
syncLocalValueToMetaIfNoData(settingData, dispatch);
169+
} else {
170+
setSettingValueToLS(settingName, data.value);
171+
172+
const parsedValue = parseSettingValue(settingData.value);
173+
dispatch(
174+
settingsApi.util.upsertQueryData(
175+
'setting',
176+
{name: settingName},
177+
parsedValue,
178+
),
179+
);
180+
}
133181
});
134182

135183
patches.push(patch);
Lines changed: 40 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
import React from 'react';
22

3-
import {skipToken} from '@reduxjs/toolkit/query';
43
import {debounce} from 'lodash';
54

6-
import type {SetSingleSettingParams} from '../../../types/api/settings';
5+
import type {SetSingleSettingParams, SettingValue} from '../../../types/api/settings';
76
import {uiFactory} from '../../../uiFactory/uiFactory';
8-
import {useTypedDispatch} from '../../../utils/hooks/useTypedDispatch';
97
import {useTypedSelector} from '../../../utils/hooks/useTypedSelector';
108
import {selectID, selectUser} from '../authentication/authentication';
119

1210
import {settingsApi} from './api';
13-
import type {SettingKey} from './constants';
14-
import {DEFAULT_USER_SETTINGS, SETTINGS_OPTIONS} from './constants';
15-
import {getSettingValue, setSettingValue} from './settings';
16-
import {
17-
parseSettingValue,
18-
readSettingValueFromLS,
19-
setSettingValueToLS,
20-
stringifySettingValue,
21-
} from './utils';
11+
import {SETTINGS_OPTIONS} from './constants';
2212

2313
type SaveSettingValue<T> = (value: T | undefined) => void;
2414

@@ -31,11 +21,11 @@ export function useSetting<T>(
3121
name?: string,
3222
{debounceTime = 0}: UseSettingOptions = {},
3323
): {value: T | undefined; saveValue: SaveSettingValue<T>; isLoading: boolean} {
34-
const dispatch = useTypedDispatch();
24+
const {data: settingValue} = settingsApi.useSettingQuery({name});
3525

3626
const preventSyncWithLS = Boolean(name && SETTINGS_OPTIONS[name]?.preventSyncWithLS);
3727

38-
const settingValue = useTypedSelector((state) => getSettingValue(state, name)) as T | undefined;
28+
// const settingValue = useTypedSelector((state) => getSettingValue(state, name)) as T | undefined;
3929

4030
const authUserSID = useTypedSelector(selectUser);
4131
const anonymousUserId = useTypedSelector(selectID);
@@ -45,44 +35,36 @@ export function useSetting<T>(
4535

4636
const shouldUseOnlyExternalSettings = shouldUseMetaSettings && preventSyncWithLS;
4737

48-
const params = React.useMemo(() => {
49-
return shouldUseMetaSettings ? {user, name} : skipToken;
50-
}, [shouldUseMetaSettings, user, name]);
51-
52-
const {currentData: metaSetting, isLoading: isSettingLoading} =
53-
settingsApi.useGetSingleSettingQuery(params);
38+
const {isLoading: isSettingLoading} = settingsApi.useGetSingleSettingQuery({user, name});
5439

5540
const [setMetaSetting] = settingsApi.useSetSingleSettingMutation();
5641

57-
// Add loading state to settings that are stored externally
58-
const isLoading = shouldUseMetaSettings ? isSettingLoading : false;
59-
60-
// Load initial value
61-
React.useEffect(() => {
62-
let value = name ? (DEFAULT_USER_SETTINGS[name as SettingKey] as T | undefined) : undefined;
63-
64-
if (!shouldUseOnlyExternalSettings) {
65-
const savedValue = readSettingValueFromLS<T>(name);
66-
value = savedValue ?? value;
67-
}
68-
69-
dispatch(setSettingValue(name, value));
70-
}, [name, shouldUseOnlyExternalSettings, dispatch]);
71-
72-
// Sync value from backend with LS and store
73-
React.useEffect(() => {
74-
if (shouldUseMetaSettings && metaSetting?.value) {
75-
if (!shouldUseOnlyExternalSettings) {
76-
setSettingValueToLS(name, metaSetting.value);
77-
}
78-
const parsedValue = parseSettingValue<T>(metaSetting.value);
79-
dispatch(setSettingValue(name, parsedValue));
80-
}
81-
}, [shouldUseMetaSettings, shouldUseOnlyExternalSettings, metaSetting, name, dispatch]);
42+
// // Load initial value
43+
// React.useEffect(() => {
44+
// let value = name ? (DEFAULT_USER_SETTINGS[name as SettingKey] as T | undefined) : undefined;
45+
46+
// if (!shouldUseOnlyExternalSettings) {
47+
// const savedValue = readSettingValueFromLS<T>(name);
48+
// value = savedValue ?? value;
49+
// }
50+
51+
// dispatch(setSettingValue(name, value));
52+
// }, [name, shouldUseOnlyExternalSettings, dispatch]);
53+
54+
// // Sync value from backend with LS and store
55+
// React.useEffect(() => {
56+
// if (shouldUseMetaSettings && metaSetting?.value) {
57+
// if (!shouldUseOnlyExternalSettings) {
58+
// setSettingValueToLS(name, metaSetting.value);
59+
// }
60+
// const parsedValue = parseSettingValue<T>(metaSetting.value);
61+
// dispatch(setSettingValue(name, parsedValue));
62+
// }
63+
// }, [shouldUseMetaSettings, shouldUseOnlyExternalSettings, metaSetting, name, dispatch]);
8264

8365
const debouncedSetMetaSetting = React.useMemo(
8466
() =>
85-
debounce((params: SetSingleSettingParams) => {
67+
debounce((params: Partial<SetSingleSettingParams>) => {
8668
setMetaSetting(params);
8769
}, debounceTime),
8870
[debounceTime, setMetaSetting],
@@ -95,20 +77,20 @@ export function useSetting<T>(
9577

9678
const saveValue = React.useCallback<SaveSettingValue<T>>(
9779
(value) => {
98-
if (shouldUseMetaSettings) {
99-
debouncedSetMetaSetting({
100-
user,
101-
name: name,
102-
value: stringifySettingValue(value),
103-
});
104-
}
105-
106-
if (!shouldUseOnlyExternalSettings) {
107-
setSettingValueToLS(name, value);
108-
}
80+
// if (shouldUseMetaSettings) {
81+
debouncedSetMetaSetting({
82+
user,
83+
name: name,
84+
value: value as SettingValue,
85+
});
86+
// }
87+
88+
// if (!shouldUseOnlyExternalSettings) {
89+
// setSettingValueToLS(name, value);
90+
// }
10991
},
11092
[shouldUseMetaSettings, shouldUseOnlyExternalSettings, user, name, debouncedSetMetaSetting],
11193
);
11294

113-
return {value: settingValue, saveValue, isLoading} as const;
95+
return {value: settingValue as T | undefined, saveValue, isLoading: isSettingLoading} as const;
11496
}

src/uiFactory/uiFactory.ts

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

0 commit comments

Comments
 (0)