import { Link, Outlet, useLoaderData, useParams, useOutletContext, useLocation } from "@remix-run/react"; import { useState, useEffect } from "react"; import { useSocket } from "../context"; import { L33tADSPLC, L33tADSPLCImpl } from "l33t-lib"; import { loaderPLCs } from "../loaders"; type ContextType = { showCheck: boolean; toggleSelection: (id: string) => void; selectedIds: string[]; memoryDB: any; }; export const loader = loaderPLCs; export default function PLCs() { const socket = useSocket(); const { id } = useParams<{ id: string }>(); const [plcs, setPlcs] = useState>(useLoaderData()); const location = useLocation(); const showDetail = location.pathname.split('/').length > 2; const { toggleSelection, selectedIds } = useOutletContext(); const addPLC = async () => { try { if (!socket) { console.error("Socket connection not available"); return; } const newId = `plc_${Date.now()}`; // Create new PLC instance const newPLC = new L33tADSPLCImpl(); // Set default values newPLC.description = "New PLC"; newPLC.ip = ""; newPLC.driver = ""; newPLC.connected = false; newPLC.boundVariables = []; newPLC.values = {}; newPLC.timedLast = Date.now(); newPLC.timedPrevious = Date.now(); newPLC.timedTTL = 200; socket.emit("l33t_add_plc", newId, newPLC); } catch (error) { console.error("Error adding PLC:", error); } }; useEffect(() => { if (!socket) return; const handlePLCUpdate = (plcId: string, updatedPLC: L33tADSPLC | null) => { if (updatedPLC === null) { setPlcs(prevPlcs => { const newPlcs = { ...prevPlcs }; delete newPlcs[plcId]; return newPlcs; }); } else { setPlcs(prevPlcs => ({ ...prevPlcs, [plcId]: updatedPLC })); } }; const handleDeleteResult = (result: { success: boolean, error?: string }) => { if (!result.success) { console.error("Failed to delete PLC:", result.error); } }; socket.on("l33t_plc_update", handlePLCUpdate); socket.on("l33t_delete_plc_result", handleDeleteResult); return () => { socket.off("l33t_plc_update", handlePLCUpdate); socket.off("l33t_delete_plc_result", handleDeleteResult); }; }, [socket]); return (

PLCs

{Object.entries(plcs).map(([plcId, plcData]) => { if (!plcData) return null; return (

{plcId}

{plcData.connected ? "Connected" : "Disconnected"}
Exporting {Object.keys(plcData?.boundVariables || {}).length} variables
); })}
); }