blob: ddb68acaa83afd87f7877fd60d6395ec813912ce [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";
gioaf8db832025-05-13 14:43:05 +00006import { 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) {
gioaf8db832025-05-13 14:43:05 +000011 const deselected = store.nodes.map((n) => ({
gio818da4e2025-05-12 14:45:35 +000012 ...n,
13 selected: false,
14 }));
gioaf8db832025-05-13 14:43:05 +000015 store.setNodes(deselected);
16 store.addNode({
17 id: uuidv4(),
18 type: i.type,
19 data: i.init,
20 selected: true,
21 connectable: true,
22 } as any); // eslint-disable-line @typescript-eslint/no-explicit-any
gio5f2f1002025-03-20 18:38:48 +040023}
24
25export function Resources() {
gio818da4e2025-05-12 14:45:35 +000026 const store = useStateStore();
giod0026612025-05-08 13:00:36 +000027 const categories = useCategories();
gioaf8db832025-05-13 14:43:05 +000028
giod0026612025-05-08 13:00:36 +000029 const onResourceAdd = useCallback(
30 (item: CategoryItem<NodeType>) => {
gio818da4e2025-05-12 14:45:35 +000031 return () => addResource(item, store);
giod0026612025-05-08 13:00:36 +000032 },
gio818da4e2025-05-12 14:45:35 +000033 [store],
giod0026612025-05-08 13:00:36 +000034 );
gioaf8db832025-05-13 14:43:05 +000035
giod0026612025-05-08 13:00:36 +000036 const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
gioaf8db832025-05-13 14:43:05 +000037
giod0026612025-05-08 13:00:36 +000038 return (
39 <>
40 <Accordion type="multiple" value={open} onValueChange={(v) => setOpen(v)}>
41 {categories.map((c) => (
42 <AccordionItem key={c.title} value={c.title} className={"px-3" + (c.active ? " bg-amber-100" : "")}>
43 <AccordionTrigger>{c.title}</AccordionTrigger>
44 <AccordionContent>
45 <div className="flex flex-col space-y-1">
gio818da4e2025-05-12 14:45:35 +000046 {c.items.map((item: CategoryItem<NodeType>) => (
giod0026612025-05-08 13:00:36 +000047 <Button
48 key={item.title}
49 onClick={onResourceAdd(item)}
50 style={{ justifyContent: "flex-start" }}
51 >
gio0b4002c2025-05-11 15:48:51 +000052 <Icon type={item.type} />
giod0026612025-05-08 13:00:36 +000053 {item.title}
54 </Button>
55 ))}
56 </div>
57 </AccordionContent>
58 </AccordionItem>
59 ))}
60 </Accordion>
61 </>
62 );
gio5f2f1002025-03-20 18:38:48 +040063}