import { ArrowDownToLine, ArrowUpFromLine, X } from 'lucide-react'; import React from 'react'; import { useI18n } from '../../application/i18n/I18nProvider'; import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'; interface ZmodemProgressIndicatorProps { transferType: 'upload' | 'download' | null; filename: string | null; transferred: number; total: number; fileIndex: number; fileCount: number; finalizing: boolean; bytesPerSecond: number | null; onCancel: () => void; } function formatBytes(bytes: number): string { if (bytes <= 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1); return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`; } function formatSpeed(bytesPerSecond: number | null): string | null { if (!bytesPerSecond || bytesPerSecond <= 0) return null; return `${formatBytes(bytesPerSecond)}/s`; } export const ZmodemProgressIndicator: React.FC = ({ transferType, filename, transferred, total, fileIndex, fileCount, finalizing, bytesPerSecond, onCancel, }) => { const { t } = useI18n(); const percent = total > 0 ? Math.min(100, Math.round((transferred / total) * 100)) : 0; const Icon = transferType === 'upload' ? ArrowUpFromLine : ArrowDownToLine; const label = finalizing ? t('zmodem.waitingForRemote') : transferType === 'upload' ? t('zmodem.uploading') : t('zmodem.downloading'); const fileInfo = fileCount > 0 ? ` (${fileIndex + 1}/${fileCount})` : ''; const speed = formatSpeed(bytesPerSecond); return (
e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} >
{filename || label}{fileInfo} {percent}%
{finalizing ? label : `${formatBytes(transferred)} / ${formatBytes(total)}${speed ? ` ยท ${speed}` : ''}`}
{t('zmodem.cancelTransfer')}
); };