'use client'; import React, { useState, useRef } from 'react'; import { Upload, Link as LinkIcon, X, Image as ImageIcon, Loader2 } from 'lucide-react'; import { uploadImage } from '@/app/actions/upload'; import { toast } from 'react-hot-toast'; interface Props { value: string; onChange: (value: string) => void; label?: string; placeholder?: string; name?: string; } export default function ImageUploader({ value, onChange, label, placeholder, name }: Props) { const [mode, setMode] = useState<'url' | 'upload'>(value?.startsWith('/uploads/') ? 'upload' : 'url'); const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); const handleFileChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; // Basic validation if (!file.type.startsWith('image/')) { toast.error("Le fichier doit être une image"); return; } if (file.size > 5 * 1024 * 1024) { toast.error("L'image ne doit pas dépasser 5 Mo"); return; } setIsUploading(true); const formData = new FormData(); formData.append('file', file); try { const result = await uploadImage(formData); if (result.success && result.url) { onChange(result.url); toast.success("Image uploadée avec succès"); } else { toast.error(result.error || "Erreur lors de l'upload"); } } catch (error) { toast.error("Erreur de connexion lors de l'upload"); } finally { setIsUploading(false); if (fileInputRef.current) fileInputRef.current.value = ''; } }; const clearImage = () => { onChange(''); }; return (
{mode === 'url' ? (
onChange(e.target.value)} placeholder={placeholder || "https://images.unsplash.com/..."} className="w-full bg-slate-900 border border-slate-700 rounded-lg p-3 pl-10 text-white focus:outline-none focus:border-indigo-500 transition-colors" />
) : (
{!value ? (
fileInputRef.current?.click()} className="cursor-pointer border-2 border-dashed border-slate-700 hover:border-indigo-500 rounded-xl p-8 flex flex-col items-center justify-center gap-3 bg-slate-900/50 hover:bg-slate-900 transition-all group" > {isUploading ? ( ) : (
)}

{isUploading ? "Upload en cours..." : "Cliquez pour uploader"}

PNG, JPG ou WEBP jusqu'à 5 Mo

) : (
Prévisualisation
{/* Hidden input for value to be sent via form if needed */}
)}
)}
{value && mode === 'url' && (
Preview
)}
); }