blob: 1fd631af675e332419b97c87cdf967e21577f114 [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";
gio33046722025-05-16 14:49:55 +00006import { AppState, NodeType, useCategories, useMode, useProjectId, 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();
gio33046722025-05-16 14:49:55 +000028 const projectId = useProjectId();
29 const mode = useMode();
giod0026612025-05-08 13:00:36 +000030 const onResourceAdd = useCallback(
31 (item: CategoryItem<NodeType>) => {
gio818da4e2025-05-12 14:45:35 +000032 return () => addResource(item, store);
giod0026612025-05-08 13:00:36 +000033 },
gio818da4e2025-05-12 14:45:35 +000034 [store],
giod0026612025-05-08 13:00:36 +000035 );
gioaf8db832025-05-13 14:43:05 +000036
giod0026612025-05-08 13:00:36 +000037 const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
gioaf8db832025-05-13 14:43:05 +000038
giod0026612025-05-08 13:00:36 +000039 return (
40 <>
41 <Accordion type="multiple" value={open} onValueChange={(v) => setOpen(v)}>
42 {categories.map((c) => (
43 <AccordionItem key={c.title} value={c.title} className={"px-3" + (c.active ? " bg-amber-100" : "")}>
44 <AccordionTrigger>{c.title}</AccordionTrigger>
45 <AccordionContent>
46 <div className="flex flex-col space-y-1">
gio818da4e2025-05-12 14:45:35 +000047 {c.items.map((item: CategoryItem<NodeType>) => (
giod0026612025-05-08 13:00:36 +000048 <Button
49 key={item.title}
50 onClick={onResourceAdd(item)}
51 style={{ justifyContent: "flex-start" }}
gio33046722025-05-16 14:49:55 +000052 disabled={projectId == null || mode !== "edit"}
giod0026612025-05-08 13:00:36 +000053 >
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}