blob: 89323b9fb44c10ca25ba6fcc02cc1c50cbe7c370 [file] [log] [blame]
gio5f2f1002025-03-20 18:38:48 +04001import { NodeRect } from './node-rect';
giof96ffb82025-04-24 09:31:05 +00002import { nodeLabel, MongoDBNode, useStateStore } from '@/lib/state';
3import { useEffect } from 'react';
gio5f2f1002025-03-20 18:38:48 +04004import { Handle, Position } from "@xyflow/react";
giof96ffb82025-04-24 09:31:05 +00005import { z } from "zod";
6import { DeepPartial, EventType, useForm } from 'react-hook-form';
7import { zodResolver } from '@hookform/resolvers/zod';
8import { Form, FormControl, FormField, FormItem, FormMessage } from './ui/form';
9import { Input } from './ui/input';
gio5f2f1002025-03-20 18:38:48 +040010
11export function NodeMongoDB(node: MongoDBNode) {
12 const { id, selected } = node;
13 return (
14 <NodeRect id={id} selected={selected} type={node.type}>
15 <div style={{ padding: '10px 20px' }}>
16 {nodeLabel(node)}
17 <Handle
18 id="env_var"
19 type={"source"}
20 position={Position.Top}
21 isConnectableStart={true}
22 isConnectableEnd={true}
23 isConnectable={true}
24 />
25 </div>
26 </NodeRect>
27 );
28}
29
giof96ffb82025-04-24 09:31:05 +000030const schema = z.object({
31 name: z.string().min(1, "required"),
32});
33
34export function NodeMongoDBDetails({ id, data }: MongoDBNode) {
35 const store = useStateStore();
36 const form = useForm<z.infer<typeof schema>>({
37 resolver: zodResolver(schema),
38 mode: "onChange",
39 defaultValues: {
40 name: data.label,
41 }
42 });
43 useEffect(() => {
44 const sub = form.watch((value: DeepPartial<z.infer<typeof schema>>, { type }: { name?: keyof z.infer<typeof schema> | undefined, type?: EventType | undefined }) => {
45 if (type !== "change") {
46 return;
47 }
48 store.updateNodeData<"mongodb">(id, {
49 label: value.name,
50 });
51 });
52 return () => sub.unsubscribe();
53 }, [form, store]);
gio5f2f1002025-03-20 18:38:48 +040054 return (
55 <>
giof96ffb82025-04-24 09:31:05 +000056 <Form {...form}>
57 <form className="space-y-2">
58 <FormField
59 control={form.control}
60 name="name"
61 render={({ field }) => (
62 <FormItem>
63 <FormControl>
64 <Input placeholder="name" className="border border-black" {...field} />
65 </FormControl>
66 <FormMessage />
67 </FormItem>
68 )}
69 />
70 </form>
71 </Form>
gio5f2f1002025-03-20 18:38:48 +040072 </>);
73}