import { useEffect } from 'react' import { Copy, ShieldCheck } from 'lucide-react' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import type { McpStatus } from '../hooks/useMcpStatus' import { createTranslator, type AppLocale } from '../lib/i18n' interface McpSetupDialogProps { open: boolean status: McpStatus busyAction: 'connect' | 'disconnect' | null manualConfigError?: string | null manualConfigLoading?: boolean manualConfigSnippet?: string | null locale?: AppLocale onClose: () => void onConnect: () => void onCopyManualConfig?: () => void onDisconnect: () => void onLoadManualConfig?: () => void } interface ManualMcpConfigSectionProps { error?: string | null loading: boolean locale?: AppLocale onCopy?: () => void snippet?: string | null } interface McpSetupActionsProps { buttonsDisabled: boolean connectBusy: boolean disconnectBusy: boolean locale?: AppLocale primaryLabel: string secondaryLabel: string | null onClose: () => void onConnect: () => void onDisconnect: () => void } function isConnected(status: McpStatus): boolean { return status === 'installed' } function actionCopy(status: McpStatus, t: ReturnType) { if (isConnected(status)) { return { description: t('mcp.setup.connectedDescription'), primaryLabel: t('mcp.setup.reconnect'), secondaryLabel: t('mcp.setup.disconnect'), title: t('mcp.setup.manageTitle'), } } return { description: t('mcp.setup.setupDescription'), primaryLabel: t('mcp.setup.connect'), secondaryLabel: null, title: t('mcp.setup.setupTitle'), } } function manualConfigText( { error, loading, snippet }: ManualMcpConfigSectionProps, t: ReturnType, ): string { if (loading) return t('mcp.setup.manual.loading') return error ?? snippet ?? t('mcp.setup.manual.unavailable') } function ManualMcpConfigSection(props: ManualMcpConfigSectionProps) { const t = createTranslator(props.locale) return (

{t('mcp.setup.manual.title')}

        {manualConfigText(props, t)}
      
) } function McpSetupActions({ buttonsDisabled, connectBusy, disconnectBusy, locale = 'en', primaryLabel, secondaryLabel, onClose, onConnect, onDisconnect, }: McpSetupActionsProps) { const t = createTranslator(locale) return ( {secondaryLabel ? ( ) : null} ) } export function McpSetupDialog({ open, status, busyAction, manualConfigError, manualConfigLoading = false, manualConfigSnippet, locale = 'en', onClose, onConnect, onCopyManualConfig, onDisconnect, onLoadManualConfig, }: McpSetupDialogProps) { const t = createTranslator(locale) const copy = actionCopy(status, t) const connectBusy = busyAction === 'connect' const disconnectBusy = busyAction === 'disconnect' const buttonsDisabled = busyAction !== null || status === 'checking' useEffect(() => { if (open) onLoadManualConfig?.() }, [open, onLoadManualConfig]) return ( { if (!next) onClose() }}> {copy.title} {copy.description}

{t('mcp.setup.nodeRequirement')}

{t('mcp.setup.writeEntryDescription', { entry: 'tolaria' })}

~/.claude.json
~/.claude/mcp.json
~/.gemini/settings.json
~/.cursor/mcp.json
~/.config/mcp/mcp.json

{t('mcp.setup.clientPathsDescription')}

{t('mcp.setup.geminiGuidanceDescription')}

) }