blob: fbb1be7c42b7863115185ec0b577fc4fc4320705 [file] [log] [blame]
gio5f2f1002025-03-20 18:38:48 +04001import { Button } from "@/components/ui/button";
gio5f2f1002025-03-20 18:38:48 +04002import { v4 as uuidv4 } from "uuid";
3import { useCallback, useState } from "react";
4import { Accordion, AccordionTrigger } from "./ui/accordion";
5import { AccordionContent, AccordionItem } from "@radix-ui/react-accordion";
gio818da4e2025-05-12 14:45:35 +00006import { AppNode, AppState, NodeType, useCategories, useStateStore } from "@/lib/state";
gio5f2f1002025-03-20 18:38:48 +04007import { CategoryItem } from "@/lib/categories";
8import { Icon } from "./icon";
9
gio818da4e2025-05-12 14:45:35 +000010function addResource(i: CategoryItem<NodeType>, store: AppState) {
11 const node = {
giod0026612025-05-08 13:00:36 +000012 id: uuidv4(),
13 position: {
14 x: 0,
15 y: 0,
16 },
17 type: i.type,
18 connectable: true,
19 data: i.init,
gio818da4e2025-05-12 14:45:35 +000020 selected: true,
21 };
22 const nodes = store.nodes.map((n) => ({
23 ...n,
24 selected: false,
25 }));
26 nodes.push(node as AppNode);
27 store.setNodes(nodes);
gio5f2f1002025-03-20 18:38:48 +040028}
29
30export function Resources() {
gio818da4e2025-05-12 14:45:35 +000031 const store = useStateStore();
giod0026612025-05-08 13:00:36 +000032 const categories = useCategories();
33 const onResourceAdd = useCallback(
34 (item: CategoryItem<NodeType>) => {
gio818da4e2025-05-12 14:45:35 +000035 return () => addResource(item, store);
giod0026612025-05-08 13:00:36 +000036 },
gio818da4e2025-05-12 14:45:35 +000037 [store],
giod0026612025-05-08 13:00:36 +000038 );
39 const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
40 return (
41 <>
42 <Accordion type="multiple" value={open} onValueChange={(v) => setOpen(v)}>
43 {categories.map((c) => (
44 <AccordionItem key={c.title} value={c.title} className={"px-3" + (c.active ? " bg-amber-100" : "")}>
45 <AccordionTrigger>{c.title}</AccordionTrigger>
46 <AccordionContent>
47 <div className="flex flex-col space-y-1">
gio818da4e2025-05-12 14:45:35 +000048 {c.items.map((item: CategoryItem<NodeType>) => (
giod0026612025-05-08 13:00:36 +000049 <Button
50 key={item.title}
51 onClick={onResourceAdd(item)}
52 style={{ justifyContent: "flex-start" }}
53 >
gio0b4002c2025-05-11 15:48:51 +000054 <Icon type={item.type} />
giod0026612025-05-08 13:00:36 +000055 {item.title}
56 </Button>
57 ))}
58 </div>
59 </AccordionContent>
60 </AccordionItem>
61 ))}
62 </Accordion>
63 </>
64 );
gio5f2f1002025-03-20 18:38:48 +040065}