35 lines
844 B
TypeScript
35 lines
844 B
TypeScript
import { useEffect, useState } from "react";
|
|
|
|
type Status = "idle" | "ok" | "error" | "disabled";
|
|
|
|
export function useBackendHealth() {
|
|
const [status, setStatus] = useState<Status>(() => {
|
|
return "idle";
|
|
});
|
|
|
|
useEffect(() => {
|
|
let destroyed = false;
|
|
const controller = new AbortController();
|
|
const check = async () => {
|
|
try {
|
|
const response = await fetch("/api/backend/health", { signal: controller.signal });
|
|
const payload = (await response.json().catch(() => null)) as { status?: Status } | null;
|
|
if (!destroyed) {
|
|
setStatus(payload?.status ?? "error");
|
|
}
|
|
} catch {
|
|
if (!destroyed) {
|
|
setStatus("error");
|
|
}
|
|
}
|
|
};
|
|
check();
|
|
return () => {
|
|
destroyed = true;
|
|
controller.abort();
|
|
};
|
|
}, []);
|
|
|
|
return status;
|
|
}
|