import * as React from "react" import * as LucideIcons from "lucide-react" import { Input } from "@/components/ui/input" import { KeyValueEditor } from "@/components/ui/key-value-editor" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Slider } from "@/components/ui/slider" import { Switch } from "@/components/ui/switch" import { Textarea } from "@/components/ui/textarea" import { cn } from "@/lib/utils" import type { FieldSchema } from "@/types/config-schema" export interface DynamicFieldProps { schema: FieldSchema value: unknown onChange: (value: unknown) => void // eslint-disable-next-line @typescript-eslint/no-unused-vars fieldPath?: string // 用于 Hook 系统(未来使用) } /** * DynamicField - 根据字段类型和 x-widget 渲染对应的 shadcn/ui 组件 * * 渲染逻辑: * 1. x-widget 优先:如果 schema 有 x-widget,使用对应组件 * 2. type 回退:如果没有 x-widget,根据 type 选择默认组件 */ export const DynamicField: React.FC = ({ schema, value, onChange, }) => { const isNumericField = schema.type === 'integer' || schema.type === 'number' const parseNumericValue = (rawValue: unknown, fallbackValue: unknown = 0) => { if (typeof rawValue === 'number' && Number.isFinite(rawValue)) { return rawValue } if (typeof rawValue === 'string') { const parsedValue = parseFloat(rawValue) if (Number.isFinite(parsedValue)) { return schema.type === 'integer' ? Math.trunc(parsedValue) : parsedValue } } if (fallbackValue !== rawValue) { return parseNumericValue(fallbackValue, 0) } return 0 } const renderPrimitiveArrayEditor = () => { const itemType = schema.items?.type ?? 'string' const arrayValue = Array.isArray(value) ? value : Array.isArray(schema.default) ? schema.default : [] const textareaValue = arrayValue.map((item) => String(item ?? '')).join('\n') return (