import { useEffect, useState } from 'react'; import { cn } from '@/lib/utils'; type JSONSchema = { type?: string; properties?: Record; required?: string[]; description?: string; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; items?: JSONSchema; enum?: any[]; }; type SchemaFormProps = { schema: JSONSchema | null; value: string; onChange: (value: string) => void; className?: string; }; function getDefaultValue(schema: JSONSchema): any { if (!schema.type) return ''; switch (schema.type) { case 'string': return ''; case 'number': case 'integer': return schema.minimum ?? 0; case 'boolean': return false; case 'array': return []; case 'object': if (schema.properties) { const obj: Record = {}; Object.entries(schema.properties).forEach(([key, propSchema]) => { obj[key] = getDefaultValue(propSchema); }); return obj; } return {}; default: return ''; } } function renderField( name: string, schema: JSONSchema, value: any, onChange: (value: any) => void, required: boolean ): JSX.Element { const fieldId = `field-${name}`; const description = schema.description; const renderInput = () => { switch (schema.type) { case 'string': if (schema.enum) { return ( ); } return ( onChange(e.target.value)} placeholder={description} minLength={schema.minLength} maxLength={schema.maxLength} pattern={schema.pattern} required={required} className="w-full rounded-lg border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-500 outline-none focus:border-zinc-500 focus:ring-2 focus:ring-zinc-500/40" /> ); case 'number': case 'integer': return ( onChange(e.target.value === '' ? null : Number(e.target.value)) } min={schema.minimum} max={schema.maximum} step={schema.type === 'integer' ? 1 : 'any'} required={required} className="w-full rounded-lg border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 outline-none focus:border-zinc-500 focus:ring-2 focus:ring-zinc-500/40" /> ); case 'boolean': return ( ); case 'array': return (
Array (edit JSON below or add items)