Files
wyczarujprezent.pl/modules/dpdshipping/views/js/dpdshipping-pudo-swipbox-iframe.js
2026-02-02 10:46:49 +01:00

204 lines
8.2 KiB
JavaScript

/*
* Copyright 2024 DPD Polska Sp. z o.o.
*
* NOTICE OF LICENSE
*
* Licensed under the EUPL-1.2 or later.
* You may not use this work except in compliance with the Licence.
*
* You may obtain a copy of the Licence at:
* https://joinup.ec.europa.eu/software/page/eupl
* It is also bundled with this package in the file LICENSE.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the Licence is distributed on an AS IS basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions
* and limitations under the Licence.
*
* @author DPD Polska Sp. z o.o.
* @copyright 2024 DPD Polska Sp. z o.o.
* @license https://joinup.ec.europa.eu/software/page/eupl
*/
// noinspection JSUnresolvedReference
console.log('[DPD SwipBox] Skrypt załadowany');
if (typeof dpsShippingSwipBoxEventCreated == 'undefined') {
var dpsShippingSwipBoxEventCreated = false;
}
if (typeof dpsShippingSwipBoxIframeCreated == 'undefined') {
var dpsShippingSwipBoxIframeCreated = false;
}
/**
* Tworzy iframe dla mapy SwipBox - wywoływane przy otwieraniu modala
*/
function dpsShippingSwipBoxCreateIframe() {
console.log('[DPD SwipBox] Próba utworzenia iframe...');
// Sprawdź czy iframe już istnieje
if (document.getElementById("dpdshipping-widget-pudo-swipbox-iframe")) {
console.log('[DPD SwipBox] Iframe już istnieje');
return true;
}
// Walidacja: sprawdź czy URL iframe jest zdefiniowany
if (typeof dpdshipping_iframe_swipbox_url === 'undefined' || !dpdshipping_iframe_swipbox_url) {
console.error('[DPD SwipBox] Błąd: dpdshipping_iframe_swipbox_url nie jest zdefiniowany lub jest pusty');
console.error('[DPD SwipBox] Dostępne zmienne:', {
dpdshipping_iframe_swipbox_url: typeof dpdshipping_iframe_swipbox_url !== 'undefined' ? dpdshipping_iframe_swipbox_url : 'UNDEFINED',
dpdshipping_id_pudo_swipbox_carrier: typeof dpdshipping_id_pudo_swipbox_carrier !== 'undefined' ? dpdshipping_id_pudo_swipbox_carrier : 'UNDEFINED'
});
return false;
}
// Walidacja: sprawdź czy element docelowy istnieje
var dpsShippingSwipBox_script = document.getElementById("dpdshipping-widget-pudo-swipbox");
if (!dpsShippingSwipBox_script) {
console.error('[DPD SwipBox] Błąd: Nie znaleziono elementu #dpdshipping-widget-pudo-swipbox');
return false;
}
var dpsShippingSwipBox_iframe = document.createElement("iframe");
dpsShippingSwipBox_iframe.setAttribute("id", "dpdshipping-widget-pudo-swipbox-iframe");
dpsShippingSwipBox_iframe.setAttribute("allow", "geolocation");
dpsShippingSwipBox_iframe.style.width = "100%";
dpsShippingSwipBox_iframe.style.border = "none";
dpsShippingSwipBox_iframe.style.minHeight = "400px";
dpsShippingSwipBox_iframe.style.height = "768px";
// Obsługa błędów ładowania iframe
dpsShippingSwipBox_iframe.onerror = function() {
console.error('[DPD SwipBox] Błąd ładowania iframe');
};
dpsShippingSwipBox_iframe.onload = function() {
console.log('[DPD SwipBox] Iframe załadowany pomyślnie');
};
// Ustaw src
dpsShippingSwipBox_iframe.src = dpdshipping_iframe_swipbox_url;
dpsShippingSwipBox_script.parentNode.insertBefore(dpsShippingSwipBox_iframe, dpsShippingSwipBox_script);
console.log('[DPD SwipBox] Iframe dodany do DOM, URL:', dpdshipping_iframe_swipbox_url);
// Eksportuj iframe do globalnego scope
window.dpsShippingSwipBox_iframe = dpsShippingSwipBox_iframe;
dpsShippingSwipBoxIframeCreated = true;
return true;
}
// Obserwator DOM - czeka na pojawienie się elementu
function dpsShippingSwipBoxObserveDOM() {
// Sprawdź czy element już istnieje
if (document.getElementById("dpdshipping-widget-pudo-swipbox")) {
console.log('[DPD SwipBox] Element znaleziony w DOM');
dpsShippingSwipBoxCreateIframe();
return;
}
// Jeśli nie ma, obserwuj zmiany w DOM
if (typeof MutationObserver !== 'undefined') {
console.log('[DPD SwipBox] Uruchamiam MutationObserver...');
var observer = new MutationObserver(function(mutations) {
if (document.getElementById("dpdshipping-widget-pudo-swipbox")) {
console.log('[DPD SwipBox] Element pojawił się w DOM (MutationObserver)');
observer.disconnect();
dpsShippingSwipBoxCreateIframe();
}
});
observer.observe(document.body, { childList: true, subtree: true });
// Timeout - zatrzymaj obserwację po 30 sekundach
setTimeout(function() {
observer.disconnect();
}, 30000);
}
}
// Próba utworzenia iframe przy DOMContentLoaded
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
console.log('[DPD SwipBox] DOMContentLoaded');
dpsShippingSwipBoxObserveDOM();
});
} else {
// DOM już załadowany
console.log('[DPD SwipBox] DOM już załadowany');
dpsShippingSwipBoxObserveDOM();
}
// Dodatkowa próba przy otwieraniu modala - nasłuchuj na zdarzenia modala
$(document).ready(function() {
console.log('[DPD SwipBox] jQuery ready');
// Nasłuchuj na otwieranie modala
$(document).on('click', '.dpdshipping-pudo-swipbox-open-map-btn, .dpdshipping-pudo-swipbox-change-map-btn', function() {
console.log('[DPD SwipBox] Kliknięto przycisk otwierania mapy');
// Sprawdź ponownie po kliknięciu
setTimeout(function() {
console.log('[DPD SwipBox] Sprawdzam element po kliknięciu...');
console.log('[DPD SwipBox] Modal:', document.getElementById('dpdshippingPudoSwipBoxModal'));
console.log('[DPD SwipBox] Script element:', document.getElementById('dpdshipping-widget-pudo-swipbox'));
dpsShippingSwipBoxCreateIframe();
}, 200);
});
// Nasłuchuj na zdarzenie show modala (Bootstrap)
$(document).on('show.bs.modal shown.bs.modal', '#dpdshippingPudoSwipBoxModal', function() {
console.log('[DPD SwipBox] Modal pokazywany (Bootstrap event)');
dpsShippingSwipBoxCreateIframe();
});
});
// Event listener dla wiadomości z iframe
if (!dpsShippingSwipBoxEventCreated) {
var dpsShippingSwipBox_eventListener = window[window.addEventListener ? "addEventListener" : "attachEvent"];
var dpsShippingSwipBox_messageEvent = ("attachEvent" === dpsShippingSwipBox_eventListener) ? "onmessage" : "message";
dpsShippingSwipBox_eventListener(dpsShippingSwipBox_messageEvent, function (a) {
if (typeof getDpdshippingIdPudoSwipBoxCarrier !== 'function' || typeof getDpdshippingSelectedCarrier !== 'function') {
return;
}
if (getDpdshippingIdPudoSwipBoxCarrier() === getDpdshippingSelectedCarrier()) {
var iframe = window.dpsShippingSwipBox_iframe || document.getElementById("dpdshipping-widget-pudo-swipbox-iframe");
if (a.data && a.data.height && !isNaN(a.data.height)) {
if (iframe) {
iframe.style.height = a.data.height + "px";
}
} else if (a.data && a.data.point_id) {
dpdShippingSwipBoxPointSelected(a.data.point_id);
}
}
}, !1);
dpsShippingSwipBoxEventCreated = true;
}
function dpdShippingSwipBoxPointSelected(pudoSwipBoxe) {
if (!pudoSwipBoxe) {
console.error('[DPD SwipBox] Błąd: Brak ID punktu');
return;
}
$('.container_dpdshipping_pudo_swipbox_error').css("display", "none");
$('.dpdshipping-pudo-swipbox-new-point').css("display", "none");
$('.dpdshipping-pudo-swipbox-selected-point').css("display", "block");
if (typeof dpdshippingSavePudoCode === 'function') {
dpdshippingSavePudoCode(pudoSwipBoxe, $('#dpdshippingPudoSwipBoxModal'));
} else {
console.error('[DPD SwipBox] Funkcja dpdshippingSavePudoCode nie jest dostępna');
}
if (typeof dpdshippingGetPudoAddress === 'function') {
dpdshippingGetPudoAddress(pudoSwipBoxe, $('.dpdshipping-swipbox-selected-point'));
} else {
console.error('[DPD SwipBox] Funkcja dpdshippingGetPudoAddress nie jest dostępna');
}
console.log('[DPD SwipBox] Wybrano punkt:', pudoSwipBoxe);
}