"use client"; 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/composed/enhanced-input"; import { Icon } from "@workspace/ui/composed/icon"; import { cn } from "@workspace/ui/lib/utils"; import { useEffect, useState } from "react"; import { useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { useNode } from "@/stores/node"; import { type FieldConfig, formSchema, getLabel, getProtocolDefaultConfig, protocols as PROTOCOLS, useProtocolFields, } from "./form-schema"; function DynamicField({ field, control, form, protocolIndex, protocolData, }: { field: FieldConfig; control: any; form: any; protocolIndex: number; protocolData: any; }) { 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 ( ( {field.label} fieldProps.onChange(v)} placeholder={field.placeholder} 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); } }} > {genFunc.label} ))} ) : field.generate.function ? ( ) : null ) : ( field.suffix ) } type="text" /> )} /> ); case "number": return ( ( {field.label} fieldProps.onChange(v)} placeholder={field.placeholder} step={field.step || 1} suffix={field.suffix} type="number" /> )} /> ); case "select": if (!field.options || field.options.length <= 1) { return null; } return ( ( {field.label} )} /> ); case "switch": return ( ( {field.label}
fieldProps.onChange(checked)} />
)} /> ); case "textarea": return ( ( {field.label}