import { ZodObject } from 'zod'; import { Flex, rem } from '@mantine/core'; import BooleanField from '@/components/ObjectForm/Fields/BooleanField/BooleanField'; import NumberField from '@/components/ObjectForm/Fields/NumberField/NumberField'; import StringField from '@/components/ObjectForm/Fields/StringField/StringField'; type EditProps = { object: T; onChange: (item: T) => void; }; type CreateProps = { onCreate: (item: T) => void; }; type SchemaLabels> = Partial>; type RestProps> = | { schema: S; labels?: SchemaLabels; excludeKeys?: (keyof S['shape'])[]; includeKeys?: never; } | { schema: S; labels?: SchemaLabels; includeKeys?: (keyof S['shape'])[]; excludeKeys?: never; }; type Props = ( | EditProps | CreateProps ) & RestProps; const RenderField = (key: string, value: any, label?: string) => { const getField = () => { switch (value.type) { case 'string': return ; case 'number': return ; case 'boolean': return ; default: return <>; } }; return
{getField()}
; }; function ObjectForm>( props: Props ) { const processKeyValue = (key: string, val: any) => { const keyTyped = key as keyof typeof props.schema.shape; if (props.excludeKeys && props.excludeKeys.includes(keyTyped)) { return <>; } if (props.includeKeys && !props.includeKeys.includes(keyTyped)) { return <>; } const label = props.labels ? props.labels[keyTyped] : undefined; return RenderField(key, val, label); }; return ( {Object.entries(props.schema.shape).map(([key, val]) => { return processKeyValue(key, val); })} ); } export default ObjectForm;