| 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 — Shipping Toggle + Pickup Modal
* Доставка / Самовывоз на странице корзины
*
* Зависимости: jQuery, matreshkaShipping (wp_localize_script)
*/
(function ($) {
'use strict';
if (typeof matreshkaShipping === 'undefined') return;
var isProcessing = false;
/* ──────────────────────────────────────────
* Init — bind all events (call on load + re-init)
* ────────────────────────────────────────── */
function init() {
bindToggle();
bindModal();
bindStoreItems();
}
/* ── Toggle Delivery ↔ Pickup ────────────── */
function bindToggle() {
$(document).off('click.mshipping', '.shipping-toggle-btn')
.on('click.mshipping', '.shipping-toggle-btn', function () {
if (isProcessing) return;
var method = $(this).data('method');
if ($(this).hasClass('active')) return;
$('.shipping-toggle-btn').removeClass('active');
$(this).addClass('active');
if (method === 'delivery') {
$('.shipping-pickup-info').hide();
$('.shipping-delivery-info').show();
} else {
$('.shipping-delivery-info').hide();
$('.shipping-pickup-info').show();
}
sendShippingChoice(method);
});
}
/* ══════════════════════════════════════════
* Pickup Store Modal
* ══════════════════════════════════════════ */
function bindModal() {
/* Open modal */
$(document).off('click.mshipping', '#btn-pickup-store-modal')
.on('click.mshipping', '#btn-pickup-store-modal', function (e) {
e.preventDefault();
openPickupModal();
});
/* Close — ✕ button */
$(document).off('click.mshipping', '#pickup-modal-close')
.on('click.mshipping', '#pickup-modal-close', function () {
closePickupModal();
});
/* Close — overlay click */
$(document).off('click.mshipping', '#pickup-modal-overlay')
.on('click.mshipping', '#pickup-modal-overlay', function () {
closePickupModal();
});
/* Done — Готово */
$(document).off('click.mshipping', '#pickup-modal-done')
.on('click.mshipping', '#pickup-modal-done', function () {
var $modal = $(this).closest('.pickup-modal');
var $active = $modal.find('.pickup-store-item.active');
if ($active.length) {
var address = $active.find('.pickup-store-address').text().trim();
var storeIndex = $active.find('input[name="matreshka_pickup_store"]').val();
$('#pickup-store-selected-address').text(address);
sendShippingChoice('pickup', storeIndex);
}
closePickupModal();
});
/* Escape key */
$(document).off('keydown.mshipping-modal')
.on('keydown.mshipping-modal', function (e) {
if (e.key === 'Escape' && $('#pickup-modal').hasClass('open')) {
closePickupModal();
}
});
}
function openPickupModal() {
$('#pickup-modal-overlay').addClass('open');
$('#pickup-modal').addClass('open');
$('body').css('overflow', 'hidden');
}
function closePickupModal() {
$('#pickup-modal-overlay').removeClass('open');
$('#pickup-modal').removeClass('open');
$('body').css('overflow', '');
}
/* ── Store item radio select inside modal ── */
function bindStoreItems() {
$(document).off('click.mshipping', '.pickup-store-item')
.on('click.mshipping', '.pickup-store-item', function () {
var $radio = $(this).find('input[type="radio"]');
$radio.prop('checked', true);
var $modal = $(this).closest('.pickup-modal');
$modal.find('.pickup-store-item').removeClass('active');
$(this).addClass('active');
});
$(document).off('change.mshipping', '.pickup-store-item input[type="radio"]')
.on('change.mshipping', '.pickup-store-item input[type="radio"]', function () {
var $modal = $(this).closest('.pickup-modal');
$modal.find('.pickup-store-item').removeClass('active');
$(this).closest('.pickup-store-item').addClass('active');
});
}
/* ──────────────────────────────────────────
* AJAX — set shipping method + store
* ────────────────────────────────────────── */
function sendShippingChoice(method, storeIndex) {
isProcessing = true;
$('.shipping-toggle-btn').css('opacity', 0.6);
var data = {
action: 'matreshka_set_shipping',
nonce: matreshkaShipping.nonce,
method: method
};
if (method === 'pickup') {
if (storeIndex === undefined) {
storeIndex = $('#pickup-modal input[name="matreshka_pickup_store"]:checked').val();
}
data.store_index = storeIndex !== undefined ? storeIndex : 0;
}
$.post(matreshkaShipping.ajaxurl, data).done(function (resp) {
if (resp.success && resp.data) {
// Update total price from AJAX response
if (resp.data.total_html) {
var $total = $('#matreshka-cart-total');
if ($total.length) {
$total.html(resp.data.total_html);
}
}
// Re-render checkout fragments so the selected method remains in sync.
if ($('form.checkout').length) {
$(document.body).trigger('update_checkout');
}
}
}).always(function () {
isProcessing = false;
$('.shipping-toggle-btn').css('opacity', 1);
});
}
/* ──────────────────────────────────────────
* Re-init after WC replaces DOM content
* ────────────────────────────────────────── */
$(document.body).on('updated_cart_totals updated_checkout', function () {
init();
});
/* ── First run ───────────────────────────── */
init();
})(jQuery);