"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 ? (
) : (
)}
{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 (
);
}
return (
setRenaming(true)}>
Rename
{!dashboard.isDefault && (
startTransition(() => setDefaultDashboard(dashboard.id))}
>
Set as default
)}
{canDelete && (
<>
startTransition(() => deleteDashboard(dashboard.id))}
>
Delete
>
)}
);
}