From 105802a209f00114db961dd6bade31e05d38d7b3 Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Sun, 13 Apr 2025 12:06:08 +0800 Subject: [PATCH] feat(problem): add parallel routes --- src/app/(app)/problems/[id]/@Bot/page.tsx | 125 ++++++++++++++++++ src/app/(app)/problems/[id]/@Code/page.tsx | 17 +++ .../(app)/problems/[id]/@Description/page.tsx | 42 ++++++ .../(app)/problems/[id]/@Solutions/page.tsx | 43 ++++++ .../(app)/problems/[id]/@Submissions/page.tsx | 36 +++++ .../(app)/problems/[id]/@TestResult/page.tsx | 3 + .../(app)/problems/[id]/@Testcase/page.tsx | 41 ++++++ 7 files changed, 307 insertions(+) create mode 100644 src/app/(app)/problems/[id]/@Bot/page.tsx create mode 100644 src/app/(app)/problems/[id]/@Code/page.tsx create mode 100644 src/app/(app)/problems/[id]/@Description/page.tsx create mode 100644 src/app/(app)/problems/[id]/@Solutions/page.tsx create mode 100644 src/app/(app)/problems/[id]/@Submissions/page.tsx create mode 100644 src/app/(app)/problems/[id]/@TestResult/page.tsx create mode 100644 src/app/(app)/problems/[id]/@Testcase/page.tsx diff --git a/src/app/(app)/problems/[id]/@Bot/page.tsx b/src/app/(app)/problems/[id]/@Bot/page.tsx new file mode 100644 index 0000000..09bc148 --- /dev/null +++ b/src/app/(app)/problems/[id]/@Bot/page.tsx @@ -0,0 +1,125 @@ +"use client"; + +import { toast } from "sonner"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { useCallback } from "react"; +import { useChat } from "@ai-sdk/react"; +import { Button } from "@/components/ui/button"; +import { useProblem } from "@/hooks/use-problem"; +import MdxPreview from "@/components/mdx-preview"; +import { Textarea } from "@/components/ui/textarea"; +import { BotIcon, SendHorizonal } from "lucide-react"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { ChatMessageList } from "@/components/ui/chat/chat-message-list"; +import { ChatBubble, ChatBubbleMessage } from "@/components/ui/chat/chat-bubble"; + +export default function Bot() { + const { problemId, problem, currentLang, currentValue } = useProblem(); + + const { messages, input, handleInputChange, setMessages, handleSubmit } = useChat({ + initialMessages: [ + { + id: problemId, + role: "system", + content: `Problem description:\n${problem.description}`, + }, + ], + }); + + const handleFormSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + + if (!input.trim()) { + toast.error("Input cannot be empty"); + return; + } + + const currentCodeMessage = { + id: problemId, + role: "system" as const, + content: `Current code:\n\`\`\`${currentLang}\n${currentValue}\n\`\`\``, + }; + + setMessages((prev) => [...prev, currentCodeMessage]); + handleSubmit(); + }, + [currentLang, currentValue, handleSubmit, input, problemId, setMessages] + ); + + return ( +
+
+ {!messages.some( + (message) => message.role === "user" || message.role === "assistant" + ) && ( +
+ + Ask Bot + Powered by Vercel Ai SDK +
+ )} + +
+ + + {messages + .filter( + (message) => message.role === "user" || message.role === "assistant" + ) + .map((message) => ( + + + + + + ))} + + +
+
+ +