import { useState, useCallback } from 'react' import { useStore } from '@nanostores/react' import { generateFromPhotoImage } from '../generators/from-photo' import { generatedImages, selectedImage } from '../stores' import type { GeneratedImage } from '../stores' interface PhotoDropZoneProps { size: number } export default function PhotoDropZone({ size }: PhotoDropZoneProps) { const [isDragOver, setIsDragOver] = useState(false) const [isProcessing, setIsProcessing] = useState(false) const [error, setError] = useState(null) const images = useStore(generatedImages) const selected = useStore(selectedImage) const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault() setIsDragOver(true) }, []) const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault() setIsDragOver(false) }, []) const handleDrop = useCallback(async (e: React.DragEvent) => { e.preventDefault() setIsDragOver(false) setError(null) const files = Array.from(e.dataTransfer.files) const imageFiles = files.filter(file => file.type.startsWith('image/')) if (imageFiles.length === 0) { setError('Please drop an image file (PNG, JPG, GIF, etc.)') return } if (imageFiles.length > 1) { setError('Please drop only one image at a time') return } const file = imageFiles[0] try { setIsProcessing(true) const processedImage = await generateFromPhotoImage(file, size) // Set the single processed image and automatically select it generatedImages.set([processedImage]) selectedImage.set(processedImage) console.log('Photo processed successfully:', processedImage) } catch (error) { console.error('Error processing image:', error) setError('Failed to process the image. Please try again.') } finally { setIsProcessing(false) } }, [size]) const handleFileInput = useCallback(async (e: React.ChangeEvent) => { const files = e.target.files if (!files || files.length === 0) return const file = files[0] if (!file.type.startsWith('image/')) { setError('Please select an image file (PNG, JPG, GIF, etc.)') return } try { setIsProcessing(true) setError(null) const processedImage = await generateFromPhotoImage(file, size) // Set the single processed image and automatically select it generatedImages.set([processedImage]) selectedImage.set(processedImage) console.log('Photo processed successfully:', processedImage) } catch (error) { console.error('Error processing image:', error) setError('Failed to process the image. Please try again.') } finally { setIsProcessing(false) } }, [size]) const processedImage = images.length > 0 ? images[0] : null return (
{processedImage ? ( // Show the processed image with drag/drop overlay
{ if (canvas && processedImage.canvas) { const ctx = canvas.getContext('2d')! canvas.width = processedImage.canvas.width canvas.height = processedImage.canvas.height canvas.style.width = '100%' canvas.style.height = '100%' ctx.imageSmoothingEnabled = true ctx.drawImage(processedImage.canvas, 0, 0) } }} className="w-full h-full block" /> {isDragOver && (
Drop to replace
)}
) : ( // Show the drop zone
{isProcessing ? (
Processing image...
Converting to grayscale and enhancing contrast
) : (
Drop your photo here
)}
)} {error && (
{error}
)}
) }