"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} - -
); }