'use client' import { useState, useCallback } from 'react' import { useDropzone } from 'react-dropzone' export default function ImageConverter() { const [selectedFile, setSelectedFile] = useState(null) const [convertTo, setConvertTo] = useState('png') const [isConverting, setIsConverting] = useState(false) const [error, setError] = useState(null) const onDrop = useCallback((acceptedFiles: File[]) => { setError(null) if (acceptedFiles[0]) { setSelectedFile(acceptedFiles[0]) } }, []) const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'image/*': ['.jpeg', '.jpg', '.png', '.gif', '.webp'] }, multiple: false }) const handleConvert = async () => { if (!selectedFile) return setError(null) setIsConverting(true) try { const formData = new FormData() formData.append('file', selectedFile) formData.append('format', convertTo) const response = await fetch('/api/convert', { method: 'POST', body: formData, }) if (!response.ok) { const errorData = await response.json() throw new Error(errorData.error || 'Conversion failed') } const blob = await response.blob() const url = window.URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `picture_converted_to.${convertTo}` document.body.appendChild(a) a.click() window.URL.revokeObjectURL(url) document.body.removeChild(a) } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred') } finally { setIsConverting(false) } } return (

Image Converter

{/* Drag & Drop Zone */}

{isDragActive ? 'Drop the image here...' : 'Drag & drop an image here, or click to select'}

{selectedFile && (

Selected: {selectedFile.name}

)}
{/* Format Selection */}
{/* Error Message */} {error && (
{error}
)} {/* Convert Button */}
) }