kollapsminoriteten/wp-content/themes/blocksy/static/js/frontend/dynamic-chunks/triggers.js

223 lines
4.8 KiB
JavaScript
Raw Permalink Normal View History

2025-08-27 08:44:30 +02:00
import { handleClickTrigger } from './click-trigger'
import { handleScrollTrigger } from './scroll-trigger'
import $ from 'jquery'
import { isTouchDevice } from '../helpers/is-touch-device'
// trigger: { id: 'hover', selector: '.js-lazy-load-on-hover' }
const triggersList = {
click: handleClickTrigger,
scroll: handleScrollTrigger,
'window-event': (trigger, chunk, loadChunkWithPayload) => {
if (!trigger.eventName) {
return
}
;[...document.querySelectorAll(trigger.selector)].map((el) => {
const propName = 'hasWindowEventListener' + trigger.eventName
if (el[propName]) {
return
}
el[propName] = true
window.addEventListener(trigger.eventName, (event) => {
loadChunkWithPayload(chunk, { event })
})
})
},
2025-12-12 13:14:39 +01:00
// input: (trigger, chunk, loadChunkWithPayload) => {
// ;[...document.querySelectorAll(trigger.selector)].map((el) => {
// if (el.hasLazyLoadInputListener) {
// return
// }
// el.hasLazyLoadInputListener = true
// el.addEventListener('input', (event) => {
// event.preventDefault()
// loadChunkWithPayload(chunk, { event }, el)
// })
// })
// },
// change: (trigger, chunk, loadChunkWithPayload) => {
// ;[...document.querySelectorAll(trigger.selector)].map((el) => {
// if (el.hasLazyLoadChangeListener) {
// return
// }
// el.hasLazyLoadChangeListener = true
// el.addEventListener('change', (event) => {
// event.preventDefault()
// loadChunkWithPayload(chunk, { event }, el)
// })
// })
// },
2025-08-27 08:44:30 +02:00
submit: (trigger, chunk, loadChunkWithPayload) => {
;[...document.querySelectorAll(trigger.selector)].map((el) => {
if (el.hasLazyLoadSubmitListener) {
return
}
el.hasLazyLoadSubmitListener = true
if ($) {
$(el).on('submit', (event) => {
event.preventDefault()
loadChunkWithPayload(chunk, { event }, el)
})
} else {
el.addEventListener('submit', (event) => {
event.preventDefault()
loadChunkWithPayload(chunk, { event }, el)
})
}
})
},
hover: (trigger, chunk, loadChunkWithPayload) => {
if (chunk.skipOnTouchDevices && isTouchDevice()) {
return
}
;[...document.querySelectorAll(trigger.selector)].map((el) => {
if (el.hasLazyLoadHoverListener) {
return
}
el.hasLazyLoadHoverListener = true
el.addEventListener('mouseover', (event) => {
event.preventDefault()
loadChunkWithPayload(chunk, { event }, el)
})
})
},
'slight-mousemove': (trigger, chunk, loadChunkWithPayload) => {
const maybeEl = document.querySelector(trigger.selector)
if (!document.body.hasSlightMousemoveListener && maybeEl) {
document.body.hasSlightMousemoveListener = true
const cb = (event) => {
document.removeEventListener('mousemove', cb)
loadChunkWithPayload(chunk, { event }, [
...document.querySelectorAll(trigger.selector),
])
}
document.addEventListener('mousemove', cb)
}
},
'jquery-event': (trigger, chunk, loadChunkWithPayload) => {
trigger = {
matchTarget: true,
...trigger,
}
if (!document.body.ctHasJqueryEventListener) {
document.body.ctHasJqueryEventListener = {}
}
if (document.body.ctHasJqueryEventListener[chunk.id]) {
return
}
document.body.ctHasJqueryEventListener[chunk.id] = true
trigger.events.map((eventName) => {
$(document.body).on(
eventName,
function (event, eventData, ...eventArguments) {
let maybeElement = document.body
if (trigger.matchTarget) {
if (!event.target.closest('.product')) {
return
}
maybeElement = event.target
.closest('.product')
.querySelector(trigger.selector)
if (!maybeElement) {
return
}
}
loadChunkWithPayload(
chunk,
{ event, eventData, eventArguments },
maybeElement
)
}
)
})
},
2025-12-12 13:14:39 +01:00
'dom-event': (trigger, chunk, loadChunkWithPayload) => {
trigger = {
selector: 'body',
...trigger,
}
const maybeEls = [...document.querySelectorAll(trigger.selector)]
maybeEls.forEach((maybeEl) => {
if (!maybeEl) {
return
}
if (!maybeEl.ctHasDomEventListener) {
maybeEl.ctHasDomEventListener = {}
}
if (maybeEl.ctHasDomEventListener[chunk.id]) {
return
}
maybeEl.ctHasDomEventListener[chunk.id] = true
trigger.events.map((eventName) => {
maybeEl.addEventListener(eventName, (event) => {
loadChunkWithPayload(chunk, { event }, maybeEl)
})
})
})
},
2025-08-27 08:44:30 +02:00
cookie: (trigger, chunk, loadChunkWithPayload) => {
if (
chunk.cookieAbsent &&
document.cookie.indexOf(chunk.cookieAbsent) === -1
) {
loadChunkWithPayload(chunk, {})
}
},
}
export const handleTrigger = (
trigger,
chunk,
loadChunkWithPayload,
loadedChunks
) => {
if (!trigger.trigger && !triggersList[trigger.trigger]) {
return
}
triggersList[trigger.trigger](
trigger,
chunk,
loadChunkWithPayload,
loadedChunks
)
}