"use client"; import { InputNodeData, WorkflowNodeData, } from "lib/ai/workflow/workflow.interface"; import { memo, useCallback } from "react"; import { Feild, EditJsonSchemaFieldPopup, getFieldKey, } from "../../edit-json-schema-field-popup"; import { InfoIcon, PlusIcon, TrashIcon, VariableIcon } from "lucide-react"; import { PencilIcon } from "lucide-react"; import { objectFlow } from "lib/utils"; import { Button } from "ui/button"; import { Label } from "ui/label"; import { useReactFlow } from "@xyflow/react"; import { useTranslations } from "next-intl"; import { Tooltip, TooltipContent, TooltipTrigger } from "ui/tooltip"; export const InputNodeDataConfig = memo(function ({ data, }: { data: InputNodeData; }) { const t = useTranslations(); const { updateNodeData } = useReactFlow(); const checkRequired = useCallback( (key: string) => { return data.outputSchema.required?.includes(key); }, [data.outputSchema], ); const addField = useCallback( (field: Feild) => { updateNodeData(data.id, (node) => { const prev = node.data as InputNodeData; const outputSchema = { ...prev.outputSchema, properties: { ...prev.outputSchema.properties, [field.key]: { type: field.type, enum: field.type == "string" && field.enum ? field.enum : undefined, description: field.description, default: field.defaultValue, }, }, required: !field.required ? prev.outputSchema.required?.filter((k) => k != field.key) : Array.from( new Set([...(prev.outputSchema.required ?? []), field.key]), ), }; return { outputSchema, }; }); }, [data.id], ); const removeField = useCallback( (key: string) => { updateNodeData(data.id, (node) => { const prev = node.data as InputNodeData; const outputSchema = { ...prev.outputSchema, properties: objectFlow(prev.outputSchema.properties).filter( (_, k) => k != key, ), required: prev.outputSchema.required?.filter((k) => k != key), }; return { outputSchema, }; }); }, [data.outputSchema], ); return (
{t("Workflow.inputFieldsDescription")}
{Object.entries(data.outputSchema.properties ?? {}).map( ([key, value]) => (
{key}
{checkRequired(key) ? "*" : " "} {getFieldKey(value)}
removeField(key)} className="p-1 text-destructive rounded cursor-pointer hover:bg-destructive/10" >
), )}
); }); InputNodeDataConfig.displayName = "InputNodeDataConfig"; export const OutputSchemaStack = memo(function ({ data, }: { data: WorkflowNodeData }) { const keys = Object.keys(data.outputSchema?.properties ?? {}); if (!keys.length) return null; return (
{keys.map((v) => { const schema = data.outputSchema.properties[v]; return (
{v}
{data.outputSchema.required?.includes(v) ? "*" : " "} {getFieldKey(schema)}
); })}
); }); OutputSchemaStack.displayName = "OutputSchemaStack";