"use client"; // /components/main/digitalInputs/InputModal.tsx import React, { useEffect, useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { RootState } from "@/redux/store"; import { updateInvert, updateLabel } from "@/redux/slices/digitalInputsSlice"; type InputModalProps = { selectedInput: { id: number; [key: string]: unknown; } | null; closeInputModal: () => void; isOpen: boolean; }; export default function InputModal({ selectedInput, closeInputModal, isOpen, }: InputModalProps) { const dispatch = useDispatch(); const reduxInput = useSelector((state: RootState) => state.digitalInputsSlice.inputs.find( (input) => input.id === Number(selectedInput?.id) ) ); /* console.log("📦 selectedInput.id:", selectedInput?.id); console.log("📦 reduxInput:", reduxInput); */ const [isInitialLoad, setIsInitialLoad] = useState(true); const [label, setLabel] = useState(""); const [invertiert, setInvertiert] = useState(false); const [timeFilter, setTimeFilter] = useState(0); const [weighting, setWeighting] = useState(0); const [zaehlerAktiv, setZaehlerAktiv] = useState(false); const [eingangOffline, setEingangOffline] = useState(0); useEffect(() => { if (reduxInput && isInitialLoad) { //reduxInput //console.log("📦 reduxInput geladen:", reduxInput); setLabel(reduxInput.label || ""); setInvertiert(reduxInput.invert); setTimeFilter(reduxInput.timeFilter); setWeighting(reduxInput.weighting); setZaehlerAktiv(reduxInput.zaehlerAktiv); setEingangOffline(reduxInput.eingangOffline ? 1 : 0); setIsInitialLoad(false); } }, [reduxInput, isInitialLoad]); useEffect(() => { if (isOpen && selectedInput) { setIsInitialLoad(true); } }, [isOpen, selectedInput]); useEffect(() => { if (isOpen && selectedInput) { setIsInitialLoad(true); } }, [isOpen, selectedInput]); if (!isOpen || !selectedInput || !reduxInput) return null; const handleClose = () => { closeInputModal(); }; const sendCgiUpdate = async (param: string) => { const url = `/CPL?/eingaenge.html&${param}`; //console.log("📡 CGI senden:", url); const response = await fetch(url); if (!response.ok) { throw new Error(`Fehler bei CGI-Aufruf: ${param}`); } }; const handleSpeichern = async () => { const id = reduxInput.id; let hasChange = false; try { // PRODUKTIONSUMGEBUNG (CGI-Modus) if (process.env.NEXT_PUBLIC_NODE_ENV === "production") { if (label !== reduxInput.label) { await sendCgiUpdate(`DEN${id}=${encodeURIComponent(label)}`); dispatch(updateLabel({ id, label })); hasChange = true; } if (invertiert !== reduxInput.invert) { await sendCgiUpdate(`DEI${id}=${invertiert ? 1 : 0}`); dispatch(updateInvert({ id, invert: invertiert })); hasChange = true; } if (timeFilter !== reduxInput.timeFilter) { await sendCgiUpdate(`DEF${id}=${timeFilter}`); hasChange = true; } if (weighting !== reduxInput.weighting) { await sendCgiUpdate(`DEG${id}=${weighting}`); hasChange = true; } if (zaehlerAktiv !== reduxInput.zaehlerAktiv) { await sendCgiUpdate(`DEZ${id}=${zaehlerAktiv ? 1 : 0}`); hasChange = true; } if (eingangOffline !== (reduxInput.eingangOffline ? 1 : 0)) { await sendCgiUpdate(`DEO${id}=${eingangOffline ? 1 : 0}`); hasChange = true; } if (!hasChange) { alert("⚠️ Keine Änderungen erkannt."); return; } alert("✅ Daten erfolgreich an die CPL-Hardware gesendet!"); } else { // ENTWICKLUNGSUMGEBUNG (lokale API) type Updates = { id: number; label?: string; invert?: number; timeFilter?: number; weighting?: number; zaehlerAktiv?: number; }; const updates: Updates = { id }; if (label !== reduxInput.label) { updates.label = label; dispatch(updateLabel({ id, label })); hasChange = true; } if (invertiert !== reduxInput.invert) { updates.invert = invertiert ? 1 : 0; dispatch(updateInvert({ id, invert: invertiert })); hasChange = true; } if (timeFilter !== reduxInput.timeFilter) { updates.timeFilter = timeFilter; hasChange = true; } if (weighting !== reduxInput.weighting) { updates.weighting = weighting; hasChange = true; } if (zaehlerAktiv !== reduxInput.zaehlerAktiv) { updates.zaehlerAktiv = zaehlerAktiv ? 1 : 0; hasChange = true; } if (!hasChange) { alert("⚠️ Keine Änderungen erkannt."); return; } const res = await fetch("/api/cpl/updateDigitalInputs", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(updates), }); if (!res.ok) { const errData = await res.json(); throw new Error(errData.error || "Unbekannter Fehler"); } alert("✅ Daten lokal gespeichert!"); } setIsInitialLoad(true); closeInputModal(); } catch (err: unknown) { if (err instanceof Error) { alert("❌ Fehler beim Speichern: " + err.message); } else { alert("❌ Fehler beim Speichern: Unbekannter Fehler"); } } }; return (

Einstellungen Meldungseingang {selectedInput.id}

Bezeichnung:
setLabel(e.target.value)} className="border border-base rounded px-2 py-1 w-full bg-[var(--color-surface-alt)] text-fg" maxLength={32} />
Invertierung:
{invertiert ? "Ein" : "Aus"}
Filterzeit:
{ const val = Number(e.target.value); if (val <= 2000) { setTimeFilter(val); } }} className="border border-base rounded px-2 py-1 pr-10 w-full text-right bg-[var(--color-surface-alt)] text-fg" title="Maximal 2000 ms erlaubt" /> ms
Gewichtung:
{ const val = Number(e.target.value); if (val <= 1000) { setWeighting(val); } }} className="border border-base rounded px-2 py-1 w-full text-right bg-[var(--color-surface-alt)] text-fg" title="Maximal 1000 erlaubt" />
Out of Service:
{eingangOffline ? "Ein" : "Aus"}
); }