import * as React from 'react'; import { TextField as MuiTextField } from '@mui/material'; import { ResourceField } from '../../types/config'; import { FieldComponentProps, FieldComponents } from '../../types/overrides'; import { defaultFieldComponents } from './DefaultFieldComponents'; import ObjectField from './ObjectField'; import ImageUploadField from './ImageUploadField'; interface FormFieldProps { name: string; field: ResourceField; value: any; onChange: (val: any) => void; disabled?: boolean; uploadFile: (file: File) => Promise; uploading: boolean; baseUrl: string; relationDataMap?: Record; components?: FieldComponents; } function FallbackField({ field, value }: FieldComponentProps) { return ( ); } export default function FormField({ name, field, value, onChange, disabled, uploadFile, uploading, baseUrl, relationDataMap = {}, components: componentsProp, }: FormFieldProps) { const components = React.useMemo( () => ({ ...defaultFieldComponents, ...componentsProp }), [componentsProp], ); const fieldProps: FieldComponentProps = { name, field, value, onChange, disabled, baseUrl, relationDataMap, uploadFile, uploading, }; // 1. Object (recursive) - requires parent FormField for recursion if (field.type === 'object' && field.schema && !field.relation) { const renderChild = (childProps: FieldComponentProps) => ( ); return ; } // 2. Image if (field.type === 'image') { const ImageField = components.image || ImageUploadField; return ; } // 3. Relation if (field.relation && relationDataMap[field.relation]) { const RelationFieldComp = components.relation || defaultFieldComponents.relation!; return ; } // 4. Lookup by field type const Component = components[field.type]; if (Component) { return ; } // 5. Fallback for unknown types return ; }