import { FormEvent, useMemo, useState } from "react"; import type { Capability } from "../../protocol/model"; interface SchemaProperty { type?: unknown; title?: unknown; description?: unknown; enum?: unknown; default?: unknown; minimum?: unknown; maximum?: unknown; maxLength?: unknown; } function properties(schema: Capability["input_schema"]): Record { const value = schema.properties; return value && typeof value === "object" && !Array.isArray(value) ? value as Record : {}; } export function OperationForm({ capability, disabled, onSubmit }: { capability: Capability; disabled?: boolean; onSubmit: (parameters: Readonly>) => void }) { const fields = useMemo(() => properties(capability.input_schema), [capability]); const required = new Set(Array.isArray(capability.input_schema.required) ? capability.input_schema.required.filter((value): value is string => typeof value === "string") : []); const [values, setValues] = useState>(() => Object.fromEntries(Object.entries(fields).filter(([, field]) => field.default !== undefined).map(([name, field]) => [name, field.default]))); const unsupported = Object.entries(fields).filter(([, field]) => !Array.isArray(field.enum) && ![undefined, "string", "boolean", "number", "integer"].includes(field.type as string | undefined)).map(([name]) => name); const submit = (event: FormEvent) => { event.preventDefault(); if (unsupported.length === 0) onSubmit(values); }; const controls = Object.entries(fields).map(([name, field]) => { const label = typeof field.title === "string" ? field.title : name; const common = { id: `operation-${name}`, disabled, required: required.has(name) }; const enumValues = Array.isArray(field.enum) && field.enum.every((item) => ["string", "number"].includes(typeof item)) ? field.enum as readonly (string | number)[] : undefined; if (enumValues) return ; if (field.type === "boolean") return setValues({ ...values, [name]: e.currentTarget.checked })} />; if (field.type === "number" || field.type === "integer") return setValues({ ...values, [name]: e.currentTarget.value === "" ? undefined : Number(e.currentTarget.value) })} />; if (field.type === "string" || field.type === undefined) return setValues({ ...values, [name]: e.currentTarget.value })} />; return

字段 {name} 使用不支持的 Schema 类型

; }); return

{capability.name}

{Object.keys(fields).length === 0 &&

此操作无需参数

}{Object.entries(fields).map(([name, field], index) => )}
; }