import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { ArrowUpRight, Info, RefreshCw } from "lucide-react";
import { type ReactNode } from "react";
import { useTranslation } from "react-i18next";
import { Button } from "@/components/ui/button";
import { Spinner } from "@/components/ui/spinner";
import { checkForUpdates, getVersionInfo } from "@/entities/system/system-api";
import { cn } from "@/shared/lib/cn";
import { formatDateTime } from "@/shared/lib/format";
const versionQueryKey = ["system-version"] as const;
function useVersionInfo() {
return useQuery({
queryKey: versionQueryKey,
queryFn: getVersionInfo,
staleTime: 60_000,
retry: 1,
});
}
function useCheckForUpdates() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: checkForUpdates,
onSuccess: (value) => queryClient.setQueryData(versionQueryKey, value),
});
}
export function CurrentVersionLabel() {
const versionQuery = useVersionInfo();
const version = versionQuery.data?.currentVersion;
if (!version) return null;
return {version};
}
export function VersionUpdateBanner() {
const { t } = useTranslation();
const versionQuery = useVersionInfo();
const checkMutation = useCheckForUpdates();
const version = versionQuery.data;
if (!version?.updateAvailable) return null;
return (
{t("updates.available", { version: version.latestVersion })} {t("updates.currentSummary", { version: version.currentVersion })}
{t("updates.noteTitle")}
{t("updates.noteDescription")}
{error}
: null}{t("updates.releaseNotesHelp")}
{version.releaseNotes || t("updates.noReleaseNotes")}
{label}
{description}