import { useContext, useRef, useState } from 'react' import CanvasContext from '../Context/canvasContext/CanvasContext' import { Button } from '@/components/ui/button' import { fabric } from 'fabric' import { ImageIcon, Trash2 } from 'lucide-react' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import Resizer from "react-image-file-resizer" import { Slider } from '@/components/ui/slider' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { useDropzone } from 'react-dropzone' import ImageCustomization from './Customization/ImageCustomization' import { Separator } from '../ui/separator' import ActiveObjectContext from '../Context/activeObject/ObjectContext' const UploadImage = () => { const { canvas } = useContext(CanvasContext); const [width, setWidth] = useState(1080); const [height, setHeight] = useState(1080); const [quality, setQuality] = useState(100); const [rotation, setRotation] = useState("0"); const [format, setFormat] = useState('JPEG'); const fileInputRef = useRef(null); const { activeObject, setActiveObject } = useContext(ActiveObjectContext); const [file, setFile] = useState(null); const [preview, setPreview] = useState(null); const { getRootProps, getInputProps, isDragActive } = useDropzone({ accept: { 'image/*': ['.jpeg', '.png', '.gif', '.jpg', '.webp', '.svg'] }, // maxSize: 5 * 1024 * 1024, // 5MB max file size multiple: false, onDrop: (acceptedFiles) => { if (!acceptedFiles.length) { console.error("No files were dropped."); return; } const selectedFile = acceptedFiles[0]; // Create a preview URL const blobUrl = URL.createObjectURL(selectedFile); setFile(selectedFile); setPreview(blobUrl); if (selectedFile.type === "image/svg+xml") { addImageToCanvas(selectedFile); URL.revokeObjectURL(blobUrl); } else { const imgElement = new Image(); imgElement.src = blobUrl; imgElement.onload = () => { if (imgElement.width > 1080) { handleResize(selectedFile, (compressedFile) => { addImageToCanvas(compressedFile); }); } else { addImageToCanvas(selectedFile); } URL.revokeObjectURL(blobUrl); // Clean up }; imgElement.onerror = () => { console.error("Failed to load image."); URL.revokeObjectURL(blobUrl); // Clean up }; } } }); const removeFile = () => { // Revoke the object URL to free up memory if (preview) { URL.revokeObjectURL(preview) } setFile(null) setPreview(null) if (fileInputRef.current) { fileInputRef.current.value = "" } if (activeObject?.type === "image") { canvas.remove(activeObject); setActiveObject(null); canvas.renderAll(); } } const handleResize = (file, callback) => { Resizer.imageFileResizer( file, width, height, format, quality, parseInt(rotation), (resizedFile) => { callback(resizedFile) }, 'file', ) } const addImageToCanvas = (file) => { const blobUrl = URL.createObjectURL(file) fabric.Image.fromURL(blobUrl, (img) => { img.set({ left: canvas.width / 4, top: canvas.height / 4, scaleX: 0.5, scaleY: 0.5, }) canvas.add(img) canvas.setActiveObject(img); // Update the active object state setActiveObject(img); canvas.renderAll(); URL.revokeObjectURL(blobUrl); }) } return ( Image Upload & Editing Upload, resize, and apply effects to your images Upload Effects {/* Uploads */}
setWidth(value[0])} />
setHeight(value[0])} />
{format === "JPEG" && (
setQuality(value[0])} />
)}
{/* upload image */} { !preview &&

{isDragActive ? 'Drop file here' : 'Drag \'n\' drop an image, or click to select a file' }

(Max 5MB, image files only)

} {/* preview image */} {preview && (
{ file?.type === "image/svg+xml" ? Your browser does not support SVG, no preview available for SVG. : Uploaded image }

{file?.name}

)}
{/* Effects */}
) } export default UploadImage