143 lines
3.8 KiB
JavaScript
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;
|