"use client"; import { usePathname, useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { MoreHorizontal, Plus, Star, Trash2, PenLine } from "lucide-react"; import { createDashboard, deleteDashboard, renameDashboard, setDefaultDashboard, } from "@/app/d/actions"; import type { DashboardMeta } from "@/app/d/actions"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; export function DashboardSwitcher({ dashboards }: { dashboards: DashboardMeta[] }) { const pathname = usePathname(); const router = useRouter(); const [, startTransition] = useTransition(); const [creatingNew, setCreatingNew] = useState(false); const [newName, setNewName] = useState(""); function activeSlug() { const m = pathname.match(/^\/d\/([^/]+)/); return m?.[1] ?? null; } function handleCreate() { if (!newName.trim()) return; startTransition(async () => { const created = await createDashboard(newName.trim()); setCreatingNew(false); setNewName(""); router.push(`/d/${created.slug}`); }); } return (
{/* Active tab highlights — overlay on top of the server-rendered links */} {dashboards.map((d) => { const isActive = activeSlug() === d.slug; return ( ); })} {creatingNew ? (
{ e.preventDefault(); handleCreate(); }} className="flex items-center gap-1 ml-1" > setNewName(e.target.value)} placeholder="Dashboard name" className="h-7 rounded border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring" onKeyDown={(e) => e.key === "Escape" && setCreatingNew(false)} />
) : ( )} {dashboards.map((d) => { const isActive = activeSlug() === d.slug; if (!isActive) return null; return 1} />; })}
); } function DashboardKebab({ dashboard, canDelete, }: { dashboard: DashboardMeta; canDelete: boolean; }) { const [, startTransition] = useTransition(); const [renaming, setRenaming] = useState(false); const [newName, setNewName] = useState(dashboard.name); function handleRename() { if (!newName.trim() || newName === dashboard.name) { setRenaming(false); return; } startTransition(async () => { await renameDashboard(dashboard.id, newName.trim()); setRenaming(false); }); } if (renaming) { return (
{ e.preventDefault(); handleRename(); }} className="flex items-center gap-1 ml-1" > setNewName(e.target.value)} className="h-7 rounded border border-input bg-background px-2 text-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring" onKeyDown={(e) => e.key === "Escape" && setRenaming(false)} />
); } return ( setRenaming(true)}> Rename {!dashboard.isDefault && ( startTransition(() => setDefaultDashboard(dashboard.id))} > Set as default )} {canDelete && ( <> startTransition(() => deleteDashboard(dashboard.id))} > Delete )} ); }