personnal/ecole/public/js/loader.js

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;
};
});