import React from 'react'; import { Check, ChevronDown } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo'; import NextTaskBanner from '../../../NextTaskBanner.jsx'; import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS, GEMINI_MODELS } from '../../../../../shared/modelConstants'; import type { ProjectSession, SessionProvider } from '../../../../types/app'; interface ProviderSelectionEmptyStateProps { selectedSession: ProjectSession | null; currentSessionId: string | null; provider: SessionProvider; setProvider: (next: SessionProvider) => 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: SessionProvider; 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: SessionProvider) { if (p === 'claude') return CLAUDE_MODELS; if (p === 'codex') return CODEX_MODELS; if (p === 'gemini') return GEMINI_MODELS; return CURSOR_MODELS; } function getModelValue(p: SessionProvider, 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: SessionProvider) => { 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; }