import { useEffect, useState, useCallback } from 'react' import { createPortal } from 'react-dom' export function ImageZoom() { const [zoomedImage, setZoomedImage] = useState(null) const [isClosing, setIsClosing] = useState(false) const closeZoom = useCallback(() => { setIsClosing(true) setTimeout(() => { setZoomedImage(null) setIsClosing(false) }, 200) }, []) useEffect(() => { const handleImageClick = (e) => { const target = e.target if ( target.tagName === 'IMG' && (target.classList.contains('imagewrapper') || target.classList.contains('imagewrapper-big') || target.closest('.imagewrapper') || target.closest('.imagewrapper-big')) ) { e.preventDefault() setZoomedImage(target.src) } } const handleKeyDown = (e) => { if (e.key === 'Escape' && zoomedImage) { closeZoom() } } document.addEventListener('click', handleImageClick) document.addEventListener('keydown', handleKeyDown) return () => { document.removeEventListener('click', handleImageClick) document.removeEventListener('keydown', handleKeyDown) } }, [zoomedImage, closeZoom]) if (!zoomedImage) return null return createPortal(
Zoomed view
, document.body ) }