import React, { useState, useRef } from "react"; import { X, Upload, GripVertical, Star } from "lucide-react"; import { Button } from "./ui/button"; import { Label } from "./ui/label"; import axios from "axios"; import { toast } from "sonner"; const API = `${process.env.REACT_APP_BACKEND_URL}/api`; const ImageUploadManager = ({ images = [], onChange, token }) => { const [uploading, setUploading] = useState(false); const [draggedIndex, setDraggedIndex] = useState(null); const fileInputRef = useRef(null); const handleFileUpload = async (files) => { setUploading(true); try { const uploadedUrls = []; for (const file of files) { console.log("Uploading file:", { name: file.name, type: file.type, size: file.size, lastModified: file.lastModified, }); const formData = new FormData(); formData.append("file", file); const response = await axios.post(`${API}/upload/image`, formData, { headers: { Authorization: `Bearer ${token}`, }, }); uploadedUrls.push(response.data.url); console.log("Upload successful:", response.data); } onChange([...images, ...uploadedUrls]); toast.success(`Uploaded ${uploadedUrls.length} image(s)`); } catch (error) { toast.error("Failed to upload images"); console.error("Upload error:", error); if (error.response) { console.error("Error response:", error.response.data); } } finally { setUploading(false); } }; const handleFileSelect = (e) => { const files = Array.from(e.target.files); if (files.length > 0) { handleFileUpload(files); } e.target.value = ""; // Reset input }; const handleRemoveImage = (index) => { const newImages = images.filter((_, i) => i !== index); onChange(newImages); }; const handleDragStart = (e, index) => { setDraggedIndex(index); e.dataTransfer.effectAllowed = "move"; }; const handleDragOver = (e, index) => { e.preventDefault(); if (draggedIndex === null || draggedIndex === index) return; const newImages = [...images]; const draggedImage = newImages[draggedIndex]; newImages.splice(draggedIndex, 1); newImages.splice(index, 0, draggedImage); setDraggedIndex(index); onChange(newImages); }; const handleDragEnd = () => { setDraggedIndex(null); }; return (
No images yet. Click "Add Images" to upload.
Drag images to reorder. First image is the primary image.
)}