import { useEffect, useRef } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { AlertTriangle, Check, Loader2, RefreshCw, ShieldCheck, X, Youtube } from "lucide-react"; import { api, type Me } from "../lib/api"; import { beginGrant, endOnboarding } from "../lib/onboarding"; // A first-login wizard that walks the user through granting YouTube access one scope at a // time, each with a plain explanation and an up-front heads-up about Google's "unverified // app" screen. Sign-in itself only asks for name/email (no warning); YouTube access is // always an explicit, informed opt-in here. // // The visible step is derived from what's already granted, so the wizard resumes correctly // after each redirect: no read -> "read", read but no write -> "write", both -> "done". // Right after read is granted, it auto-imports the user's subscriptions so they land on a // populated feed (channels already in the shared catalog appear instantly). // A small reusable heads-up so the Google consent warning never feels like a surprise. function ConsentHeadsUp() { return (
Google will show a "Google hasn't verified this app"{" "} screen — that's expected, because Siftlode hasn't gone through Google's full review. It's safe to continue: click Advanced →{" "} Go to Siftlode. You can revoke access anytime from your{" "} Google Account .
You're signed in. To build your feed, Siftlode needs{" "} read-only access to the channels you're subscribed to on YouTube. It never posts, deletes, or changes anything with this.
Importing your YouTube subscriptions. Channels already in Siftlode show up instantly; any new ones fill in automatically in the background.
> )} {step === "write" && !importing && ( <>{importSubs.isError ? ( <>Your YouTube account is connected, but importing subscriptions failed — you can retry from Settings → Sync. > ) : ( <> Your feed is ready {myStatus.data ? ` (${myStatus.data.channels_total} channels)` : ""}. Optionally, let Siftlode{" "} > )} {!importSubs.isError && ( <> unsubscribe from channels on YouTube for you — this needs an extra write permission. Skip it to stay read-only; you can always enable it later in Settings. > )}
{importSubs.isError && ( )}Read and unsubscribe access are both granted. You can review or revoke either one anytime in Settings → Account, or from your Google Account.
> )}