import $ from 'jquery' import ctEvents from 'ct-events' import { isTouchDevice } from '../helpers/is-touch-device' import { pauseVideo } from '../helpers/video' export const mount = (el, { event: mountEvent }) => { const isGalleryEnabled = window.PhotoSwipe && !!ct_localizations.has_product_single_lightbox const openPhotoswipeFor = (el, index = null) => { if (el.closest('.elementor-section-wrap')) { return } const pswpElement = $('.pswp')[0] const clicked = $(el) let items = [ ...el .closest('.woocommerce-product-gallery') .querySelectorAll('.ct-media-container'), ].filter((el) => !el.closest('.flexy-pills')) items = items.map((mediaContainer) => { if (mediaContainer.matches('[data-media-id]')) { return { mediaContainer, html: `
`, } } const videoOrIframe = mediaContainer.querySelector('video,iframe') if (videoOrIframe) { return { mediaContainer, html: `
${videoOrIframe.outerHTML}
`, } } const img = mediaContainer.querySelector('img:not(.zoomImg)') return { mediaContainer, img, src: img.closest('[data-src]') ? img.closest('[data-src]').dataset.src || img.closest('[data-src]').href || img.src : img.src, w: (img.closest('[data-width]') ? img.closest('[data-width]').dataset.width : img.width) || img.width, h: (img.closest('[data-height]') ? img.closest('[data-height]').dataset.height : img.width) || img.width, title: img.getAttribute('data-caption'), } }) if ( items.length === 1 && items[0].img && items[0].img.closest('a') && !items[0].img.closest('a').getAttribute('data-src') && items[0].img.title === 'woocommerce-placeholder' ) { return } var options = $.extend( { index: index === 0 ? 0 : index || $(clicked).index(), addCaptionHTMLFn: function (item, captionEl) { if (!item.title) { captionEl.children[0].textContent = '' return false } captionEl.children[0].textContent = item.title return true }, }, { shareEl: false, fullscreenEl: true, closeOnScroll: false, history: false, showHideOpacity: false, hideAnimationDuration: 0, showAnimationDuration: 0, } ) // Initializes and opens PhotoSwipe. var photoswipe = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options ) photoswipe.init() const pauseAllVideos = () => { photoswipe.currItem.container .closest('.pswp') .querySelectorAll('video,iframe') .forEach((videoOrIframe) => pauseVideo(videoOrIframe)) } photoswipe.listen('close', () => pauseAllVideos()) const loadVideoForCurrentSlide = () => { const videoContainer = photoswipe.currItem.container.querySelector('[data-media-id]') if ( !videoContainer || videoContainer.querySelector('video,iframe') ) { return } const preloader = videoContainer .closest('.pswp') .querySelector('.pswp__preloader') if (preloader) { preloader.classList.add('pswp__preloader--active') } import('../lazy/video-on-click').then(({ fetchVideoBy }) => { fetchVideoBy(videoContainer.dataset.mediaId, { ignoreVideoOptions: true, }).then((data) => { videoContainer.innerHTML = data.html if (preloader) { preloader.classList.remove('pswp__preloader--active') } }) }) } setTimeout(() => { loadVideoForCurrentSlide() }, 300) photoswipe.listen('afterChange', () => { pauseAllVideos() loadVideoForCurrentSlide() }) } const renderPhotoswipe = ({ onlyZoom = false } = {}) => { let maybeTrigger = [ ...document.querySelectorAll( '.woocommerce-product-gallery .woocommerce-product-gallery__trigger' ), ] ;[ ...document.querySelectorAll( '.woocommerce-product-gallery .ct-media-container' ), ] .filter((el) => !el.closest('.flexy-pills')) .map((el) => { if ( ((window.wp && wp.customize && wp.customize('has_product_single_lightbox') && wp.customize('has_product_single_lightbox')() === 'yes') || !window.wp || !window.wp.customize) && !onlyZoom && !el.matches('[data-media-id]') ) { if (!el.hasPhotoswipeListener) { el.hasPhotoswipeListener = true el.addEventListener('click', (e) => { if (!isGalleryEnabled) { return } if (maybeTrigger.length > 0) { return } e.preventDefault() let activeIndex = 0 activeIndex = [ ...el.parentNode.querySelectorAll( '.ct-media-container' ), ].indexOf(el) if (el.closest('.flexy-items')) { activeIndex = [ ...el.closest('.flexy-items').children, ].indexOf(el.parentNode) } isGalleryEnabled && openPhotoswipeFor(el, activeIndex) }) } } if ($.fn.zoom) { if ( (window.wp && wp.customize && wp.customize('has_product_single_zoom') && wp.customize('has_product_single_zoom')() === 'yes') || !window.wp || !window.wp.customize ) { const rect = el.getBoundingClientRect() if (el.closest('.elementor-section-wrap')) { return } if (el.closest('.ct-quick-view-card')) { return } if (el.querySelector('iframe')) { return } if (el.querySelector('video')) { return } if ( parseFloat(el.getAttribute('data-width')) > el .closest('.woocommerce-product-gallery') .getBoundingClientRect().width ) { $(el).zoom({ url: el.dataset.src, touch: false, duration: 50, ...(rect.width > parseFloat(el.dataset.width) || rect.height > parseFloat(el.dataset.height) ? { magnify: 2, } : {}), ...(isTouchDevice() ? { on: 'toggle', } : {}), }) } } } }) if ($.fn.zoom) { if ( (window.wp && wp.customize && wp.customize('has_product_single_zoom') && wp.customize('has_product_single_zoom')() === 'yes') || !window.wp || !window.wp.customize ) { setTimeout(() => { if (!mountEvent) { return } if (mountEvent.target.closest('.elementor-section-wrap')) { return } if ( mountEvent.target.closest('.flexy-items') || (mountEvent.target.closest('.ct-media-container') && mountEvent.target .closest('.ct-media-container') .parentNode.classList.contains( 'ct-stacked-gallery-container' )) ) { $( mountEvent.target.closest('.ct-media-container') ).trigger( isTouchDevice() ? 'click.zoom' : 'mouseenter.zoom' ) } }, 150) } } maybeTrigger.map((maybeTrigger) => { if (maybeTrigger.hasPhotoswipeListener) { return } maybeTrigger.hasPhotoswipeListener = true maybeTrigger.addEventListener('click', (e) => { e.preventDefault() e.stopPropagation() const galleryWrapper = maybeTrigger.closest( '.woocommerce-product-gallery' ) if ( galleryWrapper.querySelector('.ct-media-container') && !galleryWrapper.querySelector('.flexy-items') ) { isGalleryEnabled && openPhotoswipeFor( galleryWrapper.querySelector('.ct-media-container') ) return } if ( maybeTrigger.closest('.ct-media-container') && maybeTrigger.closest('.flexy-items') && maybeTrigger.closest('.ct-columns-top-gallery') ) { isGalleryEnabled && openPhotoswipeFor( maybeTrigger.closest('.ct-media-container'), [ ...maybeTrigger.closest('.ct-media-container') .parentNode.parentNode.children, ].indexOf( maybeTrigger.closest('.ct-media-container') .parentNode ) ) return } if ( document.querySelector( '.single-product .ct-stacked-gallery-container > .ct-media-container' ) ) { isGalleryEnabled && openPhotoswipeFor( document.querySelector( '.single-product .ct-stacked-gallery-container > .ct-media-container' ) ) } if ( document.querySelector( '.single-product .flexy-items .ct-media-container' ) ) { let pills = document.querySelector( '.single-product .flexy-pills' ) let activeIndex = Array.from( pills.querySelector('.active').parentNode.children ).indexOf( pills.querySelector('.active') || pills.firstElementChild ) isGalleryEnabled && openPhotoswipeFor( document.querySelector( '.single-product .flexy-items' ).children[activeIndex].firstElementChild, activeIndex ) } }) }) } if (mountEvent) { if (isTouchDevice() && mountEvent.type === 'click') { setTimeout(() => { if (mountEvent.target && mountEvent.target.click) { mountEvent.target.click() } }) } } renderPhotoswipe() }