diff --git a/apps/x/apps/main/src/oauth-handler.ts b/apps/x/apps/main/src/oauth-handler.ts index 33a190a8..b38a42d2 100644 --- a/apps/x/apps/main/src/oauth-handler.ts +++ b/apps/x/apps/main/src/oauth-handler.ts @@ -286,6 +286,8 @@ export async function disconnectProvider(provider: string): Promise<{ success: b try { const oauthRepo = getOAuthRepo(); await oauthRepo.delete(provider); + // Notify renderer so sidebar, voice, and billing re-check state + emitOAuthEvent({ provider, success: false }); return { success: true }; } catch (error) { console.error('OAuth disconnect failed:', error); diff --git a/apps/x/apps/renderer/src/components/connectors-popover.tsx b/apps/x/apps/renderer/src/components/connectors-popover.tsx index d4d9d046..254a4331 100644 --- a/apps/x/apps/renderer/src/components/connectors-popover.tsx +++ b/apps/x/apps/renderer/src/components/connectors-popover.tsx @@ -422,10 +422,10 @@ export function ConnectorsPopover({ children, tooltip, open: openProp, onOpenCha } }, [open, providers, refreshAllStatuses]) - // Listen for OAuth completion events + // Listen for OAuth state change events (connect + disconnect) useEffect(() => { const cleanup = window.ipc.on('oauth:didConnect', async (event) => { - const { provider, success, error } = event + const { provider, success } = event setProviderStates(prev => ({ ...prev, @@ -464,9 +464,9 @@ export function ConnectorsPopover({ children, tooltip, open: openProp, onOpenCha // Refresh status to ensure consistency refreshAllStatuses() - } else { - toast.error(error || `Failed to connect to ${provider}`) } + // Note: error toasts for failed connections are handled by startConnect/handleConnect. + // Disconnect events (success: false) are handled by handleDisconnect which shows its own toast. }) return cleanup diff --git a/apps/x/apps/renderer/src/components/onboarding/steps/welcome-step.tsx b/apps/x/apps/renderer/src/components/onboarding/steps/welcome-step.tsx index 4bd4a366..9a660507 100644 --- a/apps/x/apps/renderer/src/components/onboarding/steps/welcome-step.tsx +++ b/apps/x/apps/renderer/src/components/onboarding/steps/welcome-step.tsx @@ -1,4 +1,4 @@ -import { Loader2, CheckCircle2, Brain, Plug, ShieldCheck } from "lucide-react" +import { Loader2, CheckCircle2 } from "lucide-react" import { motion } from "motion/react" import { Button } from "@/components/ui/button" import type { OnboardingState } from "../use-onboarding-state" @@ -7,24 +7,6 @@ interface WelcomeStepProps { state: OnboardingState } -const features = [ - { - icon: Brain, - label: "Memory", - desc: "Builds a knowledge graph from your work", - }, - { - icon: Plug, - label: "Connected", - desc: "Syncs email, calendar, and meetings", - }, - { - icon: ShieldCheck, - label: "Private", - desc: "Your data stays local on your machine", - }, -] - export function WelcomeStep({ state }: WelcomeStepProps) { const rowboatState = state.providerStates['rowboat'] || { isConnected: false, isLoading: false, isConnecting: false } @@ -35,10 +17,10 @@ export function WelcomeStep({ state }: WelcomeStepProps) { initial={{ opacity: 0, scale: 0.8 }} animate={{ opacity: 1, scale: 1 }} transition={{ duration: 0.5, ease: [0.16, 1, 0.3, 1] }} - className="relative mb-6" + className="relative mb-8" > -
- Rowboat +
+ Rowboat {/* Tagline badge */} @@ -65,35 +47,16 @@ export function WelcomeStep({ state }: WelcomeStepProps) { initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ delay: 0.3 }} - className="text-base text-muted-foreground leading-relaxed max-w-sm mb-8" + className="text-base text-muted-foreground leading-relaxed max-w-sm mb-10" > - Connect your Rowboat account for instant access to all models through our gateway — no API keys needed. + Rowboat connects to your work, builds a knowledge graph, and uses that context to help you get things done. Private and on your machine. - {/* Feature highlights */} -
- {features.map((f, i) => ( - -
- -
- {f.label} - {f.desc} -
- ))} -
- {/* Sign in / connected state */} {rowboatState.isConnected ? ( @@ -143,7 +106,7 @@ export function WelcomeStep({ state }: WelcomeStepProps) {