"use client"; // Report.tsx import React, { useState, useEffect, useCallback } from "react"; import { useSelector, useDispatch } from "react-redux"; import { RootState, AppDispatch } from "@/redux/store"; import { getMessagesThunk } from "@/redux/thunks/getMessagesThunk"; // Gleiche Datenstruktur wie MeldungenView type Meldung = { t: string; // timestamp s: number; // status/priority c: string; // color m: string; // message i: string; // source/info v: string; // value/status text }; const Report: React.FC = () => { const dispatch = useDispatch(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [filteredMessages, setFilteredMessages] = useState([]); const { vonDatum, bisDatum, slotNumber } = useSelector( (state: RootState) => state.kabelueberwachungChartSlice ); // Nachrichten aus dem globalen Store const messages = useSelector((state: RootState) => state.messages.data); // Nachrichten für den aktuellen Slot filtern const filterMessagesForSlot = useCallback( (allMessages: Meldung[], slot: number) => { if (slot === null) return []; // Filter basierend auf der Quelle (i-Feld) return allMessages.filter((msg: Meldung) => { // Verschiedene mögliche Slot-Identifikationen const slotIdentifiers = [ `CableLine${slot + 1}`, `Slot${slot + 1}`, `KÜ${slot + 1}`, `Kue${slot + 1}`, `Cable${slot + 1}`, `Line${slot + 1}`, ]; return slotIdentifiers.some((identifier) => msg.i.includes(identifier)); }); }, [] ); // Daten laden const loadMessages = useCallback(async () => { if (slotNumber === null) return; setLoading(true); setError(null); try { // Redux Thunk verwenden (wie in MeldungenView) await dispatch( getMessagesThunk({ fromDate: vonDatum, toDate: bisDatum, }) ).unwrap(); } catch (err) { console.error("Fehler beim Laden der Berichte:", err); setError("Fehler beim Laden der Meldungen."); } finally { setLoading(false); } }, [dispatch, vonDatum, bisDatum, slotNumber]); // Filter anwenden wenn sich Nachrichten oder Slot ändern useEffect(() => { if (slotNumber !== null && messages.length > 0) { const filtered = filterMessagesForSlot(messages, slotNumber); setFilteredMessages(filtered); } else { setFilteredMessages([]); } }, [messages, slotNumber, filterMessagesForSlot]); // Automatisches Laden beim Mount und bei Änderungen useEffect(() => { if (slotNumber !== null) { loadMessages(); } }, [loadMessages, slotNumber]); if (loading) { return (
Lade Meldungen...
); } if (error) { return
{error}
; } return (

Meldungen für KÜ {slotNumber !== null ? slotNumber + 1 : "-"}

{filteredMessages.length === 0 ? (
Keine Meldungen im gewählten Zeitraum gefunden.
) : (
{filteredMessages.map((msg, index) => ( ))}
Prio Zeitstempel Quelle Meldung Status
{new Date(msg.t).toLocaleString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", second: "2-digit", })} {msg.i} {msg.m} {msg.v}
)}
{filteredMessages.length} Meldung(en) gefunden
); }; export default Report;