import { Activity, Cpu, HardDrive, Info, Settings, Zap } from "lucide-react" import { useTranslation } from "react-i18next" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { Separator } from "@/components/ui/separator" import { Skeleton } from "@/components/ui/skeleton" import { Switch } from "@/components/ui/switch" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { cn } from "@/lib/utils" import { formatGpuMemory, formatGpuUtilization, getGpuEncoderDisplayName, getGpuRecommendations, getGpuStatusColor, useGpuCapabilities, } from "../hooks/use-gpu-capabilities" interface GpuStatusProps { className?: string showDetails?: boolean onSettingsClick?: () => void } export function GpuStatus({ className, showDetails = true, onSettingsClick }: GpuStatusProps) { const { t } = useTranslation() const { gpuCapabilities, currentGpu, systemInfo, compilerSettings, isLoading, error, updateSettings, refreshCapabilities, } = useGpuCapabilities() // Обработчик переключения GPU ускорения const handleToggleGpuAcceleration = async (enabled: boolean) => { if (!compilerSettings) return await updateSettings({ ...compilerSettings, hardware_acceleration: enabled, }) } if (isLoading) { return } if (error) { return ( {t("videoCompiler.gpu.error")} {error} ) } const isGpuAvailable = gpuCapabilities?.hardware_acceleration_supported || false const recommendations = getGpuRecommendations(gpuCapabilities, t) return (
{t("videoCompiler.gpu.acceleration")}
{onSettingsClick && ( )}
{isGpuAvailable ? t("videoCompiler.gpu.accelerationAvailable") : t("videoCompiler.gpu.accelerationUnavailable")}
{showDetails && ( <> {/* Информация о GPU */} {currentGpu && (
{t("videoCompiler.gpu.videoCard")}

{currentGpu.name}

{currentGpu.driver_version && (

{t("videoCompiler.gpu.driver")}: {currentGpu.driver_version}

)}
)} {/* Память GPU */} {currentGpu?.memory_total && (
{t("videoCompiler.gpu.videoMemory")}
{t("videoCompiler.gpu.memoryUsed")} {formatGpuMemory(currentGpu.memory_used ?? 0, t)} / {formatGpuMemory(currentGpu.memory_total, t)}
{currentGpu.memory_used && currentGpu.memory_total && ( )}
)} {/* Загрузка GPU */} {currentGpu?.utilization !== undefined && (
{t("videoCompiler.gpu.gpuLoad")}
{t("videoCompiler.gpu.usage")} {formatGpuUtilization(currentGpu.utilization, t)}
)} {/* Доступные кодировщики */} {gpuCapabilities && (
{t("videoCompiler.gpu.encoders")}
{gpuCapabilities.available_encoders.map((encoder) => ( {getGpuEncoderDisplayName(encoder, t)} ))} {gpuCapabilities.available_encoders.length === 0 && ( {t("videoCompiler.gpu.cpuOnly")} )}
)} {/* Системная информация */} {systemInfo && (
{t("videoCompiler.gpu.system")}

{t("videoCompiler.gpu.os")}: {systemInfo.os.type} {systemInfo.os.version} ( {systemInfo.os.architecture})

{t("videoCompiler.gpu.cpu")}: {systemInfo.cpu.cores} {t("videoCompiler.gpu.cores")} ( {systemInfo.cpu.arch})

{systemInfo.memory && (

{t("videoCompiler.gpu.memory")}: {formatGpuMemory(systemInfo.memory.total_bytes, t)}

)}
)} {/* Рекомендации */} {recommendations.length > 0 && ( <>

{t("videoCompiler.gpu.recommendations")}

    {recommendations.map((rec, index) => (
  • {rec}
  • ))}
)}

{t("videoCompiler.gpu.refreshTooltip")}

{compilerSettings && (
{t("videoCompiler.gpu.maxTasks")}: {compilerSettings.max_concurrent_jobs}
)}
)}
) } // Скелетон для загрузки function GpuStatusSkeleton({ className }: { className?: string }) { return (
) } // Компактная версия для панели инструментов export function GpuStatusBadge({ className }: { className?: string }) { const { t } = useTranslation() const { gpuCapabilities, isLoading } = useGpuCapabilities() if (isLoading) { return } const isGpuAvailable = gpuCapabilities?.hardware_acceleration_supported || false const encoder = gpuCapabilities?.recommended_encoder return ( {encoder ? getGpuEncoderDisplayName(encoder, t) : t("videoCompiler.gpu.cpuOnly")}

{isGpuAvailable ? t("videoCompiler.gpu.gpuTooltip", { encoder }) : t("videoCompiler.gpu.gpuUnavailableTooltip")}

) }