import { NodeProps, NodeToolbar, Position } from "@xyflow/react"; import { Edit, Play } from "lucide-react"; import { memo, useState } from "react"; import { useWorkflow } from "@/app/workflow/[workflowId]/contexts/WorkflowContext"; import { 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 { isOSSMode } from "@/lib/utils"; import { NodeContent } from "./common/NodeContent"; import { NodeEditDialog } from "./common/NodeEditDialog"; import { useNodeHandlers } from "./common/useNodeHandlers"; interface StartCallEditFormProps { nodeData: FlowNodeData; prompt: string; setPrompt: (value: string) => void; isStatic: boolean; setIsStatic: (value: boolean) => void; name: string; setName: (value: string) => void; allowInterrupt: boolean; setAllowInterrupt: (value: boolean) => void; addGlobalPrompt: boolean; setAddGlobalPrompt: (value: boolean) => void; waitForUserResponse: boolean; setWaitForUserResponse: (value: boolean) => void; detectVoicemail: boolean; setDetectVoicemail: (value: boolean) => void; delayedStart: boolean; setDelayedStart: (value: boolean) => void; delayedStartDuration: number; setDelayedStartDuration: (value: number) => void; } interface StartCallNodeProps extends NodeProps { data: FlowNodeData; } export const StartCall = memo(({ data, selected, id }: StartCallNodeProps) => { const { open, setOpen, handleSaveNodeData } = useNodeHandlers({ id, additionalData: { is_start: 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); const [allowInterrupt, setAllowInterrupt] = useState(data.allow_interrupt ?? true); const [addGlobalPrompt, setAddGlobalPrompt] = useState(data.add_global_prompt ?? true); const [waitForUserResponse, setWaitForUserResponse] = useState(data.wait_for_user_response ?? false); const [detectVoicemail, setDetectVoicemail] = useState(data.detect_voicemail ?? true); const [delayedStart, setDelayedStart] = useState(data.delayed_start ?? false); const [delayedStartDuration, setDelayedStartDuration] = useState(data.delayed_start_duration ?? 2); const handleSave = async () => { handleSaveNodeData({ ...data, prompt, is_static: isStatic, name, allow_interrupt: allowInterrupt, add_global_prompt: addGlobalPrompt, wait_for_user_response: waitForUserResponse, detect_voicemail: detectVoicemail, delayed_start: delayedStart, delayed_start_duration: delayedStart ? delayedStartDuration : undefined }); 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); setAllowInterrupt(data.allow_interrupt ?? true); setAddGlobalPrompt(data.add_global_prompt ?? true); setWaitForUserResponse(data.wait_for_user_response ?? false); setDetectVoicemail(data.detect_voicemail ?? true); setDelayedStart(data.delayed_start ?? false); setDelayedStartDuration(data.delayed_start_duration ?? 3); } setOpen(newOpen); }; return ( <> } bgColor="bg-green-300" hasSourceHandle={true} >
{data.prompt?.length > 30 ? `${data.prompt.substring(0, 30)}...` : data.prompt}
{open && ( )} ); }); const StartCallEditForm = ({ prompt, setPrompt, isStatic, setIsStatic, name, setName, allowInterrupt, setAllowInterrupt, addGlobalPrompt, setAddGlobalPrompt, waitForUserResponse, setWaitForUserResponse, detectVoicemail, setDetectVoicemail, delayedStart, setDelayedStart, delayedStartDuration, setDelayedStartDuration }: StartCallEditFormProps) => { return (
setName(e.target.value)} />