import $ from 'jquery' import ctEvents from 'ct-events' function isTouchDevice() { try { document.createEvent('TouchEvent') return true } catch (e) { return false } } export const mount = (el, { event: mountEvent }) => { const openPhotoswipeFor = (el, index = null) => { if (el.closest('.elementor-section-wrap')) { return } var pswpElement = $('.pswp')[0], eventTarget = $(el), clicked = eventTarget const items = [ ...el .closest('.woocommerce-product-gallery') .querySelectorAll( '.flexy-items .ct-image-container img:not(.zoomImg), .woocommerce-product-gallery > .ct-image-container img:not(.zoomImg), .flexy-items .ct-image-container video, .woocommerce-product-gallery > .ct-image-container video, .flexy-items .ct-image-container iframe, .woocommerce-product-gallery > .ct-image-container iframe' ), ].map((img) => { if (img.matches('video') || img.matches('iframe')) { return { html: `
${img.outerHTML}
`, } } return { img, src: img.closest('a') ? img.closest('a').href : img.src, w: (img.closest('a') ? img.closest('a').dataset.width : img.width) || img.width, h: (img.closest('a') ? img.closest('a').dataset.height : img.width) || img.width, title: img.getAttribute('data-caption'), } }) if ( items.length === 1 && items[0].img.closest('a') && !items[0].img.closest('a').getAttribute('href') ) { 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, closeOnScroll: false, history: false, hideAnimationDuration: 0, showAnimationDuration: 0, } ) // Initializes and opens PhotoSwipe. var photoswipe = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options ) photoswipe.init() document.body.classList.add('ct-photoswipe-open') photoswipe.listen('close', () => { setTimeout(() => { document.body.classList.remove('ct-photoswipe-open') ;[ ...document.querySelectorAll( '.ct-lightbox-video-container' ), ].map((el) => el.remove()) }, 300) }) } const renderPhotoswipe = ({ onlyZoom = false } = {}) => { let maybeTrigger = [ ...document.querySelectorAll( '.woocommerce-product-gallery .woocommerce-product-gallery__trigger' ), ] ;[ ...document.querySelectorAll( '.single-product .flexy-items .ct-image-container, .single-product .woocommerce-product-gallery > .ct-image-container' ), ].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 ) { if (!el.hasPhotoswipeListener) { el.hasPhotoswipeListener = true el.addEventListener('click', (e) => { e.preventDefault() if (maybeTrigger.length > 0) { return } let activeIndex = 0 activeIndex = [ ...el.parentNode.querySelectorAll( '.ct-image-container' ), ].indexOf(el) if (el.closest('.flexy-items')) { activeIndex = [ ...el.closest('.flexy-items').children, ].indexOf(el.parentNode) } window.PhotoSwipe && 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.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.href, 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-image-container') && mountEvent.target .closest('.ct-image-container') .parentNode.classList.contains( 'woocommerce-product-gallery' )) ) { $( mountEvent.target.closest('.ct-image-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() if ( maybeTrigger.closest('.ct-image-container') && !maybeTrigger.closest('.flexy-items') ) { window.PhotoSwipe && openPhotoswipeFor( maybeTrigger.closest('.ct-image-container') ) return } if ( maybeTrigger.closest('.ct-image-container') && maybeTrigger.closest('.flexy-items') && maybeTrigger.closest('.ct-columns-top-gallery') ) { window.PhotoSwipe && openPhotoswipeFor( maybeTrigger.closest('.ct-image-container'), [ ...maybeTrigger.closest('.ct-image-container') .parentNode.parentNode.children, ].indexOf( maybeTrigger.closest('.ct-image-container') .parentNode ) ) return } if ( document.querySelector( '.single-product .woocommerce-product-gallery > .ct-image-container' ) ) { window.PhotoSwipe && openPhotoswipeFor( document.querySelector( '.single-product .woocommerce-product-gallery > .ct-image-container' ) ) } if ( document.querySelector( '.single-product .flexy-items .ct-image-container' ) ) { let pills = document.querySelector( '.single-product .flexy-pills' ) let activeIndex = Array.from( pills.querySelector('.active').parentNode.children ).indexOf( pills.querySelector('.active') || pills.firstElementChild ) window.PhotoSwipe && 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() } }) } } renderPhotoswipe() }