/**
* UpdateStatusIndicator - индикатор статуса обновлений для строки состояния
* Показывает компактную информацию о состоянии обновлений
*/
import { AlertCircle, CheckCircle, Download, Loader2, RefreshCw } from "lucide-react"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
import { useUpdateManager } from "../hooks/use-update-manager"
interface UpdateStatusIndicatorProps {
/** Показывать ли текст рядом с иконкой */
showText?: boolean
/** Компактный режим (только иконка) */
compact?: boolean
/** Дополнительные CSS классы */
className?: string
/** Обработчик клика */
onClick?: () => void
}
/**
* Индикатор статуса обновлений для строки состояния
*/
export function UpdateStatusIndicator({
showText = false,
compact = false,
className,
onClick,
}: UpdateStatusIndicatorProps) {
const {
isIdle,
isChecking,
isUpdateAvailable,
isDownloading,
isReadyToInstall,
isInstalling,
isInstalled,
isError,
availableUpdate,
error,
progress,
currentVersion,
checkForUpdates,
downloadUpdate,
installUpdate,
} = useUpdateManager()
// Не показываем индикатор в обычном состоянии если не указано явно
if (isIdle && !onClick) {
return null
}
const getIcon = () => {
if (isError) return
if (isInstalled) return
if (isInstalling) return
if (isReadyToInstall) return
if (isDownloading) return
if (isChecking) return
if (isUpdateAvailable) return
return
}
const getText = () => {
if (isError) return "Ошибка"
if (isInstalled) return "Установлено"
if (isInstalling) return "Установка..."
if (isReadyToInstall) return "Готово"
if (isDownloading) return "Загрузка..."
if (isChecking) return "Проверка..."
if (isUpdateAvailable) return "Обновление"
return "Проверить"
}
const getTooltipContent = () => {
if (isError) return `Ошибка обновления: ${error || "Неизвестная ошибка"}`
if (isInstalled) return "Обновление установлено. Перезапустите приложение."
if (isInstalling) return "Установка обновления..."
if (isReadyToInstall) return "Обновление готово к установке"
if (isDownloading) {
const progressText = progress ? ` (${progress.percentage}%)` : ""
return `Загрузка обновления${progressText}`
}
if (isChecking) return "Проверка доступных обновлений..."
if (isUpdateAvailable && availableUpdate) {
return `Доступна версия ${availableUpdate.version}`
}
return `Текущая версия: ${currentVersion}. Нажмите для проверки обновлений.`
}
const handleClick = () => {
if (onClick) {
onClick()
return
}
// Автоматические действия в зависимости от состояния
if (isUpdateAvailable) {
downloadUpdate()
} else if (isReadyToInstall) {
installUpdate()
} else if (isIdle || isError) {
checkForUpdates()
}
}
const getVariant = () => {
if (isError) return "destructive" as const
if (isUpdateAvailable || isReadyToInstall) return "default" as const
return "ghost" as const
}
// Компактный режим - только иконка
if (compact) {
return (
{getTooltipContent()}
)
}
// Обычный режим с текстом
return (
{getTooltipContent()}
)
}
/**
* Простой индикатор только с иконкой для встраивания в тесные места
*/
export function UpdateIconIndicator({ className }: { className?: string }) {
return
}
/**
* Индикатор с текстом для более широких панелей
*/
export function UpdateTextIndicator({ className }: { className?: string }) {
return
}