| Server IP : 104.171.130.249 / Your IP : 216.73.216.146 Web Server : nginx/1.25.5 System : Linux 0dac65491b7e 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 User : root ( 0) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/html/wp-content/themes/matreshka/assets/js/ |
Upload File : |
/**
* Matreshka — Checkout Order Loader
* Красивый оверлей с обратным отсчётом при оформлении заказа
*
* Зависимости: jQuery
*/
(function ($) {
'use strict';
var COUNTDOWN_SECONDS = 5;
var overlay = null;
var interval = null;
var progressTimeout = null;
/* ── Build overlay DOM ────────────────────── */
function buildOverlay() {
if ($('#matreshka-checkout-loader').length) return;
var html =
'<div id="matreshka-checkout-loader" class="matreshka-checkout-loader">' +
'<div class="mcl-spinner">' +
'<div class="mcl-spinner-ring"></div>' +
'<svg class="mcl-spinner-icon" viewBox="0 -960 960 960" focusable="false" aria-hidden="true">' +
'<path fill="currentColor" d="M240-80q-33 0-56.5-23.5T160-160v-480q0-33 23.5-56.5T240-720h80q0-66 47-113t113-47q66 0 113 47t47 113h80q33 0 56.5 23.5T800-640v480q0 33-23.5 56.5T720-80H240Zm0-80h480v-480h-80v80q0 17-11.5 28.5T600-520q-17 0-28.5-11.5T560-560v-80H400v80q0 17-11.5 28.5T360-520q-17 0-28.5-11.5T320-560v-80h-80v480Zm160-560h160q0-33-23.5-56.5T480-800q-33 0-56.5 23.5T400-720Z" />' +
'</svg>' +
'</div>' +
'<div class="mcl-text">' +
'<p class="mcl-title">Создаём ваш заказ</p>' +
'<p class="mcl-subtitle">Пожалуйста, подождите…</p>' +
'<p class="mcl-countdown">Осталось <span class="mcl-seconds">' + COUNTDOWN_SECONDS + '</span> сек</p>' +
'<div class="mcl-progress"><div class="mcl-progress-bar"></div></div>' +
'</div>' +
'</div>';
$('body').append(html);
overlay = $('#matreshka-checkout-loader');
}
/* ── Show loader ──────────────────────────── */
function showLoader() {
buildOverlay();
var remaining = COUNTDOWN_SECONDS;
var $seconds = overlay.find('.mcl-seconds');
var $bar = overlay.find('.mcl-progress-bar');
// Activate overlay
overlay.addClass('active');
// Start progress bar animation
progressTimeout = setTimeout(function () {
$bar.css('width', '100%');
}, 50);
// Countdown
$seconds.text(remaining);
interval = setInterval(function () {
remaining--;
if (remaining <= 0) {
$seconds.text('0');
clearInterval(interval);
interval = null;
return;
}
$seconds.text(remaining);
}, 1000);
}
/* ── Hide loader ──────────────────────────── */
function hideLoader() {
if (interval) { clearInterval(interval); interval = null; }
if (progressTimeout) { clearTimeout(progressTimeout); progressTimeout = null; }
if (overlay) {
overlay.removeClass('active');
}
}
function isCheckoutFormValid() {
var form = $('form.checkout').get(0);
return !form || form.checkValidity();
}
/* ── Bind to place-order submit ───────────── */
$(function () {
// Build overlay on page load so it's ready
buildOverlay();
// WooCommerce fires checkout_place_order before AJAX submit
$('form.checkout').on('checkout_place_order', function () {
// Small delay to let WooCommerce validate first
setTimeout(function () {
// Only show if no validation errors visible
if (isCheckoutFormValid() && $('.woocommerce-error').length === 0 && $('.woocommerce-NoticeGroup-checkout').length === 0) {
showLoader();
}
}, 300);
});
// Also catch direct click on our submit button (fallback)
$(document).on('click', '#place_order', function () {
setTimeout(function () {
if (isCheckoutFormValid() && $('.woocommerce-error').length === 0 && $('.woocommerce-NoticeGroup-checkout').length === 0) {
showLoader();
}
}, 400);
});
// Hide on checkout error (WooCommerce triggers this)
$(document.body).on('checkout_error', function () {
hideLoader();
});
// Hide when WooCommerce AJAX completes with error
$(document).ajaxComplete(function (event, xhr) {
try {
var data = JSON.parse(xhr.responseText);
if (data && data.result === 'failure') {
hideLoader();
}
} catch (e) { /* not JSON, ignore */ }
});
});
})(jQuery);