import { useQuery } from "@tanstack/react-query";
import {
AlertTriangle,
ArrowLeft,
CheckCircle,
Container,
ExternalLink,
RefreshCw,
Server,
} from "lucide-react";
import { Link, useParams } from "react-router-dom";
import api, { formatRelativeTime } from "../../utils/api";
const ContainerDetail = () => {
const { id } = useParams();
const { data, isLoading, error } = useQuery({
queryKey: ["docker", "container", id],
queryFn: async () => {
const response = await api.get(`/docker/containers/${id}`);
return response.data;
},
refetchInterval: 30000,
});
const container = data?.container;
const similarContainers = data?.similarContainers || [];
if (isLoading) {
return (
);
}
if (error || !container) {
return (
Container not found
The container you're looking for doesn't exist or has been
removed.
Back to Docker
);
}
const getStatusBadge = (status) => {
const statusClasses = {
running:
"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",
exited: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200",
paused:
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",
restarting:
"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200",
};
return (
{status}
);
};
return (
{/* Header */}
Back to Docker
{container.name}
{getStatusBadge(container.status)}
Container ID: {container.container_id.substring(0, 12)}
{/* Overview Cards */}
{/* Update Status Card */}
{container.docker_images?.docker_image_updates &&
container.docker_images.docker_image_updates.length > 0 ? (
Update Available
{
container.docker_images.docker_image_updates[0]
.available_tag
}
) : (
)}
Host
{container.host?.friendly_name || container.host?.hostname}
State
{container.state || container.status}
Last Checked
{formatRelativeTime(container.last_checked)}
{/* Container and Image Information - Side by Side */}
{/* Container Details */}
Container Information
Container ID
{container.container_id}
Image Tag
{container.image_tag}
Created
{formatRelativeTime(container.created_at)}
{container.started_at && (
Started
{formatRelativeTime(container.started_at)}
)}
{container.ports && Object.keys(container.ports).length > 0 && (
Port Mappings
{Object.entries(container.ports).map(([key, value]) => (
{key} → {value}
))}
)}
{/* Image Information */}
{container.docker_images && (
Image Information
Repository
{container.docker_images.repository}
Tag
{container.docker_images.tag}
Source
{container.docker_images.source}
{container.docker_images.size_bytes && (
Size
{(
Number(container.docker_images.size_bytes) /
1024 /
1024
).toFixed(2)}{" "}
MB
)}
Image ID
{container.docker_images.image_id?.substring(0, 12)}...
Created
{formatRelativeTime(container.docker_images.created_at)}
)}
{/* Similar Containers */}
{similarContainers.length > 0 && (
Similar Containers (Same Image)
{similarContainers.map((similar) => (
-
{similar.name}
{similar.status}
))}
)}
);
};
export default ContainerDetail;