diff --git a/src/components/SessionProviderLogo.tsx b/src/components/SessionProviderLogo.tsx new file mode 100644 index 0000000..d621fc5 --- /dev/null +++ b/src/components/SessionProviderLogo.tsx @@ -0,0 +1,24 @@ +import type { SessionProvider } from '../types/app'; +import ClaudeLogo from './ClaudeLogo'; +import CodexLogo from './CodexLogo'; +import CursorLogo from './CursorLogo'; + +type SessionProviderLogoProps = { + provider?: SessionProvider | string | null; + className?: string; +}; + +export default function SessionProviderLogo({ + provider = 'claude', + className = 'w-5 h-5', +}: SessionProviderLogoProps) { + if (provider === 'cursor') { + return ; + } + + if (provider === 'codex') { + return ; + } + + return ; +} diff --git a/src/components/Settings.jsx b/src/components/Settings.jsx index 0d828a8..9517257 100644 --- a/src/components/Settings.jsx +++ b/src/components/Settings.jsx @@ -5,9 +5,6 @@ import { Badge } from './ui/badge'; import { X, Plus, Settings as SettingsIcon, Shield, AlertTriangle, Moon, Sun, Server, Edit3, Trash2, Globe, Terminal, Zap, FolderOpen, LogIn, Key, GitBranch, Check } from 'lucide-react'; import { useTheme } from '../contexts/ThemeContext'; import { useTranslation } from 'react-i18next'; -import ClaudeLogo from './ClaudeLogo'; -import CursorLogo from './CursorLogo'; -import CodexLogo from './CodexLogo'; import CredentialsSettings from './CredentialsSettings'; import GitSettings from './GitSettings'; import TasksSettings from './TasksSettings'; diff --git a/src/components/chat/messages/MessageComponent.tsx b/src/components/chat/messages/MessageComponent.tsx index 86cbbb6..3acaae0 100644 --- a/src/components/chat/messages/MessageComponent.tsx +++ b/src/components/chat/messages/MessageComponent.tsx @@ -1,9 +1,7 @@ // @ts-nocheck import React, { memo, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import ClaudeLogo from '../../ClaudeLogo.jsx'; -import CursorLogo from '../../CursorLogo.jsx'; -import CodexLogo from '../../CodexLogo.jsx'; +import SessionProviderLogo from '../../SessionProviderLogo'; import type { ChatMessage, Provider } from '../types'; import { Markdown } from '../markdown/Markdown'; import { formatUsageLimitText } from '../utils/chatFormatting'; @@ -128,13 +126,7 @@ const MessageComponent = memo(({ message, index, prevMessage, createDiff, onFile ) : (
- {selectedProvider === 'cursor' ? ( - - ) : selectedProvider === 'codex' ? ( - - ) : ( - - )} +
)}
diff --git a/src/components/chat/view/ChatMessagesPane.tsx b/src/components/chat/view/ChatMessagesPane.tsx index de61480..1c838fa 100644 --- a/src/components/chat/view/ChatMessagesPane.tsx +++ b/src/components/chat/view/ChatMessagesPane.tsx @@ -1,8 +1,6 @@ import { useTranslation } from 'react-i18next'; import type { Dispatch, RefObject, SetStateAction } from 'react'; -import ClaudeLogo from '../../ClaudeLogo.jsx'; -import CursorLogo from '../../CursorLogo.jsx'; -import CodexLogo from '../../CodexLogo.jsx'; +import SessionProviderLogo from '../../SessionProviderLogo'; import MessageComponent from '../messages/MessageComponent'; import ProviderSelectionEmptyState from './ProviderSelectionEmptyState'; import type { ChatMessage, Provider } from '../types'; @@ -55,13 +53,7 @@ function AssistantThinkingIndicator() {
- {selectedProvider === 'cursor' ? ( - - ) : selectedProvider === 'codex' ? ( - - ) : ( - - )} +
{selectedProvider === 'cursor' ? 'Cursor' : selectedProvider === 'codex' ? 'Codex' : 'Claude'} diff --git a/src/components/chat/view/ProviderSelectionEmptyState.tsx b/src/components/chat/view/ProviderSelectionEmptyState.tsx index 6b50e65..233d4e6 100644 --- a/src/components/chat/view/ProviderSelectionEmptyState.tsx +++ b/src/components/chat/view/ProviderSelectionEmptyState.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import ClaudeLogo from '../../ClaudeLogo.jsx'; -import CursorLogo from '../../CursorLogo.jsx'; -import CodexLogo from '../../CodexLogo.jsx'; +import SessionProviderLogo from '../../SessionProviderLogo'; import NextTaskBanner from '../../NextTaskBanner.jsx'; import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS } from '../../../../shared/modelConstants'; import type { Provider } from '../types'; @@ -68,7 +66,7 @@ export default function ProviderSelectionEmptyState({ }`} >
- +

Claude Code

{t('providerSelection.providerInfo.anthropic')}

@@ -94,7 +92,7 @@ export default function ProviderSelectionEmptyState({ }`} >
- +

Cursor

{t('providerSelection.providerInfo.cursorEditor')}

@@ -120,7 +118,7 @@ export default function ProviderSelectionEmptyState({ }`} >
- +

Codex

{t('providerSelection.providerInfo.openai')}

diff --git a/src/components/main-content/MainContentTitle.tsx b/src/components/main-content/MainContentTitle.tsx index 7d2773b..285a881 100644 --- a/src/components/main-content/MainContentTitle.tsx +++ b/src/components/main-content/MainContentTitle.tsx @@ -1,6 +1,5 @@ import { useTranslation } from 'react-i18next'; -import ClaudeLogo from '../ClaudeLogo'; -import CursorLogo from '../CursorLogo'; +import SessionProviderLogo from '../SessionProviderLogo'; import type { AppTab, Project, ProjectSession } from '../../types/app'; type MainContentTitleProps = { @@ -49,11 +48,7 @@ export default function MainContentTitle({
{showSessionIcon && (
- {selectedSession?.__provider === 'cursor' ? ( - - ) : ( - - )} +
)} diff --git a/src/components/settings/AccountContent.jsx b/src/components/settings/AccountContent.jsx index e9b2d3f..cad2e2a 100644 --- a/src/components/settings/AccountContent.jsx +++ b/src/components/settings/AccountContent.jsx @@ -1,16 +1,13 @@ import { Button } from '../ui/button'; import { Badge } from '../ui/badge'; import { LogIn } from 'lucide-react'; -import ClaudeLogo from '../ClaudeLogo'; -import CursorLogo from '../CursorLogo'; -import CodexLogo from '../CodexLogo'; +import SessionProviderLogo from '../SessionProviderLogo'; import { useTranslation } from 'react-i18next'; const agentConfig = { claude: { name: 'Claude', description: 'Anthropic Claude AI assistant', - Logo: ClaudeLogo, bgClass: 'bg-blue-50 dark:bg-blue-900/20', borderClass: 'border-blue-200 dark:border-blue-800', textClass: 'text-blue-900 dark:text-blue-100', @@ -20,7 +17,6 @@ const agentConfig = { cursor: { name: 'Cursor', description: 'Cursor AI-powered code editor', - Logo: CursorLogo, bgClass: 'bg-purple-50 dark:bg-purple-900/20', borderClass: 'border-purple-200 dark:border-purple-800', textClass: 'text-purple-900 dark:text-purple-100', @@ -30,7 +26,6 @@ const agentConfig = { codex: { name: 'Codex', description: 'OpenAI Codex AI assistant', - Logo: CodexLogo, bgClass: 'bg-gray-100 dark:bg-gray-800/50', borderClass: 'border-gray-300 dark:border-gray-600', textClass: 'text-gray-900 dark:text-gray-100', @@ -42,12 +37,11 @@ const agentConfig = { export default function AccountContent({ agent, authStatus, onLogin }) { const { t } = useTranslation('settings'); const config = agentConfig[agent]; - const { Logo } = config; return (
- +

{config.name}

{t(`agents.account.${agent}.description`)}

diff --git a/src/components/settings/AgentListItem.jsx b/src/components/settings/AgentListItem.jsx index 06e7477..babd8b5 100644 --- a/src/components/settings/AgentListItem.jsx +++ b/src/components/settings/AgentListItem.jsx @@ -1,23 +1,18 @@ -import ClaudeLogo from '../ClaudeLogo'; -import CursorLogo from '../CursorLogo'; -import CodexLogo from '../CodexLogo'; +import SessionProviderLogo from '../SessionProviderLogo'; import { useTranslation } from 'react-i18next'; const agentConfig = { claude: { name: 'Claude', color: 'blue', - Logo: ClaudeLogo, }, cursor: { name: 'Cursor', color: 'purple', - Logo: CursorLogo, }, codex: { name: 'Codex', color: 'gray', - Logo: CodexLogo, }, }; @@ -46,7 +41,6 @@ export default function AgentListItem({ agentId, authStatus, isSelected, onClick const { t } = useTranslation('settings'); const config = agentConfig[agentId]; const colors = colorClasses[config.color]; - const { Logo } = config; // Mobile: horizontal layout with bottom border if (isMobile) { @@ -60,7 +54,7 @@ export default function AgentListItem({ agentId, authStatus, isSelected, onClick }`} >
- + {config.name} {authStatus?.authenticated && ( @@ -81,7 +75,7 @@ export default function AgentListItem({ agentId, authStatus, isSelected, onClick }`} >
- + {config.name}
diff --git a/src/components/sidebar/SessionProviderIcon.tsx b/src/components/sidebar/SessionProviderIcon.tsx deleted file mode 100644 index 5083a25..0000000 --- a/src/components/sidebar/SessionProviderIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { SessionProvider } from '../../types/app'; -import ClaudeLogo from '../ClaudeLogo'; -import CodexLogo from '../CodexLogo'; -import CursorLogo from '../CursorLogo'; - -type SessionProviderIconProps = { - provider: SessionProvider; - className: string; -}; - -export default function SessionProviderIcon({ provider, className }: SessionProviderIconProps) { - if (provider === 'cursor') { - return ; - } - - if (provider === 'codex') { - return ; - } - - return ; -} diff --git a/src/components/sidebar/SidebarSessionItem.tsx b/src/components/sidebar/SidebarSessionItem.tsx index d46bf72..2105fad 100644 --- a/src/components/sidebar/SidebarSessionItem.tsx +++ b/src/components/sidebar/SidebarSessionItem.tsx @@ -7,7 +7,7 @@ import { formatTimeAgo } from '../../utils/dateUtils'; import type { Project, ProjectSession, SessionProvider } from '../../types/app'; import type { SessionWithProvider, TouchHandlerFactory } from './types'; import { createSessionViewModel } from './utils'; -import SessionProviderIcon from './SessionProviderIcon'; +import SessionProviderLogo from '../SessionProviderLogo'; type SidebarSessionItemProps = { project: Project; @@ -92,7 +92,7 @@ export default function SidebarSessionItem({ isSelected ? 'bg-primary/10' : 'bg-muted/50', )} > - +
@@ -108,7 +108,7 @@ export default function SidebarSessionItem({ )} - +
@@ -140,7 +140,7 @@ export default function SidebarSessionItem({ onTouchEnd={touchHandlerFactory(() => onSessionSelect(session, project.name))} >
- +
{sessionView.sessionName}
@@ -157,7 +157,7 @@ export default function SidebarSessionItem({ )} - +