blob: 3a5b334c56023a586bbc228a78eab24cd3125863 [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";
gio69148322025-06-19 23:16:12 +04006import { AppState, useCategories, useMode, useProjectId, useStateStore } from "@/lib/state";
gio5f2f1002025-03-20 18:38:48 +04007import { CategoryItem } from "@/lib/categories";
8import { Icon } from "./icon";
gio69148322025-06-19 23:16:12 +04009import { AppNode, NodeType } from "config";
gio5f2f1002025-03-20 18:38:48 +040010
gio818da4e2025-05-12 14:45:35 +000011function addResource(i: CategoryItem<NodeType>, store: AppState) {
gioaf8db832025-05-13 14:43:05 +000012 const deselected = store.nodes.map((n) => ({
gio818da4e2025-05-12 14:45:35 +000013 ...n,
14 selected: false,
15 }));
gioaf8db832025-05-13 14:43:05 +000016 store.setNodes(deselected);
17 store.addNode({
18 id: uuidv4(),
19 type: i.type,
20 data: i.init,
21 selected: true,
22 connectable: true,
23 } as any); // eslint-disable-line @typescript-eslint/no-explicit-any
gio5f2f1002025-03-20 18:38:48 +040024}
25
26export function Resources() {
gio818da4e2025-05-12 14:45:35 +000027 const store = useStateStore();
giod0026612025-05-08 13:00:36 +000028 const categories = useCategories();
gio33046722025-05-16 14:49:55 +000029 const projectId = useProjectId();
30 const mode = useMode();
giod0026612025-05-08 13:00:36 +000031 const onResourceAdd = useCallback(
32 (item: CategoryItem<NodeType>) => {
gio818da4e2025-05-12 14:45:35 +000033 return () => addResource(item, store);
giod0026612025-05-08 13:00:36 +000034 },
gio818da4e2025-05-12 14:45:35 +000035 [store],
giod0026612025-05-08 13:00:36 +000036 );
gioaf8db832025-05-13 14:43:05 +000037
giod0026612025-05-08 13:00:36 +000038 const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
gioaf8db832025-05-13 14:43:05 +000039
giod0026612025-05-08 13:00:36 +000040 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" }}
gio33046722025-05-16 14:49:55 +000053 disabled={projectId == null || mode !== "edit"}
giod0026612025-05-08 13:00:36 +000054 >
gio69148322025-06-19 23:16:12 +040055 <Icon node={{ type: item.type, data: item.init } as AppNode} />
giod0026612025-05-08 13:00:36 +000056 {item.title}
57 </Button>
58 ))}
59 </div>
60 </AccordionContent>
61 </AccordionItem>
62 ))}
63 </Accordion>
64 </>
65 );
gio5f2f1002025-03-20 18:38:48 +040066}