blob: 7471c1fec27fa46933ee00ba5ceb62770430253b [file] [log] [blame]
import { Button } from "@/components/ui/button";
import { ReactFlowInstance, useReactFlow } from "@xyflow/react";
import { v4 as uuidv4 } from "uuid";
import { useCallback, useState } from "react";
import { Accordion, AccordionTrigger } from "./ui/accordion";
import { AccordionContent, AccordionItem } from "@radix-ui/react-accordion";
import { useCategories } from "@/lib/state";
import { CategoryItem } from "@/lib/categories";
import { Icon } from "./icon";
function addResource(i: CategoryItem, flow: ReactFlowInstance) {
flow.addNodes({
id: uuidv4(),
position: {
x: 0,
y: 0,
},
type: i.type,
connectable: true,
data: i.init,
});
}
export function Resources() {
let flow = useReactFlow();
const categories = useCategories();
let onResourceAdd = useCallback((item: CategoryItem) => {
return () => addResource(item, flow);
}, [flow]);
const [open, setOpen] = useState<string[]>(categories.map((c) => c.title));
return (
<>
<Accordion type="multiple" value={open} onValueChange={(v) => setOpen(v)}>
{categories.map((c) => (
<AccordionItem key={c.title} value={c.title} className={"px-3" + (c.active ? " bg-amber-100" : "")}>
<AccordionTrigger>
{c.title}
</AccordionTrigger>
<AccordionContent>
<div className="flex flex-col space-y-1">
{c.items.map((item) => (
<Button key={item.title} onClick={onResourceAdd(item)} style={{ justifyContent: "flex-start" }}>{Icon(item.type)}{item.title}</Button>
))}
</div>
</AccordionContent>
</AccordionItem>
))}
</Accordion>
</>
);
}