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;