"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] ); // 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]); //---------------------------------------------------------------- useEffect(() => { if (formatierteDaten.length > 0) { console.log( "📊 Brush wird nach Modus-Wechsel aktualisiert:", selectedMode ); dispatch( setBrushRange({ startIndex: 0, endIndex: formatierteDaten.length - 1, // Stellt sicher, dass der Brush-Bereich korrekt gesetzt wird 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]); //-------------------------------------------------------------------------------- return (