42 lines
1.7 KiB
JavaScript
42 lines
1.7 KiB
JavaScript
// reactions.js — toggle réactions via fetch, fallback formulaire natif
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
document.querySelectorAll('.reaction-form').forEach(function (form) {
|
|
form.addEventListener('submit', function (e) {
|
|
e.preventDefault();
|
|
|
|
var btn = form.querySelector('.reaction-btn');
|
|
var type = form.querySelector('[name="type"]').value;
|
|
var uuid = form.querySelector('[name="uuid"]').value;
|
|
var badge = form.querySelector('.reaction-count');
|
|
var active = btn.classList.contains('btn-primary');
|
|
|
|
var data = new URLSearchParams();
|
|
data.append('uuid', uuid);
|
|
data.append('type', type);
|
|
data.append('_ajax', '1');
|
|
|
|
fetch('/react', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
body: data.toString(),
|
|
})
|
|
.then(function (r) { return r.json(); })
|
|
.then(function (json) {
|
|
if (!json.ok) { form.submit(); return; }
|
|
|
|
var nowActive = json.active;
|
|
btn.classList.toggle('btn-primary', nowActive);
|
|
btn.classList.toggle('btn-outline-secondary', !nowActive);
|
|
if (badge) {
|
|
badge.classList.toggle('bg-light', nowActive);
|
|
badge.classList.toggle('text-primary', nowActive);
|
|
badge.classList.toggle('bg-secondary', !nowActive);
|
|
badge.textContent = json.count;
|
|
}
|
|
})
|
|
.catch(function () { form.submit(); });
|
|
});
|
|
});
|
|
});
|