blob: 39bf15a43af99e04c9c7e4b6a08a6ea59ca67578 [file] [log] [blame]
giod0026612025-05-08 13:00:36 +00001import { NodeRect } from "./node-rect";
2import { nodeIsConnectable, nodeLabel, useStateStore, VolumeNode } from "@/lib/state";
3import { useEffect, useMemo } from "react";
gio5f2f1002025-03-20 18:38:48 +04004import { z } from "zod";
giod0026612025-05-08 13:00:36 +00005import { DeepPartial, EventType, useForm } from "react-hook-form";
6import { zodResolver } from "@hookform/resolvers/zod";
7import { Form, FormControl, FormField, FormItem, FormMessage } from "./ui/form";
8import { Input } from "./ui/input";
gio5f2f1002025-03-20 18:38:48 +04009import { Handle, Position } from "@xyflow/react";
10import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
gio3fb133d2025-06-13 07:20:24 +000011import { Name } from "./node-name";
12import { NodeDetailsProps } from "@/lib/types";
gio5f2f1002025-03-20 18:38:48 +040013
14export function NodeVolume(node: VolumeNode) {
giod0026612025-05-08 13:00:36 +000015 const { id, data, selected } = node;
16 const isConnectable = useMemo(() => nodeIsConnectable(node, "volume"), [node]);
17 return (
18 <NodeRect id={id} selected={selected} type={node.type} state={node.data.state}>
19 <div style={{ padding: "10px 20px" }}>
20 <div>{nodeLabel(node)}</div>
21 <div>{data.type && `${data.type}`}</div>
22 <div>{data.size && `${data.size}`}</div>
23 <Handle
24 id="volume"
25 type={"source"}
26 position={Position.Top}
27 isConnectableStart={isConnectable}
28 isConnectableEnd={isConnectable}
29 isConnectable={isConnectable}
30 />
31 </div>
32 </NodeRect>
33 );
gio5f2f1002025-03-20 18:38:48 +040034}
35
36const volumeTypes = ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany", "ReadWriteOncePod"] as const;
37
38const schema = z.object({
giod0026612025-05-08 13:00:36 +000039 type: z.enum(volumeTypes),
40 size: z.string().min(1).default("1Gi"),
gio5f2f1002025-03-20 18:38:48 +040041});
42
gio3fb133d2025-06-13 07:20:24 +000043export function NodeVolumeDetails({ node, disabled, showName = true }: NodeDetailsProps<VolumeNode>) {
gio08acd3a2025-06-12 12:15:30 +000044 const { id, data } = node;
giod0026612025-05-08 13:00:36 +000045 const store = useStateStore();
46 const form = useForm<z.infer<typeof schema>>({
47 resolver: zodResolver(schema),
48 mode: "onChange",
49 defaultValues: {
giod0026612025-05-08 13:00:36 +000050 type: undefined,
51 size: "",
52 },
53 });
54 useEffect(() => {
55 const sub = form.watch(
56 (
57 value: DeepPartial<z.infer<typeof schema>>,
58 { name, type }: { name?: keyof z.infer<typeof schema> | undefined; type?: EventType | undefined },
59 ) => {
60 if (type !== "change") {
61 return;
62 }
63 console.log({ name, type, value });
64 store.updateNodeData<"volume">(id, {
giod0026612025-05-08 13:00:36 +000065 type: value.type,
66 size: value.size,
67 });
68 },
69 );
70 return () => sub.unsubscribe();
71 }, [id, form, store]);
72 useEffect(() => {
73 form.reset({
giod0026612025-05-08 13:00:36 +000074 type: data.type,
75 size: data.size,
76 });
77 }, [form, data]);
78 return (
79 <>
gio3fb133d2025-06-13 07:20:24 +000080 {showName ? <Name node={node} disabled={disabled} /> : null}
giod0026612025-05-08 13:00:36 +000081 <Form {...form}>
82 <form className="space-y-2">
83 <FormField
84 control={form.control}
giod0026612025-05-08 13:00:36 +000085 name="type"
86 render={({ field }) => (
87 <FormItem>
gio3ec94242025-05-16 12:46:57 +000088 <Select onValueChange={field.onChange} defaultValue={field.value} disabled={disabled}>
giod0026612025-05-08 13:00:36 +000089 <FormControl>
90 <SelectTrigger>
91 <SelectValue placeholder="Volume Type" />
92 </SelectTrigger>
93 </FormControl>
94 <SelectContent>
95 {volumeTypes.map((t) => (
96 <SelectItem key={t} value={t}>
97 {t}
98 </SelectItem>
99 ))}
100 </SelectContent>
101 </Select>
102 <FormMessage />
103 </FormItem>
104 )}
105 />
106 <FormField
107 control={form.control}
108 name="size"
109 render={({ field }) => (
110 <FormItem>
111 <FormControl>
gio3ec94242025-05-16 12:46:57 +0000112 <Input placeholder="size" {...field} disabled={disabled} />
giod0026612025-05-08 13:00:36 +0000113 </FormControl>
114 <FormMessage />
115 </FormItem>
116 )}
117 />
118 </form>
119 </Form>
120 </>
121 );
122}