// Response Wall JavaScript let currentCampaignSlug = null; let currentOffset = 0; let currentSort = 'recent'; let currentLevel = ''; const LIMIT = 20; // Initialize document.addEventListener('DOMContentLoaded', () => { console.log('Response Wall: Initializing...'); // Get campaign slug from URL if present const urlParams = new URLSearchParams(window.location.search); currentCampaignSlug = urlParams.get('campaign'); console.log('Campaign slug:', currentCampaignSlug); if (!currentCampaignSlug) { showError('No campaign specified'); return; } // Load initial data loadResponseStats(); loadResponses(true); // Set up event listeners document.getElementById('sort-select').addEventListener('change', (e) => { currentSort = e.target.value; loadResponses(true); }); document.getElementById('level-filter').addEventListener('change', (e) => { currentLevel = e.target.value; loadResponses(true); }); const submitBtn = document.getElementById('submit-response-btn'); console.log('Submit button found:', !!submitBtn); if (submitBtn) { submitBtn.addEventListener('click', () => { console.log('Submit button clicked'); openSubmitModal(); }); } // Use event delegation for empty state button since it's dynamically shown document.addEventListener('click', (e) => { if (e.target.id === 'empty-state-submit-btn') { console.log('Empty state button clicked'); openSubmitModal(); } }); const modalCloseBtn = document.getElementById('modal-close-btn'); if (modalCloseBtn) { modalCloseBtn.addEventListener('click', closeSubmitModal); } const cancelBtn = document.getElementById('cancel-submit-btn'); if (cancelBtn) { cancelBtn.addEventListener('click', closeSubmitModal); } const loadMoreBtn = document.getElementById('load-more-btn'); if (loadMoreBtn) { loadMoreBtn.addEventListener('click', loadMoreResponses); } const form = document.getElementById('submit-response-form'); if (form) { form.addEventListener('submit', handleSubmitResponse); } console.log('Response Wall: Initialization complete'); }); // Load response statistics async function loadResponseStats() { try { const response = await fetch(`/api/campaigns/${currentCampaignSlug}/response-stats`); const data = await response.json(); if (data.success) { document.getElementById('stat-total-responses').textContent = data.stats.totalResponses; document.getElementById('stat-verified').textContent = data.stats.verifiedResponses; document.getElementById('stat-upvotes').textContent = data.stats.totalUpvotes; document.getElementById('stats-banner').style.display = 'flex'; } } catch (error) { console.error('Error loading stats:', error); } } // Load responses async function loadResponses(reset = false) { if (reset) { currentOffset = 0; document.getElementById('responses-container').innerHTML = ''; } showLoading(true); try { const params = new URLSearchParams({ sort: currentSort, level: currentLevel, offset: currentOffset, limit: LIMIT }); const response = await fetch(`/api/campaigns/${currentCampaignSlug}/responses?${params}`); const data = await response.json(); showLoading(false); if (data.success && data.responses.length > 0) { renderResponses(data.responses); // Show/hide load more button if (data.pagination.hasMore) { document.getElementById('load-more-container').style.display = 'block'; } else { document.getElementById('load-more-container').style.display = 'none'; } } else if (reset) { showEmptyState(); } } catch (error) { showLoading(false); showError('Failed to load responses'); console.error('Error loading responses:', error); } } // Render responses function renderResponses(responses) { const container = document.getElementById('responses-container'); responses.forEach(response => { const card = createResponseCard(response); container.appendChild(card); }); } // Create response card element function createResponseCard(response) { const card = document.createElement('div'); card.className = 'response-card'; card.dataset.responseId = response.id; const createdDate = new Date(response.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); let badges = `${escapeHtml(response.representative_level)}`; badges += `${escapeHtml(response.response_type)}`; if (response.is_verified) { badges = `✓ Verified` + badges; } let submittedBy = 'Anonymous'; if (!response.is_anonymous && response.submitted_by_name) { submittedBy = escapeHtml(response.submitted_by_name); } let userCommentHtml = ''; if (response.user_comment) { userCommentHtml = `