// scripts/ui.js -- FINAL VERSION const BACKEND_URL = 'https://streamai-backend-v2.smplushypermedia.workers.dev'; // --- Helper Functions --- const getElement = (id) => document.getElementById(id); function showNotification(message, isError = false) { const container = getElement('notification'); if (!container) return; const bgColor = isError ? 'bg-red-500' : 'bg-green-500'; container.innerHTML = `

${message}

`; container.classList.add('show'); setTimeout(() => { container.classList.remove('show'); }, 4000); } // --- Card Rendering --- function createListingCard(item) { const card = document.createElement('div'); const pinnedClass = item.is_pinned ? 'border-2 border-indigo-400' : 'shadow-md'; card.className = `stream-card bg-white rounded-lg overflow-hidden hover:shadow-xl transition duration-300 p-4 relative ${pinnedClass}`; card.innerHTML = ` ${item.is_pinned ? '
Pinned
' : ''}

${item.title}

From: ${item.source_name}

${item.description || ''}

${(item.category || '').replace('_', ' ')}Visit Site
`; return card; } // --- Core Logic --- async function loadRecommendations() { const container = getElement('recommendations-container'); if (!container) return; try { const response = await fetch(`${BACKEND_URL}/api/recommendations`); if (!response.ok) throw new Error(`Network Error: ${response.statusText}`); const listings = await response.json(); container.innerHTML = ''; if (listings.length === 0) { container.innerHTML = `

No recommendations available yet.

`; return; } listings.forEach(item => container.appendChild(createListingCard(item))); } catch (error) { container.innerHTML = `

Could not load recommendations.

`; } } async function handleFormSubmit(event) { event.preventDefault(); const form = event.target; const submitButton = getElement('submit-listing-btn'); submitButton.disabled = true; submitButton.textContent = 'Submitting...'; const listingData = Object.fromEntries(new FormData(form).entries()); try { const response = await fetch(`${BACKEND_URL}/api/add-listing`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(listingData), }); const result = await response.json(); if (!response.ok) throw new Error(result.details || 'Submission failed.'); showNotification('Success! Your recommendation has been added.'); const newCard = createListingCard(listingData); getElement('recommendations-container').prepend(newCard); getElement('form-container').classList.add('hidden'); getElement('form-chevron').classList.remove('rotate-180'); form.reset(); } catch (error) { showNotification(`Error: ${error.message}`, true); } finally { submitButton.disabled = false; submitButton.textContent = 'Submit Listing'; } } // --- Initialization --- export function initUI() { const addListingForm = getElement('add-listing-form'); const toggleBtn = getElement('toggle-form-btn'); const formContainer = getElement('form-container'); const chevron = getElement('form-chevron'); if (toggleBtn && formContainer && chevron) { toggleBtn.addEventListener('click', () => { formContainer.classList.toggle('hidden'); chevron.classList.toggle('rotate-180'); }); } if (addListingForm) { addListingForm.addEventListener('submit', handleFormSubmit); } loadRecommendations(); }