import { useState } from 'react'; import { Theme } from './theme'; interface DialogProps { theme: Theme; onClose: () => void; } // Command Palette interface CommandPaletteProps extends DialogProps { onCommand: (cmd: string) => void; } export function CommandPalette({ theme, onClose, onCommand }: CommandPaletteProps) { const items = [ { label: 'Toggle Pause', action: 'pause' }, { label: 'Relay Servers', action: 'relay' }, { label: 'AI Settings', action: 'ai' }, { label: 'Add Word Replace', action: 'replace' }, { label: 'Delete Word Replace', action: 'delreplace' }, { label: 'Clear Log', action: 'clear' }, { label: 'Quit', action: 'quit' }, ]; const [selected, setSelected] = useState(0); return ( {items.map((item, i) => ( {' '}{item.label} ))} ); } // Relay Manager interface RelayManagerProps extends DialogProps { config: any; onSave: (config: any) => void; } export function RelayManager({ theme, config, onClose, onSave }: RelayManagerProps) { const [selected, setSelected] = useState(0); const servers = config.relayServers || []; return ( Relay Servers Select, add, or remove relay servers {servers.map((s: any, i: number) => { const active = s.url === config.relayUrl ? ` ● ` : ' '; return ( {' '}{s.name || s.url.slice(0, 35)}{active} ); })} + Add custom server - Remove a server × Disable relay Enter to select · Esc to cancel ); } // AI Settings interface AISettingsProps extends DialogProps { config: any; onSave: (config: any) => void; } export function AISettings({ theme, config, onClose, onSave }: AISettingsProps) { const [provider, setProvider] = useState(config.aiProvider || 'openai'); const [enabled, setEnabled] = useState(config.aiEnabled || false); return ( AI Settings Provider: {provider} [←/→] API Key (saved to .env): •••••• Model (blank = default): {config.aiModel || ''} AI: {enabled ? 'enabled' : 'disabled'} [Ctrl+T] Tab fields · Enter save · Esc cancel ); } // Word Replacement Add interface AddReplacementProps extends DialogProps { onSave: (from: string, to: string) => void; } export function AddReplacement({ theme, onClose, onSave }: AddReplacementProps) { return ( Add Replacement Say this: Type this: Tab switch · Enter save · Esc cancel ); } // Word Replacement Delete interface DeleteReplacementProps extends DialogProps { replacements: Record; onDelete: (key: string) => void; } export function DeleteReplacement({ theme, replacements, onClose, onDelete }: DeleteReplacementProps) { const [selected, setSelected] = useState(0); const keys = Object.keys(replacements); return ( Remove Replacement {keys.map((k, i) => ( {' '}{k} → {replacements[k]} ))} ); }