import { useEffect } from "react"; import { AlertTriangle, Check, ShieldCheck, X, Youtube } from "lucide-react"; import 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". // 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 .

); } function Dots({ index, total }: { index: number; total: number }) { return (
{Array.from({ length: total }).map((_, i) => ( ))}
); } export default function OnboardingWizard({ me, onClose }: { me: Me; onClose: () => void }) { // Closing without finishing the essential read step suppresses future auto-popups // (it stays reachable from Settings). Once read is granted, closing is just "done". const close = () => { endOnboarding(!me.can_read); onClose(); }; useEffect(() => { function onKey(e: KeyboardEvent) { if (e.key === "Escape") close(); } document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); // eslint-disable-next-line react-hooks/exhaustive-deps }, [me.can_read]); const step = !me.can_read ? "read" : !me.can_write ? "write" : "done"; const stepIndex = step === "read" ? 0 : step === "write" ? 1 : 2; return (
{step === "read" && ( <>

Connect your YouTube subscriptions

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.

)} {step === "write" && ( <>

You're connected

Your feed is ready. Optionally, you can let Siftlode{" "} 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.

)} {step === "done" && ( <>

All set

Read and unsubscribe access are both granted. You can review or revoke either one anytime in Settings → Account, or from your Google Account.

)}
); }