|
1 | | -import React, { useState, useEffect, useReducer } from 'react'; |
| 1 | +import React, { |
| 2 | + MouseEvent, |
| 3 | + useRef, |
| 4 | + useState, |
| 5 | + useEffect, |
| 6 | + useReducer, |
| 7 | +} from 'react'; |
2 | 8 | import 'chart.js/auto'; |
3 | | -import { InteractionItem } from 'chart.js'; |
| 9 | +import type { Chart as ChartJS, InteractionItem } from 'chart.js'; |
4 | 10 | import 'chartjs-adapter-date-fns'; |
5 | | -import { Chart } from '../src'; |
| 11 | +import { |
| 12 | + Chart, |
| 13 | + getDatasetAtEvent, |
| 14 | + getElementAtEvent, |
| 15 | + getElementsAtEvent, |
| 16 | +} from '../src'; |
6 | 17 | import * as multitypeChart from '../sandboxes/chart/multitype/App'; |
7 | 18 | import * as eventsChart from '../sandboxes/chart/events/App'; |
8 | 19 | import * as data from './Chart.data'; |
@@ -52,37 +63,50 @@ export const ClickEvents = ({ |
52 | 63 | data, |
53 | 64 | ...args |
54 | 65 | }) => { |
55 | | - const getDatasetAtEvent = (dataset: InteractionItem[]) => { |
| 66 | + const datasetAtEvent = (dataset: InteractionItem[]) => { |
56 | 67 | if (!dataset.length) return; |
57 | 68 |
|
58 | 69 | const datasetIndex = dataset[0].datasetIndex; |
59 | 70 |
|
60 | 71 | onDatasetClick(data.datasets[datasetIndex].label); |
61 | 72 | }; |
62 | 73 |
|
63 | | - const getElementAtEvent = (element: InteractionItem[]) => { |
| 74 | + const elementAtEvent = (element: InteractionItem[]) => { |
64 | 75 | if (!element.length) return; |
65 | 76 |
|
66 | 77 | const { datasetIndex, index } = element[0]; |
67 | 78 |
|
68 | 79 | onElementClick(data.labels[index], data.datasets[datasetIndex].data[index]); |
69 | 80 | }; |
70 | 81 |
|
71 | | - const getElementsAtEvent = (elements: InteractionItem[]) => { |
| 82 | + const elementsAtEvent = (elements: InteractionItem[]) => { |
72 | 83 | if (!elements.length) return; |
73 | 84 |
|
74 | 85 | onElementsClick(elements); |
75 | 86 | }; |
76 | 87 |
|
| 88 | + const chartRef = useRef<ChartJS>(null); |
| 89 | + |
| 90 | + const onClick = (event: MouseEvent<HTMLCanvasElement>) => { |
| 91 | + const { current: chart } = chartRef; |
| 92 | + |
| 93 | + if (!chart) { |
| 94 | + return; |
| 95 | + } |
| 96 | + |
| 97 | + datasetAtEvent(getDatasetAtEvent(chart, event)); |
| 98 | + elementAtEvent(getElementAtEvent(chart, event)); |
| 99 | + elementsAtEvent(getElementsAtEvent(chart, event)); |
| 100 | + }; |
| 101 | + |
77 | 102 | return ( |
78 | 103 | <Chart |
79 | 104 | {...args} |
| 105 | + ref={chartRef} |
80 | 106 | type='bar' |
81 | 107 | options={options} |
82 | 108 | data={data} |
83 | | - getDatasetAtEvent={getDatasetAtEvent} |
84 | | - getElementAtEvent={getElementAtEvent} |
85 | | - getElementsAtEvent={getElementsAtEvent} |
| 109 | + onClick={onClick} |
86 | 110 | /> |
87 | 111 | ); |
88 | 112 | }; |
|
0 commit comments