import { splitProps, For, Show, createSignal } from 'solid-js'; import { cn } from '../utils/cn'; import { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from '../ui/dropdown'; import { Button } from '../ui/button'; import type { ModelOption } from '../types'; export interface ModelSwitcherProps { models: ModelOption[]; currentModelId: string; onModelChange: (modelId: string) => void; class?: string; } const Chevron = (props: { class?: string }) => ( ); function ModelRow(props: { model: ModelOption; currentModelId: string; onModelChange: (id: string) => void }) { const subtitle = () => props.model.description ?? props.model.provider; return ( props.onModelChange(props.model.id)}>
{props.model.name} {subtitle()}
); } export function ModelSwitcher(props: ModelSwitcherProps) { const [local] = splitProps(props, ['models', 'currentModelId', 'onModelChange', 'class']); const currentModel = () => local.models.find((m) => m.id === local.currentModelId); // Ungrouped models list first; grouped models collect under their group name, // preserving first-seen group order. const ungrouped = () => local.models.filter((m) => !m.group); const groups = () => { const order: string[] = []; const byGroup = new Map(); for (const m of local.models) { if (!m.group) continue; if (!byGroup.has(m.group)) { byGroup.set(m.group, []); order.push(m.group); } byGroup.get(m.group)!.push(m); } return order.map((name) => ({ name, models: byGroup.get(name)! })); }; return ( 1}> ( )} /> {(model) => } {(group) => { const [open, setOpen] = createSignal(false); return (
{(model) => }
); }}
); }