Files
homelab-optimized/dashboard/ui/components/container-logs-modal.tsx
Gitea Mirror Bot 57b1fe47f2
Some checks failed
Documentation / Deploy to GitHub Pages (push) Has been cancelled
Documentation / Build Docusaurus (push) Has been cancelled
Sanitized mirror from private repository - 2026-04-19 08:15:48 UTC
2026-04-19 08:15:48 +00:00

64 lines
1.7 KiB
TypeScript

"use client";
import { useState, useEffect } from "react";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import { ScrollArea } from "@/components/ui/scroll-area";
import { fetchAPI } from "@/lib/api";
interface ContainerLogsModalProps {
containerId: string | null;
containerName: string;
endpoint: string;
onClose: () => void;
}
export function ContainerLogsModal({
containerId,
containerName,
endpoint,
onClose,
}: ContainerLogsModalProps) {
const [logs, setLogs] = useState<string>("");
const [loading, setLoading] = useState(false);
useEffect(() => {
if (!containerId) return;
setLoading(true);
setLogs("");
fetchAPI<{ logs: string }>(
`/api/containers/${containerId}/logs?endpoint=${endpoint}&tail=200`
)
.then((data) => setLogs(data.logs))
.catch((err) => setLogs(`Error fetching logs: ${err.message}`))
.finally(() => setLoading(false));
}, [containerId, endpoint]);
return (
<Dialog open={!!containerId} onOpenChange={() => onClose()}>
<DialogContent className="max-w-3xl">
<DialogHeader>
<DialogTitle className="text-sm">
Logs: {containerName}
</DialogTitle>
</DialogHeader>
<ScrollArea className="h-[400px] mt-2">
{loading ? (
<p className="text-xs text-muted-foreground p-4">
Loading logs...
</p>
) : (
<pre className="text-[11px] font-mono text-foreground whitespace-pre-wrap p-2 leading-relaxed">
{logs || "No logs available"}
</pre>
)}
</ScrollArea>
</DialogContent>
</Dialog>
);
}