import { useNavigate, Link, Outlet, useLoaderData, useParams, useLocation } from "@remix-run/react"; import { useEffect, useState } from "react"; import TimedStatus from "../components/TimedStatus"; import { useSocket } from "../context"; import { loaderAgentById } from "../loaders"; import type { L33tAgent } from "l33t-lib"; export const loader = loaderAgentById; export default function StreamDetail() { const navigate = useNavigate(); const location = useLocation(); const { id } = useParams<{ id: string }>(); const initialAgent = useLoaderData(); const [agent, setAgent] = useState(initialAgent); const socket = useSocket(); // Update agent state when route changes useEffect(() => { setAgent(initialAgent); }, [initialAgent]); // Socket update handler useEffect(() => { if (!socket) return; const handleL33tUpdate = (agentId: string, updatedAgent: L33tAgent) => { if (agentId === id) { console.log("Updating agent:", agentId, updatedAgent); setAgent(updatedAgent); } }; socket.on("l33t_update", handleL33tUpdate); // Cleanup socket listener return () => { socket.off("l33t_update", handleL33tUpdate); }; }, [socket, id]); // Escape key handler useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { navigate(".."); } }; document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("keydown", handleKeyDown); }; }, [navigate]); if (!agent) { return
Loading...
; } return (

{id}

  • Detections
  • Areas
  • Image
); }