import { LoaderFunctionArgs } from "@remix-run/node"; import { useNavigate, useLoaderData } from "@remix-run/react"; import { useState, useEffect } from "react"; import { useSocket } from "../context"; import { loaderAgentById } from "../loaders"; export const loader = loaderAgentById; export default function StreamDetections() { const navigate = useNavigate(); const socket = useSocket(); const selectedAgent = useLoaderData(); const [formData, setFormData] = useState(selectedAgent?.config || {}); // Initialize detections safely with a default empty array const [detections] = useState(selectedAgent?.lastMessage?.detections || []); useEffect(() => { setFormData(selectedAgent?.config || {}); }, [selectedAgent]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") navigate(".."); }; document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("keydown", handleKeyDown); }; }, [navigate]); if (!selectedAgent) { return
Loading...
; } const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData({ ...formData, [name]: parseFloat(value), }); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); socket?.emit("l33t_update_config", formData, selectedAgent.id); }; // Display empty state if no image or no detections if (!selectedAgent.lastMessage?.image) { return (

No image available yet

); } return (
{`Latest {detections && detections.length > 0 ? ( {detections.map((detection: any, index: number) => ( ))}
Label Confidence
{detection.class}
{(detection.confidence * 100).toFixed(2)}%
) : (

No detections available

)}
); }