Files
ColdBreeze-chat-web/src/common/component/ImagePreview.tsx
T
2023-03-06 11:08:43 +08:00

52 lines
2.1 KiB
TypeScript

import { useEffect, useState } from 'react';
import ImagePreviewModal, { PreviewImageData } from "../../common/component/ImagePreviewModal";
type Props = {
context?: "chat" | "markdown",
container: HTMLElement | null
}
const ImagePreview = ({ container, context = "chat" }: Props) => {
const [previewImage, setPreviewImage] = useState<PreviewImageData | null>(null);
const closePreviewModal = () => {
setPreviewImage(null);
};
useEffect(() => {
if (!container) return;
const chatHandler = (evt: MouseEvent) => {
const target = evt.target as HTMLImageElement;
if (!target) return;
if (target.nodeName == "IMG" && target.classList.contains("preview")) {
const thumbnail = target.src;
const originUrl = target.dataset.origin || target.src;
const downloadLink = target.dataset.download || target.src;
const meta = JSON.parse(target.dataset.meta || "{}");
setPreviewImage({ thumbnail, originUrl, downloadLink, ...meta });
}
};
const markdownHandler = (evt: MouseEvent) => {
evt.stopPropagation();
const target = evt.target as HTMLImageElement;
if (!target) return;
// 图片
if (target.nodeName == "IMG") {
const urlObj = new URL(target.src);
const originUrl = `${urlObj.origin}${urlObj.pathname}?file_path=${urlObj.searchParams.get(
"file_path"
)}`;
const data = { originUrl };
setPreviewImage(data);
}
};
const handler = context == 'chat' ? chatHandler : markdownHandler;
// 点击查看大图
container.addEventListener("click", handler, true);
return () => {
container.removeEventListener("click", handler, true);
};
}, [container, context]);
return previewImage ? <ImagePreviewModal download={context == "chat"} data={previewImage} closeModal={closePreviewModal} /> : null;
};
export default ImagePreview;