import { useMemo, useState } from 'react' import { MODELS, PFLY_OOB, displayAuroc, featureSetLabel, type RealModel } from '../data/models' import ModelDetail from './ModelDetail' interface ModelPickerProps { selected: string // model code onChange: (code: string) => void } interface Group { key: string species: string models: RealModel[] } export default function ModelPicker({ selected, onChange }: ModelPickerProps) { const [openInfo, setOpenInfo] = useState(null) // group models by species const groups = useMemo(() => { const byKey = new Map() for (const m of MODELS) { if (!byKey.has(m.speciesKey)) byKey.set(m.speciesKey, { key: m.speciesKey, species: m.species, models: [] }) byKey.get(m.speciesKey)!.models.push(m) } return [...byKey.values()] }, []) const selectedGroupKey = useMemo( () => MODELS.find((m) => m.code === selected)?.speciesKey ?? groups[0]?.key, [selected, groups], ) // collapsed species sections, only the selected model's species is open initially const [openGroups, setOpenGroups] = useState>(new Set(selectedGroupKey ? [selectedGroupKey] : [])) const toggleGroup = (k: string) => setOpenGroups((prev) => { const next = new Set(prev) next.has(k) ? next.delete(k) : next.add(k) return next }) return (
Model{' '} Pick Pfly (any species) or one of {MODELS.length} context-specific models grouped by species.
{groups.map((g) => { const isOpen = openGroups.has(g.key) const hasSelected = g.models.some((m) => m.code === selected) return (
{isOpen && (
{g.models.map((m) => { const on = selected === m.code return (
{openInfo === m.code && }
) })}
)}
) })}
) }