// Fetch and display feeds async function fetchFeeds() { try { const response = await fetch('/feeds'); if (response.ok) { const feeds = await response.json(); return feeds; } else { console.error('Failed to load feeds:', response.status); return null; } } catch (error) { console.error('Error loading feeds:', error); return null; } } // Close any open feed menus function closeAllFeedMenus() { document.querySelectorAll('.feed-menu.show').forEach(menu => { menu.classList.remove('show'); }); } // Add click handler to close menus when clicking outside document.addEventListener('click', (e) => { if (!e.target.closest('.feed-menu') && !e.target.closest('.feed-menu-button')) { closeAllFeedMenus(); } }); function renderFeedItem(feed) { const name = document.createElement('span'); name.className = 'feed-name'; name.textContent = feed.name; name.onclick = async () => { try { const response = await fetch(`/poll/${feed.feed_id}`, { method: 'POST' }); if (response.ok) { const data = await response.json(); console.log('Feed poll response:', data); } else { console.error('Failed to poll feed:', response.status); } } catch (error) { console.error('Error polling feed:', error); } }; const menuButton = document.createElement('button'); menuButton.className = 'feed-menu-button'; menuButton.innerHTML = '⋮'; menuButton.title = 'Feed options'; menuButton.onclick = (e) => { e.stopPropagation(); closeAllFeedMenus(); menu.classList.toggle('show'); }; const menu = document.createElement('div'); menu.className = 'feed-menu'; const deleteItem = document.createElement('a'); deleteItem.className = 'feed-menu-item delete'; deleteItem.textContent = 'Remove Feed'; deleteItem.onclick = async (e) => { e.stopPropagation(); if (confirm(`Are you sure you want to delete "${feed.name}"?`)) { try { const response = await fetch(`/feeds/${feed.feed_id}`, { method: 'DELETE', }); if (response.ok) { handleFeeds(); } else { console.error('Failed to delete feed:', response.status); } } catch (error) { console.error('Error deleting feed:', error); } } menu.classList.remove('show'); }; menu.appendChild(deleteItem); name.appendChild(menuButton); name.appendChild(menu); return name; } async function handleFeeds() { const feeds = await fetchFeeds(); const feedList = document.getElementById('feedList'); if (feeds) { feedList.innerHTML = ''; if (feeds.length === 0) { const emptyMessage = document.createElement('div'); emptyMessage.className = 'feed-empty'; emptyMessage.textContent = 'No feeds added yet'; feedList.appendChild(emptyMessage); } else { feeds.forEach(feed => { feedList.appendChild(renderFeedItem(feed)); }); } } else { feedList.innerHTML = '