feat(onboarding): auto-import subscriptions after read grant + empty-feed guidance
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.
This commit is contained in:
parent
4b3bb897b5
commit
51f859fd5a
3 changed files with 122 additions and 11 deletions
|
|
@ -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<Record<string, string>>({});
|
||||
const [activeVideo, setActiveVideo] = useState<Video | null>(null);
|
||||
|
|
@ -125,8 +129,26 @@ export default function Feed({
|
|||
|
||||
if (query.isLoading) return <div className="p-8 text-muted">Loading feed…</div>;
|
||||
if (query.isError) return <div className="p-8 text-muted">Couldn't load the feed.</div>;
|
||||
if (items.length === 0)
|
||||
if (items.length === 0) {
|
||||
if (!canRead)
|
||||
return (
|
||||
<div className="p-8 grid place-items-center text-center">
|
||||
<div className="max-w-sm">
|
||||
<h2 className="text-lg font-semibold">Your feed is empty</h2>
|
||||
<p className="text-sm text-muted mt-2 mb-4">
|
||||
Connect your YouTube account to import your subscriptions and build your feed.
|
||||
</p>
|
||||
<button
|
||||
onClick={onOpenWizard}
|
||||
className="inline-flex items-center justify-center gap-2 px-5 py-2.5 rounded-xl font-semibold bg-accent text-accent-fg hover:opacity-90 transition"
|
||||
>
|
||||
Set up my feed
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
return <div className="p-8 text-muted">No videos match these filters.</div>;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="p-4">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue