69 lines
1.6 KiB
TypeScript
69 lines
1.6 KiB
TypeScript
import React, { useEffect, useState } from "react";
|
|
|
|
export const ImageModal: React.FC = () => {
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [imageSrc, setImageSrc] = useState("");
|
|
|
|
useEffect(() => {
|
|
const handleImageClick = (e: Event) => {
|
|
const target = e.target as HTMLElement;
|
|
if (target.classList.contains("note-image")) {
|
|
const src =
|
|
target.getAttribute("src") || target.getAttribute("data-src");
|
|
if (src) {
|
|
setImageSrc(src);
|
|
setIsOpen(true);
|
|
}
|
|
}
|
|
};
|
|
|
|
document.addEventListener("click", handleImageClick);
|
|
|
|
return () => {
|
|
document.removeEventListener("click", handleImageClick);
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const handleEscape = (e: KeyboardEvent) => {
|
|
if (e.key === "Escape" && isOpen) {
|
|
setIsOpen(false);
|
|
}
|
|
};
|
|
|
|
document.addEventListener("keydown", handleEscape);
|
|
return () => document.removeEventListener("keydown", handleEscape);
|
|
}, [isOpen]);
|
|
|
|
const handleClose = () => {
|
|
setIsOpen(false);
|
|
};
|
|
|
|
const handleBackdropClick = (e: React.MouseEvent) => {
|
|
if (e.target === e.currentTarget) {
|
|
handleClose();
|
|
}
|
|
};
|
|
|
|
if (!isOpen) return null;
|
|
|
|
return (
|
|
<div
|
|
id="imageModal"
|
|
className="image-modal"
|
|
style={{ display: "block" }}
|
|
onClick={handleBackdropClick}
|
|
>
|
|
<span className="image-modal-close" onClick={handleClose}>
|
|
×
|
|
</span>
|
|
<img
|
|
className="image-modal-content"
|
|
id="modalImage"
|
|
src={imageSrc}
|
|
alt="Preview"
|
|
/>
|
|
</div>
|
|
);
|
|
};
|