diff --git a/src/components/settings/hooks/useSettingsController.ts b/src/components/settings/hooks/useSettingsController.ts index 381f301..9e23319 100644 --- a/src/components/settings/hooks/useSettingsController.ts +++ b/src/components/settings/hooks/useSettingsController.ts @@ -191,6 +191,7 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: const [activeTab, setActiveTab] = useState(() => normalizeMainTab(initialTab)); const [isSaving, setIsSaving] = useState(false); const [saveStatus, setSaveStatus] = useState<'success' | 'error' | null>(null); + const [deleteError, setDeleteError] = useState(null); const [projectSortOrder, setProjectSortOrder] = useState('name'); const [codeEditorSettings, setCodeEditorSettings] = useState(() => ( readCodeEditorSettings() @@ -456,12 +457,14 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: return; } + setDeleteError(null); try { await deleteMcpServer(serverId, scope); await fetchMcpServers(); + setDeleteError(null); setSaveStatus('success'); } catch (error) { - alert(`Error: ${getErrorMessage(error)}`); + setDeleteError(getErrorMessage(error)); setSaveStatus('error'); } }, @@ -609,12 +612,14 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: return; } + setDeleteError(null); try { await deleteCodexMcpServer(serverName); await fetchCodexMcpServers(); + setDeleteError(null); setSaveStatus('success'); } catch (error) { - alert(`Error: ${getErrorMessage(error)}`); + setDeleteError(getErrorMessage(error)); setSaveStatus('error'); } }, @@ -706,6 +711,10 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: })); setSaveStatus('success'); + if (closeTimerRef.current !== null) { + window.clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; + } closeTimerRef.current = window.setTimeout(() => onClose(), 1000); } catch (error) { console.error('Error saving settings:', error); @@ -776,6 +785,7 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: useEffect(() => () => { if (closeTimerRef.current !== null) { window.clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; } }, []); @@ -786,6 +796,7 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: toggleDarkMode, isSaving, saveStatus, + deleteError, projectSortOrder, setProjectSortOrder, codeEditorSettings, diff --git a/src/components/settings/view/Settings.tsx b/src/components/settings/view/Settings.tsx index dc0406a..397bb77 100644 --- a/src/components/settings/view/Settings.tsx +++ b/src/components/settings/view/Settings.tsx @@ -31,6 +31,7 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set setActiveTab, isSaving, saveStatus, + deleteError, projectSortOrder, setProjectSortOrder, codeEditorSettings, @@ -153,6 +154,7 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set onDiscoverMcpTools={handleMcpToolsDiscovery} onOpenCodexMcpForm={openCodexMcpForm} onDeleteCodexMcpServer={handleCodexMcpDelete} + deleteError={deleteError} /> )} diff --git a/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx b/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx index 7bc9389..446663a 100644 --- a/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx +++ b/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx @@ -24,6 +24,7 @@ export default function AgentsSettingsTab({ mcpTestResults, mcpServerTools, mcpToolsLoading, + deleteError, onOpenMcpForm, onDeleteMcpServer, onTestMcpServer, @@ -86,6 +87,7 @@ export default function AgentsSettingsTab({ mcpTestResults={mcpTestResults} mcpServerTools={mcpServerTools} mcpToolsLoading={mcpToolsLoading} + deleteError={deleteError} onOpenMcpForm={onOpenMcpForm} onDeleteMcpServer={onDeleteMcpServer} onTestMcpServer={onTestMcpServer} diff --git a/src/components/settings/view/tabs/agents-settings/sections/AgentCategoryContentSection.tsx b/src/components/settings/view/tabs/agents-settings/sections/AgentCategoryContentSection.tsx index a20c8ff..f8a577b 100644 --- a/src/components/settings/view/tabs/agents-settings/sections/AgentCategoryContentSection.tsx +++ b/src/components/settings/view/tabs/agents-settings/sections/AgentCategoryContentSection.tsx @@ -19,6 +19,7 @@ export default function AgentCategoryContentSection({ mcpTestResults, mcpServerTools, mcpToolsLoading, + deleteError, onOpenMcpForm, onDeleteMcpServer, onTestMcpServer, @@ -95,6 +96,7 @@ export default function AgentCategoryContentSection({ testResults={mcpTestResults} serverTools={mcpServerTools} toolsLoading={mcpToolsLoading} + deleteError={deleteError} /> )} @@ -115,6 +117,7 @@ export default function AgentCategoryContentSection({ onAdd={() => onOpenCodexMcpForm()} onEdit={(server) => onOpenCodexMcpForm(server)} onDelete={(serverId) => onDeleteCodexMcpServer(serverId)} + deleteError={deleteError} /> )} diff --git a/src/components/settings/view/tabs/agents-settings/sections/content/McpServersContent.tsx b/src/components/settings/view/tabs/agents-settings/sections/content/McpServersContent.tsx index 4569e6d..54d7757 100644 --- a/src/components/settings/view/tabs/agents-settings/sections/content/McpServersContent.tsx +++ b/src/components/settings/view/tabs/agents-settings/sections/content/McpServersContent.tsx @@ -31,6 +31,7 @@ type ClaudeMcpServersProps = { testResults: Record; serverTools: Record; toolsLoading: Record; + deleteError?: string | null; }; function ClaudeMcpServers({ @@ -40,6 +41,7 @@ function ClaudeMcpServers({ onDelete, testResults, serverTools, + deleteError, }: Omit) { const { t } = useTranslation('settings'); @@ -57,6 +59,11 @@ function ClaudeMcpServers({ {t('mcpServers.addButton')} + {deleteError && ( +
+ {deleteError} +
+ )}
{servers.map((server) => { @@ -254,9 +261,10 @@ type CodexMcpServersProps = { onAdd: () => void; onEdit: (server: McpServer) => void; onDelete: (serverId: string) => void; + deleteError?: string | null; }; -function CodexMcpServers({ servers, onAdd, onEdit, onDelete }: Omit) { +function CodexMcpServers({ servers, onAdd, onEdit, onDelete, deleteError }: Omit) { const { t } = useTranslation('settings'); return ( @@ -273,6 +281,11 @@ function CodexMcpServers({ servers, onAdd, onEdit, onDelete }: Omit
+ {deleteError && ( +
+ {deleteError} +
+ )}
{servers.map((server) => ( diff --git a/src/components/settings/view/tabs/agents-settings/types.ts b/src/components/settings/view/tabs/agents-settings/types.ts index 60ebaec..80c178b 100644 --- a/src/components/settings/view/tabs/agents-settings/types.ts +++ b/src/components/settings/view/tabs/agents-settings/types.ts @@ -36,6 +36,7 @@ export type AgentsSettingsTabProps = { mcpTestResults: Record; mcpServerTools: Record; mcpToolsLoading: Record; + deleteError: string | null; onOpenMcpForm: (server?: McpServer) => void; onDeleteMcpServer: (serverId: string, scope?: string) => void; onTestMcpServer: (serverId: string, scope?: string) => void; @@ -71,6 +72,7 @@ export type AgentCategoryContentSectionProps = { mcpTestResults: Record; mcpServerTools: Record; mcpToolsLoading: Record; + deleteError: string | null; onOpenMcpForm: (server?: McpServer) => void; onDeleteMcpServer: (serverId: string, scope?: string) => void; onTestMcpServer: (serverId: string, scope?: string) => void;