1
- import type { ReactElement } from 'react' ;
1
+ import { type ReactElement , useCallback , useRef } from 'react' ;
2
2
import { type Theme , useTheme } from '@emotion/react' ;
3
3
import type {
4
4
CustomSeriesOption ,
@@ -31,7 +31,10 @@ import {
31
31
BUBBLE_SERIES_ID ,
32
32
} from 'sentry/views/dashboards/widgets/timeSeriesWidget/releaseBubbles/constants' ;
33
33
import { createReleaseBubbleHighlighter } from 'sentry/views/dashboards/widgets/timeSeriesWidget/releaseBubbles/createReleaseBubbleHighlighter' ;
34
- import type { Bucket } from 'sentry/views/dashboards/widgets/timeSeriesWidget/releaseBubbles/types' ;
34
+ import type {
35
+ Bucket ,
36
+ ChartRendererProps ,
37
+ } from 'sentry/views/dashboards/widgets/timeSeriesWidget/releaseBubbles/types' ;
35
38
import { createReleaseBuckets } from 'sentry/views/dashboards/widgets/timeSeriesWidget/releaseBubbles/utils/createReleaseBuckets' ;
36
39
import { ReleasesDrawer } from 'sentry/views/releases/drawer/releasesDrawer' ;
37
40
@@ -42,11 +45,7 @@ interface CreateReleaseBubbleMouseListenersParams {
42
45
renderer : DrawerConfig [ 'renderer' ] ,
43
46
options : DrawerConfig [ 'options' ]
44
47
) => void ;
45
- chartRenderer ?: ( rendererProps : {
46
- end : Date ;
47
- releases : ReleaseMetaBasic [ ] ;
48
- start : Date ;
49
- } ) => ReactElement ;
48
+ chartRenderer ?: ( rendererProps : ChartRendererProps ) => ReactElement ;
50
49
}
51
50
52
51
/**
@@ -322,26 +321,44 @@ ${t('Click to expand')}
322
321
}
323
322
324
323
interface UseReleaseBubblesParams {
325
- chartRef : React . RefObject < ReactEchartsRef | null > ;
324
+ /**
325
+ * The whitespace around the bubbles.
326
+ */
326
327
bubblePadding ?: number ;
328
+ /**
329
+ * The size (height) of the bubble
330
+ */
327
331
bubbleSize ?: number ;
328
- chartRenderer ?: ( rendererProps : {
329
- end : Date ;
330
- releases : ReleaseMetaBasic [ ] ;
331
- start : Date ;
332
- } ) => ReactElement ;
332
+ /**
333
+ * This is a callback function that is used in ReleasesDrawer when rendering
334
+ * the chart inside of the drawer.
335
+ */
336
+ chartRenderer ?: ( rendererProps : ChartRendererProps ) => ReactElement ;
337
+ /**
338
+ * Number of desired bubbles/buckets to create
339
+ */
340
+ desiredBuckets ?: number ;
341
+ /**
342
+ * The maximum/latest timestamp of the chart's timeseries
343
+ */
333
344
maxTime ?: number ;
345
+ /**
346
+ * The minimum/earliest timestamp of the chart's timeseries
347
+ */
334
348
minTime ?: number ;
349
+ /**
350
+ * List of releases that will be grouped
351
+ */
335
352
releases ?: ReleaseMetaBasic [ ] ;
336
353
}
337
354
export function useReleaseBubbles ( {
338
- chartRef,
339
355
chartRenderer,
340
356
releases,
341
357
minTime,
342
358
maxTime,
343
359
bubbleSize = 4 ,
344
360
bubblePadding = 2 ,
361
+ desiredBuckets = 10 ,
345
362
} : UseReleaseBubblesParams ) {
346
363
const organization = useOrganization ( ) ;
347
364
const { openDrawer} = useDrawer ( ) ;
@@ -355,13 +372,28 @@ export function useReleaseBubbles({
355
372
const releasesMaxTime = defined ( selection . datetime . end )
356
373
? new Date ( selection . datetime . end ) . getTime ( )
357
374
: Date . now ( ) ;
375
+ const chartRef = useRef < ReactEchartsRef | null > ( null ) ;
358
376
const hasReleaseBubbles = organization . features . includes ( 'release-bubbles-ui' ) ;
377
+ const handleChartRef = useCallback ( ( e : ReactEchartsRef | null ) => {
378
+ chartRef . current = e ;
379
+
380
+ if ( e ?. getEchartsInstance ) {
381
+ createReleaseBubbleHighlighter ( e . getEchartsInstance ( ) ) ;
382
+ }
383
+ } , [ ] ) ;
384
+
359
385
const buckets =
360
386
( hasReleaseBubbles &&
361
387
releases ?. length &&
362
388
minTime &&
363
389
maxTime &&
364
- createReleaseBuckets ( minTime , maxTime , releasesMaxTime , releases ) ) ||
390
+ createReleaseBuckets ( {
391
+ minTime,
392
+ maxTime,
393
+ finalTime : releasesMaxTime ,
394
+ releases,
395
+ desiredBuckets,
396
+ } ) ) ||
365
397
[ ] ;
366
398
367
399
if ( ! releases || ! buckets . length ) {
@@ -377,7 +409,7 @@ export function useReleaseBubbles({
377
409
const totalBubblePaddingY = bubblePadding * 2 ;
378
410
379
411
return {
380
- createReleaseBubbleHighlighter,
412
+ createReleaseBubbleHighlighter : handleChartRef ,
381
413
382
414
/**
383
415
* An object map of ECharts event handlers. These should be spread onto a Chart component
0 commit comments