import React, { useState } from 'react'; import { JobData } from '../types'; import * as api from '../services/api'; interface ProcessingPanelProps { job: JobData | null; embedded?: boolean; onEnhance?: (job: JobData) => void; } const ProcessingPanel: React.FC = ({ job, embedded = false, onEnhance }) => { const [downloadingType, setDownloadingType] = useState<'main' | 'enhanced' | null>(null); const [copySuccess, setCopySuccess] = useState(false); if (!job) return null; const isCompleted = job.status === 'completed'; const isFailed = job.status === 'failed' || job.status === 'error'; const VC_BASE_URL = 'https://ezmarynoori-sada.hf.space'; let downloadUrl = '#'; if (isCompleted) { if (job.downloadUrl) { downloadUrl = job.downloadUrl; } else if (job.filename) { downloadUrl = `${VC_BASE_URL}/download/${job.filename}`; } } const enhanceInfo = job.enhancement; const isEnhancing = enhanceInfo?.status === 'processing' || enhanceInfo?.status === 'started'; const isEnhanceCompleted = enhanceInfo?.status === 'completed'; // استفاده اولویت‌دار از لینک مستقیم بله که در مرورگر ذخیره شده است const enhanceDownloadUrl = isEnhanceCompleted ? (enhanceInfo?.downloadUrl || (enhanceInfo?.filename ? api.getEnhancementDownloadUrl(enhanceInfo.filename) : '#')) : '#'; const handleDownload = async (e: React.MouseEvent, url: string, type: 'main' | 'enhanced') => { e.preventDefault(); if (downloadingType) return; setDownloadingType(type); try { let blobUrl = url; if (!url.startsWith('blob:')) { const resp = await fetch(url); if (!resp.ok) throw new Error(`Network response was not ok: ${resp.statusText}`); const blob = await resp.blob(); blobUrl = URL.createObjectURL(blob); } window.parent.postMessage({ type: 'INITIATE_DOWNLOAD_FROM_URL', payload: { audioUrl: blobUrl } }, '*'); } catch (err) { console.error("Download preparation error:", err); alert("خطا در آماده‌سازی دانلود. لطفاً اتصال اینترنت خود را بررسی کنید."); } finally { setDownloadingType(null); } }; const handleCopyErrorLog = () => { const logText = job.statusMessage || 'Unknown Error'; navigator.clipboard.writeText(logText).then(() => { setCopySuccess(true); setTimeout(() => setCopySuccess(false), 2000); }).catch(err => { console.error('Failed to copy error log', err); }); }; const containerClasses = embedded ? "bg-gray-50/80 rounded-lg p-3 mt-2 border border-gray-100 animate-[fadeIn_0.3s_ease-out]" : "bg-white rounded-3xl shadow-lg border border-gray-100 p-6 mt-6 animate-[slideUp_0.5s_ease-out]"; return (

{isCompleted ? 'فایل اصلی آماده' : isFailed ? 'خطا در پردازش' : 'در حال تغییر صدا...'}

{!embedded && (

{job.type === 'model' ? `مدل: ${job.modelName}` : 'اختصاصی'}

)}
{!embedded && (
)}
{!isCompleted && !isFailed && (
{!embedded && (
پیشرفت کلی {job.progress || 0}%
)}

{job.statusMessage || 'در حال انجام عملیات...'}

)} {isCompleted && (
)} {isFailed && (
{copySuccess ? ( متن خطا کپی شد ) : ( خطا در پردازش. )}
)} {isCompleted && onEnhance && (
{!enhanceInfo && ( )} {enhanceInfo && isEnhancing && (
در حال حذف نویز و تقویت صدا... {enhanceInfo.progress || 0}%

در حال انجام کار ممکن است زمان‌بر باشد

)} {enhanceInfo && isEnhanceCompleted && (
نسخه تقویت شده (High Quality)
)} {enhanceInfo?.status === 'failed' && (
خطا در تقویت صدا. لطفا دوباره تلاش کنید.
)}
)}
); }; export default ProcessingPanel;