// components/modales/kueModal/handlers/handleSave.ts import { setKueData } from "../../../../../redux/slices/kueDataSlice"; export interface OriginalValues { kueID: string[]; isolationsgrenzwerte: number[]; verzoegerung: number[]; untereSchleifenGrenzwerte: number[]; obereSchleifenGrenzwerte: number[]; schleifenintervall: number[]; } interface HandleSaveParams { ids: string[]; isolationsgrenzwerte: number[]; verzoegerung: number[]; untereSchleifenGrenzwerte: number[]; obereSchleifenGrenzwerte: number[]; schleifenintervall: number[]; originalValues: OriginalValues; slot: number; dispatch: (action: any) => void; onModulNameChange: (id: string) => void; onClose: () => void; } // Vergleich: robust für Zahlen und Strings const isDifferent = (a: any, b: any): boolean => { const aNum = Number(a); const bNum = Number(b); if (!isNaN(aNum) && !isNaN(bNum)) { return Math.abs(aNum - bNum) > 0.0001; } return String(a).trim() !== String(b).trim(); }; const handleSave = async ({ ids, isolationsgrenzwerte, verzoegerung, untereSchleifenGrenzwerte, obereSchleifenGrenzwerte, schleifenintervall, originalValues, slot, dispatch, onModulNameChange, onClose, }: HandleSaveParams): Promise => { const changesForFile: Record = {}; if (isDifferent(ids[slot], originalValues.kueID[slot])) { changesForFile.KID = ids[slot]; } if ( isDifferent( isolationsgrenzwerte[slot], originalValues.isolationsgrenzwerte[slot] ) ) { changesForFile.KL_ = isolationsgrenzwerte[slot]; } if (isDifferent(verzoegerung[slot], originalValues.verzoegerung[slot])) { changesForFile.KD_ = verzoegerung[slot]; } if ( isDifferent( untereSchleifenGrenzwerte[slot], originalValues.untereSchleifenGrenzwerte[slot] ) ) { changesForFile.KR_ = untereSchleifenGrenzwerte[slot]; } if ( isDifferent( obereSchleifenGrenzwerte[slot], originalValues.obereSchleifenGrenzwerte[slot] ) ) { changesForFile.KRO_ = obereSchleifenGrenzwerte[slot]; } if ( isDifferent( schleifenintervall[slot], originalValues.schleifenintervall[slot] ) ) { changesForFile.KRI = schleifenintervall[slot]; } if (Object.keys(changesForFile).length > 0) { const isDev = window.location.hostname === "localhost"; const isProd = !isDev; if (isDev) { // Entwicklung: interne Next.js API for (const [key, value] of Object.entries(changesForFile)) { const params = new URLSearchParams({ key: `win_kue${key}`, value: String(value), slot: String(slot), }); const response = await fetch( `/api/cpl/updateKueDataAPIHandler?${params.toString()}` ); if (!response.ok) { alert(`❌ Fehler beim Schreiben der Datei (${key})`); return; } } alert("✅ Daten erfolgreich gespeichert!"); } if (isProd) { // Produktion: echte CPL-Hardware CGI-Aufruf const cgiParams = Object.entries(changesForFile) .map(([key, value]) => `${key}${slot}=${encodeURIComponent(value)}`) .join(";"); const url = `/CPL?KUEdetail.ACP&${cgiParams}`; console.log("📡 Sende an CPL (CGI) →", url); try { const response = await fetch(url); if (!response.ok) { alert("❌ Fehler beim Senden an die CPL-Hardware"); return; } alert("✅ Daten erfolgreich an die CPL-Hardware gesendet!"); } catch (error) { console.error("❌ Netzwerkfehler beim CPL-Aufruf:", error); alert("❌ Netzwerkfehler beim Senden an die CPL-Hardware"); return; } } // Redux und UI aktualisieren onModulNameChange(ids[slot]); dispatch( setKueData({ kueID: [...ids], isolationsgrenzwerte: [...isolationsgrenzwerte], verzoegerung: [...verzoegerung], untereSchleifenGrenzwerte: [...untereSchleifenGrenzwerte], obereSchleifenGrenzwerte: [...obereSchleifenGrenzwerte], schleifenintervall: [...schleifenintervall], }) ); } else { alert("ℹ️ Keine Änderungen vorgenommen."); } onClose(); }; export default handleSave;