diff --git a/stories/Chart.tsx b/stories/Chart.tsx index f39eee15c..4ae8f0dab 100644 --- a/stories/Chart.tsx +++ b/stories/Chart.tsx @@ -1,17 +1,11 @@ -import React, { - MouseEvent, - useRef, - useState, - useEffect, - useReducer, - useMemo, -} from 'react'; +import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react'; import 'chart.js/auto'; import type { InteractionItem } from 'chart.js'; import { Chart as ChartJS } from 'chart.js'; import 'chartjs-adapter-date-fns'; import annotationPlugin from 'chartjs-plugin-annotation'; import zoomPlugin from 'chartjs-plugin-zoom'; + import { Chart, getDatasetAtEvent, @@ -24,25 +18,8 @@ import * as data from './Chart.data'; ChartJS.register(annotationPlugin, zoomPlugin); -export default { - title: 'Components/Chart', - component: Chart, - parameters: { - layout: 'centered', - }, - args: { - width: 500, - height: 400, - }, -}; - -export const MultiType = args => ; - -MultiType.args = { - data: multitypeChart.data, -}; - -export const Dynamic = args => { +// Container Component +const ChartContainer = ({ data, options }) => { const [dynamicData, setDynamicData] = useState(data.getDynamicData); useEffect(() => { @@ -54,116 +31,83 @@ export const Dynamic = args => { return () => clearInterval(interval); }, []); - return ; -}; - -Dynamic.args = { - options: data.dynamicOptions, -}; - -export const ClickEvents = ({ - onDatasetClick, - onElementClick, - onElementsClick, - options, - data, - ...args -}) => { - const datasetAtEvent = (dataset: InteractionItem[]) => { - if (!dataset.length) return; - - const datasetIndex = dataset[0].datasetIndex; + const chartRef = useRef(null); - onDatasetClick(data.datasets[datasetIndex].label); + const onDatasetClick = (datasetIndex) => { + // Handle dataset click + // Works only when "datasetEvents" is enabled }; - const elementAtEvent = (element: InteractionItem[]) => { - if (!element.length) return; - - const { datasetIndex, index } = element[0]; - - onElementClick(data.labels[index], data.datasets[datasetIndex].data[index]); + const onElementClick = (index, datasetIndex) => { + // Handle element click + // Works only when "elementEvents" is enabled }; - const elementsAtEvent = (elements: InteractionItem[]) => { - if (!elements.length) return; - - onElementsClick(elements); + const onElementsClick = (elements) => { + // Handle elements click + // Works only when "elementsEvents" is enabled }; - const chartRef = useRef(null); - - const onClick = (event: MouseEvent) => { + const onClick = (event) => { const { current: chart } = chartRef; if (!chart) { return; } - datasetAtEvent(getDatasetAtEvent(chart, event)); - elementAtEvent(getElementAtEvent(chart, event)); - elementsAtEvent(getElementsAtEvent(chart, event)); + const dataset = getDatasetAtEvent(chart, event); + const element = getElementAtEvent(chart, event); + const elements = getElementsAtEvent(chart, event); + + if (dataset.length) { + const datasetIndex = dataset[0].datasetIndex; + onDatasetClick(datasetIndex); + } + + if (element.length) { + const { datasetIndex, index } = element[0]; + onElementClick(index, datasetIndex); + } + + if (elements.length) { + onElementsClick(elements); + } }; return ( ); }; -ClickEvents.args = { - options: eventsChart.options, - data: eventsChart.data, -}; - -ClickEvents.argTypes = { - onDatasetClick: { action: 'dataset clicked' }, - onElementClick: { action: 'element clicked' }, - onElementsClick: { action: 'elements clicked' }, -}; - -export const Redraw = args => ; - -Redraw.args = { - data: multitypeChart.data, - redraw: true, -}; - -export const SameDataToggle = args => { +// Presentational Components +export const MultiType = (args) => ; +export const Dynamic = (args) => ; +export const ClickEvents = (args) => ; +export const Redraw = (args) => ; +export const SameDataToggle = (args) => { const [currentData, toggleData] = useReducer( - prevState => + (prevState) => prevState === data.sameData1 ? data.sameData2 : data.sameData1, data.sameData1 ); - return ; + return ; }; - -SameDataToggle.args = { - type: 'bar', -}; - -export const Decimation = args => { - const [currentData, toggleData] = useReducer( +export const Decimation = (args) => { + const[currentData, toggleData] = useReducer( data.getDecimationData, data.getDecimationData() ); - return ; + return ; }; - -Decimation.args = { - type: 'line', - options: data.decimationOptions, -}; - -export const DynamicOptions = args => { +export const DynamicOptions = (args) => { const [yMax, setYMax] = useState(100); const options = useMemo( () => ({ @@ -198,12 +142,8 @@ export const DynamicOptions = args => { return ( <> - - + + ); }; - -DynamicOptions.args = { - data: multitypeChart.data, -};