import { useState } from "react"; import { Dialog, DialogBackdrop, DialogPanel, DialogTitle, } from "@headlessui/react"; import { IconAlertTriangleFilled, IconCircleArrowUpFilled, IconCircleCheckFilled, IconCube, IconHelpCircleFilled, IconStopwatch, IconX, } from "@tabler/icons-react"; import { WithTooltip } from "./Tooltip"; import type { Image } from "../types"; import { theme } from "../theme"; import { CodeBlock } from "./CodeBlock"; const clickable_registries = [ "registry-1.docker.io", "ghcr.io", "quay.io", "gcr.io", ]; // Not all registries redirect to an info page when visiting the image reference in a browser (e.g. Gitea and derivatives), so we only enable clicking those who do. export default function Image({ data }: { data: Image }) { const [open, setOpen] = useState(false); const handleOpen = () => { setOpen(true); }; const handleClose = () => { setOpen(false); }; const new_reference = data.result.info?.type == "version" ? data.reference.split(":")[0] + ":" + data.result.info.new_version : data.reference; var url: string | null = null; if (clickable_registries.includes(data.parts.registry)) { switch (data.parts.registry) { case "registry-1.docker.io": url = `https://hub.docker.com/r/${data.parts.repository}`; break; default: url = `https://${data.parts.registry}/${data.parts.repository}`; break; } } return ( <>
{url ? ( <> {data.reference} ) : ( data.reference )}
Checked in {data.time} ms
{data.result.error && (
{data.result.error}
)} {data.result.has_update && (
Pull command {new_reference}
)}
{data.result.info?.type == "digest" && ( <> {data.result.info.local_digests.length > 1 ? "Local digests" : "Local digest"} {data.result.info.local_digests.join("\n")} {data.result.info.remote_digest && (
Remote digest {data.result.info.remote_digest}
)} )}
); } function Icon({ data }: { data: Image }) { switch (data.result.has_update) { case null: return ( ); case false: return ( ); case true: if (data.result.info?.type === "version") { switch (data.result.info.version_update_type) { case "major": return ( ); case "minor": return ( ); case "patch": return ( ); } } else if (data.result.info?.type === "digest") { return ( ); } } } function DialogIcon({ data }: { data: Image }) { switch (data.result.has_update) { case null: return ( <> Unknown ); case false: return ( <> Up to date ); case true: if (data.result.info?.type === "version") { switch (data.result.info.version_update_type) { case "major": return ( <> Major update ); case "minor": return ( <> Minor update ); case "patch": return ( <> Patch update ); } } else if (data.result.info?.type === "digest") { return ( <> Update available ); } } }