Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

jsarnowski / jsarnowski/blocksy-companion-pro   php

Repository URL to install this package:

Version: 1.8.76 

/ premium / static / js / micro-popups.js

import ctEvents from 'ct-events'
import { registerDynamicChunk } from 'blocksy-frontend'
import { focusLockManager } from './focus-lock'

const onKeydown = (event) => {
	if (event.keyCode !== 27) return
	;[...document.querySelectorAll('.ct-popup.active')].map((popup) => {
		closeMicroPopup(popup)
	})
}

const getPastPopups = () => {
	const received = JSON.parse(localStorage.getItem('blocksyPastPopups'))
	let result = {}

	if (Array.isArray(received)) {
		received.forEach((key) => {
			result[key] = {
				isExpired: true,
				pages: [],
			}
		})
	} else {
		result = received
	}

	return result ?? {}
}

const closeMicroPopup = (popup) => {
	let popupId = popup.id.replace('ct-popup-', '')

	ctEvents.trigger('blocksy:micro-popups:close', popupId, popup)

	localStorage.setItem(
		'blocksyPastPopups',
		JSON.stringify({
			...getPastPopups(),
			[popupId]: {
				isExpired: true,
				pages: [location.href],
			},
		})
	)

	popup.classList.toggle('active')

	focusLockManager().focusLockOff(popup)
	if (popup.dataset.scrollLock) {
		import('./lazy/scroll-lock').then(({ scrollLockManager }) => {
			scrollLockManager().enable(popup.querySelector('.entry-content'))
		})
	}
	;[...popup.querySelectorAll('iframe[src*="youtu"]')].map((i) => {
		i.contentWindow.postMessage(
			'{"event":"command","func":"stopVideo","args":""}',
			'*'
		)
	})
	;[...popup.querySelectorAll('video')].map((i) => {
		i.pause()
	})
	;[...popup.querySelectorAll('iframe:not([src*="youtu"])')].map((i) => {
		const source = i.src
		i.src = ''
		i.src = source
	})

	document.removeEventListener('keyup', onKeydown)
}

const openMicroPopup = (popup) => {
	let isOpen = popup.classList.contains('active')

	if (isOpen) {
		closeMicroPopup(popup)
		return
	}

	const popupId = popup.id.replace('ct-popup-', '')
	ctEvents.trigger('blocksy:micro-popups:open', popupId, popup)

	popup.classList.add('active')

	focusLockManager().focusLockOn(popup)
	if (popup.dataset.scrollLock) {
		import('./lazy/scroll-lock').then(({ scrollLockManager }) => {
			scrollLockManager().disable(popup.querySelector('.entry-content'))
		})
	}

	let maybeClose = popup.querySelector('.ct-toggle-close')

	if (maybeClose && !maybeClose.hasClickListener) {
		maybeClose.hasClickListener = true

		popup
			.querySelector('.ct-toggle-close')
			.addEventListener('click', (e) => {
				e.preventDefault()
				closeMicroPopup(popup)
			})
	}

	if (popup.dataset.popupBackdrop === 'yes' && !popup.hasClickListener) {
		popup.hasClickListener = true
		popup.addEventListener('click', (e) => {
			if (e.target.dataset.popupBackdrop === 'yes') {
				e.preventDefault()
				closeMicroPopup(popup)
			}
		})
	}

	document.addEventListener('keyup', onKeydown)
}

window.blocksyOpenMicroPopup = openMicroPopup

let isPopupExpired = (popup) => {
	let popupId = popup.id.replace('ct-popup-', '')

	if (popup.dataset.popupMode.indexOf('once') === -1) {
		return false
	}

	return getPastPopups()[popupId]?.isExpired
}

let mounted = false

registerDynamicChunk('blocksy_pro_micro_popups', {
	mount: (el) => {
		if (!mounted) {
			mounted = true
			;[...document.querySelectorAll('[data-popup-mode*="page_load"]')]
				.filter((popup) => !isPopupExpired(popup))
				.map((popup) => openMicroPopup(popup))
			;[...document.querySelectorAll('[data-popup-mode*="after_x_time"]')]
				.filter((popup) => !isPopupExpired(popup))
				.map((popup) => {
					let timeout = popup.dataset.popupMode.split(':')[1]

					setTimeout(() => {
						openMicroPopup(popup)
					}, parseInt(timeout, 10) * 1000)
				})

			if (document.querySelector('[data-popup-mode*="after_x_pages"]')) {
				let allPopupsWithExit = [
					...document.querySelectorAll(
						'[data-popup-mode*="after_x_pages"]'
					),
				].filter((popup) => !isPopupExpired(popup))

				if (allPopupsWithExit.length > 0) {
					let pastPopups = getPastPopups()

					allPopupsWithExit.map((popup) => {
						const popupId = popup.id.replace('ct-popup-', '')
						//* +1 is the first one page, cause trigger name is ("After")
						const count =
							parseFloat(popup.dataset.popupMode.split(':')[1]) +
							1

						const result = {
							...(pastPopups[popupId] ?? {}),
							pages: Array.from(
								new Set([
									...((pastPopups[popupId] ?? {}).pages ||
										[]),
									location.href,
								])
							),
						}

						pastPopups[popupId] = result

						if (result.pages.length >= count) {
							openMicroPopup(popup)
						}
					})

					localStorage.setItem(
						'blocksyPastPopups',
						JSON.stringify(pastPopups)
					)
				}
			}

			if (document.querySelector('[data-popup-mode*="exit_intent"]')) {
				let allPopupsWithExit = [
					...document.querySelectorAll(
						'[data-popup-mode*="exit_intent"]'
					),
				].filter((popup) => !isPopupExpired(popup))

				if (allPopupsWithExit.length > 0) {
					const cb = (event) => {
						if (
							event.clientY <= 0 ||
							event.clientX <= 0 ||
							event.clientX >= window.innerWidth ||
							event.clientY >= window.innerHeight
						) {
							;[
								...document.querySelectorAll(
									'[data-popup-mode*="exit_intent"]'
								),
							].map((popup) => {
								if (popup.classList.contains('active')) {
									return
								}

								openMicroPopup(popup)
								document.removeEventListener('mouseout', cb)
							})
						}
					}

					document.addEventListener('mouseout', cb)
				}
			}

			if (document.querySelector('[data-popup-mode*="element_reveal"]')) {
				;[
					...document.querySelectorAll(
						'[data-popup-mode*="element_reveal"]'
					),
				]
					.filter((popup) => !isPopupExpired(popup))
					.map((popup) => {
						let selector = popup.dataset.popupMode.split(':')[1]

						if (!document.querySelector(selector)) {
							return
						}

						let io = new IntersectionObserver((entries) => {
							const visible = entries
								.filter(({ isIntersecting }) => isIntersecting)
								.map(({ target }) => target)

							if (visible.length === 0) {
								return
							}

							openMicroPopup(popup)

							io.disconnect()
						})

						;[...document.querySelectorAll(selector)].map((el) => {
							io.observe(el)
						})
					})
			}

			if (
				document.querySelector('[data-popup-mode*="after_inactivity"]')
			) {
				;[
					...document.querySelectorAll(
						'[data-popup-mode*="after_inactivity"]'
					),
				]
					.filter((popup) => !isPopupExpired(popup))
					.map((popup) => {
						var t
						window.addEventListener('load', resetTimer)
						window.addEventListener('mousemove', resetTimer)
						window.addEventListener('mousedown', resetTimer)
						window.addEventListener('touchstart', resetTimer)
						window.addEventListener('click', resetTimer)
						window.addEventListener('keydown', resetTimer)
						window.addEventListener('scroll', resetTimer, true)

						function yourFunction() {
							openMicroPopup(popup)

							if (t) {
								clearTimeout(t)
							}

							window.removeEventListener('load', resetTimer)
							window.removeEventListener('mousemove', resetTimer)
							window.removeEventListener('mousedown', resetTimer)
							window.removeEventListener('touchstart', resetTimer)
							window.removeEventListener('click', resetTimer)
							window.removeEventListener('keydown', resetTimer)
							window.removeEventListener(
								'scroll',
								resetTimer,
								true
							)
						}

						function resetTimer() {
							let timeout = popup.dataset.popupMode.split(':')[1]
							clearTimeout(t)

							t = setTimeout(
								yourFunction,
								parseInt(timeout, 10) * 1000
							)
						}
					})
			}

			if (document.querySelector('[data-popup-mode*="scroll"]')) {
				;[...document.querySelectorAll('[data-popup-mode*="scroll"]')]
					.filter((popup) => !isPopupExpired(popup))
					.map((popup) => {
						let isUp = popup.dataset.popupMode.indexOf('up') > -1

						let currentScrollY = scrollY

						const cb = () => {
							let scrollOffset =
								popup.dataset.popupMode.split(':')[1]

							if (scrollOffset.indexOf('px') > -1) {
								scrollOffset = parseFloat(scrollOffset)
							}

							if (scrollOffset.toString().indexOf('%') > -1) {
								let body = document.body
								let html = document.documentElement

								let height = Math.max(
									body.scrollHeight,
									body.offsetHeight,
									html.clientHeight,
									html.scrollHeight,
									html.offsetHeight
								)

								scrollOffset =
									(parseFloat(scrollOffset) / 100) * height
							}

							if (scrollOffset.toString().indexOf('vh') > -1) {
								scrollOffset =
									(parseFloat(scrollOffset) / 100) *
									innerHeight
							}

							if (isUp) {
								if (scrollY > currentScrollY) {
									currentScrollY = scrollY
								} else {
									if (
										Math.abs(currentScrollY - scrollY) >
										scrollOffset
									) {
										openMicroPopup(popup)
										window.removeEventListener(
											'scroll',
											cb,
											true
										)
									}
								}
							} else {
								if (scrollOffset <= scrollY) {
									openMicroPopup(popup)
									window.removeEventListener(
										'scroll',
										cb,
										true
									)
								}
							}
						}

						window.addEventListener('scroll', cb, true)
					})
			}
		}

		;[...document.querySelectorAll('[href*="ct-popup-"]')].map(
			(popupTrigger) => {
				if (popupTrigger.hasClickListener) {
					return
				}

				if (
					!document.querySelector(popupTrigger.getAttribute('href'))
				) {
					return
				}

				popupTrigger.hasClickListener = true

				popupTrigger.addEventListener('click', (e) => {
					e.preventDefault()

					let popup = document.querySelector(
						popupTrigger.getAttribute('href')
					)

					openMicroPopup(popup)
				})
			}
		)
	},
})