import React, { Fragment, createContext, useContext } from 'react' import { registerVirtualBox } from '../shared/registry' import { SchemaForm } from './SchemaForm' import { Schema } from '../shared/schema' import { render } from '../shared/virtual-render' import { ISchemaFormProps, IMarkupSchemaFieldProps, ISchemaVirtualFieldComponentProps, IVirtualBoxProps } from '../types' const env = { nonameId: 0 } export const MarkupContext = createContext(null) const getRandomName = () => { return `NO_NAME_FIELD_$${env.nonameId++}` } export const SchemaMarkupField: React.FC = ({ children, ...props }) => { const parentSchema = useContext(MarkupContext) if (!parentSchema) return if (parentSchema.isObject()) { props.name = props.name || getRandomName() const schema = parentSchema.setProperty(props.name, props) if (typeof children === 'string') { schema['x-component-props'].children = children } return ( {children} ) } else if (parentSchema.isArray()) { const schema = parentSchema.setArrayItems(props) return ( {children} ) } else { return (children as React.ReactElement) || } } SchemaMarkupField.displayName = 'SchemaMarkupField' export const SchemaMarkupForm: React.FC = props => { let alreadyHasSchema = false let finalSchema: Schema if (props.schema) { alreadyHasSchema = true finalSchema = new Schema(props.schema) } else { finalSchema = new Schema({ type: 'object' }) } env.nonameId = 0 return ( {!alreadyHasSchema && render( {props.children} )} ) } SchemaMarkupForm.displayName = 'SchemaMarkupForm' const __VIRTUAL_BOX__ = '__VIRTUAL_BOX__' export function createVirtualBox( key: string, component?: React.JSXElementConstructor ) { const finalComponent = component ? ({ schema, children }) => { const props = schema.getExtendsComponentProps() return React.createElement(component, { children, ...props }) } : () => registerVirtualBox(key, finalComponent) const VirtualBox: React.FC> = ({ children, name, visible, display, ...props }) => { return ( {children} ) } VirtualBox[__VIRTUAL_BOX__] = { key, component: finalComponent } return VirtualBox } export function createControllerBox( key: string, component?: React.JSXElementConstructor ) { const finalComponent = component ? component : () => registerVirtualBox(key, finalComponent) const VirtualBox: React.FC> = ({ children, name, ...props }) => { return ( {children} ) } VirtualBox[__VIRTUAL_BOX__] = { key, component: finalComponent } return VirtualBox } export const FormSlot: React.FC<{ name?: string children?: React.ReactElement }> = ({ name, children }) => { return ( { return {children} }} /> ) }