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]}
))}
);
}