import React, { FC, useCallback, useEffect, useRef } from 'react'; import { connect } from 'react-redux'; 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 { IState } from '~/redux/store'; import { selectModal } from '~/redux/modal/selectors'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import * as MODAL_ACTIONS from '~/redux/modal/actions'; import styles from './styles.module.scss'; import classNames from 'classnames'; import { useBlockBackButton } from '~/hooks/navigation/useBlockBackButton'; const mapStateToProps = (state: IState) => ({ photoswipe: selectModal(state).photoswipe, }); const mapDispatchToProps = { modalSetShown: MODAL_ACTIONS.modalSetShown, }; type Props = ReturnType & typeof mapDispatchToProps & {}; const PhotoSwipeUnconnected: FC = ({ photoswipe, modalSetShown }) => { let ref = useRef(null); const closeModal = useCallback(() => modalSetShown(false), [modalSetShown]); 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', closeModal); ps.listen('close', closeModal); }); }, [closeModal, photoswipe.images, photoswipe.index]); useBlockBackButton(closeModal); return (