In diesem Code wird setTimeout verwendet, um die Funktion fetchData rekursiv nach 20 Sekunden erneut aufzurufen. Dies ersetzt setInterval und bietet eine bessere Kontrolle über das Timing und das Cleanup, um sicherzustellen, dass der Code sauber bleibt, wenn die Komponente unmounted wird
213 lines
7.5 KiB
JavaScript
213 lines
7.5 KiB
JavaScript
// /hooks/useLineData.js
|
|
import { useEffect, useState } from "react";
|
|
import { SERVER_URL } from "../config/urls";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
import { connectWebSocket, disconnectWebSocket } from "../redux/actions";
|
|
|
|
const useLineData = (webserviceGisLinesStatusUrl, setLineStatusData) => {
|
|
const dispatch = useDispatch();
|
|
const messages = useSelector((state) => state.messages);
|
|
const [lineColors, setLineColors] = useState({});
|
|
const [tooltipContents, setTooltipContents] = useState({});
|
|
|
|
useEffect(() => {
|
|
let isCancelled = false; // Flag to cancel ongoing operations if component unmounts
|
|
|
|
const fetchData = async () => {
|
|
try {
|
|
console.log("Fetching data...");
|
|
const response1 = await fetch(webserviceGisLinesStatusUrl);
|
|
const data1 = await response1.json();
|
|
|
|
const response2 = await fetch(`${SERVER_URL}:3000/api/talas_v5_DB/gisLines/readGisLines`);
|
|
const data2 = await response2.json();
|
|
|
|
const response3 = await fetch(`${SERVER_URL}:3000/api/talas_v5_DB/device/getAllStationsNames`);
|
|
const namesData = await response3.json();
|
|
|
|
if (!isCancelled) {
|
|
const colorsByModule = {};
|
|
const newTooltipContents = {};
|
|
const valueMap = {};
|
|
|
|
logGroupedData(data1.Statis);
|
|
|
|
const sortedStatis = [...data1.Statis].sort((a, b) => a.Level - b.Level);
|
|
|
|
const filteredStatis = [];
|
|
const seenKeys = new Set();
|
|
|
|
sortedStatis.forEach((statis) => {
|
|
const key = `${statis.IdLD}-${statis.Modul}`;
|
|
|
|
if (statis.Level > 0) {
|
|
if (!seenKeys.has(key)) {
|
|
seenKeys.add(key);
|
|
filteredStatis.push(statis);
|
|
}
|
|
} else {
|
|
filteredStatis.push(statis);
|
|
}
|
|
});
|
|
|
|
filteredStatis.forEach((statis) => {
|
|
const key = `${statis.IdLD}-${statis.Modul}`;
|
|
if (!valueMap[key]) {
|
|
valueMap[key] = {
|
|
messages: [],
|
|
messwert: undefined,
|
|
schleifenwert: undefined,
|
|
};
|
|
}
|
|
|
|
if (statis.DpName.endsWith("_Messwert") && statis.Value !== "True" && !valueMap[key].messwert) {
|
|
valueMap[key].messwert = statis.Value;
|
|
}
|
|
if (statis.DpName.endsWith("_Schleifenwert") && !valueMap[key].schleifenwert) {
|
|
valueMap[key].schleifenwert = statis.Value;
|
|
}
|
|
if (statis.Message && statis.Message !== "?") {
|
|
valueMap[key].messages.push(statis.Message);
|
|
}
|
|
});
|
|
|
|
filteredStatis.forEach((statis) => {
|
|
const key = `${statis.IdLD}-${statis.Modul}`;
|
|
const matchingLine = data2.find((item) => item.idLD === statis.IdLD && item.idModul === statis.Modul);
|
|
|
|
if (matchingLine) {
|
|
const prioColor = statis.PrioColor === "#ffffff" ? "green" : statis.PrioColor;
|
|
const values = valueMap[key];
|
|
|
|
if (!values) {
|
|
console.error(`Keine Werte gefunden für Key: ${key}`);
|
|
return;
|
|
}
|
|
|
|
const messageDisplay = values.messages.map((msg) => (msg ? `<span class="inline-block text-gray-800">${msg}</span><br>` : "")).join("");
|
|
const prioNameDisplay = statis.PrioName && statis.PrioName !== "?" ? `(${statis.PrioName})` : "";
|
|
|
|
colorsByModule[key] = prioColor;
|
|
|
|
newTooltipContents[key] = `
|
|
<div class="bg-white rounded-lg m-0 p-2 w-[210px]">
|
|
<span class="text-lg font-semibold text-gray-900">${statis.ModulName || "Unknown"}</span>
|
|
<br>
|
|
<span class="text-md font-bold text-gray-800">${statis.ModulTyp || "N/A"}</span>
|
|
<br>
|
|
<span class="text-md font-bold text-gray-800">Slot: ${statis.Modul || "N/A"}</span>
|
|
<br>
|
|
<span class="text-md font-bold text-gray-800">Station: ${namesData[matchingLine.idLD] || "N/A"}</span>
|
|
<br>
|
|
<div style="max-width: 100%; overflow-wrap: break-word; word-break: break-word; white-space: normal;">
|
|
<span class="inline-block w-2 h-2 rounded-full mr-2" style="background-color: ${prioColor || "#000000"};"></span>
|
|
${messageDisplay}
|
|
</div>
|
|
<span class="text-gray-800" style="color: ${prioColor || "#000000"};">${prioNameDisplay}</span>
|
|
<br>
|
|
${values.messwert ? `<span class="inline-block text-gray-800">Messwert: ${values.messwert}</span><br>` : ""}
|
|
${values.schleifenwert ? `<span class="inline-block text-gray-800">Schleifenwert: ${values.schleifenwert}</span>` : ""}
|
|
</div>
|
|
`;
|
|
}
|
|
});
|
|
|
|
setLineColors(colorsByModule);
|
|
setTooltipContents(newTooltipContents);
|
|
setLineStatusData(data1.Statis);
|
|
}
|
|
} catch (error) {
|
|
if (!isCancelled) {
|
|
console.error("Fehler beim Abrufen der Daten:", error);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Funktion für rekursiven Aufruf mit Timeout
|
|
const scheduleNextFetch = () => {
|
|
if (!isCancelled) {
|
|
setTimeout(async () => {
|
|
await fetchData();
|
|
scheduleNextFetch();
|
|
}, 20000);
|
|
}
|
|
};
|
|
|
|
// Starte den ersten Aufruf
|
|
fetchData();
|
|
scheduleNextFetch();
|
|
|
|
// Cleanup-Funktion, um sicherzustellen, dass keine weiteren Daten nach dem Unmount gesetzt werden
|
|
return () => {
|
|
isCancelled = true;
|
|
};
|
|
}, [webserviceGisLinesStatusUrl, setLineStatusData]);
|
|
|
|
return { lineColors, tooltipContents };
|
|
};
|
|
|
|
// Funktion zur Gruppierung der Daten
|
|
function logGroupedData(statisList) {
|
|
const grouped = statisList.reduce((acc, item) => {
|
|
const { IdLD, Modul, Level, PrioColor, PrioName, ModulName, ModulTyp, Message, DpName, Value } = item;
|
|
|
|
if (!acc[IdLD]) {
|
|
acc[IdLD] = {};
|
|
}
|
|
|
|
if (!acc[IdLD][Modul]) {
|
|
acc[IdLD][Modul] = {
|
|
ModulName: ModulName || "Unknown",
|
|
ModulTyp: ModulTyp || "N/A",
|
|
TotalLevel: Level,
|
|
PrioColors: new Set(),
|
|
PrioNames: new Set(),
|
|
Messages: [],
|
|
Messwert: undefined,
|
|
Schleifenwert: undefined,
|
|
};
|
|
}
|
|
|
|
acc[IdLD][Modul].PrioColors.add(PrioColor);
|
|
acc[IdLD][Modul].PrioNames.add(PrioName);
|
|
if (Message && Message !== "?") {
|
|
acc[IdLD][Modul].Messages.push(Message);
|
|
}
|
|
|
|
if (DpName.endsWith("_Messwert") && !acc[IdLD][Modul].Messwert) {
|
|
acc[IdLD][Modul].Messwert = Value;
|
|
}
|
|
|
|
if (DpName.endsWith("_Schleifenwert") && !acc[IdLD][Modul].Schleifenwert) {
|
|
acc[IdLD][Modul].Schleifenwert = Value;
|
|
}
|
|
|
|
return acc;
|
|
}, {});
|
|
|
|
const formattedData = {};
|
|
Object.entries(grouped).forEach(([stationId, modules]) => {
|
|
const filteredModules = Object.entries(modules)
|
|
.filter(([modulId, data]) => data.ModulName !== "?")
|
|
.map(([modulId, data]) => ({
|
|
Modul: modulId,
|
|
ModulName: data.ModulName,
|
|
ModulTyp: data.ModulTyp,
|
|
TotalLevel: data.TotalLevel,
|
|
PrioColors: Array.from(data.PrioColors).join(", "),
|
|
PrioNames: Array.from(data.PrioNames).join(", "),
|
|
Messages: data.Messages.join(" | "),
|
|
Messwert: data.Messwert,
|
|
Schleifenwert: data.Schleifenwert,
|
|
}));
|
|
|
|
if (filteredModules.length > 0) {
|
|
formattedData[stationId] = filteredModules;
|
|
}
|
|
});
|
|
|
|
//console.log("Aggregierte und gruppierte Daten (gefiltert):", formattedData);
|
|
}
|
|
|
|
export default useLineData;
|