"use client"; import { ColumnDef } from "@tanstack/react-table"; import { MoreHorizontal } from "lucide-react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Badge } from "@/components/ui/badge"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { generateShareToken } from "@/app/(sharing)/[token]/token"; export type Song = { title: string; artist: string; score?: number | null; userPlayDate: string | null; isFullCombo: boolean | null; isAllJustice: boolean | null; id: number; }; export const columns: ColumnDef[] = [ { accessorKey: "title", header: "Title", cell: ({ row }) => (
{row.original.title} {row.original.isFullCombo && ( Full Combo )} {row.original.isAllJustice && ( All Justice )}
{row.original.artist}
), }, { accessorKey: "score", header: "Score", cell: ({ row }) => row.original.score?.toLocaleString(), }, { accessorKey: "userPlayDate", header: "Date", }, { id: "actions", header: () =>
More
, cell: ({ row }) => { const song = row.original; const [error, setError] = useState(""); const router = useRouter(); const handleGenerateShareToken = async () => { const { token, error } = await generateShareToken(row.original.id); if (error) { setError(error); } else { const newTab = window.open(`/${token}/${row.original.id}`, '_blank'); if (newTab) { newTab.focus(); } else { // Handle popup blocker or inability to open new tab router.push(`/${token}/${row.original.id}`); } } }; return ( Actions navigator.clipboard.writeText(song.title)} > Copy song title Share Song ); }, }, ];