blob: a07eb86f7b8dd90440df0031225cc39720554600 [file] [log] [blame]
gio5f2f1002025-03-20 18:38:48 +04001import { Button } from "@/components/ui/button";
2import { ReactFlowInstance, useReactFlow } from "@xyflow/react";
3import { v4 as uuidv4 } from "uuid";
4import { useCallback, useState } from "react";
5import { Accordion, AccordionTrigger } from "./ui/accordion";
6import { AccordionContent, AccordionItem } from "@radix-ui/react-accordion";
gioa2a845c2025-05-08 11:27:14 +00007import { NodeType, useCategories } from "@/lib/state";
gio5f2f1002025-03-20 18:38:48 +04008import { CategoryItem } from "@/lib/categories";
9import { Icon } from "./icon";
10
gioa2a845c2025-05-08 11:27:14 +000011function addResource(i: CategoryItem<NodeType>, flow: ReactFlowInstance) {
giod0026612025-05-08 13:00:36 +000012 flow.addNodes({
13 id: uuidv4(),
14 position: {
15 x: 0,
16 y: 0,
17 },
18 type: i.type,
19 connectable: true,
20 data: i.init,
21 });
gio5f2f1002025-03-20 18:38:48 +040022}
23
24export function Resources() {
giod0026612025-05-08 13:00:36 +000025 const flow = useReactFlow();
26 const categories = useCategories();
27 const onResourceAdd = useCallback(
28 (item: CategoryItem<NodeType>) => {
29 return () => addResource(item, flow);
30 },
31 [flow],
32 );
33 const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
34 return (
35 <>
36 <Accordion type="multiple" value={open} onValueChange={(v) => setOpen(v)}>
37 {categories.map((c) => (
38 <AccordionItem key={c.title} value={c.title} className={"px-3" + (c.active ? " bg-amber-100" : "")}>
39 <AccordionTrigger>{c.title}</AccordionTrigger>
40 <AccordionContent>
41 <div className="flex flex-col space-y-1">
42 {c.items.map((item) => (
43 <Button
44 key={item.title}
45 onClick={onResourceAdd(item)}
46 style={{ justifyContent: "flex-start" }}
47 >
48 {Icon(item.type)}
49 {item.title}
50 </Button>
51 ))}
52 </div>
53 </AccordionContent>
54 </AccordionItem>
55 ))}
56 </Accordion>
57 </>
58 );
gio5f2f1002025-03-20 18:38:48 +040059}