"use client"; // /components/main/einausgaenge/modals/InputModal.tsx import React, { useEffect, useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { RootState } from "../../../../redux/store"; import { updateInvertierung, updateName, } from "../../../../redux/slices/digitalInputsSlice"; export default function InputModal({ selectedInput, closeInputModal, isOpen }) { const dispatch = useDispatch(); const reduxInput = useSelector((state: RootState) => state.digitalInputsSlice.inputs.find( (input) => input.id === Number(selectedInput?.id) ) ); const [isInitialLoad, setIsInitialLoad] = useState(true); const [name, setName] = useState(""); const [invertiert, setInvertiert] = useState(false); const [filterzeit, setFilterzeit] = useState(0); const [gewichtung, setGewichtung] = useState(0); const [zaehlerAktiv, setZaehlerAktiv] = useState(false); useEffect(() => { if (reduxInput && isInitialLoad) { setName(reduxInput.name || ""); setInvertiert(reduxInput.invertierung); setFilterzeit(reduxInput.filterzeit); setGewichtung(reduxInput.gewichtung); setZaehlerAktiv(reduxInput.zaehlerAktiv); setIsInitialLoad(false); } }, [reduxInput, isInitialLoad]); if (!isOpen || !selectedInput || !reduxInput) return null; 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 (name !== reduxInput.name) { await sendCgiUpdate(`DEN${id}=${encodeURIComponent(name)}`); dispatch(updateName({ id, name })); hasChange = true; } if (invertiert !== reduxInput.invertierung) { await sendCgiUpdate(`DEI${id}=${invertiert ? 1 : 0}`); dispatch(updateInvertierung({ id, invertierung: invertiert })); hasChange = true; } if (filterzeit !== reduxInput.filterzeit) { await sendCgiUpdate(`DEF${id}=${filterzeit}`); hasChange = true; } if (gewichtung !== reduxInput.gewichtung) { await sendCgiUpdate(`DEG${id}=${gewichtung}`); hasChange = true; } if (zaehlerAktiv !== reduxInput.zaehlerAktiv) { await sendCgiUpdate(`DEZ${id}=${zaehlerAktiv ? 1 : 0}`); hasChange = true; } if (!hasChange) { alert("⚠️ Keine Änderungen erkannt."); return; } alert("✅ Daten erfolgreich an die CPL-Hardware gesendet!"); } else { // ENTWICKLUNGSUMGEBUNG (lokale API) const updates: any = { id }; if (name !== reduxInput.name) { updates.name = name; dispatch(updateName({ id, name })); hasChange = true; } if (invertiert !== reduxInput.invertierung) { updates.invertierung = invertiert ? 1 : 0; dispatch(updateInvertierung({ id, invertierung: invertiert })); hasChange = true; } if (filterzeit !== reduxInput.filterzeit) { updates.filterzeit = filterzeit; hasChange = true; } if (gewichtung !== reduxInput.gewichtung) { updates.gewichtung = gewichtung; 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/updateDigitaleEingaenge", { 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: any) { alert("❌ Fehler beim Speichern: " + err.message); } }; const handleClose = () => { setIsInitialLoad(true); closeInputModal(); }; return (

Parameter fĂĽr Eingang {selectedInput.id}

Zustand:
{reduxInput.status ? ( <> â—Ź Aus ) : ( <> â—Ź Ein )}
Name:
setName(e.target.value)} className="border border-gray-300 rounded px-2 py-1 w-full" maxLength={32} />
Invertierung:
{invertiert ? "Ein" : "Aus"}
Zählerstand:
{reduxInput.counter}
Filterzeit:
{ const val = Number(e.target.value); if (val <= 2000) { setFilterzeit(val); } }} className="border border-gray-300 rounded px-2 py-1 pr-10 w-full" title="Maximal 2000 ms erlaubt" /> ms
Gewichtung:
{ const val = Number(e.target.value); if (val <= 1000) { setGewichtung(val); } }} className="border border-gray-300 rounded px-2 py-1 w-full" title="Maximal 1000 erlaubt" />
Zähler aktiv:
{zaehlerAktiv ? "Ja" : "Nein"}
OOS: Out of Service
{reduxInput.eingangOffline ? "aus" : "ein"}
); }