"use client"; import { useState, useCallback, useEffect } from "react"; import { Handle, Position, type NodeProps, type Node } from "@xyflow/react"; import type { Id } from "@/convex/_generated/dataModel"; import BaseNodeWrapper from "./base-node-wrapper"; import { useCanvasSync } from "@/components/canvas/canvas-sync-context"; type GroupNodeData = { label?: string; _status?: string; _statusMessage?: string; }; export type GroupNode = Node; export default function GroupNode({ id, data, selected }: NodeProps) { const { queueNodeDataUpdate } = useCanvasSync(); const [label, setLabel] = useState(data.label ?? "Gruppe"); const [isEditing, setIsEditing] = useState(false); useEffect(() => { if (!isEditing) { // eslint-disable-next-line react-hooks/set-state-in-effect setLabel(data.label ?? "Gruppe"); } }, [data.label, isEditing]); const handleBlur = useCallback(() => { setIsEditing(false); if (label !== data.label) { void queueNodeDataUpdate({ nodeId: id as Id<"nodes">, data: { ...data, label, _status: undefined, _statusMessage: undefined, }, }); } }, [label, data, id, queueNodeDataUpdate]); return ( {isEditing ? ( setLabel(e.target.value)} onBlur={handleBlur} onKeyDown={(e) => e.key === "Enter" && handleBlur()} autoFocus className="nodrag text-xs font-medium text-muted-foreground bg-transparent border-0 outline-none w-full" /> ) : (
setIsEditing(true)} className="text-xs font-medium text-muted-foreground cursor-text" > 📁 {label}
)}
); }