import { useRef, useState, useEffect, FC } from "react"; import { useOutsideClick, useKey } from "rooks"; import { Ring } from "@uiball/loaders"; import Modal from "./Modal"; import { useTranslation } from "react-i18next"; export interface PreviewImageData { originUrl: string; thumbnail?: string; downloadLink?: string; name?: string; type?: string; } interface Props { download?: boolean; data?: PreviewImageData; closeModal: () => void; } const ImagePreviewModal: FC = ({ download = true, data, closeModal }) => { const { t } = useTranslation(); const [url, setUrl] = useState(data?.thumbnail); const [loading, setLoading] = useState(true); const wrapperRef = useRef(null); useOutsideClick(wrapperRef, closeModal); useKey( "Escape", () => { closeModal(); }, { eventTypes: ["keyup"] } ); useEffect(() => { if (data) { const { originUrl } = data; if (!originUrl) setLoading(false); const img = new Image(); img.src = originUrl; img.onload = () => { setUrl(originUrl); setLoading(false); }; img.onerror = () => { setLoading(false); }; } }, [data]); if (!data) return null; const { originUrl, downloadLink, name, type } = data; return (
preview
{download && ( {t("action.download_origin")} )} {loading && (
)}
); }; export default ImagePreviewModal;