import React, { useCallback, useState } from 'react' import { useDropzone } from 'react-dropzone' import Button from '@material-ui/core/Button' import axios from 'axios' import ReactCrop from 'react-image-crop' import { Dialog } from '@material-ui/core' import { Image as CloudinaryImage } from 'cloudinary-react' import 'react-image-crop/dist/ReactCrop.css' import Svg from 'src/components/Svg' const CLOUDINARY_UPLOAD_PRESET = 'CadHub_project_images' const CLOUDINARY_UPLOAD_URL = 'https://api.cloudinary.com/v1_1/irevdev/upload' export default function ImageUploader({ onImageUpload = () => {}, imageUrl, aspectRatio, className, isEditable, width = 600, }) { const [isModalOpen, setIsModalOpen] = useState(false) const [file, setFile] = useState() const [cloudinaryId, setCloudinaryId] = useState(imageUrl) const [imageObj, setImageObj] = useState() const [crop, setCrop] = useState({ aspect: aspectRatio, unit: '%', width: 100, }) async function handleImageUpload() { const croppedFile = await getCroppedImg(imageObj, crop, 'avatar') const imageData = new FormData() imageData.append('upload_preset', CLOUDINARY_UPLOAD_PRESET) imageData.append('file', croppedFile) let upload = axios.post(CLOUDINARY_UPLOAD_URL, imageData) try { const { data } = await upload if (data && data.public_id !== '') { onImageUpload({ cloudinaryPublicId: data.public_id }) setCloudinaryId(data.public_id) setIsModalOpen(false) } } catch (e) { console.error('ERROR', e) } } // Drag and Drop const onDrop = useCallback((acceptedFiles) => { setIsModalOpen(true) const fileReader = new FileReader() fileReader.onload = () => { setFile(fileReader.result) } fileReader.readAsDataURL(acceptedFiles[0]) }, []) const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }) return (
{cloudinaryId && isEditable && ( )} {isEditable && } {(cloudinaryId || !isEditable) && (
)} {!cloudinaryId && } {!cloudinaryId && isEditable && (
Drop files here ... or{' '} upload
)}
setIsModalOpen(false)}>
setImageObj(image)} onChange={(newCrop) => setCrop(newCrop)} />
) } function getCroppedImg(image, crop, fileName) { const canvas = document.createElement('canvas') const scaleX = image.naturalWidth / image.width const scaleY = image.naturalHeight / image.height canvas.width = crop.width canvas.height = crop.height const ctx = canvas.getContext('2d') ctx.drawImage( image, crop.x * scaleX, crop.y * scaleY, crop.width * scaleX, crop.height * scaleY, 0, 0, crop.width, crop.height ) // As Base64 string // const base64Image = canvas.toDataURL('image/jpeg'); // As a blob return new Promise((resolve, reject) => { canvas.toBlob( (blob) => { blob.name = fileName resolve(blob) }, 'image/jpeg', 1 ) }) }