import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { CircleNotch, DownloadSimple, CheckCircle, WarningCircle, X } from '@phosphor-icons/react'; import { fetchJobStatus, downloadUrl } from './api.js'; import { formatBytes } from './utils/formatBytes.js'; import { fileTypeMeta } from './utils/fileFamily.js'; function extensionOf(fileName) { return fileName.split('.').pop(); } export function FileCard({ fileName, fileSize, targetFormat, jobId, initialError, onRemove }) { const { t } = useTranslation(); const [status, setStatus] = useState(initialError ? 'failed' : 'pending'); const [errorMessage, setErrorMessage] = useState(initialError ?? null); const [outputSize, setOutputSize] = useState(null); useEffect(() => { if (!jobId || initialError) return undefined; let cancelled = false; const interval = setInterval(async () => { const job = await fetchJobStatus(jobId); if (cancelled) return; setStatus(job.status); if (job.status === 'failed') setErrorMessage(job.errorMessage); if (job.status === 'done') setOutputSize(job.outputSizeBytes); if (job.status === 'done' || job.status === 'failed') clearInterval(interval); }, 1500); return () => { cancelled = true; clearInterval(interval); }; }, [jobId, initialError]); const { Icon, colorVar } = fileTypeMeta(extensionOf(fileName)); return (