text-input-node-demo

PreviousNext
Docs
simple-aiexample

Preview

Loading preview…
./src/registry/examples/text-input-node-demo.tsx
"use client";

import "@xyflow/react/dist/style.css";

import {
	addEdge,
	applyEdgeChanges,
	applyNodeChanges,
	Background,
	type Connection,
	type EdgeChange,
	type Node,
	type NodeChange,
	type NodeProps,
	type NodeTypes,
	ReactFlow,
	ReactFlowProvider,
} from "@xyflow/react";

import { useCallback, useState } from "react";
import { TextInputNode } from "@/registry/ui/flow/text-input-node";

const TextInputNodeController = ({ id, data, ...props }: NodeProps<Node>) => {
	const [value, setValue] = useState("Hello World!");

	return (
		<TextInputNode
			id={id}
			data={{
				status: "idle",
				config: { value },
			}}
			{...props}
			type="text-input"
			onTextChange={(value) => setValue(value)}
			onDeleteNode={() => {}}
		/>
	);
};

const nodeTypes: NodeTypes = {
	"text-input": TextInputNodeController,
};

const initialNodes = [
	{
		id: "node-1",
		type: "text-input",
		position: { x: 0, y: -50 },
		data: {},
	},
];

export default function ResizableNodeDemo() {
	const [nodes, setNodes] = useState<Node[]>(initialNodes);
	const [edges, setEdges] = useState([]);

	// Add default viewport configuration
	const defaultViewport = { x: 100, y: 120, zoom: 1.2 };

	const onNodesChange = useCallback(
		(changes: NodeChange<Node>[]) =>
			setNodes((nds) => applyNodeChanges(changes, nds)),
		[],
	);
	const onEdgesChange = useCallback(
		(changes: EdgeChange<never>[]) =>
			setEdges((eds) => applyEdgeChanges(changes, eds)),
		[],
	);
	const onConnect = useCallback(
		(connection: Connection) => setEdges((eds) => addEdge(connection, eds)),
		[],
	);
	return (
		<div className="w-full h-full">
			<ReactFlowProvider>
				<ReactFlow
					nodes={nodes}
					edges={edges}
					onNodesChange={onNodesChange}
					onEdgesChange={onEdgesChange}
					onConnect={onConnect}
					nodeTypes={nodeTypes}
					defaultViewport={defaultViewport}
					/* fitView */
				>
					<Background />
				</ReactFlow>
			</ReactFlowProvider>
		</div>
	);
}

Installation

npx shadcn@latest add @simple-ai/text-input-node-demo

Usage

import { TextInputNodeDemo } from "@/components/text-input-node-demo"
<TextInputNodeDemo />