"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { useMutation } from "convex/react"; import { useTheme } from "next-themes"; import { Monitor, Moon, Pencil, Sun, Trash2, Menu, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { api } from "@/convex/_generated/api"; import type { Id } from "@/convex/_generated/dataModel"; import { toast } from "@/lib/toast"; import { msg } from "@/lib/toast-messages"; import { useAuthQuery } from "@/hooks/use-auth-query"; type CanvasAppMenuProps = { canvasId: Id<"canvases">; }; export function CanvasAppMenu({ canvasId }: CanvasAppMenuProps) { const router = useRouter(); const canvas = useAuthQuery(api.canvases.get, { canvasId }); const removeCanvas = useMutation(api.canvases.remove); const renameCanvas = useMutation(api.canvases.update); const { theme = "system", setTheme } = useTheme(); const [renameOpen, setRenameOpen] = useState(false); const [renameValue, setRenameValue] = useState(""); const [renameSaving, setRenameSaving] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [deleteBusy, setDeleteBusy] = useState(false); useEffect(() => { if (renameOpen && canvas?.name !== undefined) { setRenameValue(canvas.name); } }, [renameOpen, canvas?.name]); const handleRename = async () => { const trimmed = renameValue.trim(); if (!trimmed) { const { title, desc } = msg.dashboard.renameEmpty; toast.error(title, desc); return; } if (trimmed === canvas?.name) { setRenameOpen(false); return; } setRenameSaving(true); try { await renameCanvas({ canvasId, name: trimmed }); toast.success(msg.dashboard.renameSuccess.title); setRenameOpen(false); } catch { toast.error(msg.dashboard.renameFailed.title); } finally { setRenameSaving(false); } }; const handleDelete = async () => { setDeleteBusy(true); try { await removeCanvas({ canvasId }); toast.success("Projekt gelöscht"); setDeleteOpen(false); router.replace("/dashboard"); router.refresh(); } catch { toast.error("Löschen fehlgeschlagen"); } finally { setDeleteBusy(false); } }; return ( <>
{ setRenameOpen(true); }} > Projekt umbenennen setDeleteOpen(true)} > Projekt löschen Erscheinungsbild setTheme("light")}> Hell {theme === "light" ? " ✓" : ""} setTheme("dark")}> Dunkel {theme === "dark" ? " ✓" : ""} setTheme("system")}> System {theme === "system" ? " ✓" : ""}
Projekt umbenennen Gib einen neuen Namen für dein Projekt ein. setRenameValue(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") void handleRename(); }} placeholder="Name" autoFocus /> Projekt löschen? “{canvas?.name ?? "dieses Projekt"}” und alle Knoten werden dauerhaft gelöscht. Das lässt sich nicht rückgängig machen. ); }