From 84ac0a88dc33edc8ed28805a8abb6e7c499a152d Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Mon, 10 Mar 2025 20:54:31 +0800 Subject: [PATCH] feat(solution): add layout and page components for problem solution, including footer --- .../[id]/@problem/@solution/layout.tsx | 30 +++++++++++++++++ .../problems/[id]/@problem/@solution/page.tsx | 32 +++++++++++++++++++ .../playground/problem/solution/footer.tsx | 23 +++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 src/app/(app)/problems/[id]/@problem/@solution/layout.tsx create mode 100644 src/app/(app)/problems/[id]/@problem/@solution/page.tsx create mode 100644 src/features/playground/problem/solution/footer.tsx diff --git a/src/app/(app)/problems/[id]/@problem/@solution/layout.tsx b/src/app/(app)/problems/[id]/@problem/@solution/layout.tsx new file mode 100644 index 0000000..b90b74c --- /dev/null +++ b/src/app/(app)/problems/[id]/@problem/@solution/layout.tsx @@ -0,0 +1,30 @@ +import prisma from "@/lib/prisma"; +import ProblemSolutionFooter from "@/features/playground/problem/solution/footer"; + +interface ProblemSolutionLayoutProps { + params: Promise<{ id: string }>; + children: React.ReactNode; +} + +export default async function ProblemSolutionLayout({ + params, + children, +}: ProblemSolutionLayoutProps) { + const { id } = await params; + + const problem = await prisma.problem.findUnique({ + where: { id: parseInt(id) }, + select: { + title: true, + }, + }); + + const title = problem?.title ?? ""; + + return ( +
+
{children}
+ +
+ ); +} diff --git a/src/app/(app)/problems/[id]/@problem/@solution/page.tsx b/src/app/(app)/problems/[id]/@problem/@solution/page.tsx new file mode 100644 index 0000000..e27f01b --- /dev/null +++ b/src/app/(app)/problems/[id]/@problem/@solution/page.tsx @@ -0,0 +1,32 @@ +import prisma from "@/lib/prisma"; +import { notFound } from "next/navigation"; +import { MdxRenderer } from "@/components/content/mdx-renderer"; +import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; + +interface ProblemSolutionPageProps { + params: Promise<{ id: string }>; +} + +export default async function ProblemSolutionPage({ + params, +}: ProblemSolutionPageProps) { + const { id } = await params; + + const problem = await prisma.problem.findUnique({ + where: { id: parseInt(id) }, + select: { + solution: true, + }, + }); + + if (!problem) { + notFound(); + } + + return ( + + + + + ); +} diff --git a/src/features/playground/problem/solution/footer.tsx b/src/features/playground/problem/solution/footer.tsx new file mode 100644 index 0000000..69a21d0 --- /dev/null +++ b/src/features/playground/problem/solution/footer.tsx @@ -0,0 +1,23 @@ +import { cn } from "@/lib/utils"; + +interface ProblemSolutionFooterProps { + title: string; + className?: string; +} + +export default function ProblemSolutionFooter({ + title, + className, + ...props +}: ProblemSolutionFooterProps) { + return ( + + ); +}