From d438ff62ad8ba890fbab5380785b723ed25afd34 Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Fri, 13 Feb 2026 20:47:45 -0800 Subject: feat(vanilla): implement read/star toggle and filtering (NK-d4c8jv) --- vanilla/app.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- vanilla/style.css | 39 ++++++++++++++++++++++- 2 files changed, 126 insertions(+), 5 deletions(-) diff --git a/vanilla/app.js b/vanilla/app.js index d1b2337..048a446 100644 --- a/vanilla/app.js +++ b/vanilla/app.js @@ -15,13 +15,18 @@ async function fetchFeeds() { } } -async function fetchItems(feedId = null) { +async function fetchItems(feedId = null, filter = null) { const listEl = document.getElementById('entries-list'); listEl.innerHTML = '
Loading items...
'; let url = '/api/stream/'; - if (feedId) { - url += `?feed_id=${feedId}`; + const params = new URLSearchParams(); + if (feedId) params.append('feed_id', feedId); + if (filter === 'unread') params.append('read_filter', 'unread'); + if (filter === 'starred') params.append('starred', 'true'); + + if ([...params].length > 0) { + url += '?' + params.toString(); } try { @@ -43,11 +48,35 @@ function renderFeeds(feeds) { allLink.className = 'feed-item'; allLink.textContent = 'All Items'; allLink.onclick = () => { + document.querySelectorAll('.feed-item').forEach(el => el.classList.remove('active')); + allLink.classList.add('active'); document.getElementById('feed-title').textContent = 'All Items'; fetchItems(); }; nav.appendChild(allLink); + const unreadLink = document.createElement('div'); + unreadLink.className = 'feed-item'; + unreadLink.textContent = 'Unread Items'; + unreadLink.onclick = () => { + document.querySelectorAll('.feed-item').forEach(el => el.classList.remove('active')); + unreadLink.classList.add('active'); + document.getElementById('feed-title').textContent = 'Unread Items'; + fetchItems(null, 'unread'); + }; + nav.appendChild(unreadLink); + + const starredLink = document.createElement('div'); + starredLink.className = 'feed-item'; + starredLink.textContent = 'Starred Items'; + starredLink.onclick = () => { + document.querySelectorAll('.feed-item').forEach(el => el.classList.remove('active')); + starredLink.classList.add('active'); + document.getElementById('feed-title').textContent = 'Starred Items'; + fetchItems(null, 'starred'); + }; + nav.appendChild(starredLink); + feeds.forEach(feed => { const div = document.createElement('div'); div.className = 'feed-item'; @@ -80,7 +109,11 @@ function renderItems(items) { article.innerHTML = `
- ${item.title} +
+ + +
+ ${item.title}