import { useState, useRef, useEffect } from 'react' import { useSettingsStore } from '../../stores/settingsStore' import type { EffortLevel } from '../../types/settings' const MODEL_ICONS = { opus: 'diamond', sonnet: 'auto_awesome', haiku: 'bolt', } as const const EFFORT_OPTIONS: { value: EffortLevel; label: string }[] = [ { value: 'low', label: 'Low' }, { value: 'medium', label: 'Medium' }, { value: 'high', label: 'High' }, { value: 'max', label: 'Max' }, ] type Props = { /** Controlled mode: model ID override */ value?: string /** Controlled mode: called on change instead of updating global store */ onChange?: (modelId: string) => void } export function ModelSelector({ value, onChange }: Props = {}) { const { currentModel: storeModel, availableModels, effortLevel, setModel, setEffort } = useSettingsStore() const [open, setOpen] = useState(false) const ref = useRef(null) const isControlled = value !== undefined const selectedModel = isControlled ? availableModels.find((m) => m.id === value) || null : storeModel useEffect(() => { if (!open) return const handleClick = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) } const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false) } document.addEventListener('mousedown', handleClick) document.addEventListener('keydown', handleEsc) return () => { document.removeEventListener('mousedown', handleClick) document.removeEventListener('keydown', handleEsc) } }, [open]) const getModelIcon = (id: string): string => { const lower = id.toLowerCase() if (lower.includes('opus')) return MODEL_ICONS.opus if (lower.includes('sonnet')) return MODEL_ICONS.sonnet if (lower.includes('haiku')) return MODEL_ICONS.haiku return 'smart_toy' } return (
{open && (
{/* Models */}
Model Configuration
{availableModels.map((model) => { const isSelected = model.id === selectedModel?.id return ( ) })}
{/* Effort — hidden in controlled mode (not relevant for task creation) */} {!isControlled &&
Effort
{EFFORT_OPTIONS.map((opt) => { const isSelected = opt.value === effortLevel return ( ) })}
}
)}
) }