import { NodeProps, NodeToolbar, Position } from "@xyflow/react"; import { Edit, OctagonX, PlusIcon, Trash2Icon } from "lucide-react"; import { memo, useState } from "react"; import { useWorkflow } from "@/app/workflow/[workflowId]/contexts/WorkflowContext"; import { ExtractionVariable, FlowNodeData } from "@/components/flow/types"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { NodeContent } from "./common/NodeContent"; import { NodeEditDialog } from "./common/NodeEditDialog"; import { useNodeHandlers } from "./common/useNodeHandlers"; interface EndCallEditFormProps { nodeData: FlowNodeData; prompt: string; setPrompt: (value: string) => void; isStatic: boolean; setIsStatic: (value: boolean) => void; name: string; setName: (value: string) => void; extractionEnabled: boolean; setExtractionEnabled: (value: boolean) => void; extractionPrompt: string; setExtractionPrompt: (value: string) => void; variables: ExtractionVariable[]; setVariables: (vars: ExtractionVariable[]) => void; addGlobalPrompt: boolean; setAddGlobalPrompt: (value: boolean) => void; } interface EndCallNodeProps extends NodeProps { data: FlowNodeData; } export const EndCall = memo(({ data, selected, id }: EndCallNodeProps) => { const { open, setOpen, handleSaveNodeData } = useNodeHandlers({ id, additionalData: { is_end: true } }); const { saveWorkflow } = useWorkflow(); // Form state const [prompt, setPrompt] = useState(data.prompt); const [isStatic, setIsStatic] = useState(data.is_static ?? true); const [name, setName] = useState(data.name); // Variable Extraction state const [extractionEnabled, setExtractionEnabled] = useState(data.extraction_enabled ?? false); const [extractionPrompt, setExtractionPrompt] = useState(data.extraction_prompt ?? ""); const [variables, setVariables] = useState(data.extraction_variables ?? []); const [addGlobalPrompt, setAddGlobalPrompt] = useState(data.add_global_prompt ?? true); const handleSave = async () => { handleSaveNodeData({ ...data, prompt, is_static: isStatic, name, allow_interrupt: false, // Always set to false for end nodes extraction_enabled: extractionEnabled, extraction_prompt: extractionPrompt, extraction_variables: variables, add_global_prompt: addGlobalPrompt, }); setOpen(false); // Save the workflow after updating node data with a small delay to ensure state is updated setTimeout(async () => { await saveWorkflow(); }, 100); }; // Reset form state when dialog opens const handleOpenChange = (newOpen: boolean) => { if (newOpen) { setPrompt(data.prompt); setIsStatic(data.is_static ?? true); setName(data.name); setExtractionEnabled(data.extraction_enabled ?? false); setExtractionPrompt(data.extraction_prompt ?? ""); setVariables(data.extraction_variables ?? []); setAddGlobalPrompt(data.add_global_prompt ?? true); } setOpen(newOpen); }; return ( <> } bgColor="bg-red-300" hasTargetHandle={true} onDoubleClick={() => setOpen(true)} nodeId={id} >
{data.prompt?.length > 30 ? `${data.prompt.substring(0, 30)}...` : data.prompt}
{open && ( )} ); }); const EndCallEditForm = ({ prompt, setPrompt, isStatic, setIsStatic, name, setName, extractionEnabled, setExtractionEnabled, extractionPrompt, setExtractionPrompt, variables, setVariables, addGlobalPrompt, setAddGlobalPrompt, }: EndCallEditFormProps) => { const handleVariableNameChange = (idx: number, value: string) => { const newVars = [...variables]; newVars[idx] = { ...newVars[idx], name: value }; setVariables(newVars); }; const handleVariableTypeChange = (idx: number, value: 'string' | 'number' | 'boolean') => { const newVars = [...variables]; newVars[idx] = { ...newVars[idx], type: value }; setVariables(newVars); }; const handleVariablePromptChange = (idx: number, value: string) => { const newVars = [...variables]; newVars[idx] = { ...newVars[idx], prompt: value }; setVariables(newVars); }; const handleRemoveVariable = (idx: number) => { const newVars = variables.filter((_, i) => i !== idx); setVariables(newVars); }; const handleAddVariable = () => { setVariables([...variables, { name: '', type: 'string', prompt: '' }]); }; return (
setName(e.target.value)} />