@@ -13,6 +13,7 @@ import {cn} from '../../utils/cn';
1313import { useAutoRefreshInterval } from '../../utils/hooks' ;
1414import type { TimeFrame } from '../../utils/timeframes' ;
1515import { chartApi } from '../MetricChart/reducer' ;
16+ import type { ChartDataStatus } from '../MetricChart/types' ;
1617
1718import { QueriesActivityCharts } from './QueriesActivityCharts' ;
1819import i18n from './i18n' ;
@@ -33,14 +34,33 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
3334 const [ expanded , setExpanded ] = React . useState ( false ) ;
3435 const [ queriesTimeFrame ] = React . useState < TimeFrame > ( '1h' ) ;
3536 const [ latenciesTimeFrame ] = React . useState < TimeFrame > ( '1h' ) ;
37+ const [ isActivityBarHidden , setIsActivityBarHidden ] = React . useState < boolean > ( true ) ;
38+
39+ // Refetch data only if activity bar successfully loaded
40+ const shouldRefresh = isActivityBarHidden ? 0 : autoRefreshInterval ;
41+
42+ /**
43+ * Activity bar should be hidden, if charts are not enabled:
44+ * 1. GraphShard is not enabled
45+ * 2. ydb version does not have /viewer/json/render endpoint (400, 404, CORS error, etc.)
46+ *
47+ * If at least one chart successfully loaded, activity bar should be shown
48+ * @link https://github.com/ydb-platform/ydb-embedded-ui/issues/659
49+ * @todo disable only for specific errors ('GraphShard is not enabled') after ydb-stable-24 is generally used
50+ */
51+ const handleChartDataStatusChange = React . useCallback ( ( chartStatus : ChartDataStatus ) => {
52+ if ( chartStatus === 'success' ) {
53+ setIsActivityBarHidden ( false ) ;
54+ }
55+ } , [ ] ) ;
3656
3757 // Fetch running queries
3858 const { data : runningQueriesData } = topQueriesApi . useGetRunningQueriesQuery (
3959 {
4060 database : tenantName ,
4161 filters : { } ,
4262 } ,
43- { pollingInterval : autoRefreshInterval } ,
63+ { pollingInterval : shouldRefresh } ,
4464 ) ;
4565
4666 // Fetch queries per second data for header metrics
@@ -51,7 +71,7 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
5171 timeFrame : queriesTimeFrame ,
5272 maxDataPoints : 30 ,
5373 } ,
54- { pollingInterval : autoRefreshInterval } ,
74+ { pollingInterval : shouldRefresh } ,
5575 ) ;
5676
5777 // Fetch latency data for header metrics
@@ -62,7 +82,7 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
6282 timeFrame : latenciesTimeFrame ,
6383 maxDataPoints : 30 ,
6484 } ,
65- { pollingInterval : autoRefreshInterval } ,
85+ { pollingInterval : shouldRefresh } ,
6686 ) ;
6787
6888 const runningQueriesCount = runningQueriesData ?. resultSets ?. [ 0 ] ?. result ?. length || 0 ;
@@ -109,7 +129,7 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
109129 } ;
110130
111131 return (
112- < div className = { b ( { expanded} ) } >
132+ < div className = { b ( { expanded} ) } style = { { display : isActivityBarHidden ? 'none' : undefined } } >
113133 < Disclosure expanded = { expanded } onUpdate = { setExpanded } className = { b ( 'disclosure' ) } >
114134 < Disclosure . Summary >
115135 { ( props ) => (
@@ -204,7 +224,11 @@ export function QueriesActivityBar({tenantName}: QueriesActivityBarProps) {
204224 </ div >
205225 ) : null }
206226 </ Disclosure >
207- < QueriesActivityCharts tenantName = { tenantName } expanded = { expanded } />
227+ < QueriesActivityCharts
228+ tenantName = { tenantName }
229+ expanded = { expanded }
230+ onChartDataStatusChange = { handleChartDataStatusChange }
231+ />
208232 </ div >
209233 ) ;
210234}
0 commit comments