"use client"; // components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx import React, { useCallback, useEffect, useMemo } from "react"; import { useSelector, useDispatch } from "react-redux"; import { RootState } from "../../../../../../redux/store"; import { ComposedChart, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, Line, Brush, } from "recharts"; import { setBrushRange } from "../../../../../../redux/slices/brushSlice"; import CustomTooltip from "./CustomTooltip"; const LoopMeasurementChart = () => { const dispatch = useDispatch(); const unit = useSelector( (state: RootState) => state.kabelueberwachungChart.unit ); const brushRange = useSelector((state: RootState) => state.brush); const { loopMeasurementCurveChartData, selectedMode, vonDatum, bisDatum, isFullScreen, } = useSelector((state: RootState) => state.kabelueberwachungChart); const formatierteDaten = useMemo( () => loopMeasurementCurveChartData .map((eintrag) => ({ zeit: new Date(eintrag.t).getTime(), messwertMinimum: eintrag.i, messwertMaximum: eintrag.a, messwert: eintrag.m ?? null, messwertDurchschnitt: ["DIA0", "DIA1", "DIA2"].includes(selectedMode) ? eintrag.g ?? null : null, })) .reverse(), [loopMeasurementCurveChartData, selectedMode] ); useEffect(() => { if (brushRange.endIndex === 0 && formatierteDaten.length) { dispatch( setBrushRange({ startIndex: 0, endIndex: formatierteDaten.length - 1, }) ); } }, [formatierteDaten, brushRange.endIndex, dispatch]); const handleBrushChange = useCallback( ({ startIndex, endIndex }: { startIndex?: number; endIndex?: number }) => { if (startIndex === undefined || endIndex === undefined) return; dispatch( setBrushRange({ startIndex, endIndex, startDate: new Date( formatierteDaten[startIndex]?.zeit || formatierteDaten[0].zeit ) .toISOString() .split("T")[0], endDate: new Date( formatierteDaten[endIndex]?.zeit || formatierteDaten[formatierteDaten.length - 1].zeit ) .toISOString() .split("T")[0], }) ); }, [dispatch, formatierteDaten] ); useEffect(() => { if (formatierteDaten.length) { const startIndex = formatierteDaten.findIndex( (d) => new Date(d.zeit).toISOString().split("T")[0] === vonDatum ); const endIndex = formatierteDaten.findIndex( (d) => new Date(d.zeit).toISOString().split("T")[0] === bisDatum ); if (startIndex !== -1 && endIndex !== -1) { dispatch( setBrushRange({ startIndex, endIndex, startDate: vonDatum, endDate: bisDatum, }) ); } } }, [vonDatum, bisDatum, formatierteDaten, dispatch]); useEffect(() => { if (formatierteDaten.length > 0) { dispatch( setBrushRange({ startIndex: 0, endIndex: formatierteDaten.length - 1, startDate: new Date(formatierteDaten[0].zeit) .toISOString() .split("T")[0], endDate: new Date(formatierteDaten[formatierteDaten.length - 1].zeit) .toISOString() .split("T")[0], }) ); } }, [selectedMode, formatierteDaten, dispatch]); const legendLabelMap: Record = { messwertMinimum: "Minimum", messwert: "Messwert", messwertMaximum: "Maximum", messwertDurchschnitt: "Durchschnitt", }; return (
{ const date = new Date(zeit); return `${date.getDate()}.${date.getMonth() + 1}`; }} tick={(props) => { const { x, y, payload } = props; const date = new Date(payload.value); return ( {`${date.getDate()}.${date.getMonth() + 1}`} ); }} /> `${wert.toFixed(0)} `} /> } /> { if (!payload) return null; const orderedPayload = [...payload].sort((a, b) => { const order = [ "messwertMinimum", "messwert", "messwertDurchschnitt", "messwertMaximum", ]; return order.indexOf(a.value) - order.indexOf(b.value); }); return (
{orderedPayload.map((entry, index) => ( ⬤ {legendLabelMap[entry.value] ?? entry.value} ))}
); }} /> {["DIA1", "DIA2"].includes(selectedMode) && ( )} {selectedMode === "DIA0" && ( )} new Date(zeit).toLocaleDateString()} />
); }; export default LoopMeasurementChart;