"use client";
import LoadingSpinner from "@/components/ui/spinner";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { useClientConfig } from "@/lib/clientConfig";
import { useTranslation } from "@/lib/i18n/client";
import { api } from "@/lib/trpc";
import { keepPreviousData, useQuery } from "@tanstack/react-query";
const REPO_LATEST_RELEASE_API =
"https://api.github.com/repos/hoarder-app/hoarder/releases/latest";
const REPO_RELEASE_PAGE = "https://github.com/hoarder-app/hoarder/releases";
function useLatestRelease() {
const { data } = useQuery({
queryKey: ["latest-release"],
queryFn: async () => {
const res = await fetch(REPO_LATEST_RELEASE_API);
if (!res.ok) {
return undefined;
}
const data = (await res.json()) as { name: string };
return data.name;
},
staleTime: 60 * 60 * 1000,
enabled: !useClientConfig().disableNewReleaseCheck,
});
return data;
}
function ReleaseInfo() {
const currentRelease = useClientConfig().serverVersion ?? "NA";
const latestRelease = useLatestRelease();
let newRelease;
if (latestRelease && currentRelease != latestRelease) {
newRelease = (
({latestRelease} ⬆️)
);
}
return (
{currentRelease}
{newRelease}
);
}
export default function ServerStats() {
const { t } = useTranslation();
const { data: serverStats } = api.admin.stats.useQuery(undefined, {
refetchInterval: 1000,
placeholderData: keepPreviousData,
});
if (!serverStats) {
return ;
}
return (
{t("admin.server_stats.server_stats")}
{t("admin.server_stats.total_users")}
{serverStats.numUsers}
{t("admin.server_stats.total_bookmarks")}
{serverStats.numBookmarks}
{t("admin.server_stats.server_version")}
{t("admin.background_jobs.background_jobs")}
{t("admin.background_jobs.job")}
{t("admin.background_jobs.queued")}
{t("admin.background_jobs.pending")}
{t("admin.background_jobs.failed")}
{t("admin.background_jobs.crawler_jobs")}
{serverStats.crawlStats.queued}
{serverStats.crawlStats.pending}
{serverStats.crawlStats.failed}
{t("admin.background_jobs.indexing_jobs")}
{serverStats.indexingStats.queued}
-
-
{t("admin.background_jobs.inference_jobs")}
{serverStats.inferenceStats.queued}
{serverStats.inferenceStats.pending}
{serverStats.inferenceStats.failed}
{t("admin.background_jobs.tidy_assets_jobs")}
{serverStats.tidyAssetsStats.queued}
-
-
{t("admin.background_jobs.video_jobs")}
{serverStats.videoStats.queued}
-
-
{t("admin.background_jobs.webhook_jobs")}
{serverStats.webhookStats.queued}
-
-
{t("admin.background_jobs.asset_preprocessing_jobs")}
{serverStats.assetPreprocessingStats.queued}
-
-
{t("admin.background_jobs.feed_jobs")}
{serverStats.feedStats.queued}
-
-
);
}