Skip to content

Commit c021e65

Browse files
authored
fix: query activities banner visibility (#2572)
1 parent 8c9b492 commit c021e65

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

src/components/QueriesActivityBar/QueriesActivityBar.tsx

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {cn} from '../../utils/cn';
1313
import {useAutoRefreshInterval} from '../../utils/hooks';
1414
import type {TimeFrame} from '../../utils/timeframes';
1515
import {chartApi} from '../MetricChart/reducer';
16+
import type {ChartDataStatus} from '../MetricChart/types';
1617

1718
import {QueriesActivityCharts} from './QueriesActivityCharts';
1819
import 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
}

src/components/QueriesActivityBar/QueriesActivityCharts.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ const b = cn('queries-activity-bar');
1515
interface QueriesActivityChartsProps {
1616
tenantName: string;
1717
expanded: boolean;
18+
onChartDataStatusChange?: (status: ChartDataStatus) => void;
1819
}
1920

2021
const ACTIVITY_CHART_HEIGHT = 292;
2122

22-
export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityChartsProps) {
23+
export function QueriesActivityCharts({
24+
tenantName,
25+
expanded,
26+
onChartDataStatusChange,
27+
}: QueriesActivityChartsProps) {
2328
const [autoRefreshInterval] = useAutoRefreshInterval();
2429
const [queriesTimeFrame, setQueriesTimeFrame] = React.useState<TimeFrame>('1h');
2530
const [latenciesTimeFrame, setLatenciesTimeFrame] = React.useState<TimeFrame>('1h');
@@ -44,11 +49,16 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
4449
// Refetch data only if charts have successfully loaded at least once
4550
const shouldRefresh = hasChartsLoaded ? autoRefreshInterval : 0;
4651

47-
const handleChartDataStatusChange = React.useCallback((status: ChartDataStatus) => {
48-
if (status === 'success') {
49-
setHasChartsLoaded(true);
50-
}
51-
}, []);
52+
const handleChartDataStatusChange = React.useCallback(
53+
(status: ChartDataStatus) => {
54+
if (status === 'success') {
55+
setHasChartsLoaded(true);
56+
}
57+
// Also call parent callback if provided
58+
onChartDataStatusChange?.(status);
59+
},
60+
[onChartDataStatusChange],
61+
);
5262

5363
const handleQueriesTimeFrameChange = React.useCallback((newTimeFrame: TimeFrame) => {
5464
setQueriesTimeFrame(newTimeFrame);
@@ -92,12 +102,9 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
92102
// fails when the chart is not immediately visible during mounting.
93103

94104
// TODO: Remove this workaround once the upstream issue is fixed
95-
if (!expanded) {
96-
return null;
97-
}
98105

99106
return (
100-
<div className={b('charts')}>
107+
<div className={b('charts')} style={{display: expanded ? undefined : 'none'}}>
101108
<div className={b('chart-container')}>
102109
<MetricChart
103110
database={tenantName}
@@ -107,7 +114,7 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
107114
height={ACTIVITY_CHART_HEIGHT}
108115
chartOptions={queriesChartConfig.options}
109116
onChartDataStatusChange={handleChartDataStatusChange}
110-
isChartVisible={hasChartsLoaded}
117+
isChartVisible={hasChartsLoaded && expanded}
111118
noBorder={true}
112119
fullWidth={true}
113120
renderChartToolbar={renderQueriesChartToolbar}
@@ -123,7 +130,7 @@ export function QueriesActivityCharts({tenantName, expanded}: QueriesActivityCha
123130
height={ACTIVITY_CHART_HEIGHT}
124131
chartOptions={latenciesChartConfig.options}
125132
onChartDataStatusChange={handleChartDataStatusChange}
126-
isChartVisible={hasChartsLoaded}
133+
isChartVisible={hasChartsLoaded && expanded}
127134
noBorder={true}
128135
fullWidth={true}
129136
renderChartToolbar={renderLatenciesChartToolbar}

0 commit comments

Comments
 (0)