'use client'; import { FieldValues, Path, SubmitErrorHandler, SubmitHandler, UseFormReturn } from 'react-hook-form'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import React, { ReactNode } from 'react'; import { Checkbox } from '@/components/ui/checkbox'; import { KratosSchemaProperties } from '@/lib/forms/identity-form'; interface DynamicFormProps { children?: ReactNode, form: UseFormReturn, properties: KratosSchemaProperties, onValid: SubmitHandler, onInvalid: SubmitErrorHandler, submitLabel?: string, } export function DynamicForm( { children, form, properties, onValid, onInvalid, submitLabel, }: DynamicFormProps, ) { const generateFormFields = (data: KratosSchemaProperties, prefix = '') => { return ( { data && Object.entries(data).map(([key, value]) => { const fullFieldName = prefix ? `${prefix}.${key}` : key; if (value.type === 'object') { return generateFormFields(value.properties!, fullFieldName); } else if (value.type === 'boolean') { return ( )} key={fullFieldName} render={({ field }) => ( {key} )} /> ); } else { return ( )} key={fullFieldName} render={({ field }) => ( {value.title} {value.description} )} /> ); } }) } ); }; return (
{generateFormFields(properties)} {children}
); } export default DynamicForm;