130 lines
4.1 KiB
JavaScript
130 lines
4.1 KiB
JavaScript
document.addEventListener("DOMContentLoaded", () => {
|
|
let activateTimeout = null;
|
|
let timeoutWarning = null;
|
|
let currentPageLoad = null;
|
|
let safetyTimeout = null; // Timeout de sécurité pour éviter que le loader reste bloqué
|
|
|
|
/**
|
|
* Active le loader et le rend visible
|
|
* Affiche un message d'annulation après 8 secondes
|
|
*/
|
|
window.showLoader = function() {
|
|
const loader = document.getElementById("loader-overlay");
|
|
if (!loader) return; // Protection : si l'élément n'existe pas, on ne fait rien
|
|
|
|
const timeoutMessage = document.getElementById("timeout-message");
|
|
const errorMessage = document.getElementById("error-message");
|
|
|
|
// Nettoyer les timeouts précédents
|
|
clearTimeout(activateTimeout);
|
|
clearTimeout(timeoutWarning);
|
|
|
|
// Réinitialiser l'affichage
|
|
if (errorMessage) errorMessage.style.display = "none";
|
|
if (timeoutMessage) timeoutMessage.style.display = "none";
|
|
loader.classList.remove("hidden");
|
|
|
|
// Afficher le loader après 500ms (évite le flash sur les chargements rapides)
|
|
activateTimeout = setTimeout(() => {
|
|
if (loader && !loader.classList.contains("hidden")) {
|
|
loader.classList.add("active");
|
|
}
|
|
}, 500);
|
|
|
|
// Afficher le message de timeout après 8 secondes
|
|
timeoutWarning = setTimeout(() => {
|
|
if (loader && loader.classList.contains("active") && !loader.classList.contains("hidden")) {
|
|
if (timeoutMessage) {
|
|
timeoutMessage.style.display = "block";
|
|
}
|
|
}
|
|
}, 8000);
|
|
|
|
// Protection : cacher automatiquement le loader après 30 secondes maximum
|
|
// Au cas où hideLoader ne serait jamais appelé (page qui ne charge pas, erreur, etc.)
|
|
if (safetyTimeout) clearTimeout(safetyTimeout);
|
|
safetyTimeout = setTimeout(() => {
|
|
if (loader && !loader.classList.contains("hidden")) {
|
|
hideLoader();
|
|
}
|
|
}, 30000); // 30 secondes max
|
|
};
|
|
|
|
/**
|
|
* Désactive et cache le loader
|
|
*/
|
|
window.hideLoader = function() {
|
|
const loader = document.getElementById("loader-overlay");
|
|
if (!loader) return; // Protection : si l'élément n'existe pas, on ne fait rien
|
|
|
|
const timeoutMessage = document.getElementById("timeout-message");
|
|
|
|
clearTimeout(activateTimeout);
|
|
clearTimeout(timeoutWarning);
|
|
if (safetyTimeout) {
|
|
clearTimeout(safetyTimeout);
|
|
safetyTimeout = null;
|
|
}
|
|
|
|
loader.classList.remove("active");
|
|
if (timeoutMessage) timeoutMessage.style.display = "none";
|
|
|
|
setTimeout(() => {
|
|
if (loader) {
|
|
loader.classList.add("hidden");
|
|
}
|
|
}, 500);
|
|
};
|
|
|
|
/**
|
|
* Affiche un message d'erreur dans le loader
|
|
* @param {string} msg - Message d'erreur à afficher
|
|
*/
|
|
window.showError = function(msg) {
|
|
const errorMessage = document.getElementById("error-message");
|
|
const timeoutMessage = document.getElementById("timeout-message");
|
|
|
|
if (!errorMessage) return; // Protection : si l'élément n'existe pas, on ne fait rien
|
|
|
|
clearTimeout(activateTimeout);
|
|
clearTimeout(timeoutWarning);
|
|
|
|
if (timeoutMessage) timeoutMessage.style.display = "none";
|
|
|
|
errorMessage.textContent = msg;
|
|
errorMessage.style.display = "block";
|
|
};
|
|
|
|
/**
|
|
* Annule le chargement en cours et cache le loader
|
|
*/
|
|
const cancelLoadingLink = document.getElementById("cancel-loading-link");
|
|
if (cancelLoadingLink) {
|
|
cancelLoadingLink.addEventListener("click", () => {
|
|
// Annuler le chargement de la page en cours si possible
|
|
if (currentPageLoad && currentPageLoad.abort) {
|
|
currentPageLoad.abort();
|
|
}
|
|
|
|
hideLoader();
|
|
|
|
// Afficher une notification discrète
|
|
if (typeof M !== 'undefined' && M.toast) {
|
|
M.toast({
|
|
html: 'Chargement annulé',
|
|
classes: 'rounded grey darken-3',
|
|
displayLength: 2500
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Permet de stocker l'abort controller du chargement en cours
|
|
* @param {AbortController} controller - Controller de la requête fetch
|
|
*/
|
|
window.setCurrentPageLoad = function(controller) {
|
|
currentPageLoad = controller;
|
|
};
|
|
});
|