"use client"; 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"; const CustomTooltip = ({ active, payload, label, unit }: any) => { if (active && payload && payload.length) { const messwertMax = payload.find( (p: any) => p.dataKey === "messwertMaximum" ); const messwert = payload.find((p: any) => p.dataKey === "messwert"); const messwertMin = payload.find( (p: any) => p.dataKey === "messwertMinimum" ); const messwertDurchschnitt = payload.find( (p: any) => p.dataKey === "messwertDurchschnitt" ); return (
{new Date(label).toLocaleString()} {messwertMax && (
Messwert Maximum: {messwertMax.value.toFixed(2)} {unit}
)} {messwert && (
Messwert: {messwert.value.toFixed(2)} {unit}
)} {messwertDurchschnitt && (
{`Messwert Durchschnitt: ${messwertDurchschnitt.value.toFixed( 2 )} ${unit}`}
)} {messwertMin && (
{`Messwert Minimum: ${messwertMin.value.toFixed(2)} ${unit}`}
)}
); } return null; }; 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] ); // Initialisierung des Brush-Bereichs nur beim ersten Laden der Daten 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; // Verhindert Fehler 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) { console.log("🔍 Redux vonDatum:", vonDatum); console.log("🔍 Redux bisDatum:", bisDatum); //console.log("🔍 Verfügbare Zeitpunkte in formatierteDaten:"); /* formatierteDaten.forEach((d, index) => { console.log( `${index}: ${new Date(d.zeit).toISOString().split("T")[0]}` ); }); */ const startIndex = formatierteDaten.findIndex( (d) => new Date(d.zeit).toISOString().split("T")[0] === vonDatum ); //console.log("startIndex in Brush ", startIndex); const endIndex = formatierteDaten.findIndex( (d) => new Date(d.zeit).toISOString().split("T")[0] === bisDatum ); //console.log("endIndex in Brush ", endIndex); if (startIndex !== -1 && endIndex !== -1) { dispatch( setBrushRange({ startIndex, endIndex, startDate: vonDatum, endDate: bisDatum, }) ); } } }, [vonDatum, bisDatum, formatierteDaten, dispatch]); //---------------------------------------------------------------- return (
{ const date = new Date(zeit); return `${date.getDate()}.${date.getMonth() + 1}`; }} tick={{ angle: -25, dy: 5 }} // Dreht die Labels für bessere Übersicht /> `${wert.toFixed(0)} `} /> } /> { if (!payload) return null; // Reihenfolge der Legende anpassen 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) => ( ⬤ {entry.value} ))}
); }} /> {["DIA1", "DIA2"].includes(selectedMode) && ( )} {selectedMode === "DIA0" && ( )} new Date(zeit).toLocaleDateString()} // Datum statt Zahl />
); }; export default LoopMeasurementChart;