dealhub/resources/js/interaction.js
kusowl f33f68cd3e feat(user interaction): add favorite interaction
- refactor controller to handle favorite
- show like count and update when liked a deal
- maintain like and favorite state with server
2026-01-16 14:30:24 +05:30

59 lines
1.5 KiB
JavaScript

async function like(button, id) {
// Instant feedback for user
let likeBtns = button.querySelectorAll('.like');
let likeBadge = document.getElementById("likeBadge".concat(id));
toggleHidden(likeBtns);
// Check if user liked the deal
let isLiked = button.classList.contains('liked');
updateLikeCount(likeBadge, isLiked ? -1 : 1) ;
button.classList.toggle('liked')
try {
let response = await axios.post('/like/' + id);
if (response.status !== 200) {
// Revert the ui
toggleHidden(likeBtns);
}
} catch (e) {
toggleHidden(likeBtns);
console.error(e);
}
}
async function favorite(e, id) {
// Instant feedback for user
let favoriteBtns = e.querySelectorAll('.favorite');
toggleHidden(favoriteBtns);
try {
let response = await axios.post('/favorite/' + id);
if (response.status !== 200) {
// Revert the ui
toggleHidden(favoriteBtns);
}
} catch (e) {
toggleHidden(favoriteBtns);
console.error(e);
}
}
function toggleHidden(nodelist) {
nodelist.forEach((node) => node.classList.toggle('hidden'))
}
function updateLikeCount(badge, change){
try{
let likeCount = Math.max(parseInt( badge.dataset.count) + change, 0)
badge.querySelector('p').innerText = likeCount;
badge.dataset.count = likeCount.toString();
}
catch(e) {
console.error(e);
}
}
document.like = like;
document.favorite = favorite;