From ba28ceaf099698e10b8c04cfd18418c80c4e6d96 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:59:11 +0000 Subject: [PATCH] feat: add info popovers to feed views - Added info buttons to Most Recent, Subscriptions, History, Channel Profile, Search, and Explore views - Attached popovers with descriptions of feed filtration methods - Used `attachFeedInfoPopover` helper for consistent implementation - Verified with Playwright script (verified popover visibility and text content) --- js/channelProfile.js | 9 ++++++ js/historyView.js | 8 +++++ js/searchView.js | 9 ++++++ js/viewManager.js | 24 ++++++++++++++ verification/feed_info.png | Bin 44209 -> 0 bytes verification/verify_feed_info.py | 54 ------------------------------- views/channel-profile.html | 26 ++++++++++++++- views/explore.html | 26 ++++++++++++++- views/history.html | 26 ++++++++++++++- views/most-recent-videos.html | 26 ++++++++++++++- views/search.html | 24 +++++++++++++- views/subscriptions.html | 26 ++++++++++++++- 12 files changed, 198 insertions(+), 60 deletions(-) delete mode 100644 verification/feed_info.png delete mode 100644 verification/verify_feed_info.py diff --git a/js/channelProfile.js b/js/channelProfile.js index 03995ff9..dd120ac7 100644 --- a/js/channelProfile.js +++ b/js/channelProfile.js @@ -64,6 +64,7 @@ import { openStaticModal } from "./ui/components/staticModalAccessibility.js"; import { setModalState as setGlobalModalState } from "./state/appState.js"; +import { attachFeedInfoPopover } from "./ui/components/FeedInfoPopover.js"; const getApp = () => getApplication(); @@ -3703,6 +3704,14 @@ export async function initChannelProfileView() { return; } + const infoTrigger = document.getElementById("channelInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Videos published by this creator." + ); + } + currentChannelHex = null; currentChannelNpub = null; currentChannelLightningAddress = ""; diff --git a/js/historyView.js b/js/historyView.js index 55dd102c..22392d73 100644 --- a/js/historyView.js +++ b/js/historyView.js @@ -19,6 +19,7 @@ import { } from "./ui/moderationUiHelpers.js"; import { buildModerationBadgeText } from "./ui/moderationCopy.js"; import { formatShortNpub } from "./utils/formatters.js"; +import { attachFeedInfoPopover } from "./ui/components/FeedInfoPopover.js"; export const WATCH_HISTORY_EMPTY_COPY = "Your watch history is empty. Watch some videos to populate this list."; @@ -2475,6 +2476,13 @@ export function createWatchHistoryRenderer(config = {}) { export const watchHistoryRenderer = createWatchHistoryRenderer(); export async function initHistoryView() { + const infoTrigger = document.getElementById("historyInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Chronological list of videos you have watched." + ); + } await watchHistoryRenderer.init(); } diff --git a/js/searchView.js b/js/searchView.js index 39912979..d0823291 100644 --- a/js/searchView.js +++ b/js/searchView.js @@ -7,6 +7,7 @@ import { escapeHTML } from "./utils/domUtils.js"; import { formatShortNpub } from "./utils/formatters.js"; import { sanitizeProfileMediaUrl } from "./utils/profileMedia.js"; import { devLogger } from "./utils/logger.js"; +import { attachFeedInfoPopover } from "./ui/components/FeedInfoPopover.js"; function getApp() { return getApplication(); @@ -86,6 +87,14 @@ export async function initSearchView() { titleEl.textContent = query ? `Search Results for "${query}"` : "Search Results"; } + const infoTrigger = document.getElementById("searchInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Results matching your search query." + ); + } + const channelList = document.getElementById("searchChannelList"); const videoList = document.getElementById("searchVideoList"); diff --git a/js/viewManager.js b/js/viewManager.js index c40443a2..210d5556 100644 --- a/js/viewManager.js +++ b/js/viewManager.js @@ -6,6 +6,7 @@ import { getApplication } from "./applicationContext.js"; import { ASSET_VERSION } from "../config/asset-version.js"; import { applyDesignSystemAttributes } from "./designSystem.js"; import { devLogger, userLogger } from "./utils/logger.js"; +import { attachFeedInfoPopover } from "./ui/components/FeedInfoPopover.js"; const TRACKING_SCRIPT_PATTERN = /(?:^|\/)tracking\.js(?:$|\?)/; @@ -92,6 +93,14 @@ export const viewInitRegistry = { if (refreshApp && typeof refreshApp.forceRefreshAllProfiles === "function") { refreshApp.forceRefreshAllProfiles(); } + + const infoTrigger = document.getElementById("recentInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Global chronological feed from all relays." + ); + } }, "for-you": () => { initForYouView(); @@ -110,6 +119,13 @@ export const viewInitRegistry = { }, explore: () => { devLogger.log("Explore view loaded."); + const infoTrigger = document.getElementById("exploreInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Coming soon." + ); + } }, history: async () => { try { @@ -130,6 +146,14 @@ export const viewInitRegistry = { subscriptions: async () => { devLogger.log("Subscriptions view loaded."); + const infoTrigger = document.getElementById("subscriptionsInfoTrigger"); + if (infoTrigger) { + attachFeedInfoPopover( + infoTrigger, + "Latest videos from channels you follow." + ); + } + const app = getApplication(); if (!app?.pubkey) { const container = document.getElementById("subscriptionsVideoList"); diff --git a/verification/feed_info.png b/verification/feed_info.png deleted file mode 100644 index 7a90fed1288f19f8c291833e0807047607bfdb52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44209 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 diff --git a/verification/verify_feed_info.py b/verification/verify_feed_info.py deleted file mode 100644 index 92274637..00000000 --- a/verification/verify_feed_info.py +++ /dev/null @@ -1,54 +0,0 @@ -import sys -import os -import time -from playwright.sync_api import sync_playwright - -def verify_feed_info(page): - print("Pre-seeding localStorage...") - page.goto("http://localhost:8000") # Go to root first to set storage origin - page.evaluate("window.localStorage.setItem('hasSeenDisclaimer', 'true')") - - print("Navigating to For You view...") - page.goto("http://localhost:8000/#view=for-you") - - print("Waiting for feed info trigger...") - trigger = page.locator("#feedInfoTrigger") - try: - trigger.wait_for(state="visible", timeout=10000) - except Exception: - page.screenshot(path="verification/debug_not_found.png") - raise - - # Ensure no modals are blocking - # We can try to force click or wait for potential overlays to disappear - # But pre-seeding should handle the main one. - - print("Clicking trigger...") - trigger.click() - - print("Waiting for popover...") - popover = page.locator(".popover-panel") - popover.wait_for(state="visible", timeout=5000) - - text = popover.inner_text() - print(f"Popover text: {text}") - - expected = "Most Recent Video - Disinterests Tags - Watch History + Interests Tags" - if expected not in text: - raise Exception(f"Unexpected text: {text}") - - page.screenshot(path="verification/feed_info.png") - print("Screenshot saved to verification/feed_info.png") - -if __name__ == "__main__": - with sync_playwright() as p: - browser = p.chromium.launch(headless=True) - context = browser.new_context() - page = context.new_page() - try: - verify_feed_info(page) - except Exception as e: - print(f"Error: {e}") - sys.exit(1) - finally: - browser.close() diff --git a/views/channel-profile.html b/views/channel-profile.html index 3d8d42e7..f4b55d4b 100644 --- a/views/channel-profile.html +++ b/views/channel-profile.html @@ -148,7 +148,31 @@
-

Videos by This User

+
+

Videos by This User

+ +
diff --git a/views/explore.html b/views/explore.html index 614149dd..2096436b 100644 --- a/views/explore.html +++ b/views/explore.html @@ -1,5 +1,29 @@
-

Explore

+
+

Explore

+ +

Coming Soon...

diff --git a/views/history.html b/views/history.html index ef2cd972..7bd4d2cd 100644 --- a/views/history.html +++ b/views/history.html @@ -5,7 +5,31 @@ class="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between" >
-

Watch History

+
+

Watch History

+ +

Review the videos you recently played, grouped by day.

diff --git a/views/most-recent-videos.html b/views/most-recent-videos.html index 178e9843..64f1e161 100644 --- a/views/most-recent-videos.html +++ b/views/most-recent-videos.html @@ -1,7 +1,31 @@
-

Recently Added Videos

+
+

Recently Added Videos

+ +
diff --git a/views/search.html b/views/search.html index cf605c44..6d69e0e5 100644 --- a/views/search.html +++ b/views/search.html @@ -1,11 +1,33 @@
-
+

Search Results

+
diff --git a/views/subscriptions.html b/views/subscriptions.html index 589dc40e..6f52db74 100644 --- a/views/subscriptions.html +++ b/views/subscriptions.html @@ -1,6 +1,30 @@
-

Subscriptions

+
+

Subscriptions

+ +