"use client"; import { useEffect, useRef, useState } from "react"; import { ScrollText, X } from "lucide-react"; import { containers as containersApi, type Container } from "@/lib/api"; import { sanitizeLogText } from "@/lib/terminal-output"; interface ContainerLogsModalProps { container: Container; onClose: () => void; } export default function ContainerLogsModal({ container, onClose, }: ContainerLogsModalProps) { const [logs, setLogs] = useState("Loading..."); const [loading, setLoading] = useState(true); const viewportRef = useRef(null); useEffect(() => { containersApi .logs(container.id, 200) .then((response) => setLogs(sanitizeLogText(response.data?.logs || "(no output)")), ) .catch((err) => setLogs( sanitizeLogText( "Error: " + (err instanceof Error ? err.message : "Failed"), ), ), ) .finally(() => setLoading(false)); }, [container.id]); useEffect(() => { if (loading) return; const viewport = viewportRef.current; if (!viewport) return; const scrollFrame = window.requestAnimationFrame(() => { viewport.scrollTop = viewport.scrollHeight; }); return () => window.cancelAnimationFrame(scrollFrame); }, [logs, loading]); return (

Logs - {container.name}

{loading ? ( Loading... ) : ( logs )}
); }