From 916d6fdb63ace941e95c6bac4cfccb7ad7876f9b Mon Sep 17 00:00:00 2001 From: Will Chen Date: Thu, 9 Oct 2025 13:27:16 -0700 Subject: [PATCH] Show onboarding banner to link to YT video & do not show release note on first-time (#1490) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary by cubic Adds an onboarding banner in Setup that links to a 3-minute YouTube intro and dismisses after click. Also avoids showing release notes on a user’s first launch. - **New Features** - Added OnboardingBanner component with YouTube thumbnail and play icon. - Opens the video via IpcClient and hides the banner after click. - Integrated into SetupBanner with local visibility state. - **Bug Fixes** - Don’t show release notes on first run to prevent spam. --- > [!NOTE] > Adds a dismissible onboarding banner linking to a YouTube intro and changes release notes to appear only on app updates, not first run. > > - **UI/Onboarding**: > - **`src/components/home/OnboardingBanner.tsx`**: New banner component with YouTube thumbnail/play icon; opens intro video via `IpcClient.openExternalUrl`; hides itself on click. > - **`src/components/SetupBanner.tsx`**: Integrates `OnboardingBanner` with `isOnboardingVisible` state; tweaks header typography (`font-medium`). > - **Release Notes Behavior**: > - **`src/pages/home.tsx`**: Only shows release notes when upgrading (checks existing `settings.lastShownReleaseNotesVersion` before opening modal); preserves themed URL handling. > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 832e70f87b3b6a7e8b8b921fe8c6ceb15198cce0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). --- src/components/SetupBanner.tsx | 10 ++++- src/components/home/OnboardingBanner.tsx | 56 ++++++++++++++++++++++++ src/pages/home.tsx | 6 +++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/components/home/OnboardingBanner.tsx diff --git a/src/components/SetupBanner.tsx b/src/components/SetupBanner.tsx index f1c3495..7042e09 100644 --- a/src/components/SetupBanner.tsx +++ b/src/components/SetupBanner.tsx @@ -30,6 +30,7 @@ import { useLanguageModelProviders } from "@/hooks/useLanguageModelProviders"; import { useScrollAndNavigateTo } from "@/hooks/useScrollAndNavigateTo"; // @ts-ignore import logo from "../../assets/logo.svg"; +import { OnboardingBanner } from "./home/OnboardingBanner"; type NodeInstallStep = | "install" @@ -40,6 +41,7 @@ type NodeInstallStep = export function SetupBanner() { const posthog = usePostHog(); const navigate = useNavigate(); + const [isOnboardingVisible, setIsOnboardingVisible] = useState(true); const { isAnyProviderSetup, isLoading: loading } = useLanguageModelProviders(); const [nodeSystemInfo, setNodeSystemInfo] = useState( @@ -147,7 +149,13 @@ export function SetupBanner() { return ( <> -

Setup Dyad

+

+ Setup Dyad +

+
void; +}) => { + if (!isVisible) return null; + + return ( + // + ); +}; diff --git a/src/pages/home.tsx b/src/pages/home.tsx index 71dce8f..2f3879c 100644 --- a/src/pages/home.tsx +++ b/src/pages/home.tsx @@ -62,9 +62,15 @@ export default function HomePage() { settings && settings.lastShownReleaseNotesVersion !== appVersion ) { + const shouldShowReleaseNotes = !!settings.lastShownReleaseNotesVersion; await updateSettings({ lastShownReleaseNotesVersion: appVersion, }); + // It feels spammy to show release notes if it's + // the users very first time. + if (!shouldShowReleaseNotes) { + return; + } try { const result = await IpcClient.getInstance().doesReleaseNoteExist({