import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { ExternalLink, MonitorDown } from "lucide-react"; import { Button } from "@/components/button"; import { SectionCard, SettingRow } from "@/components/section-card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/select"; import { canConfigureUpdates, desktopUpdates, useDesktopUpdate, type DesktopUpdateMode, type DesktopUpdateState, } from "@/lib/desktop-updates"; const MODES: DesktopUpdateMode[] = ["automatic", "prompt", "never"]; function StatusText({ state }: { state: DesktopUpdateState }) { const { t } = useTranslation(); const version = state.version; switch (state.status) { case "checking": return <>{t("desktopUpdates.statusChecking")}; case "available": return <>{t("desktopUpdates.statusAvailable", { version })}; case "downloading": return ( <> {t("desktopUpdates.statusDownloading", { version, progress: state.progress ?? 0, })} ); case "downloaded": return <>{t("desktopUpdates.statusReady", { version })}; case "up-to-date": return <>{t("desktopUpdates.statusUpToDate")}; case "error": return <>{t("desktopUpdates.statusError")}; default: return <>{t("desktopUpdates.statusIdle")}; } } /** Desktop only: how this install updates itself. */ export function DesktopUpdatesCard() { const { t } = useTranslation(); const state = useDesktopUpdate(); const [busy, setBusy] = useState(false); if (!canConfigureUpdates(state)) return null; const bridge = desktopUpdates(); const run = async (action: () => Promise | undefined) => { setBusy(true); try { await action(); } catch { toast.error(t("settings.updates.saveFailed")); } finally { setBusy(false); } }; const modeLabel = (mode: DesktopUpdateMode) => mode === "automatic" ? t("desktopUpdates.modeAutomatic") : mode === "prompt" ? t("desktopUpdates.modePrompt") : t("desktopUpdates.modeNever"); return ( } rowId="updates-desktop" > } > {state.status === "downloaded" ? ( ) : state.status === "available" && state.kind === "auto" ? ( ) : state.status === "available" && state.releaseUrl ? ( ) : ( )} ); }