"use client"; import { useState, useCallback } from "react"; import { 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 BaseNodeWrapper from "./base-node-wrapper"; type FrameNodeData = { label?: string; resolution?: string; _status?: string; _statusMessage?: string; }; export type FrameNode = Node; export default function FrameNode({ id, data, selected }: NodeProps) { const updateData = useMutation(api.nodes.updateData); const [editingLabel, setEditingLabel] = useState(null); const displayLabel = data.label ?? "Frame"; const isEditing = editingLabel !== null; const handleDoubleClick = useCallback(() => { setEditingLabel(displayLabel); }, [displayLabel]); const handleBlur = useCallback(() => { if (editingLabel !== null && editingLabel !== data.label) { updateData({ nodeId: id as Id<"nodes">, data: { ...data, label: editingLabel, _status: undefined, _statusMessage: undefined, }, }); } setEditingLabel(null); }, [editingLabel, data, id, updateData]); return ( {isEditing ? ( setEditingLabel(e.target.value)} onBlur={handleBlur} onKeyDown={(e) => e.key === "Enter" && handleBlur()} autoFocus className="nodrag text-xs font-medium text-blue-500 bg-transparent border-0 outline-none w-full" /> ) : (
🖥️ {displayLabel}{" "} {data.resolution && ( ({data.resolution}) )}
)}
); }