From f3be6de7bdd89ddff3e4aa454d9ee6c965ae693e Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Mon, 26 Oct 2020 20:55:16 +1100 Subject: [PATCH] Integrate image uploader with new part and make image editable that is to say you can easily pick another image if you didn't like the first. --- web/src/components/PartForm/ImageUploader.js | 44 +++++++++++++------- web/src/components/PartForm/PartForm.js | 21 ++-------- web/src/components/Parts/Parts.js | 13 +++++- web/src/components/Svg/Svg.js | 9 ++-- 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/web/src/components/PartForm/ImageUploader.js b/web/src/components/PartForm/ImageUploader.js index 476293f..4809ec0 100644 --- a/web/src/components/PartForm/ImageUploader.js +++ b/web/src/components/PartForm/ImageUploader.js @@ -4,23 +4,25 @@ 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 = process.env.GATSBY_PROD_PRESET || "dev_preset"; -const CLOUDINARY_UPLOAD_URL = "https://api.cloudinary.com/v1_1/irevdev/upload"; +const CLOUDINARY_UPLOAD_PRESET = "CadHub_project_images"; +const CLOUDINARY_UPLOAD_URL = "https://api.cloudinary.com/v1_1/irevdev/upload/?custom_coordinates=10,10,20,20"; -export default function ImageUploader({ onImageUpload }) { +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() { - var image = new Image(); - image.src = file - const croppedFile = await getCroppedImg(image, crop, 'avatar') + const croppedFile = await getCroppedImg(imageObj, crop, 'avatar') console.log(croppedFile) const imageData = new FormData(); imageData.append('upload_preset', CLOUDINARY_UPLOAD_PRESET); @@ -30,6 +32,8 @@ export default function ImageUploader({ onImageUpload }) { 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) @@ -47,24 +51,35 @@ export default function ImageUploader({ onImageUpload }) { const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }); return ( -
+
+ {cloudinaryId && } - {/* */} - -
+ {cloudinaryId &&
+ +
} + {!cloudinaryId && } + {!cloudinaryId &&
Drop files here ... - or + or upload -
+
}
setIsModalOpen(false)} >
- setCrop(newCrop)} /> + setImageObj(image)} onChange={newCrop => setCrop(newCrop)} />
@@ -79,7 +94,6 @@ function getCroppedImg(image, crop, fileName) { canvas.width = crop.width; canvas.height = crop.height; const ctx = canvas.getContext('2d'); - ctx.drawImage( image, crop.x * scaleX, @@ -89,7 +103,7 @@ function getCroppedImg(image, crop, fileName) { 0, 0, crop.width, - crop.height, + crop.height ); // As Base64 string diff --git a/web/src/components/PartForm/PartForm.js b/web/src/components/PartForm/PartForm.js index b5aa2cd..daecc16 100644 --- a/web/src/components/PartForm/PartForm.js +++ b/web/src/components/PartForm/PartForm.js @@ -17,11 +17,13 @@ import Editor from "rich-markdown-editor"; const PartForm = (props) => { const { addMessage } = useFlash() const [description, setDescription] = useState(props?.part?.description) + const [imageUrl, setImageUrl] = useState(props?.part?.mainImage) const onSubmit = async (data, e) => { await props.onSave({ ...data, description, + mainImage: imageUrl }, props?.part?.id) const shouldOpenIde = e?.nativeEvent?.submitter?.dataset?.openIde if(shouldOpenIde) { @@ -35,8 +37,6 @@ const PartForm = (props) => { return (
- {console.log('yo', yo)}} /> - { /> - - - + setImageUrl(cloudinaryPublicId)} /> +