diff --git a/src/components/onboarding/FirstRunModal.tsx b/src/components/onboarding/FirstRunModal.tsx index 7315cba..cd07643 100644 --- a/src/components/onboarding/FirstRunModal.tsx +++ b/src/components/onboarding/FirstRunModal.tsx @@ -2,20 +2,41 @@ import { useState, useEffect, type CSSProperties } from 'react'; import { createPortal } from 'react-dom'; -import { isFirstRun, markFirstRunComplete } from '@/services/storage/apiKeys'; import { openExternalUrl } from '@/utils/openExternalUrl'; +const FIRST_RUN_DISMISSED_KEY = 'ra-h-os.first-run.dismissed.v1'; + export default function FirstRunModal() { const [isOpen, setIsOpen] = useState(false); useEffect(() => { - if (isFirstRun()) { - setIsOpen(true); - } + let cancelled = false; + + void (async () => { + try { + const response = await fetch('/api/settings/openai-key'); + if (!response.ok) return; + + const data = await response.json(); + if (cancelled) return; + + const dismissed = window.localStorage.getItem(FIRST_RUN_DISMISSED_KEY) === 'true'; + setIsOpen(!data.configured && !dismissed); + } catch { + if (!cancelled) { + const dismissed = window.localStorage.getItem(FIRST_RUN_DISMISSED_KEY) === 'true'; + setIsOpen(!dismissed); + } + } + })(); + + return () => { + cancelled = true; + }; }, []); const handleClose = () => { - markFirstRunComplete(); + window.localStorage.setItem(FIRST_RUN_DISMISSED_KEY, 'true'); setIsOpen(false); }; diff --git a/src/services/storage/openaiKeyServer.ts b/src/services/storage/openaiKeyServer.ts index 89edfdc..5cf730c 100644 --- a/src/services/storage/openaiKeyServer.ts +++ b/src/services/storage/openaiKeyServer.ts @@ -26,12 +26,9 @@ export function getPreferredOpenAiKey(): string | undefined { const fileKey = parseOpenAiKeyFromEnvFile(fs.readFileSync(envPath, 'utf8')); if (fileKey) return fileKey; } catch { - // Ignore missing/unreadable .env.local and fall back to process env. + // Ignore missing/unreadable .env.local and treat that as "not configured" for local mode. } - - const envKey = process.env.OPENAI_API_KEY; - if (!envKey || envKey === PLACEHOLDER) return undefined; - return envKey; + return undefined; } export function hasPreferredOpenAiKey(): boolean {