fix: harden multi-model chat selection

This commit is contained in:
Jesse_Chen
2026-07-17 14:09:57 +08:00
parent 4968c961f7
commit 6c02f27d1c
13 changed files with 338 additions and 91 deletions
+7 -6
View File
@@ -2,7 +2,7 @@
import { Popover } from "@base-ui/react/popover";
import { Check, ChevronDown } from "lucide-react";
import { useId, useRef, useState } from "react";
import { useId, useState } from "react";
import type { KeyboardEvent } from "react";
import type { PublicLanguageModel } from "@/lib/public-models";
@@ -21,7 +21,6 @@ export function ModelSelector({
}: ModelSelectorProps) {
const [open, setOpen] = useState(false);
const groupName = useId();
const radioRefs = useRef<Array<HTMLInputElement | null>>([]);
const selectedModel = models.find((model) => model.id === selectedModelId);
const unavailable = models.length === 0;
@@ -38,7 +37,7 @@ export function ModelSelector({
const nextModel = models[nextIndex];
if (!nextModel) return;
onSelect(nextModel.id);
window.requestAnimationFrame(() => radioRefs.current[nextIndex]?.focus());
setOpen(false);
}
return (
@@ -65,21 +64,23 @@ export function ModelSelector({
{models.map((model, index) => (
<label className="model-selector-option" data-selected={model.id === selectedModelId ? "" : undefined} key={model.id}>
<input
ref={(element) => { radioRefs.current[index] = element; }}
className="sr-only"
type="radio"
name={groupName}
value={model.id}
checked={model.id === selectedModelId}
onChange={() => onSelect(model.id)}
onClick={() => setOpen(false)}
onClick={() => {
if (model.id === selectedModelId) onSelect(model.id);
setOpen(false);
}}
onKeyDown={(event) => moveRadioSelection(event, index)}
/>
<span className="model-selector-copy">
<b>{model.label}</b>
<small>{model.description || "通用分析模型"}</small>
</span>
<span className="model-selector-cost">{model.creditCost} </span>
<span className="model-selector-cost">{model.creditCost} /</span>
<Check className="model-selector-check" aria-hidden="true" />
</label>
))}