import Link from "next/link"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import prisma from "@/lib/prisma"; import { auth } from "@/lib/auth"; import { Skeleton } from "@/components/ui/skeleton"; import { getLocale, getTranslations } from "next-intl/server"; import { CircleCheckBigIcon, CircleDotIcon } from "lucide-react"; import { getColorClassForDifficulty } from "@/config/difficulty"; import type { Locale, ProblemLocalization } from "@/generated/client"; const getLocalizedTitle = ( localizations: ProblemLocalization[], locale: Locale ) => { if (!localizations || localizations.length === 0) { return "Unknown Title"; } const localization = localizations.find( (localization) => localization.locale === locale ); return localization?.content ?? localizations[0].content ?? "Unknown Title"; }; export const ProblemsetTable = async () => { const locale = await getLocale(); const t = await getTranslations(); const session = await auth(); const userId = session?.user?.id; const problems = await prisma.problem.findMany({ include: { localizations: { where: { type: "TITLE", }, }, }, }); const completedProblems = new Set(); const attemptedProblems = new Set(); if (userId) { const submissions = await prisma.submission.findMany({ where: { userId, }, select: { problemId: true, status: true, }, }); submissions.forEach((submission) => { if (submission.status === "AC") { completedProblems.add(submission.problemId); } else { attemptedProblems.add(submission.problemId); } }); completedProblems.forEach((problemId) => { attemptedProblems.delete(problemId); }); } return ( {t("ProblemsetPage.Status")} {t("ProblemsetPage.Title")} {t("ProblemsetPage.Difficulty")} {problems.map((problem, index) => ( {userId && (completedProblems.has(problem.id) ? ( {index + 1}.{" "} {getLocalizedTitle(problem.localizations, locale as Locale)} {t(`Difficulty.${problem.difficulty}`)} ))}
); }; export const ProblemsetTableSkeleton = ({ skeletonRows = 12, }: { skeletonRows?: number; }) => { return ( {Array.from({ length: skeletonRows }).map((_, index) => ( ))}
); };