Files
dostavka_vodi/wp-content/themes/twentytwentyfour/assets/js/test1-landing.js
2026-04-19 16:50:40 +03:00

217 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const mobileToggle = document.getElementById('mobileToggle')
const mobilePanel = document.getElementById('mobilePanel')
const modalBackdrop = document.getElementById('orderModal')
const modalCloseButton = document.getElementById('modalCloseButton')
const orderButtons = document.querySelectorAll('[data-open-order]')
const faqItems = document.querySelectorAll('.faq-item')
const orderForm = document.getElementById('orderForm')
const contactForm = document.getElementById('contactForm')
const orderItemsField = document.getElementById('orderItemsField')
const orderSuccess = document.getElementById('orderSuccess')
const contactSuccess = document.getElementById('contactSuccess')
const modalCard = modalBackdrop?.querySelector('.modal-card')
let lastModalTrigger = null
const getFocusableElements = container => {
if (!container) {
return []
}
return Array.from(container.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])'))
.filter(element => !element.hasAttribute('hidden') && !element.closest('[hidden]'))
}
const focusFirstElement = container => {
const [first] = getFocusableElements(container)
if (first) {
first.focus()
}
}
const openMobileMenu = () => {
if (!mobilePanel || !mobileToggle) {
return
}
mobilePanel.classList.add('active')
mobileToggle.setAttribute('aria-expanded', 'true')
document.body.classList.add('menu-open')
}
const closeMobileMenu = () => {
if (!mobilePanel || !mobileToggle) {
return
}
mobilePanel.classList.remove('active')
mobileToggle.setAttribute('aria-expanded', 'false')
document.body.classList.remove('menu-open')
}
const openModal = triggerElement => {
if (!modalBackdrop) {
return
}
lastModalTrigger = triggerElement || document.activeElement
if (orderItemsField) {
orderItemsField.value = ''
}
modalBackdrop.classList.add('open')
modalBackdrop.setAttribute('aria-hidden', 'false')
document.body.classList.add('modal-open')
focusFirstElement(modalCard)
}
const closeModal = () => {
if (!modalBackdrop) {
return
}
const shouldRestoreFocus = modalBackdrop.classList.contains('open')
modalBackdrop.classList.remove('open')
modalBackdrop.setAttribute('aria-hidden', 'true')
document.body.classList.remove('modal-open')
if (shouldRestoreFocus && lastModalTrigger && typeof lastModalTrigger.focus === 'function') {
lastModalTrigger.focus()
}
lastModalTrigger = null
}
const submitLeadForm = (formElement, successElement, formType, onSuccess) => {
if (!formElement || !successElement) {
return
}
formElement.addEventListener('submit', async event => {
event.preventDefault()
const leadFormConfig = window.test1LeadForm || null
if (!leadFormConfig?.ajaxUrl || !leadFormConfig?.action || !leadFormConfig?.nonce) {
window.alert('Форма временно недоступна. Обновите страницу и попробуйте снова.')
return
}
const formData = new window.FormData(formElement)
formData.append('action', leadFormConfig.action)
formData.append('nonce', leadFormConfig.nonce)
formData.append('form_type', formType)
formData.append('page_url', window.location.href)
try {
const response = await window.fetch(leadFormConfig.ajaxUrl, {
method: 'POST',
credentials: 'same-origin',
body: formData,
})
const payload = await response.json().catch(() => null)
if (!response.ok || !payload?.success) {
throw new Error('submit_failed')
}
successElement.classList.add('visible')
if (typeof onSuccess === 'function') {
onSuccess()
}
setTimeout(() => {
formElement.reset()
successElement.classList.remove('visible')
}, 2200)
} catch (error) {
window.alert('Не удалось отправить заявку. Попробуйте еще раз.')
}
})
}
if (mobileToggle && mobilePanel) {
mobileToggle.addEventListener('click', () => {
const isOpen = mobilePanel.classList.contains('active')
if (isOpen) {
closeMobileMenu()
return
}
openMobileMenu()
})
document.querySelectorAll('.mobile-nav a').forEach(link => {
link.addEventListener('click', closeMobileMenu)
})
}
orderButtons.forEach(button => {
button.addEventListener('click', () => openModal(button))
})
if (modalCloseButton) {
modalCloseButton.addEventListener('click', closeModal)
}
if (modalBackdrop) {
modalBackdrop.addEventListener('click', event => {
if (event.target === modalBackdrop) {
closeModal()
}
})
}
faqItems.forEach(item => {
const trigger = item.querySelector('.faq-question')
const answer = item.querySelector('.faq-answer')
if (!trigger || !answer) {
return
}
trigger.addEventListener('click', () => {
const isOpen = item.classList.contains('open')
faqItems.forEach(entry => {
const entryTrigger = entry.querySelector('.faq-question')
const entryAnswer = entry.querySelector('.faq-answer')
entry.classList.remove('open')
entryTrigger?.setAttribute('aria-expanded', 'false')
if (entryAnswer) {
entryAnswer.hidden = true
}
})
if (!isOpen) {
item.classList.add('open')
trigger.setAttribute('aria-expanded', 'true')
answer.hidden = false
}
})
})
submitLeadForm(orderForm, orderSuccess, 'landing_order', () => {
setTimeout(() => {
closeModal()
}, 700)
})
submitLeadForm(contactForm, contactSuccess, 'landing_contacts')
document.addEventListener('keydown', event => {
if (event.key !== 'Escape') {
return
}
closeModal()
closeMobileMenu()
})