HEX
Server: LiteSpeed
System: Linux s3604.bom1.stableserver.net 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User: dmstechonline (1480)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/dmstechonline/businessclub.dmstech.online/wp-content/themes/rishi/js/offcanvasToggle.js
import submenuToggle from "./submenuToggle";
import setStyle from "./setStyle";

function offcanvasToggle() {

	const site = document.querySelector('.site-content');
	const offcanvas = document.querySelector('.rishi-offcanvas-drawer');
	const offcanvasBodies = document.querySelectorAll('.rishi-drawer-inner'); 
	const offcanvasToggles = [...new Set([
		...document.querySelectorAll('[href="#rishi-offcanvas"]'),
		...document.querySelectorAll('[aria-controls="rishi-offcanvas"]')
	])]

	if(!offcanvas) return;
	const firstFocus = offcanvas.querySelector('[aria-controls="rishi-offcanvas"]');

	let returnFocus;

	let isOffcanvasOpen;
	let isOffcanvasOpening;

	function resetOffcanvas() {
		offcanvas.setAttribute('aria-hidden', 'true');
		isOffcanvasOpen = false;
		isOffcanvasOpening = false;
	}

	resetOffcanvas();

	document.body.addEventListener('focus', e => {
		if (isOffcanvasOpen && !e.target.closest('.rishi-drawer-wrapper')) {
			firstFocus.focus()
		}
	}, { capture: true }
	)

	document.addEventListener('keydown', e => {
		if (isOffcanvasOpen && e.key === 'Escape') {
			closeOffcanvas();
		}
	}
	)

	document.addEventListener('click', e => {
		if (isOffcanvasOpen && e.target === offcanvas) {
			closeOffcanvas();
		}
	})

	offcanvasToggles.forEach(toggle => {
		toggle.setAttribute('aria-controls', 'rishi-offcanvas');
		function handleToggle(e) {
			e.preventDefault();
			if (!isOffcanvasOpening) {
				isOffcanvasOpen ? closeOffcanvas() : openOffcanvas();
			}
		};

		toggle.addEventListener('click', handleToggle);
		if (toggle.hasAttribute('href')) {
			toggle.addEventListener('keydown', e => {
				if (e.key === 'Enter' || e.key === ' ') {
					handleToggle(e);
				}
			})
		}
	})

	function openOffcanvas() {
		isOffcanvasOpen = true;
		returnFocus = document.activeElement;
		window.requestAnimationFrame(() => {
			offcanvasToggles.forEach(toggle => {
				toggle.setAttribute('aria-expanded', 'true');
			});
			setStyle(document.body, { overflow: 'hidden' })
			setStyle(site, { 'pointer-events': 'none' })
			offcanvas.setAttribute('aria-hidden', 'false')
		})
	}

	function closeOffcanvas() {
		isOffcanvasOpen = false;
		window.requestAnimationFrame(() => {
			offcanvasToggles.forEach(toggle => {
				toggle.setAttribute('aria-expanded', 'false');
			});
			setStyle(document.body, { overflow: false })
			setStyle(site, { 'pointer-events': false })
			offcanvas.setAttribute('aria-hidden', 'true')
			returnFocus.focus();
		})
	}

	offcanvasBodies.forEach(offcanvasBody => {
		offcanvasBody.addEventListener('click', e => {
			if(offcanvas.getAttribute('aria-hidden') === 'true') return;
	
			const toggleBtn = e.target.closest('.submenu-toggle')
			if( toggleBtn) {
				e.preventDefault()
				e.stopPropagation()
				submenuToggle(toggleBtn.closest('.menu-item-has-children'))
			}
		})
	})
}

export default offcanvasToggle;