Files
thalim-theme/js/infiniteScroll.js
2026-05-12 23:33:46 +02:00

72 lines
2.7 KiB
JavaScript

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