document.addEventListener('DOMContentLoaded', function () { var sentinel = document.getElementById('scroll-sentinel'); var grid = document.getElementById('post-grid'); var spinner = document.getElementById('scroll-spinner'); if (!sentinel || !grid) return; var page = 1; var loading = false; var done = false; // Read filter params from sentinel data attributes (set server-side) var categoryId = sentinel.dataset.category || ''; var axe = sentinel.dataset.axe || ''; var dateFrom = sentinel.dataset.dateFrom || ''; var dateTo = sentinel.dataset.dateTo || ''; var taxonomy = sentinel.dataset.taxonomy || ''; var termId = sentinel.dataset.term || ''; var catFilter = sentinel.dataset.filterCat || ''; var filterAutres = sentinel.dataset.filterAutres || ''; var excludeCats = sentinel.dataset.excludeCats || ''; var searchQuery = sentinel.dataset.search || ''; function fetchPosts() { if (loading || done) return; loading = true; page++; spinner.style.display = 'flex'; var data = new FormData(); data.append('action', 'load_more_posts'); data.append('page', page); data.append('nonce', infiniteScrollData.nonce); data.append('lang', infiniteScrollData.lang || 'fr'); if (categoryId) data.append('category', categoryId); if (axe) data.append('axe', axe); if (dateFrom) data.append('date_from', dateFrom); if (dateTo) data.append('date_to', dateTo); if (taxonomy) data.append('taxonomy', taxonomy); if (termId) data.append('term', termId); if (catFilter) data.append('filter_cat', catFilter); if (filterAutres) data.append('filter_autres', filterAutres); if (excludeCats) data.append('exclude_cats', excludeCats); if (searchQuery) data.append('search', searchQuery); fetch(infiniteScrollData.ajaxUrl, { method: 'POST', body: data }) .then(function (response) { return response.json(); }) .then(function (result) { spinner.style.display = 'none'; if (result.success && result.data.html) { grid.insertAdjacentHTML('beforeend', result.data.html); loading = false; } else { done = true; observer.disconnect(); } }) .catch(function () { spinner.style.display = 'none'; loading = false; }); } var observer = new IntersectionObserver(function (entries) { if (entries[0].isIntersecting) { fetchPosts(); } }, { rootMargin: '200px' }); observer.observe(sentinel); });