From 7fdd3014c1cdf4d850489f29361bc1e83d54b54a Mon Sep 17 00:00:00 2001 From: andrewtan2000 Date: Fri, 27 Sep 2024 00:25:43 +0800 Subject: [PATCH] SimpleQuizResponse updates --- app/(main)/classes/page.tsx | 7 +----- app/(main)/quiz/history/page.tsx | 16 ++++++------- app/(main)/quiz/page.tsx | 12 ++++------ app/(main)/quiz/results/page.tsx | 2 +- app/(main)/test/page.tsx | 20 +--------------- components/ResultsTop.tsx | 6 ++--- service/QuizService.tsx | 4 ++-- service/TestService.tsx | 40 -------------------------------- types/quiz.d.ts | 22 ++++++++++++++++-- 9 files changed, 41 insertions(+), 88 deletions(-) diff --git a/app/(main)/classes/page.tsx b/app/(main)/classes/page.tsx index ef8ccd1..bc4ccd2 100644 --- a/app/(main)/classes/page.tsx +++ b/app/(main)/classes/page.tsx @@ -36,12 +36,7 @@ const Classes = () => { return { descriptionName, apiName, defaultValue, value, setValue }; }; - const classMapList = [ - useGenerateClassMap('Class Code', 'code'), - useGenerateClassMap('Class Name', 'description'), - useGenerateClassMap('Class Education Level', 'educationLevel'), - useGenerateClassMap('Class Subject', 'subject', 'Chemistry') - ]; + const classMapList = [useGenerateClassMap('Class Code', 'code'), useGenerateClassMap('Class Name', 'description'), useGenerateClassMap('Class Education Level', 'educationLevel'), useGenerateClassMap('Class Subject', 'subject', 'Chemistry')]; const clearNewClass = () => { setAddClass(false); diff --git a/app/(main)/quiz/history/page.tsx b/app/(main)/quiz/history/page.tsx index 488cf25..f9740df 100644 --- a/app/(main)/quiz/history/page.tsx +++ b/app/(main)/quiz/history/page.tsx @@ -76,20 +76,20 @@ const QuizHistory: React.FC = () => { const fetchData = async () => { try { const responseData = await QuizService.getQuizCompleted(); - if (responseData.message === 'Quiz not found') { - setError('Quiz not found'); - setLoading(false); - return; - } + // if (responseData.message === 'Quiz not found') { + // setError('Quiz not found'); + // setLoading(false); + // return; + // } setQuiz(responseData); // Process the data to calculate counts and extract unique topics and skills - const processedData = responseData.quizzes + const processedData = responseData.content .map((quiz: Quiz.QuizTaken) => { const topicsMap = new Map(); const skillsMap = new Map(); - quiz.mcqs.forEach((mcq: Quiz.Mcq) => { + quiz.mcqs.forEach((mcq: Quiz.SimpleQuizResponse) => { mcq.topics.forEach((topic) => topicsMap.set(topic.id, topic)); mcq.skills.forEach((skill) => skillsMap.set(skill.id, skill)); }); @@ -154,7 +154,7 @@ const QuizHistory: React.FC = () => {
History
-

You currently have completed {quiz?.quizzes ? quiz.quizzes.length : 0} quizzes.

+

You currently have completed {quiz?.content ? quiz.content.length : 0} quizzes.

{/* */} diff --git a/app/(main)/quiz/page.tsx b/app/(main)/quiz/page.tsx index e838bcd..27639be 100644 --- a/app/(main)/quiz/page.tsx +++ b/app/(main)/quiz/page.tsx @@ -101,14 +101,14 @@ const QuizPage: React.FC = () => { useEffect(() => { const fetchData = async () => { try { - const responseData = await QuizService.getQuizInProgress(); + const responseData = await QuizService.getQuizInProgress(selectedQuestionCount); if (responseData.message === 'Quiz not found') { setIsQuizOngoing(false); return; } setQuiz(responseData); const initialSelectedOptions: { [key: number]: number | 0 } = {}; - responseData.mcqs.forEach((mcq) => { + responseData.mcqs.content.forEach((mcq) => { initialSelectedOptions[mcq.id] = 0; }); setSelectedOptions(initialSelectedOptions); @@ -127,7 +127,6 @@ const QuizPage: React.FC = () => { invitationResponse(invitationResult); } }, 500); - }, []); const invitationResponse = (isSucceeded: boolean) => { @@ -315,7 +314,6 @@ const QuizPage: React.FC = () => { }; fetchData(); - }, [selectedTopics, selectedSkills]); const calculateScore = () => { @@ -432,7 +430,7 @@ const QuizPage: React.FC = () => { const questionOptions = Array.from({ length: generatedQuestionCount }, (_, i) => ({ label: `${i + 1} question${i + 1 > 1 ? 's' : ''}`, - value: i + 1, + value: i + 1 })).reverse(); // Reverse the array return ( @@ -571,7 +569,7 @@ const QuizPage: React.FC = () => { {currentQuestion.topics.map((topic) => topic.name).join(', ')}
- +
)} {showScore && showScoreMessage && ( @@ -590,4 +588,4 @@ const QuizPage: React.FC = () => { ); }; -export default QuizPage; \ No newline at end of file +export default QuizPage; diff --git a/app/(main)/quiz/results/page.tsx b/app/(main)/quiz/results/page.tsx index 916948b..50aa4db 100644 --- a/app/(main)/quiz/results/page.tsx +++ b/app/(main)/quiz/results/page.tsx @@ -8,7 +8,7 @@ import { QuizService } from '@/service/QuizService'; const ResultsPage: React.FC = () => { const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0); const [reload, setReload] = useState(false); - const [quiz, setQuiz] = useState(null); // Add state for the quiz data + const [quiz, setQuiz] = useState(null); // Add state for the quiz data const searchParams = useSearchParams(); const quizIdParam = searchParams.get('quizId'); diff --git a/app/(main)/test/page.tsx b/app/(main)/test/page.tsx index abccabc..bba382e 100644 --- a/app/(main)/test/page.tsx +++ b/app/(main)/test/page.tsx @@ -68,25 +68,7 @@ const TestPage: React.FC = () => { }; useEffect(() => { - const fetchData = async () => { - try { - const responseData = await TestService.getTestInProgress(); - if (responseData.message === 'Test not found') { - setIsTestOngoing(false); - return; - } - setTest(responseData); - const initialSelectedOptions: { [key: number]: number | 0 } = {}; - responseData.mcqs.forEach((mcq) => { - initialSelectedOptions[mcq.id] = 0; - }); - setSelectedOptions(initialSelectedOptions); - setTestIdAvailable(true); // Set quizIdAvailable to true once quiz data is fetched - setExplanationsVisible({}); // Initialize explanationsVisible - } catch (error) { - console.error('Error fetching data:', error); - } - }; + const fetchData = async () => {}; fetchData(); }, []); diff --git a/components/ResultsTop.tsx b/components/ResultsTop.tsx index 7cf3c22..ad23dc2 100644 --- a/components/ResultsTop.tsx +++ b/components/ResultsTop.tsx @@ -56,19 +56,19 @@ export default function ResultsTopComponent({ onQuestionClick, currentQuestionIn return
{error}
; } - if (!quiz || !quiz.quizzes || quiz.quizzes.length === 0) { + if (!quiz || !quiz.content || quiz.content.length === 0) { return
No quiz data available
; } // Find the specific quiz by ID - const specificQuiz = quiz.quizzes.find((quiz: Quiz.QuizTaken) => quiz.id === parseInt(quizId, 10)); + const specificQuiz = quiz.content.find((quiz: Quiz.QuizTaken) => quiz.id === parseInt(quizId, 10)); if (!specificQuiz || !specificQuiz.mcqs || specificQuiz.mcqs.length === 0) { return
No questions available for this quiz
; } // Update the progress calculation - const progress = specificQuiz.mcqs.map((mcq: Quiz.Mcq) => { + const progress = specificQuiz.mcqs.map((mcq: Quiz.SimpleQuizResponse) => { const attemptOption = mcq.attemptOption ?? 0; const selectedOption = mcq.options[attemptOption - 1]; return selectedOption && selectedOption.isAnswer; diff --git a/service/QuizService.tsx b/service/QuizService.tsx index f517cd7..4f4bf3e 100644 --- a/service/QuizService.tsx +++ b/service/QuizService.tsx @@ -94,7 +94,7 @@ export const QuizService = { } }, - fetchQuizById: async (quizId: number): Promise => { + fetchQuizById: async (quizId: number): Promise => { const headers = ApiHelper.getRequestHeaders(); try { const response = await fetch( @@ -110,7 +110,7 @@ export const QuizService = { throw new Error(`HTTP error! status: ${response.status}`); } - const data: Quiz.ApiResponse = await response.json(); + const data: Quiz.QuizTaken = await response.json(); return data; } catch (error) { console.error(`Error fetching quiz for Quiz ID: ${quizId}`, error); diff --git a/service/TestService.tsx b/service/TestService.tsx index 34d667f..40eaf15 100644 --- a/service/TestService.tsx +++ b/service/TestService.tsx @@ -35,46 +35,6 @@ export const TestService = { }); }, - getTestInProgress: async (): Promise => { - try { - console.log('Fetching data from API...'); - const headers = ApiHelper.getRequestHeaders(); - const response = await fetch( - `${process.env.NEXT_PUBLIC_QUEMISTRY_QUIZZES_URL}/me/in-progress?pageNumber=0&pageSize=60`, - { - headers: headers, - credentials: "include" - } - ); - const responseData: Quiz.ApiResponse = await response.json(); - console.log('Data fetched successfully:', responseData); - return responseData; - } catch (error) { - console.error('No data could be displayed: ', error); - throw error; - } - }, - - getTestCompleted: async (): Promise => { - try { - console.log('Fetching data from API...'); - const headers = ApiHelper.getRequestHeaders(); - const response = await fetch( - `${process.env.NEXT_PUBLIC_QUEMISTRY_QUIZZES_URL}/me/completed?pageNumber=0&pageSize=60`, - { - headers: headers, - credentials: "include" - } - ); - const responseData: Quiz.CompletedResponse = await response.json(); - console.log('Data fetched successfully:', responseData); - return responseData; - } catch (error) { - console.error('No data could be displayed: ', error); - throw error; - } - }, - getTestById: async (quizId: number): Promise => { const headers = ApiHelper.getRequestHeaders(); try { diff --git a/types/quiz.d.ts b/types/quiz.d.ts index c423d77..1d5de77 100644 --- a/types/quiz.d.ts +++ b/types/quiz.d.ts @@ -38,6 +38,23 @@ declare namespace Quiz { attemptOn: number | null; } + interface SimpleQuizResponse { + id: number; + stem: string; + options: Option[]; + topics: Topic[]; + skills: Skill[]; + status: string; + publishedOn: number; + publishedBy: string; + closedOn: number | null; + closedBy: string | null; + createdOn: number; + createdBy: string; + attemptOption: number | null; + attemptOn: number | null; + } + interface ApiResponse { id: number; mcqs: Mcq; @@ -56,12 +73,13 @@ declare namespace Quiz { // totalPages: number; // totalRecords: number; message?: string; - quizzes: QuizTaken[]; + content: QuizTaken[]; + // quizzes: QuizTaken[]; } interface QuizTaken { id: number; - mcqs: Mcq[]; + mcqs: SimpleQuizResponse[]; status: string; points: number; pageNumber: number;