"use client"; import { useState, useCallback, useEffect } from "react"; import { Handle, Position, type NodeProps, type Node } from "@xyflow/react"; import { useMutation } from "convex/react"; import { api } from "@/convex/_generated/api"; import type { Id } from "@/convex/_generated/dataModel"; import { useDebouncedCallback } from "@/hooks/use-debounced-callback"; import BaseNodeWrapper from "./base-node-wrapper"; type PromptNodeData = { prompt?: string; model?: string; _status?: string; _statusMessage?: string; }; export type PromptNode = Node; export default function PromptNode({ id, data, selected, }: NodeProps) { const updateData = useMutation(api.nodes.updateData); const [prompt, setPrompt] = useState(data.prompt ?? ""); const [isEditing, setIsEditing] = useState(false); useEffect(() => { if (!isEditing) { setPrompt(data.prompt ?? ""); } }, [data.prompt, isEditing]); const savePrompt = useDebouncedCallback( (newPrompt: string) => { updateData({ nodeId: id as Id<"nodes">, data: { ...data, prompt: newPrompt, _status: undefined, _statusMessage: undefined, }, }); }, 500, ); const handleChange = useCallback( (e: React.ChangeEvent) => { const newPrompt = e.target.value; setPrompt(newPrompt); savePrompt(newPrompt); }, [savePrompt], ); return (
✨ Prompt
{isEditing ? (