import { useState } from 'react'; import toast from 'react-hot-toast'; export default function Downloader() { const [url, setUrl] = useState(''); const [loading, setLoading] = useState(false); const [progress, setProgress] = useState(''); const [downloadLink, setDownloadLink] = useState(null); const isValidUrl = (string) => { try { new URL(string); return string.includes('deviantart.com'); } catch (_) { return false; } }; const handleProcess = async (e) => { e.preventDefault(); if (!url.trim()) { toast.error('Please enter a DeviantArt URL'); return; } if (!isValidUrl(url)) { toast.error('Please enter a valid DeviantArt URL'); return; } setLoading(true); setProgress('Initializing...'); setDownloadLink(null); try { const response = await fetch('/api/process', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ url }), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to process request'); } // Simulate progress updates if the backend is fast setProgress('Downloading images...'); await new Promise(r => setTimeout(r, 800)); setProgress('Creating ZIP archive...'); await new Promise(r => setTimeout(r, 800)); setProgress('Uploading to MediaFire...'); await new Promise(r => setTimeout(r, 800)); const data = await response.json(); if (data.success) { setDownloadLink(data.downloadUrl); setProgress('Complete!'); toast.success('ZIP file generated successfully!'); } else { throw new Error(data.error || 'Unknown error occurred'); } } catch (error) { console.error(error); toast.error(error.message || 'Something went wrong'); setProgress('Error occurred'); } finally { setLoading(false); } }; return (