dealhub/resources/js/interaction.js
2026-01-21 19:11:10 +05:30

143 lines
3.8 KiB
JavaScript

import { showToast } from "./toast.js";
import { showReportModal } from "@/report-deal.js";
/* =========================
ACTION HANDLERS
========================= */
export async function like(button, id) {
if (button.dataset.loading) return;
button.dataset.loading = 'true';
const likeBtns = button.querySelectorAll('.like');
const likeBadge = document.getElementById(`likeBadge${id}`);
toggleHidden(likeBtns);
const isLiked = button.classList.contains('liked');
updateLikeCount(likeBadge, isLiked ? -1 : 1);
button.classList.toggle('liked');
try {
const response = await axios.post(`/like/${id}`);
if (response.status !== 200) {
showToast(response.data.message);
toggleHidden(likeBtns);
button.classList.toggle('liked');
updateLikeCount(likeBadge, isLiked ? 1 : -1);
} else {
showToast(response.data.message);
}
} catch (e) {
showToast(e?.response?.data?.message || 'Something went wrong');
toggleHidden(likeBtns);
button.classList.toggle('liked');
updateLikeCount(likeBadge, isLiked ? 1 : -1);
console.error(e);
} finally {
delete button.dataset.loading;
}
}
export async function favorite(button, id) {
if (button.dataset.loading) return;
button.dataset.loading = 'true';
const favoriteBtns = button.querySelectorAll('.favorite');
toggleHidden(favoriteBtns);
try {
const response = await axios.post(`/favorite/${id}`);
if (response.status !== 200) {
showToast(response.data.message);
toggleHidden(favoriteBtns);
} else {
showToast(response.data.message);
}
} catch (e) {
showToast(e?.response?.data?.message || 'Something went wrong');
toggleHidden(favoriteBtns);
console.error(e);
} finally {
delete button.dataset.loading;
}
}
export function redirect(url, id) {
window.open(url, '_blank');
const redirectBadge = document.getElementById(`redirectBadge${id}`);
updateRedirectCount(redirectBadge, 1);
}
/* =========================
EVENT DELEGATION (🔥 FIX)
========================= */
document.addEventListener('click', async (e) => {
const button = e.target.closest('button');
if (!button) return;
const dealCard = button.closest('.deal-card');
if (!dealCard) return;
const dealId = dealCard.dataset.dealId;
const dealTitle =
dealCard.querySelector('.action-toolbar')?.dataset.dealTitle;
if (button.classList.contains('likeBtn')) {
await like(button, dealId);
}
if (button.classList.contains('favoriteBtn')) {
await favorite(button, dealId);
}
if (button.classList.contains('reportBtn')) {
showReportModal(dealId, dealTitle);
}
});
/* =========================
HELPERS
========================= */
function toggleHidden(nodes) {
nodes.forEach(node => node.classList.toggle('hidden'));
}
function updateLikeCount(badge, change) {
if (!badge) return;
try {
const count = Math.max(
parseInt(badge.dataset.count || '0') + change,
0
);
badge.querySelector('p').innerText = count;
badge.dataset.count = count.toString();
} catch (e) {
console.error(e);
}
}
function updateRedirectCount(badge, change) {
if (!badge) return;
try {
const count = Math.max(
parseInt(badge.dataset.count || '0') + change,
0
);
badge.querySelector('p').innerText = count;
badge.dataset.count = count.toString();
} catch (e) {
console.error(e);
}
}
/* =========================
GLOBAL (if needed)
========================= */
window.redirect = redirect;