From d287defc66535a5ad9b2c976b9eff6e3555f15ee Mon Sep 17 00:00:00 2001 From: npeter83 Date: Sun, 14 Jun 2026 06:36:12 +0200 Subject: [PATCH] feat(onboarding): auto-import subscriptions after read grant + empty-feed guidance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After read access is granted the wizard now imports the user's YouTube subscriptions automatically (with a "Building your feed…" progress state), so a new user lands on a populated feed — channels already in the shared catalog show up instantly, new ones backfill in the background. The empty feed now prompts users without read access to set up via the wizard instead of a bare message. --- frontend/src/App.tsx | 8 +- frontend/src/components/Feed.tsx | 24 ++++- frontend/src/components/OnboardingWizard.tsx | 101 +++++++++++++++++-- 3 files changed, 122 insertions(+), 11 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b5d5b59..9e2f382 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -179,7 +179,13 @@ export default function App() { ) : page === "stats" && meQuery.data!.role === "admin" ? ( ) : ( - + setWizardOpen(true)} + /> )} diff --git a/frontend/src/components/Feed.tsx b/frontend/src/components/Feed.tsx index b7d7a35..b29955d 100644 --- a/frontend/src/components/Feed.tsx +++ b/frontend/src/components/Feed.tsx @@ -26,10 +26,14 @@ export default function Feed({ filters, setFilters, view, + canRead, + onOpenWizard, }: { filters: FeedFilters; setFilters: (f: FeedFilters) => void; view: "grid" | "list"; + canRead: boolean; + onOpenWizard: () => void; }) { const [overrides, setOverrides] = useState>({}); const [activeVideo, setActiveVideo] = useState