import { randomString } from '@/lib/random' import { cn } from '@/lib/utils' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import modalManager from '@/services/modal-manager.service' import { TImetaInfo } from '@/types' import { useEffect, useMemo, useState } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import Lightbox from 'yet-another-react-lightbox' import Zoom from 'yet-another-react-lightbox/plugins/zoom' import Image from '../Image' export default function ImageWithLightbox({ image, className, classNames = {}, errorPlaceholder, ignoreAutoLoadPolicy = false }: { image: TImetaInfo className?: string classNames?: { wrapper?: string skeleton?: string } errorPlaceholder?: string ignoreAutoLoadPolicy?: boolean }) { const id = useMemo(() => `image-with-lightbox-${randomString()}`, []) const { t } = useTranslation() const { autoLoadMedia } = useContentPolicy() const [display, setDisplay] = useState(ignoreAutoLoadPolicy ? true : autoLoadMedia) const [index, setIndex] = useState(-1) useEffect(() => { if (index >= 0) { modalManager.register(id, () => { setIndex(-1) }) } else { modalManager.unregister(id) } }, [index]) if (!display) { return (
{ e.stopPropagation() setDisplay(true) }} > [{t('Click to load image')}]
) } const handlePhotoClick = (event: React.MouseEvent) => { event.stopPropagation() event.preventDefault() setIndex(0) } return (
handlePhotoClick(e)} errorPlaceholder={errorPlaceholder} /> {index >= 0 && createPortal(
e.stopPropagation()}> = 0} close={() => setIndex(-1)} controller={{ closeOnBackdropClick: true, closeOnPullUp: true, closeOnPullDown: true }} styles={{ toolbar: { paddingTop: '2.25rem' } }} />
, document.body )}
) }