Files
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

65 lines
2.5 KiB
TypeScript

import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
import { useAtom } from 'jotai'
import { modelAtom } from '@/app/state'
import { AGENT_MODELS } from '@/agents/catalog'
import './Composer.css'
function ChevronDown() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="m6 9 6 6 6-6" />
</svg>
)
}
function Check() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg>
)
}
export function ModelPicker() {
const [model, setModel] = useAtom(modelAtom)
const current = AGENT_MODELS.find((m) => m.id === model) ?? AGENT_MODELS[0]
const groups = Array.from(new Set(AGENT_MODELS.map((m) => m.group)))
return (
<DropdownMenu.Root>
<DropdownMenu.Trigger asChild>
<button className="composer-footer__btn" aria-label="Model">
<span className="composer-footer__btn-text">{current.label}</span>
<ChevronDown />
</button>
</DropdownMenu.Trigger>
<DropdownMenu.Portal>
<DropdownMenu.Content
className="composer-menu"
side="top"
align="end"
sideOffset={6}
>
{groups.map((g) => (
<DropdownMenu.Group key={g} className="composer-menu__group">
<DropdownMenu.Label className="composer-menu__label">
{g}
</DropdownMenu.Label>
{AGENT_MODELS.filter((m) => m.group === g).map((m) => (
<DropdownMenu.Item
key={m.id}
className="composer-menu__item"
onSelect={() => setModel(m.id)}
>
<span>{m.label}</span>
{model === m.id && <Check />}
</DropdownMenu.Item>
))}
</DropdownMenu.Group>
))}
</DropdownMenu.Content>
</DropdownMenu.Portal>
</DropdownMenu.Root>
)
}