diff --git a/src/containers/App/App.tsx b/src/containers/App/App.tsx index f3d1a6d40a..66ef5dda03 100644 --- a/src/containers/App/App.tsx +++ b/src/containers/App/App.tsx @@ -6,14 +6,12 @@ import {Helmet} from 'react-helmet-async'; import {connect} from 'react-redux'; import {componentsRegistry} from '../../components/ComponentsProvider/componentsRegistry'; -import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary'; import type {RootState} from '../../store'; -import {Navigation} from '../AsideNavigation/Navigation'; import ReduxTooltip from '../ReduxTooltip/ReduxTooltip'; -import {getUserSettings} from '../UserSettings/settings'; import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; import ContentWrapper, {Content} from './Content'; +import {NavigationWrapper} from './NavigationWrapper'; import {Providers} from './Providers'; import './App.scss'; @@ -26,25 +24,20 @@ export interface AppProps { children?: React.ReactNode; } -function App({ - store, - history, - singleClusterMode, - children, - userSettings = getUserSettings({singleClusterMode}), -}: AppProps) { +function App({store, history, singleClusterMode, children, userSettings}: AppProps) { const ChatPanel = componentsRegistry.get('ChatPanel'); return ( - - - {children} -
-
-
+ + {children} +
+
{ChatPanel && } diff --git a/src/containers/App/NavigationWrapper.tsx b/src/containers/App/NavigationWrapper.tsx new file mode 100644 index 0000000000..c1ba64d05c --- /dev/null +++ b/src/containers/App/NavigationWrapper.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary'; +import {useClusterNameFromQuery} from '../../utils/hooks/useDatabaseFromQuery'; +import {Navigation} from '../AsideNavigation/Navigation'; +import {applyClusterSpecificQueryStreamingSetting, getUserSettings} from '../UserSettings/settings'; +import type {YDBEmbeddedUISettings} from '../UserSettings/settings'; + +interface NavigationWrapperProps { + singleClusterMode: boolean; + userSettings?: YDBEmbeddedUISettings; + children: React.ReactNode; +} + +export function NavigationWrapper({ + singleClusterMode, + userSettings, + children, +}: NavigationWrapperProps) { + const clusterName = useClusterNameFromQuery(); + + let finalUserSettings: YDBEmbeddedUISettings; + + if (userSettings) { + // Apply cluster-specific logic to externally provided settings + finalUserSettings = applyClusterSpecificQueryStreamingSetting(userSettings, clusterName); + } else { + // Generate settings internally with cluster-specific logic + finalUserSettings = getUserSettings({ + singleClusterMode, + clusterName, + }); + } + + return ( + + {children} + + ); +} diff --git a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx index 3a86aea37e..659ace4de2 100644 --- a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx +++ b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx @@ -28,12 +28,12 @@ import {cn} from '../../../../utils/cn'; import { DEFAULT_IS_QUERY_RESULT_COLLAPSED, DEFAULT_SIZE_RESULT_PANE_KEY, - ENABLE_QUERY_STREAMING, LAST_USED_QUERY_ACTION_KEY, } from '../../../../utils/constants'; import { useEventHandler, useQueryExecutionSettings, + useQueryStreamingSetting, useSetting, useTypedDispatch, useTypedSelector, @@ -92,7 +92,7 @@ export default function QueryEditor(props: QueryEditorProps) { LAST_USED_QUERY_ACTION_KEY, ); const [lastExecutedQueryText, setLastExecutedQueryText] = React.useState(''); - const [isQueryStreamingEnabled] = useSetting(ENABLE_QUERY_STREAMING); + const [isQueryStreamingEnabled] = useQueryStreamingSetting(); const isStreamingEnabled = useStreamingAvailable() && diff --git a/src/containers/Tenant/Query/QuerySettingsDialog/TimeoutLabel.tsx b/src/containers/Tenant/Query/QuerySettingsDialog/TimeoutLabel.tsx index 7b03ebe639..7f23246a1f 100644 --- a/src/containers/Tenant/Query/QuerySettingsDialog/TimeoutLabel.tsx +++ b/src/containers/Tenant/Query/QuerySettingsDialog/TimeoutLabel.tsx @@ -1,8 +1,7 @@ import {HelpMark, Switch} from '@gravity-ui/uikit'; import {cn} from '../../../../utils/cn'; -import {ENABLE_QUERY_STREAMING} from '../../../../utils/constants'; -import {useSetting} from '../../../../utils/hooks'; +import {useQueryStreamingSetting} from '../../../../utils/hooks'; import {QUERY_SETTINGS_FIELD_SETTINGS} from './constants'; import i18n from './i18n'; @@ -18,7 +17,7 @@ interface TimeoutLabelProps { } export function TimeoutLabel({isDisabled, isChecked, onToggle}: TimeoutLabelProps) { - const [isQueryStreamingEnabled] = useSetting(ENABLE_QUERY_STREAMING); + const [isQueryStreamingEnabled] = useQueryStreamingSetting(); if (isQueryStreamingEnabled) { return ( diff --git a/src/containers/UserSettings/settings.tsx b/src/containers/UserSettings/settings.tsx index 1705464b9b..0d698bd50f 100644 --- a/src/containers/UserSettings/settings.tsx +++ b/src/containers/UserSettings/settings.tsx @@ -12,8 +12,12 @@ import { ENABLE_CODE_ASSISTANT, ENABLE_NETWORK_TABLE_KEY, ENABLE_QUERY_STREAMING, + ENABLE_QUERY_STREAMING_OLD_BACKEND, INVERTED_DISKS_KEY, LANGUAGE_KEY, + OLD_BACKEND_CLUSTER_NAMES, + PAGE_IDS, + SECTION_IDS, SHOW_DOMAIN_DATABASE_KEY, SHOW_NETWORK_UTILIZATION, THEME_KEY, @@ -137,6 +141,42 @@ export const enableQueryStreamingSetting: SettingProps = { description: i18n('settings.editor.queryStreaming.description'), }; +export const enableQueryStreamingOldBackendSetting: SettingProps = { + settingKey: ENABLE_QUERY_STREAMING_OLD_BACKEND, + title: i18n('settings.editor.queryStreaming.title'), + description: i18n('settings.editor.queryStreaming.description'), +}; + +export function applyClusterSpecificQueryStreamingSetting( + settings: YDBEmbeddedUISettings, + clusterName?: string, +): YDBEmbeddedUISettings { + const isOldBackendCluster = clusterName && OLD_BACKEND_CLUSTER_NAMES.includes(clusterName); + + const queryStreamingSetting = isOldBackendCluster + ? enableQueryStreamingOldBackendSetting + : enableQueryStreamingSetting; + + return settings.map((page) => { + // Look for the experiments page + if (page.id === PAGE_IDS.EXPERIMENTS) { + return createNextState(page, (draft) => { + // Find and replace the query streaming setting in experimentsSection + const section = draft.sections[0]; // experimentsSection + const settingIndex = section.settings.findIndex( + (setting) => + 'settingKey' in setting && setting.settingKey === ENABLE_QUERY_STREAMING, + ); + + if (settingIndex !== -1) { + section.settings[settingIndex] = queryStreamingSetting; + } + }); + } + return page; + }); +} + export const showNetworkUtilizationSetting: SettingProps = { settingKey: SHOW_NETWORK_UTILIZATION, title: i18n('settings.showNetworkUtilization.title'), @@ -181,10 +221,11 @@ export const interfaceVersionInfoField: SettingsInfoFieldProps = { }; export const appearanceSection: SettingsSection = { - id: 'appearanceSection', + id: SECTION_IDS.APPEARANCE, title: i18n('section.appearance'), settings: [ themeSetting, + languageSetting, invertedDisksSetting, binaryDataInPlainTextDisplay, showDomainDatabase, @@ -193,7 +234,7 @@ export const appearanceSection: SettingsSection = { }; export const experimentsSection: SettingsSection = { - id: 'experimentsSection', + id: SECTION_IDS.EXPERIMENTS, title: i18n('section.experiments'), settings: [ enableNetworkTable, @@ -204,19 +245,19 @@ export const experimentsSection: SettingsSection = { }; export const devSettingsSection: SettingsSection = { - id: 'devSettingsSection', + id: SECTION_IDS.DEV_SETTINGS, title: i18n('section.dev-setting'), settings: [enableAutocompleteSetting, autocompleteOnEnterSetting], }; export const aboutSettingsSection: SettingsSection = { - id: 'aboutSettingsSection', + id: SECTION_IDS.ABOUT, title: i18n('section.about'), settings: [interfaceVersionInfoField], }; export const generalPage: SettingsPage = { - id: 'generalPage', + id: PAGE_IDS.GENERAL, title: i18n('page.general'), icon: {data: StarFill, height: 14, width: 14}, sections: [appearanceSection], @@ -224,7 +265,7 @@ export const generalPage: SettingsPage = { }; export const experimentsPage: SettingsPage = { - id: 'experimentsPage', + id: PAGE_IDS.EXPERIMENTS, title: i18n('page.experiments'), icon: {data: Flask}, sections: [experimentsSection], @@ -232,14 +273,15 @@ export const experimentsPage: SettingsPage = { }; export const editorPage: SettingsPage = { - id: 'editorPage', + id: PAGE_IDS.EDITOR, title: i18n('page.editor'), icon: {data: PencilToSquare}, sections: [devSettingsSection], + hideTitle: true, }; export const aboutPage: SettingsPage = { - id: 'aboutPage', + id: PAGE_IDS.ABOUT, title: i18n('page.about'), icon: {data: CircleInfo}, sections: [aboutSettingsSection], @@ -249,9 +291,11 @@ export const aboutPage: SettingsPage = { export function getUserSettings({ singleClusterMode, codeAssistantConfigured, + clusterName, }: { singleClusterMode: boolean; codeAssistantConfigured?: boolean; + clusterName?: string; }) { const experiments = singleClusterMode ? experimentsPage @@ -266,7 +310,8 @@ export function getUserSettings({ }) : editorPage; - const settings: YDBEmbeddedUISettings = [generalPage, editor, experiments, aboutPage]; + const baseSettings: YDBEmbeddedUISettings = [generalPage, editor, experiments, aboutPage]; - return settings; + // Apply cluster-specific query streaming logic + return applyClusterSpecificQueryStreamingSetting(baseSettings, clusterName); } diff --git a/src/services/settings.ts b/src/services/settings.ts index 1c61be61e1..dc81c4da8a 100644 --- a/src/services/settings.ts +++ b/src/services/settings.ts @@ -11,6 +11,7 @@ import { ENABLE_CODE_ASSISTANT, ENABLE_NETWORK_TABLE_KEY, ENABLE_QUERY_STREAMING, + ENABLE_QUERY_STREAMING_OLD_BACKEND, EXPAND_CLUSTER_DASHBOARD, INVERTED_DISKS_KEY, IS_HOTKEYS_HELP_HIDDEN_KEY, @@ -51,6 +52,7 @@ export const DEFAULT_USER_SETTINGS = { [ENABLE_AUTOCOMPLETE]: true, [ENABLE_CODE_ASSISTANT]: true, [ENABLE_QUERY_STREAMING]: true, + [ENABLE_QUERY_STREAMING_OLD_BACKEND]: false, [SHOW_NETWORK_UTILIZATION]: false, [EXPAND_CLUSTER_DASHBOARD]: true, [AUTOCOMPLETE_ON_ENTER]: true, diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 397b98874b..07978d373d 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -48,6 +48,55 @@ export const getTabletLabel = (type?: string) => { return isTabletType(type) ? TABLET_SYMBOLS[type] : defaultValue; }; +// Settings Keys Dictionary +export const SETTING_KEYS = { + THEME: 'theme', + LANGUAGE: 'language', + INVERTED_DISKS: 'invertedDisks', + BINARY_DATA_IN_PLAIN_TEXT_DISPLAY: 'binaryDataInPlainTextDisplay', + SAVED_QUERIES: 'saved_queries', + TENANT_INITIAL_PAGE: 'saved_tenant_initial_tab', + LAST_USED_QUERY_ACTION: 'last_used_query_action', + ASIDE_HEADER_COMPACT: 'asideHeaderCompact', + PARTITIONS_HIDDEN_COLUMNS: 'partitionsHiddenColumns', + ENABLE_NETWORK_TABLE: 'enableNetworkTable', + USE_SHOW_PLAN_SVG: 'useShowPlanToSvg', + USE_CLUSTER_BALANCER_AS_BACKEND: 'useClusterBalancerAsBacked', + ENABLE_AUTOCOMPLETE: 'enableAutocomplete', + ENABLE_CODE_ASSISTANT: 'enableCodeAssistant', + ENABLE_QUERY_STREAMING: 'enableQueryStreaming', + ENABLE_QUERY_STREAMING_OLD_BACKEND: 'enableQueryStreamingOldBackend', + SHOW_NETWORK_UTILIZATION: 'enableNetworkUtilization', + EXPAND_CLUSTER_DASHBOARD: 'expandClusterDashboard', + AUTOCOMPLETE_ON_ENTER: 'autocompleteOnEnter', + IS_HOTKEYS_HELP_HIDDEN: 'isHotKeysHelpHidden', + AUTO_REFRESH_INTERVAL: 'auto-refresh-interval', + CASE_SENSITIVE_JSON_SEARCH: 'caseSensitiveJsonSearch', + SHOW_DOMAIN_DATABASE: 'showDomainDatabase', + QUERY_STOPPED_BANNER_CLOSED: 'queryStoppedBannerClosed', + LAST_QUERY_EXECUTION_SETTINGS: 'last_query_execution_settings', + QUERY_SETTINGS_BANNER_LAST_CLOSED: 'querySettingsBannerLastClosed', + QUERY_EXECUTION_SETTINGS: 'queryExecutionSettings', + ACL_SYNTAX: 'aclSyntax', +} as const; + +// Page IDs Dictionary +export const PAGE_IDS = { + GENERAL: 'generalPage', + EDITOR: 'editorPage', + EXPERIMENTS: 'experimentsPage', + ABOUT: 'aboutPage', +} as const; + +// Section IDs Dictionary +export const SECTION_IDS = { + EXPERIMENTS: 'experimentsSection', + GENERAL: 'generalSection', + APPEARANCE: 'appearanceSection', + DEV_SETTINGS: 'devSettingsSection', + ABOUT: 'aboutSettingsSection', +} as const; + export const TENANT_OVERVIEW_TABLES_LIMIT = 5; export const EMPTY_DATA_PLACEHOLDER = '—'; @@ -60,16 +109,16 @@ export const CLUSTER_DEFAULT_TITLE = 'Cluster'; export const TENANT_DEFAULT_TITLE = 'Database'; // ==== Settings ==== -export const THEME_KEY = 'theme'; -export const LANGUAGE_KEY = 'language'; -export const INVERTED_DISKS_KEY = 'invertedDisks'; -export const SAVED_QUERIES_KEY = 'saved_queries'; -export const ASIDE_HEADER_COMPACT_KEY = 'asideHeaderCompact'; +export const THEME_KEY = SETTING_KEYS.THEME; +export const LANGUAGE_KEY = SETTING_KEYS.LANGUAGE; +export const INVERTED_DISKS_KEY = SETTING_KEYS.INVERTED_DISKS; +export const SAVED_QUERIES_KEY = SETTING_KEYS.SAVED_QUERIES; +export const ASIDE_HEADER_COMPACT_KEY = SETTING_KEYS.ASIDE_HEADER_COMPACT; export const QUERIES_HISTORY_KEY = 'queries_history'; -export const BINARY_DATA_IN_PLAIN_TEXT_DISPLAY = 'binaryDataInPlainTextDisplay'; -export const AUTO_REFRESH_INTERVAL = 'auto-refresh-interval'; +export const BINARY_DATA_IN_PLAIN_TEXT_DISPLAY = SETTING_KEYS.BINARY_DATA_IN_PLAIN_TEXT_DISPLAY; +export const AUTO_REFRESH_INTERVAL = SETTING_KEYS.AUTO_REFRESH_INTERVAL; -export const CASE_SENSITIVE_JSON_SEARCH = 'caseSensitiveJsonSearch'; +export const CASE_SENSITIVE_JSON_SEARCH = SETTING_KEYS.CASE_SENSITIVE_JSON_SEARCH; export const DEFAULT_SIZE_RESULT_PANE_KEY = 'default-size-result-pane'; export const DEFAULT_SIZE_TENANT_SUMMARY_KEY = 'default-size-tenant-summary-pane'; @@ -98,44 +147,52 @@ export const TENANT_OVERVIEW_TABLES_SETTINGS: Settings = { sortable: false, } as const; -export const QUERY_EXECUTION_SETTINGS_KEY = 'queryExecutionSettings'; -export const LAST_QUERY_EXECUTION_SETTINGS_KEY = 'last_query_execution_settings'; -export const QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY = 'querySettingsBannerLastClosed'; -export const QUERY_STOPPED_BANNER_CLOSED_KEY = 'queryStoppedBannerClosed'; +export const QUERY_EXECUTION_SETTINGS_KEY = SETTING_KEYS.QUERY_EXECUTION_SETTINGS; +export const LAST_QUERY_EXECUTION_SETTINGS_KEY = SETTING_KEYS.LAST_QUERY_EXECUTION_SETTINGS; +export const QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY = SETTING_KEYS.QUERY_SETTINGS_BANNER_LAST_CLOSED; +export const QUERY_STOPPED_BANNER_CLOSED_KEY = SETTING_KEYS.QUERY_STOPPED_BANNER_CLOSED; -export const LAST_USED_QUERY_ACTION_KEY = 'last_used_query_action'; +export const LAST_USED_QUERY_ACTION_KEY = SETTING_KEYS.LAST_USED_QUERY_ACTION; -export const PARTITIONS_HIDDEN_COLUMNS_KEY = 'partitionsHiddenColumns'; +export const PARTITIONS_HIDDEN_COLUMNS_KEY = SETTING_KEYS.PARTITIONS_HIDDEN_COLUMNS; // Remain "tab" in key name for backward compatibility -export const TENANT_INITIAL_PAGE_KEY = 'saved_tenant_initial_tab'; +export const TENANT_INITIAL_PAGE_KEY = SETTING_KEYS.TENANT_INITIAL_PAGE; -export const ENABLE_NETWORK_TABLE_KEY = 'enableNetworkTable'; +export const ENABLE_NETWORK_TABLE_KEY = SETTING_KEYS.ENABLE_NETWORK_TABLE; -export const USE_SHOW_PLAN_SVG_KEY = 'useShowPlanToSvg'; +export const USE_SHOW_PLAN_SVG_KEY = SETTING_KEYS.USE_SHOW_PLAN_SVG; // Setting to hide domain in database list -export const SHOW_DOMAIN_DATABASE_KEY = 'showDomainDatabase'; +export const SHOW_DOMAIN_DATABASE_KEY = SETTING_KEYS.SHOW_DOMAIN_DATABASE; + +export const USE_CLUSTER_BALANCER_AS_BACKEND_KEY = SETTING_KEYS.USE_CLUSTER_BALANCER_AS_BACKEND; + +export const ENABLE_AUTOCOMPLETE = SETTING_KEYS.ENABLE_AUTOCOMPLETE; -export const USE_CLUSTER_BALANCER_AS_BACKEND_KEY = 'useClusterBalancerAsBacked'; +export const ENABLE_CODE_ASSISTANT = SETTING_KEYS.ENABLE_CODE_ASSISTANT; -export const ENABLE_AUTOCOMPLETE = 'enableAutocomplete'; +export const ENABLE_QUERY_STREAMING = SETTING_KEYS.ENABLE_QUERY_STREAMING; -export const ENABLE_CODE_ASSISTANT = 'enableCodeAssistant'; +export const ENABLE_QUERY_STREAMING_OLD_BACKEND = SETTING_KEYS.ENABLE_QUERY_STREAMING_OLD_BACKEND; -export const ENABLE_QUERY_STREAMING = 'enableQueryStreaming'; +export const OLD_BACKEND_CLUSTER_NAMES = [ + 'cloud_prod_kikimr_global', + 'cloud_preprod_kikimr_global', + 'cloud_prod_kikimr_ydb_public_storage', +]; -export const AUTOCOMPLETE_ON_ENTER = 'autocompleteOnEnter'; +export const AUTOCOMPLETE_ON_ENTER = SETTING_KEYS.AUTOCOMPLETE_ON_ENTER; -export const IS_HOTKEYS_HELP_HIDDEN_KEY = 'isHotKeysHelpHidden'; +export const IS_HOTKEYS_HELP_HIDDEN_KEY = SETTING_KEYS.IS_HOTKEYS_HELP_HIDDEN; export const DEV_ENABLE_TRACING_FOR_ALL_REQUESTS = 'enable_tracing_for_all_requests'; -export const SHOW_NETWORK_UTILIZATION = 'enableNetworkUtilization'; +export const SHOW_NETWORK_UTILIZATION = SETTING_KEYS.SHOW_NETWORK_UTILIZATION; -export const EXPAND_CLUSTER_DASHBOARD = 'expandClusterDashboard'; +export const EXPAND_CLUSTER_DASHBOARD = SETTING_KEYS.EXPAND_CLUSTER_DASHBOARD; -export const ACL_SYNTAX_KEY = 'aclSyntax'; +export const ACL_SYNTAX_KEY = SETTING_KEYS.ACL_SYNTAX; export enum AclSyntax { Kikimr = 'kikimr', diff --git a/src/utils/hooks/index.ts b/src/utils/hooks/index.ts index 0faf3493a9..e6bc7cd24c 100644 --- a/src/utils/hooks/index.ts +++ b/src/utils/hooks/index.ts @@ -2,6 +2,7 @@ export * from './useTypedSelector'; export * from './useTypedDispatch'; export * from './useSetting'; export * from './useQueryExecutionSettings'; +export * from './useQueryStreamingSetting'; export * from './useTableSort'; export * from './useSearchQuery'; export * from './useAutoRefreshInterval'; diff --git a/src/utils/hooks/useQueryExecutionSettings.ts b/src/utils/hooks/useQueryExecutionSettings.ts index 769f6a7e20..028ddbb4d8 100644 --- a/src/utils/hooks/useQueryExecutionSettings.ts +++ b/src/utils/hooks/useQueryExecutionSettings.ts @@ -2,11 +2,7 @@ import React from 'react'; import {useTracingLevelOptionAvailable} from '../../store/reducers/capabilities/hooks'; import type {QuerySettings} from '../../types/store/query'; -import { - ENABLE_QUERY_STREAMING, - QUERY_EXECUTION_SETTINGS_KEY, - USE_SHOW_PLAN_SVG_KEY, -} from '../constants'; +import {QUERY_EXECUTION_SETTINGS_KEY, USE_SHOW_PLAN_SVG_KEY} from '../constants'; import { DEFAULT_QUERY_SETTINGS, QUERY_MODES, @@ -14,6 +10,7 @@ import { querySettingsRestoreSchema, } from '../query'; +import {useQueryStreamingSetting} from './useQueryStreamingSetting'; import {useSetting} from './useSetting'; export const useQueryExecutionSettings = () => { @@ -22,7 +19,7 @@ export const useQueryExecutionSettings = () => { const validatedSettings = querySettingsRestoreSchema.parse(storageSettings); const [useShowPlanToSvg] = useSetting(USE_SHOW_PLAN_SVG_KEY); - const [enableQueryStreaming] = useSetting(ENABLE_QUERY_STREAMING); + const [enableQueryStreaming] = useQueryStreamingSetting(); const setQueryExecutionSettings = React.useCallback( (settings: QuerySettings) => { diff --git a/src/utils/hooks/useQueryStreamingSetting.ts b/src/utils/hooks/useQueryStreamingSetting.ts new file mode 100644 index 0000000000..46a24edfb1 --- /dev/null +++ b/src/utils/hooks/useQueryStreamingSetting.ts @@ -0,0 +1,20 @@ +import { + ENABLE_QUERY_STREAMING, + ENABLE_QUERY_STREAMING_OLD_BACKEND, + OLD_BACKEND_CLUSTER_NAMES, +} from '../constants'; + +import {useClusterNameFromQuery} from './useDatabaseFromQuery'; +import {useSetting} from './useSetting'; + +export const useQueryStreamingSetting = (): [boolean, (value: boolean) => void] => { + const clusterName = useClusterNameFromQuery(); + + const isOldBackendCluster = clusterName && OLD_BACKEND_CLUSTER_NAMES.includes(clusterName); + + const settingKey = isOldBackendCluster + ? ENABLE_QUERY_STREAMING_OLD_BACKEND + : ENABLE_QUERY_STREAMING; + + return useSetting(settingKey); +};