diff --git a/frontend/components/chat/ai-setup-notice.tsx b/frontend/components/chat/ai-setup-notice.tsx new file mode 100644 index 0000000..6856339 --- /dev/null +++ b/frontend/components/chat/ai-setup-notice.tsx @@ -0,0 +1,71 @@ +"use client"; + +import { Sparkles, X } from "lucide-react"; +import Link from "next/link"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { Button } from "@/components/ui/button"; +import { getAiConfig } from "@/lib/ai-settings"; + +// A single, dismissible heads-up shown above the chat input on a fresh chat when +// no AI provider is configured yet (no API key, and no local Ollama). It only +// renders on the empty state, so it naturally disappears once a message is sent. +export function AiSetupNotice() { + const { t } = useTranslation(); + const [needsSetup, setNeedsSetup] = useState(false); + const [dismissed, setDismissed] = useState(false); + + useEffect(() => { + let active = true; + getAiConfig() + .then((cfg) => { + if (!active) return; + // Configured = an API key for any provider, or a local Ollama endpoint. + const hasApiKey = Object.values(cfg.apiKeySet).some(Boolean); + const hasLocal = + cfg.mode === "local" && cfg.ollamaBaseUrl.trim().length > 0; + setNeedsSetup(!(hasApiKey || hasLocal)); + }) + .catch(() => { + // If we can't read the config, don't nag — the chat still works. + if (active) setNeedsSetup(false); + }); + return () => { + active = false; + }; + }, []); + + if (!needsSetup || dismissed) return null; + + return ( +
+ {t("chat.setupNotice.title")} +
+{t("chat.setupNotice.body")}
+ } + size="sm" + variant="link" + > + {t("chat.setupNotice.action")} + +