diff --git a/src/app/_components/docker-table.tsx b/src/app/_components/docker-table.tsx
index da8f579..3de4e03 100644
--- a/src/app/_components/docker-table.tsx
+++ b/src/app/_components/docker-table.tsx
@@ -4,90 +4,103 @@ import type { dockerRouterType } from "@/server/api/routers/docker";
import { api } from "@/trpc/react";
import type { JSX } from "react";
-function DockerRow({
+function DockerCard({
containerInfo,
}: {
containerInfo: dockerRouterType["list"][number];
}) {
- const { data: latest, isError, isLoading } = api.docker.latest.useQuery({ id: containerInfo.container.id }, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false });
- const outdated = containerInfo.image.current.hash !== latest?.latest.hash;
+ const { data: latest, isError, isLoading, error } = api.docker.latest.useQuery({ id: containerInfo.container.id }, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false });
let latestFragment: JSX.Element | null = null;
if (isError) {
latestFragment = (
- <>
-
{"Error"} |
- {"Error"} |
- >
+
+
Tag
+ Error: {error.message}
+
+ Short Hash
+ Error: {error.message}
+
);
} else if (isLoading) {
latestFragment = (
- <>
-
-
- |
-
-
- |
- >
+
+
Tag
+
+
+ Short Hash
+
+
);
} else if (latest) {
latestFragment = (
- <>
- {latest?.latest.tag} |
- {latest?.latest.hash} |
- >
+
+
Tag
+ {latest?.latest.tag ?? "Unknown"}
+
+ Short Hash
+ {latest?.latest.hash ?? "Unknown"}
+
);
}
+ const outdated = containerInfo.image.current.hash !== latest?.latest.hash;
+ const showWarning = isLoading || (!isError && !isLoading && (!latest?.latest.tag || !latest?.latest.hash));
+
return (
-
- | {containerInfo.container.name} |
- {containerInfo.image.name} |
- {containerInfo.image.current.tag} |
- {containerInfo.image.current.hash} |
- {latestFragment}
-
+
+
+ {containerInfo.container.name}
+ {containerInfo.image.name}
+
+ Current
+
+
- Tag
+ - {containerInfo.image.current.tag}
+ - Short Hash
+ - {containerInfo.image.current.hash}
+
+
+ Latest
+ {latestFragment}
+
+
);
}
export function DockerTable() {
- const { data: list, isLoading: listLoading } = api.docker.list.useQuery(undefined, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false });
+ const { data: list, isLoading: listLoading, error } = api.docker.list.useQuery(undefined, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false });
+
return (
-
- {!listLoading ? (
-
-
-
- | Name |
- Image |
- Tag |
- Short Hash |
- Tag |
- Short Hash |
-
-
-
- {list
- ? list
- .sort((ca, cb) => {
- if (ca.container.name && cb.container.name) {
- if (ca.container.name < cb.container.name) {
- return -1;
- }
- if (ca.container.name > cb.container.name) {
- return 1;
- }
- }
- return 0;
- })
- .map((containerInfo) => )
- : null}
-
-
+ <>
+ {listLoading ? (
+ <>Loading docker container list...>
) : (
- <>Loading data...>
+ <>
+
+ {list ? (
+ list
+ .sort((ca, cb) => {
+ if (ca.container.name && cb.container.name) {
+ if (ca.container.name < cb.container.name) {
+ return -1;
+ }
+ if (ca.container.name > cb.container.name) {
+ return 1;
+ }
+ }
+ return 0;
+ })
+ .map((containerInfo) => )
+ ) : (
+ <>Error loading docker container list: {error?.message}>
+ )}
+
+ >
)}
-
+ >
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index d5a5c9e..69de2b4 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -5,10 +5,8 @@ export default async function Home() {
void api.docker.list.prefetch();
return (
-
-
-
-
+
+
);
}
diff --git a/src/server/api/routers/docker.ts b/src/server/api/routers/docker.ts
index 55fa5ff..498d2ca 100644
--- a/src/server/api/routers/docker.ts
+++ b/src/server/api/routers/docker.ts
@@ -188,6 +188,7 @@ async function getLatest(image: string, tag?: string): Promise<{ hash: string; t
return {
hash,
+ tag,
};
}
diff --git a/src/styles/globals.css b/src/styles/globals.css
index 7689669..acb7040 100644
--- a/src/styles/globals.css
+++ b/src/styles/globals.css
@@ -6,4 +6,4 @@
@theme {
--font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-}
+}
\ No newline at end of file