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