From 148ae677d73797d77ddf3b59d29df8e369d0833c Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Tue, 13 May 2025 16:03:46 +0800 Subject: [PATCH] refactor(problemset): move components to separate files and improve structure - Move ProblemsetHeader component from 'problemset-header' to 'header' - Extract problemset table logic into dedicated ProblemsetTable component - Add Suspense and skeleton loading for better UX - Update layout and page structure --- src/app/(app)/problemset/layout.tsx | 2 +- src/app/(app)/problemset/page.tsx | 78 ++++------------------------- 2 files changed, 11 insertions(+), 69 deletions(-) diff --git a/src/app/(app)/problemset/layout.tsx b/src/app/(app)/problemset/layout.tsx index efed448..0a1981f 100644 --- a/src/app/(app)/problemset/layout.tsx +++ b/src/app/(app)/problemset/layout.tsx @@ -1,4 +1,4 @@ -import { ProblemsetHeader } from "@/features/problemset/components/problemset-header"; +import { ProblemsetHeader } from "@/features/problemset/components/header"; interface ProblemsetLayoutProps { children: React.ReactNode; diff --git a/src/app/(app)/problemset/page.tsx b/src/app/(app)/problemset/page.tsx index 89c6b1b..a35586a 100644 --- a/src/app/(app)/problemset/page.tsx +++ b/src/app/(app)/problemset/page.tsx @@ -1,73 +1,15 @@ -import Link from "next/link"; +import { Suspense } from "react"; import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import prisma from "@/lib/prisma"; -import { auth } from "@/lib/auth"; -import { getTranslations } from "next-intl/server"; -import { getDifficultyColorClass } from "@/lib/utils"; -import { CircleCheckBigIcon, CircleDotIcon } from "lucide-react"; - -export default async function ProblemsetPage() { - const problems = await prisma.problem.findMany({ - where: { published: true }, - orderBy: { id: "asc" }, - select: { id: true, title: true, difficulty: true }, - }); - - const session = await auth(); - const userId = session?.user?.id; - - const submissions = userId - ? await prisma.submission.findMany({ - where: { userId }, - select: { problemId: true, status: true }, - }) - : []; - - const completedProblems = new Set(submissions.filter(s => s.status === "AC").map(s => s.problemId)); - const attemptedProblems = new Set(submissions.filter(s => s.status !== "AC").map(s => s.problemId)); - - const t = await getTranslations(); + ProblemsetTable, + ProblemsetTableSkeleton, +} from "@/features/problemset/components/table"; +export default function ProblemsetPage() { return ( - - - - {t("ProblemsetPage.Status")} - {t("ProblemsetPage.Title")} - {t("ProblemsetPage.Difficulty")} - - - - {problems.map((problem, index) => ( - - - {userId && (completedProblems.has(problem.id) ? ( - - - - {index + 1}. {problem.title} - - - - {t(`Difficulty.${problem.difficulty}`)} - - - ))} - -
+
+ }> + + +
); }