"use client"; import { CollapsibleTrigger } from "@radix-ui/react-collapsible"; import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "../ui/sidebar"; import { Collapsible, CollapsibleContent } from "../ui/collapsible"; import { ChevronDown, MoreHorizontal } from "lucide-react"; import { Route, Workspace, LayoutNode } from "@/lib/types"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { useState } from "react"; type Props = { node: LayoutNode; workspace: Workspace; setRoute: (route: Route) => void; addEntity: ( type: "todo" | "doc", parentGroupId: string | null, name?: string, ) => string | undefined; addGroup: (name: string | undefined, parentGroupId: string | null) => string; renameEntity: (entityId: string, newName: string) => void; deleteEntity: (entityId: string) => void; removeNode: (id: string) => void; renameGroup: (id: string, name: string) => void; }; export default function EntitySwitch({ node, workspace, setRoute, addEntity, addGroup, renameEntity, deleteEntity, removeNode, renameGroup, }: Props) { const [menuOpen, setMenuOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [dialogValue, setDialogValue] = useState(""); const [dialogMode, setDialogMode] = useState< "rename-group" | "rename-item" | "add-item" | "add-group" >("rename-item"); const openDialog = (mode: typeof dialogMode, initial = "") => { setDialogMode(mode); // supply default for add-item if (mode === "add-item") { setDialogValue("New list"); } else { setDialogValue(initial); } setDialogOpen(true); setMenuOpen(false); }; const handleDialogSubmit = () => { if (dialogMode === "rename-group" && node.type === "group") { renameGroup(node.id, dialogValue); } else if (dialogMode === "rename-item" && node.type === "item") { renameEntity(node.entityId, dialogValue); } else if (dialogMode === "add-item") { const parentId = node.type === "group" ? node.id : null; addEntity("todo", parentId, dialogValue || "New list"); } else if (dialogMode === "add-group") { const parentId = node.type === "group" ? node.id : null; addGroup(dialogValue || "New group", parentId); } setDialogOpen(false); }; // ---- GROUP ---- if (node.type === "group") { return ( <>
{node.name} openDialog("add-item")}> Add list openDialog("add-group")}> Add group openDialog("rename-group", node.name)} > Rename { if ( window.confirm("Delete this group and its children?") ) { removeNode(node.id); } }} > Delete
{node.children.map((child) => ( ))}
{/* dialog for add/rename */} {dialogMode.startsWith("rename") ? "Rename" : dialogMode === "add-item" ? "Add new list" : "Add new group"} {dialogMode === "add-item" && "A default todo list will be created."} {dialogMode === "add-group" && "Enter the name for the new group."} setDialogValue(e.target.value)} className="w-full" /> ); } // ---- ITEM ---- const workspaceEntity = workspace.entities[node.entityId]; if (!workspaceEntity) { return null; } return (
setRoute({ workspace: workspace.id, entity: node.entityId, }) } > {workspaceEntity.name} openDialog("rename-item", workspaceEntity.name)} > Rename { if (window.confirm("Delete this list?")) { deleteEntity(node.entityId); } }} > Delete
); }