redesign ping & docker status
This commit is contained in:
parent
a1b03ea762
commit
ac03795fe6
@ -47,7 +47,13 @@
|
|||||||
"tx": "TX",
|
"tx": "TX",
|
||||||
"mem": "MEM",
|
"mem": "MEM",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"offline": "Offline"
|
"offline": "Offline",
|
||||||
|
"error": "Error",
|
||||||
|
"unknown": "Unknown"
|
||||||
|
},
|
||||||
|
"ping": {
|
||||||
|
"error": "Error",
|
||||||
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "Playing",
|
"playing": "Playing",
|
||||||
|
|||||||
@ -65,7 +65,7 @@ export default function Item({ service }) {
|
|||||||
<div
|
<div
|
||||||
className={`${
|
className={`${
|
||||||
hasLink ? "cursor-pointer " : " "
|
hasLink ? "cursor-pointer " : " "
|
||||||
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10`}
|
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative`}
|
||||||
>
|
>
|
||||||
<div className="flex select-none">
|
<div className="flex select-none">
|
||||||
{service.icon &&
|
{service.icon &&
|
||||||
@ -103,23 +103,25 @@ export default function Item({ service }) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{service.ping && (
|
<div className="absolute top-0 right-0 w-1/2 flex flex-row justify-end gap-2 mr-2">
|
||||||
<div className="flex-shrink-0 flex items-center justify-center w-5 mr-4 cursor-pointer">
|
{service.container && (
|
||||||
<Ping service={service} />
|
<button
|
||||||
<span className="sr-only">Ping status</span>
|
type="button"
|
||||||
</div>
|
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
|
||||||
)}
|
className="flex-shrink-0 flex items-center justify-center cursor-pointer"
|
||||||
|
>
|
||||||
{service.container && (
|
<Status service={service} />
|
||||||
<button
|
<span className="sr-only">View container stats</span>
|
||||||
type="button"
|
</button>
|
||||||
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
|
)}
|
||||||
className="flex-shrink-0 flex items-center justify-center w-5 mr-4 cursor-pointer"
|
|
||||||
>
|
{service.ping && (
|
||||||
<Status service={service} />
|
<div className="flex-shrink-0 flex items-center justify-center cursor-pointer">
|
||||||
<span className="sr-only">View container stats</span>
|
<Ping service={service} />
|
||||||
</button>
|
<span className="sr-only">Ping status</span>
|
||||||
)}
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{service.container && service.server && (
|
{service.container && service.server && (
|
||||||
|
|||||||
@ -1,33 +1,42 @@
|
|||||||
import { BsArrowDownCircle, BsArrowUpCircle } from "react-icons/bs";
|
import { useTranslation } from "react-i18next";
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
|
|
||||||
export default function Ping({ service }) {
|
export default function Ping({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ping: service.ping}).toString()}`, {
|
const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ping: service.ping}).toString()}`, {
|
||||||
refreshInterval: 5000
|
refreshInterval: 5000
|
||||||
});
|
});
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return <div className="w-3 h-3 text-xs text-rose-300 dark:text-rose-500" title={data.status}>↓</div>;
|
return (
|
||||||
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden">
|
||||||
|
<div className="text-[8px] font-bold text-rose-500 uppercase">{t("ping.error")}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return <div className="w-3 h-3 text-[10px] text-black/20 dark:text-white/40">PING</div>;
|
return (
|
||||||
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden">
|
||||||
|
<div className="text-[8px] font-bold text-black/20 dark:text-white/40 uppercase">{t("ping.ping")}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const statusText = `${service.ping}: HTTP status ${data.status}`;
|
const statusText = `${service.ping}: HTTP status ${data.status}`;
|
||||||
|
|
||||||
if (data && data.status !== 200) {
|
if (data && data.status !== 200) {
|
||||||
return (
|
return (
|
||||||
<div className="w-3 h-3 text-xs text-rose-300 dark:text-rose-500" title={statusText}>
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}>
|
||||||
<BsArrowDownCircle />
|
<div className="text-[8px] font-bold text-rose-500/80">{data.status}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data && data.status === 200) {
|
if (data && data.status === 200) {
|
||||||
return (
|
return (
|
||||||
<div className="w-3 h-3 text-xs text-emerald-300 dark:text-emerald-500" title={statusText}>
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}>
|
||||||
<BsArrowUpCircle />
|
<div className="text-[8px] font-bold text-emerald-500/80">{data.status}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,19 +1,36 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
|
|
||||||
export default function Status({ service }) {
|
export default function Status({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { data, error } = useSWR(`/api/docker/status/${service.container}/${service.server || ""}`);
|
const { data, error } = useSWR(`/api/docker/status/${service.container}/${service.server || ""}`);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return <div className="w-3 h-3 bg-rose-300 dark:bg-rose-500 rounded-full" />;
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
|
||||||
|
<div className="text-[8px] font-bold text-rose-500/80 uppercase">{t("docker.error")}</div>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data && data.status === "running") {
|
if (data && data.status === "running") {
|
||||||
return <div className="w-3 h-3 bg-emerald-300 dark:bg-emerald-500 rounded-full" />;
|
return (
|
||||||
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
|
||||||
|
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.status}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data && data.status === "not found") {
|
if (data && (data.status === "not found" || data.status === "exited")) {
|
||||||
return <div className="h-2.5 w-2.5 bg-orange-400/50 dark:bg-yellow-200/40 -rotate-45" />;
|
return (
|
||||||
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
|
||||||
|
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{data.status}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <div className="w-3 h-3 bg-black/20 dark:bg-white/40 rounded-full" />;
|
return (
|
||||||
|
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden">
|
||||||
|
<div className="text-[8px] font-bold text-black/20 dark:text-white/40 uppercase">{t("docker.unknown")}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import { servicesFromConfig } from "utils/config/service-helpers";
|
|
||||||
import createLogger from "utils/logger";
|
import createLogger from "utils/logger";
|
||||||
import { httpProxy } from "utils/proxy/http";
|
import { httpProxy } from "utils/proxy/http";
|
||||||
|
|
||||||
@ -17,6 +16,6 @@ export default async function handler(req, res) {
|
|||||||
const [status] = await httpProxy(pingURL);
|
const [status] = await httpProxy(pingURL);
|
||||||
|
|
||||||
return res.status(200).json({
|
return res.status(200).json({
|
||||||
status: status,
|
status,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user