Spaces:
Build error
Build error
File size: 2,154 Bytes
d4f52d9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import { useState, useCallback } from 'react'
export default function ImageUpload({ onImageUpload, uploadedImage, onRemove }) {
const [isDragActive, setIsDragActive] = useState(false)
const onDrop = useCallback((e) => {
e.preventDefault()
setIsDragActive(false)
const file = e.dataTransfer.files[0]
if (file) {
onImageUpload(file)
}
}, [onImageUpload])
const onDragOver = useCallback((e) => {
e.preventDefault()
setIsDragActive(true)
}, [])
const onDragLeave = useCallback(() => {
setIsDragActive(false)
}, [])
const handleFileChange = (e) => {
const file = e.target.files[0]
if (file) {
onImageUpload(file)
}
}
return (
<div className="relative">
{!uploadedImage ? (
<div
onDrop={onDrop}
onDragOver={onDragOver}
onDragLeave={onDragLeave}
className={`border-2 border-dashed rounded-lg p-2 transition-colors ${
isDragActive
? 'border-blue-500 bg-blue-50'
: 'border-gray-300 bg-gray-50 hover:bg-gray-100'
}`}
>
<input
type="file"
accept="image/*"
onChange={handleFileChange}
className="hidden"
id="image-upload"
/>
<label
htmlFor="image-upload"
className="cursor-pointer flex items-center justify-center text-sm text-gray-600"
>
<span className="mr-2">📷</span>
{isDragActive ? 'Drop image here' : 'Add image'}
</label>
</div>
) : (
<div className="relative">
<img
src={uploadedImage.preview}
alt="Preview"
className="w-20 h-20 object-cover rounded-lg border border-gray-300"
/>
<button
onClick={onRemove}
className="absolute -top-2 -right-2 bg-red-500 text-white rounded-full w-6 h-6 flex items-center justify-center hover:bg-red-600 transition-colors"
aria-label="Remove image"
>
×
</button>
</div>
)}
</div>
)
} |