import React from "react"; import { Check, ChevronDown } from "lucide-react"; import { useTranslation } from "react-i18next"; import SessionProviderLogo from "../../../llm-logo-provider/SessionProviderLogo"; import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS, GEMINI_MODELS, } from "../../../../../shared/modelConstants"; import type { ProjectSession, LLMProvider } from "../../../../types/app"; import { NextTaskBanner } from "../../../task-master"; type ProviderSelectionEmptyStateProps = { selectedSession: ProjectSession | null; currentSessionId: string | null; provider: LLMProvider; setProvider: (next: LLMProvider) => void; textareaRef: React.RefObject; claudeModel: string; setClaudeModel: (model: string) => void; cursorModel: string; setCursorModel: (model: string) => void; codexModel: string; setCodexModel: (model: string) => void; geminiModel: string; setGeminiModel: (model: string) => void; tasksEnabled: boolean; isTaskMasterInstalled: boolean | null; onShowAllTasks?: (() => void) | null; setInput: React.Dispatch>; }; type ProviderDef = { id: LLMProvider; name: string; infoKey: string; accent: string; ring: string; check: string; }; const PROVIDERS: ProviderDef[] = [ { id: "claude", name: "Claude Code", infoKey: "providerSelection.providerInfo.anthropic", accent: "border-primary", ring: "ring-primary/15", check: "bg-primary text-primary-foreground", }, { id: "cursor", name: "Cursor", infoKey: "providerSelection.providerInfo.cursorEditor", accent: "border-violet-500 dark:border-violet-400", ring: "ring-violet-500/15", check: "bg-violet-500 text-white", }, { id: "codex", name: "Codex", infoKey: "providerSelection.providerInfo.openai", accent: "border-emerald-600 dark:border-emerald-400", ring: "ring-emerald-600/15", check: "bg-emerald-600 dark:bg-emerald-500 text-white", }, { id: "gemini", name: "Gemini", infoKey: "providerSelection.providerInfo.google", accent: "border-blue-500 dark:border-blue-400", ring: "ring-blue-500/15", check: "bg-blue-500 text-white", }, ]; function getModelConfig(p: LLMProvider) { if (p === "claude") return CLAUDE_MODELS; if (p === "codex") return CODEX_MODELS; if (p === "gemini") return GEMINI_MODELS; return CURSOR_MODELS; } function getModelValue( p: LLMProvider, c: string, cu: string, co: string, g: string, ) { if (p === "claude") return c; if (p === "codex") return co; if (p === "gemini") return g; return cu; } export default function ProviderSelectionEmptyState({ selectedSession, currentSessionId, provider, setProvider, textareaRef, claudeModel, setClaudeModel, cursorModel, setCursorModel, codexModel, setCodexModel, geminiModel, setGeminiModel, tasksEnabled, isTaskMasterInstalled, onShowAllTasks, setInput, }: ProviderSelectionEmptyStateProps) { const { t } = useTranslation("chat"); const nextTaskPrompt = t("tasks.nextTaskPrompt", { defaultValue: "Start the next task", }); const selectProvider = (next: LLMProvider) => { setProvider(next); localStorage.setItem("selected-provider", next); setTimeout(() => textareaRef.current?.focus(), 100); }; const handleModelChange = (value: string) => { if (provider === "claude") { setClaudeModel(value); localStorage.setItem("claude-model", value); } else if (provider === "codex") { setCodexModel(value); localStorage.setItem("codex-model", value); } else if (provider === "gemini") { setGeminiModel(value); localStorage.setItem("gemini-model", value); } else { setCursorModel(value); localStorage.setItem("cursor-model", value); } }; const modelConfig = getModelConfig(provider); const currentModel = getModelValue( provider, claudeModel, cursorModel, codexModel, geminiModel, ); /* ── New session — provider picker ── */ if (!selectedSession && !currentSessionId) { return (
{/* Heading */}

{t("providerSelection.title")}

{t("providerSelection.description")}

{/* Provider cards — horizontal row, equal width */}
{PROVIDERS.map((p) => { const active = provider === p.id; return ( ); })}
{/* Model picker — appears after provider is chosen */}
{t("providerSelection.selectModel")}

{ { claude: t("providerSelection.readyPrompt.claude", { model: claudeModel, }), cursor: t("providerSelection.readyPrompt.cursor", { model: cursorModel, }), codex: t("providerSelection.readyPrompt.codex", { model: codexModel, }), gemini: t("providerSelection.readyPrompt.gemini", { model: geminiModel, }), }[provider] }

{/* Task banner */} {provider && tasksEnabled && isTaskMasterInstalled && (
setInput(nextTaskPrompt)} onShowAllTasks={onShowAllTasks} />
)}
); } /* ── Existing session — continue prompt ── */ if (selectedSession) { return (

{t("session.continue.title")}

{t("session.continue.description")}

{tasksEnabled && isTaskMasterInstalled && (
setInput(nextTaskPrompt)} onShowAllTasks={onShowAllTasks} />
)}
); } return null; }