import { useTranslation } from 'react-i18next' import { AlertCircle, Check, ChevronDown, ChevronUp, Clock, Loader2, RotateCw, X, } from 'lucide-react' import { cn } from '@/shared/lib/cn' import { type UploadItem, useUploadStore } from './upload-store' function StatusIcon({ status }: Readonly<{ status: UploadItem['status'] }>) { switch (status) { case 'done': return case 'error': return case 'uploading': return default: return } } function barWidth(item: UploadItem): number { if (item.status === 'done' || item.status === 'error') return 100 if (item.status === 'uploading') return item.percent return 0 } /** Глобальный индикатор загрузок: живёт вне страниц, поэтому загрузка идёт при любой навигации. */ export function UploadSnackbar() { const { t } = useTranslation() const { items, active, minimized, skipped, toggleMinimize, dismiss, cancel, cancelAll, retry } = useUploadStore() if (items.length === 0 && skipped === 0) return null const done = items.filter((i) => i.status === 'done').length const hasItems = items.length > 0 let header: string if (!hasItems) header = t('admin.media.skippedDuplicates', { count: skipped }) else if (active) header = t('admin.media.uploadingCount', { done, total: items.length }) else header = t('admin.media.uploadedCount', { count: done }) return (
{header} {hasItems && ( )} {active && ( )} {!active && ( )}
{hasItems && skipped > 0 && (
{t('admin.media.skippedDuplicates', { count: skipped })}
)} {hasItems && !minimized && (
    {items.map((item) => (
  • {item.name} {item.status === 'uploading' && ( {item.percent}% )} {(item.status === 'queued' || item.status === 'uploading') && ( )} {item.status === 'error' && ( )}
  • ))}
)}
) }