Files
claudecodeui/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx
Haileyesus e20ee2828d fix(settings): inline MCP delete errors and stabilize save-close timer
Replace blocking alert() calls in MCP delete handlers with non-blocking deleteError state updates and setSaveStatus('error') on failure.

Thread deleteError through Settings -> Agents settings views and render inline error feedback in Claude/Codex MCP sections near delete actions.

Prevent orphaned save-close timers by clearing and nulling closeTimerRef before scheduling a new timeout, and by nulling the ref during unmount cleanup.
2026-02-24 14:05:30 +03:00

102 lines
3.2 KiB
TypeScript

import { useMemo, useState } from 'react';
import type { AgentCategory, AgentProvider } from '../../../types/types';
import AgentCategoryContentSection from './sections/AgentCategoryContentSection';
import AgentCategoryTabsSection from './sections/AgentCategoryTabsSection';
import AgentSelectorSection from './sections/AgentSelectorSection';
import type { AgentContext, AgentsSettingsTabProps } from './types';
export default function AgentsSettingsTab({
claudeAuthStatus,
cursorAuthStatus,
codexAuthStatus,
onClaudeLogin,
onCursorLogin,
onCodexLogin,
claudePermissions,
onClaudePermissionsChange,
cursorPermissions,
onCursorPermissionsChange,
codexPermissionMode,
onCodexPermissionModeChange,
mcpServers,
cursorMcpServers,
codexMcpServers,
mcpTestResults,
mcpServerTools,
mcpToolsLoading,
deleteError,
onOpenMcpForm,
onDeleteMcpServer,
onTestMcpServer,
onDiscoverMcpTools,
onOpenCodexMcpForm,
onDeleteCodexMcpServer,
}: AgentsSettingsTabProps) {
const [selectedAgent, setSelectedAgent] = useState<AgentProvider>('claude');
const [selectedCategory, setSelectedCategory] = useState<AgentCategory>('account');
const agentContextById = useMemo<Record<AgentProvider, AgentContext>>(() => ({
claude: {
authStatus: claudeAuthStatus,
onLogin: onClaudeLogin,
},
cursor: {
authStatus: cursorAuthStatus,
onLogin: onCursorLogin,
},
codex: {
authStatus: codexAuthStatus,
onLogin: onCodexLogin,
},
}), [
claudeAuthStatus,
codexAuthStatus,
cursorAuthStatus,
onClaudeLogin,
onCodexLogin,
onCursorLogin,
]);
return (
<div className="flex flex-col md:flex-row h-full min-h-[400px] md:min-h-[500px]">
<AgentSelectorSection
selectedAgent={selectedAgent}
onSelectAgent={setSelectedAgent}
agentContextById={agentContextById}
/>
<div className="flex-1 flex flex-col overflow-hidden">
<AgentCategoryTabsSection
selectedCategory={selectedCategory}
onSelectCategory={setSelectedCategory}
/>
<AgentCategoryContentSection
selectedAgent={selectedAgent}
selectedCategory={selectedCategory}
agentContextById={agentContextById}
claudePermissions={claudePermissions}
onClaudePermissionsChange={onClaudePermissionsChange}
cursorPermissions={cursorPermissions}
onCursorPermissionsChange={onCursorPermissionsChange}
codexPermissionMode={codexPermissionMode}
onCodexPermissionModeChange={onCodexPermissionModeChange}
mcpServers={mcpServers}
cursorMcpServers={cursorMcpServers}
codexMcpServers={codexMcpServers}
mcpTestResults={mcpTestResults}
mcpServerTools={mcpServerTools}
mcpToolsLoading={mcpToolsLoading}
deleteError={deleteError}
onOpenMcpForm={onOpenMcpForm}
onDeleteMcpServer={onDeleteMcpServer}
onTestMcpServer={onTestMcpServer}
onDiscoverMcpTools={onDiscoverMcpTools}
onOpenCodexMcpForm={onOpenCodexMcpForm}
onDeleteCodexMcpServer={onDeleteCodexMcpServer}
/>
</div>
</div>
);
}