import $ from 'jquery'
import { pauseVideo } from '../helpers/video'
export const mount = (el, { event: mountEvent }) => {
const isGalleryEnabled =
window.PhotoSwipe &&
document.querySelector('.woocommerce-product-gallery__trigger')
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.parentNode.closest('[data-src]')
? img.parentNode.closest('[data-src]').dataset.src ||
img.parentNode.closest('[data-src]').href ||
img.src
: img.src,
w:
(img.parentNode.closest('[data-width]')
? img.parentNode.closest('[data-width]').dataset.width
: img.width) || img.width,
h:
(img.parentNode.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,
tapToClose: true,
}
)
// 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', () => {
const flexyContainer = el
.closest('.woocommerce-product-gallery')
.querySelector('.flexy-container')
const flexyInstance = flexyContainer?.flexy
if (flexyInstance && flexyContainer.dataset.autoplay) {
flexyInstance.options = {
...flexyInstance.options,
autoplay: parseInt(flexyContainer.dataset.autoplay),
_autoplay: parseInt(flexyContainer.dataset.autoplay),
}
flexyInstance.state = {
...flexyInstance.state,
lastTimeAnimated: new Date().getTime(),
}
}
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 isZoomEnabled = true
if (
window.wp &&
wp.customize &&
wp.customize('has_product_single_zoom')
) {
isZoomEnabled = wp.customize('has_product_single_zoom')() === 'yes'
}
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 (
isZoomEnabled &&
!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)
}
if (isGalleryEnabled) {
openPhotoswipeFor(el, activeIndex)
}
})
}
}
if ($.fn.zoom) {
if (isZoomEnabled) {
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.getBoundingClientRect().width
) {
$(el).zoom({
url: el.dataset.src,
touch: false,
duration: 50,
// There is a img.onload inside. We don't need to
// rely on hardcoded duration to rely the initial event.
// Otherwise, it risks not running at all.
callback: () => {
if (!mountEvent) {
return
}
if (
mountEvent.target.closest(
'.elementor-section-wrap'
)
) {
return
}
let mediaContainer =
mountEvent.target.closest(
'.ct-media-container'
)
if (
mountEvent.target.querySelector(
'.ct-media-container'
)
) {
mediaContainer =
mountEvent.target.querySelector(
'.ct-media-container'
)
}
if (mediaContainer) {
if (
mountEvent &&
mountEvent.type !== 'click'
) {
$(mediaContainer).trigger(
'mouseenter.zoom',
mountEvent
)
}
}
},
...(rect.width > parseFloat(el.dataset.width) ||
rect.height > parseFloat(el.dataset.height)
? {
magnify: 2,
}
: {}),
...(mountEvent && mountEvent.type === 'click'
? {
on: 'toggle',
}
: {}),
})
}
}
}
})
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'
)
const flexyContainer =
galleryWrapper.querySelector('.flexy-container')
const flexyInstance = flexyContainer?.flexy
galleryWrapper
.querySelectorAll('video,iframe')
.forEach((videoOrIframe) => pauseVideo(videoOrIframe))
if (flexyInstance && flexyContainer.dataset.autoplay) {
setTimeout(() => {
flexyInstance.options = {
...flexyInstance.options,
autoplay: false,
_autoplay: false,
}
}, 50)
}
if (
galleryWrapper.querySelector('.ct-media-container') &&
!galleryWrapper.querySelector('.flexy-items')
) {
if (isGalleryEnabled) {
if (maybeTrigger.closest('.ct-media-container')) {
openPhotoswipeFor(
maybeTrigger.closest('.ct-media-container'),
[
...maybeTrigger.closest(
'.ct-media-container'
).parentNode.children,
].indexOf(
maybeTrigger.closest('.ct-media-container')
)
)
} else {
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 .product .flexy-items .ct-media-container'
)
) {
let pills = document.querySelector(
'.single-product .product .flexy-pills'
)
let activeIndex = Array.from(
pills.querySelector('.active').parentNode.children
).indexOf(
pills.querySelector('.active') ||
pills.firstElementChild
)
if (isGalleryEnabled) {
openPhotoswipeFor(
document.querySelector(
'.single-product .product .flexy-items'
).children[activeIndex].firstElementChild,
activeIndex
)
}
}
})
})
}
if (mountEvent) {
if (mountEvent.type === 'click') {
setTimeout(() => {
if (mountEvent.target && mountEvent.target.click) {
mountEvent.target.dispatchEvent(mountEvent)
}
}, 100)
}
}
renderPhotoswipe()
}