'use client'; import { useNode } from '@/store/node'; import { zodResolver } from '@hookform/resolvers/zod'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@workspace/ui/components/accordion'; import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@workspace/ui/components/dropdown-menu'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@workspace/ui/components/form'; import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@workspace/ui/components/select'; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from '@workspace/ui/components/sheet'; import { Switch } from '@workspace/ui/components/switch'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { cn } from '@workspace/ui/lib/utils'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { toast } from 'sonner'; import { FieldConfig, formSchema, getLabel, getProtocolDefaultConfig, PROTOCOL_FIELDS, protocols as PROTOCOLS, } from './form-schema'; function DynamicField({ field, control, form, protocolIndex, protocolData, t, }: { field: FieldConfig; control: any; form: any; protocolIndex: number; protocolData: any; t: (key: string) => string; }) { const fieldName = `protocols.${protocolIndex}.${field.name}` as const; if (field.condition && !field.condition(protocolData, {})) { return null; } const commonProps = { control, name: fieldName, }; switch (field.type) { case 'input': return ( ( {t(field.label)} fieldProps.onChange(v)} suffix={ field.generate ? ( field.generate.functions && field.generate.functions.length > 0 ? ( {field.generate.functions.map((genFunc, idx) => ( { const result = await genFunc.function(); if (typeof result === 'string') { fieldProps.onChange(result); } else if (field.generate!.updateFields) { Object.entries(field.generate!.updateFields).forEach( ([fieldName, resultKey]) => { const fullFieldName = `protocols.${protocolIndex}.${fieldName}`; form.setValue(fullFieldName, (result as any)[resultKey]); }, ); } else { if (result.privateKey) { fieldProps.onChange(result.privateKey); } } }} > {typeof genFunc.label === 'function' ? genFunc.label(t, protocolData) : genFunc.label} ))} ) : field.generate.function ? ( ) : null ) : ( field.suffix ) } /> )} /> ); case 'number': return ( ( {t(field.label)} fieldProps.onChange(v)} /> )} /> ); case 'select': if (!field.options || field.options.length <= 1) { return null; } return ( ( {t(field.label)} )} /> ); case 'switch': return ( ( {t(field.label)}
fieldProps.onChange(checked)} />
)} /> ); case 'textarea': return ( ( {t(field.label)}