|
|
|
@@ -1,22 +1,42 @@ |
|
|
|
import React, { useRef, useState } from "react"; |
|
|
|
import React, { useEffect, useRef, useState } from "react"; |
|
|
|
import PropTypes from "prop-types"; |
|
|
|
import { |
|
|
|
AddFile, |
|
|
|
AddIcon, |
|
|
|
ImageOverlay, |
|
|
|
ImagePickerContainer, |
|
|
|
ImageUploaded, |
|
|
|
Trash, |
|
|
|
Tools, |
|
|
|
} from "./ImagePicker.styled"; |
|
|
|
import { Tooltip } from "@mui/material"; |
|
|
|
import { Icon } from "../Icon/Icon"; |
|
|
|
import { IconButton } from "../Buttons/IconButton/IconButton"; |
|
|
|
import { ReactComponent as EditIcon } from "../../assets/images/svg/edit.svg"; |
|
|
|
import { ReactComponent as TrashIcon } from "../../assets/images/svg/trash.svg"; |
|
|
|
|
|
|
|
// import { Input } from "@mui/material"; |
|
|
|
|
|
|
|
const ImagePicker = (props) => { |
|
|
|
const fileInputRef = useRef(null); |
|
|
|
const [isOpened, setIsOpened] = useState(false); |
|
|
|
const imageRef = useRef(null); |
|
|
|
const [image, setImage] = useState(""); |
|
|
|
const [isEditing, setIsEditing] = useState(false); |
|
|
|
|
|
|
|
let listener; |
|
|
|
useEffect(() => { |
|
|
|
listener = (event) => { |
|
|
|
if (imageRef.current) { |
|
|
|
if (imageRef.current.contains(event.target)) { |
|
|
|
setIsEditing(true); |
|
|
|
} else { |
|
|
|
setIsEditing(false); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
window.addEventListener("click", listener); |
|
|
|
return () => window.removeEventListener("click", listener); |
|
|
|
}, [imageRef]); |
|
|
|
|
|
|
|
const handleChange = () => { |
|
|
|
fileInputRef.current.value = ""; |
|
|
|
fileInputRef.current.click(); |
|
|
|
}; |
|
|
|
const handleImage = (event) => { |
|
|
|
@@ -24,52 +44,49 @@ const ImagePicker = (props) => { |
|
|
|
reader.readAsDataURL(event.target.files[0]); |
|
|
|
reader.onload = () => { |
|
|
|
if (props.setImage) props.setImage(reader.result); |
|
|
|
setImage(reader.result) |
|
|
|
setImage(reader.result); |
|
|
|
}; |
|
|
|
reader.onerror = (error) => { |
|
|
|
console.log(error); |
|
|
|
}; |
|
|
|
}; |
|
|
|
const handleOpen = () => { |
|
|
|
setIsOpened(true); |
|
|
|
if (!props.image) setIsOpened(false); |
|
|
|
}; |
|
|
|
const handleClose = () => { |
|
|
|
setIsOpened(false); |
|
|
|
}; |
|
|
|
|
|
|
|
const handleDelete = () => { |
|
|
|
if (props.deleteImage) props.deleteImage(); |
|
|
|
setImage(""); |
|
|
|
setIsOpened(false) |
|
|
|
} |
|
|
|
setIsEditing(false); |
|
|
|
}; |
|
|
|
return ( |
|
|
|
<Tooltip |
|
|
|
open={isOpened} |
|
|
|
onOpen={handleOpen} |
|
|
|
onClose={handleClose} |
|
|
|
enterDelay={500} |
|
|
|
enterNextDelay={500} |
|
|
|
arrow |
|
|
|
title={ |
|
|
|
<Icon style={{width: "50px", height: "42px", paddingTop: "10px"}}> |
|
|
|
<Trash onClick={handleDelete} /> |
|
|
|
</Icon> |
|
|
|
} |
|
|
|
d |
|
|
|
<ImagePickerContainer |
|
|
|
className={props.className} |
|
|
|
onClick={!image ? handleChange : () => {}} |
|
|
|
hasImage={props.image} |
|
|
|
> |
|
|
|
<ImagePickerContainer |
|
|
|
className={props.className} |
|
|
|
onClick={!image ? handleChange : () => {}} |
|
|
|
hasImage={props.image} |
|
|
|
> |
|
|
|
<AddFile type="file" ref={fileInputRef} onInput={handleImage} /> |
|
|
|
{image ? ( |
|
|
|
<ImageUploaded src={image} draggable={false}></ImageUploaded> |
|
|
|
) : ( |
|
|
|
<AddIcon /> |
|
|
|
)} |
|
|
|
</ImagePickerContainer> |
|
|
|
</Tooltip> |
|
|
|
<AddFile type="file" ref={fileInputRef} onInput={handleImage} /> |
|
|
|
{image ? ( |
|
|
|
<React.Fragment> |
|
|
|
<ImageUploaded src={image} draggable={false} ref={imageRef} /> |
|
|
|
{isEditing && ( |
|
|
|
<React.Fragment> |
|
|
|
<ImageOverlay /> |
|
|
|
<Tools showDeleteIcon={props.showDeleteIcon}> |
|
|
|
<IconButton onClick={handleChange}> |
|
|
|
<EditIcon /> |
|
|
|
</IconButton> |
|
|
|
{props.showDeleteIcon && ( |
|
|
|
<IconButton onClick={handleDelete}> |
|
|
|
<TrashIcon /> |
|
|
|
</IconButton> |
|
|
|
)} |
|
|
|
</Tools> |
|
|
|
</React.Fragment> |
|
|
|
)} |
|
|
|
</React.Fragment> |
|
|
|
) : ( |
|
|
|
<AddIcon /> |
|
|
|
)} |
|
|
|
{props.children} |
|
|
|
</ImagePickerContainer> |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
@@ -78,7 +95,8 @@ ImagePicker.propTypes = { |
|
|
|
className: PropTypes.string, |
|
|
|
setImage: PropTypes.func, |
|
|
|
image: PropTypes.func, |
|
|
|
deleteImage: PropTypes.func |
|
|
|
deleteImage: PropTypes.func, |
|
|
|
showDeleteIcon: PropTypes.bool, |
|
|
|
}; |
|
|
|
|
|
|
|
export default ImagePicker; |