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

{version.releaseUrl ? ( ) : null} {version.releaseUrl ? : null}
); } export function VersionUpdateSection() { const { t, i18n } = useTranslation(); const versionQuery = useVersionInfo(); const checkMutation = useCheckForUpdates(); const version = versionQuery.data; const requestError = versionQuery.error instanceof Error ? versionQuery.error.message : ""; const checkError = checkMutation.error instanceof Error ? checkMutation.error.message : ""; const error = version?.error || checkError || requestError; return (

{t("updates.title")}

{t("updates.noteTitle")}

{t("updates.noteDescription")}

{version?.currentVersion || "-"}
{version?.latestVersion || t("updates.notChecked")} {version?.status ? : null} {version ? t(`updates.status.${version.status}`) : t("common.loading")} {version?.checkedAt ? formatDateTime(version.checkedAt, i18n.language) : t("updates.neverChecked")}
{error ?

{error}

: null}
{version?.releaseNotes || version?.releaseUrl ? (

{t("updates.releaseNotes")}

{t("updates.releaseNotesHelp")}

{version.releaseUrl ? ( ) : null}

{version.releaseNotes || t("updates.noReleaseNotes")}

) : null}
); } function VersionField({ label, description, children }: { label: string; description: string; children: ReactNode }) { return (

{label}

{description}

{children}
); } function VersionValue({ children }: { children: ReactNode }) { return
{children}
; }