185 lines
5.9 KiB
TypeScript
185 lines
5.9 KiB
TypeScript
"use client";
|
||
|
||
import { ColumnDef } from "@tanstack/react-table";
|
||
import { Button } from "@/components/ui/button";
|
||
import { ArrowUpDown, Badge } from "lucide-react";
|
||
import { chuni_score_playlog } from "@/prisma/schemas/artemis/generated/artemis";
|
||
import { chuni_static_music } from "@/prisma/schemas/artemis/generated/artemis";
|
||
import { getDifficultyText, getGrade } from "@/lib/helpers";
|
||
import ActionsCell from "./moreAction";
|
||
import ImageCell from "./image";
|
||
type chunithm = chuni_score_playlog &
|
||
chuni_static_music & { playCount: number };
|
||
|
||
export const columns: ColumnDef<chunithm>[] = [
|
||
{
|
||
accessorKey: "title",
|
||
header: "Title",
|
||
|
||
cell: ({ row }) => {
|
||
return (
|
||
<div className="text-bold flex items-center">
|
||
<ImageCell jacketPath={row.original.jacketPath!} />
|
||
<div className="ml-2 flex flex-col">
|
||
<span>{row.original.title}</span>
|
||
<div className="bold mt-2 w-32 rounded-sm bg-primary pl-1 text-primary-foreground">
|
||
Rating: {(row.original.playerRating! / 100).toFixed(2)}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
},
|
||
},
|
||
|
||
{
|
||
accessorKey: "score",
|
||
header: ({ column }) => {
|
||
return (
|
||
<Button variant="ghost">
|
||
Score
|
||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||
</Button>
|
||
);
|
||
},
|
||
cell: ({ row }) => {
|
||
// for the love of all that is holy redo this later or be forced to drink from the chalice
|
||
const skillId = row.original.skillId;
|
||
const isClear = row.original.isClear;
|
||
let isSuccessText = "";
|
||
if (isClear === 1 && skillId === 100010) {
|
||
isSuccessText = "Limit Break";
|
||
} else if (isClear === 1 && skillId === 100011) {
|
||
isSuccessText = "Limit Break++";
|
||
} else if (isClear === 1 && skillId === 100012) {
|
||
isSuccessText = "Limit Break+++";
|
||
} else if (isClear === 1 && skillId === 100013) {
|
||
isSuccessText = "Campaign";
|
||
} else if (isClear === 1 && skillId === 101000) {
|
||
isSuccessText = "Guard ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101001) {
|
||
isSuccessText = "Boost ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101002) {
|
||
isSuccessText = "Combo ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101003) {
|
||
isSuccessText = "A-Guilty ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101004) {
|
||
isSuccessText = "Judge ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101005) {
|
||
isSuccessText = "Judge++ ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101006) {
|
||
isSuccessText = "Emblem ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101007) {
|
||
isSuccessText = "Emblem++ ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 101008) {
|
||
isSuccessText = "Absolute++ã€<C3A3>SUN】";
|
||
} else if (isClear === 1 && skillId === 102000) {
|
||
isSuccessText = "Guardã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102001) {
|
||
isSuccessText = "Boost ã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102002) {
|
||
isSuccessText = "Comboã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102003) {
|
||
isSuccessText = "A-Guiltyã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102004) {
|
||
isSuccessText = "Judge ã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102005) {
|
||
isSuccessText = "Judge++ã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102006) {
|
||
isSuccessText = "Emblemã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102007) {
|
||
isSuccessText = "Emblem++ã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102008) {
|
||
isSuccessText = "Absolute++ ã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 102009) {
|
||
isSuccessText = "Catastropyã€<C3A3>LMN】";
|
||
} else if (isClear === 1 && skillId === 800003) {
|
||
isSuccessText = "Clear";
|
||
} else if (isClear === 0) {
|
||
isSuccessText = "Failed";
|
||
} else if (isClear === 1) {
|
||
isSuccessText = "Clear";
|
||
} else {
|
||
isSuccessText = isClear?.toString() ?? "";
|
||
}
|
||
|
||
return (
|
||
<div>
|
||
{row.original.score?.toLocaleString()}
|
||
<div className="mt-2 w-40 rounded-sm bg-primary pl-2 text-primary-foreground">
|
||
{isSuccessText}
|
||
</div>
|
||
<div
|
||
className={`mt-2 w-40 rounded-sm pl-2 ${
|
||
row.original.isNewRecord
|
||
? "bg-primary text-primary-foreground"
|
||
: "invisible"
|
||
}`}
|
||
>
|
||
<span>New!!</span>
|
||
</div>
|
||
</div>
|
||
);
|
||
},
|
||
},
|
||
|
||
{
|
||
accessorKey: "grade",
|
||
header: "Grade",
|
||
cell: ({ row }) => (
|
||
<div className="font-medium"> {getGrade(row.original.score ?? 0)}</div>
|
||
),
|
||
},
|
||
{
|
||
accessorKey: "userPlayDate",
|
||
header: ({ column }) => {
|
||
return (
|
||
<Button
|
||
variant="ghost"
|
||
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
|
||
>
|
||
Date
|
||
<ArrowUpDown className="ml-2 h-4 w-4" />
|
||
</Button>
|
||
);
|
||
},
|
||
},
|
||
{
|
||
accessorKey: "difficulty",
|
||
header: "Difficulty",
|
||
cell: ({ row }) => (
|
||
<div className="font-medium">
|
||
{row.original.level}
|
||
<br />
|
||
{getDifficultyText(row.original.chartId)}
|
||
</div>
|
||
),
|
||
},
|
||
{
|
||
accessorKey: "FC / AJ",
|
||
header: "FC / AJ",
|
||
cell: ({ row }) => (
|
||
<div className="font-medium">
|
||
{!row.original.isAllJustice && row.original.isFullCombo && (
|
||
<span>Full Combo</span>
|
||
)}
|
||
{row.original.isAllJustice && <span>All Justice</span>}
|
||
</div>
|
||
),
|
||
},
|
||
|
||
{
|
||
accessorKey: "Attempts",
|
||
header: "Attempts",
|
||
|
||
cell: ({ row }) => (
|
||
<div className="font-medium">{row.original.playCount}</div>
|
||
),
|
||
},
|
||
// for fixing react-hooks/rules-of-hooks
|
||
{
|
||
id: "actions",
|
||
header: () => <div className="pl-2 text-left">More</div>,
|
||
cell: ({ row }) => <ActionsCell row={row} />,
|
||
},
|
||
];
|