import React, { useEffect, useRef, VFC } from 'react'; import PhotoSwipeJs from 'photoswipe/dist/photoswipe.js'; import PhotoSwipeUI_Default from 'photoswipe/dist/photoswipe-ui-default.js'; import 'photoswipe/dist/photoswipe.css'; import 'photoswipe/dist/default-skin/default-skin.css'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import styles from './styles.module.scss'; import classNames from 'classnames'; import { useBlockBackButton } from '~/hooks/navigation/useBlockBackButton'; import { useModal } from '~/hooks/modal/useModal'; import { usePhotoSwipeStore } from '~/store/photoSwipe/usePhotoSwipeStore'; import { observer } from 'mobx-react'; const PhotoSwipe: VFC = observer(() => { let ref = useRef(null); const { hideModal } = useModal(); const photoswipe = usePhotoSwipeStore(); useEffect(() => { new Promise(async resolve => { const images = await Promise.all( photoswipe.images.map( image => new Promise(resolveImage => { const img = new Image(); img.onload = () => { resolveImage({ src: getURL(image, window.innerWidth < 768 ? PRESETS[900] : PRESETS[1600]), h: img.naturalHeight, w: img.naturalWidth, }); }; img.onerror = () => { resolveImage({}); }; img.src = getURL(image, PRESETS[1600]); }) ) ); resolve(images); }).then(images => { const ps = new PhotoSwipeJs(ref.current, PhotoSwipeUI_Default, images, { index: photoswipe.index || 0, closeOnScroll: false, history: false, }); ps.init(); ps.listen('destroy', hideModal); ps.listen('close', hideModal); }); }, [hideModal, photoswipe.images, photoswipe.index]); useBlockBackButton(hideModal); return (