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/Svg.js' 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 }) { const [isModalOpen, setIsModalOpen] = useState(false) const [file, setFile] = useState() const [cloudinaryId, setCloudinaryId] = useState(imageUrl) const [imageObj, setImageObj] = useState() const [crop, setCrop] = useState({ aspect: 16 / 9, unit: '%', width: 100, }); async function handleImageUpload() { const croppedFile = await getCroppedImg(imageObj, crop, 'avatar') console.log(croppedFile) 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 && } {cloudinaryId &&
} {!cloudinaryId && } {!cloudinaryId &&
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); }); }