From 2dae0dfea29a963321216ca0884a3e0cb4de8464 Mon Sep 17 00:00:00 2001 From: Enzo Murayama Date: Sun, 8 Feb 2026 21:04:00 -0300 Subject: [PATCH 1/2] feat: add forum to QuizTries page --- src/pages/Quizzes/QuizTries.tsx | 69 ++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/src/pages/Quizzes/QuizTries.tsx b/src/pages/Quizzes/QuizTries.tsx index afa0567..bc986f4 100644 --- a/src/pages/Quizzes/QuizTries.tsx +++ b/src/pages/Quizzes/QuizTries.tsx @@ -2,17 +2,20 @@ import { useEffect, useRef, useState } from 'react'; import { useParams } from 'react-router-dom'; import { fetchQuestion } from '@/services/api/quiz'; import { getQuizAnswers, getAllAnswers } from '@/services/api/answer'; +import { fetchPostsByQuestion } from '@/services/api/post'; import { useAuth } from '@/hooks/useAuth'; import { Question, UserQuizQuestionAnswer } from '@/interfaces/Quiz'; +import { Post } from '@/interfaces/Post'; import Footer from '@/components/footer/Footer'; import Header from '@/components/header/Header'; -import Voltar from '@/components/course/Voltar'; import Paragraph from '@/components/quiz/Paragraph'; import Description from '@/components/quiz/Description'; import RadioButtonGroup from '@/components/quiz/RadioButtonGroup'; import QuestionBox from '@/components/quiz/QuestionBox'; import OpenAnswer from '@/components/quiz/OpenAnswer'; import Practice from '@/components/verilogIDE/Practice'; +import Button from '@/components/utility/Button'; +import QuestionForumSidebar from '@/components/quiz/Forum/QuestionForumSidebar'; interface Answer { answer: string; @@ -47,6 +50,10 @@ export default function QuizTries() { const [quizDesc, setQuizDesc] = useState("Descrição do questionário"); const [isLoading, setIsLoading] = useState(true); + const [posts, setPosts] = useState([]); + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [activeQuestionId, setActiveQuestionId] = useState(null); + useEffect(() => { if (!nome) return; const originalTitle = document.title; @@ -79,6 +86,12 @@ export default function QuizTries() { const questionObjects = await fetchQuestion(questionIds); setQuestions(questionObjects); + if (questionIds.length > 0 && quizId) { + const promises = questionIds.map((id: string) => fetchPostsByQuestion(id, quizId)); + const postsForAllQuestions = await Promise.all(promises); + setPosts(postsForAllQuestions.flat()); + } + const mcQuestionIds = questionObjects .filter((q) => q.type === 1) .map((q) => q.id); @@ -141,6 +154,15 @@ export default function QuizTries() { startQuiz(); }, [quizId]); + const handleOpenDiscussion = (questionId: string) => { + setActiveQuestionId(questionId); + setIsSidebarOpen(true); + }; + + const handlePostCreated = (newPost: Post) => { + setPosts(prev => [newPost, ...(prev ?? [])]); + }; + const renderQuestions = (questions: Question[]) => { return questions.map((question) => { const resultData = UserQuizQuestion?.find( @@ -167,6 +189,18 @@ export default function QuizTries() {

{getTitle(question.type)}

+ +
+
{question.type === 0 && ( @@ -259,22 +293,39 @@ export default function QuizTries() {
-
-

{nome}

-
- +
+
+

{nome}

+
+ +
-
-
-
+
+ {/* Coluna Principal: Conteúdo do Quiz */} +
+

Sua pontuação: {score}/{quizMaxScore}

{Questions && renderQuestions(Questions)}
-
+ + {/* Coluna Lateral: Fórum (renderizada condicionalmente) */} + {isSidebarOpen && ( +
+ setIsSidebarOpen(false)} + quizId={quizId!} + /> +
+ )} + +
From 9859018022a97b74bea178222ec4f3c33e72cc51 Mon Sep 17 00:00:00 2001 From: Enzo Murayama Date: Sun, 8 Feb 2026 21:31:49 -0300 Subject: [PATCH 2/2] refactor: enable waveform QuizTries --- src/components/verilogIDE/Practice.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/verilogIDE/Practice.tsx b/src/components/verilogIDE/Practice.tsx index af1ac52..c0e2a5d 100644 --- a/src/components/verilogIDE/Practice.tsx +++ b/src/components/verilogIDE/Practice.tsx @@ -216,7 +216,7 @@ export default function Practice({ question, id_quiz, initialCode, onChangeCode,
- +