TEST FIX debounce
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Nonimart 2026-01-13 15:37:11 +01:00
parent d6ac561bfd
commit fb476e8c0e

View File

@ -9,18 +9,45 @@ export default function filterArticlesInit() {
const sortBySelect = toolbar.querySelector('select[name="sort_by"]') as HTMLSelectElement; const sortBySelect = toolbar.querySelector('select[name="sort_by"]') as HTMLSelectElement;
const rechercheInput = toolbar.querySelector('.search-bar input') as HTMLInputElement; const rechercheInput = toolbar.querySelector('.search-bar input') as HTMLInputElement;
// Évite les courses: annule les requêtes précédentes et ignore les réponses obsolètes
let currentAbortController: AbortController | null = null;
let lastRequestId = 0;
// Debounce simple pour la recherche
function debounce<T extends (...args: any[]) => void>(fn: T, waitMs: number) {
let timeoutId: number | undefined;
return (...args: Parameters<T>) => {
if (timeoutId) window.clearTimeout(timeoutId);
timeoutId = window.setTimeout(() => fn(...args), waitMs);
};
}
async function hydrateArticles() { async function hydrateArticles() {
const etiquetteValue = etiquettesSelect.value; const etiquetteValue = etiquettesSelect?.value ?? '';
const auteurValue = auteursSelect.value; const auteurValue = auteursSelect?.value ?? '';
const sortByValue = sortBySelect.value; const sortByValue = sortBySelect?.value ?? '';
const rechercheValue = rechercheInput.value; const rechercheValue = rechercheInput?.value ?? '';
const params = new URLSearchParams({
etiquette: etiquetteValue,
auteur: auteurValue,
sort_by: sortByValue,
recherche: rechercheValue,
});
const url = `/wp-json/dynamiques-datas/v1/build/${currentPostType}?${params.toString()}`;
// Annule la précédente et prépare un nouvel identifiant
if (currentAbortController) currentAbortController.abort();
currentAbortController = new AbortController();
const requestId = ++lastRequestId;
try { try {
const response = await fetch( const response = await fetch(url, { signal: currentAbortController.signal });
`/wp-json/dynamiques-datas/v1/build/${currentPostType}?etiquette=${etiquetteValue}&auteur=${auteurValue}&sort_by=${sortByValue}&recherche=${rechercheValue}` if (!response.ok) throw new Error(`HTTP ${response.status}`);
);
const data = await response.json(); const data = await response.json();
console.log(data);
// Ignore si une requête plus récente a été envoyée
if (requestId !== lastRequestId) return;
const articlesContainer = document.querySelector('.post-grid__list'); const articlesContainer = document.querySelector('.post-grid__list');
if (!articlesContainer) return; if (!articlesContainer) return;
@ -28,10 +55,13 @@ export default function filterArticlesInit() {
updatePostCount(data.post_count); updatePostCount(data.post_count);
} catch (error) { } catch (error) {
if ((error as any)?.name === 'AbortError') return;
console.error('Erreur lors de la récupération des articles:', error); console.error('Erreur lors de la récupération des articles:', error);
} }
} }
const hydrateArticlesDebounced = debounce(hydrateArticles, 250);
function resetCurrentFilters() { function resetCurrentFilters() {
if (!etiquettesSelect || !auteursSelect || !rechercheInput) return; if (!etiquettesSelect || !auteursSelect || !rechercheInput) return;
@ -57,7 +87,7 @@ export default function filterArticlesInit() {
e.preventDefault(); e.preventDefault();
setFilterByActivebutton(button as HTMLButtonElement); setFilterByActivebutton(button as HTMLButtonElement);
resetCurrentFilters(); resetCurrentFilters();
hydrateArticles(); hydrateArticles(); // immédiat sur action explicite
}); });
}); });
} }
@ -65,15 +95,15 @@ export default function filterArticlesInit() {
// Écouter les changements sur les selects // Écouter les changements sur les selects
if (postGridToolbarActions) { if (postGridToolbarActions) {
postGridToolbarActions.addEventListener('change', (e) => { postGridToolbarActions.addEventListener('change', (e) => {
hydrateArticles(); hydrateArticles(); // immédiat sur selects
}); });
} }
sortBySelect.addEventListener('change', (e) => { sortBySelect.addEventListener('change', (e) => {
hydrateArticles(); hydrateArticles(); // immédiat pour le tri
}); });
rechercheInput.addEventListener('input', (e) => { rechercheInput.addEventListener('input', (e) => {
hydrateArticles(); hydrateArticlesDebounced(); // debounce pour la saisie rapide
}); });
// Initialiser le filtrage par boutons // Initialiser le filtrage par boutons