@@ -26,7 +26,7 @@ ChartJS.register(
2626 zoomPlugin
2727) ;
2828
29- const ChartWrapper = ( { data, options, chartId, onRegisterChart, onSyncHover } ) => {
29+ const ChartWrapper = ( { data, options, chartId, onRegisterChart, onSyncHover, syncRef } ) => {
3030 const chartRef = useRef ( null ) ;
3131
3232 const handleChartRef = useCallback ( ( ref ) => {
@@ -38,17 +38,18 @@ const ChartWrapper = ({ data, options, chartId, onRegisterChart, onSyncHover })
3838
3939 const enhancedOptions = {
4040 ...options ,
41- onHover : ( event , activeElements ) => {
42- if ( activeElements . length > 0 && chartRef . current ) {
43- const { datasetIndex, index } = activeElements [ 0 ] ;
44- const dataset = chartRef . current . data . datasets [ datasetIndex ] ;
45- const point = dataset . data [ index ] ;
46- const step = point . x ;
47- onSyncHover ( step , chartId ) ;
48- } else {
49- onSyncHover ( null , chartId ) ;
50- }
51- } ,
41+ onHover : ( event , activeElements ) => {
42+ if ( syncRef ?. current ) return ;
43+ if ( activeElements . length > 0 && chartRef . current ) {
44+ const { datasetIndex, index } = activeElements [ 0 ] ;
45+ const dataset = chartRef . current . data . datasets [ datasetIndex ] ;
46+ const point = dataset . data [ index ] ;
47+ const step = point . x ;
48+ onSyncHover ( step , chartId ) ;
49+ } else {
50+ onSyncHover ( null , chartId ) ;
51+ }
52+ } ,
5253 events : [ 'mousemove' , 'mouseout' , 'click' , 'touchstart' , 'touchmove' ] ,
5354 } ;
5455
@@ -74,17 +75,20 @@ export default function ChartContainer({
7475 onMaxStepChange
7576} ) {
7677 const chartRefs = useRef ( new Map ( ) ) ;
78+ const syncLockRef = useRef ( false ) ;
7779 const registerChart = useCallback ( ( id , inst ) => {
7880 chartRefs . current . set ( id , inst ) ;
7981 } , [ ] ) ;
8082
8183 const syncHoverToAllCharts = useCallback ( ( step , sourceId ) => {
84+ if ( syncLockRef . current ) return ;
85+ syncLockRef . current = true ;
8286 chartRefs . current . forEach ( ( chart , id ) => {
8387 if ( ! chart ) return ;
8488 if ( step === null ) {
8589 chart . setActiveElements ( [ ] ) ;
86- chart . tooltip . setActiveElements ( [ ] ) ;
87- chart . update ( 'none' ) ;
90+ chart . tooltip . setActiveElements ( [ ] , { x : 0 , y : 0 } ) ;
91+ chart . draw ( ) ;
8892 } else if ( id !== sourceId ) {
8993 const activeElements = [ ] ;
9094 chart . data . datasets . forEach ( ( dataset , datasetIndex ) => {
@@ -93,11 +97,13 @@ export default function ChartContainer({
9397 activeElements . push ( { datasetIndex, index : idx } ) ;
9498 }
9599 } ) ;
100+ const pos = { x : chart . scales . x . getPixelForValue ( step ) , y : 0 } ;
96101 chart . setActiveElements ( activeElements ) ;
97- chart . tooltip . setActiveElements ( activeElements , { x : 0 , y : 0 } ) ;
98- chart . update ( 'none' ) ;
102+ chart . tooltip . setActiveElements ( activeElements , pos ) ;
103+ chart . draw ( ) ;
99104 }
100105 } ) ;
106+ syncLockRef . current = false ;
101107 } , [ ] ) ;
102108
103109 const parsedData = useMemo ( ( ) => {
@@ -548,6 +554,7 @@ export default function ChartContainer({
548554 chartId = { `metric-comp-${ idx } ` }
549555 onRegisterChart = { registerChart }
550556 onSyncHover = { syncHoverToAllCharts }
557+ syncRef = { syncLockRef }
551558 data = { compData }
552559 options = { compOptions }
553560 />
@@ -562,6 +569,7 @@ export default function ChartContainer({
562569 chartId = { `metric-${ idx } ` }
563570 onRegisterChart = { registerChart }
564571 onSyncHover = { syncHoverToAllCharts }
572+ syncRef = { syncLockRef }
565573 data = { createChartData ( dataArray ) }
566574 options = { options }
567575 />
0 commit comments