"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)} `}
/>
} />
);
};
export default LoopMeasurementChart;