import { useParams, useNavigate, useOutletContext, Link, useLoaderData } from "@remix-run/react"; import { useState, useEffect } from "react"; import { useSocket } from "../context"; import { loaderAgentById } from "../loaders"; // l33t loader export const loader = loaderAgentById export default function StreamDetail() { const navigate = useNavigate(); const socket = useSocket(); const [selectedAgent, setSelectedAgent] = useState(useLoaderData()); const [formData, setFormData] = useState(selectedAgent?.config ? selectedAgent.config : {}); const { id } = useParams<{ id: string }>(); // useEffect(() => { // setFormData(selectedAgent?.config ? 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 null; // or a loading state if preferred 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, id); }; return (
); } interface InputWithSliderProps { label: string; name: keyof FormData; value: number; onChange: (event: React.ChangeEvent) => void; min: number; max: number; step?: number; } interface FormData { zoom: number; rotation_angle: number; crop_x: number; crop_y: number; crop_width: number; crop_height: number; } const InputWithSlider: React.FC = ({ label, name, value, onChange, min, max, step = 1 }) => (
);