import { AlertCircle, CheckCircle2, Upload } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { cn } from '../../../lib/utils'; import type { FileTreeUploadProgressState } from '../hooks/useFileTreeUpload'; type FileTreeUploadProgressProps = { upload: FileTreeUploadProgressState | null; }; const clampProgress = (progress: number) => Math.min(100, Math.max(0, progress)); const pluralizeFiles = (count: number) => (count === 1 ? 'file' : 'files'); export default function FileTreeUploadProgress({ upload }: FileTreeUploadProgressProps) { const { t } = useTranslation(); if (!upload) { return null; } const progress = clampProgress(upload.progress); const isUploading = upload.status === 'uploading'; const isComplete = upload.status === 'complete'; const isError = upload.status === 'error'; const fileSummary = upload.fileCount === 1 && upload.fileName ? upload.fileName : `${upload.fileCount} ${pluralizeFiles(upload.fileCount)}`; const title = isUploading ? t('fileTree.uploadingFiles', 'Uploading files') : isComplete ? t('fileTree.uploadComplete', 'Upload complete') : t('fileTree.uploadFailed', 'Upload failed'); const detail = isError ? upload.error : isComplete && typeof upload.uploadedCount === 'number' ? t('fileTree.uploadedCount', 'Uploaded {{uploaded}} of {{total}} {{label}}', { uploaded: upload.uploadedCount, total: upload.fileCount, label: pluralizeFiles(upload.fileCount), }) : fileSummary; const Icon = isError ? AlertCircle : isComplete ? CheckCircle2 : Upload; return (
{title} {isUploading ? `${progress}%` : isComplete ? t('common.done', 'Done') : t('common.failed', 'Failed')}
{detail}
); }